aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCy Schubert <cy@FreeBSD.org>2024-10-18 13:52:55 +0000
committerCy Schubert <cy@FreeBSD.org>2024-10-18 13:52:55 +0000
commit0a6d797cf6eb751d7eb613900cd19803e05d905f (patch)
treec52b0ffbf8879fbe81816528e0fc7c3dd0f64e1f
parent9b8db746ac608ff7cdad3c9ac7ac395319e4ea0f (diff)
downloadsrc-0a6d797cf6eb.tar.gz
src-0a6d797cf6eb.zip
unbound: Vendor import 1.20.0vendor/unbound/1.22.0vendor/unbound
-rw-r--r--Makefile.in19
-rw-r--r--aclocal.m4292
-rw-r--r--cachedb/cachedb.c5
-rw-r--r--cachedb/redis.c29
-rw-r--r--config.h.in94
-rwxr-xr-xconfigure769
-rw-r--r--configure.ac74
-rwxr-xr-xconfigure~378
-rw-r--r--contrib/aaaa-filter-iterator.patch2
-rw-r--r--daemon/daemon.c10
-rw-r--r--daemon/daemon.h3
-rw-r--r--daemon/remote.c14
-rw-r--r--daemon/stats.c14
-rw-r--r--daemon/worker.c38
-rw-r--r--dns64/dns64.c5
-rw-r--r--dnstap/unbound-dnstap-socket.c24
-rw-r--r--doc/Changelog151
-rw-r--r--doc/README2
-rw-r--r--doc/example.conf.in26
-rw-r--r--doc/libunbound.3.in4
-rw-r--r--doc/unbound-anchor.8.in2
-rw-r--r--doc/unbound-checkconf.8.in2
-rw-r--r--doc/unbound-control.8.in10
-rw-r--r--doc/unbound-host.1.in2
-rw-r--r--doc/unbound.8.in4
-rw-r--r--doc/unbound.conf.5.in71
-rw-r--r--doc/unbound.doxygen8
-rwxr-xr-xinstall-sh174
-rw-r--r--iterator/iter_scrub.c45
-rw-r--r--iterator/iter_utils.c42
-rw-r--r--iterator/iter_utils.h7
-rw-r--r--iterator/iterator.c57
-rw-r--r--iterator/iterator.h2
-rw-r--r--libunbound/context.c2
-rw-r--r--libunbound/libworker.c16
-rw-r--r--libunbound/python/examples/dnssec_test.py1
-rw-r--r--libunbound/unbound.h4
-rw-r--r--ltmain.sh866
-rw-r--r--pythonmod/doc/modules/config.rst4
-rw-r--r--pythonmod/interface.i1
-rw-r--r--services/authzone.c39
-rw-r--r--services/cache/dns.c59
-rw-r--r--services/cache/dns.h3
-rw-r--r--services/cache/rrset.c10
-rw-r--r--services/listen_dnsport.c2534
-rw-r--r--services/listen_dnsport.h405
-rw-r--r--services/mesh.c13
-rw-r--r--services/mesh.h3
-rw-r--r--services/modstack.c2
-rw-r--r--services/rpz.c19
-rw-r--r--smallapp/unbound-control-setup.sh.in2
-rw-r--r--smallapp/unbound-control.c6
-rw-r--r--smallapp/unbound-host.c6
-rw-r--r--smallapp/worker_cb.c16
-rw-r--r--testcode/checklocks.c20
-rw-r--r--testcode/checklocks.h24
-rw-r--r--testcode/doqclient.c2701
-rw-r--r--testcode/fake_event.c5
-rw-r--r--testcode/perf.c6
-rw-r--r--testcode/testbound.c51
-rw-r--r--testcode/unitdoq.c84
-rw-r--r--testcode/unitmain.c5
-rw-r--r--testcode/unitmain.h2
-rw-r--r--testcode/unitzonemd.c7
-rw-r--r--testdata/auth_tls.tdir/auth_tls.dsc16
-rw-r--r--testdata/auth_tls.tdir/auth_tls.nsd.conf21
-rw-r--r--testdata/auth_tls.tdir/auth_tls.post14
-rw-r--r--testdata/auth_tls.tdir/auth_tls.pre47
-rw-r--r--testdata/auth_tls.tdir/auth_tls.test48
-rw-r--r--testdata/auth_tls.tdir/auth_tls.ub.conf22
-rw-r--r--testdata/auth_tls.tdir/example.com.zone4
-rw-r--r--testdata/auth_tls.tdir/nsd_server.key39
-rw-r--r--testdata/auth_tls.tdir/nsd_server.pem22
-rw-r--r--testdata/auth_tls.tdir/unbound_server.key39
-rw-r--r--testdata/auth_tls.tdir/unbound_server.pem22
-rw-r--r--testdata/auth_tls_failcert.tdir/auth_tls_failcert.dsc16
-rw-r--r--testdata/auth_tls_failcert.tdir/auth_tls_failcert.nsd.conf21
-rw-r--r--testdata/auth_tls_failcert.tdir/auth_tls_failcert.post14
-rw-r--r--testdata/auth_tls_failcert.tdir/auth_tls_failcert.pre47
-rw-r--r--testdata/auth_tls_failcert.tdir/auth_tls_failcert.test56
-rw-r--r--testdata/auth_tls_failcert.tdir/auth_tls_failcert.ub.conf23
-rw-r--r--testdata/auth_tls_failcert.tdir/example.com.zone4
-rw-r--r--testdata/auth_tls_failcert.tdir/nsd_server.key39
-rw-r--r--testdata/auth_tls_failcert.tdir/nsd_server.pem22
-rw-r--r--testdata/auth_tls_failcert.tdir/unbound_server.key39
-rw-r--r--testdata/auth_tls_failcert.tdir/unbound_server.pem22
-rw-r--r--testdata/cookie_file.tdir/cookie_file.test6
-rw-r--r--testdata/dns64_prefetch_cache.rpl195
-rw-r--r--testdata/doh_downstream_buffer_size.tdir/doh_downstream_buffer_size.test2
-rw-r--r--testdata/doq_downstream.tdir/doq_downstream.conf21
-rw-r--r--testdata/doq_downstream.tdir/doq_downstream.dsc16
-rw-r--r--testdata/doq_downstream.tdir/doq_downstream.post13
-rw-r--r--testdata/doq_downstream.tdir/doq_downstream.pre44
-rw-r--r--testdata/doq_downstream.tdir/doq_downstream.test109
-rw-r--r--testdata/doq_downstream.tdir/doq_downstream.testns13
-rw-r--r--testdata/doq_downstream.tdir/unbound_server.key15
-rw-r--r--testdata/doq_downstream.tdir/unbound_server.pem11
-rw-r--r--testdata/iter_max_global_quota.rpl2236
-rw-r--r--testdata/iter_unverified_glue.rpl188
-rw-r--r--testdata/iter_unverified_glue_fallback.rpl138
-rw-r--r--testdata/rpz_val_block.rpl643
-rw-r--r--testdata/serve_expired_cached_servfail.rpl2
-rw-r--r--testdata/serve_expired_cached_servfail_refresh.rpl2
-rw-r--r--testdata/serve_expired_client_timeout_servfail.rpl83
-rw-r--r--testdata/serve_expired_client_timeout_val_bogus.rpl317
-rw-r--r--testdata/serve_expired_client_timeout_val_insecure_delegation.rpl247
-rw-r--r--testdata/serve_expired_ttl_reset.rpl102
-rw-r--r--testdata/serve_expired_val_bogus.rpl316
-rw-r--r--testdata/val_negcache_ttl.rpl188
-rw-r--r--testdata/val_negcache_ttl_prefetch.rpl316
-rw-r--r--testdata/zonemd.example_a5.zone4
-rw-r--r--util/alloc.c9
-rw-r--r--util/config_file.c55
-rw-r--r--util/config_file.h23
-rw-r--r--util/configlexer.c8484
-rw-r--r--util/configlexer.lex11
-rw-r--r--util/configparser.c4713
-rw-r--r--util/configparser.h296
-rw-r--r--util/configparser.y165
-rw-r--r--util/data/msgparse.h2
-rw-r--r--util/data/msgreply.c47
-rw-r--r--util/data/msgreply.h39
-rw-r--r--util/data/packed_rrset.h3
-rw-r--r--util/fptr_wlist.c17
-rw-r--r--util/locks.h1
-rw-r--r--util/log.c36
-rw-r--r--util/log.h6
-rw-r--r--util/module.h8
-rw-r--r--util/netevent.c1933
-rw-r--r--util/netevent.h164
-rw-r--r--validator/val_neg.c6
-rw-r--r--validator/val_nsec3.c6
-rw-r--r--validator/validator.c81
-rw-r--r--validator/validator.h2
134 files changed, 23277 insertions, 7949 deletions
diff --git a/Makefile.in b/Makefile.in
index 672435e01e9f..c262250ca2c5 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -179,11 +179,11 @@ testcode/unitlruhash.c testcode/unitmain.c testcode/unitmsgparse.c \
testcode/unitneg.c testcode/unitregional.c testcode/unitslabhash.c \
testcode/unitverify.c testcode/readhex.c testcode/testpkts.c testcode/unitldns.c \
testcode/unitecs.c testcode/unitauth.c testcode/unitzonemd.c \
-testcode/unittcpreuse.c
+testcode/unittcpreuse.c testcode/unitdoq.c
UNITTEST_OBJ=unitanchor.lo unitdname.lo unitlruhash.lo unitmain.lo \
unitmsgparse.lo unitneg.lo unitregional.lo unitslabhash.lo unitverify.lo \
readhex.lo testpkts.lo unitldns.lo unitecs.lo unitauth.lo unitzonemd.lo \
-unittcpreuse.lo
+unittcpreuse.lo unitdoq.lo
UNITTEST_OBJ_LINK=$(UNITTEST_OBJ) worker_cb.lo $(COMMON_OBJ) $(SLDNS_OBJ) \
$(COMPAT_OBJ)
DAEMON_SRC=daemon/acl_list.c daemon/cachedump.c daemon/daemon.c \
@@ -242,6 +242,10 @@ DOHCLIENT_SRC=testcode/dohclient.c
DOHCLIENT_OBJ=dohclient.lo
DOHCLIENT_OBJ_LINK=$(DOHCLIENT_OBJ) worker_cb.lo $(COMMON_OBJ) $(COMPAT_OBJ) \
$(SLDNS_OBJ)
+DOQCLIENT_SRC=testcode/doqclient.c
+DOQCLIENT_OBJ=doqclient.lo
+DOQCLIENT_OBJ_LINK=$(DOQCLIENT_OBJ) $(COMMON_OBJ) $(COMPAT_OBJ) \
+$(SLDNS_OBJ)
PERF_SRC=testcode/perf.c
PERF_OBJ=perf.lo
PERF_OBJ_LINK=$(PERF_OBJ) worker_cb.lo $(COMMON_OBJ) $(COMPAT_OBJ) $(SLDNS_OBJ)
@@ -288,7 +292,7 @@ ALL_SRC=$(COMMON_SRC) $(UNITTEST_SRC) $(DAEMON_SRC) \
$(CONTROL_SRC) $(UBANCHOR_SRC) $(PETAL_SRC) $(DNSTAP_SOCKET_SRC)\
$(PYTHONMOD_SRC) $(PYUNBOUND_SRC) $(WIN_DAEMON_THE_SRC) \
$(SVCINST_SRC) $(SVCUNINST_SRC) $(ANCHORUPD_SRC) $(SLDNS_SRC) \
- $(DOHCLIENT_SRC) $(READZONE_SRC)
+ $(DOHCLIENT_SRC) $(DOQCLIENT_SRC) $(READZONE_SRC)
ALL_OBJ=$(COMMON_OBJ) $(UNITTEST_OBJ) $(DAEMON_OBJ) \
$(TESTBOUND_OBJ) $(LOCKVERIFY_OBJ) $(PKTVIEW_OBJ) \
@@ -297,7 +301,7 @@ ALL_OBJ=$(COMMON_OBJ) $(UNITTEST_OBJ) $(DAEMON_OBJ) \
$(CONTROL_OBJ) $(UBANCHOR_OBJ) $(PETAL_OBJ) $(DNSTAP_SOCKET_OBJ)\
$(COMPAT_OBJ) $(PYUNBOUND_OBJ) \
$(SVCINST_OBJ) $(SVCUNINST_OBJ) $(ANCHORUPD_OBJ) $(SLDNS_OBJ) \
- $(DOHCLIENT_OBJ) $(READZONE_OBJ)
+ $(DOHCLIENT_OBJ) $(DOQCLIENT_OBJ) $(READZONE_OBJ)
COMPILE=$(LIBTOOL) --tag=CC --mode=compile $(CC) $(CPPFLAGS) $(CFLAGS) @PTHREAD_CFLAGS_ONLY@
LINK=$(LIBTOOL) --tag=CC --mode=link $(CC) $(staticexe) $(RUNTIME_PATH) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS)
@@ -334,7 +338,7 @@ rsrc_unbound_checkconf.o: $(srcdir)/winrc/rsrc_unbound_checkconf.rc config.h
TEST_BIN=asynclook$(EXEEXT) delayer$(EXEEXT) \
lock-verify$(EXEEXT) memstats$(EXEEXT) perf$(EXEEXT) \
petal$(EXEEXT) pktview$(EXEEXT) streamtcp$(EXEEXT) \
- $(DNSTAP_SOCKET_TESTBIN) dohclient$(EXEEXT) \
+ $(DNSTAP_SOCKET_TESTBIN) dohclient$(EXEEXT) doqclient$(EXEEXT) \
testbound$(EXEEXT) unittest$(EXEEXT) readzone$(EXEEXT)
tests: all $(TEST_BIN)
@@ -416,6 +420,9 @@ streamtcp$(EXEEXT): $(STREAMTCP_OBJ_LINK)
dohclient$(EXEEXT): $(DOHCLIENT_OBJ_LINK)
$(LINK) -o $@ $(DOHCLIENT_OBJ_LINK) $(SSLLIB) $(LIBS)
+doqclient$(EXEEXT): $(DOQCLIENT_OBJ_LINK)
+ $(LINK) -o $@ $(DOQCLIENT_OBJ_LINK) $(SSLLIB) $(LIBS)
+
perf$(EXEEXT): $(PERF_OBJ_LINK)
$(LINK) -o $@ $(PERF_OBJ_LINK) $(SSLLIB) $(LIBS)
@@ -703,6 +710,8 @@ depend:
# build rules
ipset.lo ipset.o: $(srcdir)/ipset/ipset.c
+doqclient.lo doqclient.o: $(srcdir)/testcode/doqclient.c
+unitdoq.lo unitdoq.o: $(srcdir)/testcode/unitdoq.c
# Dependencies
dns.lo dns.o: $(srcdir)/services/cache/dns.c config.h $(srcdir)/iterator/iter_delegpt.h $(srcdir)/util/log.h \
diff --git a/aclocal.m4 b/aclocal.m4
index 364e37267d00..bf3c57e2fd9f 100644
--- a/aclocal.m4
+++ b/aclocal.m4
@@ -1,6 +1,6 @@
-# generated automatically by aclocal 1.16.5 -*- Autoconf -*-
+# generated automatically by aclocal 1.16.2 -*- Autoconf -*-
-# Copyright (C) 1996-2021 Free Software Foundation, Inc.
+# Copyright (C) 1996-2020 Free Software Foundation, Inc.
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -14,8 +14,7 @@
m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])])
# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*-
#
-# Copyright (C) 1996-2001, 2003-2019, 2021-2022 Free Software
-# Foundation, Inc.
+# Copyright (C) 1996-2001, 2003-2015 Free Software Foundation, Inc.
# Written by Gordon Matzigkeit, 1996
#
# This file is free software; the Free Software Foundation gives
@@ -46,7 +45,7 @@ m4_define([_LT_COPYING], [dnl
# along with this program. If not, see <http://www.gnu.org/licenses/>.
])
-# serial 59 LT_INIT
+# serial 58 LT_INIT
# LT_PREREQ(VERSION)
@@ -196,7 +195,6 @@ m4_require([_LT_FILEUTILS_DEFAULTS])dnl
m4_require([_LT_CHECK_SHELL_FEATURES])dnl
m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl
m4_require([_LT_CMD_RELOAD])dnl
-m4_require([_LT_DECL_FILECMD])dnl
m4_require([_LT_CHECK_MAGIC_METHOD])dnl
m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl
m4_require([_LT_CMD_OLD_ARCHIVE])dnl
@@ -235,8 +233,8 @@ esac
ofile=libtool
can_build_shared=yes
-# All known linkers require a '.a' archive for static linking (except MSVC and
-# ICC, which need '.lib').
+# All known linkers require a '.a' archive for static linking (except MSVC,
+# which needs '.lib').
libext=a
with_gnu_ld=$lt_cv_prog_gnu_ld
@@ -788,7 +786,7 @@ _LT_EOF
# if finds mixed CR/LF and LF-only lines. Since sed operates in
# text mode, it properly converts lines to CR/LF. This bash problem
# is reportedly fixed, but why not run on old versions too?
- $SED '$q' "$ltmain" >> "$cfgfile" \
+ sed '$q' "$ltmain" >> "$cfgfile" \
|| (rm -f "$cfgfile"; exit 1)
mv -f "$cfgfile" "$ofile" ||
@@ -1050,8 +1048,8 @@ int forced_loaded() { return 2;}
_LT_EOF
echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD
$LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD
- echo "$AR $AR_FLAGS libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD
- $AR $AR_FLAGS libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD
+ echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD
+ $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD
echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD
$RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD
cat > conftest.c << _LT_EOF
@@ -1075,12 +1073,17 @@ _LT_EOF
_lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;;
darwin1.*)
_lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
- darwin*)
- case $MACOSX_DEPLOYMENT_TARGET,$host in
- 10.[[012]],*|,*powerpc*-darwin[[5-8]]*)
- _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
- *)
- _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;
+ darwin*) # darwin 5.x on
+ # if running on 10.5 or later, the deployment target defaults
+ # to the OS version, if on x86, and 10.4, the deployment
+ # target defaults to 10.4. Don't you love it?
+ case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
+ 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*)
+ _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;
+ 10.[[012]][[,.]]*)
+ _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
+ 10.*)
+ _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;
esac
;;
esac
@@ -1129,12 +1132,12 @@ m4_defun([_LT_DARWIN_LINKER_FEATURES],
output_verbose_link_cmd=func_echo_all
_LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil"
_LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil"
- _LT_TAGVAR(archive_expsym_cmds, $1)="$SED 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil"
- _LT_TAGVAR(module_expsym_cmds, $1)="$SED -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil"
+ _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil"
+ _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil"
m4_if([$1], [CXX],
[ if test yes != "$lt_cv_apple_cc_single_mod"; then
_LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil"
- _LT_TAGVAR(archive_expsym_cmds, $1)="$SED 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil"
+ _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil"
fi
],[])
else
@@ -1248,8 +1251,7 @@ _LT_DECL([], [ECHO], [1], [An echo program that protects backslashes])
# _LT_WITH_SYSROOT
# ----------------
AC_DEFUN([_LT_WITH_SYSROOT],
-[m4_require([_LT_DECL_SED])dnl
-AC_MSG_CHECKING([for sysroot])
+[AC_MSG_CHECKING([for sysroot])
AC_ARG_WITH([sysroot],
[AS_HELP_STRING([--with-sysroot@<:@=DIR@:>@],
[Search for dependent libraries within DIR (or the compiler's sysroot
@@ -1266,7 +1268,7 @@ case $with_sysroot in #(
fi
;; #(
/*)
- lt_sysroot=`echo "$with_sysroot" | $SED -e "$sed_quote_subst"`
+ lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"`
;; #(
no|'')
;; #(
@@ -1296,7 +1298,7 @@ ia64-*-hpux*)
# options accordingly.
echo 'int i;' > conftest.$ac_ext
if AC_TRY_EVAL(ac_compile); then
- case `$FILECMD conftest.$ac_objext` in
+ case `/usr/bin/file conftest.$ac_objext` in
*ELF-32*)
HPUX_IA64_MODE=32
;;
@@ -1313,7 +1315,7 @@ ia64-*-hpux*)
echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext
if AC_TRY_EVAL(ac_compile); then
if test yes = "$lt_cv_prog_gnu_ld"; then
- case `$FILECMD conftest.$ac_objext` in
+ case `/usr/bin/file conftest.$ac_objext` in
*32-bit*)
LD="${LD-ld} -melf32bsmip"
;;
@@ -1325,7 +1327,7 @@ ia64-*-hpux*)
;;
esac
else
- case `$FILECMD conftest.$ac_objext` in
+ case `/usr/bin/file conftest.$ac_objext` in
*32-bit*)
LD="${LD-ld} -32"
;;
@@ -1347,7 +1349,7 @@ mips64*-*linux*)
echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext
if AC_TRY_EVAL(ac_compile); then
emul=elf
- case `$FILECMD conftest.$ac_objext` in
+ case `/usr/bin/file conftest.$ac_objext` in
*32-bit*)
emul="${emul}32"
;;
@@ -1355,7 +1357,7 @@ mips64*-*linux*)
emul="${emul}64"
;;
esac
- case `$FILECMD conftest.$ac_objext` in
+ case `/usr/bin/file conftest.$ac_objext` in
*MSB*)
emul="${emul}btsmip"
;;
@@ -1363,7 +1365,7 @@ mips64*-*linux*)
emul="${emul}ltsmip"
;;
esac
- case `$FILECMD conftest.$ac_objext` in
+ case `/usr/bin/file conftest.$ac_objext` in
*N32*)
emul="${emul}n32"
;;
@@ -1383,14 +1385,14 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
# not appear in the list.
echo 'int i;' > conftest.$ac_ext
if AC_TRY_EVAL(ac_compile); then
- case `$FILECMD conftest.o` in
+ case `/usr/bin/file conftest.o` in
*32-bit*)
case $host in
x86_64-*kfreebsd*-gnu)
LD="${LD-ld} -m elf_i386_fbsd"
;;
x86_64-*linux*)
- case `$FILECMD conftest.o` in
+ case `/usr/bin/file conftest.o` in
*x86-64*)
LD="${LD-ld} -m elf32_x86_64"
;;
@@ -1458,7 +1460,7 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
# options accordingly.
echo 'int i;' > conftest.$ac_ext
if AC_TRY_EVAL(ac_compile); then
- case `$FILECMD conftest.o` in
+ case `/usr/bin/file conftest.o` in
*64-bit*)
case $lt_cv_prog_gnu_ld in
yes*)
@@ -1497,22 +1499,9 @@ need_locks=$enable_libtool_lock
m4_defun([_LT_PROG_AR],
[AC_CHECK_TOOLS(AR, [ar], false)
: ${AR=ar}
+: ${AR_FLAGS=cru}
_LT_DECL([], [AR], [1], [The archiver])
-
-# Use ARFLAGS variable as AR's operation code to sync the variable naming with
-# Automake. If both AR_FLAGS and ARFLAGS are specified, AR_FLAGS should have
-# higher priority because thats what people were doing historically (setting
-# ARFLAGS for automake and AR_FLAGS for libtool). FIXME: Make the AR_FLAGS
-# variable obsoleted/removed.
-
-test ${AR_FLAGS+y} || AR_FLAGS=${ARFLAGS-cr}
-lt_ar_flags=$AR_FLAGS
-_LT_DECL([], [lt_ar_flags], [0], [Flags to create an archive (by configure)])
-
-# Make AR_FLAGS overridable by 'make ARFLAGS='. Don't try to run-time override
-# by AR_FLAGS because that was never working and AR_FLAGS is about to die.
-_LT_DECL([], [AR_FLAGS], [\@S|@{ARFLAGS-"\@S|@lt_ar_flags"}],
- [Flags to create an archive])
+_LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive])
AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file],
[lt_cv_ar_at_file=no
@@ -1731,7 +1720,7 @@ AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
lt_cv_sys_max_cmd_len=8192;
;;
- bitrig* | darwin* | dragonfly* | freebsd* | midnightbsd* | netbsd* | openbsd*)
+ bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*)
# This has been around since 386BSD, at least. Likely further.
if test -x /sbin/sysctl; then
lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
@@ -1774,7 +1763,7 @@ AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
sysv5* | sco5v6* | sysv4.2uw2*)
kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
if test -n "$kargmax"; then
- lt_cv_sys_max_cmd_len=`echo $kargmax | $SED 's/.*[[ ]]//'`
+ lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'`
else
lt_cv_sys_max_cmd_len=32768
fi
@@ -2224,35 +2213,26 @@ m4_defun([_LT_CMD_STRIPLIB],
striplib=
old_striplib=
AC_MSG_CHECKING([whether stripping libraries is possible])
-if test -z "$STRIP"; then
- AC_MSG_RESULT([no])
+if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
+ test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
+ test -z "$striplib" && striplib="$STRIP --strip-unneeded"
+ AC_MSG_RESULT([yes])
else
- if $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
- old_striplib="$STRIP --strip-debug"
- striplib="$STRIP --strip-unneeded"
- AC_MSG_RESULT([yes])
- else
- case $host_os in
- darwin*)
- # FIXME - insert some real tests, host_os isn't really good enough
+# FIXME - insert some real tests, host_os isn't really good enough
+ case $host_os in
+ darwin*)
+ if test -n "$STRIP"; then
striplib="$STRIP -x"
old_striplib="$STRIP -S"
AC_MSG_RESULT([yes])
- ;;
- freebsd*)
- if $STRIP -V 2>&1 | $GREP "elftoolchain" >/dev/null; then
- old_striplib="$STRIP --strip-debug"
- striplib="$STRIP --strip-unneeded"
- AC_MSG_RESULT([yes])
- else
- AC_MSG_RESULT([no])
- fi
- ;;
- *)
+ else
AC_MSG_RESULT([no])
- ;;
- esac
- fi
+ fi
+ ;;
+ *)
+ AC_MSG_RESULT([no])
+ ;;
+ esac
fi
_LT_DECL([], [old_striplib], [1], [Commands to strip libraries])
_LT_DECL([], [striplib], [1])
@@ -2575,7 +2555,7 @@ cygwin* | mingw* | pw32* | cegcc*)
case $host_os in
cygwin*)
# Cygwin DLLs use 'cyg' prefix rather than 'lib'
- soname_spec='`echo $libname | $SED -e 's/^lib/cyg/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext'
+ soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext'
m4_if([$1], [],[
sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"])
;;
@@ -2585,14 +2565,14 @@ m4_if([$1], [],[
;;
pw32*)
# pw32 DLLs use 'pw' prefix rather than 'lib'
- library_names_spec='`echo $libname | $SED -e 's/^lib/pw/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext'
+ library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext'
;;
esac
dynamic_linker='Win32 ld.exe'
;;
- *,cl* | *,icl*)
- # Native MSVC or ICC
+ *,cl*)
+ # Native MSVC
libname_spec='$name'
soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext'
library_names_spec='$libname.dll.lib'
@@ -2611,7 +2591,7 @@ m4_if([$1], [],[
done
IFS=$lt_save_ifs
# Convert to MSYS style.
- sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'`
+ sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'`
;;
cygwin*)
# Convert to unix form, then to dos form, then back to unix form
@@ -2648,7 +2628,7 @@ m4_if([$1], [],[
;;
*)
- # Assume MSVC and ICC wrapper
+ # Assume MSVC wrapper
library_names_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext $libname.lib'
dynamic_linker='Win32 ld.exe'
;;
@@ -2681,7 +2661,7 @@ dgux*)
shlibpath_var=LD_LIBRARY_PATH
;;
-freebsd* | dragonfly* | midnightbsd*)
+freebsd* | dragonfly*)
# DragonFly does not have aout. When/if they implement a new
# versioning mechanism, adjust this.
if test -x /usr/bin/objformat; then
@@ -3483,7 +3463,7 @@ beos*)
bsdi[[45]]*)
lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)'
- lt_cv_file_magic_cmd='$FILECMD -L'
+ lt_cv_file_magic_cmd='/usr/bin/file -L'
lt_cv_file_magic_test_file=/shlib/libc.so
;;
@@ -3517,14 +3497,14 @@ darwin* | rhapsody*)
lt_cv_deplibs_check_method=pass_all
;;
-freebsd* | dragonfly* | midnightbsd*)
+freebsd* | dragonfly*)
if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
case $host_cpu in
i*86 )
# Not sure whether the presence of OpenBSD here was a mistake.
# Let's accept both of them until this is cleared up.
lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library'
- lt_cv_file_magic_cmd=$FILECMD
+ lt_cv_file_magic_cmd=/usr/bin/file
lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
;;
esac
@@ -3538,7 +3518,7 @@ haiku*)
;;
hpux10.20* | hpux11*)
- lt_cv_file_magic_cmd=$FILECMD
+ lt_cv_file_magic_cmd=/usr/bin/file
case $host_cpu in
ia64*)
lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64'
@@ -3585,7 +3565,7 @@ netbsd*)
newos6*)
lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)'
- lt_cv_file_magic_cmd=$FILECMD
+ lt_cv_file_magic_cmd=/usr/bin/file
lt_cv_file_magic_test_file=/usr/lib/libnls.so
;;
@@ -3712,13 +3692,13 @@ else
mingw*) lt_bad_file=conftest.nm/nofile ;;
*) lt_bad_file=/dev/null ;;
esac
- case `"$tmp_nm" -B $lt_bad_file 2>&1 | $SED '1q'` in
+ case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in
*$lt_bad_file* | *'Invalid file or object type'*)
lt_cv_path_NM="$tmp_nm -B"
break 2
;;
*)
- case `"$tmp_nm" -p /dev/null 2>&1 | $SED '1q'` in
+ case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
*/dev/null*)
lt_cv_path_NM="$tmp_nm -p"
break 2
@@ -3744,7 +3724,7 @@ else
# Let the user override the test.
else
AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :)
- case `$DUMPBIN -symbols -headers /dev/null 2>&1 | $SED '1q'` in
+ case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in
*COFF*)
DUMPBIN="$DUMPBIN -symbols -headers"
;;
@@ -3984,7 +3964,7 @@ esac
if test "$lt_cv_nm_interface" = "MS dumpbin"; then
# Gets list of data symbols to import.
- lt_cv_sys_global_symbol_to_import="$SED -n -e 's/^I .* \(.*\)$/\1/p'"
+ lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'"
# Adjust the below global symbol transforms to fixup imported variables.
lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'"
lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'"
@@ -4002,20 +3982,20 @@ fi
# Transform an extracted symbol line into a proper C declaration.
# Some systems (esp. on ia64) link data and code symbols differently,
# so use this general approach.
-lt_cv_sys_global_symbol_to_cdecl="$SED -n"\
+lt_cv_sys_global_symbol_to_cdecl="sed -n"\
$lt_cdecl_hook\
" -e 's/^T .* \(.*\)$/extern int \1();/p'"\
" -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'"
# Transform an extracted symbol line into symbol name and symbol address
-lt_cv_sys_global_symbol_to_c_name_address="$SED -n"\
+lt_cv_sys_global_symbol_to_c_name_address="sed -n"\
$lt_c_name_hook\
" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\
" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'"
# Transform an extracted symbol line into symbol name with lib prefix and
# symbol address.
-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="$SED -n"\
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\
$lt_c_name_lib_hook\
" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\
" -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\
@@ -4039,7 +4019,7 @@ for ac_symprfx in "" "_"; do
if test "$lt_cv_nm_interface" = "MS dumpbin"; then
# Fake it for dumpbin and say T for any non-static function,
# D for any global variable and I for any imported variable.
- # Also find C++ and __fastcall symbols from MSVC++ or ICC,
+ # Also find C++ and __fastcall symbols from MSVC++,
# which start with @ or ?.
lt_cv_sys_global_symbol_pipe="$AWK ['"\
" {last_section=section; section=\$ 3};"\
@@ -4057,9 +4037,9 @@ for ac_symprfx in "" "_"; do
" s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\
" ' prfx=^$ac_symprfx]"
else
- lt_cv_sys_global_symbol_pipe="$SED -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
+ lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
fi
- lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | $SED '/ __gnu_lto/d'"
+ lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'"
# Check to see that the pipe works correctly.
pipe_works=no
@@ -4346,7 +4326,7 @@ m4_if([$1], [CXX], [
;;
esac
;;
- freebsd* | dragonfly* | midnightbsd*)
+ freebsd* | dragonfly*)
# FreeBSD uses GNU C++
;;
hpux9* | hpux10* | hpux11*)
@@ -4429,7 +4409,7 @@ m4_if([$1], [CXX], [
_LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'
;;
*)
- case `$CC -V 2>&1 | $SED 5q` in
+ case `$CC -V 2>&1 | sed 5q` in
*Sun\ C*)
# Sun C++ 5.9
_LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
@@ -4765,7 +4745,7 @@ m4_if([$1], [CXX], [
_LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'
;;
*)
- case `$CC -V 2>&1 | $SED 5q` in
+ case `$CC -V 2>&1 | sed 5q` in
*Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*)
# Sun Fortran 8.3 passes all unrecognized flags to the linker
_LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
@@ -4948,7 +4928,7 @@ m4_if([$1], [CXX], [
if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
_LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols'
else
- _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "L") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
+ _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
fi
;;
pw32*)
@@ -4956,7 +4936,7 @@ m4_if([$1], [CXX], [
;;
cygwin* | mingw* | cegcc*)
case $cc_basename in
- cl* | icl*)
+ cl*)
_LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
;;
*)
@@ -5013,15 +4993,15 @@ dnl Note also adjust exclude_expsyms for C++ above.
case $host_os in
cygwin* | mingw* | pw32* | cegcc*)
- # FIXME: the MSVC++ and ICC port hasn't been tested in a loooong time
+ # FIXME: the MSVC++ port hasn't been tested in a loooong time
# When not using gcc, we currently assume that we are using
- # Microsoft Visual C++ or Intel C++ Compiler.
+ # Microsoft Visual C++.
if test yes != "$GCC"; then
with_gnu_ld=no
fi
;;
interix*)
- # we just hope/assume this is gcc and not c89 (= MSVC++ or ICC)
+ # we just hope/assume this is gcc and not c89 (= MSVC++)
with_gnu_ld=yes
;;
openbsd* | bitrig*)
@@ -5073,7 +5053,7 @@ dnl Note also adjust exclude_expsyms for C++ above.
_LT_TAGVAR(whole_archive_flag_spec, $1)=
fi
supports_anon_versioning=no
- case `$LD -v | $SED -e 's/([[^)]]\+)\s\+//' 2>&1` in
+ case `$LD -v | $SED -e 's/([^)]\+)\s\+//' 2>&1` in
*GNU\ gold*) supports_anon_versioning=yes ;;
*\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11
*\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
@@ -5185,7 +5165,6 @@ _LT_EOF
emximp -o $lib $output_objdir/$libname.def'
_LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
- _LT_TAGVAR(file_list_spec, $1)='@'
;;
interix[[3-9]]*)
@@ -5200,7 +5179,7 @@ _LT_EOF
# 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
# time. Moving up from 0x10000000 also allows more sbrk(2) space.
_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
- _LT_TAGVAR(archive_expsym_cmds, $1)='$SED "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
;;
gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
@@ -5243,7 +5222,7 @@ _LT_EOF
_LT_TAGVAR(compiler_needs_object, $1)=yes
;;
esac
- case `$CC -V 2>&1 | $SED 5q` in
+ case `$CC -V 2>&1 | sed 5q` in
*Sun\ C*) # Sun C 5.9
_LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
_LT_TAGVAR(compiler_needs_object, $1)=yes
@@ -5255,7 +5234,7 @@ _LT_EOF
if test yes = "$supports_anon_versioning"; then
_LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
- cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
echo "local: *; };" >> $output_objdir/$libname.ver~
$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib'
fi
@@ -5271,7 +5250,7 @@ _LT_EOF
_LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
if test yes = "$supports_anon_versioning"; then
_LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
- cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
echo "local: *; };" >> $output_objdir/$libname.ver~
$LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
fi
@@ -5403,7 +5382,7 @@ _LT_EOF
if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
_LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols'
else
- _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "L") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
+ _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
fi
aix_use_runtimelinking=no
@@ -5586,12 +5565,12 @@ _LT_EOF
cygwin* | mingw* | pw32* | cegcc*)
# When not using gcc, we currently assume that we are using
- # Microsoft Visual C++ or Intel C++ Compiler.
+ # Microsoft Visual C++.
# hardcode_libdir_flag_spec is actually meaningless, as there is
# no search path for DLLs.
case $cc_basename in
- cl* | icl*)
- # Native MSVC or ICC
+ cl*)
+ # Native MSVC
_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
_LT_TAGVAR(always_export_symbols, $1)=yes
@@ -5632,7 +5611,7 @@ _LT_EOF
fi'
;;
*)
- # Assume MSVC and ICC wrapper
+ # Assume MSVC wrapper
_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
# Tell ltmain to make .lib files, not .a files.
@@ -5680,7 +5659,7 @@ _LT_EOF
;;
# FreeBSD 3 and greater uses gcc -shared to do shared libraries.
- freebsd* | dragonfly* | midnightbsd*)
+ freebsd* | dragonfly*)
_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
_LT_TAGVAR(hardcode_direct, $1)=yes
@@ -5891,7 +5870,6 @@ _LT_EOF
emximp -o $lib $output_objdir/$libname.def'
_LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
- _LT_TAGVAR(file_list_spec, $1)='@'
;;
osf3*)
@@ -6658,8 +6636,8 @@ if test yes != "$_lt_caught_CXX_error"; then
cygwin* | mingw* | pw32* | cegcc*)
case $GXX,$cc_basename in
- ,cl* | no,cl* | ,icl* | no,icl*)
- # Native MSVC or ICC
+ ,cl* | no,cl*)
+ # Native MSVC
# hardcode_libdir_flag_spec is actually meaningless, as there is
# no search path for DLLs.
_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
@@ -6757,7 +6735,6 @@ if test yes != "$_lt_caught_CXX_error"; then
emximp -o $lib $output_objdir/$libname.def'
_LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
- _LT_TAGVAR(file_list_spec, $1)='@'
;;
dgux*)
@@ -6788,7 +6765,7 @@ if test yes != "$_lt_caught_CXX_error"; then
_LT_TAGVAR(archive_cmds_need_lc, $1)=no
;;
- freebsd* | dragonfly* | midnightbsd*)
+ freebsd* | dragonfly*)
# FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
# conventions
_LT_TAGVAR(ld_shlibs, $1)=yes
@@ -6925,7 +6902,7 @@ if test yes != "$_lt_caught_CXX_error"; then
# 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
# time. Moving up from 0x10000000 also allows more sbrk(2) space.
_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
- _LT_TAGVAR(archive_expsym_cmds, $1)='$SED "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
;;
irix5* | irix6*)
case $cc_basename in
@@ -7065,13 +7042,13 @@ if test yes != "$_lt_caught_CXX_error"; then
_LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
if test yes = "$supports_anon_versioning"; then
_LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
- cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
echo "local: *; };" >> $output_objdir/$libname.ver~
$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib'
fi
;;
*)
- case `$CC -V 2>&1 | $SED 5q` in
+ case `$CC -V 2>&1 | sed 5q` in
*Sun\ C*)
# Sun C++ 5.9
_LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
@@ -8209,14 +8186,6 @@ _LT_DECL([], [DLLTOOL], [1], [DLL creation program])
AC_SUBST([DLLTOOL])
])
-# _LT_DECL_FILECMD
-# ----------------
-# Check for a file(cmd) program that can be used to detect file type and magic
-m4_defun([_LT_DECL_FILECMD],
-[AC_CHECK_TOOL([FILECMD], [file], [:])
-_LT_DECL([], [FILECMD], [1], [A file(cmd) program that detects file types])
-])# _LD_DECL_FILECMD
-
# _LT_DECL_SED
# ------------
# Check for a fully-functional sed program, that truncates
@@ -8396,8 +8365,8 @@ _LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd],
# Helper functions for option handling. -*- Autoconf -*-
#
-# Copyright (C) 2004-2005, 2007-2009, 2011-2019, 2021-2022 Free
-# Software Foundation, Inc.
+# Copyright (C) 2004-2005, 2007-2009, 2011-2015 Free Software
+# Foundation, Inc.
# Written by Gary V. Vaughan, 2004
#
# This file is free software; the Free Software Foundation gives
@@ -8828,7 +8797,7 @@ LT_OPTION_DEFINE([LTDL_INIT], [convenience],
# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*-
#
-# Copyright (C) 2004-2005, 2007-2008, 2011-2019, 2021-2022 Free Software
+# Copyright (C) 2004-2005, 2007-2008, 2011-2015 Free Software
# Foundation, Inc.
# Written by Gary V. Vaughan, 2004
#
@@ -8953,8 +8922,7 @@ m4_define([lt_dict_filter],
# ltversion.m4 -- version numbers -*- Autoconf -*-
#
-# Copyright (C) 2004, 2011-2019, 2021-2022 Free Software Foundation,
-# Inc.
+# Copyright (C) 2004, 2011-2015 Free Software Foundation, Inc.
# Written by Scott James Remnant, 2004
#
# This file is free software; the Free Software Foundation gives
@@ -8963,23 +8931,23 @@ m4_define([lt_dict_filter],
# @configure_input@
-# serial 4245 ltversion.m4
+# serial 4179 ltversion.m4
# This file is part of GNU Libtool
-m4_define([LT_PACKAGE_VERSION], [2.4.7])
-m4_define([LT_PACKAGE_REVISION], [2.4.7])
+m4_define([LT_PACKAGE_VERSION], [2.4.6])
+m4_define([LT_PACKAGE_REVISION], [2.4.6])
AC_DEFUN([LTVERSION_VERSION],
-[macro_version='2.4.7'
-macro_revision='2.4.7'
+[macro_version='2.4.6'
+macro_revision='2.4.6'
_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?])
_LT_DECL(, macro_revision, 0)
])
# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*-
#
-# Copyright (C) 2004-2005, 2007, 2009, 2011-2019, 2021-2022 Free
-# Software Foundation, Inc.
+# Copyright (C) 2004-2005, 2007, 2009, 2011-2015 Free Software
+# Foundation, Inc.
# Written by Scott James Remnant, 2004.
#
# This file is free software; the Free Software Foundation gives
@@ -9076,8 +9044,8 @@ m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])])
m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])])
m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])])
-# pkg.m4 - Macros to locate and use pkg-config. -*- Autoconf -*-
-# serial 12 (pkg-config-0.29.2)
+# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*-
+# serial 11 (pkg-config-0.29.1)
dnl Copyright © 2004 Scott James Remnant <scott@netsplit.com>.
dnl Copyright © 2012-2015 Dan Nicholson <dbn.lists@gmail.com>
@@ -9119,7 +9087,7 @@ dnl
dnl See the "Since" comment for each macro you use to see what version
dnl of the macros you require.
m4_defun([PKG_PREREQ],
-[m4_define([PKG_MACROS_VERSION], [0.29.2])
+[m4_define([PKG_MACROS_VERSION], [0.29.1])
m4_if(m4_version_compare(PKG_MACROS_VERSION, [$1]), -1,
[m4_fatal([pkg.m4 version $1 or higher is required but ]PKG_MACROS_VERSION[ found])])
])dnl PKG_PREREQ
@@ -9164,7 +9132,7 @@ dnl Check to see whether a particular set of modules exists. Similar to
dnl PKG_CHECK_MODULES(), but does not set variables or print errors.
dnl
dnl Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG])
-dnl only at the first occurrence in configure.ac, so if the first place
+dnl only at the first occurence in configure.ac, so if the first place
dnl it's called might be skipped (such as if it is within an "if", you
dnl have to call PKG_CHECK_EXISTS manually
AC_DEFUN([PKG_CHECK_EXISTS],
@@ -9220,7 +9188,7 @@ AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl
AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl
pkg_failed=no
-AC_MSG_CHECKING([for $2])
+AC_MSG_CHECKING([for $1])
_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2])
_PKG_CONFIG([$1][_LIBS], [libs], [$2])
@@ -9230,17 +9198,17 @@ and $1[]_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more details.])
if test $pkg_failed = yes; then
- AC_MSG_RESULT([no])
+ AC_MSG_RESULT([no])
_PKG_SHORT_ERRORS_SUPPORTED
if test $_pkg_short_errors_supported = yes; then
- $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1`
- else
- $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1`
+ $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1`
+ else
+ $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1`
fi
- # Put the nasty error message in config.log where it belongs
- echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD
+ # Put the nasty error message in config.log where it belongs
+ echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD
- m4_default([$4], [AC_MSG_ERROR(
+ m4_default([$4], [AC_MSG_ERROR(
[Package requirements ($2) were not met:
$$1_PKG_ERRORS
@@ -9251,8 +9219,8 @@ installed software in a non-standard prefix.
_PKG_TEXT])[]dnl
])
elif test $pkg_failed = untried; then
- AC_MSG_RESULT([no])
- m4_default([$4], [AC_MSG_FAILURE(
+ AC_MSG_RESULT([no])
+ m4_default([$4], [AC_MSG_FAILURE(
[The pkg-config script could not be found or is too old. Make sure it
is in your PATH or set the PKG_CONFIG environment variable to the full
path to pkg-config.
@@ -9262,10 +9230,10 @@ _PKG_TEXT
To get pkg-config, see <http://pkg-config.freedesktop.org/>.])[]dnl
])
else
- $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS
- $1[]_LIBS=$pkg_cv_[]$1[]_LIBS
+ $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS
+ $1[]_LIBS=$pkg_cv_[]$1[]_LIBS
AC_MSG_RESULT([yes])
- $3
+ $3
fi[]dnl
])dnl PKG_CHECK_MODULES
@@ -9422,7 +9390,7 @@ AS_IF([test "$AS_TR_SH([with_]m4_tolower([$1]))" = "yes"],
# AM_CONDITIONAL -*- Autoconf -*-
-# Copyright (C) 1997-2021 Free Software Foundation, Inc.
+# Copyright (C) 1997-2020 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -9453,7 +9421,7 @@ AC_CONFIG_COMMANDS_PRE(
Usually this means the macro was only invoked conditionally.]])
fi])])
-# Copyright (C) 2006-2021 Free Software Foundation, Inc.
+# Copyright (C) 2006-2020 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
diff --git a/cachedb/cachedb.c b/cachedb/cachedb.c
index 7a07b9976967..0329f8458bd7 100644
--- a/cachedb/cachedb.c
+++ b/cachedb/cachedb.c
@@ -621,6 +621,9 @@ parse_data(struct module_qstate* qstate, struct sldns_buffer* buf,
}
verbose(VERB_ALGO, "cachedb msg adjusted down by %d", (int)adjust);
adjust_msg_ttl(qstate->return_msg, adjust);
+ if(qstate->env->cfg->aggressive_nsec) {
+ limit_nsec_ttl(qstate->return_msg);
+ }
/* Similar to the unbound worker, if serve-expired is enabled and
* the msg would be considered to be expired, mark the state so a
@@ -828,8 +831,6 @@ cachedb_handle_query(struct module_qstate* qstate,
/* In case we have expired data but there is a client timer for expired
* answers, pass execution to next module in order to try updating the
* data first.
- * TODO: this needs revisit. The expired data stored from cachedb has
- * 0 TTL which is picked up by iterator later when looking in the cache.
*/
if(qstate->env->cfg->serve_expired && msg_expired) {
qstate->return_msg = NULL;
diff --git a/cachedb/redis.c b/cachedb/redis.c
index 6cc975901df2..68c033535a69 100644
--- a/cachedb/redis.c
+++ b/cachedb/redis.c
@@ -58,7 +58,8 @@ struct redis_moddata {
int server_port; /* server's TCP port */
const char* server_path; /* server's unix path, or "", NULL if unused */
const char* server_password; /* server's AUTH password, or "", NULL if unused */
- struct timeval timeout; /* timeout for connection setup and commands */
+ struct timeval command_timeout; /* timeout for commands */
+ struct timeval connect_timeout; /* timeout for connect */
int logical_db; /* the redis logical database to use */
};
@@ -88,10 +89,10 @@ redis_connect(const struct redis_moddata* moddata)
if(moddata->server_path && moddata->server_path[0]!=0) {
ctx = redisConnectUnixWithTimeout(moddata->server_path,
- moddata->timeout);
+ moddata->connect_timeout);
} else {
ctx = redisConnectWithTimeout(moddata->server_host,
- moddata->server_port, moddata->timeout);
+ moddata->server_port, moddata->connect_timeout);
}
if(!ctx || ctx->err) {
const char *errstr = "out of memory";
@@ -100,7 +101,7 @@ redis_connect(const struct redis_moddata* moddata)
log_err("failed to connect to redis server: %s", errstr);
goto fail;
}
- if(redisSetTimeout(ctx, moddata->timeout) != REDIS_OK) {
+ if(redisSetTimeout(ctx, moddata->command_timeout) != REDIS_OK) {
log_err("failed to set redis timeout");
goto fail;
}
@@ -159,8 +160,24 @@ redis_init(struct module_env* env, struct cachedb_env* cachedb_env)
moddata->server_port = env->cfg->redis_server_port;
moddata->server_path = env->cfg->redis_server_path;
moddata->server_password = env->cfg->redis_server_password;
- moddata->timeout.tv_sec = env->cfg->redis_timeout / 1000;
- moddata->timeout.tv_usec = (env->cfg->redis_timeout % 1000) * 1000;
+ moddata->command_timeout.tv_sec = env->cfg->redis_timeout / 1000;
+ moddata->command_timeout.tv_usec =
+ (env->cfg->redis_timeout % 1000) * 1000;
+ moddata->connect_timeout.tv_sec = env->cfg->redis_timeout / 1000;
+ moddata->connect_timeout.tv_usec =
+ (env->cfg->redis_timeout % 1000) * 1000;
+ if(env->cfg->redis_command_timeout != 0) {
+ moddata->command_timeout.tv_sec =
+ env->cfg->redis_command_timeout / 1000;
+ moddata->command_timeout.tv_usec =
+ (env->cfg->redis_command_timeout % 1000) * 1000;
+ }
+ if(env->cfg->redis_connect_timeout != 0) {
+ moddata->connect_timeout.tv_sec =
+ env->cfg->redis_connect_timeout / 1000;
+ moddata->connect_timeout.tv_usec =
+ (env->cfg->redis_connect_timeout % 1000) * 1000;
+ }
moddata->logical_db = env->cfg->redis_logical_db;
for(i = 0; i < moddata->numctxs; i++) {
redisContext* ctx = redis_connect(moddata);
diff --git a/config.h.in b/config.h.in
index 099206025a33..dc03e82dddba 100644
--- a/config.h.in
+++ b/config.h.in
@@ -129,6 +129,14 @@
and to 0 if you don't. */
#undef HAVE_DECL_NGHTTP2_SESSION_SERVER_NEW
+/* Define to 1 if you have the declaration of `ngtcp2_conn_server_new', and to
+ 0 if you don't. */
+#undef HAVE_DECL_NGTCP2_CONN_SERVER_NEW
+
+/* Define to 1 if you have the declaration of `ngtcp2_crypto_encrypt_cb', and
+ to 0 if you don't. */
+#undef HAVE_DECL_NGTCP2_CRYPTO_ENCRYPT_CB
+
/* Define to 1 if you have the declaration of `NID_ED25519', and to 0 if you
don't. */
#undef HAVE_DECL_NID_ED25519
@@ -421,6 +429,65 @@
/* Define to 1 if you have the <nghttp2/nghttp2.h> header file. */
#undef HAVE_NGHTTP2_NGHTTP2_H
+/* Define this to use ngtcp2. */
+#undef HAVE_NGTCP2
+
+/* Define to 1 if you have the `ngtcp2_ccerr_default' function. */
+#undef HAVE_NGTCP2_CCERR_DEFAULT
+
+/* Define to 1 if you have the `ngtcp2_conn_encode_0rtt_transport_params'
+ function. */
+#undef HAVE_NGTCP2_CONN_ENCODE_0RTT_TRANSPORT_PARAMS
+
+/* Define to 1 if you have the `ngtcp2_conn_get_max_local_streams_uni'
+ function. */
+#undef HAVE_NGTCP2_CONN_GET_MAX_LOCAL_STREAMS_UNI
+
+/* Define to 1 if you have the `ngtcp2_conn_get_num_scid' function. */
+#undef HAVE_NGTCP2_CONN_GET_NUM_SCID
+
+/* Define to 1 if you have the `ngtcp2_conn_in_closing_period' function. */
+#undef HAVE_NGTCP2_CONN_IN_CLOSING_PERIOD
+
+/* Define to 1 if you have the `ngtcp2_conn_in_draining_period' function. */
+#undef HAVE_NGTCP2_CONN_IN_DRAINING_PERIOD
+
+/* Define if ngtcp2_conn_shutdown_stream has 4 arguments. */
+#undef HAVE_NGTCP2_CONN_SHUTDOWN_STREAM4
+
+/* Define to 1 if you have the `ngtcp2_conn_tls_early_data_rejected' function.
+ */
+#undef HAVE_NGTCP2_CONN_TLS_EARLY_DATA_REJECTED
+
+/* Define to 1 if you have the `ngtcp2_crypto_encrypt_cb' function. */
+#undef HAVE_NGTCP2_CRYPTO_ENCRYPT_CB
+
+/* Define to 1 if you have the
+ `ngtcp2_crypto_quictls_configure_client_context' function. */
+#undef HAVE_NGTCP2_CRYPTO_QUICTLS_CONFIGURE_CLIENT_CONTEXT
+
+/* Define to 1 if you have the
+ `ngtcp2_crypto_quictls_configure_server_context' function. */
+#undef HAVE_NGTCP2_CRYPTO_QUICTLS_CONFIGURE_SERVER_CONTEXT
+
+/* Define to 1 if you have the
+ `ngtcp2_crypto_quictls_from_ossl_encryption_level' function. */
+#undef HAVE_NGTCP2_CRYPTO_QUICTLS_FROM_OSSL_ENCRYPTION_LEVEL
+
+/* Define to 1 if the system has the type `ngtcp2_encryption_level'. */
+#undef HAVE_NGTCP2_ENCRYPTION_LEVEL
+
+/* Define to 1 if you have the <ngtcp2/ngtcp2_crypto_openssl.h> header file.
+ */
+#undef HAVE_NGTCP2_NGTCP2_CRYPTO_OPENSSL_H
+
+/* Define to 1 if you have the <ngtcp2/ngtcp2_crypto_quictls.h> header file.
+ */
+#undef HAVE_NGTCP2_NGTCP2_CRYPTO_QUICTLS_H
+
+/* Define to 1 if you have the <ngtcp2/ngtcp2.h> header file. */
+#undef HAVE_NGTCP2_NGTCP2_H
+
/* Use libnss for crypto */
#undef HAVE_NSS
@@ -587,6 +654,9 @@
/* Define to 1 if you have the `SSL_get1_peer_certificate' function. */
#undef HAVE_SSL_GET1_PEER_CERTIFICATE
+/* Define to 1 if you have the `SSL_is_quic' function. */
+#undef HAVE_SSL_IS_QUIC
+
/* Define to 1 if you have the `SSL_set1_host' function. */
#undef HAVE_SSL_SET1_HOST
@@ -629,6 +699,23 @@
/* Define to 1 if `ipi_spec_dst' is a member of `struct in_pktinfo'. */
#undef HAVE_STRUCT_IN_PKTINFO_IPI_SPEC_DST
+/* Define to 1 if `tokenlen' is a member of `struct ngtcp2_pkt_hd'. */
+#undef HAVE_STRUCT_NGTCP2_PKT_HD_TOKENLEN
+
+/* Define to 1 if `max_tx_udp_payload_size' is a member of `struct
+ ngtcp2_settings'. */
+#undef HAVE_STRUCT_NGTCP2_SETTINGS_MAX_TX_UDP_PAYLOAD_SIZE
+
+/* Define to 1 if `tokenlen' is a member of `struct ngtcp2_settings'. */
+#undef HAVE_STRUCT_NGTCP2_SETTINGS_TOKENLEN
+
+/* Define to 1 if `original_dcid_present' is a member of `struct
+ ngtcp2_transport_params'. */
+#undef HAVE_STRUCT_NGTCP2_TRANSPORT_PARAMS_ORIGINAL_DCID_PRESENT
+
+/* Define to 1 if the system has the type `struct ngtcp2_version_cid'. */
+#undef HAVE_STRUCT_NGTCP2_VERSION_CID
+
/* Define to 1 if `sun_len' is a member of `struct sockaddr_un'. */
#undef HAVE_STRUCT_SOCKADDR_UN_SUN_LEN
@@ -1497,6 +1584,9 @@ struct sockaddr_storage;
# define free(p) unbound_stat_free_log(p, __FILE__, __LINE__, __func__)
# define realloc(p,s) unbound_stat_realloc_log(p, s, __FILE__, __LINE__, __func__)
# define strdup(s) unbound_stat_strdup_log(s, __FILE__, __LINE__, __func__)
+#ifdef HAVE_REALLOCARRAY
+# define reallocarray(p,n,s) unbound_stat_reallocarray_log(p, n, s, __FILE__, __LINE__, __func__)
+#endif
void *unbound_stat_malloc(size_t size);
void *unbound_stat_calloc(size_t nmemb, size_t size);
void unbound_stat_free(void *ptr);
@@ -1509,6 +1599,8 @@ void unbound_stat_free_log(void *ptr, const char* file, int line,
const char* func);
void *unbound_stat_realloc_log(void *ptr, size_t size, const char* file,
int line, const char* func);
+void *unbound_stat_reallocarray_log(void *ptr, size_t nmemb, size_t size,
+ const char* file, int line, const char* func);
char *unbound_stat_strdup_log(const char *s, const char* file, int line,
const char* func);
#elif defined(UNBOUND_ALLOC_LITE)
@@ -1521,6 +1613,8 @@ char *unbound_stat_strdup_log(const char *s, const char* file, int line,
#define UNBOUND_DNS_OVER_TLS_PORT 853
/** default port for DNS over HTTPS traffic. */
#define UNBOUND_DNS_OVER_HTTPS_PORT 443
+/** default port for DNS over QUIC traffic. */
+#define UNBOUND_DNS_OVER_QUIC_PORT 853
/** default port for unbound control traffic, registered port with IANA,
ub-dns-control 8953/tcp unbound dns nameserver control */
#define UNBOUND_CONTROL_PORT 8953
diff --git a/configure b/configure
index b760920d1355..918a0632013d 100755
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.71 for unbound 1.21.1.
+# Generated by GNU Autoconf 2.71 for unbound 1.22.0.
#
# Report bugs to <unbound-bugs@nlnetlabs.nl or https://github.com/NLnetLabs/unbound/issues>.
#
@@ -622,8 +622,8 @@ MAKEFLAGS=
# Identity of this package.
PACKAGE_NAME='unbound'
PACKAGE_TARNAME='unbound'
-PACKAGE_VERSION='1.21.1'
-PACKAGE_STRING='unbound 1.21.1'
+PACKAGE_VERSION='1.22.0'
+PACKAGE_STRING='unbound 1.22.0'
PACKAGE_BUGREPORT='unbound-bugs@nlnetlabs.nl or https://github.com/NLnetLabs/unbound/issues'
PACKAGE_URL=''
@@ -771,7 +771,6 @@ RANLIB
ac_ct_AR
DLLTOOL
OBJDUMP
-FILECMD
LN_S
NM
ac_ct_DUMPBIN
@@ -922,6 +921,7 @@ with_libevent
with_libexpat
with_libhiredis
with_libnghttp2
+with_libngtcp2
enable_static_exe
enable_fully_static
enable_lock_checks
@@ -1509,7 +1509,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF
-\`configure' configures unbound 1.21.1 to adapt to many kinds of systems.
+\`configure' configures unbound 1.22.0 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -1575,7 +1575,7 @@ fi
if test -n "$ac_init_help"; then
case $ac_init_help in
- short | recursive ) echo "Configuration of unbound 1.21.1:";;
+ short | recursive ) echo "Configuration of unbound 1.22.0:";;
esac
cat <<\_ACEOF
@@ -1710,6 +1710,7 @@ Optional Packages:
--with-libexpat=path specify explicit path for libexpat.
--with-libhiredis=path specify explicit path for libhiredis.
--with-libnghttp2=path specify explicit path for libnghttp2.
+ --with-libngtcp2=path specify explicit path for libngtcp2, for QUIC.
--with-dnstap-socket-path=pathname
set default dnstap socket path
--with-protobuf-c=path Path where protobuf-c is installed, for dnstap
@@ -1823,7 +1824,7 @@ fi
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
-unbound configure 1.21.1
+unbound configure 1.22.0
generated by GNU Autoconf 2.71
Copyright (C) 2021 Free Software Foundation, Inc.
@@ -2480,7 +2481,7 @@ cat >config.log <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
-It was created by unbound $as_me 1.21.1, which was
+It was created by unbound $as_me 1.22.0, which was
generated by GNU Autoconf 2.71. Invocation command line was
$ $0$ac_configure_args_raw
@@ -3242,13 +3243,13 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
UNBOUND_VERSION_MAJOR=1
-UNBOUND_VERSION_MINOR=21
+UNBOUND_VERSION_MINOR=22
-UNBOUND_VERSION_MICRO=1
+UNBOUND_VERSION_MICRO=0
LIBUNBOUND_CURRENT=9
-LIBUNBOUND_REVISION=29
+LIBUNBOUND_REVISION=30
LIBUNBOUND_AGE=1
# 1.0.0 had 0:12:0
# 1.0.1 had 0:13:0
@@ -3345,6 +3346,7 @@ LIBUNBOUND_AGE=1
# 1.20.0 had 9:27:1
# 1.21.0 had 9:28:1
# 1.21.1 had 9:29:1
+# 1.22.0 had 9:30:1
# Current -- the number of the binary API that we're implementing
# Revision -- which iteration of the implementation of the binary
@@ -7782,8 +7784,8 @@ esac
-macro_version='2.4.7'
-macro_revision='2.4.7'
+macro_version='2.4.6'
+macro_revision='2.4.6'
@@ -8267,13 +8269,13 @@ else
mingw*) lt_bad_file=conftest.nm/nofile ;;
*) lt_bad_file=/dev/null ;;
esac
- case `"$tmp_nm" -B $lt_bad_file 2>&1 | $SED '1q'` in
+ case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in
*$lt_bad_file* | *'Invalid file or object type'*)
lt_cv_path_NM="$tmp_nm -B"
break 2
;;
*)
- case `"$tmp_nm" -p /dev/null 2>&1 | $SED '1q'` in
+ case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
*/dev/null*)
lt_cv_path_NM="$tmp_nm -p"
break 2
@@ -8411,7 +8413,7 @@ esac
fi
fi
- case `$DUMPBIN -symbols -headers /dev/null 2>&1 | $SED '1q'` in
+ case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in
*COFF*)
DUMPBIN="$DUMPBIN -symbols -headers"
;;
@@ -8515,7 +8517,7 @@ else $as_nop
lt_cv_sys_max_cmd_len=8192;
;;
- bitrig* | darwin* | dragonfly* | freebsd* | midnightbsd* | netbsd* | openbsd*)
+ bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*)
# This has been around since 386BSD, at least. Likely further.
if test -x /sbin/sysctl; then
lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
@@ -8558,7 +8560,7 @@ else $as_nop
sysv5* | sco5v6* | sysv4.2uw2*)
kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
if test -n "$kargmax"; then
- lt_cv_sys_max_cmd_len=`echo $kargmax | $SED 's/.*[ ]//'`
+ lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'`
else
lt_cv_sys_max_cmd_len=32768
fi
@@ -8764,114 +8766,6 @@ esac
if test -n "$ac_tool_prefix"; then
- # Extract the first word of "${ac_tool_prefix}file", so it can be a program name with args.
-set dummy ${ac_tool_prefix}file; ac_word=$2
-{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-printf %s "checking for $ac_word... " >&6; }
-if test ${ac_cv_prog_FILECMD+y}
-then :
- printf %s "(cached) " >&6
-else $as_nop
- if test -n "$FILECMD"; then
- ac_cv_prog_FILECMD="$FILECMD" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- case $as_dir in #(((
- '') as_dir=./ ;;
- */) ;;
- *) as_dir=$as_dir/ ;;
- esac
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
- ac_cv_prog_FILECMD="${ac_tool_prefix}file"
- printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-FILECMD=$ac_cv_prog_FILECMD
-if test -n "$FILECMD"; then
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $FILECMD" >&5
-printf "%s\n" "$FILECMD" >&6; }
-else
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
-printf "%s\n" "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_FILECMD"; then
- ac_ct_FILECMD=$FILECMD
- # Extract the first word of "file", so it can be a program name with args.
-set dummy file; ac_word=$2
-{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-printf %s "checking for $ac_word... " >&6; }
-if test ${ac_cv_prog_ac_ct_FILECMD+y}
-then :
- printf %s "(cached) " >&6
-else $as_nop
- if test -n "$ac_ct_FILECMD"; then
- ac_cv_prog_ac_ct_FILECMD="$ac_ct_FILECMD" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- case $as_dir in #(((
- '') as_dir=./ ;;
- */) ;;
- *) as_dir=$as_dir/ ;;
- esac
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
- ac_cv_prog_ac_ct_FILECMD="file"
- printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_FILECMD=$ac_cv_prog_ac_ct_FILECMD
-if test -n "$ac_ct_FILECMD"; then
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_FILECMD" >&5
-printf "%s\n" "$ac_ct_FILECMD" >&6; }
-else
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
-printf "%s\n" "no" >&6; }
-fi
-
- if test "x$ac_ct_FILECMD" = x; then
- FILECMD=":"
- else
- case $cross_compiling:$ac_tool_warned in
-yes:)
-{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
- FILECMD=$ac_ct_FILECMD
- fi
-else
- FILECMD="$ac_cv_prog_FILECMD"
-fi
-
-
-
-
-
-
-
-if test -n "$ac_tool_prefix"; then
# Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args.
set dummy ${ac_tool_prefix}objdump; ac_word=$2
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
@@ -9014,7 +8908,7 @@ beos*)
bsdi[45]*)
lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)'
- lt_cv_file_magic_cmd='$FILECMD -L'
+ lt_cv_file_magic_cmd='/usr/bin/file -L'
lt_cv_file_magic_test_file=/shlib/libc.so
;;
@@ -9048,14 +8942,14 @@ darwin* | rhapsody*)
lt_cv_deplibs_check_method=pass_all
;;
-freebsd* | dragonfly* | midnightbsd*)
+freebsd* | dragonfly*)
if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
case $host_cpu in
i*86 )
# Not sure whether the presence of OpenBSD here was a mistake.
# Let's accept both of them until this is cleared up.
lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library'
- lt_cv_file_magic_cmd=$FILECMD
+ lt_cv_file_magic_cmd=/usr/bin/file
lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
;;
esac
@@ -9069,7 +8963,7 @@ haiku*)
;;
hpux10.20* | hpux11*)
- lt_cv_file_magic_cmd=$FILECMD
+ lt_cv_file_magic_cmd=/usr/bin/file
case $host_cpu in
ia64*)
lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64'
@@ -9116,7 +9010,7 @@ netbsd*)
newos6*)
lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)'
- lt_cv_file_magic_cmd=$FILECMD
+ lt_cv_file_magic_cmd=/usr/bin/file
lt_cv_file_magic_test_file=/usr/lib/libnls.so
;;
@@ -9489,29 +9383,13 @@ esac
fi
: ${AR=ar}
+: ${AR_FLAGS=cru}
-# Use ARFLAGS variable as AR's operation code to sync the variable naming with
-# Automake. If both AR_FLAGS and ARFLAGS are specified, AR_FLAGS should have
-# higher priority because thats what people were doing historically (setting
-# ARFLAGS for automake and AR_FLAGS for libtool). FIXME: Make the AR_FLAGS
-# variable obsoleted/removed.
-
-test ${AR_FLAGS+y} || AR_FLAGS=${ARFLAGS-cr}
-lt_ar_flags=$AR_FLAGS
-
-
-
-
-
-
-# Make AR_FLAGS overridable by 'make ARFLAGS='. Don't try to run-time override
-# by AR_FLAGS because that was never working and AR_FLAGS is about to die.
-
@@ -9975,7 +9853,7 @@ esac
if test "$lt_cv_nm_interface" = "MS dumpbin"; then
# Gets list of data symbols to import.
- lt_cv_sys_global_symbol_to_import="$SED -n -e 's/^I .* \(.*\)$/\1/p'"
+ lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'"
# Adjust the below global symbol transforms to fixup imported variables.
lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'"
lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'"
@@ -9993,20 +9871,20 @@ fi
# Transform an extracted symbol line into a proper C declaration.
# Some systems (esp. on ia64) link data and code symbols differently,
# so use this general approach.
-lt_cv_sys_global_symbol_to_cdecl="$SED -n"\
+lt_cv_sys_global_symbol_to_cdecl="sed -n"\
$lt_cdecl_hook\
" -e 's/^T .* \(.*\)$/extern int \1();/p'"\
" -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'"
# Transform an extracted symbol line into symbol name and symbol address
-lt_cv_sys_global_symbol_to_c_name_address="$SED -n"\
+lt_cv_sys_global_symbol_to_c_name_address="sed -n"\
$lt_c_name_hook\
" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\
" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'"
# Transform an extracted symbol line into symbol name with lib prefix and
# symbol address.
-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="$SED -n"\
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\
$lt_c_name_lib_hook\
" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\
" -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\
@@ -10030,7 +9908,7 @@ for ac_symprfx in "" "_"; do
if test "$lt_cv_nm_interface" = "MS dumpbin"; then
# Fake it for dumpbin and say T for any non-static function,
# D for any global variable and I for any imported variable.
- # Also find C++ and __fastcall symbols from MSVC++ or ICC,
+ # Also find C++ and __fastcall symbols from MSVC++,
# which start with @ or ?.
lt_cv_sys_global_symbol_pipe="$AWK '"\
" {last_section=section; section=\$ 3};"\
@@ -10048,9 +9926,9 @@ for ac_symprfx in "" "_"; do
" s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\
" ' prfx=^$ac_symprfx"
else
- lt_cv_sys_global_symbol_pipe="$SED -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
+ lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
fi
- lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | $SED '/ __gnu_lto/d'"
+ lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'"
# Check to see that the pipe works correctly.
pipe_works=no
@@ -10253,7 +10131,7 @@ case $with_sysroot in #(
fi
;; #(
/*)
- lt_sysroot=`echo "$with_sysroot" | $SED -e "$sed_quote_subst"`
+ lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"`
;; #(
no|'')
;; #(
@@ -10378,7 +10256,7 @@ ia64-*-hpux*)
ac_status=$?
printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; then
- case `$FILECMD conftest.$ac_objext` in
+ case `/usr/bin/file conftest.$ac_objext` in
*ELF-32*)
HPUX_IA64_MODE=32
;;
@@ -10399,7 +10277,7 @@ ia64-*-hpux*)
printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; then
if test yes = "$lt_cv_prog_gnu_ld"; then
- case `$FILECMD conftest.$ac_objext` in
+ case `/usr/bin/file conftest.$ac_objext` in
*32-bit*)
LD="${LD-ld} -melf32bsmip"
;;
@@ -10411,7 +10289,7 @@ ia64-*-hpux*)
;;
esac
else
- case `$FILECMD conftest.$ac_objext` in
+ case `/usr/bin/file conftest.$ac_objext` in
*32-bit*)
LD="${LD-ld} -32"
;;
@@ -10437,7 +10315,7 @@ mips64*-*linux*)
printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; then
emul=elf
- case `$FILECMD conftest.$ac_objext` in
+ case `/usr/bin/file conftest.$ac_objext` in
*32-bit*)
emul="${emul}32"
;;
@@ -10445,7 +10323,7 @@ mips64*-*linux*)
emul="${emul}64"
;;
esac
- case `$FILECMD conftest.$ac_objext` in
+ case `/usr/bin/file conftest.$ac_objext` in
*MSB*)
emul="${emul}btsmip"
;;
@@ -10453,7 +10331,7 @@ mips64*-*linux*)
emul="${emul}ltsmip"
;;
esac
- case `$FILECMD conftest.$ac_objext` in
+ case `/usr/bin/file conftest.$ac_objext` in
*N32*)
emul="${emul}n32"
;;
@@ -10477,14 +10355,14 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
ac_status=$?
printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; then
- case `$FILECMD conftest.o` in
+ case `/usr/bin/file conftest.o` in
*32-bit*)
case $host in
x86_64-*kfreebsd*-gnu)
LD="${LD-ld} -m elf_i386_fbsd"
;;
x86_64-*linux*)
- case `$FILECMD conftest.o` in
+ case `/usr/bin/file conftest.o` in
*x86-64*)
LD="${LD-ld} -m elf32_x86_64"
;;
@@ -10592,7 +10470,7 @@ printf "%s\n" "$lt_cv_cc_needs_belf" >&6; }
ac_status=$?
printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; then
- case `$FILECMD conftest.o` in
+ case `/usr/bin/file conftest.o` in
*64-bit*)
case $lt_cv_prog_gnu_ld in
yes*)
@@ -11375,8 +11253,8 @@ int forced_loaded() { return 2;}
_LT_EOF
echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5
$LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5
- echo "$AR $AR_FLAGS libconftest.a conftest.o" >&5
- $AR $AR_FLAGS libconftest.a conftest.o 2>&5
+ echo "$AR cru libconftest.a conftest.o" >&5
+ $AR cru libconftest.a conftest.o 2>&5
echo "$RANLIB libconftest.a" >&5
$RANLIB libconftest.a 2>&5
cat > conftest.c << _LT_EOF
@@ -11403,12 +11281,17 @@ printf "%s\n" "$lt_cv_ld_force_load" >&6; }
_lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;;
darwin1.*)
_lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
- darwin*)
- case $MACOSX_DEPLOYMENT_TARGET,$host in
- 10.[012],*|,*powerpc*-darwin[5-8]*)
- _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
- *)
- _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;
+ darwin*) # darwin 5.x on
+ # if running on 10.5 or later, the deployment target defaults
+ # to the OS version, if on x86, and 10.4, the deployment
+ # target defaults to 10.4. Don't you love it?
+ case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
+ 10.0,*86*-darwin8*|10.0,*-darwin[91]*)
+ _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;
+ 10.[012][,.]*)
+ _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
+ 10.*)
+ _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;
esac
;;
esac
@@ -11769,8 +11652,8 @@ esac
ofile=libtool
can_build_shared=yes
-# All known linkers require a '.a' archive for static linking (except MSVC and
-# ICC, which need '.lib').
+# All known linkers require a '.a' archive for static linking (except MSVC,
+# which needs '.lib').
libext=a
with_gnu_ld=$lt_cv_prog_gnu_ld
@@ -12278,7 +12161,7 @@ lt_prog_compiler_static=
lt_prog_compiler_static='-qstaticlink'
;;
*)
- case `$CC -V 2>&1 | $SED 5q` in
+ case `$CC -V 2>&1 | sed 5q` in
*Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*)
# Sun Fortran 8.3 passes all unrecognized flags to the linker
lt_prog_compiler_pic='-KPIC'
@@ -12701,15 +12584,15 @@ printf %s "checking whether the $compiler linker ($LD) supports shared libraries
case $host_os in
cygwin* | mingw* | pw32* | cegcc*)
- # FIXME: the MSVC++ and ICC port hasn't been tested in a loooong time
+ # FIXME: the MSVC++ port hasn't been tested in a loooong time
# When not using gcc, we currently assume that we are using
- # Microsoft Visual C++ or Intel C++ Compiler.
+ # Microsoft Visual C++.
if test yes != "$GCC"; then
with_gnu_ld=no
fi
;;
interix*)
- # we just hope/assume this is gcc and not c89 (= MSVC++ or ICC)
+ # we just hope/assume this is gcc and not c89 (= MSVC++)
with_gnu_ld=yes
;;
openbsd* | bitrig*)
@@ -12761,7 +12644,7 @@ printf %s "checking whether the $compiler linker ($LD) supports shared libraries
whole_archive_flag_spec=
fi
supports_anon_versioning=no
- case `$LD -v | $SED -e 's/([^)]\+)\s\+//' 2>&1` in
+ case `$LD -v | $SED -e 's/(^)\+)\s\+//' 2>&1` in
*GNU\ gold*) supports_anon_versioning=yes ;;
*\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
*\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
@@ -12873,7 +12756,6 @@ _LT_EOF
emximp -o $lib $output_objdir/$libname.def'
old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
enable_shared_with_static_runtimes=yes
- file_list_spec='@'
;;
interix[3-9]*)
@@ -12888,7 +12770,7 @@ _LT_EOF
# 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
# time. Moving up from 0x10000000 also allows more sbrk(2) space.
archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
- archive_expsym_cmds='$SED "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ archive_expsym_cmds='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
;;
gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
@@ -12931,7 +12813,7 @@ _LT_EOF
compiler_needs_object=yes
;;
esac
- case `$CC -V 2>&1 | $SED 5q` in
+ case `$CC -V 2>&1 | sed 5q` in
*Sun\ C*) # Sun C 5.9
whole_archive_flag_spec='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
compiler_needs_object=yes
@@ -12943,7 +12825,7 @@ _LT_EOF
if test yes = "$supports_anon_versioning"; then
archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
- cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
echo "local: *; };" >> $output_objdir/$libname.ver~
$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib'
fi
@@ -12959,7 +12841,7 @@ _LT_EOF
archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
if test yes = "$supports_anon_versioning"; then
archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
- cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
echo "local: *; };" >> $output_objdir/$libname.ver~
$LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
fi
@@ -13091,7 +12973,7 @@ _LT_EOF
if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols'
else
- export_symbols_cmds='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "L") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
+ export_symbols_cmds='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
fi
aix_use_runtimelinking=no
@@ -13362,12 +13244,12 @@ fi
cygwin* | mingw* | pw32* | cegcc*)
# When not using gcc, we currently assume that we are using
- # Microsoft Visual C++ or Intel C++ Compiler.
+ # Microsoft Visual C++.
# hardcode_libdir_flag_spec is actually meaningless, as there is
# no search path for DLLs.
case $cc_basename in
- cl* | icl*)
- # Native MSVC or ICC
+ cl*)
+ # Native MSVC
hardcode_libdir_flag_spec=' '
allow_undefined_flag=unsupported
always_export_symbols=yes
@@ -13408,7 +13290,7 @@ fi
fi'
;;
*)
- # Assume MSVC and ICC wrapper
+ # Assume MSVC wrapper
hardcode_libdir_flag_spec=' '
allow_undefined_flag=unsupported
# Tell ltmain to make .lib files, not .a files.
@@ -13449,8 +13331,8 @@ fi
output_verbose_link_cmd=func_echo_all
archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil"
module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil"
- archive_expsym_cmds="$SED 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil"
- module_expsym_cmds="$SED -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil"
+ archive_expsym_cmds="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil"
+ module_expsym_cmds="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil"
else
ld_shlibs=no
@@ -13484,7 +13366,7 @@ fi
;;
# FreeBSD 3 and greater uses gcc -shared to do shared libraries.
- freebsd* | dragonfly* | midnightbsd*)
+ freebsd* | dragonfly*)
archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
hardcode_libdir_flag_spec='-R$libdir'
hardcode_direct=yes
@@ -13735,7 +13617,6 @@ printf "%s\n" "$lt_cv_irix_exported_symbol" >&6; }
emximp -o $lib $output_objdir/$libname.def'
old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
enable_shared_with_static_runtimes=yes
- file_list_spec='@'
;;
osf3*)
@@ -14428,7 +14309,7 @@ cygwin* | mingw* | pw32* | cegcc*)
case $host_os in
cygwin*)
# Cygwin DLLs use 'cyg' prefix rather than 'lib'
- soname_spec='`echo $libname | $SED -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+ soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"
;;
@@ -14438,14 +14319,14 @@ cygwin* | mingw* | pw32* | cegcc*)
;;
pw32*)
# pw32 DLLs use 'pw' prefix rather than 'lib'
- library_names_spec='`echo $libname | $SED -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+ library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
;;
esac
dynamic_linker='Win32 ld.exe'
;;
- *,cl* | *,icl*)
- # Native MSVC or ICC
+ *,cl*)
+ # Native MSVC
libname_spec='$name'
soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
library_names_spec='$libname.dll.lib'
@@ -14464,7 +14345,7 @@ cygwin* | mingw* | pw32* | cegcc*)
done
IFS=$lt_save_ifs
# Convert to MSYS style.
- sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'`
+ sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'`
;;
cygwin*)
# Convert to unix form, then to dos form, then back to unix form
@@ -14501,7 +14382,7 @@ cygwin* | mingw* | pw32* | cegcc*)
;;
*)
- # Assume MSVC and ICC wrapper
+ # Assume MSVC wrapper
library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib'
dynamic_linker='Win32 ld.exe'
;;
@@ -14534,7 +14415,7 @@ dgux*)
shlibpath_var=LD_LIBRARY_PATH
;;
-freebsd* | dragonfly* | midnightbsd*)
+freebsd* | dragonfly*)
# DragonFly does not have aout. When/if they implement a new
# versioning mechanism, adjust this.
if test -x /usr/bin/objformat; then
@@ -15690,41 +15571,30 @@ striplib=
old_striplib=
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5
printf %s "checking whether stripping libraries is possible... " >&6; }
-if test -z "$STRIP"; then
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
-printf "%s\n" "no" >&6; }
-else
- if $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
- old_striplib="$STRIP --strip-debug"
- striplib="$STRIP --strip-unneeded"
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
+ test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
+ test -z "$striplib" && striplib="$STRIP --strip-unneeded"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; }
- else
- case $host_os in
- darwin*)
- # FIXME - insert some real tests, host_os isn't really good enough
+else
+# FIXME - insert some real tests, host_os isn't really good enough
+ case $host_os in
+ darwin*)
+ if test -n "$STRIP"; then
striplib="$STRIP -x"
old_striplib="$STRIP -S"
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; }
- ;;
- freebsd*)
- if $STRIP -V 2>&1 | $GREP "elftoolchain" >/dev/null; then
- old_striplib="$STRIP --strip-debug"
- striplib="$STRIP --strip-unneeded"
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-printf "%s\n" "yes" >&6; }
- else
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
-printf "%s\n" "no" >&6; }
- fi
- ;;
- *)
+ else
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
- ;;
- esac
- fi
+ fi
+ ;;
+ *)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ ;;
+ esac
fi
@@ -17840,8 +17710,8 @@ then :
have_systemd=no
pkg_failed=no
-{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libsystemd" >&5
-printf %s "checking for libsystemd... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for SYSTEMD" >&5
+printf %s "checking for SYSTEMD... " >&6; }
if test -n "$SYSTEMD_CFLAGS"; then
pkg_cv_SYSTEMD_CFLAGS="$SYSTEMD_CFLAGS"
@@ -17881,7 +17751,7 @@ fi
if test $pkg_failed = yes; then
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
@@ -17890,14 +17760,14 @@ else
_pkg_short_errors_supported=no
fi
if test $_pkg_short_errors_supported = yes; then
- SYSTEMD_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libsystemd" 2>&1`
+ SYSTEMD_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libsystemd" 2>&1`
else
- SYSTEMD_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libsystemd" 2>&1`
+ SYSTEMD_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libsystemd" 2>&1`
fi
- # Put the nasty error message in config.log where it belongs
- echo "$SYSTEMD_PKG_ERRORS" >&5
+ # Put the nasty error message in config.log where it belongs
+ echo "$SYSTEMD_PKG_ERRORS" >&5
- as_fn_error $? "Package requirements (libsystemd) were not met:
+ as_fn_error $? "Package requirements (libsystemd) were not met:
$SYSTEMD_PKG_ERRORS
@@ -17908,9 +17778,9 @@ Alternatively, you may set the environment variables SYSTEMD_CFLAGS
and SYSTEMD_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more details." "$LINENO" 5
elif test $pkg_failed = untried; then
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
- { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it
is in your PATH or set the PKG_CONFIG environment variable to the full
@@ -17923,11 +17793,11 @@ See the pkg-config man page for more details.
To get pkg-config, see <http://pkg-config.freedesktop.org/>.
See \`config.log' for more details" "$LINENO" 5; }
else
- SYSTEMD_CFLAGS=$pkg_cv_SYSTEMD_CFLAGS
- SYSTEMD_LIBS=$pkg_cv_SYSTEMD_LIBS
+ SYSTEMD_CFLAGS=$pkg_cv_SYSTEMD_CFLAGS
+ SYSTEMD_LIBS=$pkg_cv_SYSTEMD_LIBS
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; }
- have_systemd=yes
+ have_systemd=yes
fi
if test "x$have_systemd" != "xyes"
then :
@@ -17935,8 +17805,8 @@ then :
have_systemd_daemon=no
pkg_failed=no
-{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libsystemd-daemon" >&5
-printf %s "checking for libsystemd-daemon... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for SYSTEMD_DAEMON" >&5
+printf %s "checking for SYSTEMD_DAEMON... " >&6; }
if test -n "$SYSTEMD_DAEMON_CFLAGS"; then
pkg_cv_SYSTEMD_DAEMON_CFLAGS="$SYSTEMD_DAEMON_CFLAGS"
@@ -17976,7 +17846,7 @@ fi
if test $pkg_failed = yes; then
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
@@ -17985,14 +17855,14 @@ else
_pkg_short_errors_supported=no
fi
if test $_pkg_short_errors_supported = yes; then
- SYSTEMD_DAEMON_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libsystemd-daemon" 2>&1`
+ SYSTEMD_DAEMON_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libsystemd-daemon" 2>&1`
else
- SYSTEMD_DAEMON_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libsystemd-daemon" 2>&1`
+ SYSTEMD_DAEMON_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libsystemd-daemon" 2>&1`
fi
- # Put the nasty error message in config.log where it belongs
- echo "$SYSTEMD_DAEMON_PKG_ERRORS" >&5
+ # Put the nasty error message in config.log where it belongs
+ echo "$SYSTEMD_DAEMON_PKG_ERRORS" >&5
- as_fn_error $? "Package requirements (libsystemd-daemon) were not met:
+ as_fn_error $? "Package requirements (libsystemd-daemon) were not met:
$SYSTEMD_DAEMON_PKG_ERRORS
@@ -18003,9 +17873,9 @@ Alternatively, you may set the environment variables SYSTEMD_DAEMON_CFLAGS
and SYSTEMD_DAEMON_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more details." "$LINENO" 5
elif test $pkg_failed = untried; then
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
- { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it
is in your PATH or set the PKG_CONFIG environment variable to the full
@@ -18018,11 +17888,11 @@ See the pkg-config man page for more details.
To get pkg-config, see <http://pkg-config.freedesktop.org/>.
See \`config.log' for more details" "$LINENO" 5; }
else
- SYSTEMD_DAEMON_CFLAGS=$pkg_cv_SYSTEMD_DAEMON_CFLAGS
- SYSTEMD_DAEMON_LIBS=$pkg_cv_SYSTEMD_DAEMON_LIBS
+ SYSTEMD_DAEMON_CFLAGS=$pkg_cv_SYSTEMD_DAEMON_CFLAGS
+ SYSTEMD_DAEMON_LIBS=$pkg_cv_SYSTEMD_DAEMON_LIBS
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; }
- have_systemd_daemon=yes
+ have_systemd_daemon=yes
fi
if test "x$have_systemd_daemon" = "xyes"
then :
@@ -22337,6 +22207,353 @@ printf "%s\n" "#define HAVE_DECL_NGHTTP2_SESSION_SERVER_NEW $ac_have_decl" >>con
fi
+# ngtcp2
+
+# Check whether --with-libngtcp2 was given.
+if test ${with_libngtcp2+y}
+then :
+ withval=$with_libngtcp2;
+else $as_nop
+ withval="no"
+fi
+
+found_libngtcp2="no"
+if test x_$withval = x_yes -o x_$withval != x_no; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libngtcp2" >&5
+printf %s "checking for libngtcp2... " >&6; }
+ if test x_$withval = x_ -o x_$withval = x_yes; then
+ withval="/usr/local /opt/local /usr/lib /usr/pkg /usr/sfw /usr"
+ fi
+ for dir in $withval ; do
+ if test -f "$dir/include/ngtcp2/ngtcp2.h"; then
+ found_libngtcp2="yes"
+ if test "$dir" != "/usr"; then
+ CPPFLAGS="$CPPFLAGS -I$dir/include"
+ LDFLAGS="$LDFLAGS -L$dir/lib"
+ fi
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: found in $dir" >&5
+printf "%s\n" "found in $dir" >&6; }
+
+printf "%s\n" "#define HAVE_NGTCP2 1" >>confdefs.h
+
+ LIBS="$LIBS -lngtcp2"
+ break;
+ fi
+ done
+ if test x_$found_libngtcp2 != x_yes; then
+ as_fn_error $? "Could not find libngtcp2, ngtcp2.h" "$LINENO" 5
+ fi
+ ac_fn_c_check_header_compile "$LINENO" "ngtcp2/ngtcp2.h" "ac_cv_header_ngtcp2_ngtcp2_h" "$ac_includes_default
+"
+if test "x$ac_cv_header_ngtcp2_ngtcp2_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_NGTCP2_NGTCP2_H 1" >>confdefs.h
+
+fi
+ac_fn_c_check_header_compile "$LINENO" "ngtcp2/ngtcp2_crypto_openssl.h" "ac_cv_header_ngtcp2_ngtcp2_crypto_openssl_h" "$ac_includes_default
+"
+if test "x$ac_cv_header_ngtcp2_ngtcp2_crypto_openssl_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_NGTCP2_NGTCP2_CRYPTO_OPENSSL_H 1" >>confdefs.h
+
+fi
+ac_fn_c_check_header_compile "$LINENO" "ngtcp2/ngtcp2_crypto_quictls.h" "ac_cv_header_ngtcp2_ngtcp2_crypto_quictls_h" "$ac_includes_default
+"
+if test "x$ac_cv_header_ngtcp2_ngtcp2_crypto_quictls_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_NGTCP2_NGTCP2_CRYPTO_QUICTLS_H 1" >>confdefs.h
+
+fi
+
+ ac_fn_check_decl "$LINENO" "ngtcp2_conn_server_new" "ac_cv_have_decl_ngtcp2_conn_server_new" "$ac_includes_default
+ #include <ngtcp2/ngtcp2.h>
+
+" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_ngtcp2_conn_server_new" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL_NGTCP2_CONN_SERVER_NEW $ac_have_decl" >>confdefs.h
+
+ ac_fn_check_decl "$LINENO" "ngtcp2_crypto_encrypt_cb" "ac_cv_have_decl_ngtcp2_crypto_encrypt_cb" "$ac_includes_default
+ #include <ngtcp2/ngtcp2_crypto.h>
+
+" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_ngtcp2_crypto_encrypt_cb" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL_NGTCP2_CRYPTO_ENCRYPT_CB $ac_have_decl" >>confdefs.h
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ngtcp2_crypto_encrypt_cb in -lngtcp2_crypto_openssl" >&5
+printf %s "checking for ngtcp2_crypto_encrypt_cb in -lngtcp2_crypto_openssl... " >&6; }
+if test ${ac_cv_lib_ngtcp2_crypto_openssl_ngtcp2_crypto_encrypt_cb+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lngtcp2_crypto_openssl $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+char ngtcp2_crypto_encrypt_cb ();
+int
+main (void)
+{
+return ngtcp2_crypto_encrypt_cb ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_ngtcp2_crypto_openssl_ngtcp2_crypto_encrypt_cb=yes
+else $as_nop
+ ac_cv_lib_ngtcp2_crypto_openssl_ngtcp2_crypto_encrypt_cb=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ngtcp2_crypto_openssl_ngtcp2_crypto_encrypt_cb" >&5
+printf "%s\n" "$ac_cv_lib_ngtcp2_crypto_openssl_ngtcp2_crypto_encrypt_cb" >&6; }
+if test "x$ac_cv_lib_ngtcp2_crypto_openssl_ngtcp2_crypto_encrypt_cb" = xyes
+then :
+ LIBS="$LIBS -lngtcp2_crypto_openssl"
+fi
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ngtcp2_crypto_encrypt_cb in -lngtcp2_crypto_quictls" >&5
+printf %s "checking for ngtcp2_crypto_encrypt_cb in -lngtcp2_crypto_quictls... " >&6; }
+if test ${ac_cv_lib_ngtcp2_crypto_quictls_ngtcp2_crypto_encrypt_cb+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lngtcp2_crypto_quictls $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+char ngtcp2_crypto_encrypt_cb ();
+int
+main (void)
+{
+return ngtcp2_crypto_encrypt_cb ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_ngtcp2_crypto_quictls_ngtcp2_crypto_encrypt_cb=yes
+else $as_nop
+ ac_cv_lib_ngtcp2_crypto_quictls_ngtcp2_crypto_encrypt_cb=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ngtcp2_crypto_quictls_ngtcp2_crypto_encrypt_cb" >&5
+printf "%s\n" "$ac_cv_lib_ngtcp2_crypto_quictls_ngtcp2_crypto_encrypt_cb" >&6; }
+if test "x$ac_cv_lib_ngtcp2_crypto_quictls_ngtcp2_crypto_encrypt_cb" = xyes
+then :
+ LIBS="$LIBS -lngtcp2_crypto_quictls"
+fi
+
+ ac_fn_c_check_func "$LINENO" "ngtcp2_crypto_encrypt_cb" "ac_cv_func_ngtcp2_crypto_encrypt_cb"
+if test "x$ac_cv_func_ngtcp2_crypto_encrypt_cb" = xyes
+then :
+ printf "%s\n" "#define HAVE_NGTCP2_CRYPTO_ENCRYPT_CB 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "ngtcp2_ccerr_default" "ac_cv_func_ngtcp2_ccerr_default"
+if test "x$ac_cv_func_ngtcp2_ccerr_default" = xyes
+then :
+ printf "%s\n" "#define HAVE_NGTCP2_CCERR_DEFAULT 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "ngtcp2_conn_in_closing_period" "ac_cv_func_ngtcp2_conn_in_closing_period"
+if test "x$ac_cv_func_ngtcp2_conn_in_closing_period" = xyes
+then :
+ printf "%s\n" "#define HAVE_NGTCP2_CONN_IN_CLOSING_PERIOD 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "ngtcp2_conn_in_draining_period" "ac_cv_func_ngtcp2_conn_in_draining_period"
+if test "x$ac_cv_func_ngtcp2_conn_in_draining_period" = xyes
+then :
+ printf "%s\n" "#define HAVE_NGTCP2_CONN_IN_DRAINING_PERIOD 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "ngtcp2_conn_get_max_local_streams_uni" "ac_cv_func_ngtcp2_conn_get_max_local_streams_uni"
+if test "x$ac_cv_func_ngtcp2_conn_get_max_local_streams_uni" = xyes
+then :
+ printf "%s\n" "#define HAVE_NGTCP2_CONN_GET_MAX_LOCAL_STREAMS_UNI 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "ngtcp2_crypto_quictls_from_ossl_encryption_level" "ac_cv_func_ngtcp2_crypto_quictls_from_ossl_encryption_level"
+if test "x$ac_cv_func_ngtcp2_crypto_quictls_from_ossl_encryption_level" = xyes
+then :
+ printf "%s\n" "#define HAVE_NGTCP2_CRYPTO_QUICTLS_FROM_OSSL_ENCRYPTION_LEVEL 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "ngtcp2_crypto_quictls_configure_server_context" "ac_cv_func_ngtcp2_crypto_quictls_configure_server_context"
+if test "x$ac_cv_func_ngtcp2_crypto_quictls_configure_server_context" = xyes
+then :
+ printf "%s\n" "#define HAVE_NGTCP2_CRYPTO_QUICTLS_CONFIGURE_SERVER_CONTEXT 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "ngtcp2_crypto_quictls_configure_client_context" "ac_cv_func_ngtcp2_crypto_quictls_configure_client_context"
+if test "x$ac_cv_func_ngtcp2_crypto_quictls_configure_client_context" = xyes
+then :
+ printf "%s\n" "#define HAVE_NGTCP2_CRYPTO_QUICTLS_CONFIGURE_CLIENT_CONTEXT 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "ngtcp2_conn_get_num_scid" "ac_cv_func_ngtcp2_conn_get_num_scid"
+if test "x$ac_cv_func_ngtcp2_conn_get_num_scid" = xyes
+then :
+ printf "%s\n" "#define HAVE_NGTCP2_CONN_GET_NUM_SCID 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "ngtcp2_conn_tls_early_data_rejected" "ac_cv_func_ngtcp2_conn_tls_early_data_rejected"
+if test "x$ac_cv_func_ngtcp2_conn_tls_early_data_rejected" = xyes
+then :
+ printf "%s\n" "#define HAVE_NGTCP2_CONN_TLS_EARLY_DATA_REJECTED 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "ngtcp2_conn_encode_0rtt_transport_params" "ac_cv_func_ngtcp2_conn_encode_0rtt_transport_params"
+if test "x$ac_cv_func_ngtcp2_conn_encode_0rtt_transport_params" = xyes
+then :
+ printf "%s\n" "#define HAVE_NGTCP2_CONN_ENCODE_0RTT_TRANSPORT_PARAMS 1" >>confdefs.h
+
+fi
+
+
+ for ac_func in SSL_is_quic
+do :
+ ac_fn_c_check_func "$LINENO" "SSL_is_quic" "ac_cv_func_SSL_is_quic"
+if test "x$ac_cv_func_SSL_is_quic" = xyes
+then :
+ printf "%s\n" "#define HAVE_SSL_IS_QUIC 1" >>confdefs.h
+
+else $as_nop
+ as_fn_error $? "No QUIC support detected in OpenSSL. Need OpenSSL version with QUIC support to enable DNS over QUIC with libngtcp2." "$LINENO" 5
+fi
+
+done
+ ac_fn_c_check_type "$LINENO" "struct ngtcp2_version_cid" "ac_cv_type_struct_ngtcp2_version_cid" "$ac_includes_default
+ #include <ngtcp2/ngtcp2.h>
+
+"
+if test "x$ac_cv_type_struct_ngtcp2_version_cid" = xyes
+then :
+
+printf "%s\n" "#define HAVE_STRUCT_NGTCP2_VERSION_CID 1" >>confdefs.h
+
+
+fi
+ac_fn_c_check_type "$LINENO" "ngtcp2_encryption_level" "ac_cv_type_ngtcp2_encryption_level" "$ac_includes_default
+ #include <ngtcp2/ngtcp2.h>
+
+"
+if test "x$ac_cv_type_ngtcp2_encryption_level" = xyes
+then :
+
+printf "%s\n" "#define HAVE_NGTCP2_ENCRYPTION_LEVEL 1" >>confdefs.h
+
+
+fi
+
+ ac_fn_c_check_member "$LINENO" "struct ngtcp2_pkt_hd" "tokenlen" "ac_cv_member_struct_ngtcp2_pkt_hd_tokenlen" "$ac_includes_default
+ #include <ngtcp2/ngtcp2.h>
+
+"
+if test "x$ac_cv_member_struct_ngtcp2_pkt_hd_tokenlen" = xyes
+then :
+
+printf "%s\n" "#define HAVE_STRUCT_NGTCP2_PKT_HD_TOKENLEN 1" >>confdefs.h
+
+
+fi
+ac_fn_c_check_member "$LINENO" "struct ngtcp2_settings" "tokenlen" "ac_cv_member_struct_ngtcp2_settings_tokenlen" "$ac_includes_default
+ #include <ngtcp2/ngtcp2.h>
+
+"
+if test "x$ac_cv_member_struct_ngtcp2_settings_tokenlen" = xyes
+then :
+
+printf "%s\n" "#define HAVE_STRUCT_NGTCP2_SETTINGS_TOKENLEN 1" >>confdefs.h
+
+
+fi
+ac_fn_c_check_member "$LINENO" "struct ngtcp2_settings" "max_tx_udp_payload_size" "ac_cv_member_struct_ngtcp2_settings_max_tx_udp_payload_size" "$ac_includes_default
+ #include <ngtcp2/ngtcp2.h>
+
+"
+if test "x$ac_cv_member_struct_ngtcp2_settings_max_tx_udp_payload_size" = xyes
+then :
+
+printf "%s\n" "#define HAVE_STRUCT_NGTCP2_SETTINGS_MAX_TX_UDP_PAYLOAD_SIZE 1" >>confdefs.h
+
+
+fi
+ac_fn_c_check_member "$LINENO" "struct ngtcp2_transport_params" "original_dcid_present" "ac_cv_member_struct_ngtcp2_transport_params_original_dcid_present" "$ac_includes_default
+ #include <ngtcp2/ngtcp2.h>
+
+"
+if test "x$ac_cv_member_struct_ngtcp2_transport_params_original_dcid_present" = xyes
+then :
+
+printf "%s\n" "#define HAVE_STRUCT_NGTCP2_TRANSPORT_PARAMS_ORIGINAL_DCID_PRESENT 1" >>confdefs.h
+
+
+fi
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ngtcp2_conn_shutdown_stream has 4 arguments" >&5
+printf %s "checking whether ngtcp2_conn_shutdown_stream has 4 arguments... " >&6; }
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_includes_default
+#include <ngtcp2/ngtcp2.h>
+
+int
+main (void)
+{
+
+ (void)ngtcp2_conn_shutdown_stream(NULL, 0, 0, 0);
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+
+printf "%s\n" "#define HAVE_NGTCP2_CONN_SHUTDOWN_STREAM4 1" >>confdefs.h
+
+
+else $as_nop
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+
# set static linking for uninstalled libraries if requested
staticexe=""
@@ -23920,10 +24137,12 @@ if test x_$enable_lock_checks = x_yes; then
UBSYMS="-export-symbols clubsyms.def"
cp ${srcdir}/libunbound/ubsyms.def clubsyms.def
echo lock_protect >> clubsyms.def
+ echo lock_protect_place >> clubsyms.def
echo lock_unprotect >> clubsyms.def
echo lock_get_mem >> clubsyms.def
echo checklock_start >> clubsyms.def
echo checklock_stop >> clubsyms.def
+ echo checklock_set_output_name >> clubsyms.def
echo checklock_lock >> clubsyms.def
echo checklock_unlock >> clubsyms.def
echo checklock_init >> clubsyms.def
@@ -24019,8 +24238,8 @@ else $as_nop
if test -n "$PKG_CONFIG"; then
pkg_failed=no
-{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libprotobuf-c" >&5
-printf %s "checking for libprotobuf-c... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for PROTOBUFC" >&5
+printf %s "checking for PROTOBUFC... " >&6; }
if test -n "$PROTOBUFC_CFLAGS"; then
pkg_cv_PROTOBUFC_CFLAGS="$PROTOBUFC_CFLAGS"
@@ -24060,7 +24279,7 @@ fi
if test $pkg_failed = yes; then
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
@@ -24069,12 +24288,12 @@ else
_pkg_short_errors_supported=no
fi
if test $_pkg_short_errors_supported = yes; then
- PROTOBUFC_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libprotobuf-c" 2>&1`
+ PROTOBUFC_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libprotobuf-c" 2>&1`
else
- PROTOBUFC_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libprotobuf-c" 2>&1`
+ PROTOBUFC_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libprotobuf-c" 2>&1`
fi
- # Put the nasty error message in config.log where it belongs
- echo "$PROTOBUFC_PKG_ERRORS" >&5
+ # Put the nasty error message in config.log where it belongs
+ echo "$PROTOBUFC_PKG_ERRORS" >&5
# pkg-config failed; try falling back to known values
@@ -24092,7 +24311,7 @@ fi
elif test $pkg_failed = untried; then
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
# pkg-config failed; try falling back to known values
@@ -24110,8 +24329,8 @@ printf "%s\n" "no" >&6; }
else
- PROTOBUFC_CFLAGS=$pkg_cv_PROTOBUFC_CFLAGS
- PROTOBUFC_LIBS=$pkg_cv_PROTOBUFC_LIBS
+ PROTOBUFC_CFLAGS=$pkg_cv_PROTOBUFC_CFLAGS
+ PROTOBUFC_LIBS=$pkg_cv_PROTOBUFC_LIBS
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; }
@@ -24778,7 +24997,7 @@ printf "%s\n" "#define MAXSYSLOGMSGLEN 10240" >>confdefs.h
-version=1.21.1
+version=1.22.0
date=`date +'%b %e, %Y'`
@@ -25290,7 +25509,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# report actual input values of CONFIG_FILES etc. instead of their
# values after options handling.
ac_log="
-This file was extended by unbound $as_me 1.21.1, which was
+This file was extended by unbound $as_me 1.22.0, which was
generated by GNU Autoconf 2.71. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
@@ -25358,7 +25577,7 @@ ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config='$ac_cs_config_escaped'
ac_cs_version="\\
-unbound config.status 1.21.1
+unbound config.status 1.22.0
configured by $0, generated by GNU Autoconf 2.71,
with options \\"\$ac_cs_config\\"
@@ -25518,7 +25737,6 @@ lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_q
lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`'
reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`'
reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`'
-FILECMD='`$ECHO "$FILECMD" | $SED "$delay_single_quote_subst"`'
OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`'
deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`'
file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`'
@@ -25527,7 +25745,6 @@ want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`'
DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`'
sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`'
AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`'
-lt_ar_flags='`$ECHO "$lt_ar_flags" | $SED "$delay_single_quote_subst"`'
AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`'
archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`'
STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`'
@@ -25648,7 +25865,6 @@ LN_S \
lt_SP2NL \
lt_NL2SP \
reload_flag \
-FILECMD \
OBJDUMP \
deplibs_check_method \
file_magic_cmd \
@@ -25657,6 +25873,7 @@ want_nocaseglob \
DLLTOOL \
sharedlib_from_linklib_cmd \
AR \
+AR_FLAGS \
archiver_list_spec \
STRIP \
RANLIB \
@@ -26473,9 +26690,6 @@ to_host_file_cmd=$lt_cv_to_host_file_cmd
# convert \$build files to toolchain format.
to_tool_file_cmd=$lt_cv_to_tool_file_cmd
-# A file(cmd) program that detects file types.
-FILECMD=$lt_FILECMD
-
# An object symbol dumper.
OBJDUMP=$lt_OBJDUMP
@@ -26500,11 +26714,8 @@ sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd
# The archiver.
AR=$lt_AR
-# Flags to create an archive (by configure).
-lt_ar_flags=$lt_ar_flags
-
# Flags to create an archive.
-AR_FLAGS=\${ARFLAGS-"\$lt_ar_flags"}
+AR_FLAGS=$lt_AR_FLAGS
# How to feed a file listing to the archiver.
archiver_list_spec=$lt_archiver_list_spec
@@ -26880,7 +27091,7 @@ ltmain=$ac_aux_dir/ltmain.sh
# if finds mixed CR/LF and LF-only lines. Since sed operates in
# text mode, it properly converts lines to CR/LF. This bash problem
# is reportedly fixed, but why not run on old versions too?
- $SED '$q' "$ltmain" >> "$cfgfile" \
+ sed '$q' "$ltmain" >> "$cfgfile" \
|| (rm -f "$cfgfile"; exit 1)
mv -f "$cfgfile" "$ofile" ||
diff --git a/configure.ac b/configure.ac
index fdded4f50941..3f5759f5873c 100644
--- a/configure.ac
+++ b/configure.ac
@@ -10,15 +10,15 @@ sinclude(dnscrypt/dnscrypt.m4)
# must be numbers. ac_defun because of later processing
m4_define([VERSION_MAJOR],[1])
-m4_define([VERSION_MINOR],[21])
-m4_define([VERSION_MICRO],[1])
+m4_define([VERSION_MINOR],[22])
+m4_define([VERSION_MICRO],[0])
AC_INIT([unbound],m4_defn([VERSION_MAJOR]).m4_defn([VERSION_MINOR]).m4_defn([VERSION_MICRO]),[unbound-bugs@nlnetlabs.nl or https://github.com/NLnetLabs/unbound/issues],[unbound])
AC_SUBST(UNBOUND_VERSION_MAJOR, [VERSION_MAJOR])
AC_SUBST(UNBOUND_VERSION_MINOR, [VERSION_MINOR])
AC_SUBST(UNBOUND_VERSION_MICRO, [VERSION_MICRO])
LIBUNBOUND_CURRENT=9
-LIBUNBOUND_REVISION=29
+LIBUNBOUND_REVISION=30
LIBUNBOUND_AGE=1
# 1.0.0 had 0:12:0
# 1.0.1 had 0:13:0
@@ -115,6 +115,7 @@ LIBUNBOUND_AGE=1
# 1.20.0 had 9:27:1
# 1.21.0 had 9:28:1
# 1.21.1 had 9:29:1
+# 1.22.0 had 9:30:1
# Current -- the number of the binary API that we're implementing
# Revision -- which iteration of the implementation of the binary
@@ -1578,6 +1579,64 @@ if test x_$withval = x_yes -o x_$withval != x_no; then
])
fi
+# ngtcp2
+AC_ARG_WITH(libngtcp2, AS_HELP_STRING([--with-libngtcp2=path],[specify explicit path for libngtcp2, for QUIC.]),
+ [ ],[ withval="no" ])
+found_libngtcp2="no"
+if test x_$withval = x_yes -o x_$withval != x_no; then
+ AC_MSG_CHECKING(for libngtcp2)
+ if test x_$withval = x_ -o x_$withval = x_yes; then
+ withval="/usr/local /opt/local /usr/lib /usr/pkg /usr/sfw /usr"
+ fi
+ for dir in $withval ; do
+ if test -f "$dir/include/ngtcp2/ngtcp2.h"; then
+ found_libngtcp2="yes"
+ dnl assume /usr is in default path.
+ if test "$dir" != "/usr"; then
+ CPPFLAGS="$CPPFLAGS -I$dir/include"
+ LDFLAGS="$LDFLAGS -L$dir/lib"
+ fi
+ AC_MSG_RESULT(found in $dir)
+ AC_DEFINE([HAVE_NGTCP2], [1], [Define this to use ngtcp2.])
+ LIBS="$LIBS -lngtcp2"
+ break;
+ fi
+ done
+ if test x_$found_libngtcp2 != x_yes; then
+ AC_MSG_ERROR([Could not find libngtcp2, ngtcp2.h])
+ fi
+ AC_CHECK_HEADERS([ngtcp2/ngtcp2.h ngtcp2/ngtcp2_crypto_openssl.h ngtcp2/ngtcp2_crypto_quictls.h],,, [AC_INCLUDES_DEFAULT])
+ AC_CHECK_DECLS([ngtcp2_conn_server_new], [], [], [AC_INCLUDES_DEFAULT
+ #include <ngtcp2/ngtcp2.h>
+ ])
+ AC_CHECK_DECLS([ngtcp2_crypto_encrypt_cb], [], [], [AC_INCLUDES_DEFAULT
+ #include <ngtcp2/ngtcp2_crypto.h>
+ ])
+ AC_CHECK_LIB([ngtcp2_crypto_openssl], [ngtcp2_crypto_encrypt_cb], [ LIBS="$LIBS -lngtcp2_crypto_openssl" ])
+ AC_CHECK_LIB([ngtcp2_crypto_quictls], [ngtcp2_crypto_encrypt_cb], [ LIBS="$LIBS -lngtcp2_crypto_quictls" ])
+ AC_CHECK_FUNCS([ngtcp2_crypto_encrypt_cb ngtcp2_ccerr_default ngtcp2_conn_in_closing_period ngtcp2_conn_in_draining_period ngtcp2_conn_get_max_local_streams_uni ngtcp2_crypto_quictls_from_ossl_encryption_level ngtcp2_crypto_quictls_configure_server_context ngtcp2_crypto_quictls_configure_client_context ngtcp2_conn_get_num_scid ngtcp2_conn_tls_early_data_rejected ngtcp2_conn_encode_0rtt_transport_params])
+ AC_CHECK_FUNCS([SSL_is_quic], [], [AC_MSG_ERROR([No QUIC support detected in OpenSSL. Need OpenSSL version with QUIC support to enable DNS over QUIC with libngtcp2.])])
+ AC_CHECK_TYPES([struct ngtcp2_version_cid, ngtcp2_encryption_level],,,[AC_INCLUDES_DEFAULT
+ #include <ngtcp2/ngtcp2.h>
+ ])
+ AC_CHECK_MEMBERS([struct ngtcp2_pkt_hd.tokenlen, struct ngtcp2_settings.tokenlen, struct ngtcp2_settings.max_tx_udp_payload_size, struct ngtcp2_transport_params.original_dcid_present],,,[AC_INCLUDES_DEFAULT
+ #include <ngtcp2/ngtcp2.h>
+ ])
+
+ AC_MSG_CHECKING([whether ngtcp2_conn_shutdown_stream has 4 arguments])
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([AC_INCLUDES_DEFAULT
+#include <ngtcp2/ngtcp2.h>
+ ],[
+ (void)ngtcp2_conn_shutdown_stream(NULL, 0, 0, 0);
+ ])],[
+ AC_MSG_RESULT(yes)
+ AC_DEFINE(HAVE_NGTCP2_CONN_SHUTDOWN_STREAM4, 1, [Define if ngtcp2_conn_shutdown_stream has 4 arguments.])
+ ],[
+ AC_MSG_RESULT(no)
+ ])
+
+fi
+
# set static linking for uninstalled libraries if requested
AC_SUBST(staticexe)
staticexe=""
@@ -1893,10 +1952,12 @@ if test x_$enable_lock_checks = x_yes; then
UBSYMS="-export-symbols clubsyms.def"
cp ${srcdir}/libunbound/ubsyms.def clubsyms.def
echo lock_protect >> clubsyms.def
+ echo lock_protect_place >> clubsyms.def
echo lock_unprotect >> clubsyms.def
echo lock_get_mem >> clubsyms.def
echo checklock_start >> clubsyms.def
echo checklock_stop >> clubsyms.def
+ echo checklock_set_output_name >> clubsyms.def
echo checklock_lock >> clubsyms.def
echo checklock_unlock >> clubsyms.def
echo checklock_init >> clubsyms.def
@@ -2331,6 +2392,9 @@ struct sockaddr_storage;
# define free(p) unbound_stat_free_log(p, __FILE__, __LINE__, __func__)
# define realloc(p,s) unbound_stat_realloc_log(p, s, __FILE__, __LINE__, __func__)
# define strdup(s) unbound_stat_strdup_log(s, __FILE__, __LINE__, __func__)
+#ifdef HAVE_REALLOCARRAY
+# define reallocarray(p,n,s) unbound_stat_reallocarray_log(p, n, s, __FILE__, __LINE__, __func__)
+#endif
void *unbound_stat_malloc(size_t size);
void *unbound_stat_calloc(size_t nmemb, size_t size);
void unbound_stat_free(void *ptr);
@@ -2343,6 +2407,8 @@ void unbound_stat_free_log(void *ptr, const char* file, int line,
const char* func);
void *unbound_stat_realloc_log(void *ptr, size_t size, const char* file,
int line, const char* func);
+void *unbound_stat_reallocarray_log(void *ptr, size_t nmemb, size_t size,
+ const char* file, int line, const char* func);
char *unbound_stat_strdup_log(const char *s, const char* file, int line,
const char* func);
#elif defined(UNBOUND_ALLOC_LITE)
@@ -2355,6 +2421,8 @@ char *unbound_stat_strdup_log(const char *s, const char* file, int line,
#define UNBOUND_DNS_OVER_TLS_PORT 853
/** default port for DNS over HTTPS traffic. */
#define UNBOUND_DNS_OVER_HTTPS_PORT 443
+/** default port for DNS over QUIC traffic. */
+#define UNBOUND_DNS_OVER_QUIC_PORT 853
/** default port for unbound control traffic, registered port with IANA,
ub-dns-control 8953/tcp unbound dns nameserver control */
#define UNBOUND_CONTROL_PORT 8953
diff --git a/configure~ b/configure~
index ef250d6c6976..918a0632013d 100755
--- a/configure~
+++ b/configure~
@@ -1,6 +1,6 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.71 for unbound 1.21.1.
+# Generated by GNU Autoconf 2.71 for unbound 1.22.0.
#
# Report bugs to <unbound-bugs@nlnetlabs.nl or https://github.com/NLnetLabs/unbound/issues>.
#
@@ -622,8 +622,8 @@ MAKEFLAGS=
# Identity of this package.
PACKAGE_NAME='unbound'
PACKAGE_TARNAME='unbound'
-PACKAGE_VERSION='1.21.1'
-PACKAGE_STRING='unbound 1.21.1'
+PACKAGE_VERSION='1.22.0'
+PACKAGE_STRING='unbound 1.22.0'
PACKAGE_BUGREPORT='unbound-bugs@nlnetlabs.nl or https://github.com/NLnetLabs/unbound/issues'
PACKAGE_URL=''
@@ -921,6 +921,7 @@ with_libevent
with_libexpat
with_libhiredis
with_libnghttp2
+with_libngtcp2
enable_static_exe
enable_fully_static
enable_lock_checks
@@ -1508,7 +1509,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF
-\`configure' configures unbound 1.21.1 to adapt to many kinds of systems.
+\`configure' configures unbound 1.22.0 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -1574,7 +1575,7 @@ fi
if test -n "$ac_init_help"; then
case $ac_init_help in
- short | recursive ) echo "Configuration of unbound 1.21.1:";;
+ short | recursive ) echo "Configuration of unbound 1.22.0:";;
esac
cat <<\_ACEOF
@@ -1709,6 +1710,7 @@ Optional Packages:
--with-libexpat=path specify explicit path for libexpat.
--with-libhiredis=path specify explicit path for libhiredis.
--with-libnghttp2=path specify explicit path for libnghttp2.
+ --with-libngtcp2=path specify explicit path for libngtcp2, for QUIC.
--with-dnstap-socket-path=pathname
set default dnstap socket path
--with-protobuf-c=path Path where protobuf-c is installed, for dnstap
@@ -1822,7 +1824,7 @@ fi
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
-unbound configure 1.21.1
+unbound configure 1.22.0
generated by GNU Autoconf 2.71
Copyright (C) 2021 Free Software Foundation, Inc.
@@ -2479,7 +2481,7 @@ cat >config.log <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
-It was created by unbound $as_me 1.21.1, which was
+It was created by unbound $as_me 1.22.0, which was
generated by GNU Autoconf 2.71. Invocation command line was
$ $0$ac_configure_args_raw
@@ -3241,13 +3243,13 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
UNBOUND_VERSION_MAJOR=1
-UNBOUND_VERSION_MINOR=21
+UNBOUND_VERSION_MINOR=22
-UNBOUND_VERSION_MICRO=1
+UNBOUND_VERSION_MICRO=0
LIBUNBOUND_CURRENT=9
-LIBUNBOUND_REVISION=29
+LIBUNBOUND_REVISION=30
LIBUNBOUND_AGE=1
# 1.0.0 had 0:12:0
# 1.0.1 had 0:13:0
@@ -3344,6 +3346,7 @@ LIBUNBOUND_AGE=1
# 1.20.0 had 9:27:1
# 1.21.0 had 9:28:1
# 1.21.1 had 9:29:1
+# 1.22.0 had 9:30:1
# Current -- the number of the binary API that we're implementing
# Revision -- which iteration of the implementation of the binary
@@ -22204,6 +22207,353 @@ printf "%s\n" "#define HAVE_DECL_NGHTTP2_SESSION_SERVER_NEW $ac_have_decl" >>con
fi
+# ngtcp2
+
+# Check whether --with-libngtcp2 was given.
+if test ${with_libngtcp2+y}
+then :
+ withval=$with_libngtcp2;
+else $as_nop
+ withval="no"
+fi
+
+found_libngtcp2="no"
+if test x_$withval = x_yes -o x_$withval != x_no; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libngtcp2" >&5
+printf %s "checking for libngtcp2... " >&6; }
+ if test x_$withval = x_ -o x_$withval = x_yes; then
+ withval="/usr/local /opt/local /usr/lib /usr/pkg /usr/sfw /usr"
+ fi
+ for dir in $withval ; do
+ if test -f "$dir/include/ngtcp2/ngtcp2.h"; then
+ found_libngtcp2="yes"
+ if test "$dir" != "/usr"; then
+ CPPFLAGS="$CPPFLAGS -I$dir/include"
+ LDFLAGS="$LDFLAGS -L$dir/lib"
+ fi
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: found in $dir" >&5
+printf "%s\n" "found in $dir" >&6; }
+
+printf "%s\n" "#define HAVE_NGTCP2 1" >>confdefs.h
+
+ LIBS="$LIBS -lngtcp2"
+ break;
+ fi
+ done
+ if test x_$found_libngtcp2 != x_yes; then
+ as_fn_error $? "Could not find libngtcp2, ngtcp2.h" "$LINENO" 5
+ fi
+ ac_fn_c_check_header_compile "$LINENO" "ngtcp2/ngtcp2.h" "ac_cv_header_ngtcp2_ngtcp2_h" "$ac_includes_default
+"
+if test "x$ac_cv_header_ngtcp2_ngtcp2_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_NGTCP2_NGTCP2_H 1" >>confdefs.h
+
+fi
+ac_fn_c_check_header_compile "$LINENO" "ngtcp2/ngtcp2_crypto_openssl.h" "ac_cv_header_ngtcp2_ngtcp2_crypto_openssl_h" "$ac_includes_default
+"
+if test "x$ac_cv_header_ngtcp2_ngtcp2_crypto_openssl_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_NGTCP2_NGTCP2_CRYPTO_OPENSSL_H 1" >>confdefs.h
+
+fi
+ac_fn_c_check_header_compile "$LINENO" "ngtcp2/ngtcp2_crypto_quictls.h" "ac_cv_header_ngtcp2_ngtcp2_crypto_quictls_h" "$ac_includes_default
+"
+if test "x$ac_cv_header_ngtcp2_ngtcp2_crypto_quictls_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_NGTCP2_NGTCP2_CRYPTO_QUICTLS_H 1" >>confdefs.h
+
+fi
+
+ ac_fn_check_decl "$LINENO" "ngtcp2_conn_server_new" "ac_cv_have_decl_ngtcp2_conn_server_new" "$ac_includes_default
+ #include <ngtcp2/ngtcp2.h>
+
+" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_ngtcp2_conn_server_new" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL_NGTCP2_CONN_SERVER_NEW $ac_have_decl" >>confdefs.h
+
+ ac_fn_check_decl "$LINENO" "ngtcp2_crypto_encrypt_cb" "ac_cv_have_decl_ngtcp2_crypto_encrypt_cb" "$ac_includes_default
+ #include <ngtcp2/ngtcp2_crypto.h>
+
+" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_ngtcp2_crypto_encrypt_cb" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+printf "%s\n" "#define HAVE_DECL_NGTCP2_CRYPTO_ENCRYPT_CB $ac_have_decl" >>confdefs.h
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ngtcp2_crypto_encrypt_cb in -lngtcp2_crypto_openssl" >&5
+printf %s "checking for ngtcp2_crypto_encrypt_cb in -lngtcp2_crypto_openssl... " >&6; }
+if test ${ac_cv_lib_ngtcp2_crypto_openssl_ngtcp2_crypto_encrypt_cb+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lngtcp2_crypto_openssl $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+char ngtcp2_crypto_encrypt_cb ();
+int
+main (void)
+{
+return ngtcp2_crypto_encrypt_cb ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_ngtcp2_crypto_openssl_ngtcp2_crypto_encrypt_cb=yes
+else $as_nop
+ ac_cv_lib_ngtcp2_crypto_openssl_ngtcp2_crypto_encrypt_cb=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ngtcp2_crypto_openssl_ngtcp2_crypto_encrypt_cb" >&5
+printf "%s\n" "$ac_cv_lib_ngtcp2_crypto_openssl_ngtcp2_crypto_encrypt_cb" >&6; }
+if test "x$ac_cv_lib_ngtcp2_crypto_openssl_ngtcp2_crypto_encrypt_cb" = xyes
+then :
+ LIBS="$LIBS -lngtcp2_crypto_openssl"
+fi
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ngtcp2_crypto_encrypt_cb in -lngtcp2_crypto_quictls" >&5
+printf %s "checking for ngtcp2_crypto_encrypt_cb in -lngtcp2_crypto_quictls... " >&6; }
+if test ${ac_cv_lib_ngtcp2_crypto_quictls_ngtcp2_crypto_encrypt_cb+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lngtcp2_crypto_quictls $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+char ngtcp2_crypto_encrypt_cb ();
+int
+main (void)
+{
+return ngtcp2_crypto_encrypt_cb ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_ngtcp2_crypto_quictls_ngtcp2_crypto_encrypt_cb=yes
+else $as_nop
+ ac_cv_lib_ngtcp2_crypto_quictls_ngtcp2_crypto_encrypt_cb=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ngtcp2_crypto_quictls_ngtcp2_crypto_encrypt_cb" >&5
+printf "%s\n" "$ac_cv_lib_ngtcp2_crypto_quictls_ngtcp2_crypto_encrypt_cb" >&6; }
+if test "x$ac_cv_lib_ngtcp2_crypto_quictls_ngtcp2_crypto_encrypt_cb" = xyes
+then :
+ LIBS="$LIBS -lngtcp2_crypto_quictls"
+fi
+
+ ac_fn_c_check_func "$LINENO" "ngtcp2_crypto_encrypt_cb" "ac_cv_func_ngtcp2_crypto_encrypt_cb"
+if test "x$ac_cv_func_ngtcp2_crypto_encrypt_cb" = xyes
+then :
+ printf "%s\n" "#define HAVE_NGTCP2_CRYPTO_ENCRYPT_CB 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "ngtcp2_ccerr_default" "ac_cv_func_ngtcp2_ccerr_default"
+if test "x$ac_cv_func_ngtcp2_ccerr_default" = xyes
+then :
+ printf "%s\n" "#define HAVE_NGTCP2_CCERR_DEFAULT 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "ngtcp2_conn_in_closing_period" "ac_cv_func_ngtcp2_conn_in_closing_period"
+if test "x$ac_cv_func_ngtcp2_conn_in_closing_period" = xyes
+then :
+ printf "%s\n" "#define HAVE_NGTCP2_CONN_IN_CLOSING_PERIOD 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "ngtcp2_conn_in_draining_period" "ac_cv_func_ngtcp2_conn_in_draining_period"
+if test "x$ac_cv_func_ngtcp2_conn_in_draining_period" = xyes
+then :
+ printf "%s\n" "#define HAVE_NGTCP2_CONN_IN_DRAINING_PERIOD 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "ngtcp2_conn_get_max_local_streams_uni" "ac_cv_func_ngtcp2_conn_get_max_local_streams_uni"
+if test "x$ac_cv_func_ngtcp2_conn_get_max_local_streams_uni" = xyes
+then :
+ printf "%s\n" "#define HAVE_NGTCP2_CONN_GET_MAX_LOCAL_STREAMS_UNI 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "ngtcp2_crypto_quictls_from_ossl_encryption_level" "ac_cv_func_ngtcp2_crypto_quictls_from_ossl_encryption_level"
+if test "x$ac_cv_func_ngtcp2_crypto_quictls_from_ossl_encryption_level" = xyes
+then :
+ printf "%s\n" "#define HAVE_NGTCP2_CRYPTO_QUICTLS_FROM_OSSL_ENCRYPTION_LEVEL 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "ngtcp2_crypto_quictls_configure_server_context" "ac_cv_func_ngtcp2_crypto_quictls_configure_server_context"
+if test "x$ac_cv_func_ngtcp2_crypto_quictls_configure_server_context" = xyes
+then :
+ printf "%s\n" "#define HAVE_NGTCP2_CRYPTO_QUICTLS_CONFIGURE_SERVER_CONTEXT 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "ngtcp2_crypto_quictls_configure_client_context" "ac_cv_func_ngtcp2_crypto_quictls_configure_client_context"
+if test "x$ac_cv_func_ngtcp2_crypto_quictls_configure_client_context" = xyes
+then :
+ printf "%s\n" "#define HAVE_NGTCP2_CRYPTO_QUICTLS_CONFIGURE_CLIENT_CONTEXT 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "ngtcp2_conn_get_num_scid" "ac_cv_func_ngtcp2_conn_get_num_scid"
+if test "x$ac_cv_func_ngtcp2_conn_get_num_scid" = xyes
+then :
+ printf "%s\n" "#define HAVE_NGTCP2_CONN_GET_NUM_SCID 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "ngtcp2_conn_tls_early_data_rejected" "ac_cv_func_ngtcp2_conn_tls_early_data_rejected"
+if test "x$ac_cv_func_ngtcp2_conn_tls_early_data_rejected" = xyes
+then :
+ printf "%s\n" "#define HAVE_NGTCP2_CONN_TLS_EARLY_DATA_REJECTED 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "ngtcp2_conn_encode_0rtt_transport_params" "ac_cv_func_ngtcp2_conn_encode_0rtt_transport_params"
+if test "x$ac_cv_func_ngtcp2_conn_encode_0rtt_transport_params" = xyes
+then :
+ printf "%s\n" "#define HAVE_NGTCP2_CONN_ENCODE_0RTT_TRANSPORT_PARAMS 1" >>confdefs.h
+
+fi
+
+
+ for ac_func in SSL_is_quic
+do :
+ ac_fn_c_check_func "$LINENO" "SSL_is_quic" "ac_cv_func_SSL_is_quic"
+if test "x$ac_cv_func_SSL_is_quic" = xyes
+then :
+ printf "%s\n" "#define HAVE_SSL_IS_QUIC 1" >>confdefs.h
+
+else $as_nop
+ as_fn_error $? "No QUIC support detected in OpenSSL. Need OpenSSL version with QUIC support to enable DNS over QUIC with libngtcp2." "$LINENO" 5
+fi
+
+done
+ ac_fn_c_check_type "$LINENO" "struct ngtcp2_version_cid" "ac_cv_type_struct_ngtcp2_version_cid" "$ac_includes_default
+ #include <ngtcp2/ngtcp2.h>
+
+"
+if test "x$ac_cv_type_struct_ngtcp2_version_cid" = xyes
+then :
+
+printf "%s\n" "#define HAVE_STRUCT_NGTCP2_VERSION_CID 1" >>confdefs.h
+
+
+fi
+ac_fn_c_check_type "$LINENO" "ngtcp2_encryption_level" "ac_cv_type_ngtcp2_encryption_level" "$ac_includes_default
+ #include <ngtcp2/ngtcp2.h>
+
+"
+if test "x$ac_cv_type_ngtcp2_encryption_level" = xyes
+then :
+
+printf "%s\n" "#define HAVE_NGTCP2_ENCRYPTION_LEVEL 1" >>confdefs.h
+
+
+fi
+
+ ac_fn_c_check_member "$LINENO" "struct ngtcp2_pkt_hd" "tokenlen" "ac_cv_member_struct_ngtcp2_pkt_hd_tokenlen" "$ac_includes_default
+ #include <ngtcp2/ngtcp2.h>
+
+"
+if test "x$ac_cv_member_struct_ngtcp2_pkt_hd_tokenlen" = xyes
+then :
+
+printf "%s\n" "#define HAVE_STRUCT_NGTCP2_PKT_HD_TOKENLEN 1" >>confdefs.h
+
+
+fi
+ac_fn_c_check_member "$LINENO" "struct ngtcp2_settings" "tokenlen" "ac_cv_member_struct_ngtcp2_settings_tokenlen" "$ac_includes_default
+ #include <ngtcp2/ngtcp2.h>
+
+"
+if test "x$ac_cv_member_struct_ngtcp2_settings_tokenlen" = xyes
+then :
+
+printf "%s\n" "#define HAVE_STRUCT_NGTCP2_SETTINGS_TOKENLEN 1" >>confdefs.h
+
+
+fi
+ac_fn_c_check_member "$LINENO" "struct ngtcp2_settings" "max_tx_udp_payload_size" "ac_cv_member_struct_ngtcp2_settings_max_tx_udp_payload_size" "$ac_includes_default
+ #include <ngtcp2/ngtcp2.h>
+
+"
+if test "x$ac_cv_member_struct_ngtcp2_settings_max_tx_udp_payload_size" = xyes
+then :
+
+printf "%s\n" "#define HAVE_STRUCT_NGTCP2_SETTINGS_MAX_TX_UDP_PAYLOAD_SIZE 1" >>confdefs.h
+
+
+fi
+ac_fn_c_check_member "$LINENO" "struct ngtcp2_transport_params" "original_dcid_present" "ac_cv_member_struct_ngtcp2_transport_params_original_dcid_present" "$ac_includes_default
+ #include <ngtcp2/ngtcp2.h>
+
+"
+if test "x$ac_cv_member_struct_ngtcp2_transport_params_original_dcid_present" = xyes
+then :
+
+printf "%s\n" "#define HAVE_STRUCT_NGTCP2_TRANSPORT_PARAMS_ORIGINAL_DCID_PRESENT 1" >>confdefs.h
+
+
+fi
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ngtcp2_conn_shutdown_stream has 4 arguments" >&5
+printf %s "checking whether ngtcp2_conn_shutdown_stream has 4 arguments... " >&6; }
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_includes_default
+#include <ngtcp2/ngtcp2.h>
+
+int
+main (void)
+{
+
+ (void)ngtcp2_conn_shutdown_stream(NULL, 0, 0, 0);
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+
+printf "%s\n" "#define HAVE_NGTCP2_CONN_SHUTDOWN_STREAM4 1" >>confdefs.h
+
+
+else $as_nop
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+
# set static linking for uninstalled libraries if requested
staticexe=""
@@ -23787,10 +24137,12 @@ if test x_$enable_lock_checks = x_yes; then
UBSYMS="-export-symbols clubsyms.def"
cp ${srcdir}/libunbound/ubsyms.def clubsyms.def
echo lock_protect >> clubsyms.def
+ echo lock_protect_place >> clubsyms.def
echo lock_unprotect >> clubsyms.def
echo lock_get_mem >> clubsyms.def
echo checklock_start >> clubsyms.def
echo checklock_stop >> clubsyms.def
+ echo checklock_set_output_name >> clubsyms.def
echo checklock_lock >> clubsyms.def
echo checklock_unlock >> clubsyms.def
echo checklock_init >> clubsyms.def
@@ -24645,7 +24997,7 @@ printf "%s\n" "#define MAXSYSLOGMSGLEN 10240" >>confdefs.h
-version=1.21.1
+version=1.22.0
date=`date +'%b %e, %Y'`
@@ -25157,7 +25509,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# report actual input values of CONFIG_FILES etc. instead of their
# values after options handling.
ac_log="
-This file was extended by unbound $as_me 1.21.1, which was
+This file was extended by unbound $as_me 1.22.0, which was
generated by GNU Autoconf 2.71. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
@@ -25225,7 +25577,7 @@ ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config='$ac_cs_config_escaped'
ac_cs_version="\\
-unbound config.status 1.21.1
+unbound config.status 1.22.0
configured by $0, generated by GNU Autoconf 2.71,
with options \\"\$ac_cs_config\\"
diff --git a/contrib/aaaa-filter-iterator.patch b/contrib/aaaa-filter-iterator.patch
index cb6dabc44856..b0c2b2198a60 100644
--- a/contrib/aaaa-filter-iterator.patch
+++ b/contrib/aaaa-filter-iterator.patch
@@ -236,7 +236,7 @@ index 54006940..768fe202 100644
+ /* see if the failure did get (parent-lame) info */
+ if(!cache_fill_missing(super->env,
+ super_iq->qchase.qclass, super->region,
-+ super_iq->dp))
++ super_iq->dp, 0))
+ log_err("ASN-AAAA-filter: out of memory adding missing");
+ dpns->resolved = 1; /* mark as failed */
+ }
diff --git a/daemon/daemon.c b/daemon/daemon.c
index 72b4a43be1ad..1c8272b14e81 100644
--- a/daemon/daemon.c
+++ b/daemon/daemon.c
@@ -557,6 +557,12 @@ daemon_create_workers(struct daemon* daemon)
fatal_exit("out of memory during daemon init");
numport = daemon_get_shufport(daemon, shufport);
verbose(VERB_ALGO, "total of %d outgoing ports available", numport);
+
+#ifdef HAVE_NGTCP2
+ daemon->doq_table = doq_table_create(daemon->cfg, daemon->rand);
+ if(!daemon->doq_table)
+ fatal_exit("could not create doq_table: out of memory");
+#endif
daemon->num = (daemon->cfg->num_threads?daemon->cfg->num_threads:1);
if(daemon->reuseport && (int)daemon->num < (int)daemon->num_ports) {
@@ -907,6 +913,10 @@ daemon_cleanup(struct daemon* daemon)
dnsc_delete(daemon->dnscenv);
daemon->dnscenv = NULL;
#endif
+#ifdef HAVE_NGTCP2
+ doq_table_delete(daemon->doq_table);
+ daemon->doq_table = NULL;
+#endif
daemon->cfg = NULL;
}
diff --git a/daemon/daemon.h b/daemon/daemon.h
index 5c3a114cc7e6..fc1bde713cae 100644
--- a/daemon/daemon.h
+++ b/daemon/daemon.h
@@ -58,6 +58,7 @@ struct ub_randstate;
struct daemon_remote;
struct respip_set;
struct shm_main_info;
+struct doq_table;
struct cookie_secrets;
#include "dnstap/dnstap_config.h"
@@ -147,6 +148,8 @@ struct daemon {
/** the dnscrypt environment */
struct dnsc_env* dnscenv;
#endif
+ /** the doq connection table */
+ struct doq_table* doq_table;
/** reuse existing cache on reload if other conditions allow it. */
int reuse_cache;
/** the EDNS cookie secrets from the cookie-secret-file */
diff --git a/daemon/remote.c b/daemon/remote.c
index 855b1f963b23..8877cd19402b 100644
--- a/daemon/remote.c
+++ b/daemon/remote.c
@@ -302,7 +302,7 @@ add_open(const char* ip, int nr, struct listen_port** list, int noproto_is_err,
/* open fd */
fd = create_tcp_accept_sock(res, 1, &noproto, 0,
cfg->ip_transparent, 0, 0, cfg->ip_freebind,
- cfg->use_systemd, cfg->ip_dscp);
+ cfg->use_systemd, cfg->ip_dscp, "unbound-control");
freeaddrinfo(res);
}
@@ -866,6 +866,10 @@ print_mem(RES* ssl, struct worker* worker, struct daemon* daemon,
if(!print_longnum(ssl, "mem.http.response_buffer"SQ,
(size_t)s->svr.mem_http2_response_buffer))
return 0;
+#ifdef HAVE_NGTCP2
+ if(!print_longnum(ssl, "mem.quic"SQ, (size_t)s->svr.mem_quic))
+ return 0;
+#endif /* HAVE_NGTCP2 */
return 1;
}
@@ -996,6 +1000,10 @@ print_ext(RES* ssl, struct ub_stats_info* s, int inhibit_zero)
(unsigned long)s->svr.qipv6)) return 0;
if(!ssl_printf(ssl, "num.query.https"SQ"%lu\n",
(unsigned long)s->svr.qhttps)) return 0;
+#ifdef HAVE_NGTCP2
+ if(!ssl_printf(ssl, "num.query.quic"SQ"%lu\n",
+ (unsigned long)s->svr.qquic)) return 0;
+#endif /* HAVE_NGTCP2 */
/* flags */
if(!ssl_printf(ssl, "num.query.flags.QR"SQ"%lu\n",
(unsigned long)s->svr.qbit_QR)) return 0;
@@ -1953,6 +1961,8 @@ bogus_del_msg(struct lruhash_entry* e, void* arg)
struct reply_info* d = (struct reply_info*)e->data;
if(d->security == sec_status_bogus) {
d->ttl = inf->expired;
+ d->prefetch_ttl = inf->expired;
+ d->serve_expired_ttl = inf->expired;
inf->num_msgs++;
#ifdef USE_CACHEDB
if(inf->remcachedb && inf->worker->env.cachedb_enabled)
@@ -2035,6 +2045,8 @@ negative_del_msg(struct lruhash_entry* e, void* arg)
* or NOERROR rcode with ANCOUNT==0: a NODATA answer */
if(FLAGS_GET_RCODE(d->flags) != 0 || d->an_numrrsets == 0) {
d->ttl = inf->expired;
+ d->prefetch_ttl = inf->expired;
+ d->serve_expired_ttl = inf->expired;
inf->num_msgs++;
#ifdef USE_CACHEDB
if(inf->remcachedb && inf->worker->env.cachedb_enabled)
diff --git a/daemon/stats.c b/daemon/stats.c
index 827110698970..0e17300a150e 100644
--- a/daemon/stats.c
+++ b/daemon/stats.c
@@ -346,6 +346,12 @@ server_stats_compile(struct worker* worker, struct ub_stats_info* s, int reset)
(long long)http2_get_query_buffer_size();
s->svr.mem_http2_response_buffer =
(long long)http2_get_response_buffer_size();
+#ifdef HAVE_NGTCP2
+ s->svr.mem_quic = (long long)doq_table_quic_size_get(
+ worker->daemon->doq_table);
+#else
+ s->svr.mem_quic = 0;
+#endif /* HAVE_NGTCP2 */
/* Set neg cache usage numbers */
set_neg_cache_stats(worker, &s->svr, reset);
@@ -474,6 +480,7 @@ void server_stats_add(struct ub_stats_info* total, struct ub_stats_info* a)
total->svr.qtls += a->svr.qtls;
total->svr.qtls_resume += a->svr.qtls_resume;
total->svr.qhttps += a->svr.qhttps;
+ total->svr.qquic += a->svr.qquic;
total->svr.qipv6 += a->svr.qipv6;
total->svr.qbit_QR += a->svr.qbit_QR;
total->svr.qbit_AA += a->svr.qbit_AA;
@@ -533,7 +540,8 @@ void server_stats_insquery(struct ub_server_stats* stats, struct comm_point* c,
else stats->qclass_big++;
stats->qopcode[ LDNS_OPCODE_WIRE(sldns_buffer_begin(c->buffer)) ]++;
if(c->type != comm_udp) {
- stats->qtcp++;
+ if(c->type != comm_doq)
+ stats->qtcp++;
if(c->ssl != NULL) {
stats->qtls++;
#ifdef HAVE_SSL
@@ -542,6 +550,10 @@ void server_stats_insquery(struct ub_server_stats* stats, struct comm_point* c,
#endif
if(c->type == comm_http)
stats->qhttps++;
+#ifdef HAVE_NGTCP2
+ else if(c->type == comm_doq)
+ stats->qquic++;
+#endif
}
}
if(repinfo && addr_is_ip6(&repinfo->remote_addr, repinfo->remote_addrlen))
diff --git a/daemon/worker.c b/daemon/worker.c
index 5e6b2a656e2c..713de316373a 100644
--- a/daemon/worker.c
+++ b/daemon/worker.c
@@ -661,22 +661,18 @@ answer_from_cache(struct worker* worker, struct query_info* qinfo,
if(rep->ttl < timenow) {
/* Check if we need to serve expired now */
if(worker->env.cfg->serve_expired &&
- !worker->env.cfg->serve_expired_client_timeout
+ /* if serve-expired-client-timeout is set, serve
+ * an expired record without attempting recursion
+ * if the serve_expired_norec_ttl is set for the record
+ * as we know that recursion is currently failing. */
+ (!worker->env.cfg->serve_expired_client_timeout ||
+ timenow < rep->serve_expired_norec_ttl)
#ifdef USE_CACHEDB
&& !(worker->env.cachedb_enabled &&
worker->env.cfg->cachedb_check_when_serve_expired)
#endif
) {
- if(worker->env.cfg->serve_expired_ttl &&
- rep->serve_expired_ttl < timenow)
- return 0;
- /* Ignore expired failure answers */
- if(FLAGS_GET_RCODE(rep->flags) !=
- LDNS_RCODE_NOERROR &&
- FLAGS_GET_RCODE(rep->flags) !=
- LDNS_RCODE_NXDOMAIN &&
- FLAGS_GET_RCODE(rep->flags) !=
- LDNS_RCODE_YXDOMAIN)
+ if(!reply_info_can_answer_expired(rep, timenow))
return 0;
if(!rrset_array_lock(rep->ref, rep->rrset_count, 0))
return 0;
@@ -2178,7 +2174,9 @@ worker_init(struct worker* worker, struct config_file *cfg,
cfg->harden_large_queries, cfg->http_max_streams,
cfg->http_endpoint, cfg->http_notls_downstream,
worker->daemon->tcl, worker->daemon->listen_sslctx,
- dtenv, worker_handle_request, worker);
+ dtenv, worker->daemon->doq_table, worker->env.rnd,
+ cfg->ssl_service_key, cfg->ssl_service_pem, cfg,
+ worker_handle_request, worker);
if(!worker->front) {
log_err("could not create listening sockets");
worker_delete(worker);
@@ -2512,3 +2510,19 @@ void dtio_mainfdcallback(int ATTR_UNUSED(fd), short ATTR_UNUSED(ev),
log_assert(0);
}
#endif
+
+#ifdef HAVE_NGTCP2
+void doq_client_event_cb(int ATTR_UNUSED(fd), short ATTR_UNUSED(ev),
+ void* ATTR_UNUSED(arg))
+{
+ log_assert(0);
+}
+#endif
+
+#ifdef HAVE_NGTCP2
+void doq_client_timer_cb(int ATTR_UNUSED(fd), short ATTR_UNUSED(ev),
+ void* ATTR_UNUSED(arg))
+{
+ log_assert(0);
+}
+#endif
diff --git a/dns64/dns64.c b/dns64/dns64.c
index cfb6ce63e187..0db174ba95a7 100644
--- a/dns64/dns64.c
+++ b/dns64/dns64.c
@@ -657,7 +657,7 @@ handle_event_moddone(struct module_qstate* qstate, int id)
qstate->return_msg->rep &&
!dns_cache_store(
qstate->env, &qstate->qinfo, qstate->return_msg->rep,
- 0, 0, 0, NULL,
+ 0, qstate->prefetch_leeway, 0, NULL,
qstate->query_flags, qstate->qstarttime))
log_err("out of memory");
@@ -847,6 +847,7 @@ dns64_adjust_a(int id, struct module_qstate* super, struct module_qstate* qstate
*/
cp = construct_reply_info_base(super->region, rep->flags, rep->qdcount,
rep->ttl, rep->prefetch_ttl, rep->serve_expired_ttl,
+ rep->serve_expired_norec_ttl,
rep->an_numrrsets, rep->ns_numrrsets, rep->ar_numrrsets,
rep->rrset_count, rep->security, LDNS_EDE_NONE);
if(!cp)
@@ -1007,7 +1008,7 @@ dns64_inform_super(struct module_qstate* qstate, int id,
/* Store the generated response in cache. */
if ( (!super_dq || !super_dq->started_no_cache_store) &&
!dns_cache_store(super->env, &super->qinfo, super->return_msg->rep,
- 0, 0, 0, NULL, super->query_flags, qstate->qstarttime))
+ 0, super->prefetch_leeway, 0, NULL, super->query_flags, qstate->qstarttime))
log_err("out of memory");
}
diff --git a/dnstap/unbound-dnstap-socket.c b/dnstap/unbound-dnstap-socket.c
index f203aa7d73a1..7f8be4965957 100644
--- a/dnstap/unbound-dnstap-socket.c
+++ b/dnstap/unbound-dnstap-socket.c
@@ -1151,7 +1151,9 @@ void dtio_mainfdcallback(int fd, short ATTR_UNUSED(bits), void* arg)
char* id = NULL;
struct sockaddr_storage addr;
socklen_t addrlen = (socklen_t)sizeof(addr);
- int s = accept(fd, (struct sockaddr*)&addr, &addrlen);
+ int s;
+ memset(&addr, 0, sizeof(addr));
+ s = accept(fd, (struct sockaddr*)&addr, &addrlen);
if(s == -1) {
#ifndef USE_WINSOCK
/* EINTR is signal interrupt. others are closed connection. */
@@ -1543,8 +1545,8 @@ int main(int argc, char** argv)
usage(argv);
}
}
- argc -= optind;
- argv += optind;
+ /* argc -= optind; not using further arguments */
+ /* argv += optind; not using further arguments */
if(usessl) {
#ifdef HAVE_SSL
@@ -1783,3 +1785,19 @@ void remote_get_opt_ssl(char* ATTR_UNUSED(str), void* ATTR_UNUSED(arg))
{
log_assert(0);
}
+
+#ifdef HAVE_NGTCP2
+void doq_client_event_cb(int ATTR_UNUSED(fd), short ATTR_UNUSED(ev),
+ void* ATTR_UNUSED(arg))
+{
+ log_assert(0);
+}
+#endif
+
+#ifdef HAVE_NGTCP2
+void doq_client_timer_cb(int ATTR_UNUSED(fd), short ATTR_UNUSED(ev),
+ void* ATTR_UNUSED(arg))
+{
+ log_assert(0);
+}
+#endif
diff --git a/doc/Changelog b/doc/Changelog
index 70860717a03b..fde05db51292 100644
--- a/doc/Changelog
+++ b/doc/Changelog
@@ -1,6 +1,155 @@
+16 October 2024: Yorgos
+ - Fix for dnsoverquic and dnstap to use the correct dnstap
+ environment.
+
+16 October 2024: Wouter
+ - Fix for dnstap with dnscrypt and dnstap without dnsoverquic.
+
+14 October 2024: Wouter
+ - Fix to display warning if quic-port is set but dnsoverquic is not
+ enabled when compiled.
+ - Fix dnsoverquic to extend the number of streams when one is closed.
+
+11 October 2024: Wouter
+ - Fix to disable detection of quic configured ports when quic is
+ not compiled in.
+ - Fix harden-unverified-glue for AAAA cache_fill_missing lookups.
+ - Fix contrib/aaaa-filter-iterator.patch for change in call
+ signature for cache_fill_missing.
+
+10 October 2024: Wouter
+ - Fix cookie_file test sporadic fails for time change during
+ the test.
+ - Fix add reallocarray to alloc stats unit test, and disable
+ override of strdup in unbound-host, and the result of config
+ get option is freed properly.
+
+9 October 2024: Wouter
+ - Merge #871: DNS over QUIC. This adds `quic-port: 853` and
+ `quic-size: 8m` that enable dnsoverquic, and the counters
+ `num.query.quic` and `mem.quic` in the statistics output.
+ The feature needs to be enabled by compiling with libngtcp2,
+ with `--with-libngtcp2=path` and libngtcp2 needs openssl+quic,
+ pass that with `--with-ssl=path` to compile unbound as well.
+ - Fix to limit NSEC TTL for messages from cachedb. Fix to limit the
+ prefetch ttl for messages after a CNAME with short TTL.
+ - Fix for dnstap compile of doqclient with doq disabled.
+
+8 October 2024: Wouter
+ - Fix #1149: unbound-control-setup hangs sometimes depending on
+ the openssl version.
+ - Fix #1128: Cannot override tcp-upstream and tls-upstream with
+ forward-tcp-upstream and forward-tls-upstream.
+
+3 October 2024: Yorgos
+ - Fix CVE-2024-8508, unbounded name compression could lead to denial
+ of service.
+ - This fix was part of 1.21.1, a security point release on 1.21.0.
+ The code repository continues with this fix and the version number
+ 1.22.0.
+
+30 September 2024: Wouter
+ - Fix negative cache NSEC3 parameter compares for zero length NSEC3
+ salt.
+ - Fix unbound dnstap socket test program analyzer warnings about
+ unused variable assignments and variable initialization.
+
+25 September 2024: Wouter
+ - Fix #1144: [FR] log timestamps in ISO8601 format with timezone.
+ This adds the option `log-time-iso: yes` that logs in ISO8601
+ format.
+
+24 September 2024: Yorgos
+ - Attempt to further fix doh_downstream_buffer_size.tdir flakiness.
+ - More clear text for prefetch and minimal-responses in the
+ unbound.conf man page.
+ - Merge #1143: Fix cache update when serve expired is used. Expired
+ records are favored over resolution and validation failures when
+ serve-expired is used.
+
+23 September 2024: Wouter
+ - Fix dns64 with prefetch that the prefetch is stored in cache.
+
+23 September 2024: Yorgos
+ - Fix doxygen warnings by commenting out CLANG_ASSISTED_PARSING,
+ CLANG_ADD_INC_PATHS, CLANG_OPTIONS and CLANG_DATABASE_PATH; they were
+ already disabled.
+
+17 September 2024: Wouter
+ - Add redis-command-timeout: 20 and redis-connect-timeout: 200,
+ that can set the timeout separately for commands and the
+ connection set up to the redis server. If they are not
+ specified, the redis-timeout value is used.
+
+16 September 2024: Wouter
+ - Merge #1140: Fix spelling mistake in comments.
+
+11 September 2024: Yorgos
+ - Fix and add comments in testdata/val_negcache_ttl.rpl.
+
+10 September 2024: Wouter
+ - Fix to limit NSEC and NSEC3 TTL when aggressive nsec is
+ enabled (RFC9077).
+ - Add unit test for ttl limit for aggressive nsec.
+
+6 September 2024: Yorgos
+ - Fix alloc-size and calloc-transposed-args compiler warnings.
+ - Fix comment to not trigger doxygen unknown command.
+
+5 September 2024: Wouter
+ - Fix config file read for dnstap-sample-rate.
+
+2 September 2024: Wouter
+ - Merge #1135: Add new IANA trust anchor.
+
+30 August 2024: Wouter
+ - Merge #1132: b.root renumbering.
+ - Fix for #1132, adjusted unit test for change in the test file.
+ - Fix for #1132, comment about adjusted copy of reference check.
+
+29 August 2024: Wouter
+ - Unit test for auth zone transfer TLS, and TLS failure.
+ - Fix to print port number in logs for auth zone transfer activities.
+
+28 August 2024: Wouter
+ - Fix that when rpz is applied the message does not get picked up by
+ the validator. That stops validation failures for the message.
+ - Fix that stub-zone and forward-zone clauses do not exhaust memory
+ for long content.
+
+27 August 2024: Wouter
+ - Fix #1130: Loads of logs: "validation failure: key for validation
+ <domain>. is marked as invalid because of a previous" for
+ non-DNSSEC signed zone.
+
+23 August 2024: Wouter
+ - Merge patch to fix for glue that is outside of zone, with
+ `harden-unverified-glue`, from Karthik Umashankar (Microsoft).
+ Enabling this option protects the Unbound resolver against bad
+ glue, that is unverified out of zone glue, by resolving them.
+ It uses the records as last resort if there is no other working
+ glue.
+ - Fix #1127: error: "memory exhausted" when defining more than 9994
+ local-zones.
+ - Fix documentation for cache_fill_missing function.
+
+21 August 2024: Wouter
+ - Add cross platform freebsd, openbsd and netbsd to github ci.
+ - Fix for char signedness warnings on NetBSD.
+
+20 August 2024: Wouter
+ - Add iter-scrub-ns, iter-scrub-cname and max-global-quota
+ configuration options.
+
+19 August 2024: Wouter
+ - Fix #1126: unbound-control-setup hangs while testing for openssl
+ presence starting from version 1.21.0.
+
9 August 2024: Wouter
- Fix spelling for the cache-min-negative-ttl entry in the
example.conf.
+ - Tag for release 1.21.0, the repository continues with 1.21.1
+ in development.
8 August 2024: Wouter
- Fix CAMP issues with global quota. Thanks to Huayi Duan, Marco
@@ -8,7 +157,7 @@
- Fix CacheFlush issues with limit on NS RRs. Thanks to Yehuda Afek,
Anat Bremler-Barr, Shoham Danino and Yuval Shavitt (Tel-Aviv
University and Reichman University).
- - Set version number to 1.21.0 for release.
+ - Set version number to 1.21.0 for release. This has tag 1.21.0rc1.
- Fix that for windows the module startup is called and sets up
the module-config.
diff --git a/doc/README b/doc/README
index e5f3597508ae..600f0feb2fa7 100644
--- a/doc/README
+++ b/doc/README
@@ -1,4 +1,4 @@
-README for Unbound 1.21.1
+README for Unbound 1.22.0
Copyright 2007 NLnet Labs
http://unbound.net
diff --git a/doc/example.conf.in b/doc/example.conf.in
index dc2aa1c01859..59090c6bb5d5 100644
--- a/doc/example.conf.in
+++ b/doc/example.conf.in
@@ -1,7 +1,7 @@
#
# Example configuration file.
#
-# See unbound.conf(5) man page, version 1.21.1.
+# See unbound.conf(5) man page, version 1.22.0.
#
# this is a comment.
@@ -187,6 +187,15 @@ server:
# query upon encountering a CNAME record.
# max-query-restarts: 11
+ # Limit on number of NS records in NS RRset for incoming packets.
+ # iter-scrub-ns: 20
+
+ # Limit on number of CNAME, DNAME records for incoming packets.
+ # iter-scrub-cname: 11
+
+ # Limit on upstream queries for an incoming query and its recursion.
+ # max-global-quota: 128
+
# msec for waiting for an unknown server to reply. Increase if you
# are behind a slow satellite link, to eg. 1128.
# unknown-server-time-limit: 376
@@ -452,6 +461,10 @@ server:
# print UTC timestamp in ascii to logfile, default is epoch in seconds.
# log-time-ascii: no
+ # log timestamp in ISO8601 format if also log-time-ascii is enabled.
+ # (y-m-dTh:m:s.msec[+-]tzhours:tzminutes)
+ # log-time-iso: no
+
# print one line with time, IP, name, type, class for every query.
# log-queries: no
@@ -524,6 +537,9 @@ server:
# Harden against out of zone rrsets, to avoid spoofing attempts.
# harden-glue: yes
+ # Harden against unverified (outside-zone, including sibling zone) glue rrsets
+ # harden-unverified-glue: no
+
# Harden against receiving dnssec-stripped data. If you turn it
# off, failing to validate dnskey data for a trustanchor will
# trigger insecure mode for that zone (like without a trustanchor).
@@ -904,6 +920,7 @@ server:
# tls-service-pem: "path/to/publiccertfile.pem"
# tls-port: 853
# https-port: 443
+ # quic-port: 853
# cipher setting for TLSv1.2
# tls-ciphers: "DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256"
@@ -968,6 +985,9 @@ server:
# Disable TLS for DNS-over-HTTP downstream service.
# http-notls-downstream: no
+ # Maximum number of bytes used for QUIC buffers.
+ # quic-size: 8m
+
# The interfaces that use these listed port numbers will support and
# expect PROXYv2. For UDP and TCP/TLS interfaces.
# proxy-protocol-port: portno for each of the port numbers.
@@ -1289,6 +1309,10 @@ remote-control:
# # redis-server-password: ""
# # timeout (in ms) for communication with the redis server
# redis-timeout: 100
+# # timeout (in ms) for commands, if 0, uses redis-timeout.
+# redis-command-timeout: 0
+# # timeout (in ms) for connection set up, if 0, uses redis-timeout.
+# redis-connect-timeout: 0
# # set timeout on redis records based on DNS response TTL
# redis-expire-records: no
# # redis logical database to use, 0 is the default database.
diff --git a/doc/libunbound.3.in b/doc/libunbound.3.in
index c9f4990178b7..bb2a5c26945a 100644
--- a/doc/libunbound.3.in
+++ b/doc/libunbound.3.in
@@ -1,4 +1,4 @@
-.TH "libunbound" "3" "Oct 3, 2024" "NLnet Labs" "unbound 1.21.1"
+.TH "libunbound" "3" "Oct 17, 2024" "NLnet Labs" "unbound 1.22.0"
.\"
.\" libunbound.3 -- unbound library functions manual
.\"
@@ -44,7 +44,7 @@
.B ub_ctx_zone_remove,
.B ub_ctx_data_add,
.B ub_ctx_data_remove
-\- Unbound DNS validating resolver 1.21.1 functions.
+\- Unbound DNS validating resolver 1.22.0 functions.
.SH "SYNOPSIS"
.B #include <unbound.h>
.LP
diff --git a/doc/unbound-anchor.8.in b/doc/unbound-anchor.8.in
index 63a52370af36..66e69cc9c352 100644
--- a/doc/unbound-anchor.8.in
+++ b/doc/unbound-anchor.8.in
@@ -1,4 +1,4 @@
-.TH "unbound-anchor" "8" "Oct 3, 2024" "NLnet Labs" "unbound 1.21.1"
+.TH "unbound-anchor" "8" "Oct 17, 2024" "NLnet Labs" "unbound 1.22.0"
.\"
.\" unbound-anchor.8 -- unbound anchor maintenance utility manual
.\"
diff --git a/doc/unbound-checkconf.8.in b/doc/unbound-checkconf.8.in
index 9f61f5e65fa4..ac657d83089c 100644
--- a/doc/unbound-checkconf.8.in
+++ b/doc/unbound-checkconf.8.in
@@ -1,4 +1,4 @@
-.TH "unbound-checkconf" "8" "Oct 3, 2024" "NLnet Labs" "unbound 1.21.1"
+.TH "unbound-checkconf" "8" "Oct 17, 2024" "NLnet Labs" "unbound 1.22.0"
.\"
.\" unbound-checkconf.8 -- unbound configuration checker manual
.\"
diff --git a/doc/unbound-control.8.in b/doc/unbound-control.8.in
index 81161a5e2088..7016e8f12515 100644
--- a/doc/unbound-control.8.in
+++ b/doc/unbound-control.8.in
@@ -1,4 +1,4 @@
-.TH "unbound-control" "8" "Oct 3, 2024" "NLnet Labs" "unbound 1.21.1"
+.TH "unbound-control" "8" "Oct 17, 2024" "NLnet Labs" "unbound 1.22.0"
.\"
.\" unbound-control.8 -- unbound remote control manual
.\"
@@ -606,6 +606,10 @@ queries waiting for request stream completion.
Memory in bytes used by the HTTP/2 response buffers. Containing DNS responses
waiting to be written back to the clients.
.TP
+.I mem.quic
+Memory in bytes used by QUIC. Containing connection information, stream
+information, queries read and responses written back to the clients.
+.TP
.I histogram.<sec>.<usec>.to.<sec>.<usec>
Shows a histogram, summed over all threads. Every element counts the
recursive queries whose reply time fit between the lower and upper bound.
@@ -654,6 +658,10 @@ Number of queries that were made using HTTPS towards the Unbound server.
These are also counted in num.query.tcp and num.query.tls, because HTTPS
uses TLS and TCP.
.TP
+.I num.query.quic
+Number of queries that were made using QUIC towards the Unbound server.
+These are also counted in num.query.tls, because TLS is used for these queries.
+.TP
.I num.query.ipv6
Number of queries that were made using IPv6 towards the Unbound server.
.TP
diff --git a/doc/unbound-host.1.in b/doc/unbound-host.1.in
index a186b7265b0b..1bd6ff54e4c0 100644
--- a/doc/unbound-host.1.in
+++ b/doc/unbound-host.1.in
@@ -1,4 +1,4 @@
-.TH "unbound\-host" "1" "Oct 3, 2024" "NLnet Labs" "unbound 1.21.1"
+.TH "unbound\-host" "1" "Oct 17, 2024" "NLnet Labs" "unbound 1.22.0"
.\"
.\" unbound-host.1 -- unbound DNS lookup utility
.\"
diff --git a/doc/unbound.8.in b/doc/unbound.8.in
index e437c2ca4a32..51986eb857e1 100644
--- a/doc/unbound.8.in
+++ b/doc/unbound.8.in
@@ -1,4 +1,4 @@
-.TH "unbound" "8" "Oct 3, 2024" "NLnet Labs" "unbound 1.21.1"
+.TH "unbound" "8" "Oct 17, 2024" "NLnet Labs" "unbound 1.22.0"
.\"
.\" unbound.8 -- unbound manual
.\"
@@ -9,7 +9,7 @@
.\"
.SH "NAME"
.B unbound
-\- Unbound DNS validating resolver 1.21.1.
+\- Unbound DNS validating resolver 1.22.0.
.SH "SYNOPSIS"
.B unbound
.RB [ \-h ]
diff --git a/doc/unbound.conf.5.in b/doc/unbound.conf.5.in
index c1c111bad209..536474349982 100644
--- a/doc/unbound.conf.5.in
+++ b/doc/unbound.conf.5.in
@@ -1,4 +1,4 @@
-.TH "unbound.conf" "5" "Oct 3, 2024" "NLnet Labs" "unbound 1.21.1"
+.TH "unbound.conf" "5" "Oct 17, 2024" "NLnet Labs" "unbound 1.22.0"
.\"
.\" unbound.conf.5 -- unbound.conf manual
.\"
@@ -566,6 +566,9 @@ tls\-system\-cert to load CA certs, otherwise the connections cannot be
authenticated. This option enables TLS for all of them, but if you do not set
this you can configure TLS specifically for some forward zones with
forward\-tls\-upstream. And also with stub\-tls\-upstream.
+If the tls\-upstream option is enabled, it is for all the forwards and stubs,
+where the forward\-tls\-upstream and stub\-tls\-upstream options are ignored,
+as if they had been set to yes.
.TP
.B ssl\-upstream: \fI<yes or no>
Alternate syntax for \fBtls\-upstream\fR. If both are present in the config
@@ -716,6 +719,18 @@ PROXYv2 is supported for UDP and TCP/TLS listening interfaces.
There is no support for PROXYv2 on a DoH or DNSCrypt listening interface.
Can list multiple, each on a new statement.
.TP
+.B quic\-port: \fI<number>
+The port number on which to provide DNS-over-QUIC service, default 853, only
+interfaces configured with that port number as @number get the QUIC service.
+The interface uses QUIC for the UDP traffic on that port number.
+.TP
+.B quic\-size: \fI<size in bytes>
+Maximum number of bytes for all QUIC buffers and data combined. Default is 8
+megabytes. A plain number is in bytes, append 'k', 'm' or 'g' for kilobytes,
+megabytes or gigabytes (1024*1024 bytes in a megabyte). New connections receive
+connection refused when the limit is exceeded. New streams are reset when the
+limit is exceeded.
+.TP
.B use\-systemd: \fI<yes or no>
Enable or disable systemd socket activation.
Default is no.
@@ -936,6 +951,10 @@ Sets logfile lines to use a timestamp in UTC ascii. Default is no, which
prints the seconds since 1970 in brackets. No effect if using syslog, in
that case syslog formats the timestamp printed into the log files.
.TP
+.B log\-time\-iso:\fR <yes or no>
+Log time in ISO8601 format, if \fBlog\-time\-ascii:\fR yes is also set.
+Default is no.
+.TP
.B log\-queries: \fI<yes or no>
Prints one line per query to the log, with the log timestamp and IP address,
name, type and class. Default is no. Note that it takes time to print these
@@ -1048,6 +1067,11 @@ payload is very large.
.B harden\-glue: \fI<yes or no>
Will trust glue only if it is within the servers authority. Default is yes.
.TP
+.B harden\-unverified\-glue: \fI<yes or no>
+Will trust only in-zone glue. Will try to resolve all out of zone
+(\fI<unverfied>) glue. Will fallback to the original glue if unable to resolve.
+Default is no.
+.TP
.B harden\-dnssec\-stripped: \fI<yes or no>
Require DNSSEC data for trust\-anchored zones, if such data is absent,
the zone becomes bogus. If turned off, and no DNSSEC data is received
@@ -1171,10 +1195,11 @@ IP6 ::1 and IP4 127.0.0.1/8. If no, then localhost can be used to send
queries to. Default is yes.
.TP
.B prefetch: \fI<yes or no>
-If yes, message cache elements are prefetched before they expire to
-keep the cache up to date. Default is no. Turning it on gives about
-10 percent more traffic and load on the machine, but popular items do
-not expire from the cache.
+If yes, cache hits on message cache elements that are on their last 10 percent
+of their TTL value trigger a prefetch to keep the cache up to date.
+Default is no.
+Turning it on gives about 10 percent more traffic and load on the machine, but
+popular items do not expire from the cache.
.TP
.B prefetch\-key: \fI<yes or no>
If yes, fetch the DNSKEYs earlier in the validation process, when a DS
@@ -1194,12 +1219,13 @@ from the query ID, for speed and thread safety). Default is yes.
.B minimal-responses: \fI<yes or no>
If yes, Unbound does not insert authority/additional sections into response
messages when those sections are not required. This reduces response
-size significantly, and may avoid TCP fallback for some responses.
-This may cause a slight speedup. The default is yes, even though the DNS
+size significantly, and may avoid TCP fallback for some responses which may
+cause a slight speedup. The default is yes, even though the DNS
protocol RFCs mandate these sections, and the additional content could
-be of use and save roundtrips for clients. Because they are not used,
-and the saved roundtrips are easier saved with prefetch, whilst this is
-faster.
+save roundtrips for clients that use the additional content.
+However these sections are hardly used by clients.
+Enabling prefetch can benefit clients that need the additional content
+by trying to keep that content fresh in the cache.
.TP
.B disable-dnssec-lame-check: \fI<yes or no>
If true, disables the DNSSEC lameness check in the iterator. This check
@@ -1957,6 +1983,23 @@ Changing this value needs caution as it can allow long CNAME chains to be
accepted, where Unbound needs to verify (resolve) each link individually.
Default is 11.
.TP 5
+.B iter\-scrub\-ns: \fI<number>
+Limit on the number of NS records allowed in an rrset of type NS, from the
+iterator scrubber. This protects the internals of the resolver from overly
+large NS sets. Default is 20.
+.TP 5
+.B iter\-scrub\-cname: \fI<number>
+Limit on the number of CNAME, DNAME records in an answer, from the iterator
+scrubber. This protects the internals of the resolver from overly long
+indirection chains. Clips off the remainder of the reply packet at that point.
+Default is 11.
+.TP 5
+.B max\-global\-quota: \fI<number>
+Limit on the number of upstream queries sent out for an incoming query and
+its subqueries from recursion. It is not reset during the resolution. When
+it is exceeded the query is failed and the lookup process stops.
+Default is 128.
+.TP 5
.B fast\-server\-permil: \fI<number>
Specify how many times out of 1000 to pick from the set of fastest servers.
0 turns the feature off. A value of 900 would pick from the fastest
@@ -2788,6 +2831,14 @@ if the Redis server does not have the requested data, and will try to
re-establish a new connection later.
This option defaults to 100 milliseconds.
.TP
+.B redis-command-timeout: \fI<msec>\fR
+The timeout to use for redis commands, in milliseconds. If 0, it uses the
+redis\-timeout value. The default is 0.
+.TP
+.B redis-connect-timeout: \fI<msec>\fR
+The timeout to use for redis connection set up, in milliseconds. If 0, it
+uses the redis\-timeout value. The default is 0.
+.TP
.B redis-expire-records: \fI<yes or no>
If Redis record expiration is enabled. If yes, Unbound sets timeout for Redis
records so that Redis can evict keys that have expired automatically. If
diff --git a/doc/unbound.doxygen b/doc/unbound.doxygen
index 996229118d73..7ff24284b5f3 100644
--- a/doc/unbound.doxygen
+++ b/doc/unbound.doxygen
@@ -1226,7 +1226,7 @@ VERBATIM_HEADERS = NO
# generated with the -Duse_libclang=ON option for CMake.
# The default value is: NO.
-CLANG_ASSISTED_PARSING = NO
+#CLANG_ASSISTED_PARSING = NO
# If the CLANG_ASSISTED_PARSING tag is set to YES and the CLANG_ADD_INC_PATHS
# tag is set to YES then doxygen will add the directory of each input to the
@@ -1234,7 +1234,7 @@ CLANG_ASSISTED_PARSING = NO
# The default value is: YES.
# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES.
-CLANG_ADD_INC_PATHS = YES
+#CLANG_ADD_INC_PATHS = YES
# If clang assisted parsing is enabled you can provide the compiler with command
# line options that you would normally use when invoking the compiler. Note that
@@ -1242,7 +1242,7 @@ CLANG_ADD_INC_PATHS = YES
# specified with INPUT and INCLUDE_PATH.
# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES.
-CLANG_OPTIONS =
+#CLANG_OPTIONS =
# If clang assisted parsing is enabled you can provide the clang parser with the
# path to the directory containing a file called compile_commands.json. This
@@ -1255,7 +1255,7 @@ CLANG_OPTIONS =
# Note: The availability of this option depends on whether or not doxygen was
# generated with the -Duse_libclang=ON option for CMake.
-CLANG_DATABASE_PATH =
+#CLANG_DATABASE_PATH =
#---------------------------------------------------------------------------
# Configuration options related to the alphabetical class index
diff --git a/install-sh b/install-sh
index e046efdf0a33..ea4c8234c41a 100755
--- a/install-sh
+++ b/install-sh
@@ -1,7 +1,7 @@
#!/usr/bin/sh
# install - install a program, script, or datafile
-scriptversion=2020-11-14.01; # UTC
+scriptversion=2013-12-25.23; # UTC
# This originates from X11R5 (mit/util/scripts/install.sh), which was
# later released in X11R6 (xc/config/util/install.sh) with the
@@ -69,11 +69,6 @@ posix_mkdir=
# Desired mode of installed file.
mode=0755
-# Create dirs (including intermediate dirs) using mode 755.
-# This is like GNU 'install' as of coreutils 8.32 (2020).
-mkdir_umask=22
-
-backupsuffix=
chgrpcmd=
chmodcmd=$chmodprog
chowncmd=
@@ -104,28 +99,18 @@ Options:
--version display version info and exit.
-c (ignored)
- -C install only if different (preserve data modification time)
+ -C install only if different (preserve the last data modification time)
-d create directories instead of installing files.
-g GROUP $chgrpprog installed files to GROUP.
-m MODE $chmodprog installed files to MODE.
-o USER $chownprog installed files to USER.
- -p pass -p to $cpprog.
-s $stripprog installed files.
- -S SUFFIX attempt to back up existing files, with suffix SUFFIX.
-t DIRECTORY install into DIRECTORY.
-T report an error if DSTFILE is a directory.
Environment variables override the default commands:
CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
RMPROG STRIPPROG
-
-By default, rm is invoked with -f; when overridden with RMPROG,
-it's up to you to specify -f if you want it.
-
-If -S is not specified, no backups are attempted.
-
-Email bug reports to bug-automake@gnu.org.
-Automake home page: https://www.gnu.org/software/automake/
"
while test $# -ne 0; do
@@ -152,13 +137,8 @@ while test $# -ne 0; do
-o) chowncmd="$chownprog $2"
shift;;
- -p) cpprog="$cpprog -p";;
-
-s) stripcmd=$stripprog;;
- -S) backupsuffix="$2"
- shift;;
-
-t)
is_target_a_directory=always
dst_arg=$2
@@ -275,10 +255,6 @@ do
dstdir=$dst
test -d "$dstdir"
dstdir_status=$?
- # Don't chown directories that already exist.
- if test $dstdir_status = 0; then
- chowncmd=""
- fi
else
# Waiting for this to be detected by the "$cpprog $src $dsttmp" command
@@ -295,18 +271,15 @@ do
fi
dst=$dst_arg
- # If destination is a directory, append the input filename.
+ # If destination is a directory, append the input filename; won't work
+ # if double slashes aren't ignored.
if test -d "$dst"; then
if test "$is_target_a_directory" = never; then
echo "$0: $dst_arg: Is a directory" >&2
exit 1
fi
dstdir=$dst
- dstbase=`basename "$src"`
- case $dst in
- */) dst=$dst$dstbase;;
- *) dst=$dst/$dstbase;;
- esac
+ dst=$dstdir/`basename "$src"`
dstdir_status=0
else
dstdir=`dirname "$dst"`
@@ -315,16 +288,27 @@ do
fi
fi
- case $dstdir in
- */) dstdirslash=$dstdir;;
- *) dstdirslash=$dstdir/;;
- esac
-
obsolete_mkdir_used=false
if test $dstdir_status != 0; then
case $posix_mkdir in
'')
+ # Create intermediate dirs using mode 755 as modified by the umask.
+ # This is like FreeBSD 'install' as of 1997-10-28.
+ umask=`umask`
+ case $stripcmd.$umask in
+ # Optimize common cases.
+ *[2367][2367]) mkdir_umask=$umask;;
+ .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
+
+ *[0-7])
+ mkdir_umask=`expr $umask + 22 \
+ - $umask % 100 % 40 + $umask % 20 \
+ - $umask % 10 % 4 + $umask % 2
+ `;;
+ *) mkdir_umask=$umask,go-w;;
+ esac
+
# With -d, create the new directory with the user-specified mode.
# Otherwise, rely on $mkdir_umask.
if test -n "$dir_arg"; then
@@ -334,49 +318,43 @@ do
fi
posix_mkdir=false
- # The $RANDOM variable is not portable (e.g., dash). Use it
- # here however when possible just to lower collision chance.
- tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
-
- trap '
- ret=$?
- rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null
- exit $ret
- ' 0
-
- # Because "mkdir -p" follows existing symlinks and we likely work
- # directly in world-writeable /tmp, make sure that the '$tmpdir'
- # directory is successfully created first before we actually test
- # 'mkdir -p'.
- if (umask $mkdir_umask &&
- $mkdirprog $mkdir_mode "$tmpdir" &&
- exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1
- then
- if test -z "$dir_arg" || {
- # Check for POSIX incompatibilities with -m.
- # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
- # other-writable bit of parent directory when it shouldn't.
- # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
- test_tmpdir="$tmpdir/a"
- ls_ld_tmpdir=`ls -ld "$test_tmpdir"`
- case $ls_ld_tmpdir in
- d????-?r-*) different_mode=700;;
- d????-?--*) different_mode=755;;
- *) false;;
- esac &&
- $mkdirprog -m$different_mode -p -- "$test_tmpdir" && {
- ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"`
- test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
- }
- }
- then posix_mkdir=:
- fi
- rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir"
- else
- # Remove any dirs left behind by ancient mkdir implementations.
- rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null
- fi
- trap '' 0;;
+ case $umask in
+ *[123567][0-7][0-7])
+ # POSIX mkdir -p sets u+wx bits regardless of umask, which
+ # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
+ ;;
+ *)
+ tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
+ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
+
+ if (umask $mkdir_umask &&
+ exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
+ then
+ if test -z "$dir_arg" || {
+ # Check for POSIX incompatibilities with -m.
+ # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
+ # other-writable bit of parent directory when it shouldn't.
+ # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
+ ls_ld_tmpdir=`ls -ld "$tmpdir"`
+ case $ls_ld_tmpdir in
+ d????-?r-*) different_mode=700;;
+ d????-?--*) different_mode=755;;
+ *) false;;
+ esac &&
+ $mkdirprog -m$different_mode -p -- "$tmpdir" && {
+ ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
+ test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
+ }
+ }
+ then posix_mkdir=:
+ fi
+ rmdir "$tmpdir/d" "$tmpdir"
+ else
+ # Remove any dirs left behind by ancient mkdir implementations.
+ rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
+ fi
+ trap '' 0;;
+ esac;;
esac
if
@@ -387,7 +365,7 @@ do
then :
else
- # mkdir does not conform to POSIX,
+ # The umask is ridiculous, or mkdir does not conform to POSIX,
# or it failed possibly due to a race condition. Create the
# directory the slow way, step by step, checking for races as we go.
@@ -416,7 +394,7 @@ do
prefixes=
else
if $posix_mkdir; then
- (umask $mkdir_umask &&
+ (umask=$mkdir_umask &&
$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
# Don't fail if two instances are running concurrently.
test -d "$prefix" || exit 1
@@ -449,25 +427,14 @@ do
else
# Make a couple of temp file names in the proper directory.
- dsttmp=${dstdirslash}_inst.$$_
- rmtmp=${dstdirslash}_rm.$$_
+ dsttmp=$dstdir/_inst.$$_
+ rmtmp=$dstdir/_rm.$$_
# Trap to clean up those temp files at exit.
trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
# Copy the file name to the temp name.
- (umask $cp_umask &&
- { test -z "$stripcmd" || {
- # Create $dsttmp read-write so that cp doesn't create it read-only,
- # which would cause strip to fail.
- if test -z "$doit"; then
- : >"$dsttmp" # No need to fork-exec 'touch'.
- else
- $doit touch "$dsttmp"
- fi
- }
- } &&
- $doit_exec $cpprog "$src" "$dsttmp") &&
+ (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
# and set any options; do chmod last to preserve setuid bits.
#
@@ -493,13 +460,6 @@ do
then
rm -f "$dsttmp"
else
- # If $backupsuffix is set, and the file being installed
- # already exists, attempt a backup. Don't worry if it fails,
- # e.g., if mv doesn't support -f.
- if test -n "$backupsuffix" && test -f "$dst"; then
- $doit $mvcmd -f "$dst" "$dst$backupsuffix" 2>/dev/null
- fi
-
# Rename the file to the real destination.
$doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
@@ -514,9 +474,9 @@ do
# file should still install successfully.
{
test ! -f "$dst" ||
- $doit $rmcmd "$dst" 2>/dev/null ||
+ $doit $rmcmd -f "$dst" 2>/dev/null ||
{ $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
- { $doit $rmcmd "$rmtmp" 2>/dev/null; :; }
+ { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
} ||
{ echo "$0: cannot unlink or rename $dst" >&2
(exit 1); exit 1
@@ -533,9 +493,9 @@ do
done
# Local variables:
-# eval: (add-hook 'before-save-hook 'time-stamp)
+# eval: (add-hook 'write-file-hooks 'time-stamp)
# time-stamp-start: "scriptversion="
# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-time-zone: "UTC0"
+# time-stamp-time-zone: "UTC"
# time-stamp-end: "; # UTC"
# End:
diff --git a/iterator/iter_scrub.c b/iterator/iter_scrub.c
index f038ad69af0e..49a5f5da19c2 100644
--- a/iterator/iter_scrub.c
+++ b/iterator/iter_scrub.c
@@ -443,7 +443,7 @@ scrub_normalize(sldns_buffer* pkt, struct msg_parse* msg,
prev = NULL;
rrset = msg->rrset_first;
while(rrset && rrset->section == LDNS_SECTION_ANSWER) {
- if(cname_length > 11 /* env->cfg.iter_scrub_cname */) {
+ if(cname_length > env->cfg->iter_scrub_cname) {
/* Too many CNAMEs, or DNAMEs, from the authority
* server, scrub down the length to something
* shorter. This deletes everything after the limit
@@ -562,8 +562,8 @@ scrub_normalize(sldns_buffer* pkt, struct msg_parse* msg,
dname_pkt_compare(pkt, oldsname,
rrset->dname) == 0) {
if(rrset->type == LDNS_RR_TYPE_NS &&
- rrset->rr_count > 20 /* env->cfg->iter_scrub_ns */) {
- shorten_rrset(pkt, rrset, 20 /* env->cfg->iter_scrub_ns */);
+ rrset->rr_count > env->cfg->iter_scrub_ns) {
+ shorten_rrset(pkt, rrset, env->cfg->iter_scrub_ns);
}
prev = rrset;
rrset = rrset->rrset_all_next;
@@ -581,8 +581,8 @@ scrub_normalize(sldns_buffer* pkt, struct msg_parse* msg,
}
if(rrset->type == LDNS_RR_TYPE_NS &&
- rrset->rr_count > 20 /* env->cfg->iter_scrub_ns */) {
- shorten_rrset(pkt, rrset, 20 /* env->cfg->iter_scrub_ns */);
+ rrset->rr_count > env->cfg->iter_scrub_ns) {
+ shorten_rrset(pkt, rrset, env->cfg->iter_scrub_ns);
}
/* Mark the additional names from relevant rrset as OK. */
@@ -641,7 +641,7 @@ scrub_normalize(sldns_buffer* pkt, struct msg_parse* msg,
"RRset:", pkt, msg, prev, &rrset);
continue;
}
- if(rrset->rr_count > 20 /* env->cfg->iter_scrub_ns */) {
+ if(rrset->rr_count > env->cfg->iter_scrub_ns) {
/* If this is not a referral, and the NS RRset
* is signed, then remove it entirely, so
* that when it becomes bogus it does not
@@ -657,7 +657,7 @@ scrub_normalize(sldns_buffer* pkt, struct msg_parse* msg,
"RRset:", pkt, msg, prev, &rrset);
continue;
} else {
- shorten_rrset(pkt, rrset, 20 /* env->cfg->iter_scrub_ns */);
+ shorten_rrset(pkt, rrset, env->cfg->iter_scrub_ns);
}
}
}
@@ -871,6 +871,7 @@ scrub_sanitize(sldns_buffer* pkt, struct msg_parse* msg,
{
int del_addi = 0; /* if additional-holding rrsets are deleted, we
do not trust the normalized additional-A-AAAA any more */
+ uint8_t* ns_rrset_dname = NULL;
int added_rrlen_ede = 0;
struct rrset_parse* rrset, *prev;
prev = NULL;
@@ -976,6 +977,16 @@ scrub_sanitize(sldns_buffer* pkt, struct msg_parse* msg,
continue;
}
}
+ if(rrset->type == LDNS_RR_TYPE_NS &&
+ (rrset->section == LDNS_SECTION_AUTHORITY ||
+ rrset->section == LDNS_SECTION_ANSWER)) {
+ /* If the type is NS, and we're in the
+ * answer or authority section, then
+ * store the dname so we can check
+ * against the glue records
+ * further down */
+ ns_rrset_dname = rrset->dname;
+ }
if(del_addi && rrset->section == LDNS_SECTION_ADDITIONAL) {
remove_rrset("sanitize: removing potential "
"poison reference RRset:", pkt, msg, prev, &rrset);
@@ -988,6 +999,26 @@ scrub_sanitize(sldns_buffer* pkt, struct msg_parse* msg,
"RRset:", pkt, msg, prev, &rrset);
continue;
}
+ if(env->cfg->harden_unverified_glue && ns_rrset_dname &&
+ rrset->section == LDNS_SECTION_ADDITIONAL &&
+ (rrset->type == LDNS_RR_TYPE_A || rrset->type == LDNS_RR_TYPE_AAAA) &&
+ !pkt_strict_sub(pkt, rrset->dname, ns_rrset_dname)) {
+ /* We're in the additional section, looking
+ * at an A/AAAA rrset, have a previous
+ * delegation point and we notice that
+ * the glue records are NOT for strict
+ * subdomains of the delegation. So set a
+ * flag, recompute the hash for the rrset
+ * and write the A/AAAA record to cache.
+ * It'll be retrieved if we can't separately
+ * resolve the glue */
+ rrset->flags = PACKED_RRSET_UNVERIFIED_GLUE;
+ rrset->hash = pkt_hash_rrset(pkt, rrset->dname, rrset->type, rrset->rrset_class, rrset->flags);
+ store_rrset(pkt, msg, env, rrset);
+ remove_rrset("sanitize: storing potential "
+ "unverified glue reference RRset:", pkt, msg, prev, &rrset);
+ continue;
+ }
prev = rrset;
rrset = rrset->rrset_all_next;
}
diff --git a/iterator/iter_utils.c b/iterator/iter_utils.c
index 1b4f5f6ebb4f..cacba420e845 100644
--- a/iterator/iter_utils.c
+++ b/iterator/iter_utils.c
@@ -1564,3 +1564,45 @@ void iterator_set_ip46_support(struct module_stack* mods,
if(outnet->num_ip6 == 0)
ie->supports_ipv6 = 0;
}
+
+void
+limit_nsec_ttl(struct dns_msg* msg)
+{
+ /* Limit NSEC and NSEC3 TTL in response, RFC9077 */
+ size_t i;
+ int found = 0;
+ time_t soa_ttl = 0;
+ /* Limit the NSEC and NSEC3 TTL values to the SOA TTL and SOA minimum
+ * TTL. That has already been applied to the SOA record ttl. */
+ for(i=0; i<msg->rep->rrset_count; i++) {
+ struct ub_packed_rrset_key* s = msg->rep->rrsets[i];
+ if(ntohs(s->rk.type) == LDNS_RR_TYPE_SOA) {
+ struct packed_rrset_data* soadata = (struct packed_rrset_data*)s->entry.data;
+ found = 1;
+ soa_ttl = soadata->ttl;
+ break;
+ }
+ }
+ if(!found)
+ return;
+ for(i=0; i<msg->rep->rrset_count; i++) {
+ struct ub_packed_rrset_key* s = msg->rep->rrsets[i];
+ if(ntohs(s->rk.type) == LDNS_RR_TYPE_NSEC ||
+ ntohs(s->rk.type) == LDNS_RR_TYPE_NSEC3) {
+ struct packed_rrset_data* data = (struct packed_rrset_data*)s->entry.data;
+ /* Limit the negative TTL. */
+ if(data->ttl > soa_ttl) {
+ if(verbosity >= VERB_ALGO) {
+ char buf[256];
+ snprintf(buf, sizeof(buf),
+ "limiting TTL %d of %s record to the SOA TTL of %d for",
+ (int)data->ttl, ((ntohs(s->rk.type) == LDNS_RR_TYPE_NSEC)?"NSEC":"NSEC3"), (int)soa_ttl);
+ log_nametypeclass(VERB_ALGO, buf,
+ s->rk.dname, ntohs(s->rk.type),
+ ntohs(s->rk.rrset_class));
+ }
+ data->ttl = soa_ttl;
+ }
+ }
+ }
+}
diff --git a/iterator/iter_utils.h b/iterator/iter_utils.h
index 4024629e686c..0361e43775e1 100644
--- a/iterator/iter_utils.h
+++ b/iterator/iter_utils.h
@@ -428,4 +428,11 @@ int iter_stub_fwd_no_cache(struct module_qstate *qstate,
void iterator_set_ip46_support(struct module_stack* mods,
struct module_env* env, struct outside_network* outnet);
+/**
+ * Limit NSEC and NSEC3 TTL in response, RFC9077
+ * @param msg: dns message, the SOA record ttl is used to restrict ttls
+ * of NSEC and NSEC3 RRsets. If no SOA record, nothing happens.
+ */
+void limit_nsec_ttl(struct dns_msg* msg);
+
#endif /* ITERATOR_ITER_UTILS_H */
diff --git a/iterator/iterator.c b/iterator/iterator.c
index 228f5dfaef30..59e4b36ce364 100644
--- a/iterator/iterator.c
+++ b/iterator/iterator.c
@@ -70,6 +70,8 @@
#include "sldns/parseutil.h"
#include "sldns/sbuffer.h"
+/* number of packets */
+int MAX_GLOBAL_QUOTA = 128;
/* in msec */
int UNKNOWN_SERVER_NICENESS = 376;
/* in msec */
@@ -252,7 +254,7 @@ error_supers(struct module_qstate* qstate, int id, struct module_qstate* super)
} else {
/* see if the failure did get (parent-lame) info */
if(!cache_fill_missing(super->env, super_iq->qchase.qclass,
- super->region, super_iq->dp))
+ super->region, super_iq->dp, 0))
log_err("out of memory adding missing");
}
delegpt_mark_neg(dpns, qstate->qinfo.qtype);
@@ -320,16 +322,21 @@ error_response_cache(struct module_qstate* qstate, int id, int rcode)
qstate->qinfo.qname, qstate->qinfo.qname_len,
qstate->qinfo.qtype, qstate->qinfo.qclass,
qstate->query_flags, 0,
- qstate->env->cfg->serve_expired_ttl_reset)) != NULL) {
+ qstate->env->cfg->serve_expired)) != NULL) {
struct reply_info* rep = (struct reply_info*)msg->entry.data;
- if(qstate->env->cfg->serve_expired &&
- qstate->env->cfg->serve_expired_ttl_reset && rep &&
- *qstate->env->now + qstate->env->cfg->serve_expired_ttl
- > rep->serve_expired_ttl) {
- verbose(VERB_ALGO, "reset serve-expired-ttl for "
+ if(qstate->env->cfg->serve_expired && rep) {
+ if(qstate->env->cfg->serve_expired_ttl_reset &&
+ *qstate->env->now + qstate->env->cfg->serve_expired_ttl
+ > rep->serve_expired_ttl) {
+ verbose(VERB_ALGO, "reset serve-expired-ttl for "
+ "response in cache");
+ rep->serve_expired_ttl = *qstate->env->now +
+ qstate->env->cfg->serve_expired_ttl;
+ }
+ verbose(VERB_ALGO, "set serve-expired-norec-ttl for "
"response in cache");
- rep->serve_expired_ttl = *qstate->env->now +
- qstate->env->cfg->serve_expired_ttl;
+ rep->serve_expired_norec_ttl = NORR_TTL +
+ *qstate->env->now;
}
if(rep && (FLAGS_GET_RCODE(rep->flags) ==
LDNS_RCODE_NOERROR ||
@@ -407,8 +414,11 @@ iter_prepend(struct iter_qstate* iq, struct dns_msg* msg,
num_an = 0;
for(p = iq->an_prepend_list; p; p = p->next) {
sets[num_an++] = p->rrset;
- if(ub_packed_rrset_ttl(p->rrset) < msg->rep->ttl)
+ if(ub_packed_rrset_ttl(p->rrset) < msg->rep->ttl) {
msg->rep->ttl = ub_packed_rrset_ttl(p->rrset);
+ msg->rep->prefetch_ttl = PREFETCH_TTL_CALC(msg->rep->ttl);
+ msg->rep->serve_expired_ttl = msg->rep->ttl + SERVE_EXPIRED_TTL;
+ }
}
memcpy(sets+num_an, msg->rep->rrsets, msg->rep->an_numrrsets *
sizeof(struct ub_packed_rrset_key*));
@@ -421,8 +431,11 @@ iter_prepend(struct iter_qstate* iq, struct dns_msg* msg,
msg->rep->ns_numrrsets, p->rrset))
continue;
sets[msg->rep->an_numrrsets + num_an + num_ns++] = p->rrset;
- if(ub_packed_rrset_ttl(p->rrset) < msg->rep->ttl)
+ if(ub_packed_rrset_ttl(p->rrset) < msg->rep->ttl) {
msg->rep->ttl = ub_packed_rrset_ttl(p->rrset);
+ msg->rep->prefetch_ttl = PREFETCH_TTL_CALC(msg->rep->ttl);
+ msg->rep->serve_expired_ttl = msg->rep->ttl + SERVE_EXPIRED_TTL;
+ }
}
memcpy(sets + num_an + msg->rep->an_numrrsets + num_ns,
msg->rep->rrsets + msg->rep->an_numrrsets,
@@ -1569,7 +1582,7 @@ processInitRequest(struct module_qstate* qstate, struct iter_qstate* iq,
return error_response(qstate, id, LDNS_RCODE_SERVFAIL);
}
if(!cache_fill_missing(qstate->env, iq->qchase.qclass,
- qstate->region, iq->dp)) {
+ qstate->region, iq->dp, 0)) {
errinf(qstate, "malloc failure, copy extra info into delegation point");
return error_response(qstate, id, LDNS_RCODE_SERVFAIL);
}
@@ -2150,6 +2163,15 @@ processLastResort(struct module_qstate* qstate, struct iter_qstate* iq,
verbose(VERB_QUERY, "configured stub or forward servers failed -- returning SERVFAIL");
return error_response_cache(qstate, id, LDNS_RCODE_SERVFAIL);
}
+ if(qstate->env->cfg->harden_unverified_glue) {
+ if(!cache_fill_missing(qstate->env, iq->qchase.qclass,
+ qstate->region, iq->dp, PACKED_RRSET_UNVERIFIED_GLUE))
+ log_err("out of memory in cache_fill_missing");
+ if(iq->dp->usable_list) {
+ verbose(VERB_ALGO, "try unverified glue from cache");
+ return next_state(iq, QUERYTARGETS_STATE);
+ }
+ }
if(!iq->dp->has_parent_side_NS && dname_is_root(iq->dp->name)) {
struct delegpt* dp;
int nolock = 0;
@@ -2192,7 +2214,7 @@ processLastResort(struct module_qstate* qstate, struct iter_qstate* iq,
}
/* see if that makes new names available */
if(!cache_fill_missing(qstate->env, iq->qchase.qclass,
- qstate->region, iq->dp))
+ qstate->region, iq->dp, 0))
log_err("out of memory in cache_fill_missing");
if(iq->dp->usable_list) {
verbose(VERB_ALGO, "try parent-side-name, w. glue from cache");
@@ -3424,7 +3446,7 @@ processQueryResponse(struct module_qstate* qstate, struct iter_qstate* iq,
old_dp->name, old_dp->namelen);
}
if(!cache_fill_missing(qstate->env, iq->qchase.qclass,
- qstate->region, iq->dp)) {
+ qstate->region, iq->dp, 0)) {
errinf(qstate, "malloc failure, copy extra info into delegation point");
return error_response(qstate, id, LDNS_RCODE_SERVFAIL);
}
@@ -3993,6 +4015,8 @@ processClassResponse(struct module_qstate* qstate, int id,
to->rep->prefetch_ttl = from->rep->prefetch_ttl;
if(from->rep->serve_expired_ttl < to->rep->serve_expired_ttl)
to->rep->serve_expired_ttl = from->rep->serve_expired_ttl;
+ if(from->rep->serve_expired_norec_ttl < to->rep->serve_expired_norec_ttl)
+ to->rep->serve_expired_norec_ttl = from->rep->serve_expired_norec_ttl;
}
/* are we done? */
foriq->num_current_queries --;
@@ -4355,7 +4379,10 @@ process_response(struct module_qstate* qstate, struct iter_qstate* iq,
if(verbosity >= VERB_ALGO)
log_dns_msg("incoming scrubbed packet:", &iq->response->qinfo,
iq->response->rep);
-
+
+ if(qstate->env->cfg->aggressive_nsec) {
+ limit_nsec_ttl(iq->response);
+ }
if(event == module_event_capsfail || iq->caps_fallback) {
if(qstate->env->cfg->qname_minimisation &&
iq->minimisation_state != DONOT_MINIMISE_STATE) {
diff --git a/iterator/iterator.h b/iterator/iterator.h
index 70b11df7ebcf..46701f6eee75 100644
--- a/iterator/iterator.h
+++ b/iterator/iterator.h
@@ -57,7 +57,7 @@ struct rbtree_type;
#define MAX_TARGET_COUNT 64
/** max number of upstream queries for a query and its subqueries, it is
* never reset. */
-#define MAX_GLOBAL_QUOTA 128
+extern int MAX_GLOBAL_QUOTA;
/** max number of target lookups per qstate, per delegation point */
#define MAX_DP_TARGET_COUNT 16
/** max number of nxdomains allowed for target lookups for a query and
diff --git a/libunbound/context.c b/libunbound/context.c
index 05f57987a404..a1a4adf98f0e 100644
--- a/libunbound/context.c
+++ b/libunbound/context.c
@@ -395,7 +395,7 @@ context_serialize_cancel(struct ctx_query* q, uint32_t* len)
/* format of cancel:
* o uint32 cmd
* o uint32 async-id */
- uint8_t* p = (uint8_t*)reallocarray(NULL, sizeof(uint32_t), 2);
+ uint8_t* p = (uint8_t*)reallocarray(NULL, 2, sizeof(uint32_t));
if(!p) return NULL;
*len = 2*sizeof(uint32_t);
sldns_write_uint32(p, UB_LIBCMD_CANCEL);
diff --git a/libunbound/libworker.c b/libunbound/libworker.c
index 94b644a49b86..da7d4c22440d 100644
--- a/libunbound/libworker.c
+++ b/libunbound/libworker.c
@@ -1058,3 +1058,19 @@ void dtio_mainfdcallback(int ATTR_UNUSED(fd), short ATTR_UNUSED(ev),
log_assert(0);
}
#endif
+
+#ifdef HAVE_NGTCP2
+void doq_client_event_cb(int ATTR_UNUSED(fd), short ATTR_UNUSED(ev),
+ void* ATTR_UNUSED(arg))
+{
+ log_assert(0);
+}
+#endif
+
+#ifdef HAVE_NGTCP2
+void doq_client_timer_cb(int ATTR_UNUSED(fd), short ATTR_UNUSED(ev),
+ void* ATTR_UNUSED(arg))
+{
+ log_assert(0);
+}
+#endif
diff --git a/libunbound/python/examples/dnssec_test.py b/libunbound/python/examples/dnssec_test.py
index b76c0437e3f6..1a125affacfe 100644
--- a/libunbound/python/examples/dnssec_test.py
+++ b/libunbound/python/examples/dnssec_test.py
@@ -30,6 +30,7 @@ def dnssecParse(domain, rrType=RR_TYPE_A):
resolver = ub_ctx()
resolver.add_ta(". IN DS 19036 8 2 49AAC11D7B6F6446702E54A1607371607A1A41855200FD2CE1CDDE32F24E8FB5")
resolver.add_ta(". IN DS 20326 8 2 E06D44B80B8F1D39A95C0B0D7C65D08458E880409BBC683457104237C7F8EC8D")
+resolver.add_ta(". IN DS 38696 8 2 683D2D0ACB8C9B712A1948B27F741219298D0A450D612C483AF444A4C0FB2B16")
dnssecParse("nic.cz")
dnssecParse("nonexistent-domain-blablabla.cz")
diff --git a/libunbound/unbound.h b/libunbound/unbound.h
index bb8e8acf033c..ef2c5c0679f6 100644
--- a/libunbound/unbound.h
+++ b/libunbound/unbound.h
@@ -845,6 +845,10 @@ struct ub_server_stats {
long long qtls_resume;
/** RPZ action stats */
long long rpz_action[UB_STATS_RPZ_ACTION_NUM];
+ /** number of bytes in QUIC buffers */
+ long long mem_quic;
+ /** number of queries over (DNS over) QUIC */
+ long long qquic;
};
/**
diff --git a/ltmain.sh b/ltmain.sh
index 49fcad1365c6..7f3523d335c5 100644
--- a/ltmain.sh
+++ b/ltmain.sh
@@ -1,12 +1,12 @@
-#! /usr/bin/env sh
+#! /bin/sh
## DO NOT EDIT - This file generated from ./build-aux/ltmain.in
-## by inline-source v2019-02-19.15
+## by inline-source v2014-01-03.01
-# libtool (GNU libtool) 2.4.7
+# libtool (GNU libtool) 2.4.6
# Provide generalized library-building support services.
# Written by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
-# Copyright (C) 1996-2019, 2021-2022 Free Software Foundation, Inc.
+# Copyright (C) 1996-2015 Free Software Foundation, Inc.
# This is free software; see the source for copying conditions. There is NO
# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
@@ -31,8 +31,8 @@
PROGRAM=libtool
PACKAGE=libtool
-VERSION=2.4.7
-package_revision=2.4.7
+VERSION=2.4.6
+package_revision=2.4.6
## ------ ##
@@ -64,25 +64,34 @@ package_revision=2.4.7
# libraries, which are installed to $pkgauxdir.
# Set a version string for this script.
-scriptversion=2019-02-19.15; # UTC
+scriptversion=2015-01-20.17; # UTC
# General shell script boiler plate, and helper functions.
# Written by Gary V. Vaughan, 2004
-# This is free software. There is NO warranty; not even for
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-#
-# Copyright (C) 2004-2019, 2021 Bootstrap Authors
-#
-# This file is dual licensed under the terms of the MIT license
-# <https://opensource.org/license/MIT>, and GPL version 2 or later
-# <http://www.gnu.org/licenses/gpl-2.0.html>. You must apply one of
-# these licenses when using or redistributing this software or any of
-# the files within it. See the URLs above, or the file `LICENSE`
-# included in the Bootstrap distribution for the full license texts.
+# Copyright (C) 2004-2015 Free Software Foundation, Inc.
+# This is free software; see the source for copying conditions. There is NO
+# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+
+# As a special exception to the GNU General Public License, if you distribute
+# this file as part of a program or library that is built using GNU Libtool,
+# you may include this file under the same distribution terms that you use
+# for the rest of that program.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNES FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
-# Please report bugs or propose patches to:
-# <https://github.com/gnulib-modules/bootstrap/issues>
+# Please report bugs or propose patches to gary@gnu.org.
## ------ ##
@@ -130,12 +139,9 @@ do
_G_safe_locale=\"$_G_var=C; \$_G_safe_locale\"
fi"
done
-# These NLS vars are set unconditionally (bootstrap issue #24). Unset those
-# in case the environment reset is needed later and the $save_* variant is not
-# defined (see the code above).
-LC_ALL=C
-LANGUAGE=C
-export LANGUAGE LC_ALL
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
# Make sure IFS has a sensible default
sp=' '
@@ -153,26 +159,6 @@ if test "${PATH_SEPARATOR+set}" != set; then
fi
-# func_unset VAR
-# --------------
-# Portably unset VAR.
-# In some shells, an 'unset VAR' statement leaves a non-zero return
-# status if VAR is already unset, which might be problematic if the
-# statement is used at the end of a function (thus poisoning its return
-# value) or when 'set -e' is active (causing even a spurious abort of
-# the script in this case).
-func_unset ()
-{
- { eval $1=; (eval unset $1) >/dev/null 2>&1 && eval unset $1 || : ; }
-}
-
-
-# Make sure CDPATH doesn't cause `cd` commands to output the target dir.
-func_unset CDPATH
-
-# Make sure ${,E,F}GREP behave sanely.
-func_unset GREP_OPTIONS
-
## ------------------------- ##
## Locate command utilities. ##
@@ -273,7 +259,7 @@ test -z "$SED" && {
rm -f conftest.in conftest.tmp conftest.nl conftest.out
}
- func_path_progs "sed gsed" func_check_prog_sed "$PATH:/usr/xpg4/bin"
+ func_path_progs "sed gsed" func_check_prog_sed $PATH:/usr/xpg4/bin
rm -f conftest.sed
SED=$func_path_progs_result
}
@@ -309,7 +295,7 @@ test -z "$GREP" && {
rm -f conftest.in conftest.tmp conftest.nl conftest.out
}
- func_path_progs "grep ggrep" func_check_prog_grep "$PATH:/usr/xpg4/bin"
+ func_path_progs "grep ggrep" func_check_prog_grep $PATH:/usr/xpg4/bin
GREP=$func_path_progs_result
}
@@ -374,35 +360,6 @@ sed_double_backslash="\
s/\\([^$_G_bs]\\)$_G_bs2$_G_dollar/\\1$_G_bs2$_G_bs$_G_dollar/g
s/\n//g"
-# require_check_ifs_backslash
-# ---------------------------
-# Check if we can use backslash as IFS='\' separator, and set
-# $check_ifs_backshlash_broken to ':' or 'false'.
-require_check_ifs_backslash=func_require_check_ifs_backslash
-func_require_check_ifs_backslash ()
-{
- _G_save_IFS=$IFS
- IFS='\'
- _G_check_ifs_backshlash='a\\b'
- for _G_i in $_G_check_ifs_backshlash
- do
- case $_G_i in
- a)
- check_ifs_backshlash_broken=false
- ;;
- '')
- break
- ;;
- *)
- check_ifs_backshlash_broken=:
- break
- ;;
- esac
- done
- IFS=$_G_save_IFS
- require_check_ifs_backslash=:
-}
-
## ----------------- ##
## Global variables. ##
@@ -623,16 +580,16 @@ if test yes = "$_G_HAVE_PLUSEQ_OP"; then
{
$debug_cmd
- func_quote_arg pretty "$2"
- eval "$1+=\\ \$func_quote_arg_result"
+ func_quote_for_eval "$2"
+ eval "$1+=\\ \$func_quote_for_eval_result"
}'
else
func_append_quoted ()
{
$debug_cmd
- func_quote_arg pretty "$2"
- eval "$1=\$$1\\ \$func_quote_arg_result"
+ func_quote_for_eval "$2"
+ eval "$1=\$$1\\ \$func_quote_for_eval_result"
}
fi
@@ -1134,203 +1091,85 @@ func_relative_path ()
}
-# func_quote_portable EVAL ARG
-# ----------------------------
-# Internal function to portably implement func_quote_arg. Note that we still
-# keep attention to performance here so we as much as possible try to avoid
-# calling sed binary (so far O(N) complexity as long as func_append is O(1)).
-func_quote_portable ()
+# func_quote_for_eval ARG...
+# --------------------------
+# Aesthetically quote ARGs to be evaled later.
+# This function returns two values:
+# i) func_quote_for_eval_result
+# double-quoted, suitable for a subsequent eval
+# ii) func_quote_for_eval_unquoted_result
+# has all characters that are still active within double
+# quotes backslashified.
+func_quote_for_eval ()
{
$debug_cmd
- $require_check_ifs_backslash
-
- func_quote_portable_result=$2
-
- # one-time-loop (easy break)
- while true
- do
- if $1; then
- func_quote_portable_result=`$ECHO "$2" | $SED \
- -e "$sed_double_quote_subst" -e "$sed_double_backslash"`
- break
- fi
-
- # Quote for eval.
- case $func_quote_portable_result in
+ func_quote_for_eval_unquoted_result=
+ func_quote_for_eval_result=
+ while test 0 -lt $#; do
+ case $1 in
*[\\\`\"\$]*)
- # Fallback to sed for $func_check_bs_ifs_broken=:, or when the string
- # contains the shell wildcard characters.
- case $check_ifs_backshlash_broken$func_quote_portable_result in
- :*|*[\[\*\?]*)
- func_quote_portable_result=`$ECHO "$func_quote_portable_result" \
- | $SED "$sed_quote_subst"`
- break
- ;;
- esac
+ _G_unquoted_arg=`printf '%s\n' "$1" |$SED "$sed_quote_subst"` ;;
+ *)
+ _G_unquoted_arg=$1 ;;
+ esac
+ if test -n "$func_quote_for_eval_unquoted_result"; then
+ func_append func_quote_for_eval_unquoted_result " $_G_unquoted_arg"
+ else
+ func_append func_quote_for_eval_unquoted_result "$_G_unquoted_arg"
+ fi
- func_quote_portable_old_IFS=$IFS
- for _G_char in '\' '`' '"' '$'
- do
- # STATE($1) PREV($2) SEPARATOR($3)
- set start "" ""
- func_quote_portable_result=dummy"$_G_char$func_quote_portable_result$_G_char"dummy
- IFS=$_G_char
- for _G_part in $func_quote_portable_result
- do
- case $1 in
- quote)
- func_append func_quote_portable_result "$3$2"
- set quote "$_G_part" "\\$_G_char"
- ;;
- start)
- set first "" ""
- func_quote_portable_result=
- ;;
- first)
- set quote "$_G_part" ""
- ;;
- esac
- done
- done
- IFS=$func_quote_portable_old_IFS
+ case $_G_unquoted_arg in
+ # Double-quote args containing shell metacharacters to delay
+ # word splitting, command substitution and variable expansion
+ # for a subsequent eval.
+ # Many Bourne shells cannot handle close brackets correctly
+ # in scan sets, so we specify it separately.
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ _G_quoted_arg=\"$_G_unquoted_arg\"
;;
- *) ;;
+ *)
+ _G_quoted_arg=$_G_unquoted_arg
+ ;;
esac
- break
- done
- func_quote_portable_unquoted_result=$func_quote_portable_result
- case $func_quote_portable_result in
- # double-quote args containing shell metacharacters to delay
- # word splitting, command substitution and variable expansion
- # for a subsequent eval.
- # many bourne shells cannot handle close brackets correctly
- # in scan sets, so we specify it separately.
- *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
- func_quote_portable_result=\"$func_quote_portable_result\"
- ;;
- esac
+ if test -n "$func_quote_for_eval_result"; then
+ func_append func_quote_for_eval_result " $_G_quoted_arg"
+ else
+ func_append func_quote_for_eval_result "$_G_quoted_arg"
+ fi
+ shift
+ done
}
-# func_quotefast_eval ARG
-# -----------------------
-# Quote one ARG (internal). This is equivalent to 'func_quote_arg eval ARG',
-# but optimized for speed. Result is stored in $func_quotefast_eval.
-if test xyes = `(x=; printf -v x %q yes; echo x"$x") 2>/dev/null`; then
- printf -v _GL_test_printf_tilde %q '~'
- if test '\~' = "$_GL_test_printf_tilde"; then
- func_quotefast_eval ()
- {
- printf -v func_quotefast_eval_result %q "$1"
- }
- else
- # Broken older Bash implementations. Make those faster too if possible.
- func_quotefast_eval ()
- {
- case $1 in
- '~'*)
- func_quote_portable false "$1"
- func_quotefast_eval_result=$func_quote_portable_result
- ;;
- *)
- printf -v func_quotefast_eval_result %q "$1"
- ;;
- esac
- }
- fi
-else
- func_quotefast_eval ()
- {
- func_quote_portable false "$1"
- func_quotefast_eval_result=$func_quote_portable_result
- }
-fi
-
+# func_quote_for_expand ARG
+# -------------------------
+# Aesthetically quote ARG to be evaled later; same as above,
+# but do not quote variable references.
+func_quote_for_expand ()
+{
+ $debug_cmd
-# func_quote_arg MODEs ARG
-# ------------------------
-# Quote one ARG to be evaled later. MODEs argument may contain zero or more
-# specifiers listed below separated by ',' character. This function returns two
-# values:
-# i) func_quote_arg_result
-# double-quoted (when needed), suitable for a subsequent eval
-# ii) func_quote_arg_unquoted_result
-# has all characters that are still active within double
-# quotes backslashified. Available only if 'unquoted' is specified.
-#
-# Available modes:
-# ----------------
-# 'eval' (default)
-# - escape shell special characters
-# 'expand'
-# - the same as 'eval'; but do not quote variable references
-# 'pretty'
-# - request aesthetic output, i.e. '"a b"' instead of 'a\ b'. This might
-# be used later in func_quote to get output like: 'echo "a b"' instead
-# of 'echo a\ b'. This is slower than default on some shells.
-# 'unquoted'
-# - produce also $func_quote_arg_unquoted_result which does not contain
-# wrapping double-quotes.
-#
-# Examples for 'func_quote_arg pretty,unquoted string':
-#
-# string | *_result | *_unquoted_result
-# ------------+-----------------------+-------------------
-# " | \" | \"
-# a b | "a b" | a b
-# "a b" | "\"a b\"" | \"a b\"
-# * | "*" | *
-# z="${x-$y}" | "z=\"\${x-\$y}\"" | z=\"\${x-\$y}\"
-#
-# Examples for 'func_quote_arg pretty,unquoted,expand string':
-#
-# string | *_result | *_unquoted_result
-# --------------+---------------------+--------------------
-# z="${x-$y}" | "z=\"${x-$y}\"" | z=\"${x-$y}\"
-func_quote_arg ()
-{
- _G_quote_expand=false
- case ,$1, in
- *,expand,*)
- _G_quote_expand=:
- ;;
+ case $1 in
+ *[\\\`\"]*)
+ _G_arg=`$ECHO "$1" | $SED \
+ -e "$sed_double_quote_subst" -e "$sed_double_backslash"` ;;
+ *)
+ _G_arg=$1 ;;
esac
- case ,$1, in
- *,pretty,*|*,expand,*|*,unquoted,*)
- func_quote_portable $_G_quote_expand "$2"
- func_quote_arg_result=$func_quote_portable_result
- func_quote_arg_unquoted_result=$func_quote_portable_unquoted_result
- ;;
- *)
- # Faster quote-for-eval for some shells.
- func_quotefast_eval "$2"
- func_quote_arg_result=$func_quotefast_eval_result
+ case $_G_arg in
+ # Double-quote args containing shell metacharacters to delay
+ # word splitting and command substitution for a subsequent eval.
+ # Many Bourne shells cannot handle close brackets correctly
+ # in scan sets, so we specify it separately.
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ _G_arg=\"$_G_arg\"
;;
esac
-}
-
-# func_quote MODEs ARGs...
-# ------------------------
-# Quote all ARGs to be evaled later and join them into single command. See
-# func_quote_arg's description for more info.
-func_quote ()
-{
- $debug_cmd
- _G_func_quote_mode=$1 ; shift
- func_quote_result=
- while test 0 -lt $#; do
- func_quote_arg "$_G_func_quote_mode" "$1"
- if test -n "$func_quote_result"; then
- func_append func_quote_result " $func_quote_arg_result"
- else
- func_append func_quote_result "$func_quote_arg_result"
- fi
- shift
- done
+ func_quote_for_expand_result=$_G_arg
}
@@ -1376,8 +1215,8 @@ func_show_eval ()
_G_cmd=$1
_G_fail_exp=${2-':'}
- func_quote_arg pretty,expand "$_G_cmd"
- eval "func_notquiet $func_quote_arg_result"
+ func_quote_for_expand "$_G_cmd"
+ eval "func_notquiet $func_quote_for_expand_result"
$opt_dry_run || {
eval "$_G_cmd"
@@ -1402,8 +1241,8 @@ func_show_eval_locale ()
_G_fail_exp=${2-':'}
$opt_quiet || {
- func_quote_arg expand,pretty "$_G_cmd"
- eval "func_echo $func_quote_arg_result"
+ func_quote_for_expand "$_G_cmd"
+ eval "func_echo $func_quote_for_expand_result"
}
$opt_dry_run || {
@@ -1530,26 +1369,30 @@ func_lt_ver ()
# End:
#! /bin/sh
+# Set a version string for this script.
+scriptversion=2014-01-07.03; # UTC
+
# A portable, pluggable option parser for Bourne shell.
# Written by Gary V. Vaughan, 2010
-# This is free software. There is NO warranty; not even for
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-#
-# Copyright (C) 2010-2019, 2021 Bootstrap Authors
-#
-# This file is dual licensed under the terms of the MIT license
-# <https://opensource.org/license/MIT>, and GPL version 2 or later
-# <http://www.gnu.org/licenses/gpl-2.0.html>. You must apply one of
-# these licenses when using or redistributing this software or any of
-# the files within it. See the URLs above, or the file `LICENSE`
-# included in the Bootstrap distribution for the full license texts.
+# Copyright (C) 2010-2015 Free Software Foundation, Inc.
+# This is free software; see the source for copying conditions. There is NO
+# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-# Please report bugs or propose patches to:
-# <https://github.com/gnulib-modules/bootstrap/issues>
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
-# Set a version string for this script.
-scriptversion=2019-02-19.15; # UTC
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Please report bugs or propose patches to gary@gnu.org.
## ------ ##
@@ -1572,7 +1415,7 @@ scriptversion=2019-02-19.15; # UTC
#
# In order for the '--version' option to work, you will need to have a
# suitably formatted comment like the one at the top of this file
-# starting with '# Written by ' and ending with '# Copyright'.
+# starting with '# Written by ' and ending with '# warranty; '.
#
# For '-h' and '--help' to work, you will also need a one line
# description of your script's purpose in a comment directly above the
@@ -1584,7 +1427,7 @@ scriptversion=2019-02-19.15; # UTC
# to display verbose messages only when your user has specified
# '--verbose'.
#
-# After sourcing this file, you can plug in processing for additional
+# After sourcing this file, you can plug processing for additional
# options by amending the variables from the 'Configuration' section
# below, and following the instructions in the 'Option parsing'
# section further down.
@@ -1633,8 +1476,8 @@ fatal_help="Try '\$progname --help' for more information."
## ------------------------- ##
# This section contains functions for adding, removing, and running hooks
-# in the main code. A hook is just a list of function names that can be
-# run in order later on.
+# to the main code. A hook is just a named list of of function, that can
+# be run in order later on.
# func_hookable FUNC_NAME
# -----------------------
@@ -1667,8 +1510,7 @@ func_add_hook ()
# func_remove_hook FUNC_NAME HOOK_FUNC
# ------------------------------------
-# Remove HOOK_FUNC from the list of hook functions to be called by
-# FUNC_NAME.
+# Remove HOOK_FUNC from the list of functions called by FUNC_NAME.
func_remove_hook ()
{
$debug_cmd
@@ -1677,28 +1519,10 @@ func_remove_hook ()
}
-# func_propagate_result FUNC_NAME_A FUNC_NAME_B
-# ---------------------------------------------
-# If the *_result variable of FUNC_NAME_A _is set_, assign its value to
-# *_result variable of FUNC_NAME_B.
-func_propagate_result ()
-{
- $debug_cmd
-
- func_propagate_result_result=:
- if eval "test \"\${${1}_result+set}\" = set"
- then
- eval "${2}_result=\$${1}_result"
- else
- func_propagate_result_result=false
- fi
-}
-
-
# func_run_hooks FUNC_NAME [ARG]...
# ---------------------------------
# Run all hook functions registered to FUNC_NAME.
-# It's assumed that the list of hook functions contains nothing more
+# It is assumed that the list of hook functions contains nothing more
# than a whitespace-delimited list of legal shell function names, and
# no effort is wasted trying to catch shell meta-characters or preserve
# whitespace.
@@ -1708,19 +1532,22 @@ func_run_hooks ()
case " $hookable_fns " in
*" $1 "*) ;;
- *) func_fatal_error "'$1' does not support hook functions." ;;
+ *) func_fatal_error "'$1' does not support hook funcions.n" ;;
esac
eval _G_hook_fns=\$$1_hooks; shift
for _G_hook in $_G_hook_fns; do
- func_unset "${_G_hook}_result"
- eval $_G_hook '${1+"$@"}'
- func_propagate_result $_G_hook func_run_hooks
- if $func_propagate_result_result; then
- eval set dummy "$func_run_hooks_result"; shift
- fi
+ eval $_G_hook '"$@"'
+
+ # store returned options list back into positional
+ # parameters for next 'cmd' execution.
+ eval _G_hook_result=\$${_G_hook}_result
+ eval set dummy "$_G_hook_result"; shift
done
+
+ func_quote_for_eval ${1+"$@"}
+ func_run_hooks_result=$func_quote_for_eval_result
}
@@ -1730,18 +1557,10 @@ func_run_hooks ()
## --------------- ##
# In order to add your own option parsing hooks, you must accept the
-# full positional parameter list from your hook function. You may remove
-# or edit any options that you action, and then pass back the remaining
-# unprocessed options in '<hooked_function_name>_result', escaped
-# suitably for 'eval'.
-#
-# The '<hooked_function_name>_result' variable is automatically unset
-# before your hook gets called; for best performance, only set the
-# *_result variable when necessary (i.e. don't call the 'func_quote'
-# function unnecessarily because it can be an expensive operation on some
-# machines).
-#
-# Like this:
+# full positional parameter list in your hook function, remove any
+# options that you action, and then pass back the remaining unprocessed
+# options in '<hooked_function_name>_result', escaped suitably for
+# 'eval'. Like this:
#
# my_options_prep ()
# {
@@ -1751,8 +1570,9 @@ func_run_hooks ()
# usage_message=$usage_message'
# -s, --silent don'\''t print informational messages
# '
-# # No change in '$@' (ignored completely by this hook). Leave
-# # my_options_prep_result variable intact.
+#
+# func_quote_for_eval ${1+"$@"}
+# my_options_prep_result=$func_quote_for_eval_result
# }
# func_add_hook func_options_prep my_options_prep
#
@@ -1761,36 +1581,25 @@ func_run_hooks ()
# {
# $debug_cmd
#
-# args_changed=false
-#
-# # Note that, for efficiency, we parse as many options as we can
+# # Note that for efficiency, we parse as many options as we can
# # recognise in a loop before passing the remainder back to the
# # caller on the first unrecognised argument we encounter.
# while test $# -gt 0; do
# opt=$1; shift
# case $opt in
-# --silent|-s) opt_silent=:
-# args_changed=:
-# ;;
+# --silent|-s) opt_silent=: ;;
# # Separate non-argument short options:
# -s*) func_split_short_opt "$_G_opt"
# set dummy "$func_split_short_opt_name" \
# "-$func_split_short_opt_arg" ${1+"$@"}
# shift
-# args_changed=:
# ;;
-# *) # Make sure the first unrecognised option "$_G_opt"
-# # is added back to "$@" in case we need it later,
-# # if $args_changed was set to 'true'.
-# set dummy "$_G_opt" ${1+"$@"}; shift; break ;;
+# *) set dummy "$_G_opt" "$*"; shift; break ;;
# esac
# done
#
-# # Only call 'func_quote' here if we processed at least one argument.
-# if $args_changed; then
-# func_quote eval ${1+"$@"}
-# my_silent_option_result=$func_quote_result
-# fi
+# func_quote_for_eval ${1+"$@"}
+# my_silent_option_result=$func_quote_for_eval_result
# }
# func_add_hook func_parse_options my_silent_option
#
@@ -1801,26 +1610,17 @@ func_run_hooks ()
#
# $opt_silent && $opt_verbose && func_fatal_help "\
# '--silent' and '--verbose' options are mutually exclusive."
+#
+# func_quote_for_eval ${1+"$@"}
+# my_option_validation_result=$func_quote_for_eval_result
# }
# func_add_hook func_validate_options my_option_validation
#
-# You'll also need to manually amend $usage_message to reflect the extra
+# You'll alse need to manually amend $usage_message to reflect the extra
# options you parse. It's preferable to append if you can, so that
# multiple option parsing hooks can be added safely.
-# func_options_finish [ARG]...
-# ----------------------------
-# Finishing the option parse loop (call 'func_options' hooks ATM).
-func_options_finish ()
-{
- $debug_cmd
-
- func_run_hooks func_options ${1+"$@"}
- func_propagate_result func_run_hooks func_options_finish
-}
-
-
# func_options [ARG]...
# ---------------------
# All the functions called inside func_options are hookable. See the
@@ -1830,27 +1630,17 @@ func_options ()
{
$debug_cmd
- _G_options_quoted=false
+ func_options_prep ${1+"$@"}
+ eval func_parse_options \
+ ${func_options_prep_result+"$func_options_prep_result"}
+ eval func_validate_options \
+ ${func_parse_options_result+"$func_parse_options_result"}
- for my_func in options_prep parse_options validate_options options_finish
- do
- func_unset func_${my_func}_result
- func_unset func_run_hooks_result
- eval func_$my_func '${1+"$@"}'
- func_propagate_result func_$my_func func_options
- if $func_propagate_result_result; then
- eval set dummy "$func_options_result"; shift
- _G_options_quoted=:
- fi
- done
+ eval func_run_hooks func_options \
+ ${func_validate_options_result+"$func_validate_options_result"}
- $_G_options_quoted || {
- # As we (func_options) are top-level options-parser function and
- # nobody quoted "$@" for us yet, we need to do it explicitly for
- # caller.
- func_quote eval ${1+"$@"}
- func_options_result=$func_quote_result
- }
+ # save modified positional parameters for caller
+ func_options_result=$func_run_hooks_result
}
@@ -1859,8 +1649,9 @@ func_options ()
# All initialisations required before starting the option parse loop.
# Note that when calling hook functions, we pass through the list of
# positional parameters. If a hook function modifies that list, and
-# needs to propagate that back to rest of this script, then the complete
-# modified list must be put in 'func_run_hooks_result' before returning.
+# needs to propogate that back to rest of this script, then the complete
+# modified list must be put in 'func_run_hooks_result' before
+# returning.
func_hookable func_options_prep
func_options_prep ()
{
@@ -1871,7 +1662,9 @@ func_options_prep ()
opt_warning_types=
func_run_hooks func_options_prep ${1+"$@"}
- func_propagate_result func_run_hooks func_options_prep
+
+ # save modified positional parameters for caller
+ func_options_prep_result=$func_run_hooks_result
}
@@ -1883,32 +1676,25 @@ func_parse_options ()
{
$debug_cmd
- _G_parse_options_requote=false
+ func_parse_options_result=
+
# this just eases exit handling
while test $# -gt 0; do
# Defer to hook functions for initial option parsing, so they
# get priority in the event of reusing an option name.
func_run_hooks func_parse_options ${1+"$@"}
- func_propagate_result func_run_hooks func_parse_options
- if $func_propagate_result_result; then
- eval set dummy "$func_parse_options_result"; shift
- # Even though we may have changed "$@", we passed the "$@" array
- # down into the hook and it quoted it for us (because we are in
- # this if-branch). No need to quote it again.
- _G_parse_options_requote=false
- fi
+
+ # Adjust func_parse_options positional parameters to match
+ eval set dummy "$func_run_hooks_result"; shift
# Break out of the loop if we already parsed every option.
test $# -gt 0 || break
- # We expect that one of the options parsed in this function matches
- # and thus we remove _G_opt from "$@" and need to re-quote.
- _G_match_parse_options=:
_G_opt=$1
shift
case $_G_opt in
--debug|-x) debug_cmd='set -x'
- func_echo "enabling shell trace mode" >&2
+ func_echo "enabling shell trace mode"
$debug_cmd
;;
@@ -1918,10 +1704,7 @@ func_parse_options ()
;;
--warnings|--warning|-W)
- if test $# = 0 && func_missing_arg $_G_opt; then
- _G_parse_options_requote=:
- break
- fi
+ test $# = 0 && func_missing_arg $_G_opt && break
case " $warning_categories $1" in
*" $1 "*)
# trailing space prevents matching last $1 above
@@ -1974,24 +1757,15 @@ func_parse_options ()
shift
;;
- --) _G_parse_options_requote=: ; break ;;
+ --) break ;;
-*) func_fatal_help "unrecognised option: '$_G_opt'" ;;
- *) set dummy "$_G_opt" ${1+"$@"}; shift
- _G_match_parse_options=false
- break
- ;;
+ *) set dummy "$_G_opt" ${1+"$@"}; shift; break ;;
esac
-
- if $_G_match_parse_options; then
- _G_parse_options_requote=:
- fi
done
- if $_G_parse_options_requote; then
- # save modified positional parameters for caller
- func_quote eval ${1+"$@"}
- func_parse_options_result=$func_quote_result
- fi
+ # save modified positional parameters for caller
+ func_quote_for_eval ${1+"$@"}
+ func_parse_options_result=$func_quote_for_eval_result
}
@@ -2008,10 +1782,12 @@ func_validate_options ()
test -n "$opt_warning_types" || opt_warning_types=" $warning_categories"
func_run_hooks func_validate_options ${1+"$@"}
- func_propagate_result func_run_hooks func_validate_options
# Bail if the options were screwed!
$exit_cmd $EXIT_FAILURE
+
+ # save modified positional parameters for caller
+ func_validate_options_result=$func_run_hooks_result
}
@@ -2067,8 +1843,8 @@ func_missing_arg ()
# func_split_equals STRING
# ------------------------
-# Set func_split_equals_lhs and func_split_equals_rhs shell variables
-# after splitting STRING at the '=' sign.
+# Set func_split_equals_lhs and func_split_equals_rhs shell variables after
+# splitting STRING at the '=' sign.
test -z "$_G_HAVE_XSI_OPS" \
&& (eval 'x=a/b/c;
test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \
@@ -2083,9 +1859,8 @@ then
func_split_equals_lhs=${1%%=*}
func_split_equals_rhs=${1#*=}
- if test "x$func_split_equals_lhs" = "x$1"; then
- func_split_equals_rhs=
- fi
+ test "x$func_split_equals_lhs" = "x$1" \
+ && func_split_equals_rhs=
}'
else
# ...otherwise fall back to using expr, which is often a shell builtin.
@@ -2095,7 +1870,7 @@ else
func_split_equals_lhs=`expr "x$1" : 'x\([^=]*\)'`
func_split_equals_rhs=
- test "x$func_split_equals_lhs=" = "x$1" \
+ test "x$func_split_equals_lhs" = "x$1" \
|| func_split_equals_rhs=`expr "x$1" : 'x[^=]*=\(.*\)$'`
}
fi #func_split_equals
@@ -2121,7 +1896,7 @@ else
{
$debug_cmd
- func_split_short_opt_name=`expr "x$1" : 'x\(-.\)'`
+ func_split_short_opt_name=`expr "x$1" : 'x-\(.\)'`
func_split_short_opt_arg=`expr "x$1" : 'x-.\(.*\)$'`
}
fi #func_split_short_opt
@@ -2163,44 +1938,31 @@ func_usage_message ()
# func_version
# ------------
# Echo version message to standard output and exit.
-# The version message is extracted from the calling file's header
-# comments, with leading '# ' stripped:
-# 1. First display the progname and version
-# 2. Followed by the header comment line matching /^# Written by /
-# 3. Then a blank line followed by the first following line matching
-# /^# Copyright /
-# 4. Immediately followed by any lines between the previous matches,
-# except lines preceding the intervening completely blank line.
-# For example, see the header comments of this file.
func_version ()
{
$debug_cmd
printf '%s\n' "$progname $scriptversion"
$SED -n '
- /^# Written by /!b
- s|^# ||; p; n
-
- :fwd2blnk
- /./ {
- n
- b fwd2blnk
+ /(C)/!b go
+ :more
+ /\./!{
+ N
+ s|\n# | |
+ b more
}
- p; n
-
- :holdwrnt
- s|^# ||
- s|^# *$||
- /^Copyright /!{
- /./H
- n
- b holdwrnt
+ :go
+ /^# Written by /,/# warranty; / {
+ s|^# ||
+ s|^# *$||
+ s|\((C)\)[ 0-9,-]*[ ,-]\([1-9][0-9]* \)|\1 \2|
+ p
}
-
- s|\((C)\)[ 0-9,-]*[ ,-]\([1-9][0-9]* \)|\1 \2|
- G
- s|\(\n\)\n*|\1|g
- p; q' < "$progpath"
+ /^# Written by / {
+ s|^# ||
+ p
+ }
+ /^warranty; /q' < "$progpath"
exit $?
}
@@ -2210,12 +1972,12 @@ func_version ()
# mode: shell-script
# sh-indentation: 2
# eval: (add-hook 'before-save-hook 'time-stamp)
-# time-stamp-pattern: "30/scriptversion=%:y-%02m-%02d.%02H; # UTC"
+# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC"
# time-stamp-time-zone: "UTC"
# End:
# Set a version string.
-scriptversion='(GNU libtool) 2.4.7'
+scriptversion='(GNU libtool) 2.4.6'
# func_echo ARG...
@@ -2306,7 +2068,7 @@ include the following information:
compiler: $LTCC
compiler flags: $LTCFLAGS
linker: $LD (gnu? $with_gnu_ld)
- version: $progname (GNU libtool) 2.4.7
+ version: $progname (GNU libtool) 2.4.6
automake: `($AUTOMAKE --version) 2>/dev/null |$SED 1q`
autoconf: `($AUTOCONF --version) 2>/dev/null |$SED 1q`
@@ -2508,8 +2270,6 @@ libtool_options_prep ()
nonopt=
preserve_args=
- _G_rc_lt_options_prep=:
-
# Shorthand for --mode=foo, only valid as the first argument
case $1 in
clean|clea|cle|cl)
@@ -2533,16 +2293,11 @@ libtool_options_prep ()
uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u)
shift; set dummy --mode uninstall ${1+"$@"}; shift
;;
- *)
- _G_rc_lt_options_prep=false
- ;;
esac
- if $_G_rc_lt_options_prep; then
- # Pass back the list of options.
- func_quote eval ${1+"$@"}
- libtool_options_prep_result=$func_quote_result
- fi
+ # Pass back the list of options.
+ func_quote_for_eval ${1+"$@"}
+ libtool_options_prep_result=$func_quote_for_eval_result
}
func_add_hook func_options_prep libtool_options_prep
@@ -2554,12 +2309,9 @@ libtool_parse_options ()
{
$debug_cmd
- _G_rc_lt_parse_options=false
-
# Perform our own loop to consume as many options as possible in
# each iteration.
while test $# -gt 0; do
- _G_match_lt_parse_options=:
_G_opt=$1
shift
case $_G_opt in
@@ -2634,20 +2386,15 @@ libtool_parse_options ()
func_append preserve_args " $_G_opt"
;;
- # An option not handled by this hook function:
- *) set dummy "$_G_opt" ${1+"$@"} ; shift
- _G_match_lt_parse_options=false
- break
- ;;
+ # An option not handled by this hook function:
+ *) set dummy "$_G_opt" ${1+"$@"}; shift; break ;;
esac
- $_G_match_lt_parse_options && _G_rc_lt_parse_options=:
done
- if $_G_rc_lt_parse_options; then
- # save modified positional parameters for caller
- func_quote eval ${1+"$@"}
- libtool_parse_options_result=$func_quote_result
- fi
+
+ # save modified positional parameters for caller
+ func_quote_for_eval ${1+"$@"}
+ libtool_parse_options_result=$func_quote_for_eval_result
}
func_add_hook func_parse_options libtool_parse_options
@@ -2668,10 +2415,17 @@ libtool_validate_options ()
# preserve --debug
test : = "$debug_cmd" || func_append preserve_args " --debug"
- # Keeping compiler generated duplicates in $postdeps and $predeps is not
- # harmful, and is necessary in a majority of systems that use it to satisfy
- # symbol dependencies.
- opt_duplicate_compiler_generated_deps=:
+ case $host in
+ # Solaris2 added to fix http://debbugs.gnu.org/cgi/bugreport.cgi?bug=16452
+ # see also: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59788
+ *cygwin* | *mingw* | *pw32* | *cegcc* | *solaris2* | *os2*)
+ # don't eliminate duplications in $postdeps and $predeps
+ opt_duplicate_compiler_generated_deps=:
+ ;;
+ *)
+ opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps
+ ;;
+ esac
$opt_help || {
# Sanity checks first:
@@ -2697,8 +2451,8 @@ libtool_validate_options ()
}
# Pass back the unparsed argument list
- func_quote eval ${1+"$@"}
- libtool_validate_options_result=$func_quote_result
+ func_quote_for_eval ${1+"$@"}
+ libtool_validate_options_result=$func_quote_for_eval_result
}
func_add_hook func_validate_options libtool_validate_options
@@ -3664,8 +3418,8 @@ func_mode_compile ()
esac
done
- func_quote_arg pretty "$libobj"
- test "X$libobj" != "X$func_quote_arg_result" \
+ func_quote_for_eval "$libobj"
+ test "X$libobj" != "X$func_quote_for_eval_result" \
&& $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \
&& func_warning "libobj name '$libobj' may not contain shell special characters."
func_dirname_and_basename "$obj" "/" ""
@@ -3738,8 +3492,8 @@ compiler."
func_to_tool_file "$srcfile" func_convert_file_msys_to_w32
srcfile=$func_to_tool_file_result
- func_quote_arg pretty "$srcfile"
- qsrcfile=$func_quote_arg_result
+ func_quote_for_eval "$srcfile"
+ qsrcfile=$func_quote_for_eval_result
# Only build a PIC object if we are building libtool libraries.
if test yes = "$build_libtool_libs"; then
@@ -3894,8 +3648,7 @@ This mode accepts the following additional options:
-prefer-non-pic try to build non-PIC objects only
-shared do not build a '.o' file suitable for static linking
-static only build a '.o' file suitable for static linking
- -Wc,FLAG
- -Xcompiler FLAG pass FLAG directly to the compiler
+ -Wc,FLAG pass FLAG directly to the compiler
COMPILE-COMMAND is a command to be used in creating a 'standard' object file
from the given SOURCEFILE.
@@ -4001,8 +3754,6 @@ The following components of LINK-COMMAND are treated specially:
-weak LIBNAME declare that the target provides the LIBNAME interface
-Wc,FLAG
-Xcompiler FLAG pass linker-specific FLAG directly to the compiler
- -Wa,FLAG
- -Xassembler FLAG pass linker-specific FLAG directly to the assembler
-Wl,FLAG
-Xlinker FLAG pass linker-specific FLAG directly to the linker
-XCClinker FLAG pass link-specific FLAG to the compiler driver (CC)
@@ -4345,8 +4096,8 @@ func_mode_install ()
case $nonopt in *shtool*) :;; *) false;; esac
then
# Aesthetically quote it.
- func_quote_arg pretty "$nonopt"
- install_prog="$func_quote_arg_result "
+ func_quote_for_eval "$nonopt"
+ install_prog="$func_quote_for_eval_result "
arg=$1
shift
else
@@ -4356,8 +4107,8 @@ func_mode_install ()
# The real first argument should be the name of the installation program.
# Aesthetically quote it.
- func_quote_arg pretty "$arg"
- func_append install_prog "$func_quote_arg_result"
+ func_quote_for_eval "$arg"
+ func_append install_prog "$func_quote_for_eval_result"
install_shared_prog=$install_prog
case " $install_prog " in
*[\\\ /]cp\ *) install_cp=: ;;
@@ -4414,12 +4165,12 @@ func_mode_install ()
esac
# Aesthetically quote the argument.
- func_quote_arg pretty "$arg"
- func_append install_prog " $func_quote_arg_result"
+ func_quote_for_eval "$arg"
+ func_append install_prog " $func_quote_for_eval_result"
if test -n "$arg2"; then
- func_quote_arg pretty "$arg2"
+ func_quote_for_eval "$arg2"
fi
- func_append install_shared_prog " $func_quote_arg_result"
+ func_append install_shared_prog " $func_quote_for_eval_result"
done
test -z "$install_prog" && \
@@ -4430,8 +4181,8 @@ func_mode_install ()
if test -n "$install_override_mode" && $no_mode; then
if $install_cp; then :; else
- func_quote_arg pretty "$install_override_mode"
- func_append install_shared_prog " -m $func_quote_arg_result"
+ func_quote_for_eval "$install_override_mode"
+ func_append install_shared_prog " -m $func_quote_for_eval_result"
fi
fi
@@ -4727,8 +4478,8 @@ func_mode_install ()
relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'`
$opt_quiet || {
- func_quote_arg expand,pretty "$relink_command"
- eval "func_echo $func_quote_arg_result"
+ func_quote_for_expand "$relink_command"
+ eval "func_echo $func_quote_for_expand_result"
}
if eval "$relink_command"; then :
else
@@ -5507,8 +5258,7 @@ else
if test \"\$libtool_execute_magic\" != \"$magic\"; then
file=\"\$0\""
- func_quote_arg pretty "$ECHO"
- qECHO=$func_quote_arg_result
+ qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"`
$ECHO "\
# A function that is used when there is no print builtin or printf.
@@ -5518,7 +5268,7 @@ func_fallback_echo ()
\$1
_LTECHO_EOF'
}
- ECHO=$qECHO
+ ECHO=\"$qECHO\"
fi
# Very basic option parsing. These options are (a) specific to
@@ -6861,9 +6611,9 @@ func_mode_link ()
while test "$#" -gt 0; do
arg=$1
shift
- func_quote_arg pretty,unquoted "$arg"
- qarg=$func_quote_arg_unquoted_result
- func_append libtool_args " $func_quote_arg_result"
+ func_quote_for_eval "$arg"
+ qarg=$func_quote_for_eval_unquoted_result
+ func_append libtool_args " $func_quote_for_eval_result"
# If the previous option needs an argument, assign it.
if test -n "$prev"; then
@@ -7099,13 +6849,6 @@ func_mode_link ()
prev=
continue
;;
- xassembler)
- func_append compiler_flags " -Xassembler $qarg"
- prev=
- func_append compile_command " -Xassembler $qarg"
- func_append finalize_command " -Xassembler $qarg"
- continue
- ;;
xcclinker)
func_append linker_flags " $qarg"
func_append compiler_flags " $qarg"
@@ -7276,7 +7019,7 @@ func_mode_link ()
# These systems don't actually have a C library (as such)
test X-lc = "X$arg" && continue
;;
- *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig* | *-*-midnightbsd*)
+ *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*)
# Do not include libc due to us having libc/libc_r.
test X-lc = "X$arg" && continue
;;
@@ -7296,7 +7039,7 @@ func_mode_link ()
esac
elif test X-lc_r = "X$arg"; then
case $host in
- *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig* | *-*-midnightbsd*)
+ *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*)
# Do not include libc_r directly, use -pthread flag.
continue
;;
@@ -7326,20 +7069,8 @@ func_mode_link ()
prev=xcompiler
continue
;;
- # Solaris ld rejects as of 11.4. Refer to Oracle bug 22985199.
- -pthread)
- case $host in
- *solaris2*) ;;
- *)
- case "$new_inherited_linker_flags " in
- *" $arg "*) ;;
- * ) func_append new_inherited_linker_flags " $arg" ;;
- esac
- ;;
- esac
- continue
- ;;
- -mt|-mthreads|-kthread|-Kthread|-pthreads|--thread-safe \
+
+ -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \
|-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*)
func_append compiler_flags " $arg"
func_append compile_command " $arg"
@@ -7480,9 +7211,9 @@ func_mode_link ()
save_ifs=$IFS; IFS=,
for flag in $args; do
IFS=$save_ifs
- func_quote_arg pretty "$flag"
- func_append arg " $func_quote_arg_result"
- func_append compiler_flags " $func_quote_arg_result"
+ func_quote_for_eval "$flag"
+ func_append arg " $func_quote_for_eval_result"
+ func_append compiler_flags " $func_quote_for_eval_result"
done
IFS=$save_ifs
func_stripname ' ' '' "$arg"
@@ -7496,21 +7227,16 @@ func_mode_link ()
save_ifs=$IFS; IFS=,
for flag in $args; do
IFS=$save_ifs
- func_quote_arg pretty "$flag"
- func_append arg " $wl$func_quote_arg_result"
- func_append compiler_flags " $wl$func_quote_arg_result"
- func_append linker_flags " $func_quote_arg_result"
+ func_quote_for_eval "$flag"
+ func_append arg " $wl$func_quote_for_eval_result"
+ func_append compiler_flags " $wl$func_quote_for_eval_result"
+ func_append linker_flags " $func_quote_for_eval_result"
done
IFS=$save_ifs
func_stripname ' ' '' "$arg"
arg=$func_stripname_result
;;
- -Xassembler)
- prev=xassembler
- continue
- ;;
-
-Xcompiler)
prev=xcompiler
continue
@@ -7528,8 +7254,8 @@ func_mode_link ()
# -msg_* for osf cc
-msg_*)
- func_quote_arg pretty "$arg"
- arg=$func_quote_arg_result
+ func_quote_for_eval "$arg"
+ arg=$func_quote_for_eval_result
;;
# Flags to be passed through unchanged, with rationale:
@@ -7548,15 +7274,12 @@ func_mode_link ()
# -O*, -g*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization
# -specs=* GCC specs files
# -stdlib=* select c++ std lib with clang
- # -fsanitize=* Clang/GCC memory and address sanitizer
- # -fuse-ld=* Linker select flags for GCC
- # -Wa,* Pass flags directly to the assembler
-64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \
-t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \
-O*|-g*|-flto*|-fwhopr*|-fuse-linker-plugin|-fstack-protector*|-stdlib=*| \
- -specs=*|-fsanitize=*|-fuse-ld=*|-Wa,*)
- func_quote_arg pretty "$arg"
- arg=$func_quote_arg_result
+ -specs=*)
+ func_quote_for_eval "$arg"
+ arg=$func_quote_for_eval_result
func_append compile_command " $arg"
func_append finalize_command " $arg"
func_append compiler_flags " $arg"
@@ -7577,15 +7300,15 @@ func_mode_link ()
continue
else
# Otherwise treat like 'Some other compiler flag' below
- func_quote_arg pretty "$arg"
- arg=$func_quote_arg_result
+ func_quote_for_eval "$arg"
+ arg=$func_quote_for_eval_result
fi
;;
# Some other compiler flag.
-* | +*)
- func_quote_arg pretty "$arg"
- arg=$func_quote_arg_result
+ func_quote_for_eval "$arg"
+ arg=$func_quote_for_eval_result
;;
*.$objext)
@@ -7705,8 +7428,8 @@ func_mode_link ()
*)
# Unknown arguments in both finalize_command and compile_command need
# to be aesthetically quoted because they are evaled later.
- func_quote_arg pretty "$arg"
- arg=$func_quote_arg_result
+ func_quote_for_eval "$arg"
+ arg=$func_quote_for_eval_result
;;
esac # arg
@@ -8911,7 +8634,7 @@ func_mode_link ()
test CXX = "$tagname" && {
case $host_os in
linux*)
- case `$CC -V 2>&1 | $SED 5q` in
+ case `$CC -V 2>&1 | sed 5q` in
*Sun\ C*) # Sun C++ 5.9
func_suncc_cstd_abi
@@ -9084,7 +8807,7 @@ func_mode_link ()
#
case $version_type in
# correct linux to gnu/linux during the next big refactor
- darwin|freebsd-elf|linux|midnightbsd-elf|osf|windows|none)
+ darwin|freebsd-elf|linux|osf|windows|none)
func_arith $number_major + $number_minor
current=$func_arith_result
age=$number_minor
@@ -9175,7 +8898,7 @@ func_mode_link ()
versuffix=.$current.$revision
;;
- freebsd-elf | midnightbsd-elf)
+ freebsd-elf)
func_arith $current - $age
major=.$func_arith_result
versuffix=$major.$age.$revision
@@ -9401,7 +9124,7 @@ func_mode_link ()
*-*-netbsd*)
# Don't link with libc until the a.out ld.so is fixed.
;;
- *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-midnightbsd*)
+ *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
# Do not include libc due to us having libc/libc_r.
;;
*-*-sco3.2v5* | *-*-sco5v6*)
@@ -10212,8 +9935,8 @@ EOF
for cmd in $concat_cmds; do
IFS=$save_ifs
$opt_quiet || {
- func_quote_arg expand,pretty "$cmd"
- eval "func_echo $func_quote_arg_result"
+ func_quote_for_expand "$cmd"
+ eval "func_echo $func_quote_for_expand_result"
}
$opt_dry_run || eval "$cmd" || {
lt_exit=$?
@@ -10306,8 +10029,8 @@ EOF
eval cmd=\"$cmd\"
IFS=$save_ifs
$opt_quiet || {
- func_quote_arg expand,pretty "$cmd"
- eval "func_echo $func_quote_arg_result"
+ func_quote_for_expand "$cmd"
+ eval "func_echo $func_quote_for_expand_result"
}
$opt_dry_run || eval "$cmd" || {
lt_exit=$?
@@ -10781,13 +10504,12 @@ EOF
elif eval var_value=\$$var; test -z "$var_value"; then
relink_command="$var=; export $var; $relink_command"
else
- func_quote_arg pretty "$var_value"
- relink_command="$var=$func_quote_arg_result; export $var; $relink_command"
+ func_quote_for_eval "$var_value"
+ relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
fi
done
- func_quote eval cd "`pwd`"
- func_quote_arg pretty,unquoted "($func_quote_result; $relink_command)"
- relink_command=$func_quote_arg_unquoted_result
+ relink_command="(cd `pwd`; $relink_command)"
+ relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"`
fi
# Only actually do things if not in dry run mode.
@@ -11027,15 +10749,13 @@ EOF
elif eval var_value=\$$var; test -z "$var_value"; then
relink_command="$var=; export $var; $relink_command"
else
- func_quote_arg pretty,unquoted "$var_value"
- relink_command="$var=$func_quote_arg_unquoted_result; export $var; $relink_command"
+ func_quote_for_eval "$var_value"
+ relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
fi
done
# Quote the link command for shipping.
- func_quote eval cd "`pwd`"
- relink_command="($func_quote_result; $SHELL \"$progpath\" $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)"
- func_quote_arg pretty,unquoted "$relink_command"
- relink_command=$func_quote_arg_unquoted_result
+ relink_command="(cd `pwd`; $SHELL \"$progpath\" $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)"
+ relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"`
if test yes = "$hardcode_automatic"; then
relink_command=
fi
diff --git a/pythonmod/doc/modules/config.rst b/pythonmod/doc/modules/config.rst
index ac4db4c94af2..64480c94d66f 100644
--- a/pythonmod/doc/modules/config.rst
+++ b/pythonmod/doc/modules/config.rst
@@ -176,6 +176,10 @@ config_file
Harden against spoofed glue (out of zone data).
+ .. attribute:: harden_unverified_glue
+
+ Harden against unverified glue.
+
.. attribute:: harden_dnssec_stripped
Harden against receiving no DNSSEC data for trust anchor.
diff --git a/pythonmod/interface.i b/pythonmod/interface.i
index c876ab0729d2..810b1449d34e 100644
--- a/pythonmod/interface.i
+++ b/pythonmod/interface.i
@@ -1009,6 +1009,7 @@ struct config_file {
int harden_short_bufsize;
int harden_large_queries;
int harden_glue;
+ int harden_unverified_glue;
int harden_dnssec_stripped;
int harden_referral_path;
int use_caps_bits_for_id;
diff --git a/services/authzone.c b/services/authzone.c
index 580a681f57ce..6f6c55d4397d 100644
--- a/services/authzone.c
+++ b/services/authzone.c
@@ -3684,6 +3684,29 @@ auth_zone_parse_notify_serial(sldns_buffer* pkt, uint32_t *serial)
return 1;
}
+/** print addr to str, and if not 53, append "@port_number", for logs. */
+static void addr_port_to_str(struct sockaddr_storage* addr, socklen_t addrlen,
+ char* buf, size_t len)
+{
+ uint16_t port = 0;
+ if(addr_is_ip6(addr, addrlen)) {
+ struct sockaddr_in6* sa = (struct sockaddr_in6*)addr;
+ port = ntohs((uint16_t)sa->sin6_port);
+ } else {
+ struct sockaddr_in* sa = (struct sockaddr_in*)addr;
+ port = ntohs((uint16_t)sa->sin_port);
+ }
+ if(port == UNBOUND_DNS_PORT) {
+ /* If it is port 53, print it plainly. */
+ addr_to_str(addr, addrlen, buf, len);
+ } else {
+ char a[256];
+ a[0]=0;
+ addr_to_str(addr, addrlen, a, sizeof(a));
+ snprintf(buf, len, "%s@%d", a, (int)port);
+ }
+}
+
/** see if addr appears in the list */
static int
addr_in_list(struct auth_addr* list, struct sockaddr_storage* addr,
@@ -5516,7 +5539,7 @@ xfr_transfer_init_fetch(struct auth_xfer* xfr, struct module_env* env)
if(!xfr->task_transfer->cp) {
char zname[255+1], as[256];
dname_str(xfr->name, zname);
- addr_to_str(&addr, addrlen, as, sizeof(as));
+ addr_port_to_str(&addr, addrlen, as, sizeof(as));
verbose(VERB_ALGO, "cannot create http cp "
"connection for %s to %s", zname, as);
return 0;
@@ -5525,7 +5548,7 @@ xfr_transfer_init_fetch(struct auth_xfer* xfr, struct module_env* env)
if(verbosity >= VERB_ALGO) {
char zname[255+1], as[256];
dname_str(xfr->name, zname);
- addr_to_str(&addr, addrlen, as, sizeof(as));
+ addr_port_to_str(&addr, addrlen, as, sizeof(as));
verbose(VERB_ALGO, "auth zone %s transfer next HTTP fetch from %s started", zname, as);
}
/* Create or refresh the list of allow_notify addrs */
@@ -5548,7 +5571,7 @@ xfr_transfer_init_fetch(struct auth_xfer* xfr, struct module_env* env)
if(!xfr->task_transfer->cp) {
char zname[255+1], as[256];
dname_str(xfr->name, zname);
- addr_to_str(&addr, addrlen, as, sizeof(as));
+ addr_port_to_str(&addr, addrlen, as, sizeof(as));
verbose(VERB_ALGO, "cannot create tcp cp connection for "
"xfr %s to %s", zname, as);
return 0;
@@ -5557,7 +5580,7 @@ xfr_transfer_init_fetch(struct auth_xfer* xfr, struct module_env* env)
if(verbosity >= VERB_ALGO) {
char zname[255+1], as[256];
dname_str(xfr->name, zname);
- addr_to_str(&addr, addrlen, as, sizeof(as));
+ addr_port_to_str(&addr, addrlen, as, sizeof(as));
verbose(VERB_ALGO, "auth zone %s transfer next %s fetch from %s started", zname,
(xfr->task_transfer->on_ixfr?"IXFR":"AXFR"), as);
}
@@ -5660,7 +5683,7 @@ xfr_master_add_addrs(struct auth_master* m, struct ub_packed_rrset_key* rrset,
}
if(verbosity >= VERB_ALGO) {
char s[64];
- addr_to_str(&a->addr, a->addrlen, s, sizeof(s));
+ addr_port_to_str(&a->addr, a->addrlen, s, sizeof(s));
verbose(VERB_ALGO, "auth host %s lookup %s",
m->host, s);
}
@@ -6406,7 +6429,7 @@ xfr_probe_send_probe(struct auth_xfer* xfr, struct module_env* env,
if(!xfr->task_probe->cp) {
char zname[255+1], as[256];
dname_str(xfr->name, zname);
- addr_to_str(&addr, addrlen, as, sizeof(as));
+ addr_port_to_str(&addr, addrlen, as, sizeof(as));
verbose(VERB_ALGO, "cannot create udp cp for "
"probe %s to %s", zname, as);
return 0;
@@ -6426,7 +6449,7 @@ xfr_probe_send_probe(struct auth_xfer* xfr, struct module_env* env,
(struct sockaddr*)&addr, addrlen, 0)) {
char zname[255+1], as[256];
dname_str(xfr->name, zname);
- addr_to_str(&addr, addrlen, as, sizeof(as));
+ addr_port_to_str(&addr, addrlen, as, sizeof(as));
verbose(VERB_ALGO, "failed to send soa probe for %s to %s",
zname, as);
return 0;
@@ -6434,7 +6457,7 @@ xfr_probe_send_probe(struct auth_xfer* xfr, struct module_env* env,
if(verbosity >= VERB_ALGO) {
char zname[255+1], as[256];
dname_str(xfr->name, zname);
- addr_to_str(&addr, addrlen, as, sizeof(as));
+ addr_port_to_str(&addr, addrlen, as, sizeof(as));
verbose(VERB_ALGO, "auth zone %s soa probe sent to %s", zname,
as);
}
diff --git a/services/cache/dns.c b/services/cache/dns.c
index 5e74c31693b3..7ab63bacf492 100644
--- a/services/cache/dns.c
+++ b/services/cache/dns.c
@@ -88,7 +88,7 @@ store_rrsets(struct module_env* env, struct reply_info* rep, time_t now,
/* update ref if it was in the cache */
switch(rrset_cache_update(env->rrset_cache, &rep->ref[i],
env->alloc, ((ntohs(rep->ref[i].key->rk.type)==
- LDNS_RR_TYPE_NS && !pside)?qstarttime:now + leeway))) {
+ LDNS_RR_TYPE_NS && !pside)?qstarttime:now) + leeway)) {
case 0: /* ref unchanged, item inserted */
break;
case 2: /* ref updated, cache is superior */
@@ -162,7 +162,7 @@ dns_cache_store_msg(struct module_env* env, struct query_info* qinfo,
size_t i;
/* store RRsets */
- for(i=0; i<rep->rrset_count; i++) {
+ for(i=0; i<rep->rrset_count; i++) {
rep->ref[i].key = rep->rrsets[i];
rep->ref[i].id = rep->rrsets[i]->id;
}
@@ -197,6 +197,7 @@ dns_cache_store_msg(struct module_env* env, struct query_info* qinfo,
reply_info_sortref(rep);
if(!(e = query_info_entrysetup(qinfo, rep, hash))) {
log_err("store_msg: malloc failed");
+ reply_info_delete(rep, NULL);
return;
}
slabhash_insert(env->msg_cache, hash, &e->entry, rep, env->alloc);
@@ -365,7 +366,7 @@ find_add_addrs(struct module_env* env, uint16_t qclass,
/** find and add A and AAAA records for missing nameservers in delegpt */
int
cache_fill_missing(struct module_env* env, uint16_t qclass,
- struct regional* region, struct delegpt* dp)
+ struct regional* region, struct delegpt* dp, uint32_t flags)
{
struct delegpt_ns* ns;
struct msgreply_entry* neg;
@@ -376,7 +377,7 @@ cache_fill_missing(struct module_env* env, uint16_t qclass,
continue;
ns->cache_lookup_count++;
akey = rrset_cache_lookup(env->rrset_cache, ns->name,
- ns->namelen, LDNS_RR_TYPE_A, qclass, 0, now, 0);
+ ns->namelen, LDNS_RR_TYPE_A, qclass, flags, now, 0);
if(akey) {
if(!delegpt_add_rrset_A(dp, region, akey, ns->lame,
NULL)) {
@@ -397,7 +398,7 @@ cache_fill_missing(struct module_env* env, uint16_t qclass,
}
}
akey = rrset_cache_lookup(env->rrset_cache, ns->name,
- ns->namelen, LDNS_RR_TYPE_AAAA, qclass, 0, now, 0);
+ ns->namelen, LDNS_RR_TYPE_AAAA, qclass, flags, now, 0);
if(akey) {
if(!delegpt_add_rrset_AAAA(dp, region, akey, ns->lame,
NULL)) {
@@ -607,22 +608,8 @@ tomsg(struct module_env* env, struct query_info* q, struct reply_info* r,
time_t now_control = now;
if(now > r->ttl) {
/* Check if we are allowed to serve expired */
- if(allow_expired) {
- if(env->cfg->serve_expired_ttl &&
- r->serve_expired_ttl < now) {
- return NULL;
- }
- /* Ignore expired failure answers */
- if(FLAGS_GET_RCODE(r->flags) !=
- LDNS_RCODE_NOERROR &&
- FLAGS_GET_RCODE(r->flags) !=
- LDNS_RCODE_NXDOMAIN &&
- FLAGS_GET_RCODE(r->flags) !=
- LDNS_RCODE_YXDOMAIN)
- return 0;
- } else {
+ if(!allow_expired || !reply_info_can_answer_expired(r, now))
return NULL;
- }
/* Change the current time so we can pass the below TTL checks when
* serving expired data. */
now_control = r->ttl - env->cfg->serve_expired_reply_ttl;
@@ -641,6 +628,7 @@ tomsg(struct module_env* env, struct query_info* q, struct reply_info* r,
else
msg->rep->prefetch_ttl = PREFETCH_TTL_CALC(msg->rep->ttl);
msg->rep->serve_expired_ttl = msg->rep->ttl + SERVE_EXPIRED_TTL;
+ msg->rep->serve_expired_norec_ttl = 0;
msg->rep->security = r->security;
msg->rep->an_numrrsets = r->an_numrrsets;
msg->rep->ns_numrrsets = r->ns_numrrsets;
@@ -724,6 +712,7 @@ rrset_msg(struct ub_packed_rrset_key* rrset, struct regional* region,
msg->rep->ttl = d->ttl - now;
msg->rep->prefetch_ttl = PREFETCH_TTL_CALC(msg->rep->ttl);
msg->rep->serve_expired_ttl = msg->rep->ttl + SERVE_EXPIRED_TTL;
+ msg->rep->serve_expired_norec_ttl = 0;
msg->rep->security = sec_status_unchecked;
msg->rep->an_numrrsets = 1;
msg->rep->ns_numrrsets = 0;
@@ -763,6 +752,7 @@ synth_dname_msg(struct ub_packed_rrset_key* rrset, struct regional* region,
msg->rep->ttl = d->ttl - now;
msg->rep->prefetch_ttl = PREFETCH_TTL_CALC(msg->rep->ttl);
msg->rep->serve_expired_ttl = msg->rep->ttl + SERVE_EXPIRED_TTL;
+ msg->rep->serve_expired_norec_ttl = 0;
msg->rep->security = sec_status_unchecked;
msg->rep->an_numrrsets = 1;
msg->rep->ns_numrrsets = 0;
@@ -1070,6 +1060,35 @@ dns_cache_store(struct module_env* env, struct query_info* msgqinf,
struct regional* region, uint32_t flags, time_t qstarttime)
{
struct reply_info* rep = NULL;
+ if(SERVE_EXPIRED) {
+ /* We are serving expired records. Before caching, check if a
+ * useful expired record exists. */
+ struct msgreply_entry* e = msg_cache_lookup(env,
+ msgqinf->qname, msgqinf->qname_len, msgqinf->qtype,
+ msgqinf->qclass, flags, 0, 0);
+ if(e) {
+ struct reply_info* cached = e->entry.data;
+ if(cached->ttl < *env->now
+ && reply_info_could_use_expired(cached, *env->now)
+ /* If we are validating make sure only
+ * validating modules can update such messages.
+ * In that case don't cache it and let a
+ * subsequent module handle the caching. For
+ * example, the iterator should not replace an
+ * expired secure answer with a fresh unchecked
+ * one and let the validator manage caching. */
+ && cached->security != sec_status_bogus
+ && (env->need_to_validate &&
+ msgrep->security == sec_status_unchecked)) {
+ verbose(VERB_ALGO, "a validated expired entry "
+ "could be overwritten, skip caching "
+ "the new message at this stage");
+ lock_rw_unlock(&e->entry.lock);
+ return 1;
+ }
+ lock_rw_unlock(&e->entry.lock);
+ }
+ }
/* alloc, malloc properly (not in region, like msg is) */
rep = reply_info_copy(msgrep, env->alloc, NULL);
if(!rep)
diff --git a/services/cache/dns.h b/services/cache/dns.h
index c2bf23c6de54..1dd537d2bd5d 100644
--- a/services/cache/dns.h
+++ b/services/cache/dns.h
@@ -202,10 +202,11 @@ struct dns_msg* dns_cache_lookup(struct module_env* env,
* @param qclass: which class to look in.
* @param region: where to store new dp info.
* @param dp: delegation point to fill missing entries.
+ * @param flags: rrset flags, or 0.
* @return false on alloc failure.
*/
int cache_fill_missing(struct module_env* env, uint16_t qclass,
- struct regional* region, struct delegpt* dp);
+ struct regional* region, struct delegpt* dp, uint32_t flags);
/**
* Utility, create new, unpacked data structure for cache response.
diff --git a/services/cache/rrset.c b/services/cache/rrset.c
index 2c03214c8fe2..a05ae5a56b78 100644
--- a/services/cache/rrset.c
+++ b/services/cache/rrset.c
@@ -128,8 +128,8 @@ need_to_update_rrset(void* nd, void* cd, time_t timenow, int equal, int ns)
{
struct packed_rrset_data* newd = (struct packed_rrset_data*)nd;
struct packed_rrset_data* cached = (struct packed_rrset_data*)cd;
- /* o if new data is expired, current data is better */
- if( newd->ttl < timenow && cached->ttl >= timenow)
+ /* o if new data is expired, cached data is better */
+ if( newd->ttl < timenow && timenow <= cached->ttl)
return 0;
/* o store if rrset has been validated
* everything better than bogus data
@@ -140,9 +140,9 @@ need_to_update_rrset(void* nd, void* cd, time_t timenow, int equal, int ns)
if( cached->security == sec_status_bogus &&
newd->security != sec_status_bogus && !equal)
return 1;
- /* o if current RRset is more trustworthy - insert it */
+ /* o if new RRset is more trustworthy - insert it */
if( newd->trust > cached->trust ) {
- /* if the cached rrset is bogus, and this one equal,
+ /* if the cached rrset is bogus, and new is equal,
* do not update the TTL - let it expire. */
if(equal && cached->ttl >= timenow &&
cached->security == sec_status_bogus)
@@ -155,7 +155,7 @@ need_to_update_rrset(void* nd, void* cd, time_t timenow, int equal, int ns)
/* o same trust, but different in data - insert it */
if( newd->trust == cached->trust && !equal ) {
/* if this is type NS, do not 'stick' to owner that changes
- * the NS RRset, but use the old TTL for the new data, and
+ * the NS RRset, but use the cached TTL for the new data, and
* update to fetch the latest data. ttl is not expired, because
* that check was before this one. */
if(ns) {
diff --git a/services/listen_dnsport.c b/services/listen_dnsport.c
index 6c0691f2a73c..5dbac3650aaf 100644
--- a/services/listen_dnsport.c
+++ b/services/listen_dnsport.c
@@ -56,9 +56,11 @@
#include "util/net_help.h"
#include "sldns/sbuffer.h"
#include "sldns/parseutil.h"
+#include "sldns/wire2str.h"
#include "services/mesh.h"
#include "util/fptr_wlist.h"
#include "util/locks.h"
+#include "util/timeval_func.h"
#ifdef HAVE_NETDB_H
#include <netdb.h>
@@ -79,9 +81,30 @@
#ifdef HAVE_NET_IF_H
#include <net/if.h>
#endif
+
+#ifdef HAVE_TIME_H
+#include <time.h>
+#endif
+#include <sys/time.h>
+
+#ifdef HAVE_NGTCP2
+#include <ngtcp2/ngtcp2.h>
+#include <ngtcp2/ngtcp2_crypto.h>
+#ifdef HAVE_NGTCP2_NGTCP2_CRYPTO_QUICTLS_H
+#include <ngtcp2/ngtcp2_crypto_quictls.h>
+#else
+#include <ngtcp2/ngtcp2_crypto_openssl.h>
+#endif
+#endif
+
+#ifdef HAVE_OPENSSL_SSL_H
+#include <openssl/ssl.h>
+#endif
+
#ifdef HAVE_LINUX_NET_TSTAMP_H
#include <linux/net_tstamp.h>
#endif
+
/** number of queued TCP connections for listen() */
#define TCP_BACKLOG 256
@@ -109,9 +132,11 @@ static int http2_response_buffer_lock_inited = 0;
/**
* Debug print of the getaddrinfo returned address.
* @param addr: the address returned.
+ * @param additional: additional text that describes the type of socket,
+ * or NULL for no text.
*/
static void
-verbose_print_addr(struct addrinfo *addr)
+verbose_print_addr(struct addrinfo *addr, const char* additional)
{
if(verbosity >= VERB_ALGO) {
char buf[100];
@@ -126,13 +151,14 @@ verbose_print_addr(struct addrinfo *addr)
(void)strlcpy(buf, "(null)", sizeof(buf));
}
buf[sizeof(buf)-1] = 0;
- verbose(VERB_ALGO, "creating %s%s socket %s %d",
+ verbose(VERB_ALGO, "creating %s%s socket %s %d%s%s",
addr->ai_socktype==SOCK_DGRAM?"udp":
addr->ai_socktype==SOCK_STREAM?"tcp":"otherproto",
addr->ai_family==AF_INET?"4":
addr->ai_family==AF_INET6?"6":
"_otherfam", buf,
- ntohs(((struct sockaddr_in*)addr->ai_addr)->sin_port));
+ ntohs(((struct sockaddr_in*)addr->ai_addr)->sin_port),
+ (additional?" ":""), (additional?additional:""));
}
}
@@ -673,7 +699,7 @@ create_udp_sock(int family, int socktype, struct sockaddr* addr,
int
create_tcp_accept_sock(struct addrinfo *addr, int v6only, int* noproto,
int* reuseport, int transparent, int mss, int nodelay, int freebind,
- int use_systemd, int dscp)
+ int use_systemd, int dscp, const char* additional)
{
int s = -1;
char* err;
@@ -692,7 +718,7 @@ create_tcp_accept_sock(struct addrinfo *addr, int v6only, int* noproto,
#if !defined(IP_FREEBIND)
(void)freebind;
#endif
- verbose_print_addr(addr);
+ verbose_print_addr(addr, additional);
*noproto = 0;
#ifdef HAVE_SYSTEMD
if (!use_systemd ||
@@ -1008,7 +1034,8 @@ static int
make_sock(int stype, const char* ifname, const char* port,
struct addrinfo *hints, int v6only, int* noip6, size_t rcv, size_t snd,
int* reuseport, int transparent, int tcp_mss, int nodelay, int freebind,
- int use_systemd, int dscp, struct unbound_socket* ub_sock)
+ int use_systemd, int dscp, struct unbound_socket* ub_sock,
+ const char* additional)
{
struct addrinfo *res = NULL;
int r, s, inuse, noproto;
@@ -1032,7 +1059,7 @@ make_sock(int stype, const char* ifname, const char* port,
return -1;
}
if(stype == SOCK_DGRAM) {
- verbose_print_addr(res);
+ verbose_print_addr(res, additional);
s = create_udp_sock(res->ai_family, res->ai_socktype,
(struct sockaddr*)res->ai_addr, res->ai_addrlen,
v6only, &inuse, &noproto, (int)rcv, (int)snd, 1,
@@ -1045,7 +1072,7 @@ make_sock(int stype, const char* ifname, const char* port,
} else {
s = create_tcp_accept_sock(res, v6only, &noproto, reuseport,
transparent, tcp_mss, nodelay, freebind, use_systemd,
- dscp);
+ dscp, additional);
if(s == -1 && noproto && hints->ai_family == AF_INET6){
*noip6 = 1;
}
@@ -1079,7 +1106,8 @@ static int
make_sock_port(int stype, const char* ifname, const char* port,
struct addrinfo *hints, int v6only, int* noip6, size_t rcv, size_t snd,
int* reuseport, int transparent, int tcp_mss, int nodelay, int freebind,
- int use_systemd, int dscp, struct unbound_socket* ub_sock)
+ int use_systemd, int dscp, struct unbound_socket* ub_sock,
+ const char* additional)
{
char* s = strchr(ifname, '@');
if(s) {
@@ -1102,11 +1130,11 @@ make_sock_port(int stype, const char* ifname, const char* port,
p[strlen(s+1)]=0;
return make_sock(stype, newif, p, hints, v6only, noip6, rcv,
snd, reuseport, transparent, tcp_mss, nodelay, freebind,
- use_systemd, dscp, ub_sock);
+ use_systemd, dscp, ub_sock, additional);
}
return make_sock(stype, ifname, port, hints, v6only, noip6, rcv, snd,
reuseport, transparent, tcp_mss, nodelay, freebind, use_systemd,
- dscp, ub_sock);
+ dscp, ub_sock, additional);
}
/**
@@ -1254,6 +1282,8 @@ if_is_ssl(const char* ifname, const char* port, int ssl_port,
* @param use_systemd: if true, fetch sockets from systemd.
* @param dnscrypt_port: dnscrypt service port number
* @param dscp: DSCP to use.
+ * @param quic_port: dns over quic port number.
+ * @param http_notls_downstream: if no tls is used for https downstream.
* @param sock_queue_timeout: the sock_queue_timeout from config. Seconds to
* wait to discard if UDP packets have waited for long in the socket
* buffer.
@@ -1267,7 +1297,7 @@ ports_create_if(const char* ifname, int do_auto, int do_udp, int do_tcp,
struct config_strlist* proxy_protocol_port,
int* reuseport, int transparent, int tcp_mss, int freebind,
int http2_nodelay, int use_systemd, int dnscrypt_port, int dscp,
- int sock_queue_timeout)
+ int quic_port, int http_notls_downstream, int sock_queue_timeout)
{
int s, noip6=0;
int is_https = if_is_https(ifname, port, https_port);
@@ -1275,6 +1305,8 @@ ports_create_if(const char* ifname, int do_auto, int do_udp, int do_tcp,
int is_pp2 = if_is_pp2(ifname, port, proxy_protocol_port);
int nodelay = is_https && http2_nodelay;
struct unbound_socket* ub_sock;
+ int is_doq = if_is_quic(ifname, port, quic_port);
+ const char* add = NULL;
if(!do_udp && !do_tcp)
return 0;
@@ -1286,6 +1318,9 @@ ports_create_if(const char* ifname, int do_auto, int do_udp, int do_tcp,
} else if(is_https) {
fatal_exit("PROXYv2 and DoH combination not "
"supported!");
+ } else if(is_doq) {
+ fatal_exit("PROXYv2 and DoQ combination not "
+ "supported!");
}
}
@@ -1295,7 +1330,8 @@ ports_create_if(const char* ifname, int do_auto, int do_udp, int do_tcp,
return 0;
if((s = make_sock_port(SOCK_DGRAM, ifname, port, hints, 1,
&noip6, rcv, snd, reuseport, transparent,
- tcp_mss, nodelay, freebind, use_systemd, dscp, ub_sock)) == -1) {
+ tcp_mss, nodelay, freebind, use_systemd, dscp, ub_sock,
+ (is_dnscrypt?"udpancil_dnscrypt":"udpancil"))) == -1) {
free(ub_sock->addr);
free(ub_sock);
if(noip6) {
@@ -1323,13 +1359,36 @@ ports_create_if(const char* ifname, int do_auto, int do_udp, int do_tcp,
return 0;
}
} else if(do_udp) {
+ enum listen_type udp_port_type;
ub_sock = calloc(1, sizeof(struct unbound_socket));
if(!ub_sock)
return 0;
+ if(is_dnscrypt) {
+ udp_port_type = listen_type_udp_dnscrypt;
+ add = "dnscrypt";
+ } else if(is_doq) {
+ udp_port_type = listen_type_doq;
+ add = "doq";
+ if(((strchr(ifname, '@') &&
+ atoi(strchr(ifname, '@')+1) == 53) ||
+ (!strchr(ifname, '@') && atoi(port) == 53))) {
+ log_err("DNS over QUIC is not allowed on "
+ "port 53. Port 53 is for DNS "
+ "datagrams. Error for "
+ "interface '%s'.", ifname);
+ free(ub_sock->addr);
+ free(ub_sock);
+ return 0;
+ }
+ } else {
+ udp_port_type = listen_type_udp;
+ add = NULL;
+ }
/* regular udp socket */
if((s = make_sock_port(SOCK_DGRAM, ifname, port, hints, 1,
&noip6, rcv, snd, reuseport, transparent,
- tcp_mss, nodelay, freebind, use_systemd, dscp, ub_sock)) == -1) {
+ tcp_mss, nodelay, freebind, use_systemd, dscp, ub_sock,
+ add)) == -1) {
free(ub_sock->addr);
free(ub_sock);
if(noip6) {
@@ -1338,14 +1397,25 @@ ports_create_if(const char* ifname, int do_auto, int do_udp, int do_tcp,
}
return 0;
}
- if (sock_queue_timeout && !set_recvtimestamp(s)) {
- log_warn("socket timestamping is not available");
+ if(udp_port_type == listen_type_doq) {
+ if(!set_recvpktinfo(s, hints->ai_family)) {
+ sock_close(s);
+ free(ub_sock->addr);
+ free(ub_sock);
+ return 0;
+ }
}
- if(!port_insert(list, s, is_dnscrypt
- ?listen_type_udp_dnscrypt :
- (sock_queue_timeout ?
- listen_type_udpancil:listen_type_udp),
- is_pp2, ub_sock)) {
+ if(udp_port_type == listen_type_udp && sock_queue_timeout)
+ udp_port_type = listen_type_udpancil;
+ if (sock_queue_timeout) {
+ if(!set_recvtimestamp(s)) {
+ log_warn("socket timestamping is not available");
+ } else {
+ if(udp_port_type == listen_type_udp)
+ udp_port_type = listen_type_udpancil;
+ }
+ }
+ if(!port_insert(list, s, udp_port_type, is_pp2, ub_sock)) {
sock_close(s);
free(ub_sock->addr);
free(ub_sock);
@@ -1359,17 +1429,24 @@ ports_create_if(const char* ifname, int do_auto, int do_udp, int do_tcp,
ub_sock = calloc(1, sizeof(struct unbound_socket));
if(!ub_sock)
return 0;
- if(is_ssl)
+ if(is_ssl) {
port_type = listen_type_ssl;
- else if(is_https)
+ add = "tls";
+ } else if(is_https) {
port_type = listen_type_http;
- else if(is_dnscrypt)
+ add = "https";
+ if(http_notls_downstream)
+ add = "http";
+ } else if(is_dnscrypt) {
port_type = listen_type_tcp_dnscrypt;
- else
+ add = "dnscrypt";
+ } else {
port_type = listen_type_tcp;
+ add = NULL;
+ }
if((s = make_sock_port(SOCK_STREAM, ifname, port, hints, 1,
&noip6, 0, 0, reuseport, transparent, tcp_mss, nodelay,
- freebind, use_systemd, dscp, ub_sock)) == -1) {
+ freebind, use_systemd, dscp, ub_sock, add)) == -1) {
free(ub_sock->addr);
free(ub_sock);
if(noip6) {
@@ -1446,8 +1523,10 @@ listen_create(struct comm_base* base, struct listen_port* ports,
size_t bufsize, int tcp_accept_count, int tcp_idle_timeout,
int harden_large_queries, uint32_t http_max_streams,
char* http_endpoint, int http_notls, struct tcl_list* tcp_conn_limit,
- void* sslctx, struct dt_env* dtenv, comm_point_callback_type* cb,
- void *cb_arg)
+ void* sslctx, struct dt_env* dtenv, struct doq_table* doq_table,
+ struct ub_randstate* rnd, const char* ssl_service_key,
+ const char* ssl_service_pem, struct config_file* cfg,
+ comm_point_callback_type* cb, void *cb_arg)
{
struct listen_dnsport* front = (struct listen_dnsport*)
malloc(sizeof(struct listen_dnsport));
@@ -1471,6 +1550,16 @@ listen_create(struct comm_base* base, struct listen_port* ports,
cp = comm_point_create_udp(base, ports->fd,
front->udp_buff, ports->pp2_enabled, cb,
cb_arg, ports->socket);
+ } else if(ports->ftype == listen_type_doq) {
+#ifndef HAVE_NGTCP2
+ log_warn("Unbound is not compiled with "
+ "ngtcp2. This is required to use DNS "
+ "over QUIC.");
+#endif
+ cp = comm_point_create_doq(base, ports->fd,
+ front->udp_buff, cb, cb_arg, ports->socket,
+ doq_table, rnd, ssl_service_key,
+ ssl_service_pem, cfg);
} else if(ports->ftype == listen_type_tcp ||
ports->ftype == listen_type_tcp_dnscrypt) {
cp = comm_point_create_tcp(base, ports->fd,
@@ -1858,7 +1947,9 @@ listening_ports_open(struct config_file* cfg, char** ifs, int num_ifs,
reuseport, cfg->ip_transparent,
cfg->tcp_mss, cfg->ip_freebind,
cfg->http_nodelay, cfg->use_systemd,
- cfg->dnscrypt_port, cfg->ip_dscp, cfg->sock_queue_timeout)) {
+ cfg->dnscrypt_port, cfg->ip_dscp,
+ cfg->quic_port, cfg->http_notls_downstream,
+ cfg->sock_queue_timeout)) {
listening_ports_free(list);
return NULL;
}
@@ -1875,7 +1966,9 @@ listening_ports_open(struct config_file* cfg, char** ifs, int num_ifs,
reuseport, cfg->ip_transparent,
cfg->tcp_mss, cfg->ip_freebind,
cfg->http_nodelay, cfg->use_systemd,
- cfg->dnscrypt_port, cfg->ip_dscp, cfg->sock_queue_timeout)) {
+ cfg->dnscrypt_port, cfg->ip_dscp,
+ cfg->quic_port, cfg->http_notls_downstream,
+ cfg->sock_queue_timeout)) {
listening_ports_free(list);
return NULL;
}
@@ -1894,7 +1987,9 @@ listening_ports_open(struct config_file* cfg, char** ifs, int num_ifs,
reuseport, cfg->ip_transparent,
cfg->tcp_mss, cfg->ip_freebind,
cfg->http_nodelay, cfg->use_systemd,
- cfg->dnscrypt_port, cfg->ip_dscp, cfg->sock_queue_timeout)) {
+ cfg->dnscrypt_port, cfg->ip_dscp,
+ cfg->quic_port, cfg->http_notls_downstream,
+ cfg->sock_queue_timeout)) {
listening_ports_free(list);
return NULL;
}
@@ -1910,7 +2005,9 @@ listening_ports_open(struct config_file* cfg, char** ifs, int num_ifs,
reuseport, cfg->ip_transparent,
cfg->tcp_mss, cfg->ip_freebind,
cfg->http_nodelay, cfg->use_systemd,
- cfg->dnscrypt_port, cfg->ip_dscp, cfg->sock_queue_timeout)) {
+ cfg->dnscrypt_port, cfg->ip_dscp,
+ cfg->quic_port, cfg->http_notls_downstream,
+ cfg->sock_queue_timeout)) {
listening_ports_free(list);
return NULL;
}
@@ -1928,7 +2025,9 @@ listening_ports_open(struct config_file* cfg, char** ifs, int num_ifs,
reuseport, cfg->ip_transparent,
cfg->tcp_mss, cfg->ip_freebind,
cfg->http_nodelay, cfg->use_systemd,
- cfg->dnscrypt_port, cfg->ip_dscp, cfg->sock_queue_timeout)) {
+ cfg->dnscrypt_port, cfg->ip_dscp,
+ cfg->quic_port, cfg->http_notls_downstream,
+ cfg->sock_queue_timeout)) {
listening_ports_free(list);
return NULL;
}
@@ -1944,7 +2043,9 @@ listening_ports_open(struct config_file* cfg, char** ifs, int num_ifs,
reuseport, cfg->ip_transparent,
cfg->tcp_mss, cfg->ip_freebind,
cfg->http_nodelay, cfg->use_systemd,
- cfg->dnscrypt_port, cfg->ip_dscp, cfg->sock_queue_timeout)) {
+ cfg->dnscrypt_port, cfg->ip_dscp,
+ cfg->quic_port, cfg->http_notls_downstream,
+ cfg->sock_queue_timeout)) {
listening_ports_free(list);
return NULL;
}
@@ -3154,3 +3255,2368 @@ nghttp2_session_callbacks* http2_req_callbacks_create(void)
return callbacks;
}
#endif /* HAVE_NGHTTP2 */
+
+#ifdef HAVE_NGTCP2
+struct doq_table*
+doq_table_create(struct config_file* cfg, struct ub_randstate* rnd)
+{
+ struct doq_table* table = calloc(1, sizeof(*table));
+ if(!table)
+ return NULL;
+ table->idle_timeout = ((uint64_t)cfg->tcp_idle_timeout)*
+ NGTCP2_MILLISECONDS;
+ table->sv_scidlen = 16;
+ table->static_secret_len = 16;
+ table->static_secret = malloc(table->static_secret_len);
+ if(!table->static_secret) {
+ free(table);
+ return NULL;
+ }
+ doq_fill_rand(rnd, table->static_secret, table->static_secret_len);
+ table->conn_tree = rbtree_create(doq_conn_cmp);
+ if(!table->conn_tree) {
+ free(table->static_secret);
+ free(table);
+ return NULL;
+ }
+ table->conid_tree = rbtree_create(doq_conid_cmp);
+ if(!table->conid_tree) {
+ free(table->static_secret);
+ free(table->conn_tree);
+ free(table);
+ return NULL;
+ }
+ table->timer_tree = rbtree_create(doq_timer_cmp);
+ if(!table->timer_tree) {
+ free(table->static_secret);
+ free(table->conn_tree);
+ free(table->conid_tree);
+ free(table);
+ return NULL;
+ }
+ lock_rw_init(&table->lock);
+ lock_rw_init(&table->conid_lock);
+ lock_basic_init(&table->size_lock);
+ lock_protect(&table->lock, &table->static_secret,
+ sizeof(table->static_secret));
+ lock_protect(&table->lock, &table->static_secret_len,
+ sizeof(table->static_secret_len));
+ lock_protect(&table->lock, table->static_secret,
+ table->static_secret_len);
+ lock_protect(&table->lock, &table->sv_scidlen,
+ sizeof(table->sv_scidlen));
+ lock_protect(&table->lock, &table->idle_timeout,
+ sizeof(table->idle_timeout));
+ lock_protect(&table->lock, &table->conn_tree, sizeof(table->conn_tree));
+ lock_protect(&table->lock, table->conn_tree, sizeof(*table->conn_tree));
+ lock_protect(&table->conid_lock, table->conid_tree,
+ sizeof(*table->conid_tree));
+ lock_protect(&table->lock, table->timer_tree,
+ sizeof(*table->timer_tree));
+ lock_protect(&table->size_lock, &table->current_size,
+ sizeof(table->current_size));
+ return table;
+}
+
+/** delete elements from the connection tree */
+static void
+conn_tree_del(rbnode_type* node, void* arg)
+{
+ struct doq_table* table = (struct doq_table*)arg;
+ struct doq_conn* conn;
+ if(!node)
+ return;
+ conn = (struct doq_conn*)node->key;
+ if(conn->timer.timer_in_list) {
+ /* Remove timer from list first, because finding the rbnode
+ * element of the setlist of same timeouts needs tree lookup.
+ * Edit the tree structure after that lookup. */
+ doq_timer_list_remove(conn->table, &conn->timer);
+ }
+ if(conn->timer.timer_in_tree)
+ doq_timer_tree_remove(conn->table, &conn->timer);
+ doq_table_quic_size_subtract(table, sizeof(*conn)+conn->key.dcidlen);
+ doq_conn_delete(conn, table);
+}
+
+/** delete elements from the connection id tree */
+static void
+conid_tree_del(rbnode_type* node, void* ATTR_UNUSED(arg))
+{
+ if(!node)
+ return;
+ doq_conid_delete((struct doq_conid*)node->key);
+}
+
+void
+doq_table_delete(struct doq_table* table)
+{
+ if(!table)
+ return;
+ lock_rw_destroy(&table->lock);
+ free(table->static_secret);
+ if(table->conn_tree) {
+ traverse_postorder(table->conn_tree, conn_tree_del, table);
+ free(table->conn_tree);
+ }
+ lock_rw_destroy(&table->conid_lock);
+ if(table->conid_tree) {
+ /* The tree should be empty, because the doq_conn_delete calls
+ * above should have also removed their conid elements. */
+ traverse_postorder(table->conid_tree, conid_tree_del, NULL);
+ free(table->conid_tree);
+ }
+ lock_basic_destroy(&table->size_lock);
+ if(table->timer_tree) {
+ /* The tree should be empty, because the conn_tree_del calls
+ * above should also have removed them. Also the doq_timer
+ * is part of the doq_conn struct, so is already freed. */
+ free(table->timer_tree);
+ }
+ table->write_list_first = NULL;
+ table->write_list_last = NULL;
+ free(table);
+}
+
+struct doq_timer*
+doq_timer_find_time(struct doq_table* table, struct timeval* tv)
+{
+ struct doq_timer key;
+ struct rbnode_type* node;
+ memset(&key, 0, sizeof(key));
+ key.time.tv_sec = tv->tv_sec;
+ key.time.tv_usec = tv->tv_usec;
+ node = rbtree_search(table->timer_tree, &key);
+ if(node)
+ return (struct doq_timer*)node->key;
+ return NULL;
+}
+
+void
+doq_timer_tree_remove(struct doq_table* table, struct doq_timer* timer)
+{
+ if(!timer->timer_in_tree)
+ return;
+ rbtree_delete(table->timer_tree, timer);
+ timer->timer_in_tree = 0;
+ /* This item could have more timers in the same set. */
+ if(timer->setlist_first) {
+ struct doq_timer* rb_timer = timer->setlist_first;
+ /* del first element from setlist */
+ if(rb_timer->setlist_next)
+ rb_timer->setlist_next->setlist_prev = NULL;
+ else
+ timer->setlist_last = NULL;
+ timer->setlist_first = rb_timer->setlist_next;
+ rb_timer->setlist_prev = NULL;
+ rb_timer->setlist_next = NULL;
+ rb_timer->timer_in_list = 0;
+ /* insert it into the tree as new rb element */
+ memset(&rb_timer->node, 0, sizeof(rb_timer->node));
+ rb_timer->node.key = rb_timer;
+ rbtree_insert(table->timer_tree, &rb_timer->node);
+ rb_timer->timer_in_tree = 1;
+ /* the setlist, if any remainder, moves to the rb element */
+ rb_timer->setlist_first = timer->setlist_first;
+ rb_timer->setlist_last = timer->setlist_last;
+ timer->setlist_first = NULL;
+ timer->setlist_last = NULL;
+ rb_timer->worker_doq_socket = timer->worker_doq_socket;
+ }
+ timer->worker_doq_socket = NULL;
+}
+
+void
+doq_timer_list_remove(struct doq_table* table, struct doq_timer* timer)
+{
+ struct doq_timer* rb_timer;
+ if(!timer->timer_in_list)
+ return;
+ /* The item in the rbtree has the list start and end. */
+ rb_timer = doq_timer_find_time(table, &timer->time);
+ if(rb_timer) {
+ if(timer->setlist_prev)
+ timer->setlist_prev->setlist_next = timer->setlist_next;
+ else
+ rb_timer->setlist_first = timer->setlist_next;
+ if(timer->setlist_next)
+ timer->setlist_next->setlist_prev = timer->setlist_prev;
+ else
+ rb_timer->setlist_last = timer->setlist_prev;
+ timer->setlist_prev = NULL;
+ timer->setlist_next = NULL;
+ }
+ timer->timer_in_list = 0;
+}
+
+/** doq append timer to setlist */
+static void
+doq_timer_list_append(struct doq_timer* rb_timer, struct doq_timer* timer)
+{
+ log_assert(timer->timer_in_list == 0);
+ timer->timer_in_list = 1;
+ timer->setlist_next = NULL;
+ timer->setlist_prev = rb_timer->setlist_last;
+ if(rb_timer->setlist_last)
+ rb_timer->setlist_last->setlist_next = timer;
+ else
+ rb_timer->setlist_first = timer;
+ rb_timer->setlist_last = timer;
+}
+
+void
+doq_timer_unset(struct doq_table* table, struct doq_timer* timer)
+{
+ if(timer->timer_in_list) {
+ /* Remove timer from list first, because finding the rbnode
+ * element of the setlist of same timeouts needs tree lookup.
+ * Edit the tree structure after that lookup. */
+ doq_timer_list_remove(table, timer);
+ }
+ if(timer->timer_in_tree)
+ doq_timer_tree_remove(table, timer);
+ timer->worker_doq_socket = NULL;
+}
+
+void doq_timer_set(struct doq_table* table, struct doq_timer* timer,
+ struct doq_server_socket* worker_doq_socket, struct timeval* tv)
+{
+ struct doq_timer* rb_timer;
+ if(verbosity >= VERB_ALGO && timer->conn) {
+ char a[256];
+ struct timeval rel;
+ addr_to_str((void*)&timer->conn->key.paddr.addr,
+ timer->conn->key.paddr.addrlen, a, sizeof(a));
+ timeval_subtract(&rel, tv, worker_doq_socket->now_tv);
+ verbose(VERB_ALGO, "doq %s timer set %d.%6.6d in %d.%6.6d",
+ a, (int)tv->tv_sec, (int)tv->tv_usec,
+ (int)rel.tv_sec, (int)rel.tv_usec);
+ }
+ if(timer->timer_in_tree || timer->timer_in_list) {
+ if(timer->time.tv_sec == tv->tv_sec &&
+ timer->time.tv_usec == tv->tv_usec)
+ return; /* already set on that time */
+ doq_timer_unset(table, timer);
+ }
+ timer->time.tv_sec = tv->tv_sec;
+ timer->time.tv_usec = tv->tv_usec;
+ rb_timer = doq_timer_find_time(table, tv);
+ if(rb_timer) {
+ /* There is a timeout already with this value. Timer is
+ * added to the setlist. */
+ doq_timer_list_append(rb_timer, timer);
+ } else {
+ /* There is no timeout with this value. Make timer a new
+ * tree element. */
+ memset(&timer->node, 0, sizeof(timer->node));
+ timer->node.key = timer;
+ rbtree_insert(table->timer_tree, &timer->node);
+ timer->timer_in_tree = 1;
+ timer->setlist_first = NULL;
+ timer->setlist_last = NULL;
+ timer->worker_doq_socket = worker_doq_socket;
+ }
+}
+
+struct doq_conn*
+doq_conn_create(struct comm_point* c, struct doq_pkt_addr* paddr,
+ const uint8_t* dcid, size_t dcidlen, uint32_t version)
+{
+ struct doq_conn* conn = calloc(1, sizeof(*conn));
+ if(!conn)
+ return NULL;
+ conn->node.key = conn;
+ conn->doq_socket = c->doq_socket;
+ conn->table = c->doq_socket->table;
+ memmove(&conn->key.paddr.addr, &paddr->addr, paddr->addrlen);
+ conn->key.paddr.addrlen = paddr->addrlen;
+ memmove(&conn->key.paddr.localaddr, &paddr->localaddr,
+ paddr->localaddrlen);
+ conn->key.paddr.localaddrlen = paddr->localaddrlen;
+ conn->key.paddr.ifindex = paddr->ifindex;
+ conn->key.dcid = memdup((void*)dcid, dcidlen);
+ if(!conn->key.dcid) {
+ free(conn);
+ return NULL;
+ }
+ conn->key.dcidlen = dcidlen;
+ conn->version = version;
+#ifdef HAVE_NGTCP2_CCERR_DEFAULT
+ ngtcp2_ccerr_default(&conn->ccerr);
+#else
+ ngtcp2_connection_close_error_default(&conn->last_error);
+#endif
+ rbtree_init(&conn->stream_tree, &doq_stream_cmp);
+ conn->timer.conn = conn;
+ lock_basic_init(&conn->lock);
+ lock_protect(&conn->lock, &conn->key, sizeof(conn->key));
+ lock_protect(&conn->lock, &conn->doq_socket, sizeof(conn->doq_socket));
+ lock_protect(&conn->lock, &conn->table, sizeof(conn->table));
+ lock_protect(&conn->lock, &conn->is_deleted, sizeof(conn->is_deleted));
+ lock_protect(&conn->lock, &conn->version, sizeof(conn->version));
+ lock_protect(&conn->lock, &conn->conn, sizeof(conn->conn));
+ lock_protect(&conn->lock, &conn->conid_list, sizeof(conn->conid_list));
+#ifdef HAVE_NGTCP2_CCERR_DEFAULT
+ lock_protect(&conn->lock, &conn->ccerr, sizeof(conn->ccerr));
+#else
+ lock_protect(&conn->lock, &conn->last_error, sizeof(conn->last_error));
+#endif
+ lock_protect(&conn->lock, &conn->tls_alert, sizeof(conn->tls_alert));
+ lock_protect(&conn->lock, &conn->ssl, sizeof(conn->ssl));
+ lock_protect(&conn->lock, &conn->close_pkt, sizeof(conn->close_pkt));
+ lock_protect(&conn->lock, &conn->close_pkt_len, sizeof(conn->close_pkt_len));
+ lock_protect(&conn->lock, &conn->close_ecn, sizeof(conn->close_ecn));
+ lock_protect(&conn->lock, &conn->stream_tree, sizeof(conn->stream_tree));
+ lock_protect(&conn->lock, &conn->stream_write_first, sizeof(conn->stream_write_first));
+ lock_protect(&conn->lock, &conn->stream_write_last, sizeof(conn->stream_write_last));
+ lock_protect(&conn->lock, &conn->write_interest, sizeof(conn->write_interest));
+ lock_protect(&conn->lock, &conn->on_write_list, sizeof(conn->on_write_list));
+ lock_protect(&conn->lock, &conn->write_prev, sizeof(conn->write_prev));
+ lock_protect(&conn->lock, &conn->write_next, sizeof(conn->write_next));
+ return conn;
+}
+
+/** delete stream tree node */
+static void
+stream_tree_del(rbnode_type* node, void* arg)
+{
+ struct doq_table* table = (struct doq_table*)arg;
+ struct doq_stream* stream;
+ if(!node)
+ return;
+ stream = (struct doq_stream*)node;
+ if(stream->in)
+ doq_table_quic_size_subtract(table, stream->inlen);
+ if(stream->out)
+ doq_table_quic_size_subtract(table, stream->outlen);
+ doq_table_quic_size_subtract(table, sizeof(*stream));
+ doq_stream_delete(stream);
+}
+
+void
+doq_conn_delete(struct doq_conn* conn, struct doq_table* table)
+{
+ if(!conn)
+ return;
+ lock_basic_destroy(&conn->lock);
+ lock_rw_wrlock(&conn->table->conid_lock);
+ doq_conn_clear_conids(conn);
+ lock_rw_unlock(&conn->table->conid_lock);
+ ngtcp2_conn_del(conn->conn);
+ if(conn->stream_tree.count != 0) {
+ traverse_postorder(&conn->stream_tree, stream_tree_del, table);
+ }
+ free(conn->key.dcid);
+ SSL_free(conn->ssl);
+ free(conn->close_pkt);
+ free(conn);
+}
+
+int
+doq_conn_cmp(const void* key1, const void* key2)
+{
+ struct doq_conn* c = (struct doq_conn*)key1;
+ struct doq_conn* d = (struct doq_conn*)key2;
+ int r;
+ /* Compared in the order destination address, then
+ * local address, ifindex and then dcid.
+ * So that for a search for findlessorequal for the destination
+ * address will find connections to that address, with different
+ * dcids.
+ * Also a printout in sorted order prints the connections by IP
+ * address of destination, and then a number of them depending on the
+ * dcids. */
+ if(c->key.paddr.addrlen != d->key.paddr.addrlen) {
+ if(c->key.paddr.addrlen < d->key.paddr.addrlen)
+ return -1;
+ return 1;
+ }
+ if((r=memcmp(&c->key.paddr.addr, &d->key.paddr.addr,
+ c->key.paddr.addrlen))!=0)
+ return r;
+ if(c->key.paddr.localaddrlen != d->key.paddr.localaddrlen) {
+ if(c->key.paddr.localaddrlen < d->key.paddr.localaddrlen)
+ return -1;
+ return 1;
+ }
+ if((r=memcmp(&c->key.paddr.localaddr, &d->key.paddr.localaddr,
+ c->key.paddr.localaddrlen))!=0)
+ return r;
+ if(c->key.paddr.ifindex != d->key.paddr.ifindex) {
+ if(c->key.paddr.ifindex < d->key.paddr.ifindex)
+ return -1;
+ return 1;
+ }
+ if(c->key.dcidlen != d->key.dcidlen) {
+ if(c->key.dcidlen < d->key.dcidlen)
+ return -1;
+ return 1;
+ }
+ if((r=memcmp(c->key.dcid, d->key.dcid, c->key.dcidlen))!=0)
+ return r;
+ return 0;
+}
+
+int doq_conid_cmp(const void* key1, const void* key2)
+{
+ struct doq_conid* c = (struct doq_conid*)key1;
+ struct doq_conid* d = (struct doq_conid*)key2;
+ if(c->cidlen != d->cidlen) {
+ if(c->cidlen < d->cidlen)
+ return -1;
+ return 1;
+ }
+ return memcmp(c->cid, d->cid, c->cidlen);
+}
+
+int doq_timer_cmp(const void* key1, const void* key2)
+{
+ struct doq_timer* e = (struct doq_timer*)key1;
+ struct doq_timer* f = (struct doq_timer*)key2;
+ if(e->time.tv_sec < f->time.tv_sec)
+ return -1;
+ if(e->time.tv_sec > f->time.tv_sec)
+ return 1;
+ if(e->time.tv_usec < f->time.tv_usec)
+ return -1;
+ if(e->time.tv_usec > f->time.tv_usec)
+ return 1;
+ return 0;
+}
+
+int doq_stream_cmp(const void* key1, const void* key2)
+{
+ struct doq_stream* c = (struct doq_stream*)key1;
+ struct doq_stream* d = (struct doq_stream*)key2;
+ if(c->stream_id != d->stream_id) {
+ if(c->stream_id < d->stream_id)
+ return -1;
+ return 1;
+ }
+ return 0;
+}
+
+/** doq store a local address in repinfo */
+static void
+doq_repinfo_store_localaddr(struct comm_reply* repinfo,
+ struct doq_addr_storage* localaddr, socklen_t localaddrlen)
+{
+ /* use the pktinfo that we have for ancillary udp data otherwise,
+ * this saves space for a sockaddr */
+ memset(&repinfo->pktinfo, 0, sizeof(repinfo->pktinfo));
+ if(addr_is_ip6((void*)localaddr, localaddrlen)) {
+#ifdef IPV6_PKTINFO
+ struct sockaddr_in6* sa6 = (struct sockaddr_in6*)localaddr;
+ memmove(&repinfo->pktinfo.v6info.ipi6_addr,
+ &sa6->sin6_addr, sizeof(struct in6_addr));
+ repinfo->doq_srcport = sa6->sin6_port;
+#endif
+ repinfo->srctype = 6;
+ } else {
+#ifdef IP_PKTINFO
+ struct sockaddr_in* sa = (struct sockaddr_in*)localaddr;
+ memmove(&repinfo->pktinfo.v4info.ipi_addr,
+ &sa->sin_addr, sizeof(struct in_addr));
+ repinfo->doq_srcport = sa->sin_port;
+#elif defined(IP_RECVDSTADDR)
+ struct sockaddr_in* sa = (struct sockaddr_in*)localaddr;
+ memmove(&repinfo->pktinfo.v4addr, &sa->sin_addr,
+ sizeof(struct in_addr));
+ repinfo->doq_srcport = sa->sin_port;
+#endif
+ repinfo->srctype = 4;
+ }
+}
+
+/** doq retrieve localaddr from repinfo */
+static void
+doq_repinfo_retrieve_localaddr(struct comm_reply* repinfo,
+ struct doq_addr_storage* localaddr, socklen_t* localaddrlen)
+{
+ if(repinfo->srctype == 6) {
+#ifdef IPV6_PKTINFO
+ struct sockaddr_in6* sa6 = (struct sockaddr_in6*)localaddr;
+ *localaddrlen = (socklen_t)sizeof(struct sockaddr_in6);
+ memset(sa6, 0, *localaddrlen);
+ sa6->sin6_family = AF_INET6;
+ memmove(&sa6->sin6_addr, &repinfo->pktinfo.v6info.ipi6_addr,
+ *localaddrlen);
+ sa6->sin6_port = repinfo->doq_srcport;
+#endif
+ } else {
+#ifdef IP_PKTINFO
+ struct sockaddr_in* sa = (struct sockaddr_in*)localaddr;
+ *localaddrlen = (socklen_t)sizeof(struct sockaddr_in);
+ memset(sa, 0, *localaddrlen);
+ sa->sin_family = AF_INET;
+ memmove(&sa->sin_addr, &repinfo->pktinfo.v4info.ipi_addr,
+ *localaddrlen);
+ sa->sin_port = repinfo->doq_srcport;
+#elif defined(IP_RECVDSTADDR)
+ struct sockaddr_in* sa = (struct sockaddr_in*)localaddr;
+ *localaddrlen = (socklen_t)sizeof(struct sockaddr_in);
+ memset(sa, 0, *localaddrlen);
+ sa->sin_family = AF_INET;
+ memmove(&sa->sin_addr, &repinfo->pktinfo.v4addr,
+ sizeof(struct in_addr));
+ sa->sin_port = repinfo->doq_srcport;
+#endif
+ }
+}
+
+/** doq write a connection key into repinfo, false if it does not fit */
+static int
+doq_conn_key_store_repinfo(struct doq_conn_key* key,
+ struct comm_reply* repinfo)
+{
+ repinfo->is_proxied = 0;
+ repinfo->doq_ifindex = key->paddr.ifindex;
+ repinfo->remote_addrlen = key->paddr.addrlen;
+ memmove(&repinfo->remote_addr, &key->paddr.addr,
+ repinfo->remote_addrlen);
+ repinfo->client_addrlen = key->paddr.addrlen;
+ memmove(&repinfo->client_addr, &key->paddr.addr,
+ repinfo->client_addrlen);
+ doq_repinfo_store_localaddr(repinfo, &key->paddr.localaddr,
+ key->paddr.localaddrlen);
+ if(key->dcidlen > sizeof(repinfo->doq_dcid))
+ return 0;
+ repinfo->doq_dcidlen = key->dcidlen;
+ memmove(repinfo->doq_dcid, key->dcid, key->dcidlen);
+ return 1;
+}
+
+void
+doq_conn_key_from_repinfo(struct doq_conn_key* key, struct comm_reply* repinfo)
+{
+ key->paddr.ifindex = repinfo->doq_ifindex;
+ key->paddr.addrlen = repinfo->remote_addrlen;
+ memmove(&key->paddr.addr, &repinfo->remote_addr,
+ repinfo->remote_addrlen);
+ doq_repinfo_retrieve_localaddr(repinfo, &key->paddr.localaddr,
+ &key->paddr.localaddrlen);
+ key->dcidlen = repinfo->doq_dcidlen;
+ key->dcid = repinfo->doq_dcid;
+}
+
+/** doq add a stream to the connection */
+static void
+doq_conn_add_stream(struct doq_conn* conn, struct doq_stream* stream)
+{
+ (void)rbtree_insert(&conn->stream_tree, &stream->node);
+}
+
+/** doq delete a stream from the connection */
+static void
+doq_conn_del_stream(struct doq_conn* conn, struct doq_stream* stream)
+{
+ (void)rbtree_delete(&conn->stream_tree, &stream->node);
+}
+
+/** doq create new stream */
+static struct doq_stream*
+doq_stream_create(int64_t stream_id)
+{
+ struct doq_stream* stream = calloc(1, sizeof(*stream));
+ if(!stream)
+ return NULL;
+ stream->node.key = stream;
+ stream->stream_id = stream_id;
+ return stream;
+}
+
+void doq_stream_delete(struct doq_stream* stream)
+{
+ if(!stream)
+ return;
+ free(stream->in);
+ free(stream->out);
+ free(stream);
+}
+
+struct doq_stream*
+doq_stream_find(struct doq_conn* conn, int64_t stream_id)
+{
+ rbnode_type* node;
+ struct doq_stream key;
+ key.node.key = &key;
+ key.stream_id = stream_id;
+ node = rbtree_search(&conn->stream_tree, &key);
+ if(node)
+ return (struct doq_stream*)node->key;
+ return NULL;
+}
+
+/** doq put stream on the conn write list */
+static void
+doq_stream_on_write_list(struct doq_conn* conn, struct doq_stream* stream)
+{
+ if(stream->on_write_list)
+ return;
+ stream->write_prev = conn->stream_write_last;
+ if(conn->stream_write_last)
+ conn->stream_write_last->write_next = stream;
+ else
+ conn->stream_write_first = stream;
+ conn->stream_write_last = stream;
+ stream->write_next = NULL;
+ stream->on_write_list = 1;
+}
+
+/** doq remove stream from the conn write list */
+static void
+doq_stream_off_write_list(struct doq_conn* conn, struct doq_stream* stream)
+{
+ if(!stream->on_write_list)
+ return;
+ if(stream->write_next)
+ stream->write_next->write_prev = stream->write_prev;
+ else conn->stream_write_last = stream->write_prev;
+ if(stream->write_prev)
+ stream->write_prev->write_next = stream->write_next;
+ else conn->stream_write_first = stream->write_next;
+ stream->write_prev = NULL;
+ stream->write_next = NULL;
+ stream->on_write_list = 0;
+}
+
+/** doq stream remove in buffer */
+static void
+doq_stream_remove_in_buffer(struct doq_stream* stream, struct doq_table* table)
+{
+ if(stream->in) {
+ doq_table_quic_size_subtract(table, stream->inlen);
+ free(stream->in);
+ stream->in = NULL;
+ stream->inlen = 0;
+ }
+}
+
+/** doq stream remove out buffer */
+static void
+doq_stream_remove_out_buffer(struct doq_stream* stream,
+ struct doq_table* table)
+{
+ if(stream->out) {
+ doq_table_quic_size_subtract(table, stream->outlen);
+ free(stream->out);
+ stream->out = NULL;
+ stream->outlen = 0;
+ }
+}
+
+int
+doq_stream_close(struct doq_conn* conn, struct doq_stream* stream,
+ int send_shutdown)
+{
+ int ret;
+ if(stream->is_closed)
+ return 1;
+ stream->is_closed = 1;
+ doq_stream_off_write_list(conn, stream);
+ if(send_shutdown) {
+ verbose(VERB_ALGO, "doq: shutdown stream_id %d with app_error_code %d",
+ (int)stream->stream_id, (int)DOQ_APP_ERROR_CODE);
+ ret = ngtcp2_conn_shutdown_stream(conn->conn,
+#ifdef HAVE_NGTCP2_CONN_SHUTDOWN_STREAM4
+ 0,
+#endif
+ stream->stream_id, DOQ_APP_ERROR_CODE);
+ if(ret != 0) {
+ log_err("doq ngtcp2_conn_shutdown_stream %d failed: %s",
+ (int)stream->stream_id, ngtcp2_strerror(ret));
+ return 0;
+ }
+ doq_conn_write_enable(conn);
+ }
+ verbose(VERB_ALGO, "doq: conn extend max streams bidi by 1");
+ ngtcp2_conn_extend_max_streams_bidi(conn->conn, 1);
+ doq_conn_write_enable(conn);
+ doq_stream_remove_in_buffer(stream, conn->doq_socket->table);
+ doq_stream_remove_out_buffer(stream, conn->doq_socket->table);
+ doq_table_quic_size_subtract(conn->doq_socket->table, sizeof(*stream));
+ doq_conn_del_stream(conn, stream);
+ doq_stream_delete(stream);
+ return 1;
+}
+
+/** doq stream pick up answer data from buffer */
+static int
+doq_stream_pickup_answer(struct doq_stream* stream, struct sldns_buffer* buf)
+{
+ stream->is_answer_available = 1;
+ if(stream->out) {
+ free(stream->out);
+ stream->out = NULL;
+ stream->outlen = 0;
+ }
+ stream->nwrite = 0;
+ stream->outlen = sldns_buffer_limit(buf);
+ /* For quic the output bytes have to stay allocated and available,
+ * for potential resends, until the remote end has acknowledged them.
+ * This includes the tcplen start uint16_t, in outlen_wire. */
+ stream->outlen_wire = htons(stream->outlen);
+ stream->out = memdup(sldns_buffer_begin(buf), sldns_buffer_limit(buf));
+ if(!stream->out) {
+ log_err("doq could not send answer: out of memory");
+ return 0;
+ }
+ return 1;
+}
+
+int
+doq_stream_send_reply(struct doq_conn* conn, struct doq_stream* stream,
+ struct sldns_buffer* buf)
+{
+ if(verbosity >= VERB_ALGO) {
+ char* s = sldns_wire2str_pkt(sldns_buffer_begin(buf),
+ sldns_buffer_limit(buf));
+ verbose(VERB_ALGO, "doq stream %d response\n%s",
+ (int)stream->stream_id, (s?s:"null"));
+ free(s);
+ }
+ if(stream->out)
+ doq_table_quic_size_subtract(conn->doq_socket->table,
+ stream->outlen);
+ if(!doq_stream_pickup_answer(stream, buf))
+ return 0;
+ doq_table_quic_size_add(conn->doq_socket->table, stream->outlen);
+ doq_stream_on_write_list(conn, stream);
+ doq_conn_write_enable(conn);
+ return 1;
+}
+
+/** doq stream data length has completed, allocations can be done. False on
+ * allocation failure. */
+static int
+doq_stream_datalen_complete(struct doq_stream* stream, struct doq_table* table)
+{
+ if(stream->inlen > 1024*1024) {
+ log_err("doq stream in length too large %d",
+ (int)stream->inlen);
+ return 0;
+ }
+ stream->in = calloc(1, stream->inlen);
+ if(!stream->in) {
+ log_err("doq could not read stream, calloc failed: "
+ "out of memory");
+ return 0;
+ }
+ doq_table_quic_size_add(table, stream->inlen);
+ return 1;
+}
+
+/** doq stream data is complete, the input data has been received. */
+static int
+doq_stream_data_complete(struct doq_conn* conn, struct doq_stream* stream)
+{
+ struct comm_point* c;
+ if(verbosity >= VERB_ALGO) {
+ char* s = sldns_wire2str_pkt(stream->in, stream->inlen);
+ char a[128];
+ addr_to_str((void*)&conn->key.paddr.addr,
+ conn->key.paddr.addrlen, a, sizeof(a));
+ verbose(VERB_ALGO, "doq %s stream %d incoming query\n%s",
+ a, (int)stream->stream_id, (s?s:"null"));
+ free(s);
+ }
+ stream->is_query_complete = 1;
+ c = conn->doq_socket->cp;
+ if(!stream->in) {
+ verbose(VERB_ALGO, "doq_stream_data_complete: no in buffer");
+ return 0;
+ }
+ if(stream->inlen > sldns_buffer_capacity(c->buffer)) {
+ verbose(VERB_ALGO, "doq_stream_data_complete: query too long");
+ return 0;
+ }
+ sldns_buffer_clear(c->buffer);
+ sldns_buffer_write(c->buffer, stream->in, stream->inlen);
+ sldns_buffer_flip(c->buffer);
+ c->repinfo.c = c;
+ if(!doq_conn_key_store_repinfo(&conn->key, &c->repinfo)) {
+ verbose(VERB_ALGO, "doq_stream_data_complete: connection "
+ "DCID too long");
+ return 0;
+ }
+ c->repinfo.doq_streamid = stream->stream_id;
+ conn->doq_socket->current_conn = conn;
+ fptr_ok(fptr_whitelist_comm_point(c->callback));
+ if( (*c->callback)(c, c->cb_arg, NETEVENT_NOERROR, &c->repinfo)) {
+ conn->doq_socket->current_conn = NULL;
+ if(!doq_stream_send_reply(conn, stream, c->buffer)) {
+ verbose(VERB_ALGO, "doq: failed to send_reply");
+ return 0;
+ }
+ return 1;
+ }
+ conn->doq_socket->current_conn = NULL;
+ return 1;
+}
+
+/** doq receive data for a stream, more bytes of the incoming data */
+static int
+doq_stream_recv_data(struct doq_stream* stream, const uint8_t* data,
+ size_t datalen, int* recv_done, struct doq_table* table)
+{
+ int got_data = 0;
+ /* read the tcplength uint16_t at the start */
+ if(stream->nread < 2) {
+ uint16_t tcplen = 0;
+ size_t todolen = 2 - stream->nread;
+
+ if(stream->nread > 0) {
+ /* put in the already read byte if there is one */
+ tcplen = stream->inlen;
+ }
+ if(datalen < todolen)
+ todolen = datalen;
+ memmove(((uint8_t*)&tcplen)+stream->nread, data, todolen);
+ stream->nread += todolen;
+ data += todolen;
+ datalen -= todolen;
+ if(stream->nread == 2) {
+ /* the initial length value is completed */
+ stream->inlen = ntohs(tcplen);
+ if(!doq_stream_datalen_complete(stream, table))
+ return 0;
+ } else {
+ /* store for later */
+ stream->inlen = tcplen;
+ return 1;
+ }
+ }
+ /* if there are more data bytes */
+ if(datalen > 0) {
+ size_t to_write = datalen;
+ if(stream->nread-2 > stream->inlen) {
+ verbose(VERB_ALGO, "doq stream buffer too small");
+ return 0;
+ }
+ if(datalen > stream->inlen - (stream->nread-2))
+ to_write = stream->inlen - (stream->nread-2);
+ if(to_write > 0) {
+ if(!stream->in) {
+ verbose(VERB_ALGO, "doq: stream has "
+ "no buffer");
+ return 0;
+ }
+ memmove(stream->in+(stream->nread-2), data, to_write);
+ stream->nread += to_write;
+ data += to_write;
+ datalen -= to_write;
+ got_data = 1;
+ }
+ }
+ /* Are there extra bytes received after the end? If so, log them. */
+ if(datalen > 0) {
+ if(verbosity >= VERB_ALGO)
+ log_hex("doq stream has extra bytes received after end",
+ (void*)data, datalen);
+ }
+ /* Is the input data complete? */
+ if(got_data && stream->nread >= stream->inlen+2) {
+ if(!stream->in) {
+ verbose(VERB_ALGO, "doq: completed stream has "
+ "no buffer");
+ return 0;
+ }
+ *recv_done = 1;
+ }
+ return 1;
+}
+
+/** doq receive FIN for a stream. No more bytes are going to arrive. */
+static int
+doq_stream_recv_fin(struct doq_conn* conn, struct doq_stream* stream, int
+ recv_done)
+{
+ if(!stream->is_query_complete && !recv_done) {
+ verbose(VERB_ALGO, "doq: stream recv FIN, but is "
+ "not complete, have %d of %d bytes",
+ ((int)stream->nread)-2, (int)stream->inlen);
+ if(!doq_stream_close(conn, stream, 1))
+ return 0;
+ }
+ return 1;
+}
+
+void doq_fill_rand(struct ub_randstate* rnd, uint8_t* buf, size_t len)
+{
+ size_t i;
+ for(i=0; i<len; i++)
+ buf[i] = ub_random(rnd)&0xff;
+}
+
+/** generate new connection id, checks for duplicates.
+ * caller must hold lock on conid tree. */
+static int
+doq_conn_generate_new_conid(struct doq_conn* conn, uint8_t* data,
+ size_t datalen)
+{
+ int max_try = 100;
+ int i;
+ for(i=0; i<max_try; i++) {
+ doq_fill_rand(conn->doq_socket->rnd, data, datalen);
+ if(!doq_conid_find(conn->table, data, datalen)) {
+ /* Found an unused connection id. */
+ return 1;
+ }
+ }
+ verbose(VERB_ALGO, "doq_conn_generate_new_conid failed: could not "
+ "generate random unused connection id value in %d attempts.",
+ max_try);
+ return 0;
+}
+
+/** ngtcp2 rand callback function */
+static void
+doq_rand_cb(uint8_t* dest, size_t destlen, const ngtcp2_rand_ctx* rand_ctx)
+{
+ struct ub_randstate* rnd = (struct ub_randstate*)
+ rand_ctx->native_handle;
+ doq_fill_rand(rnd, dest, destlen);
+}
+
+/** ngtcp2 get_new_connection_id callback function */
+static int
+doq_get_new_connection_id_cb(ngtcp2_conn* ATTR_UNUSED(conn), ngtcp2_cid* cid,
+ uint8_t* token, size_t cidlen, void* user_data)
+{
+ struct doq_conn* doq_conn = (struct doq_conn*)user_data;
+ /* Lock the conid tree, so we can check for duplicates while
+ * generating the id, and then insert it, whilst keeping the tree
+ * locked against other modifications, guaranteeing uniqueness. */
+ lock_rw_wrlock(&doq_conn->table->conid_lock);
+ if(!doq_conn_generate_new_conid(doq_conn, cid->data, cidlen)) {
+ lock_rw_unlock(&doq_conn->table->conid_lock);
+ return NGTCP2_ERR_CALLBACK_FAILURE;
+ }
+ cid->datalen = cidlen;
+ if(ngtcp2_crypto_generate_stateless_reset_token(token,
+ doq_conn->doq_socket->static_secret,
+ doq_conn->doq_socket->static_secret_len, cid) != 0) {
+ lock_rw_unlock(&doq_conn->table->conid_lock);
+ return NGTCP2_ERR_CALLBACK_FAILURE;
+ }
+ if(!doq_conn_associate_conid(doq_conn, cid->data, cid->datalen)) {
+ lock_rw_unlock(&doq_conn->table->conid_lock);
+ return NGTCP2_ERR_CALLBACK_FAILURE;
+ }
+ lock_rw_unlock(&doq_conn->table->conid_lock);
+ return 0;
+}
+
+/** ngtcp2 remove_connection_id callback function */
+static int
+doq_remove_connection_id_cb(ngtcp2_conn* ATTR_UNUSED(conn),
+ const ngtcp2_cid* cid, void* user_data)
+{
+ struct doq_conn* doq_conn = (struct doq_conn*)user_data;
+ lock_rw_wrlock(&doq_conn->table->conid_lock);
+ doq_conn_dissociate_conid(doq_conn, cid->data, cid->datalen);
+ lock_rw_unlock(&doq_conn->table->conid_lock);
+ return 0;
+}
+
+/** doq submit a new token */
+static int
+doq_submit_new_token(struct doq_conn* conn)
+{
+ uint8_t token[NGTCP2_CRYPTO_MAX_REGULAR_TOKENLEN];
+ ngtcp2_ssize tokenlen;
+ int ret;
+ const ngtcp2_path* path = ngtcp2_conn_get_path(conn->conn);
+ ngtcp2_tstamp ts = doq_get_timestamp_nanosec();
+
+ tokenlen = ngtcp2_crypto_generate_regular_token(token,
+ conn->doq_socket->static_secret,
+ conn->doq_socket->static_secret_len, path->remote.addr,
+ path->remote.addrlen, ts);
+ if(tokenlen < 0) {
+ log_err("doq ngtcp2_crypto_generate_regular_token failed");
+ return 1;
+ }
+
+ verbose(VERB_ALGO, "doq submit new token");
+ ret = ngtcp2_conn_submit_new_token(conn->conn, token, tokenlen);
+ if(ret != 0) {
+ log_err("doq ngtcp2_conn_submit_new_token failed: %s",
+ ngtcp2_strerror(ret));
+ return 0;
+ }
+ return 1;
+}
+
+/** ngtcp2 handshake_completed callback function */
+static int
+doq_handshake_completed_cb(ngtcp2_conn* ATTR_UNUSED(conn), void* user_data)
+{
+ struct doq_conn* doq_conn = (struct doq_conn*)user_data;
+ verbose(VERB_ALGO, "doq handshake_completed callback");
+ verbose(VERB_ALGO, "ngtcp2_conn_get_max_data_left is %d",
+ (int)ngtcp2_conn_get_max_data_left(doq_conn->conn));
+#ifdef HAVE_NGTCP2_CONN_GET_MAX_LOCAL_STREAMS_UNI
+ verbose(VERB_ALGO, "ngtcp2_conn_get_max_local_streams_uni is %d",
+ (int)ngtcp2_conn_get_max_local_streams_uni(doq_conn->conn));
+#endif
+ verbose(VERB_ALGO, "ngtcp2_conn_get_streams_uni_left is %d",
+ (int)ngtcp2_conn_get_streams_uni_left(doq_conn->conn));
+ verbose(VERB_ALGO, "ngtcp2_conn_get_streams_bidi_left is %d",
+ (int)ngtcp2_conn_get_streams_bidi_left(doq_conn->conn));
+ verbose(VERB_ALGO, "negotiated cipher name is %s",
+ SSL_get_cipher_name(doq_conn->ssl));
+ if(verbosity > VERB_ALGO) {
+ const unsigned char* alpn = NULL;
+ unsigned int alpnlen = 0;
+ char alpnstr[128];
+ SSL_get0_alpn_selected(doq_conn->ssl, &alpn, &alpnlen);
+ if(alpnlen > sizeof(alpnstr)-1)
+ alpnlen = sizeof(alpnstr)-1;
+ memmove(alpnstr, alpn, alpnlen);
+ alpnstr[alpnlen]=0;
+ verbose(VERB_ALGO, "negotiated ALPN is '%s'", alpnstr);
+ }
+
+ if(!doq_submit_new_token(doq_conn))
+ return -1;
+ return 0;
+}
+
+/** ngtcp2 stream_open callback function */
+static int
+doq_stream_open_cb(ngtcp2_conn* ATTR_UNUSED(conn), int64_t stream_id,
+ void* user_data)
+{
+ struct doq_conn* doq_conn = (struct doq_conn*)user_data;
+ struct doq_stream* stream;
+ verbose(VERB_ALGO, "doq new stream %x", (int)stream_id);
+ if(doq_stream_find(doq_conn, stream_id)) {
+ verbose(VERB_ALGO, "doq: stream with this id already exists");
+ return 0;
+ }
+ if(stream_id != 0 && stream_id != 4 && /* allow one stream on a new connection */
+ !doq_table_quic_size_available(doq_conn->doq_socket->table,
+ doq_conn->doq_socket->cfg, sizeof(*stream)
+ + 100 /* estimated query in */
+ + 512 /* estimated response out */
+ )) {
+ int rv;
+ verbose(VERB_ALGO, "doq: no mem for new stream");
+ rv = ngtcp2_conn_shutdown_stream(doq_conn->conn,
+#ifdef HAVE_NGTCP2_CONN_SHUTDOWN_STREAM4
+ 0,
+#endif
+ stream_id, NGTCP2_CONNECTION_REFUSED);
+ if(rv != 0) {
+ log_err("ngtcp2_conn_shutdown_stream failed: %s",
+ ngtcp2_strerror(rv));
+ return NGTCP2_ERR_CALLBACK_FAILURE;
+ }
+ return 0;
+ }
+ stream = doq_stream_create(stream_id);
+ if(!stream) {
+ log_err("doq: could not doq_stream_create: out of memory");
+ return NGTCP2_ERR_CALLBACK_FAILURE;
+ }
+ doq_table_quic_size_add(doq_conn->doq_socket->table, sizeof(*stream));
+ doq_conn_add_stream(doq_conn, stream);
+ return 0;
+}
+
+/** ngtcp2 recv_stream_data callback function */
+static int
+doq_recv_stream_data_cb(ngtcp2_conn* ATTR_UNUSED(conn), uint32_t flags,
+ int64_t stream_id, uint64_t offset, const uint8_t* data,
+ size_t datalen, void* user_data, void* ATTR_UNUSED(stream_user_data))
+{
+ int recv_done = 0;
+ struct doq_conn* doq_conn = (struct doq_conn*)user_data;
+ struct doq_stream* stream;
+ verbose(VERB_ALGO, "doq recv stream data stream id %d offset %d "
+ "datalen %d%s%s", (int)stream_id, (int)offset, (int)datalen,
+ ((flags&NGTCP2_STREAM_DATA_FLAG_FIN)!=0?" FIN":""),
+#ifdef NGTCP2_STREAM_DATA_FLAG_0RTT
+ ((flags&NGTCP2_STREAM_DATA_FLAG_0RTT)!=0?" 0RTT":"")
+#else
+ ((flags&NGTCP2_STREAM_DATA_FLAG_EARLY)!=0?" EARLY":"")
+#endif
+ );
+ stream = doq_stream_find(doq_conn, stream_id);
+ if(!stream) {
+ verbose(VERB_ALGO, "doq: received stream data for "
+ "unknown stream %d", (int)stream_id);
+ return 0;
+ }
+ if(stream->is_closed) {
+ verbose(VERB_ALGO, "doq: stream is closed, ignore recv data");
+ return 0;
+ }
+ if(datalen != 0) {
+ if(!doq_stream_recv_data(stream, data, datalen, &recv_done,
+ doq_conn->doq_socket->table))
+ return NGTCP2_ERR_CALLBACK_FAILURE;
+ }
+ if((flags&NGTCP2_STREAM_DATA_FLAG_FIN)!=0) {
+ if(!doq_stream_recv_fin(doq_conn, stream, recv_done))
+ return NGTCP2_ERR_CALLBACK_FAILURE;
+ }
+ ngtcp2_conn_extend_max_stream_offset(doq_conn->conn, stream_id,
+ datalen);
+ ngtcp2_conn_extend_max_offset(doq_conn->conn, datalen);
+ if(recv_done) {
+ if(!doq_stream_data_complete(doq_conn, stream))
+ return NGTCP2_ERR_CALLBACK_FAILURE;
+ }
+ return 0;
+}
+
+/** ngtcp2 stream_close callback function */
+static int
+doq_stream_close_cb(ngtcp2_conn* ATTR_UNUSED(conn), uint32_t flags,
+ int64_t stream_id, uint64_t app_error_code, void* user_data,
+ void* ATTR_UNUSED(stream_user_data))
+{
+ struct doq_conn* doq_conn = (struct doq_conn*)user_data;
+ struct doq_stream* stream;
+ if((flags&NGTCP2_STREAM_CLOSE_FLAG_APP_ERROR_CODE_SET)!=0)
+ verbose(VERB_ALGO, "doq stream close for stream id %d %sapp_error_code %d",
+ (int)stream_id,
+ (((flags&NGTCP2_STREAM_CLOSE_FLAG_APP_ERROR_CODE_SET)!=0)?
+ "APP_ERROR_CODE_SET ":""),
+ (int)app_error_code);
+ else
+ verbose(VERB_ALGO, "doq stream close for stream id %d",
+ (int)stream_id);
+
+ stream = doq_stream_find(doq_conn, stream_id);
+ if(!stream) {
+ verbose(VERB_ALGO, "doq: stream close for "
+ "unknown stream %d", (int)stream_id);
+ return 0;
+ }
+ if(!doq_stream_close(doq_conn, stream, 0))
+ return NGTCP2_ERR_CALLBACK_FAILURE;
+ return 0;
+}
+
+/** ngtcp2 stream_reset callback function */
+static int
+doq_stream_reset_cb(ngtcp2_conn* ATTR_UNUSED(conn), int64_t stream_id,
+ uint64_t final_size, uint64_t app_error_code, void* user_data,
+ void* ATTR_UNUSED(stream_user_data))
+{
+ struct doq_conn* doq_conn = (struct doq_conn*)user_data;
+ struct doq_stream* stream;
+ verbose(VERB_ALGO, "doq stream reset for stream id %d final_size %d "
+ "app_error_code %d", (int)stream_id, (int)final_size,
+ (int)app_error_code);
+
+ stream = doq_stream_find(doq_conn, stream_id);
+ if(!stream) {
+ verbose(VERB_ALGO, "doq: stream reset for "
+ "unknown stream %d", (int)stream_id);
+ return 0;
+ }
+ if(!doq_stream_close(doq_conn, stream, 0))
+ return NGTCP2_ERR_CALLBACK_FAILURE;
+ return 0;
+}
+
+/** ngtcp2 acked_stream_data_offset callback function */
+static int
+doq_acked_stream_data_offset_cb(ngtcp2_conn* ATTR_UNUSED(conn),
+ int64_t stream_id, uint64_t offset, uint64_t datalen, void* user_data,
+ void* ATTR_UNUSED(stream_user_data))
+{
+ struct doq_conn* doq_conn = (struct doq_conn*)user_data;
+ struct doq_stream* stream;
+ verbose(VERB_ALGO, "doq stream acked data for stream id %d offset %d "
+ "datalen %d", (int)stream_id, (int)offset, (int)datalen);
+
+ stream = doq_stream_find(doq_conn, stream_id);
+ if(!stream) {
+ verbose(VERB_ALGO, "doq: stream acked data for "
+ "unknown stream %d", (int)stream_id);
+ return 0;
+ }
+ /* Acked the data from [offset .. offset+datalen). */
+ if(stream->is_closed)
+ return 0;
+ if(offset+datalen >= stream->outlen) {
+ doq_stream_remove_in_buffer(stream,
+ doq_conn->doq_socket->table);
+ doq_stream_remove_out_buffer(stream,
+ doq_conn->doq_socket->table);
+ }
+ return 0;
+}
+
+/** ngtc2p log_printf callback function */
+static void
+doq_log_printf_cb(void* ATTR_UNUSED(user_data), const char* fmt, ...)
+{
+ char buf[1024];
+ va_list ap;
+ va_start(ap, fmt);
+ vsnprintf(buf, sizeof(buf), fmt, ap);
+ verbose(VERB_ALGO, "libngtcp2: %s", buf);
+ va_end(ap);
+}
+
+#ifndef HAVE_NGTCP2_CRYPTO_QUICTLS_CONFIGURE_SERVER_CONTEXT
+/** the doq application tx key callback, false on failure */
+static int
+doq_application_tx_key_cb(struct doq_conn* conn)
+{
+ verbose(VERB_ALGO, "doq application tx key cb");
+ /* The server does not want to open streams to the client,
+ * the client instead initiates by opening bidi streams. */
+ verbose(VERB_ALGO, "doq ngtcp2_conn_get_max_data_left is %d",
+ (int)ngtcp2_conn_get_max_data_left(conn->conn));
+#ifdef HAVE_NGTCP2_CONN_GET_MAX_LOCAL_STREAMS_UNI
+ verbose(VERB_ALGO, "doq ngtcp2_conn_get_max_local_streams_uni is %d",
+ (int)ngtcp2_conn_get_max_local_streams_uni(conn->conn));
+#endif
+ verbose(VERB_ALGO, "doq ngtcp2_conn_get_streams_uni_left is %d",
+ (int)ngtcp2_conn_get_streams_uni_left(conn->conn));
+ verbose(VERB_ALGO, "doq ngtcp2_conn_get_streams_bidi_left is %d",
+ (int)ngtcp2_conn_get_streams_bidi_left(conn->conn));
+ return 1;
+}
+
+/** quic_method set_encryption_secrets function */
+static int
+doq_set_encryption_secrets(SSL *ssl, OSSL_ENCRYPTION_LEVEL ossl_level,
+ const uint8_t *read_secret, const uint8_t *write_secret,
+ size_t secret_len)
+{
+ struct doq_conn* doq_conn = (struct doq_conn*)SSL_get_app_data(ssl);
+#ifdef HAVE_NGTCP2_ENCRYPTION_LEVEL
+ ngtcp2_encryption_level
+#else
+ ngtcp2_crypto_level
+#endif
+ level =
+#ifdef HAVE_NGTCP2_CRYPTO_QUICTLS_FROM_OSSL_ENCRYPTION_LEVEL
+ ngtcp2_crypto_quictls_from_ossl_encryption_level(ossl_level);
+#else
+ ngtcp2_crypto_openssl_from_ossl_encryption_level(ossl_level);
+#endif
+
+ if(read_secret) {
+ verbose(VERB_ALGO, "doq: ngtcp2_crypto_derive_and_install_rx_key for level %d ossl %d", (int)level, (int)ossl_level);
+ if(ngtcp2_crypto_derive_and_install_rx_key(doq_conn->conn,
+ NULL, NULL, NULL, level, read_secret, secret_len)
+ != 0) {
+ log_err("ngtcp2_crypto_derive_and_install_rx_key "
+ "failed");
+ return 0;
+ }
+ }
+
+ if(write_secret) {
+ verbose(VERB_ALGO, "doq: ngtcp2_crypto_derive_and_install_tx_key for level %d ossl %d", (int)level, (int)ossl_level);
+ if(ngtcp2_crypto_derive_and_install_tx_key(doq_conn->conn,
+ NULL, NULL, NULL, level, write_secret, secret_len)
+ != 0) {
+ log_err("ngtcp2_crypto_derive_and_install_tx_key "
+ "failed");
+ return 0;
+ }
+ if(level == NGTCP2_CRYPTO_LEVEL_APPLICATION) {
+ if(!doq_application_tx_key_cb(doq_conn))
+ return 0;
+ }
+ }
+ return 1;
+}
+
+/** quic_method add_handshake_data function */
+static int
+doq_add_handshake_data(SSL *ssl, OSSL_ENCRYPTION_LEVEL ossl_level,
+ const uint8_t *data, size_t len)
+{
+ struct doq_conn* doq_conn = (struct doq_conn*)SSL_get_app_data(ssl);
+#ifdef HAVE_NGTCP2_ENCRYPTION_LEVEL
+ ngtcp2_encryption_level
+#else
+ ngtcp2_crypto_level
+#endif
+ level =
+#ifdef HAVE_NGTCP2_CRYPTO_QUICTLS_FROM_OSSL_ENCRYPTION_LEVEL
+ ngtcp2_crypto_quictls_from_ossl_encryption_level(ossl_level);
+#else
+ ngtcp2_crypto_openssl_from_ossl_encryption_level(ossl_level);
+#endif
+ int rv;
+
+ verbose(VERB_ALGO, "doq_add_handshake_data: "
+ "ngtcp2_con_submit_crypto_data level %d", (int)level);
+ rv = ngtcp2_conn_submit_crypto_data(doq_conn->conn, level, data, len);
+ if(rv != 0) {
+ log_err("ngtcp2_conn_submit_crypto_data failed: %s",
+ ngtcp2_strerror(rv));
+ ngtcp2_conn_set_tls_error(doq_conn->conn, rv);
+ return 0;
+ }
+ return 1;
+}
+
+/** quic_method flush_flight function */
+static int
+doq_flush_flight(SSL* ATTR_UNUSED(ssl))
+{
+ return 1;
+}
+
+/** quic_method send_alert function */
+static int
+doq_send_alert(SSL *ssl, enum ssl_encryption_level_t ATTR_UNUSED(level),
+ uint8_t alert)
+{
+ struct doq_conn* doq_conn = (struct doq_conn*)SSL_get_app_data(ssl);
+ doq_conn->tls_alert = alert;
+ return 1;
+}
+#endif /* HAVE_NGTCP2_CRYPTO_QUICTLS_CONFIGURE_SERVER_CONTEXT */
+
+/** ALPN select callback for the doq SSL context */
+static int
+doq_alpn_select_cb(SSL* ATTR_UNUSED(ssl), const unsigned char** out,
+ unsigned char* outlen, const unsigned char* in, unsigned int inlen,
+ void* ATTR_UNUSED(arg))
+{
+ /* select "doq" */
+ int ret = SSL_select_next_proto((void*)out, outlen,
+ (const unsigned char*)"\x03""doq", 4, in, inlen);
+ if(ret == OPENSSL_NPN_NEGOTIATED)
+ return SSL_TLSEXT_ERR_OK;
+ verbose(VERB_ALGO, "doq alpn_select_cb: ALPN from client does "
+ "not have 'doq'");
+ return SSL_TLSEXT_ERR_ALERT_FATAL;
+}
+
+/** create new tls session for server doq connection */
+static SSL_CTX*
+doq_ctx_server_setup(struct doq_server_socket* doq_socket)
+{
+ char* sid_ctx = "unbound server";
+#ifndef HAVE_NGTCP2_CRYPTO_QUICTLS_CONFIGURE_SERVER_CONTEXT
+ SSL_QUIC_METHOD* quic_method;
+#endif
+ SSL_CTX* ctx = SSL_CTX_new(TLS_server_method());
+ if(!ctx) {
+ log_crypto_err("Could not SSL_CTX_new");
+ return NULL;
+ }
+ SSL_CTX_set_options(ctx,
+ (SSL_OP_ALL & ~SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS) |
+ SSL_OP_SINGLE_ECDH_USE |
+ SSL_OP_CIPHER_SERVER_PREFERENCE |
+ SSL_OP_NO_ANTI_REPLAY);
+ SSL_CTX_set_mode(ctx, SSL_MODE_RELEASE_BUFFERS);
+ SSL_CTX_set_min_proto_version(ctx, TLS1_3_VERSION);
+ SSL_CTX_set_max_proto_version(ctx, TLS1_3_VERSION);
+#ifdef HAVE_SSL_CTX_SET_ALPN_SELECT_CB
+ SSL_CTX_set_alpn_select_cb(ctx, doq_alpn_select_cb, NULL);
+#endif
+ SSL_CTX_set_default_verify_paths(ctx);
+ if(!SSL_CTX_use_certificate_chain_file(ctx,
+ doq_socket->ssl_service_pem)) {
+ log_err("doq: error for cert file: %s",
+ doq_socket->ssl_service_pem);
+ log_crypto_err("doq: error in "
+ "SSL_CTX_use_certificate_chain_file");
+ SSL_CTX_free(ctx);
+ return NULL;
+ }
+ if(!SSL_CTX_use_PrivateKey_file(ctx, doq_socket->ssl_service_key,
+ SSL_FILETYPE_PEM)) {
+ log_err("doq: error for private key file: %s",
+ doq_socket->ssl_service_key);
+ log_crypto_err("doq: error in SSL_CTX_use_PrivateKey_file");
+ SSL_CTX_free(ctx);
+ return NULL;
+ }
+ if(!SSL_CTX_check_private_key(ctx)) {
+ log_err("doq: error for key file: %s",
+ doq_socket->ssl_service_key);
+ log_crypto_err("doq: error in SSL_CTX_check_private_key");
+ SSL_CTX_free(ctx);
+ return NULL;
+ }
+ SSL_CTX_set_session_id_context(ctx, (void*)sid_ctx, strlen(sid_ctx));
+ if(doq_socket->ssl_verify_pem && doq_socket->ssl_verify_pem[0]) {
+ if(!SSL_CTX_load_verify_locations(ctx,
+ doq_socket->ssl_verify_pem, NULL)) {
+ log_err("doq: error for verify pem file: %s",
+ doq_socket->ssl_verify_pem);
+ log_crypto_err("doq: error in "
+ "SSL_CTX_load_verify_locations");
+ SSL_CTX_free(ctx);
+ return NULL;
+ }
+ SSL_CTX_set_client_CA_list(ctx, SSL_load_client_CA_file(
+ doq_socket->ssl_verify_pem));
+ SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER|
+ SSL_VERIFY_CLIENT_ONCE|
+ SSL_VERIFY_FAIL_IF_NO_PEER_CERT, NULL);
+ }
+
+ SSL_CTX_set_max_early_data(ctx, 0xffffffff);
+#ifdef HAVE_NGTCP2_CRYPTO_QUICTLS_CONFIGURE_SERVER_CONTEXT
+ if(ngtcp2_crypto_quictls_configure_server_context(ctx) != 0) {
+ log_err("ngtcp2_crypto_quictls_configure_server_context failed");
+ SSL_CTX_free(ctx);
+ return NULL;
+ }
+#else
+ /* The quic_method needs to remain valid during the SSL_CTX
+ * lifetime, so we allocate it. It is freed with the
+ * doq_server_socket. */
+ quic_method = calloc(1, sizeof(SSL_QUIC_METHOD));
+ if(!quic_method) {
+ log_err("calloc failed: out of memory");
+ SSL_CTX_free(ctx);
+ return NULL;
+ }
+ doq_socket->quic_method = quic_method;
+ quic_method->set_encryption_secrets = doq_set_encryption_secrets;
+ quic_method->add_handshake_data = doq_add_handshake_data;
+ quic_method->flush_flight = doq_flush_flight;
+ quic_method->send_alert = doq_send_alert;
+ SSL_CTX_set_quic_method(ctx, doq_socket->quic_method);
+#endif
+ return ctx;
+}
+
+/** Get the ngtcp2_conn from ssl userdata of type ngtcp2_conn_ref */
+static ngtcp2_conn* doq_conn_ref_get_conn(ngtcp2_crypto_conn_ref* conn_ref)
+{
+ struct doq_conn* conn = (struct doq_conn*)conn_ref->user_data;
+ return conn->conn;
+}
+
+/** create new SSL session for server connection */
+static SSL*
+doq_ssl_server_setup(SSL_CTX* ctx, struct doq_conn* conn)
+{
+ SSL* ssl = SSL_new(ctx);
+ if(!ssl) {
+ log_crypto_err("doq: SSL_new failed");
+ return NULL;
+ }
+#ifdef HAVE_NGTCP2_CRYPTO_QUICTLS_CONFIGURE_SERVER_CONTEXT
+ conn->conn_ref.get_conn = &doq_conn_ref_get_conn;
+ conn->conn_ref.user_data = conn;
+ SSL_set_app_data(ssl, &conn->conn_ref);
+#else
+ SSL_set_app_data(ssl, conn);
+#endif
+ SSL_set_accept_state(ssl);
+ SSL_set_quic_early_data_enabled(ssl, 1);
+ return ssl;
+}
+
+/** setup the doq_socket server tls context */
+int
+doq_socket_setup_ctx(struct doq_server_socket* doq_socket)
+{
+ doq_socket->ctx = doq_ctx_server_setup(doq_socket);
+ if(!doq_socket->ctx)
+ return 0;
+ return 1;
+}
+
+int
+doq_conn_setup(struct doq_conn* conn, uint8_t* scid, size_t scidlen,
+ uint8_t* ocid, size_t ocidlen, const uint8_t* token, size_t tokenlen)
+{
+ int rv;
+ struct ngtcp2_cid dcid, sv_scid, scid_cid;
+ struct ngtcp2_path path;
+ struct ngtcp2_callbacks callbacks;
+ struct ngtcp2_settings settings;
+ struct ngtcp2_transport_params params;
+ memset(&dcid, 0, sizeof(dcid));
+ memset(&sv_scid, 0, sizeof(sv_scid));
+ memset(&scid_cid, 0, sizeof(scid_cid));
+ memset(&path, 0, sizeof(path));
+ memset(&callbacks, 0, sizeof(callbacks));
+ memset(&settings, 0, sizeof(settings));
+ memset(&params, 0, sizeof(params));
+
+ ngtcp2_cid_init(&scid_cid, scid, scidlen);
+ ngtcp2_cid_init(&dcid, conn->key.dcid, conn->key.dcidlen);
+
+ path.remote.addr = (struct sockaddr*)&conn->key.paddr.addr;
+ path.remote.addrlen = conn->key.paddr.addrlen;
+ path.local.addr = (struct sockaddr*)&conn->key.paddr.localaddr;
+ path.local.addrlen = conn->key.paddr.localaddrlen;
+
+ callbacks.recv_client_initial = ngtcp2_crypto_recv_client_initial_cb;
+ callbacks.recv_crypto_data = ngtcp2_crypto_recv_crypto_data_cb;
+ callbacks.encrypt = ngtcp2_crypto_encrypt_cb;
+ callbacks.decrypt = ngtcp2_crypto_decrypt_cb;
+ callbacks.hp_mask = ngtcp2_crypto_hp_mask;
+ callbacks.update_key = ngtcp2_crypto_update_key_cb;
+ callbacks.delete_crypto_aead_ctx =
+ ngtcp2_crypto_delete_crypto_aead_ctx_cb;
+ callbacks.delete_crypto_cipher_ctx =
+ ngtcp2_crypto_delete_crypto_cipher_ctx_cb;
+ callbacks.get_path_challenge_data =
+ ngtcp2_crypto_get_path_challenge_data_cb;
+ callbacks.version_negotiation = ngtcp2_crypto_version_negotiation_cb;
+ callbacks.rand = doq_rand_cb;
+ callbacks.get_new_connection_id = doq_get_new_connection_id_cb;
+ callbacks.remove_connection_id = doq_remove_connection_id_cb;
+ callbacks.handshake_completed = doq_handshake_completed_cb;
+ callbacks.stream_open = doq_stream_open_cb;
+ callbacks.stream_close = doq_stream_close_cb;
+ callbacks.stream_reset = doq_stream_reset_cb;
+ callbacks.acked_stream_data_offset = doq_acked_stream_data_offset_cb;
+ callbacks.recv_stream_data = doq_recv_stream_data_cb;
+
+ ngtcp2_settings_default(&settings);
+ if(verbosity >= VERB_ALGO) {
+ settings.log_printf = doq_log_printf_cb;
+ }
+ settings.rand_ctx.native_handle = conn->doq_socket->rnd;
+ settings.initial_ts = doq_get_timestamp_nanosec();
+ settings.max_stream_window = 6*1024*1024;
+ settings.max_window = 6*1024*1024;
+#ifdef HAVE_STRUCT_NGTCP2_SETTINGS_TOKENLEN
+ settings.token = (void*)token;
+ settings.tokenlen = tokenlen;
+#else
+ settings.token.base = (void*)token;
+ settings.token.len = tokenlen;
+#endif
+
+ ngtcp2_transport_params_default(&params);
+ params.max_idle_timeout = conn->doq_socket->idle_timeout;
+ params.active_connection_id_limit = 7;
+ params.initial_max_stream_data_bidi_local = 256*1024;
+ params.initial_max_stream_data_bidi_remote = 256*1024;
+ params.initial_max_data = 1024*1024;
+ /* DoQ uses bidi streams, so we allow 0 uni streams. */
+ params.initial_max_streams_uni = 0;
+ /* Initial max on number of bidi streams the remote end can open.
+ * That is the number of queries it can make, at first. */
+ params.initial_max_streams_bidi = 10;
+ if(ocid) {
+ ngtcp2_cid_init(&params.original_dcid, ocid, ocidlen);
+ ngtcp2_cid_init(&params.retry_scid, conn->key.dcid,
+ conn->key.dcidlen);
+ params.retry_scid_present = 1;
+ } else {
+ ngtcp2_cid_init(&params.original_dcid, conn->key.dcid,
+ conn->key.dcidlen);
+ }
+#ifdef HAVE_STRUCT_NGTCP2_TRANSPORT_PARAMS_ORIGINAL_DCID_PRESENT
+ params.original_dcid_present = 1;
+#endif
+ doq_fill_rand(conn->doq_socket->rnd, params.stateless_reset_token,
+ sizeof(params.stateless_reset_token));
+ sv_scid.datalen = conn->doq_socket->sv_scidlen;
+ lock_rw_wrlock(&conn->table->conid_lock);
+ if(!doq_conn_generate_new_conid(conn, sv_scid.data, sv_scid.datalen)) {
+ lock_rw_unlock(&conn->table->conid_lock);
+ return 0;
+ }
+
+ rv = ngtcp2_conn_server_new(&conn->conn, &scid_cid, &sv_scid, &path,
+ conn->version, &callbacks, &settings, &params, NULL, conn);
+ if(rv != 0) {
+ lock_rw_unlock(&conn->table->conid_lock);
+ log_err("ngtcp2_conn_server_new failed: %s",
+ ngtcp2_strerror(rv));
+ return 0;
+ }
+ if(!doq_conn_setup_conids(conn)) {
+ lock_rw_unlock(&conn->table->conid_lock);
+ log_err("doq_conn_setup_conids failed: out of memory");
+ return 0;
+ }
+ lock_rw_unlock(&conn->table->conid_lock);
+ conn->ssl = doq_ssl_server_setup((SSL_CTX*)conn->doq_socket->ctx,
+ conn);
+ if(!conn->ssl) {
+ log_err("doq_ssl_server_setup failed");
+ return 0;
+ }
+ ngtcp2_conn_set_tls_native_handle(conn->conn, conn->ssl);
+ doq_conn_write_enable(conn);
+ return 1;
+}
+
+struct doq_conid*
+doq_conid_find(struct doq_table* table, const uint8_t* data, size_t datalen)
+{
+ struct rbnode_type* node;
+ struct doq_conid key;
+ key.node.key = &key;
+ key.cid = (void*)data;
+ key.cidlen = datalen;
+ node = rbtree_search(table->conid_tree, &key);
+ if(node)
+ return (struct doq_conid*)node->key;
+ return NULL;
+}
+
+/** insert conid in the conid list */
+static void
+doq_conid_list_insert(struct doq_conn* conn, struct doq_conid* conid)
+{
+ conid->prev = NULL;
+ conid->next = conn->conid_list;
+ if(conn->conid_list)
+ conn->conid_list->prev = conid;
+ conn->conid_list = conid;
+}
+
+/** remove conid from the conid list */
+static void
+doq_conid_list_remove(struct doq_conn* conn, struct doq_conid* conid)
+{
+ if(conid->prev)
+ conid->prev->next = conid->next;
+ else conn->conid_list = conid->next;
+ if(conid->next)
+ conid->next->prev = conid->prev;
+}
+
+/** create a doq_conid */
+static struct doq_conid*
+doq_conid_create(uint8_t* data, size_t datalen, struct doq_conn_key* key)
+{
+ struct doq_conid* conid;
+ conid = calloc(1, sizeof(*conid));
+ if(!conid)
+ return NULL;
+ conid->cid = memdup(data, datalen);
+ if(!conid->cid) {
+ free(conid);
+ return NULL;
+ }
+ conid->cidlen = datalen;
+ conid->node.key = conid;
+ conid->key = *key;
+ conid->key.dcid = memdup(key->dcid, key->dcidlen);
+ if(!conid->key.dcid) {
+ free(conid->cid);
+ free(conid);
+ return NULL;
+ }
+ return conid;
+}
+
+void
+doq_conid_delete(struct doq_conid* conid)
+{
+ if(!conid)
+ return;
+ free(conid->key.dcid);
+ free(conid->cid);
+ free(conid);
+}
+
+/** return true if the conid is for the conn. */
+static int
+conid_is_for_conn(struct doq_conn* conn, struct doq_conid* conid)
+{
+ if(conid->key.dcidlen == conn->key.dcidlen &&
+ memcmp(conid->key.dcid, conn->key.dcid, conid->key.dcidlen)==0
+ && conid->key.paddr.addrlen == conn->key.paddr.addrlen &&
+ memcmp(&conid->key.paddr.addr, &conn->key.paddr.addr,
+ conid->key.paddr.addrlen) == 0 &&
+ conid->key.paddr.localaddrlen == conn->key.paddr.localaddrlen &&
+ memcmp(&conid->key.paddr.localaddr, &conn->key.paddr.localaddr,
+ conid->key.paddr.localaddrlen) == 0 &&
+ conid->key.paddr.ifindex == conn->key.paddr.ifindex)
+ return 1;
+ return 0;
+}
+
+int
+doq_conn_associate_conid(struct doq_conn* conn, uint8_t* data, size_t datalen)
+{
+ struct doq_conid* conid;
+ conid = doq_conid_find(conn->table, data, datalen);
+ if(conid && !conid_is_for_conn(conn, conid)) {
+ verbose(VERB_ALGO, "doq connection id already exists for "
+ "another doq_conn. Ignoring second connection id.");
+ /* Already exists to another conn, ignore it.
+ * This works, in that the conid is listed in the doq_conn
+ * conid_list element, and removed from there. So our conid
+ * tree and list are fine, when created and removed.
+ * The tree now does not have the lookup element pointing
+ * to this connection. */
+ return 1;
+ }
+ if(conid)
+ return 1; /* already inserted */
+ conid = doq_conid_create(data, datalen, &conn->key);
+ if(!conid)
+ return 0;
+ doq_conid_list_insert(conn, conid);
+ (void)rbtree_insert(conn->table->conid_tree, &conid->node);
+ return 1;
+}
+
+void
+doq_conn_dissociate_conid(struct doq_conn* conn, const uint8_t* data,
+ size_t datalen)
+{
+ struct doq_conid* conid;
+ conid = doq_conid_find(conn->table, data, datalen);
+ if(conid && !conid_is_for_conn(conn, conid))
+ return;
+ if(conid) {
+ (void)rbtree_delete(conn->table->conid_tree,
+ conid->node.key);
+ doq_conid_list_remove(conn, conid);
+ doq_conid_delete(conid);
+ }
+}
+
+/** associate the scid array and also the dcid.
+ * caller must hold the locks on conn and doq_table.conid_lock. */
+static int
+doq_conn_setup_id_array_and_dcid(struct doq_conn* conn,
+ struct ngtcp2_cid* scids, size_t num_scid)
+{
+ size_t i;
+ for(i=0; i<num_scid; i++) {
+ if(!doq_conn_associate_conid(conn, scids[i].data,
+ scids[i].datalen))
+ return 0;
+ }
+ if(!doq_conn_associate_conid(conn, conn->key.dcid, conn->key.dcidlen))
+ return 0;
+ return 1;
+}
+
+int
+doq_conn_setup_conids(struct doq_conn* conn)
+{
+ size_t num_scid =
+#ifndef HAVE_NGTCP2_CONN_GET_NUM_SCID
+ ngtcp2_conn_get_scid(conn->conn, NULL);
+#else
+ ngtcp2_conn_get_num_scid(conn->conn);
+#endif
+ if(num_scid <= 4) {
+ struct ngtcp2_cid ids[4];
+ /* Usually there are not that many scids when just accepted,
+ * like only 2. */
+ ngtcp2_conn_get_scid(conn->conn, ids);
+ return doq_conn_setup_id_array_and_dcid(conn, ids, num_scid);
+ } else {
+ struct ngtcp2_cid *scids = calloc(num_scid,
+ sizeof(struct ngtcp2_cid));
+ if(!scids)
+ return 0;
+ ngtcp2_conn_get_scid(conn->conn, scids);
+ if(!doq_conn_setup_id_array_and_dcid(conn, scids, num_scid)) {
+ free(scids);
+ return 0;
+ }
+ free(scids);
+ }
+ return 1;
+}
+
+void
+doq_conn_clear_conids(struct doq_conn* conn)
+{
+ struct doq_conid* p, *next;
+ if(!conn)
+ return;
+ p = conn->conid_list;
+ while(p) {
+ next = p->next;
+ (void)rbtree_delete(conn->table->conid_tree, p->node.key);
+ doq_conid_delete(p);
+ p = next;
+ }
+ conn->conid_list = NULL;
+}
+
+ngtcp2_tstamp doq_get_timestamp_nanosec(void)
+{
+#ifdef CLOCK_REALTIME
+ struct timespec tp;
+ memset(&tp, 0, sizeof(tp));
+ /* Get a nanosecond time, that can be compared with the event base. */
+ if(clock_gettime(CLOCK_REALTIME, &tp) == -1) {
+ log_err("clock_gettime failed: %s", strerror(errno));
+ }
+ return ((uint64_t)tp.tv_sec)*((uint64_t)1000000000) +
+ ((uint64_t)tp.tv_nsec);
+#else
+ struct timeval tv;
+ if(gettimeofday(&tv, NULL) < 0) {
+ log_err("gettimeofday failed: %s", strerror(errno));
+ }
+ return ((uint64_t)tv.tv_sec)*((uint64_t)1000000000) +
+ ((uint64_t)tv.tv_usec)*((uint64_t)1000);
+#endif /* CLOCK_REALTIME */
+}
+
+/** doq start the closing period for the connection. */
+static int
+doq_conn_start_closing_period(struct comm_point* c, struct doq_conn* conn)
+{
+ struct ngtcp2_path_storage ps;
+ struct ngtcp2_pkt_info pi;
+ ngtcp2_ssize ret;
+ if(!conn)
+ return 1;
+ if(
+#ifdef HAVE_NGTCP2_CONN_IN_CLOSING_PERIOD
+ ngtcp2_conn_in_closing_period(conn->conn)
+#else
+ ngtcp2_conn_is_in_closing_period(conn->conn)
+#endif
+ )
+ return 1;
+ if(
+#ifdef HAVE_NGTCP2_CONN_IN_DRAINING_PERIOD
+ ngtcp2_conn_in_draining_period(conn->conn)
+#else
+ ngtcp2_conn_is_in_draining_period(conn->conn)
+#endif
+ ) {
+ doq_conn_write_disable(conn);
+ return 1;
+ }
+ ngtcp2_path_storage_zero(&ps);
+ sldns_buffer_clear(c->doq_socket->pkt_buf);
+ /* the call to ngtcp2_conn_write_connection_close causes the
+ * conn to be closed. It is now in the closing period. */
+ ret = ngtcp2_conn_write_connection_close(conn->conn, &ps.path,
+ &pi, sldns_buffer_begin(c->doq_socket->pkt_buf),
+ sldns_buffer_remaining(c->doq_socket->pkt_buf),
+#ifdef HAVE_NGTCP2_CCERR_DEFAULT
+ &conn->ccerr
+#else
+ &conn->last_error
+#endif
+ , doq_get_timestamp_nanosec());
+ if(ret < 0) {
+ log_err("doq ngtcp2_conn_write_connection_close failed: %s",
+ ngtcp2_strerror(ret));
+ return 0;
+ }
+ if(ret == 0) {
+ return 0;
+ }
+ sldns_buffer_set_position(c->doq_socket->pkt_buf, ret);
+ sldns_buffer_flip(c->doq_socket->pkt_buf);
+
+ /* The close packet is allocated, because it may have to be repeated.
+ * When incoming packets have this connection dcid. */
+ conn->close_pkt = memdup(sldns_buffer_begin(c->doq_socket->pkt_buf),
+ sldns_buffer_limit(c->doq_socket->pkt_buf));
+ if(!conn->close_pkt) {
+ log_err("doq: could not allocate close packet: out of memory");
+ return 0;
+ }
+ conn->close_pkt_len = sldns_buffer_limit(c->doq_socket->pkt_buf);
+ conn->close_ecn = pi.ecn;
+ return 1;
+}
+
+/** doq send the close packet for the connection, perhaps again. */
+int
+doq_conn_send_close(struct comm_point* c, struct doq_conn* conn)
+{
+ if(!conn)
+ return 0;
+ if(!conn->close_pkt)
+ return 0;
+ if(conn->close_pkt_len > sldns_buffer_capacity(c->doq_socket->pkt_buf))
+ return 0;
+ sldns_buffer_clear(c->doq_socket->pkt_buf);
+ sldns_buffer_write(c->doq_socket->pkt_buf, conn->close_pkt, conn->close_pkt_len);
+ sldns_buffer_flip(c->doq_socket->pkt_buf);
+ verbose(VERB_ALGO, "doq send connection close");
+ doq_send_pkt(c, &conn->key.paddr, conn->close_ecn);
+ doq_conn_write_disable(conn);
+ return 1;
+}
+
+/** doq close the connection on error. If it returns a failure, it
+ * does not wait to send a close, and the connection can be dropped. */
+static int
+doq_conn_close_error(struct comm_point* c, struct doq_conn* conn)
+{
+#ifdef HAVE_NGTCP2_CCERR_DEFAULT
+ if(conn->ccerr.type == NGTCP2_CCERR_TYPE_IDLE_CLOSE)
+ return 0;
+#else
+ if(conn->last_error.type ==
+ NGTCP2_CONNECTION_CLOSE_ERROR_CODE_TYPE_TRANSPORT_IDLE_CLOSE)
+ return 0;
+#endif
+ if(!doq_conn_start_closing_period(c, conn))
+ return 0;
+ if(
+#ifdef HAVE_NGTCP2_CONN_IN_DRAINING_PERIOD
+ ngtcp2_conn_in_draining_period(conn->conn)
+#else
+ ngtcp2_conn_is_in_draining_period(conn->conn)
+#endif
+ ) {
+ doq_conn_write_disable(conn);
+ return 1;
+ }
+ doq_conn_write_enable(conn);
+ if(!doq_conn_send_close(c, conn))
+ return 0;
+ return 1;
+}
+
+int
+doq_conn_recv(struct comm_point* c, struct doq_pkt_addr* paddr,
+ struct doq_conn* conn, struct ngtcp2_pkt_info* pi, int* err_retry,
+ int* err_drop)
+{
+ int ret;
+ ngtcp2_tstamp ts;
+ struct ngtcp2_path path;
+ memset(&path, 0, sizeof(path));
+ path.remote.addr = (struct sockaddr*)&paddr->addr;
+ path.remote.addrlen = paddr->addrlen;
+ path.local.addr = (struct sockaddr*)&paddr->localaddr;
+ path.local.addrlen = paddr->localaddrlen;
+ ts = doq_get_timestamp_nanosec();
+
+ ret = ngtcp2_conn_read_pkt(conn->conn, &path, pi,
+ sldns_buffer_begin(c->doq_socket->pkt_buf),
+ sldns_buffer_limit(c->doq_socket->pkt_buf), ts);
+ if(ret != 0) {
+ if(err_retry)
+ *err_retry = 0;
+ if(err_drop)
+ *err_drop = 0;
+ if(ret == NGTCP2_ERR_DRAINING) {
+ verbose(VERB_ALGO, "ngtcp2_conn_read_pkt returned %s",
+ ngtcp2_strerror(ret));
+ doq_conn_write_disable(conn);
+ return 0;
+ } else if(ret == NGTCP2_ERR_DROP_CONN) {
+ verbose(VERB_ALGO, "ngtcp2_conn_read_pkt returned %s",
+ ngtcp2_strerror(ret));
+ if(err_drop)
+ *err_drop = 1;
+ return 0;
+ } else if(ret == NGTCP2_ERR_RETRY) {
+ verbose(VERB_ALGO, "ngtcp2_conn_read_pkt returned %s",
+ ngtcp2_strerror(ret));
+ if(err_retry)
+ *err_retry = 1;
+ if(err_drop)
+ *err_drop = 1;
+ return 0;
+ } else if(ret == NGTCP2_ERR_CRYPTO) {
+ if(
+#ifdef HAVE_NGTCP2_CCERR_DEFAULT
+ !conn->ccerr.error_code
+#else
+ !conn->last_error.error_code
+#endif
+ ) {
+ /* in picotls the tls alert may need to be
+ * copied, but this is with openssl. And there
+ * is conn->tls_alert. */
+#ifdef HAVE_NGTCP2_CCERR_DEFAULT
+ ngtcp2_ccerr_set_tls_alert(&conn->ccerr,
+ conn->tls_alert, NULL, 0);
+#else
+ ngtcp2_connection_close_error_set_transport_error_tls_alert(
+ &conn->last_error, conn->tls_alert,
+ NULL, 0);
+#endif
+ }
+ } else {
+ if(
+#ifdef HAVE_NGTCP2_CCERR_DEFAULT
+ !conn->ccerr.error_code
+#else
+ !conn->last_error.error_code
+#endif
+ ) {
+#ifdef HAVE_NGTCP2_CCERR_DEFAULT
+ ngtcp2_ccerr_set_liberr(&conn->ccerr, ret,
+ NULL, 0);
+#else
+ ngtcp2_connection_close_error_set_transport_error_liberr(
+ &conn->last_error, ret, NULL, 0);
+#endif
+ }
+ }
+ log_err("ngtcp2_conn_read_pkt failed: %s",
+ ngtcp2_strerror(ret));
+ if(!doq_conn_close_error(c, conn)) {
+ if(err_drop)
+ *err_drop = 1;
+ }
+ return 0;
+ }
+ doq_conn_write_enable(conn);
+ return 1;
+}
+
+/** doq stream write is done */
+static void
+doq_stream_write_is_done(struct doq_conn* conn, struct doq_stream* stream)
+{
+ /* Cannot deallocate, the buffer may be needed for resends. */
+ doq_stream_off_write_list(conn, stream);
+}
+
+int
+doq_conn_write_streams(struct comm_point* c, struct doq_conn* conn,
+ int* err_drop)
+{
+ struct doq_stream* stream = conn->stream_write_first;
+ ngtcp2_path_storage ps;
+ ngtcp2_tstamp ts = doq_get_timestamp_nanosec();
+ size_t num_packets = 0, max_packets = 65535;
+ ngtcp2_path_storage_zero(&ps);
+
+ for(;;) {
+ int64_t stream_id;
+ uint32_t flags = 0;
+ ngtcp2_pkt_info pi;
+ ngtcp2_vec datav[2];
+ size_t datav_count = 0;
+ ngtcp2_ssize ret, ndatalen = 0;
+ int fin;
+
+ if(stream) {
+ /* data to send */
+ verbose(VERB_ALGO, "doq: doq_conn write stream %d",
+ (int)stream->stream_id);
+ stream_id = stream->stream_id;
+ fin = 1;
+ if(stream->nwrite < 2) {
+ datav[0].base = ((uint8_t*)&stream->
+ outlen_wire) + stream->nwrite;
+ datav[0].len = 2 - stream->nwrite;
+ datav[1].base = stream->out;
+ datav[1].len = stream->outlen;
+ datav_count = 2;
+ } else {
+ datav[0].base = stream->out +
+ (stream->nwrite-2);
+ datav[0].len = stream->outlen -
+ (stream->nwrite-2);
+ datav_count = 1;
+ }
+ } else {
+ /* no data to send */
+ verbose(VERB_ALGO, "doq: doq_conn write stream -1");
+ stream_id = -1;
+ fin = 0;
+ datav[0].base = NULL;
+ datav[0].len = 0;
+ datav_count = 1;
+ }
+
+ /* if more streams, set it to write more */
+ if(stream && stream->write_next)
+ flags |= NGTCP2_WRITE_STREAM_FLAG_MORE;
+ if(fin)
+ flags |= NGTCP2_WRITE_STREAM_FLAG_FIN;
+
+ sldns_buffer_clear(c->doq_socket->pkt_buf);
+ ret = ngtcp2_conn_writev_stream(conn->conn, &ps.path, &pi,
+ sldns_buffer_begin(c->doq_socket->pkt_buf),
+ sldns_buffer_remaining(c->doq_socket->pkt_buf),
+ &ndatalen, flags, stream_id, datav, datav_count, ts);
+ if(ret < 0) {
+ if(ret == NGTCP2_ERR_WRITE_MORE) {
+ verbose(VERB_ALGO, "doq: write more, ndatalen %d", (int)ndatalen);
+ if(stream) {
+ if(ndatalen >= 0)
+ stream->nwrite += ndatalen;
+ if(stream->nwrite >= stream->outlen+2)
+ doq_stream_write_is_done(
+ conn, stream);
+ stream = stream->write_next;
+ }
+ continue;
+ } else if(ret == NGTCP2_ERR_STREAM_DATA_BLOCKED) {
+ verbose(VERB_ALGO, "doq: ngtcp2_conn_writev_stream returned NGTCP2_ERR_STREAM_DATA_BLOCKED");
+#ifdef HAVE_NGTCP2_CCERR_DEFAULT
+ ngtcp2_ccerr_set_application_error(
+ &conn->ccerr, -1, NULL, 0);
+#else
+ ngtcp2_connection_close_error_set_application_error(&conn->last_error, -1, NULL, 0);
+#endif
+ if(err_drop)
+ *err_drop = 0;
+ if(!doq_conn_close_error(c, conn)) {
+ if(err_drop)
+ *err_drop = 1;
+ }
+ return 0;
+ } else if(ret == NGTCP2_ERR_STREAM_SHUT_WR) {
+ verbose(VERB_ALGO, "doq: ngtcp2_conn_writev_stream returned NGTCP2_ERR_STREAM_SHUT_WR");
+#ifdef HAVE_NGTCP2_CCERR_DEFAULT
+ ngtcp2_ccerr_set_application_error(
+ &conn->ccerr, -1, NULL, 0);
+#else
+ ngtcp2_connection_close_error_set_application_error(&conn->last_error, -1, NULL, 0);
+#endif
+ if(err_drop)
+ *err_drop = 0;
+ if(!doq_conn_close_error(c, conn)) {
+ if(err_drop)
+ *err_drop = 1;
+ }
+ return 0;
+ }
+
+ log_err("doq: ngtcp2_conn_writev_stream failed: %s",
+ ngtcp2_strerror(ret));
+#ifdef HAVE_NGTCP2_CCERR_DEFAULT
+ ngtcp2_ccerr_set_liberr(&conn->ccerr, ret, NULL, 0);
+#else
+ ngtcp2_connection_close_error_set_transport_error_liberr(
+ &conn->last_error, ret, NULL, 0);
+#endif
+ if(err_drop)
+ *err_drop = 0;
+ if(!doq_conn_close_error(c, conn)) {
+ if(err_drop)
+ *err_drop = 1;
+ }
+ return 0;
+ }
+ verbose(VERB_ALGO, "doq: writev_stream pkt size %d ndatawritten %d",
+ (int)ret, (int)ndatalen);
+
+ if(ndatalen >= 0 && stream) {
+ stream->nwrite += ndatalen;
+ if(stream->nwrite >= stream->outlen+2)
+ doq_stream_write_is_done(conn, stream);
+ }
+ if(ret == 0) {
+ /* congestion limited */
+ doq_conn_write_disable(conn);
+ ngtcp2_conn_update_pkt_tx_time(conn->conn, ts);
+ return 1;
+ }
+ sldns_buffer_set_position(c->doq_socket->pkt_buf, ret);
+ sldns_buffer_flip(c->doq_socket->pkt_buf);
+ doq_send_pkt(c, &conn->key.paddr, pi.ecn);
+
+ if(c->doq_socket->have_blocked_pkt)
+ break;
+ if(++num_packets == max_packets)
+ break;
+ if(stream)
+ stream = stream->write_next;
+ }
+ ngtcp2_conn_update_pkt_tx_time(conn->conn, ts);
+ return 1;
+}
+
+void
+doq_conn_write_enable(struct doq_conn* conn)
+{
+ conn->write_interest = 1;
+}
+
+void
+doq_conn_write_disable(struct doq_conn* conn)
+{
+ conn->write_interest = 0;
+}
+
+/** doq append the connection to the write list */
+static void
+doq_conn_write_list_append(struct doq_table* table, struct doq_conn* conn)
+{
+ if(conn->on_write_list)
+ return;
+ conn->write_prev = table->write_list_last;
+ if(table->write_list_last)
+ table->write_list_last->write_next = conn;
+ else table->write_list_first = conn;
+ conn->write_next = NULL;
+ table->write_list_last = conn;
+ conn->on_write_list = 1;
+}
+
+void
+doq_conn_write_list_remove(struct doq_table* table, struct doq_conn* conn)
+{
+ if(!conn->on_write_list)
+ return;
+ if(conn->write_next)
+ conn->write_next->write_prev = conn->write_prev;
+ else table->write_list_last = conn->write_prev;
+ if(conn->write_prev)
+ conn->write_prev->write_next = conn->write_next;
+ else table->write_list_first = conn->write_next;
+ conn->write_prev = NULL;
+ conn->write_next = NULL;
+ conn->on_write_list = 0;
+}
+
+void
+doq_conn_set_write_list(struct doq_table* table, struct doq_conn* conn)
+{
+ if(conn->write_interest && conn->on_write_list)
+ return;
+ if(!conn->write_interest && !conn->on_write_list)
+ return;
+ if(conn->write_interest)
+ doq_conn_write_list_append(table, conn);
+ else doq_conn_write_list_remove(table, conn);
+}
+
+struct doq_conn*
+doq_table_pop_first(struct doq_table* table)
+{
+ struct doq_conn* conn = table->write_list_first;
+ if(!conn)
+ return NULL;
+ lock_basic_lock(&conn->lock);
+ table->write_list_first = conn->write_next;
+ if(conn->write_next)
+ conn->write_next->write_prev = NULL;
+ else table->write_list_last = NULL;
+ conn->write_next = NULL;
+ conn->write_prev = NULL;
+ conn->on_write_list = 0;
+ return conn;
+}
+
+int
+doq_conn_check_timer(struct doq_conn* conn, struct timeval* tv)
+{
+ ngtcp2_tstamp expiry = ngtcp2_conn_get_expiry(conn->conn);
+ ngtcp2_tstamp now = doq_get_timestamp_nanosec();
+ ngtcp2_tstamp t;
+
+ if(expiry <= now) {
+ /* The timer has already expired, add with zero timeout.
+ * This should call the callback straight away. Calling it
+ * from the event callbacks is cleaner than calling it here,
+ * because then it is always called with the same locks and
+ * so on. This routine only has the conn.lock. */
+ t = now;
+ } else {
+ t = expiry;
+ }
+
+ /* convert to timeval */
+ memset(tv, 0, sizeof(*tv));
+ tv->tv_sec = t / NGTCP2_SECONDS;
+ tv->tv_usec = (t / NGTCP2_MICROSECONDS)%1000000;
+
+ /* If we already have a timer, is it the right value? */
+ if(conn->timer.timer_in_tree || conn->timer.timer_in_list) {
+ if(conn->timer.time.tv_sec == tv->tv_sec &&
+ conn->timer.time.tv_usec == tv->tv_usec)
+ return 0;
+ }
+ return 1;
+}
+
+/* doq print connection log */
+static void
+doq_conn_log_line(struct doq_conn* conn, char* s)
+{
+ char remotestr[256], localstr[256];
+ addr_to_str((void*)&conn->key.paddr.addr, conn->key.paddr.addrlen,
+ remotestr, sizeof(remotestr));
+ addr_to_str((void*)&conn->key.paddr.localaddr,
+ conn->key.paddr.localaddrlen, localstr, sizeof(localstr));
+ log_info("doq conn %s %s %s", remotestr, localstr, s);
+}
+
+int
+doq_conn_handle_timeout(struct doq_conn* conn)
+{
+ ngtcp2_tstamp now = doq_get_timestamp_nanosec();
+ int rv;
+
+ if(verbosity >= VERB_ALGO)
+ doq_conn_log_line(conn, "timeout");
+
+ rv = ngtcp2_conn_handle_expiry(conn->conn, now);
+ if(rv != 0) {
+ verbose(VERB_ALGO, "ngtcp2_conn_handle_expiry failed: %s",
+ ngtcp2_strerror(rv));
+#ifdef HAVE_NGTCP2_CCERR_DEFAULT
+ ngtcp2_ccerr_set_liberr(&conn->ccerr, rv, NULL, 0);
+#else
+ ngtcp2_connection_close_error_set_transport_error_liberr(
+ &conn->last_error, rv, NULL, 0);
+#endif
+ if(!doq_conn_close_error(conn->doq_socket->cp, conn)) {
+ /* failed, return for deletion */
+ return 0;
+ }
+ return 1;
+ }
+ doq_conn_write_enable(conn);
+ if(!doq_conn_write_streams(conn->doq_socket->cp, conn, NULL)) {
+ /* failed, return for deletion. */
+ return 0;
+ }
+ return 1;
+}
+
+void
+doq_table_quic_size_add(struct doq_table* table, size_t add)
+{
+ lock_basic_lock(&table->size_lock);
+ table->current_size += add;
+ lock_basic_unlock(&table->size_lock);
+}
+
+void
+doq_table_quic_size_subtract(struct doq_table* table, size_t subtract)
+{
+ lock_basic_lock(&table->size_lock);
+ if(table->current_size < subtract)
+ table->current_size = 0;
+ else table->current_size -= subtract;
+ lock_basic_unlock(&table->size_lock);
+}
+
+int
+doq_table_quic_size_available(struct doq_table* table,
+ struct config_file* cfg, size_t mem)
+{
+ size_t cur;
+ lock_basic_lock(&table->size_lock);
+ cur = table->current_size;
+ lock_basic_unlock(&table->size_lock);
+
+ if(cur + mem > cfg->quic_size)
+ return 0;
+ return 1;
+}
+
+size_t doq_table_quic_size_get(struct doq_table* table)
+{
+ size_t sz;
+ if(!table)
+ return 0;
+ lock_basic_lock(&table->size_lock);
+ sz = table->current_size;
+ lock_basic_unlock(&table->size_lock);
+ return sz;
+}
+#endif /* HAVE_NGTCP2 */
diff --git a/services/listen_dnsport.h b/services/listen_dnsport.h
index 84ac4b068b1b..c29f4d72b0a2 100644
--- a/services/listen_dnsport.h
+++ b/services/listen_dnsport.h
@@ -43,10 +43,16 @@
#define LISTEN_DNSPORT_H
#include "util/netevent.h"
+#include "util/rbtree.h"
+#include "util/locks.h"
#include "daemon/acl_list.h"
#ifdef HAVE_NGHTTP2_NGHTTP2_H
#include <nghttp2/nghttp2.h>
#endif
+#ifdef HAVE_NGTCP2
+#include <ngtcp2/ngtcp2.h>
+#include <ngtcp2/ngtcp2_crypto.h>
+#endif
struct listen_list;
struct config_file;
struct addrinfo;
@@ -100,7 +106,9 @@ enum listen_type {
/** udp ipv6 (v4mapped) for use with ancillary data + dnscrypt*/
listen_type_udpancil_dnscrypt,
/** HTTP(2) over TLS over TCP */
- listen_type_http
+ listen_type_http,
+ /** DNS over QUIC */
+ listen_type_doq
};
/*
@@ -188,6 +196,11 @@ int resolve_interface_names(char** ifs, int num_ifs,
* @param tcp_conn_limit: TCP connection limit info.
* @param sslctx: nonNULL if ssl context.
* @param dtenv: nonNULL if dnstap enabled.
+ * @param doq_table: the doq connection table, with shared information.
+ * @param rnd: random state.
+ * @param ssl_service_key: the SSL service key file.
+ * @param ssl_service_pem: the SSL service pem file.
+ * @param cfg: config file struct.
* @param cb: callback function when a request arrives. It is passed
* the packet and user argument. Return true to send a reply.
* @param cb_arg: user data argument for callback function.
@@ -198,8 +211,10 @@ listen_create(struct comm_base* base, struct listen_port* ports,
size_t bufsize, int tcp_accept_count, int tcp_idle_timeout,
int harden_large_queries, uint32_t http_max_streams,
char* http_endpoint, int http_notls, struct tcl_list* tcp_conn_limit,
- void* sslctx, struct dt_env* dtenv, comm_point_callback_type* cb,
- void *cb_arg);
+ void* sslctx, struct dt_env* dtenv, struct doq_table* doq_table,
+ struct ub_randstate* rnd, const char* ssl_service_key,
+ const char* ssl_service_pem, struct config_file* cfg,
+ comm_point_callback_type* cb, void *cb_arg);
/**
* delete the listening structure
@@ -278,11 +293,12 @@ int create_udp_sock(int family, int socktype, struct sockaddr* addr,
* @param freebind: set IP_FREEBIND socket option.
* @param use_systemd: if true, fetch sockets from systemd.
* @param dscp: DSCP to use.
+ * @param additional: additional log information for the socket type.
* @return: the socket. -1 on error.
*/
int create_tcp_accept_sock(struct addrinfo *addr, int v6only, int* noproto,
int* reuseport, int transparent, int mss, int nodelay, int freebind,
- int use_systemd, int dscp);
+ int use_systemd, int dscp, const char* additional);
/**
* Create and bind local listening socket
@@ -452,6 +468,377 @@ int http2_submit_dns_response(struct http2_session* h2_session);
int http2_submit_dns_response(void* v);
#endif /* HAVE_NGHTTP2 */
+#ifdef HAVE_NGTCP2
+struct doq_conid;
+struct doq_server_socket;
+
+/**
+ * DoQ shared connection table. This is the connections for the host.
+ * And some config parameter values for connections. The host has to
+ * respond on that ip,port for those connections, so they are shared
+ * between threads.
+ */
+struct doq_table {
+ /** the lock on the tree and config elements. insert and deletion,
+ * also lookup in the tree needs to hold the lock. */
+ lock_rw_type lock;
+ /** rbtree of doq_conn, the connections to different destination
+ * addresses, and can be found by dcid. */
+ struct rbtree_type* conn_tree;
+ /** lock for the conid tree, needed for the conid tree and also
+ * the conid elements */
+ lock_rw_type conid_lock;
+ /** rbtree of doq_conid, connections can be found by their
+ * connection ids. Lookup by connection id, finds doq_conn. */
+ struct rbtree_type* conid_tree;
+ /** the server scid length */
+ int sv_scidlen;
+ /** the static secret for the server */
+ uint8_t* static_secret;
+ /** length of the static secret */
+ size_t static_secret_len;
+ /** the idle timeout in nanoseconds */
+ uint64_t idle_timeout;
+ /** the list of write interested connections, hold the doq_table.lock
+ * to change them */
+ struct doq_conn* write_list_first, *write_list_last;
+ /** rbtree of doq_timer. */
+ struct rbtree_type* timer_tree;
+ /** lock on the current_size counter. */
+ lock_basic_type size_lock;
+ /** current use, in bytes, of QUIC buffers.
+ * The doq_conn ngtcp2_conn structure, SSL structure and conid structs
+ * are not counted. */
+ size_t current_size;
+};
+
+/** create doq table */
+struct doq_table* doq_table_create(struct config_file* cfg,
+ struct ub_randstate* rnd);
+
+/** delete doq table */
+void doq_table_delete(struct doq_table* table);
+
+/**
+ * Timer information for doq timer.
+ */
+struct doq_timer {
+ /** The rbnode in the tree sorted by timeout value. Key this struct. */
+ struct rbnode_type node;
+ /** The timeout value. Absolute time value. */
+ struct timeval time;
+ /** If the timer is in the time tree, with the node. */
+ int timer_in_tree;
+ /** If there are more timers with the exact same timeout value,
+ * they form a set of timers. The rbnode timer has a link to the list
+ * with the other timers in the set. The rbnode timer is not a
+ * member of the list with the other timers. The other timers are not
+ * linked into the tree. */
+ struct doq_timer* setlist_first, *setlist_last;
+ /** If the timer is on the setlist. */
+ int timer_in_list;
+ /** If in the setlist, the next and prev element. */
+ struct doq_timer* setlist_next, *setlist_prev;
+ /** The connection that is timeouted. */
+ struct doq_conn* conn;
+ /** The worker that is waiting for the timeout event.
+ * Set for the rbnode tree linked element. If a worker is waiting
+ * for the event. If NULL, no worker is waiting for this timeout. */
+ struct doq_server_socket* worker_doq_socket;
+};
+
+/**
+ * Key information that makes a doq_conn node in the tree lookup.
+ */
+struct doq_conn_key {
+ /** the remote endpoint and local endpoint and ifindex */
+ struct doq_pkt_addr paddr;
+ /** the doq connection dcid */
+ uint8_t* dcid;
+ /** length of dcid */
+ size_t dcidlen;
+};
+
+/**
+ * DoQ connection, for DNS over QUIC. One connection to a remote endpoint
+ * with a number of streams in it. Every stream is like a tcp stream with
+ * a uint16_t length, query read, and a uint16_t length and answer written.
+ */
+struct doq_conn {
+ /** rbtree node, key is addresses and dcid */
+ struct rbnode_type node;
+ /** lock on the connection */
+ lock_basic_type lock;
+ /** the key information, with dcid and address endpoint */
+ struct doq_conn_key key;
+ /** the doq server socket for inside callbacks */
+ struct doq_server_socket* doq_socket;
+ /** the doq table this connection is part of */
+ struct doq_table* table;
+ /** if the connection is about to be deleted. */
+ uint8_t is_deleted;
+ /** the version, the client chosen version of QUIC */
+ uint32_t version;
+ /** the ngtcp2 connection, a server connection */
+ struct ngtcp2_conn* conn;
+ /** the connection ids that are associated with this doq_conn.
+ * There can be a number, that can change. They are linked here,
+ * so that upon removal, the list of actually associated conid
+ * elements can be removed as well. */
+ struct doq_conid* conid_list;
+ /** the ngtcp2 last error for the connection */
+#ifdef HAVE_NGTCP2_CCERR_DEFAULT
+ struct ngtcp2_ccerr ccerr;
+#else
+ struct ngtcp2_connection_close_error last_error;
+#endif
+ /** the recent tls alert error code */
+ uint8_t tls_alert;
+ /** the ssl context, SSL* */
+ void* ssl;
+#ifdef HAVE_NGTCP2_CRYPTO_QUICTLS_CONFIGURE_SERVER_CONTEXT
+ /** the connection reference for ngtcp2_conn and userdata in ssl */
+ struct ngtcp2_crypto_conn_ref conn_ref;
+#endif
+ /** closure packet, if any */
+ uint8_t* close_pkt;
+ /** length of closure packet. */
+ size_t close_pkt_len;
+ /** closure ecn */
+ uint32_t close_ecn;
+ /** the streams for this connection, of type doq_stream */
+ struct rbtree_type stream_tree;
+ /** the streams that want write, they have something to write.
+ * The list is ordered, the last have to wait for the first to
+ * get their data written. */
+ struct doq_stream* stream_write_first, *stream_write_last;
+ /** the conn has write interest if true, no write interest if false. */
+ uint8_t write_interest;
+ /** if the conn is on the connection write list */
+ uint8_t on_write_list;
+ /** the connection write list prev and next, if on the write list */
+ struct doq_conn* write_prev, *write_next;
+ /** The timer for the connection. If unused, it is not in the tree
+ * and not in the list. It is alloced here, so that it is prealloced.
+ * It has to be set after every read and write on the connection, so
+ * this improves performance, but also the allocation does not fail. */
+ struct doq_timer timer;
+};
+
+/**
+ * Connection ID and the doq_conn that is that connection. A connection
+ * has an original dcid, and then more connection ids associated.
+ */
+struct doq_conid {
+ /** rbtree node, key is the connection id. */
+ struct rbnode_type node;
+ /** the next and prev in the list of conids for the doq_conn */
+ struct doq_conid* next, *prev;
+ /** key to the doq_conn that is the connection */
+ struct doq_conn_key key;
+ /** the connection id, byte string */
+ uint8_t* cid;
+ /** the length of cid */
+ size_t cidlen;
+};
+
+/**
+ * DoQ stream, for DNS over QUIC.
+ */
+struct doq_stream {
+ /** the rbtree node for the stream, key is the stream_id */
+ rbnode_type node;
+ /** the stream id */
+ int64_t stream_id;
+ /** if the stream is closed */
+ uint8_t is_closed;
+ /** if the query is complete */
+ uint8_t is_query_complete;
+ /** the number of bytes read on the stream, up to querylen+2. */
+ size_t nread;
+ /** the length of the input query bytes */
+ size_t inlen;
+ /** the input bytes */
+ uint8_t* in;
+ /** does the stream have an answer to send */
+ uint8_t is_answer_available;
+ /** the answer bytes sent, up to outlen+2. */
+ size_t nwrite;
+ /** the length of the output answer bytes */
+ size_t outlen;
+ /** the output length in network wireformat */
+ uint16_t outlen_wire;
+ /** the output packet bytes */
+ uint8_t* out;
+ /** if the stream is on the write list */
+ uint8_t on_write_list;
+ /** the prev and next on the write list, if on the list */
+ struct doq_stream* write_prev, *write_next;
+};
+
+/** doq application error code that is sent when a stream is closed */
+#define DOQ_APP_ERROR_CODE 1
+
+/**
+ * Create the doq connection.
+ * @param c: the comm point for the listening doq socket.
+ * @param paddr: with remote and local address and ifindex for the
+ * connection destination. This is where packets are sent.
+ * @param dcid: the dcid, Destination Connection ID.
+ * @param dcidlen: length of dcid.
+ * @param version: client chosen version.
+ * @return new doq connection or NULL on allocation failure.
+ */
+struct doq_conn* doq_conn_create(struct comm_point* c,
+ struct doq_pkt_addr* paddr, const uint8_t* dcid, size_t dcidlen,
+ uint32_t version);
+
+/**
+ * Delete the doq connection structure.
+ * @param conn: to delete.
+ * @param table: with memory size.
+ */
+void doq_conn_delete(struct doq_conn* conn, struct doq_table* table);
+
+/** compare function of doq_conn */
+int doq_conn_cmp(const void* key1, const void* key2);
+
+/** compare function of doq_conid */
+int doq_conid_cmp(const void* key1, const void* key2);
+
+/** compare function of doq_timer */
+int doq_timer_cmp(const void* key1, const void* key2);
+
+/** compare function of doq_stream */
+int doq_stream_cmp(const void* key1, const void* key2);
+
+/** setup the doq_socket server tls context */
+int doq_socket_setup_ctx(struct doq_server_socket* doq_socket);
+
+/** setup the doq connection callbacks, and settings. */
+int doq_conn_setup(struct doq_conn* conn, uint8_t* scid, size_t scidlen,
+ uint8_t* ocid, size_t ocidlen, const uint8_t* token, size_t tokenlen);
+
+/** fill a buffer with random data */
+void doq_fill_rand(struct ub_randstate* rnd, uint8_t* buf, size_t len);
+
+/** delete a doq_conid */
+void doq_conid_delete(struct doq_conid* conid);
+
+/** add a connection id to the doq_conn.
+ * caller must hold doq_table.conid_lock. */
+int doq_conn_associate_conid(struct doq_conn* conn, uint8_t* data,
+ size_t datalen);
+
+/** remove a connection id from the doq_conn.
+ * caller must hold doq_table.conid_lock. */
+void doq_conn_dissociate_conid(struct doq_conn* conn, const uint8_t* data,
+ size_t datalen);
+
+/** initial setup to link current connection ids to the doq_conn */
+int doq_conn_setup_conids(struct doq_conn* conn);
+
+/** remove the connection ids from the doq_conn.
+ * caller must hold doq_table.conid_lock. */
+void doq_conn_clear_conids(struct doq_conn* conn);
+
+/** find a conid in the doq_conn connection.
+ * caller must hold table.conid_lock. */
+struct doq_conid* doq_conid_find(struct doq_table* doq_table,
+ const uint8_t* data, size_t datalen);
+
+/** receive a packet for a connection */
+int doq_conn_recv(struct comm_point* c, struct doq_pkt_addr* paddr,
+ struct doq_conn* conn, struct ngtcp2_pkt_info* pi, int* err_retry,
+ int* err_drop);
+
+/** send packets for a connection */
+int doq_conn_write_streams(struct comm_point* c, struct doq_conn* conn,
+ int* err_drop);
+
+/** send the close packet for the connection, perhaps again. */
+int doq_conn_send_close(struct comm_point* c, struct doq_conn* conn);
+
+/** delete doq stream */
+void doq_stream_delete(struct doq_stream* stream);
+
+/** doq read a connection key from repinfo. It is not malloced, but points
+ * into the repinfo for the dcid. */
+void doq_conn_key_from_repinfo(struct doq_conn_key* key,
+ struct comm_reply* repinfo);
+
+/** doq find a stream in the connection */
+struct doq_stream* doq_stream_find(struct doq_conn* conn, int64_t stream_id);
+
+/** doq shutdown the stream. */
+int doq_stream_close(struct doq_conn* conn, struct doq_stream* stream,
+ int send_shutdown);
+
+/** send reply for a connection */
+int doq_stream_send_reply(struct doq_conn* conn, struct doq_stream* stream,
+ struct sldns_buffer* buf);
+
+/** the connection has write interest, wants to write packets */
+void doq_conn_write_enable(struct doq_conn* conn);
+
+/** the connection has no write interest, does not want to write packets */
+void doq_conn_write_disable(struct doq_conn* conn);
+
+/** set the connection on or off the write list, depending on write interest */
+void doq_conn_set_write_list(struct doq_table* table, struct doq_conn* conn);
+
+/** doq remove the connection from the write list */
+void doq_conn_write_list_remove(struct doq_table* table,
+ struct doq_conn* conn);
+
+/** doq get the first conn from the write list, if any, popped from list.
+ * Locks the conn that is returned. */
+struct doq_conn* doq_table_pop_first(struct doq_table* table);
+
+/**
+ * doq check if the timer for the conn needs to be changed.
+ * @param conn: connection, caller must hold lock on it.
+ * @param tv: time value, absolute time, returned.
+ * @return true if timer needs to be set to tv, false if no change is needed
+ * to the timer. The timer is already set to the right time in that case.
+ */
+int doq_conn_check_timer(struct doq_conn* conn, struct timeval* tv);
+
+/** doq remove timer from tree */
+void doq_timer_tree_remove(struct doq_table* table, struct doq_timer* timer);
+
+/** doq remove timer from list */
+void doq_timer_list_remove(struct doq_table* table, struct doq_timer* timer);
+
+/** doq unset the timer if it was set. */
+void doq_timer_unset(struct doq_table* table, struct doq_timer* timer);
+
+/** doq set the timer and add it. */
+void doq_timer_set(struct doq_table* table, struct doq_timer* timer,
+ struct doq_server_socket* worker_doq_socket, struct timeval* tv);
+
+/** doq find a timeout in the timer tree */
+struct doq_timer* doq_timer_find_time(struct doq_table* table,
+ struct timeval* tv);
+
+/** doq handle timeout for a connection. Pass conn locked. Returns false for
+ * deletion. */
+int doq_conn_handle_timeout(struct doq_conn* conn);
+
+/** doq add size to the current quic buffer counter */
+void doq_table_quic_size_add(struct doq_table* table, size_t add);
+
+/** doq subtract size from the current quic buffer counter */
+void doq_table_quic_size_subtract(struct doq_table* table, size_t subtract);
+
+/** doq check if mem is available for quic. */
+int doq_table_quic_size_available(struct doq_table* table,
+ struct config_file* cfg, size_t mem);
+
+/** doq get the quic size value */
+size_t doq_table_quic_size_get(struct doq_table* table);
+#endif /* HAVE_NGTCP2 */
+
char* set_ip_dscp(int socket, int addrfamily, int ds);
/** for debug and profiling purposes only
@@ -459,4 +846,14 @@ char* set_ip_dscp(int socket, int addrfamily, int ds);
*/
void verbose_print_unbound_socket(struct unbound_socket* ub_sock);
+/** event callback for testcode/doqclient */
+void doq_client_event_cb(int fd, short event, void* arg);
+
+/** timer event callback for testcode/doqclient */
+void doq_client_timer_cb(int fd, short event, void* arg);
+
+#ifdef HAVE_NGTCP2
+/** get a timestamp in nanoseconds */
+ngtcp2_tstamp doq_get_timestamp_nanosec(void);
+#endif
#endif /* LISTEN_DNSPORT_H */
diff --git a/services/mesh.c b/services/mesh.c
index 522118844b44..d512ab3d32d4 100644
--- a/services/mesh.c
+++ b/services/mesh.c
@@ -311,7 +311,7 @@ int mesh_make_new_space(struct mesh_area* mesh, sldns_buffer* qbuf)
struct dns_msg*
mesh_serve_expired_lookup(struct module_qstate* qstate,
- struct query_info* lookup_qinfo)
+ struct query_info* lookup_qinfo, int* is_expired)
{
hashvalue_type h;
struct lruhash_entry* e;
@@ -321,6 +321,7 @@ mesh_serve_expired_lookup(struct module_qstate* qstate,
time_t timenow = *qstate->env->now;
int must_validate = (!(qstate->query_flags&BIT_CD)
|| qstate->env->cfg->ignore_cd) && qstate->env->need_to_validate;
+ *is_expired = 0;
/* Lookup cache */
h = query_info_hash(lookup_qinfo, qstate->query_flags);
e = slabhash_lookup(qstate->env->msg_cache, h, lookup_qinfo, 0);
@@ -328,6 +329,7 @@ mesh_serve_expired_lookup(struct module_qstate* qstate,
key = (struct msgreply_entry*)e->key;
data = (struct reply_info*)e->data;
+ if(data->ttl < timenow) *is_expired = 1;
msg = tomsg(qstate->env, &key->key, data, qstate->region, timenow,
qstate->env->cfg->serve_expired, qstate->env->scratch);
if(!msg)
@@ -2176,6 +2178,7 @@ mesh_serve_expired_callback(void* arg)
int must_validate = (!(qstate->query_flags&BIT_CD)
|| qstate->env->cfg->ignore_cd) && qstate->env->need_to_validate;
int i = 0;
+ int is_expired;
if(!qstate->serve_expired_data) return;
verbose(VERB_ALGO, "Serve expired: Trying to reply with expired data");
comm_timer_delete(qstate->serve_expired_data->timer);
@@ -2193,7 +2196,7 @@ mesh_serve_expired_callback(void* arg)
fptr_ok(fptr_whitelist_serve_expired_lookup(
qstate->serve_expired_data->get_cached_answer));
msg = (*qstate->serve_expired_data->get_cached_answer)(qstate,
- lookup_qinfo);
+ lookup_qinfo, &is_expired);
if(!msg)
return;
/* Reset these in case we pass a second time from here. */
@@ -2285,8 +2288,10 @@ mesh_serve_expired_callback(void* arg)
/* Add EDE Stale Answer (RCF8914). Ignore global ede as this is
* warning instead of an error */
- if (r->edns.edns_present && qstate->env->cfg->ede_serve_expired &&
- qstate->env->cfg->ede) {
+ if(r->edns.edns_present &&
+ qstate->env->cfg->ede_serve_expired &&
+ qstate->env->cfg->ede &&
+ is_expired) {
edns_opt_list_append_ede(&r->edns.opt_list_out,
mstate->s.region, LDNS_EDE_STALE_ANSWER, NULL);
}
diff --git a/services/mesh.h b/services/mesh.h
index 5bd53e065e8f..26ececbe6210 100644
--- a/services/mesh.h
+++ b/services/mesh.h
@@ -673,11 +673,12 @@ void mesh_serve_expired_callback(void* arg);
* the same behavior as when replying from cache.
* @param qstate: the module qstate.
* @param lookup_qinfo: the query info to look for in the cache.
+ * @param is_expired: set if the cached answer is expired.
* @return dns_msg if a cached answer was found, otherwise NULL.
*/
struct dns_msg*
mesh_serve_expired_lookup(struct module_qstate* qstate,
- struct query_info* lookup_qinfo);
+ struct query_info* lookup_qinfo, int* is_expired);
/**
* See if the mesh has space for more queries. You can allocate queries
diff --git a/services/modstack.c b/services/modstack.c
index 6c8af0505b69..fa68cc71d2ff 100644
--- a/services/modstack.c
+++ b/services/modstack.c
@@ -265,7 +265,7 @@ modstack_call_init(struct module_stack* stack, const char* module_conf,
int i, changed = 0;
env->need_to_validate = 0; /* set by module init below */
for(i=0; i<stack->num; i++) {
- while(*module_conf && isspace(*module_conf))
+ while(*module_conf && isspace((unsigned char)*module_conf))
module_conf++;
if(strncmp(stack->mod[i]->name, module_conf,
strlen(stack->mod[i]->name))) {
diff --git a/services/rpz.c b/services/rpz.c
index d8999a8a55eb..3b92ee53837e 100644
--- a/services/rpz.c
+++ b/services/rpz.c
@@ -1969,6 +1969,7 @@ rpz_synthesize_nodata(struct rpz* ATTR_UNUSED(r), struct module_qstate* ms,
0, /* ttl */
0, /* prettl */
0, /* expttl */
+ 0, /* norecttl */
0, /* an */
0, /* ns */
0, /* ar */
@@ -1999,6 +2000,7 @@ rpz_synthesize_nxdomain(struct rpz* r, struct module_qstate* ms,
0, /* ttl */
0, /* prettl */
0, /* expttl */
+ 0, /* norecttl */
0, /* an */
0, /* ns */
0, /* ar */
@@ -2031,6 +2033,7 @@ rpz_synthesize_localdata_from_rrset(struct rpz* ATTR_UNUSED(r), struct module_qs
0, /* ttl */
0, /* prettl */
0, /* expttl */
+ 0, /* norecttl */
1, /* an */
0, /* ns */
0, /* ar */
@@ -2176,6 +2179,7 @@ rpz_synthesize_cname_override_msg(struct rpz* r, struct module_qstate* ms,
0, /* ttl */
0, /* prettl */
0, /* expttl */
+ 0, /* norecttl */
1, /* an */
0, /* ns */
0, /* ar */
@@ -2288,15 +2292,18 @@ rpz_apply_nsip_trigger(struct module_qstate* ms, struct query_info* qchase,
if(action == RPZ_LOCAL_DATA_ACTION && raddr->data == NULL) {
verbose(VERB_ALGO, "rpz: bug: nsip local data action but no local data");
ret = rpz_synthesize_nodata(r, ms, qchase, az);
+ ms->rpz_applied = 1;
goto done;
}
switch(action) {
case RPZ_NXDOMAIN_ACTION:
ret = rpz_synthesize_nxdomain(r, ms, qchase, az);
+ ms->rpz_applied = 1;
break;
case RPZ_NODATA_ACTION:
ret = rpz_synthesize_nodata(r, ms, qchase, az);
+ ms->rpz_applied = 1;
break;
case RPZ_TCP_ONLY_ACTION:
/* basically a passthru here but the tcp-only will be
@@ -2306,11 +2313,13 @@ rpz_apply_nsip_trigger(struct module_qstate* ms, struct query_info* qchase,
break;
case RPZ_DROP_ACTION:
ret = rpz_synthesize_nodata(r, ms, qchase, az);
+ ms->rpz_applied = 1;
ms->is_drop = 1;
break;
case RPZ_LOCAL_DATA_ACTION:
ret = rpz_synthesize_nsip_localdata(r, ms, qchase, raddr, az);
if(ret == NULL) { ret = rpz_synthesize_nodata(r, ms, qchase, az); }
+ ms->rpz_applied = 1;
break;
case RPZ_PASSTHRU_ACTION:
ret = NULL;
@@ -2318,6 +2327,7 @@ rpz_apply_nsip_trigger(struct module_qstate* ms, struct query_info* qchase,
break;
case RPZ_CNAME_OVERRIDE_ACTION:
ret = rpz_synthesize_cname_override_msg(r, ms, qchase);
+ ms->rpz_applied = 1;
break;
default:
verbose(VERB_ALGO, "rpz: nsip: bug: unhandled or invalid action: '%s'",
@@ -2352,9 +2362,11 @@ rpz_apply_nsdname_trigger(struct module_qstate* ms, struct query_info* qchase,
switch(action) {
case RPZ_NXDOMAIN_ACTION:
ret = rpz_synthesize_nxdomain(r, ms, qchase, az);
+ ms->rpz_applied = 1;
break;
case RPZ_NODATA_ACTION:
ret = rpz_synthesize_nodata(r, ms, qchase, az);
+ ms->rpz_applied = 1;
break;
case RPZ_TCP_ONLY_ACTION:
/* basically a passthru here but the tcp-only will be
@@ -2364,11 +2376,13 @@ rpz_apply_nsdname_trigger(struct module_qstate* ms, struct query_info* qchase,
break;
case RPZ_DROP_ACTION:
ret = rpz_synthesize_nodata(r, ms, qchase, az);
+ ms->rpz_applied = 1;
ms->is_drop = 1;
break;
case RPZ_LOCAL_DATA_ACTION:
ret = rpz_synthesize_nsdname_localdata(r, ms, qchase, z, match, az);
if(ret == NULL) { ret = rpz_synthesize_nodata(r, ms, qchase, az); }
+ ms->rpz_applied = 1;
break;
case RPZ_PASSTHRU_ACTION:
ret = NULL;
@@ -2376,6 +2390,7 @@ rpz_apply_nsdname_trigger(struct module_qstate* ms, struct query_info* qchase,
break;
case RPZ_CNAME_OVERRIDE_ACTION:
ret = rpz_synthesize_cname_override_msg(r, ms, qchase);
+ ms->rpz_applied = 1;
break;
default:
verbose(VERB_ALGO, "rpz: nsdname: bug: unhandled or invalid action: '%s'",
@@ -2579,9 +2594,11 @@ struct dns_msg* rpz_callback_from_iterator_cname(struct module_qstate* ms,
switch(localzone_type_to_rpz_action(lzt)) {
case RPZ_NXDOMAIN_ACTION:
ret = rpz_synthesize_nxdomain(r, ms, &is->qchase, a);
+ ms->rpz_applied = 1;
break;
case RPZ_NODATA_ACTION:
ret = rpz_synthesize_nodata(r, ms, &is->qchase, a);
+ ms->rpz_applied = 1;
break;
case RPZ_TCP_ONLY_ACTION:
/* basically a passthru here but the tcp-only will be
@@ -2591,11 +2608,13 @@ struct dns_msg* rpz_callback_from_iterator_cname(struct module_qstate* ms,
break;
case RPZ_DROP_ACTION:
ret = rpz_synthesize_nodata(r, ms, &is->qchase, a);
+ ms->rpz_applied = 1;
ms->is_drop = 1;
break;
case RPZ_LOCAL_DATA_ACTION:
ret = rpz_synthesize_qname_localdata_msg(r, ms, &is->qchase, z, a);
if(ret == NULL) { ret = rpz_synthesize_nodata(r, ms, &is->qchase, a); }
+ ms->rpz_applied = 1;
break;
case RPZ_PASSTHRU_ACTION:
ret = NULL;
diff --git a/smallapp/unbound-control-setup.sh.in b/smallapp/unbound-control-setup.sh.in
index f74b0105afee..4a358f6bd09d 100644
--- a/smallapp/unbound-control-setup.sh.in
+++ b/smallapp/unbound-control-setup.sh.in
@@ -104,7 +104,7 @@ while getopts 'd:hr' arg; do
done
shift $((OPTIND - 1))
-if ! openssl >/dev/null 2>&1; then
+if ! openssl version </dev/null >/dev/null 2>&1; then
echo "$0 requires openssl to be installed for keys/certificates generation." >&2
exit 1
fi
diff --git a/smallapp/unbound-control.c b/smallapp/unbound-control.c
index 21e7eb82d5ef..b8479e9ab667 100644
--- a/smallapp/unbound-control.c
+++ b/smallapp/unbound-control.c
@@ -293,6 +293,9 @@ static void print_mem(struct ub_shm_stat_info* shm_stat,
PR_LL("mem.streamwait", s->svr.mem_stream_wait);
PR_LL("mem.http.query_buffer", s->svr.mem_http2_query_buffer);
PR_LL("mem.http.response_buffer", s->svr.mem_http2_response_buffer);
+#ifdef HAVE_NGTCP2
+ PR_LL("mem.quic", s->svr.mem_quic);
+#endif
}
/** print histogram */
@@ -359,6 +362,9 @@ static void print_extended(struct ub_stats_info* s, int inhibit_zero)
PR_UL("num.query.tls_resume", s->svr.qtls_resume);
PR_UL("num.query.ipv6", s->svr.qipv6);
PR_UL("num.query.https", s->svr.qhttps);
+#ifdef HAVE_NGTCP2
+ PR_UL("num.query.quic", s->svr.qquic);
+#endif
/* flags */
PR_UL("num.query.flags.QR", s->svr.qbit_QR);
diff --git a/smallapp/unbound-host.c b/smallapp/unbound-host.c
index 8bffe46ced55..edca6b9a3732 100644
--- a/smallapp/unbound-host.c
+++ b/smallapp/unbound-host.c
@@ -50,6 +50,8 @@
#undef calloc
#undef free
#undef realloc
+#undef reallocarray
+#undef strdup
#endif
#ifdef UNBOUND_ALLOC_LITE
#undef malloc
@@ -492,7 +494,11 @@ int main(int argc, char* argv[])
if(strcmp(use_syslog, "yes") == 0) /* disable use-syslog */
check_ub_res(ub_ctx_set_option(ctx,
"use-syslog:", "no"));
+#ifdef UNBOUND_ALLOC_STATS
+ unbound_stat_free_log(use_syslog, __FILE__, __LINE__, __func__);
+#else
free(use_syslog);
+#endif
}
argc -= optind;
argv += optind;
diff --git a/smallapp/worker_cb.c b/smallapp/worker_cb.c
index c68981735cb7..1d71a0945154 100644
--- a/smallapp/worker_cb.c
+++ b/smallapp/worker_cb.c
@@ -255,3 +255,19 @@ void dtio_mainfdcallback(int ATTR_UNUSED(fd), short ATTR_UNUSED(ev),
log_assert(0);
}
#endif
+
+#ifdef HAVE_NGTCP2
+void doq_client_event_cb(int ATTR_UNUSED(fd), short ATTR_UNUSED(ev),
+ void* ATTR_UNUSED(arg))
+{
+ log_assert(0);
+}
+#endif
+
+#ifdef HAVE_NGTCP2
+void doq_client_timer_cb(int ATTR_UNUSED(fd), short ATTR_UNUSED(ev),
+ void* ATTR_UNUSED(arg))
+{
+ log_assert(0);
+}
+#endif
diff --git a/testcode/checklocks.c b/testcode/checklocks.c
index d1c877467307..fdc1b8af16de 100644
--- a/testcode/checklocks.c
+++ b/testcode/checklocks.c
@@ -68,6 +68,8 @@ static struct thr_check* thread_infos[THRDEBUG_MAX_THREADS];
int check_locking_order = 1;
/** the pid of this runset, reasonably unique. */
static pid_t check_lock_pid;
+/** the name of the output file */
+static const char* output_name = "ublocktrace";
/**
* Should checklocks print a trace of the lock and unlock calls.
* It uses fprintf for that because the log function uses a lock and that
@@ -142,7 +144,8 @@ acquire_locklock(struct checked_lock* lock,
/** add protected region */
void
-lock_protect(void *p, void* area, size_t size)
+lock_protect_place(void* p, void* area, size_t size, const char* def_func,
+ const char* def_file, int def_line, const char* def_area)
{
struct checked_lock* lock = *(struct checked_lock**)p;
struct protected_area* e = (struct protected_area*)malloc(
@@ -151,6 +154,10 @@ lock_protect(void *p, void* area, size_t size)
fatal_exit("lock_protect: out of memory");
e->region = area;
e->size = size;
+ e->def_func = def_func;
+ e->def_file = def_file;
+ e->def_line = def_line;
+ e->def_area = def_area;
e->hold = malloc(size);
if(!e->hold)
fatal_exit("lock_protect: out of memory");
@@ -203,6 +210,9 @@ prot_check(struct checked_lock* lock,
if(memcmp(p->hold, p->region, p->size) != 0) {
log_hex("memory prev", p->hold, p->size);
log_hex("memory here", p->region, p->size);
+ log_err("lock_protect on %s %s:%d %s failed",
+ p->def_func, p->def_file, p->def_line,
+ p->def_area);
lock_error(lock, func, file, line,
"protected area modified");
}
@@ -675,13 +685,19 @@ checklock_unlock(enum check_lock_type type, struct checked_lock* lock,
}
}
+void
+checklock_set_output_name(const char* name)
+{
+ output_name = name;
+}
+
/** open order info debug file, thr->num must be valid */
static void
open_lockorder(struct thr_check* thr)
{
char buf[24];
time_t t;
- snprintf(buf, sizeof(buf), "ublocktrace.%d", thr->num);
+ snprintf(buf, sizeof(buf), "%s.%d", output_name, thr->num);
thr->order_info = fopen(buf, "w");
if(!thr->order_info)
fatal_exit("could not open %s: %s", buf, strerror(errno));
diff --git a/testcode/checklocks.h b/testcode/checklocks.h
index 61cc6fb0c5e2..7ebc2f98407e 100644
--- a/testcode/checklocks.h
+++ b/testcode/checklocks.h
@@ -90,6 +90,14 @@ struct protected_area {
void* hold;
/** next protected area in list */
struct protected_area* next;
+ /** the place where the lock_protect is made, at init. */
+ const char* def_func;
+ /** the file where the lock_protect is made */
+ const char* def_file;
+ /** the line number where the lock_protect is made */
+ int def_line;
+ /** the text string for the area that is protected, at init call. */
+ const char* def_area;
};
/**
@@ -181,12 +189,19 @@ struct checked_lock {
* It demangles the lock itself (struct checked_lock**).
* @param area: ptr to mem.
* @param size: length of area.
+ * @param def_func: function where the lock_protect() line is.
+ * @param def_file: file where the lock_protect() line is.
+ * @param def_line: line where the lock_protect() line is.
+ * @param def_area: area string
* You can call it multiple times with the same lock to give several areas.
* Call it when you are done initializing the area, since it will be copied
* at this time and protected right away against unauthorised changes until
* the next lock() call is done.
*/
-void lock_protect(void* lock, void* area, size_t size);
+void lock_protect_place(void* lock, void* area, size_t size,
+ const char* def_func, const char* def_file, int def_line,
+ const char* def_area);
+#define lock_protect(lock, area, size) lock_protect_place(lock, area, size, __func__, __FILE__, __LINE__, #area)
/**
* Remove protected area from lock.
@@ -204,6 +219,13 @@ void lock_unprotect(void* lock, void* area);
size_t lock_get_mem(void* lock);
/**
+ * Set the output name, prefix, of the lock check output file(s).
+ * Call it before the checklock_start or thread creation. Pass a fixed string.
+ * @param name: string to use for output data file names.
+ */
+void checklock_set_output_name(const char* name);
+
+/**
* Initialise checklock. Sets up internal debug structures.
*/
void checklock_start(void);
diff --git a/testcode/doqclient.c b/testcode/doqclient.c
new file mode 100644
index 000000000000..1a2fd418359b
--- /dev/null
+++ b/testcode/doqclient.c
@@ -0,0 +1,2701 @@
+/*
+ * testcode/doqclient.c - debug program. Perform multiple DNS queries using DoQ.
+ *
+ * Copyright (c) 2022, NLnet Labs. All rights reserved.
+ *
+ * This software is open source.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * Neither the name of the NLNET LABS nor the names of its contributors may
+ * be used to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * \file
+ *
+ * Simple DNS-over-QUIC client. For testing and debugging purposes.
+ * No authentication of TLS cert.
+ */
+
+#include "config.h"
+#ifdef HAVE_GETOPT_H
+#include <getopt.h>
+#endif
+
+#ifdef HAVE_NGTCP2
+#include <ngtcp2/ngtcp2.h>
+#include <ngtcp2/ngtcp2_crypto.h>
+#ifdef HAVE_NGTCP2_NGTCP2_CRYPTO_QUICTLS_H
+#include <ngtcp2/ngtcp2_crypto_quictls.h>
+#else
+#include <ngtcp2/ngtcp2_crypto_openssl.h>
+#endif
+#include <openssl/ssl.h>
+#include <openssl/rand.h>
+#ifdef HAVE_TIME_H
+#include <time.h>
+#endif
+#include <sys/time.h>
+#include "util/locks.h"
+#include "util/net_help.h"
+#include "sldns/sbuffer.h"
+#include "sldns/str2wire.h"
+#include "sldns/wire2str.h"
+#include "util/data/msgreply.h"
+#include "util/data/msgencode.h"
+#include "util/data/msgparse.h"
+#include "util/data/dname.h"
+#include "util/random.h"
+#include "util/ub_event.h"
+struct doq_client_stream_list;
+struct doq_client_stream;
+
+/** the local client data for the DoQ connection */
+struct doq_client_data {
+ /** file descriptor */
+ int fd;
+ /** the event base for the events */
+ struct ub_event_base* base;
+ /** the ub event */
+ struct ub_event* ev;
+ /** the expiry timer */
+ struct ub_event* expire_timer;
+ /** is the expire_timer added */
+ int expire_timer_added;
+ /** the ngtcp2 connection information */
+ struct ngtcp2_conn* conn;
+ /** random state */
+ struct ub_randstate* rnd;
+ /** server connected to as a string */
+ const char* svr;
+ /** the static secret */
+ uint8_t* static_secret_data;
+ /** the static secret size */
+ size_t static_secret_size;
+ /** destination address sockaddr */
+ struct sockaddr_storage dest_addr;
+ /** length of dest addr */
+ socklen_t dest_addr_len;
+ /** local address sockaddr */
+ struct sockaddr_storage local_addr;
+ /** length of local addr */
+ socklen_t local_addr_len;
+ /** SSL context */
+ SSL_CTX* ctx;
+ /** SSL object */
+ SSL* ssl;
+#ifdef HAVE_NGTCP2_CRYPTO_QUICTLS_CONFIGURE_CLIENT_CONTEXT
+ /** the connection reference for ngtcp2_conn and userdata in ssl */
+ struct ngtcp2_crypto_conn_ref conn_ref;
+#endif
+ /** the quic version to use */
+ uint32_t quic_version;
+ /** the last error */
+#ifdef HAVE_NGTCP2_CCERR_DEFAULT
+ struct ngtcp2_ccerr ccerr;
+#else
+ struct ngtcp2_connection_close_error last_error;
+#endif
+ /** the recent tls alert error code */
+ uint8_t tls_alert;
+ /** the buffer for packet operations */
+ struct sldns_buffer* pkt_buf;
+ /** The list of queries to start. They have no stream associated.
+ * Once they do, they move to the send list. */
+ struct doq_client_stream_list* query_list_start;
+ /** The list of queries to send. They have a stream, and they are
+ * sending data. Data could also be received, like errors. */
+ struct doq_client_stream_list* query_list_send;
+ /** The list of queries to receive. They have a stream, and the
+ * send is done, it is possible to read data. */
+ struct doq_client_stream_list* query_list_receive;
+ /** The list of queries that are stopped. They have no stream
+ * active any more. Write and read are done. The query is done,
+ * and it may be in error and then have no answer or partial answer. */
+ struct doq_client_stream_list* query_list_stop;
+ /** is there a blocked packet in the blocked_pkt buffer */
+ int have_blocked_pkt;
+ /** store blocked packet, a packet that could not be sent on the
+ * nonblocking socket. */
+ struct sldns_buffer* blocked_pkt;
+ /** ecn info for the blocked packet */
+ struct ngtcp2_pkt_info blocked_pkt_pi;
+ /** the congestion control algorithm */
+ ngtcp2_cc_algo cc_algo;
+ /** the transport parameters file, for early data transmission */
+ const char* transport_file;
+ /** the tls session file, for session resumption */
+ const char* session_file;
+ /** if early data is enabled for the connection */
+ int early_data_enabled;
+ /** how quiet is the output */
+ int quiet;
+ /** the configured port for the destination */
+ int port;
+};
+
+/** the local client stream list, for appending streams to */
+struct doq_client_stream_list {
+ /** first and last members of the list */
+ struct doq_client_stream* first, *last;
+};
+
+/** the local client data for a DoQ stream */
+struct doq_client_stream {
+ /** next stream in list, and prev in list */
+ struct doq_client_stream* next, *prev;
+ /** the data buffer */
+ uint8_t* data;
+ /** length of the data buffer */
+ size_t data_len;
+ /** if the client query has a stream, that is active, associated with
+ * it. The stream_id is in stream_id. */
+ int has_stream;
+ /** the stream id */
+ int64_t stream_id;
+ /** data written position */
+ size_t nwrite;
+ /** the data length for write, in network format */
+ uint16_t data_tcplen;
+ /** if the write of the query data is done. That means the
+ * write channel has FIN, is closed for writing. */
+ int write_is_done;
+ /** data read position */
+ size_t nread;
+ /** the answer length, in network byte order */
+ uint16_t answer_len;
+ /** the answer buffer */
+ struct sldns_buffer* answer;
+ /** the answer is complete */
+ int answer_is_complete;
+ /** the query has an error, it has no answer, or no complete answer */
+ int query_has_error;
+ /** if the query is done */
+ int query_is_done;
+};
+
+#ifndef HAVE_NGTCP2_CRYPTO_QUICTLS_CONFIGURE_CLIENT_CONTEXT
+/** the quic method struct, must remain valid during the QUIC connection. */
+static SSL_QUIC_METHOD quic_method;
+#endif
+
+/** Get the connection ngtcp2_conn from the ssl app data
+ * ngtcp2_crypto_conn_ref */
+static ngtcp2_conn* conn_ref_get_conn(ngtcp2_crypto_conn_ref* conn_ref)
+{
+ struct doq_client_data* data = (struct doq_client_data*)
+ conn_ref->user_data;
+ return data->conn;
+}
+
+static void
+set_app_data(SSL* ssl, struct doq_client_data* data)
+{
+#ifdef HAVE_NGTCP2_CRYPTO_QUICTLS_CONFIGURE_CLIENT_CONTEXT
+ data->conn_ref.get_conn = &conn_ref_get_conn;
+ data->conn_ref.user_data = data;
+ SSL_set_app_data(ssl, &data->conn_ref);
+#else
+ SSL_set_app_data(ssl, data);
+#endif
+}
+
+static struct doq_client_data*
+get_app_data(SSL* ssl)
+{
+ struct doq_client_data* data;
+#ifdef HAVE_NGTCP2_CRYPTO_QUICTLS_CONFIGURE_CLIENT_CONTEXT
+ data = (struct doq_client_data*)((struct ngtcp2_crypto_conn_ref*)
+ SSL_get_app_data(ssl))->user_data;
+#else
+ data = (struct doq_client_data*) SSL_get_app_data(ssl);
+#endif
+ return data;
+}
+
+
+
+/** write handle routine */
+static void on_write(struct doq_client_data* data);
+/** update the timer */
+static void update_timer(struct doq_client_data* data);
+/** disconnect we are done */
+static void disconnect(struct doq_client_data* data);
+/** fetch and write the transport file */
+static void early_data_write_transport(struct doq_client_data* data);
+
+/** usage of doqclient */
+static void usage(char* argv[])
+{
+ printf("usage: %s [options] name type class ...\n", argv[0]);
+ printf(" sends the name-type-class queries over "
+ "DNS-over-QUIC.\n");
+ printf("-s server IP address to send the queries to, "
+ "default: 127.0.0.1\n");
+ printf("-p Port to connect to, default: %d\n",
+ UNBOUND_DNS_OVER_QUIC_PORT);
+ printf("-v verbose output\n");
+ printf("-q quiet, short output of answer\n");
+ printf("-x file transport file, for read/write of transport parameters.\n\t\tIf it exists, it is used to send early data. It is then\n\t\twritten to contain the last used transport parameters.\n\t\tAlso -y must be enabled for early data to succeed.\n");
+ printf("-y file session file, for read/write of TLS session. If it exists,\n\t\tit is used for TLS session resumption. It is then written\n\t\tto contain the last session used.\n\t\tOn its own, without also -x, resumes TLS session.\n");
+ printf("-h This help text\n");
+ exit(1);
+}
+
+/** get the dest address */
+static void
+get_dest_addr(struct doq_client_data* data, const char* svr, int port)
+{
+ if(!ipstrtoaddr(svr, port, &data->dest_addr, &data->dest_addr_len)) {
+ printf("fatal: bad server specs '%s'\n", svr);
+ exit(1);
+ }
+}
+
+/** open UDP socket to svr */
+static int
+open_svr_udp(struct doq_client_data* data)
+{
+ int fd = -1;
+ int r;
+ fd = socket(addr_is_ip6(&data->dest_addr, data->dest_addr_len)?
+ PF_INET6:PF_INET, SOCK_DGRAM, 0);
+ if(fd == -1) {
+ perror("socket() error");
+ exit(1);
+ }
+ r = connect(fd, (struct sockaddr*)&data->dest_addr,
+ data->dest_addr_len);
+ if(r < 0 && r != EINPROGRESS) {
+ perror("connect() error");
+ exit(1);
+ }
+ fd_set_nonblock(fd);
+ return fd;
+}
+
+/** get the local address of the connection */
+static void
+get_local_addr(struct doq_client_data* data)
+{
+ memset(&data->local_addr, 0, sizeof(data->local_addr));
+ data->local_addr_len = (socklen_t)sizeof(data->local_addr);
+ if(getsockname(data->fd, (struct sockaddr*)&data->local_addr,
+ &data->local_addr_len) == -1) {
+ perror("getsockname() error");
+ exit(1);
+ }
+ log_addr(1, "local_addr", &data->local_addr, data->local_addr_len);
+ log_addr(1, "dest_addr", &data->dest_addr, data->dest_addr_len);
+}
+
+static sldns_buffer*
+make_query(char* qname, char* qtype, char* qclass)
+{
+ struct query_info qinfo;
+ struct edns_data edns;
+ sldns_buffer* buf = sldns_buffer_new(65553);
+ if(!buf) fatal_exit("out of memory");
+ qinfo.qname = sldns_str2wire_dname(qname, &qinfo.qname_len);
+ if(!qinfo.qname) {
+ printf("cannot parse query name: '%s'\n", qname);
+ exit(1);
+ }
+
+ qinfo.qtype = sldns_get_rr_type_by_name(qtype);
+ qinfo.qclass = sldns_get_rr_class_by_name(qclass);
+ qinfo.local_alias = NULL;
+
+ qinfo_query_encode(buf, &qinfo); /* flips buffer */
+ free(qinfo.qname);
+ sldns_buffer_write_u16_at(buf, 0, 0x0000);
+ sldns_buffer_write_u16_at(buf, 2, BIT_RD);
+ memset(&edns, 0, sizeof(edns));
+ edns.edns_present = 1;
+ edns.bits = EDNS_DO;
+ edns.udp_size = 4096;
+ if(sldns_buffer_capacity(buf) >=
+ sldns_buffer_limit(buf)+calc_edns_field_size(&edns))
+ attach_edns_record(buf, &edns);
+ return buf;
+}
+
+/** create client stream structure */
+static struct doq_client_stream*
+client_stream_create(struct sldns_buffer* query_data)
+{
+ struct doq_client_stream* str = calloc(1, sizeof(*str));
+ if(!str)
+ fatal_exit("calloc failed: out of memory");
+ str->data = memdup(sldns_buffer_begin(query_data),
+ sldns_buffer_limit(query_data));
+ if(!str->data)
+ fatal_exit("alloc data failed: out of memory");
+ str->data_len = sldns_buffer_limit(query_data);
+ str->stream_id = -1;
+ return str;
+}
+
+/** free client stream structure */
+static void
+client_stream_free(struct doq_client_stream* str)
+{
+ if(!str)
+ return;
+ free(str->data);
+ sldns_buffer_free(str->answer);
+ free(str);
+}
+
+/** setup the stream to start the write process */
+static void
+client_stream_start_setup(struct doq_client_stream* str, int64_t stream_id)
+{
+ str->has_stream = 1;
+ str->stream_id = stream_id;
+ str->nwrite = 0;
+ str->nread = 0;
+ str->answer_len = 0;
+ str->query_is_done = 0;
+ str->answer_is_complete = 0;
+ str->query_has_error = 0;
+ if(str->answer) {
+ sldns_buffer_free(str->answer);
+ str->answer = NULL;
+ }
+}
+
+/** Return string for log purposes with query name. */
+static char*
+client_stream_string(struct doq_client_stream* str)
+{
+ char* s;
+ size_t dname_len;
+ char dname[256], tpstr[32], result[256+32+16];
+ uint16_t tp;
+ if(str->data_len <= LDNS_HEADER_SIZE) {
+ s = strdup("query_with_no_question");
+ if(!s)
+ fatal_exit("strdup failed: out of memory");
+ return s;
+ }
+ dname_len = dname_valid(str->data+LDNS_HEADER_SIZE,
+ str->data_len-LDNS_HEADER_SIZE);
+ if(!dname_len) {
+ s = strdup("query_dname_not_valid");
+ if(!s)
+ fatal_exit("strdup failed: out of memory");
+ return s;
+ }
+ (void)sldns_wire2str_dname_buf(str->data+LDNS_HEADER_SIZE, dname_len,
+ dname, sizeof(dname));
+ tp = sldns_wirerr_get_type(str->data+LDNS_HEADER_SIZE,
+ str->data_len-LDNS_HEADER_SIZE, dname_len);
+ (void)sldns_wire2str_type_buf(tp, tpstr, sizeof(tpstr));
+ snprintf(result, sizeof(result), "%s %s", dname, tpstr);
+ s = strdup(result);
+ if(!s)
+ fatal_exit("strdup failed: out of memory");
+ return s;
+}
+
+/** create query stream list */
+static struct doq_client_stream_list*
+stream_list_create(void)
+{
+ struct doq_client_stream_list* list = calloc(1, sizeof(*list));
+ if(!list)
+ fatal_exit("calloc failed: out of memory");
+ return list;
+}
+
+/** free the query stream list */
+static void
+stream_list_free(struct doq_client_stream_list* list)
+{
+ struct doq_client_stream* str;
+ if(!list)
+ return;
+ str = list->first;
+ while(str) {
+ struct doq_client_stream* next = str->next;
+ client_stream_free(str);
+ str = next;
+ }
+ free(list);
+}
+
+/** append item to list */
+static void
+stream_list_append(struct doq_client_stream_list* list,
+ struct doq_client_stream* str)
+{
+ if(list->last) {
+ str->prev = list->last;
+ list->last->next = str;
+ } else {
+ str->prev = NULL;
+ list->first = str;
+ }
+ str->next = NULL;
+ list->last = str;
+}
+
+/** delete the item from the list */
+static void
+stream_list_delete(struct doq_client_stream_list* list,
+ struct doq_client_stream* str)
+{
+ if(str->next) {
+ str->next->prev = str->prev;
+ } else {
+ list->last = str->prev;
+ }
+ if(str->prev) {
+ str->prev->next = str->next;
+ } else {
+ list->first = str->next;
+ }
+ str->prev = NULL;
+ str->next = NULL;
+}
+
+/** move the item from list1 to list2 */
+static void
+stream_list_move(struct doq_client_stream* str,
+ struct doq_client_stream_list* list1,
+ struct doq_client_stream_list* list2)
+{
+ stream_list_delete(list1, str);
+ stream_list_append(list2, str);
+}
+
+/** allocate stream data buffer, then answer length is complete */
+static void
+client_stream_datalen_complete(struct doq_client_stream* str)
+{
+ verbose(1, "answer length %d", (int)ntohs(str->answer_len));
+ str->answer = sldns_buffer_new(ntohs(str->answer_len));
+ if(!str->answer)
+ fatal_exit("sldns_buffer_new failed: out of memory");
+ sldns_buffer_set_limit(str->answer, ntohs(str->answer_len));
+}
+
+/** print the answer rrs */
+static void
+print_answer_rrs(uint8_t* pkt, size_t pktlen)
+{
+ char buf[65535];
+ char* str;
+ size_t str_len;
+ int i, qdcount, ancount;
+ uint8_t* data = pkt;
+ size_t data_len = pktlen;
+ int comprloop = 0;
+ if(data_len < LDNS_HEADER_SIZE)
+ return;
+ qdcount = LDNS_QDCOUNT(data);
+ ancount = LDNS_ANCOUNT(data);
+ data += LDNS_HEADER_SIZE;
+ data_len -= LDNS_HEADER_SIZE;
+
+ for(i=0; i<qdcount; i++) {
+ str = buf;
+ str_len = sizeof(buf);
+ (void)sldns_wire2str_rrquestion_scan(&data, &data_len,
+ &str, &str_len, pkt, pktlen, &comprloop);
+ }
+ for(i=0; i<ancount; i++) {
+ str = buf;
+ str_len = sizeof(buf);
+ (void)sldns_wire2str_rr_scan(&data, &data_len, &str, &str_len,
+ pkt, pktlen, &comprloop);
+ /* terminate string */
+ if(str_len == 0)
+ buf[sizeof(buf)-1] = 0;
+ else *str = 0;
+ printf("%s", buf);
+ }
+}
+
+/** short output of answer, short error or rcode or answer section RRs. */
+static void
+client_stream_print_short(struct doq_client_stream* str)
+{
+ int rcode, ancount;
+ if(str->query_has_error) {
+ char* logs = client_stream_string(str);
+ printf("%s has error, there is no answer\n", logs);
+ free(logs);
+ return;
+ }
+ if(sldns_buffer_limit(str->answer) < LDNS_HEADER_SIZE) {
+ char* logs = client_stream_string(str);
+ printf("%s received short packet, smaller than header\n",
+ logs);
+ free(logs);
+ return;
+ }
+ rcode = LDNS_RCODE_WIRE(sldns_buffer_begin(str->answer));
+ if(rcode != 0) {
+ char* logs = client_stream_string(str);
+ char rc[16];
+ (void)sldns_wire2str_rcode_buf(rcode, rc, sizeof(rc));
+ printf("%s rcode %s\n", logs, rc);
+ free(logs);
+ return;
+ }
+ ancount = LDNS_ANCOUNT(sldns_buffer_begin(str->answer));
+ if(ancount == 0) {
+ char* logs = client_stream_string(str);
+ printf("%s nodata answer\n", logs);
+ free(logs);
+ return;
+ }
+ print_answer_rrs(sldns_buffer_begin(str->answer),
+ sldns_buffer_limit(str->answer));
+}
+
+/** print the stream output answer */
+static void
+client_stream_print_long(struct doq_client_data* data,
+ struct doq_client_stream* str)
+{
+ char* s;
+ if(str->query_has_error) {
+ char* logs = client_stream_string(str);
+ printf("%s has error, there is no answer\n", logs);
+ free(logs);
+ return;
+ }
+ s = sldns_wire2str_pkt(sldns_buffer_begin(str->answer),
+ sldns_buffer_limit(str->answer));
+ printf("%s", (s?s:";sldns_wire2str_pkt failed\n"));
+ printf(";; SERVER: %s %d\n", data->svr, data->port);
+ free(s);
+}
+
+/** the stream has completed the data */
+static void
+client_stream_data_complete(struct doq_client_stream* str)
+{
+ verbose(1, "received all answer content");
+ if(verbosity > 0) {
+ char* logs = client_stream_string(str);
+ char* s;
+ log_buf(1, "received answer", str->answer);
+ s = sldns_wire2str_pkt(sldns_buffer_begin(str->answer),
+ sldns_buffer_limit(str->answer));
+ if(!s) verbose(1, "could not sldns_wire2str_pkt");
+ else verbose(1, "query %s received:\n%s", logs, s);
+ free(s);
+ free(logs);
+ }
+ str->answer_is_complete = 1;
+}
+
+/** the stream has completed but with an error */
+static void
+client_stream_answer_error(struct doq_client_stream* str)
+{
+ if(verbosity > 0) {
+ char* logs = client_stream_string(str);
+ if(str->answer)
+ verbose(1, "query %s has an error. received %d/%d bytes.",
+ logs, (int)sldns_buffer_position(str->answer),
+ (int)sldns_buffer_limit(str->answer));
+ else
+ verbose(1, "query %s has an error. received no data.",
+ logs);
+ free(logs);
+ }
+ str->query_has_error = 1;
+}
+
+/** receive data for a stream */
+static void
+client_stream_recv_data(struct doq_client_stream* str, const uint8_t* data,
+ size_t datalen)
+{
+ int got_data = 0;
+ /* read the tcplength uint16_t at the start of the DNS message */
+ if(str->nread < 2) {
+ size_t to_move = datalen;
+ if(datalen > 2-str->nread)
+ to_move = 2-str->nread;
+ memmove(((uint8_t*)&str->answer_len)+str->nread, data,
+ to_move);
+ str->nread += to_move;
+ data += to_move;
+ datalen -= to_move;
+ if(str->nread == 2) {
+ /* we can allocate the data buffer */
+ client_stream_datalen_complete(str);
+ }
+ }
+ /* if we have data bytes */
+ if(datalen > 0) {
+ size_t to_write = datalen;
+ if(datalen > sldns_buffer_remaining(str->answer))
+ to_write = sldns_buffer_remaining(str->answer);
+ if(to_write > 0) {
+ sldns_buffer_write(str->answer, data, to_write);
+ str->nread += to_write;
+ data += to_write;
+ datalen -= to_write;
+ got_data = 1;
+ }
+ }
+ /* extra received bytes after end? */
+ if(datalen > 0) {
+ verbose(1, "extra bytes after end of DNS length");
+ if(verbosity > 0)
+ log_hex("extradata", (void*)data, datalen);
+ }
+ /* are we done with it? */
+ if(got_data && str->nread >= (size_t)(ntohs(str->answer_len))+2) {
+ client_stream_data_complete(str);
+ }
+}
+
+/** receive FIN from remote end on client stream, no more data to be
+ * received on the stream. */
+static void
+client_stream_recv_fin(struct doq_client_data* data,
+ struct doq_client_stream* str, int is_fin)
+{
+ if(verbosity > 0) {
+ char* logs = client_stream_string(str);
+ if(is_fin)
+ verbose(1, "query %s: received FIN from remote", logs);
+ else
+ verbose(1, "query %s: stream reset from remote", logs);
+ free(logs);
+ }
+ if(str->write_is_done)
+ stream_list_move(str, data->query_list_receive,
+ data->query_list_stop);
+ else
+ stream_list_move(str, data->query_list_send,
+ data->query_list_stop);
+ if(!str->answer_is_complete) {
+ client_stream_answer_error(str);
+ }
+ str->query_is_done = 1;
+ if(data->quiet)
+ client_stream_print_short(str);
+ else client_stream_print_long(data, str);
+ if(data->query_list_send->first==NULL &&
+ data->query_list_receive->first==NULL)
+ disconnect(data);
+}
+
+/** fill a buffer with random data */
+static void fill_rand(struct ub_randstate* rnd, uint8_t* buf, size_t len)
+{
+ if(RAND_bytes(buf, len) != 1) {
+ size_t i;
+ for(i=0; i<len; i++)
+ buf[i] = ub_random(rnd)&0xff;
+ }
+}
+
+/** create the static secret */
+static void generate_static_secret(struct doq_client_data* data, size_t len)
+{
+ data->static_secret_data = malloc(len);
+ if(!data->static_secret_data)
+ fatal_exit("malloc failed: out of memory");
+ data->static_secret_size = len;
+ fill_rand(data->rnd, data->static_secret_data, len);
+}
+
+/** fill cid structure with random data */
+static void cid_randfill(struct ngtcp2_cid* cid, size_t datalen,
+ struct ub_randstate* rnd)
+{
+ uint8_t buf[32];
+ if(datalen > sizeof(buf))
+ datalen = sizeof(buf);
+ fill_rand(rnd, buf, datalen);
+ ngtcp2_cid_init(cid, buf, datalen);
+}
+
+/** send buf on the client stream */
+static int
+client_bidi_stream(struct doq_client_data* data, int64_t* ret_stream_id,
+ void* stream_user_data)
+{
+ int64_t stream_id;
+ int rv;
+
+ /* open new bidirectional stream */
+ rv = ngtcp2_conn_open_bidi_stream(data->conn, &stream_id,
+ stream_user_data);
+ if(rv != 0) {
+ if(rv == NGTCP2_ERR_STREAM_ID_BLOCKED) {
+ /* no bidi stream count for this new stream */
+ return 0;
+ }
+ fatal_exit("could not ngtcp2_conn_open_bidi_stream: %s",
+ ngtcp2_strerror(rv));
+ }
+ *ret_stream_id = stream_id;
+ return 1;
+}
+
+/** See if we can start query streams, by creating bidirectional streams
+ * on the QUIC transport for them. */
+static void
+query_streams_start(struct doq_client_data* data)
+{
+ while(data->query_list_start->first) {
+ struct doq_client_stream* str = data->query_list_start->first;
+ int64_t stream_id = 0;
+ if(!client_bidi_stream(data, &stream_id, str)) {
+ /* no more bidi streams allowed */
+ break;
+ }
+ if(verbosity > 0) {
+ char* logs = client_stream_string(str);
+ verbose(1, "query %s start on bidi stream id %lld",
+ logs, (long long int)stream_id);
+ free(logs);
+ }
+ /* setup the stream to start */
+ client_stream_start_setup(str, stream_id);
+ /* move the query entry to the send list to write it */
+ stream_list_move(str, data->query_list_start,
+ data->query_list_send);
+ }
+}
+
+/** the rand callback routine from ngtcp2 */
+static void rand_cb(uint8_t* dest, size_t destlen,
+ const ngtcp2_rand_ctx* rand_ctx)
+{
+ struct ub_randstate* rnd = (struct ub_randstate*)
+ rand_ctx->native_handle;
+ fill_rand(rnd, dest, destlen);
+}
+
+/** the get_new_connection_id callback routine from ngtcp2 */
+static int get_new_connection_id_cb(struct ngtcp2_conn* ATTR_UNUSED(conn),
+ struct ngtcp2_cid* cid, uint8_t* token, size_t cidlen, void* user_data)
+{
+ struct doq_client_data* data = (struct doq_client_data*)user_data;
+ cid_randfill(cid, cidlen, data->rnd);
+ if(ngtcp2_crypto_generate_stateless_reset_token(token,
+ data->static_secret_data, data->static_secret_size, cid) != 0)
+ return NGTCP2_ERR_CALLBACK_FAILURE;
+ return 0;
+}
+
+/** handle that early data is rejected */
+static void
+early_data_is_rejected(struct doq_client_data* data)
+{
+ int rv;
+ verbose(1, "early data was rejected by the server");
+#ifdef HAVE_NGTCP2_CONN_TLS_EARLY_DATA_REJECTED
+ rv = ngtcp2_conn_tls_early_data_rejected(data->conn);
+#else
+ rv = ngtcp2_conn_early_data_rejected(data->conn);
+#endif
+ if(rv != 0) {
+ log_err("ngtcp2_conn_early_data_rejected failed: %s",
+ ngtcp2_strerror(rv));
+ return;
+ }
+ /* move the streams back to the start state */
+ while(data->query_list_send->first) {
+ struct doq_client_stream* str = data->query_list_send->first;
+ /* move it back to the start list */
+ stream_list_move(str, data->query_list_send,
+ data->query_list_start);
+ str->has_stream = 0;
+ /* remove stream id */
+ str->stream_id = 0;
+ /* initialise other members, in case they are altered,
+ * but unlikely, because early streams are rejected. */
+ str->nwrite = 0;
+ str->nread = 0;
+ str->answer_len = 0;
+ str->query_is_done = 0;
+ str->answer_is_complete = 0;
+ str->query_has_error = 0;
+ if(str->answer) {
+ sldns_buffer_free(str->answer);
+ str->answer = NULL;
+ }
+ }
+}
+
+/** the handshake completed callback from ngtcp2 */
+static int
+handshake_completed(ngtcp2_conn* ATTR_UNUSED(conn), void* user_data)
+{
+ struct doq_client_data* data = (struct doq_client_data*)user_data;
+ verbose(1, "handshake_completed callback");
+ verbose(1, "ngtcp2_conn_get_max_data_left is %d",
+ (int)ngtcp2_conn_get_max_data_left(data->conn));
+#ifdef HAVE_NGTCP2_CONN_GET_MAX_LOCAL_STREAMS_UNI
+ verbose(1, "ngtcp2_conn_get_max_local_streams_uni is %d",
+ (int)ngtcp2_conn_get_max_local_streams_uni(data->conn));
+#endif
+ verbose(1, "ngtcp2_conn_get_streams_uni_left is %d",
+ (int)ngtcp2_conn_get_streams_uni_left(data->conn));
+ verbose(1, "ngtcp2_conn_get_streams_bidi_left is %d",
+ (int)ngtcp2_conn_get_streams_bidi_left(data->conn));
+ verbose(1, "negotiated cipher name is %s",
+ SSL_get_cipher_name(data->ssl));
+ if(verbosity > 0) {
+ const unsigned char* alpn = NULL;
+ unsigned int alpnlen = 0;
+ char alpnstr[128];
+ SSL_get0_alpn_selected(data->ssl, &alpn, &alpnlen);
+ if(alpnlen > sizeof(alpnstr)-1)
+ alpnlen = sizeof(alpnstr)-1;
+ memmove(alpnstr, alpn, alpnlen);
+ alpnstr[alpnlen]=0;
+ verbose(1, "negotiated ALPN is '%s'", alpnstr);
+ }
+ /* The SSL_get_early_data_status call works after the handshake
+ * completes. */
+ if(data->early_data_enabled) {
+ if(SSL_get_early_data_status(data->ssl) !=
+ SSL_EARLY_DATA_ACCEPTED) {
+ early_data_is_rejected(data);
+ } else {
+ verbose(1, "early data was accepted by the server");
+ }
+ }
+#ifdef HAVE_NGTCP2_CRYPTO_QUICTLS_CONFIGURE_CLIENT_CONTEXT
+ if(data->transport_file) {
+ early_data_write_transport(data);
+ }
+#endif
+ return 0;
+}
+
+/** the extend_max_local_streams_bidi callback from ngtcp2 */
+static int
+extend_max_local_streams_bidi(ngtcp2_conn* ATTR_UNUSED(conn),
+ uint64_t max_streams, void* user_data)
+{
+ struct doq_client_data* data = (struct doq_client_data*)user_data;
+ verbose(1, "extend_max_local_streams_bidi callback, %d max_streams",
+ (int)max_streams);
+ verbose(1, "ngtcp2_conn_get_max_data_left is %d",
+ (int)ngtcp2_conn_get_max_data_left(data->conn));
+#ifdef HAVE_NGTCP2_CONN_GET_MAX_LOCAL_STREAMS_UNI
+ verbose(1, "ngtcp2_conn_get_max_local_streams_uni is %d",
+ (int)ngtcp2_conn_get_max_local_streams_uni(data->conn));
+#endif
+ verbose(1, "ngtcp2_conn_get_streams_uni_left is %d",
+ (int)ngtcp2_conn_get_streams_uni_left(data->conn));
+ verbose(1, "ngtcp2_conn_get_streams_bidi_left is %d",
+ (int)ngtcp2_conn_get_streams_bidi_left(data->conn));
+ query_streams_start(data);
+ return 0;
+}
+
+/** the recv_stream_data callback from ngtcp2 */
+static int
+recv_stream_data(ngtcp2_conn* ATTR_UNUSED(conn), uint32_t flags,
+ int64_t stream_id, uint64_t offset, const uint8_t* data,
+ size_t datalen, void* user_data, void* stream_user_data)
+{
+ struct doq_client_data* doqdata = (struct doq_client_data*)user_data;
+ struct doq_client_stream* str = (struct doq_client_stream*)
+ stream_user_data;
+ verbose(1, "recv_stream_data stream %d offset %d datalen %d%s%s",
+ (int)stream_id, (int)offset, (int)datalen,
+ ((flags&NGTCP2_STREAM_DATA_FLAG_FIN)!=0?" FIN":""),
+#ifdef NGTCP2_STREAM_DATA_FLAG_0RTT
+ ((flags&NGTCP2_STREAM_DATA_FLAG_0RTT)!=0?" 0RTT":"")
+#else
+ ((flags&NGTCP2_STREAM_DATA_FLAG_EARLY)!=0?" EARLY":"")
+#endif
+ );
+ if(verbosity > 0)
+ log_hex("data", (void*)data, datalen);
+ if(verbosity > 0) {
+ char* logs = client_stream_string(str);
+ verbose(1, "the stream_user_data is %s stream id %d, nread %d",
+ logs, (int)str->stream_id, (int)str->nread);
+ free(logs);
+ }
+
+ /* append the data, if there is data */
+ if(datalen > 0) {
+ client_stream_recv_data(str, data, datalen);
+ }
+ if((flags&NGTCP2_STREAM_DATA_FLAG_FIN)!=0) {
+ client_stream_recv_fin(doqdata, str, 1);
+ }
+ ngtcp2_conn_extend_max_stream_offset(doqdata->conn, stream_id, datalen);
+ ngtcp2_conn_extend_max_offset(doqdata->conn, datalen);
+ return 0;
+}
+
+/** the stream reset callback from ngtcp2 */
+static int
+stream_reset(ngtcp2_conn* ATTR_UNUSED(conn), int64_t stream_id,
+ uint64_t final_size, uint64_t app_error_code, void* user_data,
+ void* stream_user_data)
+{
+ struct doq_client_data* doqdata = (struct doq_client_data*)user_data;
+ struct doq_client_stream* str = (struct doq_client_stream*)
+ stream_user_data;
+ verbose(1, "stream reset for stream %d final size %d app error code %d",
+ (int)stream_id, (int)final_size, (int)app_error_code);
+ client_stream_recv_fin(doqdata, str, 0);
+ return 0;
+}
+
+/** copy sockaddr into ngtcp2 addr */
+static void
+copy_ngaddr(struct ngtcp2_addr* ngaddr, struct sockaddr_storage* addr,
+ socklen_t addrlen)
+{
+ if(addr_is_ip6(addr, addrlen)) {
+#if defined(NGTCP2_USE_GENERIC_SOCKADDR) || defined(NGTCP2_USE_GENERIC_IPV6_SOCKADDR)
+ struct sockaddr_in* i6 = (struct sockaddr_in6*)addr;
+ struct ngtcp2_sockaddr_in6 a6;
+ ngaddr->addr = calloc(1, sizeof(a6));
+ if(!ngaddr->addr) fatal_exit("calloc failed: out of memory");
+ ngaddr->addrlen = sizeof(a6);
+ memset(&a6, 0, sizeof(a6));
+ a6.sin6_family = i6->sin6_family;
+ a6.sin6_port = i6->sin6_port;
+ a6.sin6_flowinfo = i6->sin6_flowinfo;
+ memmove(&a6.sin6_addr, i6->sin6_addr, sizeof(a6.sin6_addr);
+ a6.sin6_scope_id = i6->sin6_scope_id;
+ memmove(ngaddr->addr, &a6, sizeof(a6));
+#else
+ ngaddr->addr = (ngtcp2_sockaddr*)addr;
+ ngaddr->addrlen = addrlen;
+#endif
+ } else {
+#ifdef NGTCP2_USE_GENERIC_SOCKADDR
+ struct sockaddr_in* i4 = (struct sockaddr_in*)addr;
+ struct ngtcp2_sockaddr_in a4;
+ ngaddr->addr = calloc(1, sizeof(a4));
+ if(!ngaddr->addr) fatal_exit("calloc failed: out of memory");
+ ngaddr->addrlen = sizeof(a4);
+ memset(&a4, 0, sizeof(a4));
+ a4.sin_family = i4->sin_family;
+ a4.sin_port = i4->sin_port;
+ memmove(&a4.sin_addr, i4->sin_addr, sizeof(a4.sin_addr);
+ memmove(ngaddr->addr, &a4, sizeof(a4));
+#else
+ ngaddr->addr = (ngtcp2_sockaddr*)addr;
+ ngaddr->addrlen = addrlen;
+#endif
+ }
+}
+
+/** debug log printf for ngtcp2 connections */
+static void log_printf_for_doq(void* ATTR_UNUSED(user_data),
+ const char* fmt, ...)
+{
+ va_list ap;
+ va_start(ap, fmt);
+ fprintf(stderr, "libngtcp2: ");
+ vfprintf(stderr, fmt, ap);
+ va_end(ap);
+ fprintf(stderr, "\n");
+}
+
+/** get a timestamp in nanoseconds */
+static ngtcp2_tstamp get_timestamp_nanosec(void)
+{
+#ifdef CLOCK_REALTIME
+ struct timespec tp;
+ memset(&tp, 0, sizeof(tp));
+#ifdef CLOCK_MONOTONIC
+ if(clock_gettime(CLOCK_MONOTONIC, &tp) == -1) {
+#endif
+ if(clock_gettime(CLOCK_REALTIME, &tp) == -1) {
+ log_err("clock_gettime failed: %s", strerror(errno));
+ }
+#ifdef CLOCK_MONOTONIC
+ }
+#endif
+ return ((uint64_t)tp.tv_sec)*((uint64_t)1000000000) +
+ ((uint64_t)tp.tv_nsec);
+#else
+ struct timeval tv;
+ if(gettimeofday(&tv, NULL) < 0) {
+ log_err("gettimeofday failed: %s", strerror(errno));
+ }
+ return ((uint64_t)tv.tv_sec)*((uint64_t)1000000000) +
+ ((uint64_t)tv.tv_usec)*((uint64_t)1000);
+#endif /* CLOCK_REALTIME */
+}
+
+/** create ngtcp2 client connection and set up. */
+static struct ngtcp2_conn* conn_client_setup(struct doq_client_data* data)
+{
+ struct ngtcp2_conn* conn = NULL;
+ int rv;
+ struct ngtcp2_cid dcid, scid;
+ struct ngtcp2_path path;
+ uint32_t client_chosen_version = NGTCP2_PROTO_VER_V1;
+ struct ngtcp2_callbacks cbs;
+ struct ngtcp2_settings settings;
+ struct ngtcp2_transport_params params;
+
+ memset(&cbs, 0, sizeof(cbs));
+ memset(&settings, 0, sizeof(settings));
+ memset(&params, 0, sizeof(params));
+ memset(&dcid, 0, sizeof(dcid));
+ memset(&scid, 0, sizeof(scid));
+ memset(&path, 0, sizeof(path));
+
+ data->quic_version = client_chosen_version;
+ ngtcp2_settings_default(&settings);
+ if(str_is_ip6(data->svr)) {
+#ifdef HAVE_STRUCT_NGTCP2_SETTINGS_MAX_TX_UDP_PAYLOAD_SIZE
+ settings.max_tx_udp_payload_size = 1232;
+#else
+ settings.max_udp_payload_size = 1232;
+#endif
+ }
+ settings.rand_ctx.native_handle = data->rnd;
+ if(verbosity > 0) {
+ /* make debug logs */
+ settings.log_printf = log_printf_for_doq;
+ }
+ settings.initial_ts = get_timestamp_nanosec();
+ ngtcp2_transport_params_default(&params);
+ params.initial_max_stream_data_bidi_local = 256*1024;
+ params.initial_max_stream_data_bidi_remote = 256*1024;
+ params.initial_max_stream_data_uni = 256*1024;
+ params.initial_max_data = 1024*1024;
+ params.initial_max_streams_bidi = 0;
+ params.initial_max_streams_uni = 100;
+ params.max_idle_timeout = 30*NGTCP2_SECONDS;
+ params.active_connection_id_limit = 7;
+ cid_randfill(&dcid, 16, data->rnd);
+ cid_randfill(&scid, 16, data->rnd);
+ cbs.client_initial = ngtcp2_crypto_client_initial_cb;
+ cbs.recv_crypto_data = ngtcp2_crypto_recv_crypto_data_cb;
+ cbs.encrypt = ngtcp2_crypto_encrypt_cb;
+ cbs.decrypt = ngtcp2_crypto_decrypt_cb;
+ cbs.hp_mask = ngtcp2_crypto_hp_mask_cb;
+ cbs.recv_retry = ngtcp2_crypto_recv_retry_cb;
+ cbs.update_key = ngtcp2_crypto_update_key_cb;
+ cbs.delete_crypto_aead_ctx = ngtcp2_crypto_delete_crypto_aead_ctx_cb;
+ cbs.delete_crypto_cipher_ctx =
+ ngtcp2_crypto_delete_crypto_cipher_ctx_cb;
+ cbs.get_path_challenge_data = ngtcp2_crypto_get_path_challenge_data_cb;
+ cbs.version_negotiation = ngtcp2_crypto_version_negotiation_cb;
+ cbs.get_new_connection_id = get_new_connection_id_cb;
+ cbs.handshake_completed = handshake_completed;
+ cbs.extend_max_local_streams_bidi = extend_max_local_streams_bidi;
+ cbs.rand = rand_cb;
+ cbs.recv_stream_data = recv_stream_data;
+ cbs.stream_reset = stream_reset;
+ copy_ngaddr(&path.local, &data->local_addr, data->local_addr_len);
+ copy_ngaddr(&path.remote, &data->dest_addr, data->dest_addr_len);
+
+ rv = ngtcp2_conn_client_new(&conn, &dcid, &scid, &path,
+ client_chosen_version, &cbs, &settings, &params,
+ NULL, /* ngtcp2_mem allocator, use default */
+ data /* callback argument */);
+ if(!conn) fatal_exit("could not ngtcp2_conn_client_new: %s",
+ ngtcp2_strerror(rv));
+ data->cc_algo = settings.cc_algo;
+ return conn;
+}
+
+#ifndef HAVE_NGTCP2_CONN_ENCODE_0RTT_TRANSPORT_PARAMS
+/** write the transport file */
+static void
+transport_file_write(const char* file, struct ngtcp2_transport_params* params)
+{
+ FILE* out;
+ out = fopen(file, "w");
+ if(!out) {
+ perror(file);
+ return;
+ }
+ fprintf(out, "initial_max_streams_bidi=%u\n",
+ (unsigned)params->initial_max_streams_bidi);
+ fprintf(out, "initial_max_streams_uni=%u\n",
+ (unsigned)params->initial_max_streams_uni);
+ fprintf(out, "initial_max_stream_data_bidi_local=%u\n",
+ (unsigned)params->initial_max_stream_data_bidi_local);
+ fprintf(out, "initial_max_stream_data_bidi_remote=%u\n",
+ (unsigned)params->initial_max_stream_data_bidi_remote);
+ fprintf(out, "initial_max_stream_data_uni=%u\n",
+ (unsigned)params->initial_max_stream_data_uni);
+ fprintf(out, "initial_max_data=%u\n",
+ (unsigned)params->initial_max_data);
+ fprintf(out, "active_connection_id_limit=%u\n",
+ (unsigned)params->active_connection_id_limit);
+ fprintf(out, "max_datagram_frame_size=%u\n",
+ (unsigned)params->max_datagram_frame_size);
+ if(ferror(out)) {
+ verbose(1, "There was an error writing %s: %s",
+ file, strerror(errno));
+ fclose(out);
+ return;
+ }
+ fclose(out);
+}
+#endif /* HAVE_NGTCP2_CONN_ENCODE_0RTT_TRANSPORT_PARAMS */
+
+/** fetch and write the transport file */
+static void
+early_data_write_transport(struct doq_client_data* data)
+{
+#ifdef HAVE_NGTCP2_CONN_ENCODE_0RTT_TRANSPORT_PARAMS
+ FILE* out;
+ uint8_t buf[1024];
+ ngtcp2_ssize len = ngtcp2_conn_encode_0rtt_transport_params(data->conn,
+ buf, sizeof(buf));
+ if(len < 0) {
+ log_err("ngtcp2_conn_encode_0rtt_transport_params failed: %s",
+ ngtcp2_strerror(len));
+ return;
+ }
+ out = fopen(data->transport_file, "w");
+ if(!out) {
+ perror(data->transport_file);
+ return;
+ }
+ if(fwrite(buf, 1, len, out) != (size_t)len) {
+ log_err("fwrite %s failed: %s", data->transport_file,
+ strerror(errno));
+ }
+ if(ferror(out)) {
+ verbose(1, "There was an error writing %s: %s",
+ data->transport_file, strerror(errno));
+ }
+ fclose(out);
+#else
+ struct ngtcp2_transport_params params;
+ memset(&params, 0, sizeof(params));
+ ngtcp2_conn_get_remote_transport_params(data->conn, &params);
+ transport_file_write(data->transport_file, &params);
+#endif
+}
+
+#ifndef HAVE_NGTCP2_CRYPTO_QUICTLS_CONFIGURE_CLIENT_CONTEXT
+/** applicatation rx key callback, this is where the rx key is set,
+ * and streams can be opened, like http3 unidirectional streams, like
+ * the http3 control and http3 qpack encode and decoder streams. */
+static int
+application_rx_key_cb(struct doq_client_data* data)
+{
+ verbose(1, "application_rx_key_cb callback");
+ verbose(1, "ngtcp2_conn_get_max_data_left is %d",
+ (int)ngtcp2_conn_get_max_data_left(data->conn));
+#ifdef HAVE_NGTCP2_CONN_GET_MAX_LOCAL_STREAMS_UNI
+ verbose(1, "ngtcp2_conn_get_max_local_streams_uni is %d",
+ (int)ngtcp2_conn_get_max_local_streams_uni(data->conn));
+#endif
+ verbose(1, "ngtcp2_conn_get_streams_uni_left is %d",
+ (int)ngtcp2_conn_get_streams_uni_left(data->conn));
+ verbose(1, "ngtcp2_conn_get_streams_bidi_left is %d",
+ (int)ngtcp2_conn_get_streams_bidi_left(data->conn));
+ if(data->transport_file) {
+ early_data_write_transport(data);
+ }
+ return 1;
+}
+
+/** quic_method set_encryption_secrets function */
+static int
+set_encryption_secrets(SSL *ssl, OSSL_ENCRYPTION_LEVEL ossl_level,
+ const uint8_t *read_secret, const uint8_t *write_secret,
+ size_t secret_len)
+{
+ struct doq_client_data* data = get_app_data(ssl);
+#ifdef HAVE_NGTCP2_ENCRYPTION_LEVEL
+ ngtcp2_encryption_level
+#else
+ ngtcp2_crypto_level
+#endif
+ level =
+#ifdef HAVE_NGTCP2_CRYPTO_QUICTLS_FROM_OSSL_ENCRYPTION_LEVEL
+ ngtcp2_crypto_quictls_from_ossl_encryption_level(ossl_level);
+#else
+ ngtcp2_crypto_openssl_from_ossl_encryption_level(ossl_level);
+#endif
+
+ if(read_secret) {
+ if(ngtcp2_crypto_derive_and_install_rx_key(data->conn, NULL,
+ NULL, NULL, level, read_secret, secret_len) != 0) {
+ log_err("ngtcp2_crypto_derive_and_install_rx_key failed");
+ return 0;
+ }
+ if(level == NGTCP2_CRYPTO_LEVEL_APPLICATION) {
+ if(!application_rx_key_cb(data))
+ return 0;
+ }
+ }
+
+ if(write_secret) {
+ if(ngtcp2_crypto_derive_and_install_tx_key(data->conn, NULL,
+ NULL, NULL, level, write_secret, secret_len) != 0) {
+ log_err("ngtcp2_crypto_derive_and_install_tx_key failed");
+ return 0;
+ }
+ }
+ return 1;
+}
+
+/** quic_method add_handshake_data function */
+static int
+add_handshake_data(SSL *ssl, OSSL_ENCRYPTION_LEVEL ossl_level,
+ const uint8_t *data, size_t len)
+{
+ struct doq_client_data* doqdata = get_app_data(ssl);
+#ifdef HAVE_NGTCP2_ENCRYPTION_LEVEL
+ ngtcp2_encryption_level
+#else
+ ngtcp2_crypto_level
+#endif
+ level =
+#ifdef HAVE_NGTCP2_CRYPTO_QUICTLS_FROM_OSSL_ENCRYPTION_LEVEL
+ ngtcp2_crypto_quictls_from_ossl_encryption_level(ossl_level);
+#else
+ ngtcp2_crypto_openssl_from_ossl_encryption_level(ossl_level);
+#endif
+ int rv;
+
+ rv = ngtcp2_conn_submit_crypto_data(doqdata->conn, level, data, len);
+ if(rv != 0) {
+ log_err("ngtcp2_conn_submit_crypto_data failed: %s",
+ ngtcp2_strerror(rv));
+ ngtcp2_conn_set_tls_error(doqdata->conn, rv);
+ return 0;
+ }
+ return 1;
+}
+
+/** quic_method flush_flight function */
+static int
+flush_flight(SSL* ATTR_UNUSED(ssl))
+{
+ return 1;
+}
+
+/** quic_method send_alert function */
+static int
+send_alert(SSL *ssl, enum ssl_encryption_level_t ATTR_UNUSED(level),
+ uint8_t alert)
+{
+ struct doq_client_data* data = get_app_data(ssl);
+ data->tls_alert = alert;
+ return 1;
+}
+#endif /* HAVE_NGTCP2_CRYPTO_QUICTLS_CONFIGURE_CLIENT_CONTEXT */
+
+/** new session callback. We can write it to file for resumption later. */
+static int
+new_session_cb(SSL* ssl, SSL_SESSION* session)
+{
+ struct doq_client_data* data = get_app_data(ssl);
+ BIO *f;
+ log_assert(data->session_file);
+ verbose(1, "new session cb: the ssl session max_early_data_size is %u",
+ (unsigned)SSL_SESSION_get_max_early_data(session));
+ f = BIO_new_file(data->session_file, "w");
+ if(!f) {
+ log_err("Could not open %s: %s", data->session_file,
+ strerror(errno));
+ return 0;
+ }
+ PEM_write_bio_SSL_SESSION(f, session);
+ BIO_free(f);
+ verbose(1, "written tls session to %s", data->session_file);
+ return 0;
+}
+
+/** setup the TLS context */
+static SSL_CTX*
+ctx_client_setup(void)
+{
+ SSL_CTX* ctx = SSL_CTX_new(TLS_client_method());
+ if(!ctx) {
+ log_crypto_err("Could not SSL_CTX_new");
+ exit(1);
+ }
+ SSL_CTX_set_min_proto_version(ctx, TLS1_3_VERSION);
+ SSL_CTX_set_max_proto_version(ctx, TLS1_3_VERSION);
+ SSL_CTX_set_default_verify_paths(ctx);
+#ifdef HAVE_NGTCP2_CRYPTO_QUICTLS_CONFIGURE_CLIENT_CONTEXT
+ if(ngtcp2_crypto_quictls_configure_client_context(ctx) != 0) {
+ log_err("ngtcp2_crypto_quictls_configure_client_context failed");
+ exit(1);
+ }
+#else
+ memset(&quic_method, 0, sizeof(quic_method));
+ quic_method.set_encryption_secrets = &set_encryption_secrets;
+ quic_method.add_handshake_data = &add_handshake_data;
+ quic_method.flush_flight = &flush_flight;
+ quic_method.send_alert = &send_alert;
+ SSL_CTX_set_quic_method(ctx, &quic_method);
+#endif
+ return ctx;
+}
+
+
+/* setup the TLS object */
+static SSL*
+ssl_client_setup(struct doq_client_data* data)
+{
+ SSL* ssl = SSL_new(data->ctx);
+ if(!ssl) {
+ log_crypto_err("Could not SSL_new");
+ exit(1);
+ }
+ set_app_data(ssl, data);
+ SSL_set_connect_state(ssl);
+ if(!SSL_set_fd(ssl, data->fd)) {
+ log_crypto_err("Could not SSL_set_fd");
+ exit(1);
+ }
+ if((data->quic_version & 0xff000000) == 0xff000000) {
+ SSL_set_quic_use_legacy_codepoint(ssl, 1);
+ } else {
+ SSL_set_quic_use_legacy_codepoint(ssl, 0);
+ }
+ SSL_set_alpn_protos(ssl, (const unsigned char *)"\x03""doq", 4);
+ /* send the SNI host name */
+ SSL_set_tlsext_host_name(ssl, "localhost");
+ return ssl;
+}
+
+/** get packet ecn information */
+static uint32_t
+msghdr_get_ecn(struct msghdr* msg, int family)
+{
+#ifndef S_SPLINT_S
+ struct cmsghdr* cmsg;
+ if(family == AF_INET6) {
+ for(cmsg = CMSG_FIRSTHDR(msg); cmsg != NULL;
+ cmsg = CMSG_NXTHDR(msg, cmsg)) {
+ if(cmsg->cmsg_level == IPPROTO_IPV6 &&
+ cmsg->cmsg_type == IPV6_TCLASS &&
+ cmsg->cmsg_len != 0) {
+ uint8_t* ecn = (uint8_t*)CMSG_DATA(cmsg);
+ return *ecn;
+ }
+ }
+ return 0;
+ }
+ for(cmsg = CMSG_FIRSTHDR(msg); cmsg != NULL;
+ cmsg = CMSG_NXTHDR(msg, cmsg)) {
+ if(cmsg->cmsg_level == IPPROTO_IP &&
+ cmsg->cmsg_type == IP_TOS &&
+ cmsg->cmsg_len != 0) {
+ uint8_t* ecn = (uint8_t*)CMSG_DATA(cmsg);
+ return *ecn;
+ }
+ }
+ return 0;
+#endif /* S_SPLINT_S */
+}
+
+/** set the ecn on the transmission */
+static void
+set_ecn(int fd, int family, uint32_t ecn)
+{
+ unsigned int val = ecn;
+ if(family == AF_INET6) {
+ if(setsockopt(fd, IPPROTO_IPV6, IPV6_TCLASS, &val,
+ (socklen_t)sizeof(val)) == -1) {
+ log_err("setsockopt(.. IPV6_TCLASS ..): %s",
+ strerror(errno));
+ }
+ return;
+ }
+ if(setsockopt(fd, IPPROTO_IP, IP_TOS, &val,
+ (socklen_t)sizeof(val)) == -1) {
+ log_err("setsockopt(.. IP_TOS ..): %s",
+ strerror(errno));
+ }
+}
+
+/** send a packet */
+static int
+doq_client_send_pkt(struct doq_client_data* data, uint32_t ecn, uint8_t* buf,
+ size_t buf_len, int is_blocked_pkt, int* send_is_blocked)
+{
+ struct msghdr msg;
+ struct iovec iov[1];
+ ssize_t ret;
+ iov[0].iov_base = buf;
+ iov[0].iov_len = buf_len;
+ memset(&msg, 0, sizeof(msg));
+ msg.msg_name = (void*)&data->dest_addr;
+ msg.msg_namelen = data->dest_addr_len;
+ msg.msg_iov = iov;
+ msg.msg_iovlen = 1;
+ set_ecn(data->fd, data->dest_addr.ss_family, ecn);
+
+ for(;;) {
+ ret = sendmsg(data->fd, &msg, MSG_DONTWAIT);
+ if(ret == -1 && errno == EINTR)
+ continue;
+ break;
+ }
+ if(ret == -1) {
+ if(errno == EAGAIN) {
+ if(buf_len >
+ sldns_buffer_capacity(data->blocked_pkt))
+ return 0; /* Cannot store it, but the buffers
+ are equal length and large enough, so this
+ should not happen. */
+ data->have_blocked_pkt = 1;
+ if(send_is_blocked)
+ *send_is_blocked = 1;
+ /* If we already send the previously blocked packet,
+ * no need to copy it, otherwise store the packet for
+ * later. */
+ if(!is_blocked_pkt) {
+ data->blocked_pkt_pi.ecn = ecn;
+ sldns_buffer_clear(data->blocked_pkt);
+ sldns_buffer_write(data->blocked_pkt, buf,
+ buf_len);
+ sldns_buffer_flip(data->blocked_pkt);
+ }
+ return 0;
+ }
+ log_err("doq sendmsg: %s", strerror(errno));
+#ifdef HAVE_NGTCP2_CCERR_DEFAULT
+ ngtcp2_ccerr_set_application_error(&data->ccerr, -1, NULL, 0);
+#else
+ ngtcp2_connection_close_error_set_application_error(&data->last_error, -1, NULL, 0);
+#endif
+ return 0;
+ }
+ return 1;
+}
+
+/** change event write on fd to when we have data or when congested */
+static void
+event_change_write(struct doq_client_data* data, int do_write)
+{
+ ub_event_del(data->ev);
+ if(do_write) {
+ ub_event_add_bits(data->ev, UB_EV_WRITE);
+ } else {
+ ub_event_del_bits(data->ev, UB_EV_WRITE);
+ }
+ if(ub_event_add(data->ev, NULL) != 0) {
+ fatal_exit("could not ub_event_add");
+ }
+}
+
+/** write the connection close, with possible error */
+static void
+write_conn_close(struct doq_client_data* data)
+{
+ struct ngtcp2_path_storage ps;
+ struct ngtcp2_pkt_info pi;
+ ngtcp2_ssize ret;
+ if(!data->conn ||
+#ifdef HAVE_NGTCP2_CONN_IN_CLOSING_PERIOD
+ ngtcp2_conn_in_closing_period(data->conn) ||
+#else
+ ngtcp2_conn_is_in_closing_period(data->conn) ||
+#endif
+#ifdef HAVE_NGTCP2_CONN_IN_DRAINING_PERIOD
+ ngtcp2_conn_in_draining_period(data->conn)
+#else
+ ngtcp2_conn_is_in_draining_period(data->conn)
+#endif
+ )
+ return;
+ /* Drop blocked packet if there is one, the connection is being
+ * closed. And thus no further data traffic. */
+ data->have_blocked_pkt = 0;
+ if(
+#ifdef HAVE_NGTCP2_CCERR_DEFAULT
+ data->ccerr.type == NGTCP2_CCERR_TYPE_IDLE_CLOSE
+#else
+ data->last_error.type ==
+ NGTCP2_CONNECTION_CLOSE_ERROR_CODE_TYPE_TRANSPORT_IDLE_CLOSE
+#endif
+ ) {
+ /* do not call ngtcp2_conn_write_connection_close on the
+ * connection because the ngtcp2_conn_handle_expiry call
+ * has returned NGTCP2_ERR_IDLE_CLOSE. But continue to close
+ * the connection. */
+ return;
+ }
+ verbose(1, "write connection close");
+ ngtcp2_path_storage_zero(&ps);
+ sldns_buffer_clear(data->pkt_buf);
+ ret = ngtcp2_conn_write_connection_close(
+ data->conn, &ps.path, &pi, sldns_buffer_begin(data->pkt_buf),
+ sldns_buffer_remaining(data->pkt_buf),
+#ifdef HAVE_NGTCP2_CCERR_DEFAULT
+ &data->ccerr
+#else
+ &data->last_error
+#endif
+ , get_timestamp_nanosec());
+ if(ret < 0) {
+ log_err("ngtcp2_conn_write_connection_close failed: %s",
+ ngtcp2_strerror(ret));
+ return;
+ }
+ verbose(1, "write connection close packet length %d", (int)ret);
+ if(ret == 0)
+ return;
+ doq_client_send_pkt(data, pi.ecn, sldns_buffer_begin(data->pkt_buf),
+ ret, 0, NULL);
+}
+
+/** disconnect we are done */
+static void
+disconnect(struct doq_client_data* data)
+{
+ verbose(1, "disconnect");
+ write_conn_close(data);
+ ub_event_base_loopexit(data->base);
+}
+
+/** the expire timer callback */
+void doq_client_timer_cb(int ATTR_UNUSED(fd),
+ short ATTR_UNUSED(bits), void* arg)
+{
+ struct doq_client_data* data = (struct doq_client_data*)arg;
+ ngtcp2_tstamp now = get_timestamp_nanosec();
+ int rv;
+
+ verbose(1, "doq expire_timer");
+ data->expire_timer_added = 0;
+ rv = ngtcp2_conn_handle_expiry(data->conn, now);
+ if(rv != 0) {
+ log_err("ngtcp2_conn_handle_expiry failed: %s",
+ ngtcp2_strerror(rv));
+#ifdef HAVE_NGTCP2_CCERR_DEFAULT
+ ngtcp2_ccerr_set_liberr(&data->ccerr, rv, NULL, 0);
+#else
+ ngtcp2_connection_close_error_set_transport_error_liberr(
+ &data->last_error, rv, NULL, 0);
+#endif
+ disconnect(data);
+ return;
+ }
+ update_timer(data);
+ on_write(data);
+}
+
+/** update the timers */
+static void
+update_timer(struct doq_client_data* data)
+{
+ ngtcp2_tstamp expiry = ngtcp2_conn_get_expiry(data->conn);
+ ngtcp2_tstamp now = get_timestamp_nanosec();
+ ngtcp2_tstamp t;
+ struct timeval tv;
+
+ if(expiry <= now) {
+ /* the timer has already expired, add with zero timeout */
+ t = 0;
+ } else {
+ t = expiry - now;
+ }
+
+ /* set the timer */
+ if(data->expire_timer_added) {
+ ub_timer_del(data->expire_timer);
+ data->expire_timer_added = 0;
+ }
+ memset(&tv, 0, sizeof(tv));
+ tv.tv_sec = t / NGTCP2_SECONDS;
+ tv.tv_usec = (t / NGTCP2_MICROSECONDS)%1000000;
+ verbose(1, "update_timer in %d.%6.6d secs", (int)tv.tv_sec,
+ (int)tv.tv_usec);
+ if(ub_timer_add(data->expire_timer, data->base,
+ &doq_client_timer_cb, data, &tv) != 0) {
+ log_err("timer_add failed: could not add expire timer");
+ return;
+ }
+ data->expire_timer_added = 1;
+}
+
+/** perform read operations on fd */
+static void
+on_read(struct doq_client_data* data)
+{
+ struct sockaddr_storage addr;
+ struct iovec iov[1];
+ struct msghdr msg;
+ union {
+ struct cmsghdr hdr;
+ char buf[256];
+ } ancil;
+ int i;
+ ssize_t rcv;
+ ngtcp2_pkt_info pi;
+ int rv;
+ struct ngtcp2_path path;
+
+ for(i=0; i<10; i++) {
+ msg.msg_name = &addr;
+ msg.msg_namelen = (socklen_t)sizeof(addr);
+ iov[0].iov_base = sldns_buffer_begin(data->pkt_buf);
+ iov[0].iov_len = sldns_buffer_remaining(data->pkt_buf);
+ msg.msg_iov = iov;
+ msg.msg_iovlen = 1;
+ msg.msg_control = ancil.buf;
+#ifndef S_SPLINT_S
+ msg.msg_controllen = sizeof(ancil.buf);
+#endif /* S_SPLINT_S */
+ msg.msg_flags = 0;
+
+ rcv = recvmsg(data->fd, &msg, MSG_DONTWAIT);
+ if(rcv == -1) {
+ if(errno == EINTR || errno == EAGAIN)
+ break;
+ log_err_addr("doq recvmsg", strerror(errno),
+ &data->dest_addr, sizeof(data->dest_addr_len));
+ break;
+ }
+
+ pi.ecn = msghdr_get_ecn(&msg, addr.ss_family);
+ verbose(1, "recvmsg %d ecn=0x%x", (int)rcv, (int)pi.ecn);
+
+ memset(&path, 0, sizeof(path));
+ path.local.addr = (void*)&data->local_addr;
+ path.local.addrlen = data->local_addr_len;
+ path.remote.addr = (void*)msg.msg_name;
+ path.remote.addrlen = msg.msg_namelen;
+ rv = ngtcp2_conn_read_pkt(data->conn, &path, &pi,
+ iov[0].iov_base, rcv, get_timestamp_nanosec());
+ if(rv != 0) {
+ log_err("ngtcp2_conn_read_pkt failed: %s",
+ ngtcp2_strerror(rv));
+ if(
+#ifdef HAVE_NGTCP2_CCERR_DEFAULT
+ data->ccerr.error_code == 0
+#else
+ data->last_error.error_code == 0
+#endif
+ ) {
+ if(rv == NGTCP2_ERR_CRYPTO) {
+ /* in picotls the tls alert may need
+ * to be copied, but this is with
+ * openssl. And we have the value
+ * data.tls_alert. */
+#ifdef HAVE_NGTCP2_CCERR_DEFAULT
+ ngtcp2_ccerr_set_tls_alert(
+ &data->ccerr, data->tls_alert,
+ NULL, 0);
+#else
+ ngtcp2_connection_close_error_set_transport_error_tls_alert(
+ &data->last_error,
+ data->tls_alert, NULL, 0);
+#endif
+ } else {
+#ifdef HAVE_NGTCP2_CCERR_DEFAULT
+ ngtcp2_ccerr_set_liberr(&data->ccerr,
+ rv, NULL, 0);
+#else
+ ngtcp2_connection_close_error_set_transport_error_liberr(
+ &data->last_error, rv, NULL,
+ 0);
+#endif
+ }
+ }
+ disconnect(data);
+ return;
+ }
+ }
+
+ update_timer(data);
+}
+
+/** the write of this query has completed, it has spooled to packets,
+ * set it to have the write done and move it to the list of receive streams. */
+static void
+query_write_is_done(struct doq_client_data* data,
+ struct doq_client_stream* str)
+{
+ if(verbosity > 0) {
+ char* logs = client_stream_string(str);
+ verbose(1, "query %s write is done", logs);
+ free(logs);
+ }
+ str->write_is_done = 1;
+ stream_list_move(str, data->query_list_send, data->query_list_receive);
+}
+
+/** write the data streams, if possible */
+static int
+write_streams(struct doq_client_data* data)
+{
+ ngtcp2_path_storage ps;
+ ngtcp2_tstamp ts = get_timestamp_nanosec();
+ struct doq_client_stream* str, *next;
+ uint32_t flags;
+ /* number of bytes that can be sent without packet pacing */
+ size_t send_quantum = ngtcp2_conn_get_send_quantum(data->conn);
+ /* Overhead is the stream overhead of adding a header onto the data,
+ * this make sure the number of bytes to send in data bytes plus
+ * the overhead overshoots the target quantum by a smaller margin,
+ * and then it stops sending more bytes. With zero it would overshoot
+ * more, an accurate number would not overshoot. It is based on the
+ * stream frame header size. */
+ size_t accumulated_send = 0, overhead_stream = 24, overhead_pkt = 60,
+ max_packet_size = 1200;
+ size_t num_packets = 0, max_packets = 65535;
+ ngtcp2_path_storage_zero(&ps);
+ str = data->query_list_send->first;
+
+ if(data->cc_algo != NGTCP2_CC_ALGO_BBR
+#ifdef NGTCP2_CC_ALGO_BBR_V2
+ && data->cc_algo != NGTCP2_CC_ALGO_BBR_V2
+#endif
+#ifdef NGTCP2_CC_ALGO_BBR2
+ && data->cc_algo != NGTCP2_CC_ALGO_BBR2
+#endif
+ ) {
+ /* If we do not have a packet pacing congestion control
+ * algorithm, limit the number of packets. */
+ max_packets = 10;
+ }
+
+ /* loop like this, because at the start, the send list is empty,
+ * and we want to send handshake packets. But when there is a
+ * send_list, loop through that. */
+ for(;;) {
+ int64_t stream_id;
+ ngtcp2_pkt_info pi;
+ ngtcp2_vec datav[2];
+ size_t datav_count = 0;
+ int fin;
+ ngtcp2_ssize ret;
+ ngtcp2_ssize ndatalen = 0;
+ int send_is_blocked = 0;
+
+ if(str) {
+ /* pick up next in case this one is deleted */
+ next = str->next;
+ if(verbosity > 0) {
+ char* logs = client_stream_string(str);
+ verbose(1, "query %s write stream", logs);
+ free(logs);
+ }
+ stream_id = str->stream_id;
+ fin = 1;
+ if(str->nwrite < 2) {
+ str->data_tcplen = htons(str->data_len);
+ datav[0].base = ((uint8_t*)&str->data_tcplen)+str->nwrite;
+ datav[0].len = 2-str->nwrite;
+ datav[1].base = str->data;
+ datav[1].len = str->data_len;
+ datav_count = 2;
+ } else {
+ datav[0].base = str->data + (str->nwrite-2);
+ datav[0].len = str->data_len - (str->nwrite-2);
+ datav_count = 1;
+ }
+ } else {
+ next = NULL;
+ verbose(1, "write stream -1.");
+ stream_id = -1;
+ fin = 0;
+ datav[0].base = NULL;
+ datav[0].len = 0;
+ datav_count = 1;
+ }
+
+ /* Does the first data entry fit into the send quantum? */
+ /* Check if the data size sent, with a max of one full packet,
+ * with added stream header and packet header is allowed
+ * within the send quantum number of bytes. If not, it does
+ * not fit, and wait. */
+ if(accumulated_send == 0 && ((datav_count == 1 &&
+ (datav[0].len>max_packet_size?max_packet_size:
+ datav[0].len)+overhead_stream+overhead_pkt >
+ send_quantum) ||
+ (datav_count == 2 &&
+ (datav[0].len+datav[1].len>max_packet_size?
+ max_packet_size:datav[0].len+datav[1].len)
+ +overhead_stream+overhead_pkt > send_quantum))) {
+ /* congestion limited */
+ ngtcp2_conn_update_pkt_tx_time(data->conn, ts);
+ event_change_write(data, 0);
+ /* update the timer to wait until it is possible to
+ * write again */
+ update_timer(data);
+ return 0;
+ }
+ flags = 0;
+ if(str && str->next != NULL) {
+ /* Coalesce more data from more streams into this
+ * packet, if possible */
+ /* There is more than one data entry in this send
+ * quantum, does the next one fit in the quantum? */
+ size_t this_send, possible_next_send;
+ if(datav_count == 1)
+ this_send = datav[0].len;
+ else this_send = datav[0].len + datav[1].len;
+ if(this_send > max_packet_size)
+ this_send = max_packet_size;
+ if(str->next->nwrite < 2)
+ possible_next_send = (2-str->next->nwrite) +
+ str->next->data_len;
+ else possible_next_send = str->next->data_len -
+ (str->next->nwrite - 2);
+ if(possible_next_send > max_packet_size)
+ possible_next_send = max_packet_size;
+ /* Check if the data lengths that writev returned
+ * with stream headers added up so far, in
+ * accumulated_send, with added the data length
+ * of this send, with a max of one full packet, and
+ * the data length of the next possible send, with
+ * a max of one full packet, with a stream header for
+ * this_send and a stream header for the next possible
+ * send and a packet header, fit in the send quantum
+ * number of bytes. If so, ask to add more content
+ * to the packet with the more flag. */
+ if(accumulated_send + this_send + possible_next_send
+ +2*overhead_stream+ overhead_pkt < send_quantum)
+ flags |= NGTCP2_WRITE_STREAM_FLAG_MORE;
+ }
+ if(fin) {
+ /* This is the final part of data for this stream */
+ flags |= NGTCP2_WRITE_STREAM_FLAG_FIN;
+ }
+ sldns_buffer_clear(data->pkt_buf);
+ ret = ngtcp2_conn_writev_stream(data->conn, &ps.path, &pi,
+ sldns_buffer_begin(data->pkt_buf),
+ sldns_buffer_remaining(data->pkt_buf), &ndatalen,
+ flags, stream_id, datav, datav_count, ts);
+ if(ret < 0) {
+ if(ret == NGTCP2_ERR_WRITE_MORE) {
+ if(str) {
+ str->nwrite += ndatalen;
+ if(str->nwrite >= str->data_len+2)
+ query_write_is_done(data, str);
+ str = next;
+ accumulated_send += ndatalen + overhead_stream;
+ continue;
+ }
+ }
+ log_err("ngtcp2_conn_writev_stream failed: %s",
+ ngtcp2_strerror(ret));
+#ifdef HAVE_NGTCP2_CCERR_DEFAULT
+ ngtcp2_ccerr_set_liberr(&data->ccerr, ret, NULL, 0);
+#else
+ ngtcp2_connection_close_error_set_transport_error_liberr(
+ &data->last_error, ret, NULL, 0);
+#endif
+ disconnect(data);
+ return 0;
+ }
+ verbose(1, "writev_stream pkt size %d ndatawritten %d",
+ (int)ret, (int)ndatalen);
+ if(ndatalen >= 0 && str) {
+ /* add the new write offset */
+ str->nwrite += ndatalen;
+ if(str->nwrite >= str->data_len+2)
+ query_write_is_done(data, str);
+ }
+ if(ret == 0) {
+ /* congestion limited */
+ ngtcp2_conn_update_pkt_tx_time(data->conn, ts);
+ event_change_write(data, 0);
+ /* update the timer to wait until it is possible to
+ * write again */
+ update_timer(data);
+ return 0;
+ }
+ if(!doq_client_send_pkt(data, pi.ecn,
+ sldns_buffer_begin(data->pkt_buf), ret, 0,
+ &send_is_blocked)) {
+ if(send_is_blocked) {
+ /* Blocked packet, wait until it is possible
+ * to write again and also set a timer. */
+ event_change_write(data, 1);
+ update_timer(data);
+ return 0;
+ }
+ /* Packet could not be sent. Like lost and timeout. */
+ ngtcp2_conn_update_pkt_tx_time(data->conn, ts);
+ event_change_write(data, 0);
+ update_timer(data);
+ return 0;
+ }
+ /* continue */
+ if((size_t)ret >= send_quantum)
+ break;
+ send_quantum -= ret;
+ accumulated_send = 0;
+ str = next;
+ if(str == NULL)
+ break;
+ if(++num_packets == max_packets)
+ break;
+ }
+ ngtcp2_conn_update_pkt_tx_time(data->conn, ts);
+ event_change_write(data, 1);
+ return 1;
+}
+
+/** send the blocked packet now that the stream is writable again. */
+static int
+send_blocked_pkt(struct doq_client_data* data)
+{
+ ngtcp2_tstamp ts = get_timestamp_nanosec();
+ int send_is_blocked = 0;
+ if(!doq_client_send_pkt(data, data->blocked_pkt_pi.ecn,
+ sldns_buffer_begin(data->pkt_buf),
+ sldns_buffer_limit(data->pkt_buf), 1, &send_is_blocked)) {
+ if(send_is_blocked) {
+ /* Send was blocked, again. Wait, again to retry. */
+ event_change_write(data, 1);
+ /* make sure the timer is set while waiting */
+ update_timer(data);
+ return 0;
+ }
+ /* The packed could not be sent. Like it was lost, timeout. */
+ data->have_blocked_pkt = 0;
+ ngtcp2_conn_update_pkt_tx_time(data->conn, ts);
+ event_change_write(data, 0);
+ update_timer(data);
+ return 0;
+ }
+ /* The blocked packet has been sent, the holding buffer can be
+ * cleared. */
+ data->have_blocked_pkt = 0;
+ ngtcp2_conn_update_pkt_tx_time(data->conn, ts);
+ return 1;
+}
+
+/** perform write operations, if any, on fd */
+static void
+on_write(struct doq_client_data* data)
+{
+ if(data->have_blocked_pkt) {
+ if(!send_blocked_pkt(data))
+ return;
+ }
+ if(
+#ifdef HAVE_NGTCP2_CONN_IN_CLOSING_PERIOD
+ ngtcp2_conn_in_closing_period(data->conn)
+#else
+ ngtcp2_conn_is_in_closing_period(data->conn)
+#endif
+ )
+ return;
+ if(!write_streams(data))
+ return;
+ update_timer(data);
+}
+
+/** callback for main listening file descriptor */
+void
+doq_client_event_cb(int ATTR_UNUSED(fd), short bits, void* arg)
+{
+ struct doq_client_data* data = (struct doq_client_data*)arg;
+ verbose(1, "doq_client_event_cb %s%s%s",
+ ((bits&UB_EV_READ)!=0?"EV_READ":""),
+ ((bits&(UB_EV_READ|UB_EV_WRITE))==(UB_EV_READ|UB_EV_WRITE)?
+ " ":""),
+ ((bits&UB_EV_WRITE)!=0?"EV_WRITE":""));
+ if((bits&UB_EV_READ)) {
+ on_read(data);
+ }
+ /* Perform the write operation anyway. The read operation may
+ * have produced data, or there is content waiting and it is possible
+ * to write that. */
+ on_write(data);
+}
+
+/** read the TLS session from file */
+static int
+early_data_setup_session(struct doq_client_data* data)
+{
+ SSL_SESSION* session;
+ BIO* f = BIO_new_file(data->session_file, "r");
+ if(f == NULL) {
+ if(errno == ENOENT) {
+ verbose(1, "session file %s does not exist",
+ data->session_file);
+ return 0;
+ }
+ log_err("Could not read %s: %s", data->session_file,
+ strerror(errno));
+ return 0;
+ }
+ session = PEM_read_bio_SSL_SESSION(f, NULL, 0, NULL);
+ if(session == NULL) {
+ log_crypto_err("Could not read session file with PEM_read_bio_SSL_SESSION");
+ BIO_free(f);
+ return 0;
+ }
+ BIO_free(f);
+ if(!SSL_set_session(data->ssl, session)) {
+ log_crypto_err("Could not SSL_set_session");
+ SSL_SESSION_free(session);
+ return 0;
+ }
+ if(SSL_SESSION_get_max_early_data(session) == 0) {
+ log_err("TLS session early data is 0");
+ SSL_SESSION_free(session);
+ return 0;
+ }
+ SSL_set_quic_early_data_enabled(data->ssl, 1);
+ SSL_SESSION_free(session);
+ return 1;
+}
+
+#ifndef HAVE_NGTCP2_CONN_ENCODE_0RTT_TRANSPORT_PARAMS
+/** parse one line from the transport file */
+static int
+transport_parse_line(struct ngtcp2_transport_params* params, char* line)
+{
+ if(strncmp(line, "initial_max_streams_bidi=", 25) == 0) {
+ params->initial_max_streams_bidi = atoi(line+25);
+ return 1;
+ }
+ if(strncmp(line, "initial_max_streams_uni=", 24) == 0) {
+ params->initial_max_streams_uni = atoi(line+24);
+ return 1;
+ }
+ if(strncmp(line, "initial_max_stream_data_bidi_local=", 35) == 0) {
+ params->initial_max_stream_data_bidi_local = atoi(line+35);
+ return 1;
+ }
+ if(strncmp(line, "initial_max_stream_data_bidi_remote=", 36) == 0) {
+ params->initial_max_stream_data_bidi_remote = atoi(line+36);
+ return 1;
+ }
+ if(strncmp(line, "initial_max_stream_data_uni=", 28) == 0) {
+ params->initial_max_stream_data_uni = atoi(line+28);
+ return 1;
+ }
+ if(strncmp(line, "initial_max_data=", 17) == 0) {
+ params->initial_max_data = atoi(line+17);
+ return 1;
+ }
+ if(strncmp(line, "active_connection_id_limit=", 27) == 0) {
+ params->active_connection_id_limit = atoi(line+27);
+ return 1;
+ }
+ if(strncmp(line, "max_datagram_frame_size=", 24) == 0) {
+ params->max_datagram_frame_size = atoi(line+24);
+ return 1;
+ }
+ return 0;
+}
+#endif /* HAVE_NGTCP2_CONN_ENCODE_0RTT_TRANSPORT_PARAMS */
+
+/** setup the early data transport file and read it */
+static int
+early_data_setup_transport(struct doq_client_data* data)
+{
+#ifdef HAVE_NGTCP2_CONN_ENCODE_0RTT_TRANSPORT_PARAMS
+ FILE* in;
+ uint8_t buf[1024];
+ size_t len;
+ int rv;
+ in = fopen(data->transport_file, "r");
+ if(!in) {
+ if(errno == ENOENT) {
+ verbose(1, "transport file %s does not exist",
+ data->transport_file);
+ return 0;
+ }
+ perror(data->transport_file);
+ return 0;
+ }
+ len = fread(buf, 1, sizeof(buf), in);
+ if(ferror(in)) {
+ log_err("%s: read failed: %s", data->transport_file,
+ strerror(errno));
+ fclose(in);
+ return 0;
+ }
+ fclose(in);
+ rv = ngtcp2_conn_decode_and_set_0rtt_transport_params(data->conn,
+ buf, len);
+ if(rv != 0) {
+ log_err("ngtcp2_conn_decode_and_set_0rtt_transport_params failed: %s",
+ ngtcp2_strerror(rv));
+ return 0;
+ }
+ return 1;
+#else
+ FILE* in;
+ char buf[1024];
+ struct ngtcp2_transport_params params;
+ memset(&params, 0, sizeof(params));
+ in = fopen(data->transport_file, "r");
+ if(!in) {
+ if(errno == ENOENT) {
+ verbose(1, "transport file %s does not exist",
+ data->transport_file);
+ return 0;
+ }
+ perror(data->transport_file);
+ return 0;
+ }
+ while(!feof(in)) {
+ if(!fgets(buf, sizeof(buf), in)) {
+ log_err("%s: read failed: %s", data->transport_file,
+ strerror(errno));
+ fclose(in);
+ return 0;
+ }
+ if(!transport_parse_line(&params, buf)) {
+ log_err("%s: could not parse line '%s'",
+ data->transport_file, buf);
+ fclose(in);
+ return 0;
+ }
+ }
+ fclose(in);
+ ngtcp2_conn_set_early_remote_transport_params(data->conn, &params);
+#endif
+ return 1;
+}
+
+/** setup for early data, read the transport file and session file */
+static void
+early_data_setup(struct doq_client_data* data)
+{
+ if(!early_data_setup_session(data)) {
+ verbose(1, "TLS session resumption failed, early data is disabled");
+ data->early_data_enabled = 0;
+ return;
+ }
+ if(!early_data_setup_transport(data)) {
+ verbose(1, "Transport parameters set failed, early data is disabled");
+ data->early_data_enabled = 0;
+ return;
+ }
+}
+
+/** start the early data transmission */
+static void
+early_data_start(struct doq_client_data* data)
+{
+ query_streams_start(data);
+ on_write(data);
+}
+
+/** create doq_client_data */
+static struct doq_client_data*
+create_doq_client_data(const char* svr, int port, struct ub_event_base* base,
+ const char* transport_file, const char* session_file, int quiet)
+{
+ struct doq_client_data* data;
+ data = calloc(1, sizeof(*data));
+ if(!data) fatal_exit("calloc failed: out of memory");
+ data->base = base;
+ data->rnd = ub_initstate(NULL);
+ if(!data->rnd) fatal_exit("ub_initstate failed: out of memory");
+ data->svr = svr;
+ get_dest_addr(data, svr, port);
+ data->port = port;
+ data->quiet = quiet;
+ data->pkt_buf = sldns_buffer_new(65552);
+ if(!data->pkt_buf)
+ fatal_exit("sldns_buffer_new failed: out of memory");
+ data->blocked_pkt = sldns_buffer_new(65552);
+ if(!data->blocked_pkt)
+ fatal_exit("sldns_buffer_new failed: out of memory");
+ data->fd = open_svr_udp(data);
+ get_local_addr(data);
+ data->conn = conn_client_setup(data);
+#ifdef HAVE_NGTCP2_CCERR_DEFAULT
+ ngtcp2_ccerr_default(&data->ccerr);
+#else
+ ngtcp2_connection_close_error_default(&data->last_error);
+#endif
+ data->transport_file = transport_file;
+ data->session_file = session_file;
+ if(data->transport_file && data->session_file)
+ data->early_data_enabled = 1;
+
+ generate_static_secret(data, 32);
+ data->ctx = ctx_client_setup();
+ if(data->session_file) {
+ SSL_CTX_set_session_cache_mode(data->ctx,
+ SSL_SESS_CACHE_CLIENT |
+ SSL_SESS_CACHE_NO_INTERNAL_STORE);
+ SSL_CTX_sess_set_new_cb(data->ctx, new_session_cb);
+ }
+ data->ssl = ssl_client_setup(data);
+ ngtcp2_conn_set_tls_native_handle(data->conn, data->ssl);
+ if(data->early_data_enabled)
+ early_data_setup(data);
+
+ data->ev = ub_event_new(base, data->fd, UB_EV_READ | UB_EV_WRITE |
+ UB_EV_PERSIST, doq_client_event_cb, data);
+ if(!data->ev) {
+ fatal_exit("could not ub_event_new");
+ }
+ if(ub_event_add(data->ev, NULL) != 0) {
+ fatal_exit("could not ub_event_add");
+ }
+ data->expire_timer = ub_event_new(data->base, -1,
+ UB_EV_TIMEOUT, &doq_client_timer_cb, data);
+ if(!data->expire_timer)
+ fatal_exit("could not ub_event_new");
+ data->query_list_start = stream_list_create();
+ data->query_list_send = stream_list_create();
+ data->query_list_receive = stream_list_create();
+ data->query_list_stop = stream_list_create();
+ return data;
+}
+
+/** delete doq_client_data */
+static void
+delete_doq_client_data(struct doq_client_data* data)
+{
+ if(!data)
+ return;
+#if defined(NGTCP2_USE_GENERIC_SOCKADDR) || defined(NGTCP2_USE_GENERIC_IPV6_SOCKADDR)
+ if(data->conn && data->dest_addr_len != 0) {
+ if(addr_is_ip6(&data->dest_addr, data->dest_addr_len)) {
+# if defined(NGTCP2_USE_GENERIC_SOCKADDR) || defined(NGTCP2_USE_GENERIC_IPV6_SOCKADDR)
+ const struct ngtcp2_path* path6 = ngtcp2_conn_get_path(data->conn);
+ free(path6->local.addr);
+ free(path6->remote.addr);
+# endif
+ } else {
+# if defined(NGTCP2_USE_GENERIC_SOCKADDR)
+ const struct ngtcp2_path* path = ngtcp2_conn_get_path(data->conn);
+ free(path->local.addr);
+ free(path->remote.addr);
+# endif
+ }
+ }
+#endif
+ ngtcp2_conn_del(data->conn);
+ SSL_free(data->ssl);
+ sldns_buffer_free(data->pkt_buf);
+ sldns_buffer_free(data->blocked_pkt);
+ if(data->fd != -1)
+ sock_close(data->fd);
+ SSL_CTX_free(data->ctx);
+ stream_list_free(data->query_list_start);
+ stream_list_free(data->query_list_send);
+ stream_list_free(data->query_list_receive);
+ stream_list_free(data->query_list_stop);
+ ub_randfree(data->rnd);
+ if(data->ev) {
+ ub_event_del(data->ev);
+ ub_event_free(data->ev);
+ }
+ if(data->expire_timer_added)
+ ub_timer_del(data->expire_timer);
+ ub_event_free(data->expire_timer);
+ free(data->static_secret_data);
+ free(data);
+}
+
+/** create the event base that registers events and timers */
+static struct ub_event_base*
+create_event_base(time_t* secs, struct timeval* now)
+{
+ struct ub_event_base* base;
+ const char *evnm="event", *evsys="", *evmethod="";
+
+ memset(now, 0, sizeof(*now));
+ base = ub_default_event_base(1, secs, now);
+ if(!base) fatal_exit("could not create ub_event base");
+
+ ub_get_event_sys(base, &evnm, &evsys, &evmethod);
+ if(verbosity) log_info("%s %s uses %s method", evnm, evsys, evmethod);
+
+ return base;
+}
+
+/** enter a query into the query list */
+static void
+client_enter_query_buf(struct doq_client_data* data, struct sldns_buffer* buf)
+{
+ struct doq_client_stream* str;
+ str = client_stream_create(buf);
+ if(!str)
+ fatal_exit("client_stream_create failed: out of memory");
+ stream_list_append(data->query_list_start, str);
+}
+
+/** enter the queries into the query list */
+static void
+client_enter_queries(struct doq_client_data* data, char** qs, int count)
+{
+ int i;
+ for(i=0; i<count; i+=3) {
+ struct sldns_buffer* buf = NULL;
+ buf = make_query(qs[i], qs[i+1], qs[i+2]);
+ if(verbosity > 0) {
+ char* str;
+ log_buf(1, "send query", buf);
+ str = sldns_wire2str_pkt(sldns_buffer_begin(buf),
+ sldns_buffer_limit(buf));
+ if(!str) verbose(1, "could not sldns_wire2str_pkt");
+ else verbose(1, "send query:\n%s", str);
+ free(str);
+ }
+ client_enter_query_buf(data, buf);
+ sldns_buffer_free(buf);
+ }
+}
+
+/** run the dohclient queries */
+static void run(const char* svr, int port, char** qs, int count,
+ const char* transport_file, const char* session_file, int quiet)
+{
+ time_t secs = 0;
+ struct timeval now;
+ struct ub_event_base* base;
+ struct doq_client_data* data;
+
+ /* setup */
+ base = create_event_base(&secs, &now);
+ data = create_doq_client_data(svr, port, base, transport_file,
+ session_file, quiet);
+ client_enter_queries(data, qs, count);
+ if(data->early_data_enabled)
+ early_data_start(data);
+
+ /* run the queries */
+ ub_event_base_dispatch(base);
+
+ /* cleanup */
+ delete_doq_client_data(data);
+ ub_event_base_free(base);
+}
+#endif /* HAVE_NGTCP2 */
+
+#ifdef HAVE_NGTCP2
+/** getopt global, in case header files fail to declare it. */
+extern int optind;
+/** getopt global, in case header files fail to declare it. */
+extern char* optarg;
+int main(int ATTR_UNUSED(argc), char** ATTR_UNUSED(argv))
+{
+ int c;
+ int port = UNBOUND_DNS_OVER_QUIC_PORT, quiet = 0;
+ const char* svr = "127.0.0.1", *transport_file = NULL,
+ *session_file = NULL;
+#ifdef USE_WINSOCK
+ WSADATA wsa_data;
+ if(WSAStartup(MAKEWORD(2,2), &wsa_data) != 0) {
+ printf("WSAStartup failed\n");
+ return 1;
+ }
+#endif
+ checklock_set_output_name("ublocktrace-doqclient");
+ checklock_start();
+ log_init(0, 0, 0);
+ log_ident_set("doqclient");
+
+ while((c=getopt(argc, argv, "hp:qs:vx:y:")) != -1) {
+ switch(c) {
+ case 'p':
+ if(atoi(optarg)==0 && strcmp(optarg,"0")!=0) {
+ printf("error parsing port, "
+ "number expected: %s\n", optarg);
+ return 1;
+ }
+ port = atoi(optarg);
+ break;
+ case 'q':
+ quiet++;
+ break;
+ case 's':
+ svr = optarg;
+ break;
+ case 'v':
+ verbosity++;
+ break;
+ case 'x':
+ transport_file = optarg;
+ break;
+ case 'y':
+ session_file = optarg;
+ break;
+ case 'h':
+ case '?':
+ default:
+ usage(argv);
+ }
+ }
+
+ argc -= optind;
+ argv += optind;
+
+ if(argc%3!=0) {
+ printf("Invalid input. Specify qname, qtype, and qclass.\n");
+ return 1;
+ }
+ if(port == 53) {
+ printf("Error: port number 53 not for DNS over QUIC. Port number 53 is not allowed to be used with DNS over QUIC. It is used for DNS datagrams.\n");
+ return 1;
+ }
+
+ run(svr, port, argv, argc, transport_file, session_file, quiet);
+
+ checklock_stop();
+#ifdef USE_WINSOCK
+ WSACleanup();
+#endif
+ return 0;
+}
+#else /* HAVE_NGTCP2 */
+int main(int ATTR_UNUSED(argc), char** ATTR_UNUSED(argv))
+{
+ printf("Compiled without ngtcp2 for QUIC, cannot run doqclient.\n");
+ return 1;
+}
+#endif /* HAVE_NGTCP2 */
+
+/***--- definitions to make fptr_wlist work. ---***/
+/* These are callbacks, similar to smallapp callbacks, except the debug
+ * tool callbacks are not in it */
+struct tube;
+struct query_info;
+#include "util/data/packed_rrset.h"
+#include "daemon/worker.h"
+#include "daemon/remote.h"
+#include "util/fptr_wlist.h"
+#include "libunbound/context.h"
+
+void worker_handle_control_cmd(struct tube* ATTR_UNUSED(tube),
+ uint8_t* ATTR_UNUSED(buffer), size_t ATTR_UNUSED(len),
+ int ATTR_UNUSED(error), void* ATTR_UNUSED(arg))
+{
+ log_assert(0);
+}
+
+int worker_handle_request(struct comm_point* ATTR_UNUSED(c),
+ void* ATTR_UNUSED(arg), int ATTR_UNUSED(error),
+ struct comm_reply* ATTR_UNUSED(repinfo))
+{
+ log_assert(0);
+ return 0;
+}
+
+int worker_handle_service_reply(struct comm_point* ATTR_UNUSED(c),
+ void* ATTR_UNUSED(arg), int ATTR_UNUSED(error),
+ struct comm_reply* ATTR_UNUSED(reply_info))
+{
+ log_assert(0);
+ return 0;
+}
+
+int remote_accept_callback(struct comm_point* ATTR_UNUSED(c),
+ void* ATTR_UNUSED(arg), int ATTR_UNUSED(error),
+ struct comm_reply* ATTR_UNUSED(repinfo))
+{
+ log_assert(0);
+ return 0;
+}
+
+int remote_control_callback(struct comm_point* ATTR_UNUSED(c),
+ void* ATTR_UNUSED(arg), int ATTR_UNUSED(error),
+ struct comm_reply* ATTR_UNUSED(repinfo))
+{
+ log_assert(0);
+ return 0;
+}
+
+void worker_sighandler(int ATTR_UNUSED(sig), void* ATTR_UNUSED(arg))
+{
+ log_assert(0);
+}
+
+struct outbound_entry* worker_send_query(
+ struct query_info* ATTR_UNUSED(qinfo), uint16_t ATTR_UNUSED(flags),
+ int ATTR_UNUSED(dnssec), int ATTR_UNUSED(want_dnssec),
+ int ATTR_UNUSED(nocaps), int ATTR_UNUSED(check_ratelimit),
+ struct sockaddr_storage* ATTR_UNUSED(addr),
+ socklen_t ATTR_UNUSED(addrlen), uint8_t* ATTR_UNUSED(zone),
+ size_t ATTR_UNUSED(zonelen), int ATTR_UNUSED(tcp_upstream),
+ int ATTR_UNUSED(ssl_upstream), char* ATTR_UNUSED(tls_auth_name),
+ struct module_qstate* ATTR_UNUSED(q), int* ATTR_UNUSED(was_ratelimited))
+{
+ log_assert(0);
+ return 0;
+}
+
+#ifdef UB_ON_WINDOWS
+void
+worker_win_stop_cb(int ATTR_UNUSED(fd), short ATTR_UNUSED(ev), void*
+ ATTR_UNUSED(arg)) {
+ log_assert(0);
+}
+
+void
+wsvc_cron_cb(void* ATTR_UNUSED(arg))
+{
+ log_assert(0);
+}
+#endif /* UB_ON_WINDOWS */
+
+void
+worker_alloc_cleanup(void* ATTR_UNUSED(arg))
+{
+ log_assert(0);
+}
+
+struct outbound_entry* libworker_send_query(
+ struct query_info* ATTR_UNUSED(qinfo), uint16_t ATTR_UNUSED(flags),
+ int ATTR_UNUSED(dnssec), int ATTR_UNUSED(want_dnssec),
+ int ATTR_UNUSED(nocaps), int ATTR_UNUSED(check_ratelimit),
+ struct sockaddr_storage* ATTR_UNUSED(addr),
+ socklen_t ATTR_UNUSED(addrlen), uint8_t* ATTR_UNUSED(zone),
+ size_t ATTR_UNUSED(zonelen), int ATTR_UNUSED(tcp_upstream),
+ int ATTR_UNUSED(ssl_upstream), char* ATTR_UNUSED(tls_auth_name),
+ struct module_qstate* ATTR_UNUSED(q), int* ATTR_UNUSED(was_ratelimited))
+{
+ log_assert(0);
+ return 0;
+}
+
+int libworker_handle_service_reply(struct comm_point* ATTR_UNUSED(c),
+ void* ATTR_UNUSED(arg), int ATTR_UNUSED(error),
+ struct comm_reply* ATTR_UNUSED(reply_info))
+{
+ log_assert(0);
+ return 0;
+}
+
+void libworker_handle_control_cmd(struct tube* ATTR_UNUSED(tube),
+ uint8_t* ATTR_UNUSED(buffer), size_t ATTR_UNUSED(len),
+ int ATTR_UNUSED(error), void* ATTR_UNUSED(arg))
+{
+ log_assert(0);
+}
+
+void libworker_fg_done_cb(void* ATTR_UNUSED(arg), int ATTR_UNUSED(rcode),
+ struct sldns_buffer* ATTR_UNUSED(buf), enum sec_status ATTR_UNUSED(s),
+ char* ATTR_UNUSED(why_bogus), int ATTR_UNUSED(was_ratelimited))
+{
+ log_assert(0);
+}
+
+void libworker_bg_done_cb(void* ATTR_UNUSED(arg), int ATTR_UNUSED(rcode),
+ struct sldns_buffer* ATTR_UNUSED(buf), enum sec_status ATTR_UNUSED(s),
+ char* ATTR_UNUSED(why_bogus), int ATTR_UNUSED(was_ratelimited))
+{
+ log_assert(0);
+}
+
+void libworker_event_done_cb(void* ATTR_UNUSED(arg), int ATTR_UNUSED(rcode),
+ struct sldns_buffer* ATTR_UNUSED(buf), enum sec_status ATTR_UNUSED(s),
+ char* ATTR_UNUSED(why_bogus), int ATTR_UNUSED(was_ratelimited))
+{
+ log_assert(0);
+}
+
+int context_query_cmp(const void* ATTR_UNUSED(a), const void* ATTR_UNUSED(b))
+{
+ log_assert(0);
+ return 0;
+}
+
+void worker_stat_timer_cb(void* ATTR_UNUSED(arg))
+{
+ log_assert(0);
+}
+
+void worker_probe_timer_cb(void* ATTR_UNUSED(arg))
+{
+ log_assert(0);
+}
+
+void worker_start_accept(void* ATTR_UNUSED(arg))
+{
+ log_assert(0);
+}
+
+void worker_stop_accept(void* ATTR_UNUSED(arg))
+{
+ log_assert(0);
+}
+
+/** keep track of lock id in lock-verify application */
+struct order_id {
+ /** the thread id that created it */
+ int thr;
+ /** the instance number of creation */
+ int instance;
+};
+
+int order_lock_cmp(const void* e1, const void* e2)
+{
+ const struct order_id* o1 = e1;
+ const struct order_id* o2 = e2;
+ if(o1->thr < o2->thr) return -1;
+ if(o1->thr > o2->thr) return 1;
+ if(o1->instance < o2->instance) return -1;
+ if(o1->instance > o2->instance) return 1;
+ return 0;
+}
+
+int
+codeline_cmp(const void* a, const void* b)
+{
+ return strcmp(a, b);
+}
+
+int replay_var_compare(const void* ATTR_UNUSED(a), const void* ATTR_UNUSED(b))
+{
+ log_assert(0);
+ return 0;
+}
+
+void remote_get_opt_ssl(char* ATTR_UNUSED(str), void* ATTR_UNUSED(arg))
+{
+ log_assert(0);
+}
+
+#ifdef USE_DNSTAP
+void dtio_tap_callback(int ATTR_UNUSED(fd), short ATTR_UNUSED(ev),
+ void* ATTR_UNUSED(arg))
+{
+ log_assert(0);
+}
+#endif
+
+#ifdef USE_DNSTAP
+void dtio_mainfdcallback(int ATTR_UNUSED(fd), short ATTR_UNUSED(ev),
+ void* ATTR_UNUSED(arg))
+{
+ log_assert(0);
+}
+#endif
diff --git a/testcode/fake_event.c b/testcode/fake_event.c
index a517fa5f373e..2f60b1381e11 100644
--- a/testcode/fake_event.c
+++ b/testcode/fake_event.c
@@ -939,6 +939,11 @@ listen_create(struct comm_base* base, struct listen_port* ATTR_UNUSED(ports),
int ATTR_UNUSED(http_notls),
struct tcl_list* ATTR_UNUSED(tcp_conn_limit),
void* ATTR_UNUSED(sslctx), struct dt_env* ATTR_UNUSED(dtenv),
+ struct doq_table* ATTR_UNUSED(table),
+ struct ub_randstate* ATTR_UNUSED(rnd),
+ const char* ATTR_UNUSED(ssl_service_key),
+ const char* ATTR_UNUSED(ssl_service_pem),
+ struct config_file* ATTR_UNUSED(cfg),
comm_point_callback_type* cb, void *cb_arg)
{
struct replay_runtime* runtime = (struct replay_runtime*)base;
diff --git a/testcode/perf.c b/testcode/perf.c
index 2be86c4bf597..0a4ff1726f6b 100644
--- a/testcode/perf.c
+++ b/testcode/perf.c
@@ -220,7 +220,7 @@ perfsetup(struct perfinfo* info)
#endif
signal(SIGTERM, perf_sigh) == SIG_ERR)
fatal_exit("could not bind to signal");
- info->io = (struct perfio*)calloc(sizeof(struct perfio), info->io_num);
+ info->io = (struct perfio*)calloc(info->io_num, sizeof(struct perfio));
if(!info->io) fatal_exit("out of memory");
#ifndef S_SPLINT_S
FD_ZERO(&info->rset);
@@ -501,8 +501,8 @@ qlist_grow_capacity(struct perfinfo* info)
{
size_t newcap = (size_t)((info->qlist_capacity==0)?16:
info->qlist_capacity*2);
- uint8_t** d = (uint8_t**)calloc(sizeof(uint8_t*), newcap);
- size_t* l = (size_t*)calloc(sizeof(size_t), newcap);
+ uint8_t** d = (uint8_t**)calloc(newcap, sizeof(uint8_t*));
+ size_t* l = (size_t*)calloc(newcap, sizeof(size_t));
if(!d || !l) fatal_exit("out of memory");
if(info->qlist_data && info->qlist_capacity)
memcpy(d, info->qlist_data, sizeof(uint8_t*)*
diff --git a/testcode/testbound.c b/testcode/testbound.c
index 123fe0d4e46f..442e23434eb4 100644
--- a/testcode/testbound.c
+++ b/testcode/testbound.c
@@ -502,7 +502,7 @@ struct listen_port* daemon_remote_open_ports(struct config_file*
struct daemon_remote* daemon_remote_create(struct config_file* ATTR_UNUSED(cfg))
{
- return (struct daemon_remote*)calloc(1,1);
+ return (struct daemon_remote*)calloc(1, sizeof(struct daemon_remote));
}
void daemon_remote_delete(struct daemon_remote* rc)
@@ -600,3 +600,52 @@ void listen_desetup_locks(void)
{
/* nothing */
}
+
+#ifdef HAVE_NGTCP2
+void comm_point_doq_callback(int ATTR_UNUSED(fd), short ATTR_UNUSED(event),
+ void* ATTR_UNUSED(arg))
+{
+ /* nothing */
+}
+
+int doq_conn_cmp(const void* ATTR_UNUSED(key1), const void* ATTR_UNUSED(key2))
+{
+ return 0;
+}
+
+int doq_conid_cmp(const void* ATTR_UNUSED(key1), const void* ATTR_UNUSED(key2))
+{
+ return 0;
+}
+
+int doq_timer_cmp(const void* ATTR_UNUSED(key1), const void* ATTR_UNUSED(key2))
+{
+ return 0;
+}
+
+int doq_stream_cmp(const void* ATTR_UNUSED(key1), const void* ATTR_UNUSED(key2))
+{
+ return 0;
+}
+
+struct doq_table* doq_table_create(struct config_file* ATTR_UNUSED(cfg),
+ struct ub_randstate* ATTR_UNUSED(rnd))
+{
+ return calloc(1, sizeof(struct doq_table));
+}
+
+void doq_table_delete(struct doq_table* table)
+{
+ free(table);
+}
+
+void doq_timer_cb(void* ATTR_UNUSED(arg))
+{
+ /* nothing */
+}
+
+size_t doq_table_quic_size_get(struct doq_table* ATTR_UNUSED(table))
+{
+ return 0;
+}
+#endif
diff --git a/testcode/unitdoq.c b/testcode/unitdoq.c
new file mode 100644
index 000000000000..2b9160970493
--- /dev/null
+++ b/testcode/unitdoq.c
@@ -0,0 +1,84 @@
+/*
+ * testcode/unitdoq.c - unit test for doq routines.
+ *
+ * Copyright (c) 2022, NLnet Labs. All rights reserved.
+ *
+ * This software is open source.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * Neither the name of the NLNET LABS nor the names of its contributors may
+ * be used to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+/**
+ * \file
+ * Calls doq related unit tests. Exits with code 1 on a failure.
+ */
+
+#include "config.h"
+
+#ifdef HAVE_NGTCP2
+
+#include "util/netevent.h"
+#include "services/listen_dnsport.h"
+#include "testcode/unitmain.h"
+
+/** check the size of a connection for doq */
+static void
+doq_size_conn_check()
+{
+ /* Printout the size of one doq connection, in memory usage.
+ * A connection with a couple cids, of type doq_conid, and
+ * it has one stream, and that has a query and an answer. */
+ size_t answer_size = 233; /* size of www.nlnetlabs.nl minimal answer
+ with dnssec and one A record. The unsigned answer is 176 with
+ additional data, 61 bytes minimal response one A record. */
+ size_t query_size = 45; /* size of query for www.nlnetlabs.nl, with
+ an EDNS record with DO flag. */
+ size_t conn_size = sizeof(struct doq_conn);
+ size_t conid_size = sizeof(struct doq_conid);
+ size_t stream_size = sizeof(struct doq_stream);
+
+ conn_size += 16; /* DCID len in the conn key */
+ conn_size += 0; /* the size of the ngtcp2_conn */
+ conn_size += 0; /* the size of the SSL record */
+ conn_size += 0; /* size of the close pkt,
+ but we do not count it here. Only if the conn gets closed. */
+ conid_size += 16; /* the dcid of the conn key */
+ conid_size += 16; /* the cid */
+ stream_size += query_size; /* size of in buffer */
+ stream_size += answer_size; /* size of out buffer */
+ printf("doq connection size %u bytes\n", (unsigned)(conn_size +
+ conid_size*3 + stream_size));
+}
+
+void doq_test(void)
+{
+ unit_show_feature("doq");
+ doq_size_conn_check();
+}
+#endif /* HAVE_NGTCP2 */
diff --git a/testcode/unitmain.c b/testcode/unitmain.c
index 084c12b93b4f..653d3efbe904 100644
--- a/testcode/unitmain.c
+++ b/testcode/unitmain.c
@@ -1232,7 +1232,7 @@ static void edns_ede_answer_encode_test(void)
unit_assert(region);
rep = construct_reply_info_base(region,
LDNS_RCODE_NOERROR | BIT_QR, 1,
- 3600, 3600, 3600,
+ 3600, 3600, 3600, 0,
0, 0, 0, 0,
sec_status_unchecked, LDNS_EDE_NONE);
unit_assert(rep);
@@ -1432,6 +1432,9 @@ main(int argc, char* argv[])
#ifdef CLIENT_SUBNET
ecs_test();
#endif /* CLIENT_SUBNET */
+#ifdef HAVE_NGTCP2
+ doq_test();
+#endif /* HAVE_NGTCP2 */
if(log_get_lock()) {
lock_basic_destroy((lock_basic_type*)log_get_lock());
}
diff --git a/testcode/unitmain.h b/testcode/unitmain.h
index adcd74f77b52..99d5240d2217 100644
--- a/testcode/unitmain.h
+++ b/testcode/unitmain.h
@@ -84,5 +84,7 @@ void authzone_test(void);
void zonemd_test(void);
/** unit test for tcp_reuse functions */
void tcpreuse_test(void);
+/** unit test for doq functions */
+void doq_test(void);
#endif /* TESTCODE_UNITMAIN_H */
diff --git a/testcode/unitzonemd.c b/testcode/unitzonemd.c
index bf130df5a25b..a8a168e33fe8 100644
--- a/testcode/unitzonemd.c
+++ b/testcode/unitzonemd.c
@@ -108,7 +108,7 @@ static void zonemd_generate_test(const char* zname, char* zfile,
digestdup = strdup(digest);
unit_assert(digestdup);
for(i=0; i<strlen(digestdup); i++) {
- digestdup[i] = toupper(digestdup[i]);
+ digestdup[i] = toupper((unsigned char)digestdup[i]);
}
if(verbosity >= VERB_ALGO) {
char zname[255+1];
@@ -165,9 +165,10 @@ static void zonemd_generate_tests(void)
1, 1, "1291b78ddf7669b1a39d014d87626b709b55774c5d7d58fadc556439889a10eaf6f11d615900a4f996bd46279514e473");
/* https://tools.ietf.org/html/draft-ietf-dnsop-dns-zone-digest-12
- * from section A.5 */
+ * from section A.5.
+ * Adjusted with renumbered B.root. */
zonemd_generate_test("root-servers.net", SRCDIRSTR "/testdata/zonemd.example_a5.zone",
- 1, 1, "f1ca0ccd91bd5573d9f431c00ee0101b2545c97602be0a978a3b11dbfc1c776d5b3e86ae3d973d6b5349ba7f04340f79");
+ 1, 1, "5a9521d88984ee123d9626191e2a327a43a16fd4339dd4ecc13d8672d5bae527d066d33645e35778677800005247d199");
}
/** test the zonemd check routine */
diff --git a/testdata/auth_tls.tdir/auth_tls.dsc b/testdata/auth_tls.tdir/auth_tls.dsc
new file mode 100644
index 000000000000..0caf949e88e4
--- /dev/null
+++ b/testdata/auth_tls.tdir/auth_tls.dsc
@@ -0,0 +1,16 @@
+BaseName: auth_tls
+Version: 1.0
+Description: Perform AXFR over tls for authority zone
+CreationDate: Thu 29 Aug 09:35:40 CEST 2024
+Maintainer: dr. W.C.A. Wijngaards
+Category:
+Component:
+CmdDepends:
+Depends:
+Help:
+Pre: auth_tls.pre
+Post: auth_tls.post
+Test: auth_tls.test
+AuxFiles:
+Passed:
+Failure:
diff --git a/testdata/auth_tls.tdir/auth_tls.nsd.conf b/testdata/auth_tls.tdir/auth_tls.nsd.conf
new file mode 100644
index 000000000000..c20ed21dfe29
--- /dev/null
+++ b/testdata/auth_tls.tdir/auth_tls.nsd.conf
@@ -0,0 +1,21 @@
+server:
+ logfile: "/dev/stderr"
+ xfrdfile: xfrd.state
+ username: ""
+ chroot: ""
+ zonesdir: ""
+ pidfile: "nsd.pid"
+ zonelistfile: "zone.list"
+ verbosity: 5
+ port: @NSD_PORT@
+ interface: 127.0.0.1@@NSD_PORT@
+
+ tls-port: @NSD_PORT@
+ tls-service-key: "nsd_server.key"
+ tls-service-pem: "nsd_server.pem"
+
+zone:
+ name: "example.com"
+ zonefile: "example.com.zone"
+ provide-xfr: 0.0.0.0/0 NOKEY
+ provide-xfr: ::0/0 NOKEY
diff --git a/testdata/auth_tls.tdir/auth_tls.post b/testdata/auth_tls.tdir/auth_tls.post
new file mode 100644
index 000000000000..19de9f46f9e2
--- /dev/null
+++ b/testdata/auth_tls.tdir/auth_tls.post
@@ -0,0 +1,14 @@
+# #-- auth_tls.post --#
+# source the master var file when it's there
+[ -f ../.tpkg.var.master ] && source ../.tpkg.var.master
+# source the test var file when it's there
+[ -f .tpkg.var.test ] && source .tpkg.var.test
+#
+# do your teardown here
+. ../common.sh
+kill_pid $NSD_PID
+kill_pid $UNBOUND_PID
+echo "nsd.log"
+cat nsd.log
+echo "unbound.log"
+cat unbound.log
diff --git a/testdata/auth_tls.tdir/auth_tls.pre b/testdata/auth_tls.tdir/auth_tls.pre
new file mode 100644
index 000000000000..ebeee24c5658
--- /dev/null
+++ b/testdata/auth_tls.tdir/auth_tls.pre
@@ -0,0 +1,47 @@
+# #-- auth_tls.pre--#
+# source the master var file when it's there
+[ -f ../.tpkg.var.master ] && source ../.tpkg.var.master
+# use .tpkg.var.test for in test variable passing
+[ -f .tpkg.var.test ] && source .tpkg.var.test
+
+. ../common.sh
+PRE="../.."
+if test -n "$NSD"; then
+ :
+else
+ if `which nsd >/dev/null 2>&1`; then
+ # need nsd >= 4.2.0
+ NSD="nsd"
+ else
+ if test -f $PRE/../nsd/nsd; then
+ NSD="$PRE/../nsd/nsd"
+ else
+ skip_test "need nsd"
+ fi
+ fi
+fi
+echo "NSD=$NSD"
+
+get_random_port 2
+UNBOUND_PORT=$RND_PORT
+NSD_PORT=$(($RND_PORT + 1))
+echo "UNBOUND_PORT=$UNBOUND_PORT" >> .tpkg.var.test
+echo "NSD_PORT=$NSD_PORT" >> .tpkg.var.test
+
+# make config file
+sed -e 's/@UNBOUND_PORT\@/'$UNBOUND_PORT'/' -e 's/@NSD_PORT\@/'$NSD_PORT'/' < auth_tls.ub.conf > ub.conf
+sed -e 's/@UNBOUND_PORT\@/'$UNBOUND_PORT'/' -e 's/@NSD_PORT\@/'$NSD_PORT'/' < auth_tls.nsd.conf > nsd.conf
+
+# start nsd
+$NSD -d -c nsd.conf >nsd.log 2>&1 &
+NSD_PID=$!
+echo "NSD_PID=$NSD_PID" >> .tpkg.var.test
+
+# start unbound in the background
+$PRE/unbound -d -c ub.conf >unbound.log 2>&1 &
+UNBOUND_PID=$!
+echo "UNBOUND_PID=$UNBOUND_PID" >> .tpkg.var.test
+
+cat .tpkg.var.test
+wait_nsd_up nsd.log
+wait_unbound_up unbound.log
diff --git a/testdata/auth_tls.tdir/auth_tls.test b/testdata/auth_tls.tdir/auth_tls.test
new file mode 100644
index 000000000000..030212f52850
--- /dev/null
+++ b/testdata/auth_tls.tdir/auth_tls.test
@@ -0,0 +1,48 @@
+# #-- auth_tls.test --#
+# source the master var file when it's there
+[ -f ../.tpkg.var.master ] && source ../.tpkg.var.master
+# use .tpkg.var.test for in test variable passing
+[ -f .tpkg.var.test ] && source .tpkg.var.test
+
+PRE="../.."
+# do the test
+echo "> dig www.example.com."
+dig @127.0.0.1 -p $UNBOUND_PORT www.example.com. | tee outfile
+if grep SERVFAIL outfile; then
+ echo "> try again"
+ dig @127.0.0.1 -p $UNBOUND_PORT www.example.com. | tee outfile
+fi
+if grep SERVFAIL outfile; then
+ echo "> try again"
+ sleep 1
+ dig @127.0.0.1 -p $UNBOUND_PORT www.example.com. | tee outfile
+fi
+if grep SERVFAIL outfile; then
+ echo "> try again"
+ sleep 1
+ dig @127.0.0.1 -p $UNBOUND_PORT www.example.com. | tee outfile
+fi
+if grep SERVFAIL outfile; then
+ echo "> try again"
+ sleep 1
+ dig @127.0.0.1 -p $UNBOUND_PORT www.example.com. | tee outfile
+fi
+if grep SERVFAIL outfile; then
+ echo "> try again"
+ sleep 10
+ dig @127.0.0.1 -p $UNBOUND_PORT www.example.com. | tee outfile
+fi
+if grep SERVFAIL outfile; then
+ echo "> try again"
+ sleep 10
+ dig @127.0.0.1 -p $UNBOUND_PORT www.example.com. | tee outfile
+fi
+echo "> check answer"
+if grep "1.2.3.4" outfile; then
+ echo "OK"
+else
+ echo "Not OK"
+ exit 1
+fi
+
+exit 0
diff --git a/testdata/auth_tls.tdir/auth_tls.ub.conf b/testdata/auth_tls.tdir/auth_tls.ub.conf
new file mode 100644
index 000000000000..0220c60af58c
--- /dev/null
+++ b/testdata/auth_tls.tdir/auth_tls.ub.conf
@@ -0,0 +1,22 @@
+server:
+ verbosity: 7
+ # num-threads: 1
+ interface: 127.0.0.1
+ port: @UNBOUND_PORT@
+ use-syslog: no
+ directory: ""
+ pidfile: "unbound.pid"
+ chroot: ""
+ username: ""
+ do-not-query-localhost: no
+ tls-service-key: "unbound_server.key"
+ tls-service-pem: "unbound_server.pem"
+ tls-cert-bundle: "nsd_server.pem"
+
+auth-zone:
+ name: "example.com"
+ for-upstream: yes
+ for-downstream: yes
+ primary: "127.0.0.1@@NSD_PORT@#nsd"
+ allow-notify: "127.0.0.2@@NSD_PORT@"
+ allow-notify: 127.0.0.1
diff --git a/testdata/auth_tls.tdir/example.com.zone b/testdata/auth_tls.tdir/example.com.zone
new file mode 100644
index 000000000000..18b5b407eedd
--- /dev/null
+++ b/testdata/auth_tls.tdir/example.com.zone
@@ -0,0 +1,4 @@
+example.com. 240 IN SOA ns.nlnetlabs.nl. hostmaster.nlnetlabs.nl. 2024082400 28800 7200 604800 240
+example.com. NS ns.example.com.
+ns.example.com. IN A 192.0.2.1
+www.example.com. A 1.2.3.4
diff --git a/testdata/auth_tls.tdir/nsd_server.key b/testdata/auth_tls.tdir/nsd_server.key
new file mode 100644
index 000000000000..5d9f6103134e
--- /dev/null
+++ b/testdata/auth_tls.tdir/nsd_server.key
@@ -0,0 +1,39 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIG5QIBAAKCAYEAxLy5fFUI1OjXXbPcQ13303/K5AliTq6bCnS57edzQIbmPZj7
+XbGZ0RnU47cZ11GSAI9ptDIrSidNTsHzaqWZn431/IVjwrIkRgz95/aOWRov4fwm
+cS5qvbYV60l384NZLqmF4BDDxSt2MLT2+jWxFEK2iUm2YXZewifQ8zaHmjfAWlo8
+TlK5jzt0Qc0qPv5nCC6mwtjb7OHul3N3QolW6hZOc1KZVEeBdELedoU9TyMyzhPB
+vkqAXWoti/CwWj3YMTj/L7zNfQ9F1HW6n67Y+ltO8IadILPiZiiAVIrLqUh3EL2X
+fq+BcJ3QvADjyL9F5TH3AaWoi6iYgMGcgdqK9k6hj+ziuMxX6OsgzfzxTEzZCHhP
+Er39SX6j/fHzJP4aGQxAAHLAmv2p9P/oEZeZsvWPsBWYpULKgMZ0JDZhf26ddrB1
+mpTaqRQsG384dUZR9f/iyzTszwgc2PQ7JG6gVg723KoBhlD0g+DlC8XdxiRyaDbJ
+PXzSoXgLWumx02OhAgMBAAECggGBAMS7MARriBRX7hzuYaEgE1V0oe+cjqi9o542
+EUMcQjzRaOVJ2HrdwUG+wgsgKwAMuqJCxuIBlRZm7MCH5CDODivmKohk3thviSRf
+k3tlKv1g2Wby3YIqd2TT82FAK2nf+8tUi+H/AbVl+59DJwIXtMbc22m3w1/8nU8r
+v5+l9L27aGcxesKbqKDZRC0Uu10YyvD8rZeEgY+EcjESrrxjV/1nZvWdMGR9yK74
+uzrri95aBVDbos7l8yz2oysf+UmUMp5U9rWwuU4M/34pFSGeo7CHjtliwbBF4FHn
+uyompXaOr7Qrgeg4fc9NbZNaB4OAOV2d1sI202q6j3kEkhG4pD8LAG/RRnugCj7D
+PKGJL3iZKxknjA+tAKkgq50EbMpLHHv1qSiKWy8p+bR5FyBYPSheOSkOKTywpqnd
+OU+VDTi4iLDvkENt6E0TghSyhncl8yIcomYPktqepaNekCHquK5sX8NUhOzRe3WH
+gX7l3e/o8JRvbwXJ8UWfQlKhPO/hvQKBwQDiLXVMf+Hjl/OoXHtF6huerNBux5CS
+KYha5BLARs9W74kd9mTJ9F5IflenpzQJc1b/PnvvlcDDlniUvlgk463EA2th4qWp
+50jFniq/l4rUMFk1vZBXldvuUaL6f+Ihi8WmoUAyguEVAB9G/EJ1bXqHKdJtxuz+
+/TXGBsXrF5+sZOTjfq96CgQtBmbPXMncPto0NndoMqcEB0bjsFywQXGCk6ZZZ3Ac
+vwnZFqVwqro3aTwD+xllzVz+xBNK8GU+zW8CgcEA3q2EepAT7dlZAveC7VSLnFF/
+w86ziynGEuhoJly+zedDPkFIGxYje1SPaKhpMH2jOdCajyHPOGuWEeVfKMbzCrHP
+GdFyiTQDk3Pq0JRXpUUJSPGPusAQnPruE68XccDb+eBiJR6y+0vXHd1J3F8B4BMQ
+AloZZtlx9BkEZaaRjROxM7Ilbev4IjOcScTREb2GL8gU3vnI2FJjBMy6fI5cm4QK
+XEgiLcxGniM77bAZTeoVFbpd4SSICDXVn/NM/XfvAoHBAMHbjKphAc/9MY6gldg6
+7Cl4nb4VtshQaNremWPMTXKKJNBVm9WtahJgl+jO2z8uaOalO70CchIyKm/zJcGY
+lBtpguSHSs7xueIHy0QkM43jUtNJAyrO+46s0jA65Cs0jdhgZZHls944GJbTKHNV
+vquTIRWOZxu3FBwDOihiOy2b3MNQlj7XzvR4hC4/rZTlGkmeVYItyBEf25bUVt2L
+eisdOntuuR0qcNptGqgS7UEJJbOTyRUEjCyhCpg0q9LEaQKBwDF7N1wQ1gzdZlUt
+cO+SAO/8gDqfnPAImVYsRLB5nYCdqiiUUxSJx9qpALEN80nuMS4wt5ekuKpd5dwW
+Lx4dj3ZJ6q5fB2eLolvKv1wYCp3UCGsoGnsyIL7xV6QSHVCOvZL6FHURLE6BHM0r
+FjWc+wqy0bTkFo7vNM48HOkFqYRC4vaM2JpjfCEFfO47iQW7Kq1FdbXSpZnEPPKd
+F7eD3vpDzhWRhd7NbMfJJpD7t7PDl2nbnu7fska4x76iTvJoCwKBwQCcqj2yhl69
+1GfpzsOtfzh9rECrnKjAhmVbwRfKB1ivwe8G2tobgQjOUajBqkCYKpZgTy3wyhWn
+0D4AdwonGu1XYLZWX+Hw/ZWhNEg/6Ju2wfiMJfFWmy5pvTSvmOlNWvYKwmH/TDjX
+tEctSVj6D67xE5v6s3donTI0NFa1u7i1hwoGu4POCockbau52YN4n20R5K7enu2+
+YYpXfcUOmCi91Hpv+X1YbmY1tOo0m1ItYqupbuRFXnHVXJhKxsYXqlA=
+-----END RSA PRIVATE KEY-----
diff --git a/testdata/auth_tls.tdir/nsd_server.pem b/testdata/auth_tls.tdir/nsd_server.pem
new file mode 100644
index 000000000000..5d41ad2d6477
--- /dev/null
+++ b/testdata/auth_tls.tdir/nsd_server.pem
@@ -0,0 +1,22 @@
+-----BEGIN CERTIFICATE-----
+MIIDozCCAgsCFCAZislHgIerlrBBkLFt/ZOkKYVZMA0GCSqGSIb3DQEBCwUAMA4x
+DDAKBgNVBAMMA25zZDAeFw0xOTA0MjUxNTEzMjdaFw0yOTA0MjIxNTEzMjdaMA4x
+DDAKBgNVBAMMA25zZDCCAaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBAMS8
+uXxVCNTo112z3ENd99N/yuQJYk6umwp0ue3nc0CG5j2Y+12xmdEZ1OO3GddRkgCP
+abQyK0onTU7B82qlmZ+N9fyFY8KyJEYM/ef2jlkaL+H8JnEuar22FetJd/ODWS6p
+heAQw8UrdjC09vo1sRRCtolJtmF2XsIn0PM2h5o3wFpaPE5SuY87dEHNKj7+Zwgu
+psLY2+zh7pdzd0KJVuoWTnNSmVRHgXRC3naFPU8jMs4Twb5KgF1qLYvwsFo92DE4
+/y+8zX0PRdR1up+u2PpbTvCGnSCz4mYogFSKy6lIdxC9l36vgXCd0LwA48i/ReUx
+9wGlqIuomIDBnIHaivZOoY/s4rjMV+jrIM388UxM2Qh4TxK9/Ul+o/3x8yT+GhkM
+QABywJr9qfT/6BGXmbL1j7AVmKVCyoDGdCQ2YX9unXawdZqU2qkULBt/OHVGUfX/
+4ss07M8IHNj0OyRuoFYO9tyqAYZQ9IPg5QvF3cYkcmg2yT180qF4C1rpsdNjoQID
+AQABMA0GCSqGSIb3DQEBCwUAA4IBgQB+WGMopDqNkv7yDAO8Ik2EWieDqxTshqR4
+bT1do9zsC9WDrIVxoVcn+dtlIpEQl8MN9U5DTKBbRgk3grOwUsg2kC0Gujv3vAyQ
+bF+jxjHWd1xzrbQ+QUgz07P1OMFWxMzECL2L2078UZbawFqKqlmNv5avUk27G8nB
+GrujT/pUOIpRXC+rao8e14R84dPJLZuGm9IAeEBQIIdhY9sjFRyoQdCUubyKPpkm
+/fpcDMkt7PzZ4nTovj4NUxnnoUGonpXuj0pHA/RDDJkPYaRrND4OGldQXdZ9LJNM
+pROL6aCZ5iog74OY8yutVzCgGge9vZLkysceVP7Lyks9/fEAtIuozmulp9TUQAeR
+MVdDOcREWRd0vFNtAC9xSloRqV+66CzrFHwkSMpLo+gdgcAZ8s33rgQk+I4gfavU
+jPWMZVcZHXevtWuTRnxfOpMkbwiRyr2J8m549K7OKZgr+JRhdJTev4lvXVyfFia4
+zr6UOK4exZWP6VDXb4IyZbJh+LMjmws=
+-----END CERTIFICATE-----
diff --git a/testdata/auth_tls.tdir/unbound_server.key b/testdata/auth_tls.tdir/unbound_server.key
new file mode 100644
index 000000000000..370a7bbb2f22
--- /dev/null
+++ b/testdata/auth_tls.tdir/unbound_server.key
@@ -0,0 +1,39 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIG5AIBAAKCAYEAvjSVSN2QMXudpzukdLCqgg/IOhCX8KYkD0FFFfWcQjgKq5wI
+0x41iG32a6wbGanre4IX7VxaSPu9kkHfnGgynCk5nwDRedE/FLFhAU78PoT0+Nqq
+GRS7XVQ24vLmIz9Hqc2Ozx1um1BXBTmIT0UfN2e22I0LWQ6a3seZlEDRj45gnk7Z
+uh9MDgotaBdm+v1JAbupSf6Zis4VEH3JNdvVGE3O1DHEIeuuz/3BDhpf6WBDH+8K
+WaBe1ca4TZHr9ThL2gEMEfAQl0wXDwRWRoi3NjNMH+mw0L1rjwThI5GXqNIee7o5
+FzUReSXZuTdFMyGe3Owcx+XoYnwi6cplSNoGsDBu4B9bKKglR9YleJVw4L4Xi8xP
+q6O9UPj4+nypHk/DOoC7DIM3ufN0yxPBsFo5TVowxfhdjZXJbbftd2TZv7AH8+XL
+A5UoZgRzXgzECelXSCTBFlMTnT48LfA9pMLydyjAz2UdPHs5Iv+TK5nnI+aJoeaP
+7kFZSngxdy1+A/bNAgMBAAECggGBALpTOIqQwVg4CFBylL/a8K1IWJTI/I65sklf
+XxYL7G7SB2HlEJ//z+E+F0+S4Vlao1vyLQ5QkgE82pAUB8FoMWvY1qF0Y8A5wtm6
+iZSGk4OLK488ZbT8Ii9i+AGKgPe2XbVxsJwj8N4k7Zooqec9hz73Up8ATEWJkRz7
+2u7oMGG4z91E0PULA64dOi3l/vOQe5w/Aa+CwVbAWtI05o7kMvQEBMDJn6C7CByo
+MB5op9wueJMnz7PM7hns+U7Dy6oE4ljuolJUy51bDzFWwoM54cRoQqLFNHd8JVQj
+WxldCkbfF43iyprlsEcUrTyUjtdA+ZeiG39vg/mtdmgNpGmdupHJZQvSuG8IcVlz
+O+eMSeQS1QXPD6Ik8UK4SU0h+zOl8xIWtRrsxQuh4fnTN40udm/YUWl/6gOebsBI
+IrVLlKGqJSfB3tMjpCRqdTzJ0dA9keVpkqm2ugZkxEf1+/efq/rFIQ2pUBLCqNTN
+qpNqruK8y8FphP30I2uI4Ej2UIB8AQKBwQDd2Yptj2FyDyaXCycsyde0wYkNyzGU
+dRnzdibfHnMZwjgTjwAwgIUBVIS8H0/z7ZJQKN7osJfddMrtjJtYYUk9g/dCpHXs
+bNh2QSoWah3FdzNGuWd0iRf9+LFxhjAAMo/FS8zFJAJKrFsBdCGTfFUMdsLC0bjr
+YjiWBuvV72uKf8XIZX5KIZruKdWBBcWukcb21R1UDyFYyXRBsly5XHaIYKZql3km
+7pV7MKWO0IYgHbHIqGUqPQlzZ/lkunS1jKECgcEA23wHffD6Ou9/x3okPx2AWpTr
+gh8rgqbyo6hQkBW5Y90Wz824cqaYebZDaBR/xlVx/YwjKkohv8Bde2lpH/ZxRZ1Z
+5Sk2s6GJ/vU0L9RsJZgCgj4L6Coal1NMxuZtCXAlnOpiCdxSZgfqbshbTVz30KsG
+ZJG361Cua1ScdAHxlZBxT52/1Sm0zRC2hnxL7h4qo7Idmtzs40LAJvYOKekR0pPN
+oWeJfra7vgx/jVNvMFWoOoSLpidVO4g+ot4ery6tAoHAdW3rCic1C2zdnmH28Iw+
+s50l8Lk3mz+I5wgJd1zkzCO0DxZIoWPGA3g7cmCYr6N3KRsZMs4W9NAXgjpFGDkW
+zYsG3K21BdpvkdjYcFjnPVjlOXB2RIc0vehf9Jl02wXoeCSxVUDEPcaRvWk9RJYx
+ZpGOchUU7vNkxHURbIJ4yCzuAi9G8/Jp0dsu+kaV5tufF5SjG5WOrzKjaQsCbdN1
+oqaWMCHRrTvov/Z2C+xwsptFOdN5CSyZzg6hQiI4GMlBAoHAXyb6KINcOEi0YMp3
+BFXJ23tMTnEs78tozcKeipigcsbaqORK3omS+NEnj+uzKUzJyl4CsMbKstK2tFYS
+mSTCHqgE3PBtIpsZtEqhgUraR8IK9GPpzZDTTl9ynZgwFTNlWw3RyuyVXF56J+T8
+kCGJ3hEHCHqT/ZRQyX85BKIDFhA0z4tYKxWVqIFiYBNq56R0X9tMMmMs36mEnF93
+7Ht6mowxTZQRa7nU0qOgeKh/P7ki4Zus3y+WJ+T9IqahLtlRAoHBAIhqMrcxSAB8
+RpB9jukJlAnidw2jCMPgrFE8tP0khhVvGrXMldxAUsMKntDIo8dGCnG1KTcWDI0O
+jepvSPHSsxVLFugL79h0eVIS5z4huW48i9xgU8VlHdgAcgEPIAOFcOw2BCu/s0Vp
+O+MM/EyUOdo3NsibB3qc/GJI6iNBYS7AljYEVo6rXo5V/MZvZUF4vClen6Obzsre
+MTTb+4sJjfqleWuvr1XNMeu2mBfXBQkWGZP1byBK0MvD/aQ2PWq92A==
+-----END RSA PRIVATE KEY-----
diff --git a/testdata/auth_tls.tdir/unbound_server.pem b/testdata/auth_tls.tdir/unbound_server.pem
new file mode 100644
index 000000000000..986807310f2b
--- /dev/null
+++ b/testdata/auth_tls.tdir/unbound_server.pem
@@ -0,0 +1,22 @@
+-----BEGIN CERTIFICATE-----
+MIIDqzCCAhMCFBHWXeQ6ZIa9QcQbXLFfC6tj+KA+MA0GCSqGSIb3DQEBCwUAMBIx
+EDAOBgNVBAMMB3VuYm91bmQwHhcNMjAwNzA4MTMzMjI5WhcNNDAwMzI1MTMzMjI5
+WjASMRAwDgYDVQQDDAd1bmJvdW5kMIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIB
+igKCAYEAvjSVSN2QMXudpzukdLCqgg/IOhCX8KYkD0FFFfWcQjgKq5wI0x41iG32
+a6wbGanre4IX7VxaSPu9kkHfnGgynCk5nwDRedE/FLFhAU78PoT0+NqqGRS7XVQ2
+4vLmIz9Hqc2Ozx1um1BXBTmIT0UfN2e22I0LWQ6a3seZlEDRj45gnk7Zuh9MDgot
+aBdm+v1JAbupSf6Zis4VEH3JNdvVGE3O1DHEIeuuz/3BDhpf6WBDH+8KWaBe1ca4
+TZHr9ThL2gEMEfAQl0wXDwRWRoi3NjNMH+mw0L1rjwThI5GXqNIee7o5FzUReSXZ
+uTdFMyGe3Owcx+XoYnwi6cplSNoGsDBu4B9bKKglR9YleJVw4L4Xi8xPq6O9UPj4
++nypHk/DOoC7DIM3ufN0yxPBsFo5TVowxfhdjZXJbbftd2TZv7AH8+XLA5UoZgRz
+XgzECelXSCTBFlMTnT48LfA9pMLydyjAz2UdPHs5Iv+TK5nnI+aJoeaP7kFZSngx
+dy1+A/bNAgMBAAEwDQYJKoZIhvcNAQELBQADggGBABunf93MKaCUHiZgnoOTinsW
+84/EgInrgtKzAyH+BhnKkJOhhR0kkIAx5d9BpDlaSiRTACFon9moWCgDIIsK/Ar7
+JE0Kln9cV//wiiNoFU0O4mnzyGUIMvlaEX6QHMJJQYvL05+w/3AAcf5XmMJtR5ca
+fJ8FqvGC34b2WxX9lTQoyT52sRt+1KnQikiMEnEyAdKktMG+MwKsFDdOwDXyZhZg
+XZhRrfX3/NVJolqB6EahjWIGXDeKuSSKZVtCyib6LskyeMzN5lcRfvubKDdlqFVF
+qlD7rHBsKhQUWK/IO64mGf7y/de+CgHtED5vDvr/p2uj/9sABATfbrOQR3W/Of25
+sLBj4OEfrJ7lX8hQgFaxkMI3x6VFT3W8dTCp7xnQgb6bgROWB5fNEZ9jk/gjSRmD
+yIU+r0UbKe5kBk/CmZVFXL2TyJ92V5NYEQh8V4DGy19qZ6u/XKYyNJL4ocs35GGe
+CA8SBuyrmdhx38h1RHErR2Skzadi1S7MwGf1y431fQ==
+-----END CERTIFICATE-----
diff --git a/testdata/auth_tls_failcert.tdir/auth_tls_failcert.dsc b/testdata/auth_tls_failcert.tdir/auth_tls_failcert.dsc
new file mode 100644
index 000000000000..ba11e2b8c93b
--- /dev/null
+++ b/testdata/auth_tls_failcert.tdir/auth_tls_failcert.dsc
@@ -0,0 +1,16 @@
+BaseName: auth_tls_failcert
+Version: 1.0
+Description: Perform AXFR over tls for authority zone where the cert fails
+CreationDate: Thu 29 Aug 10:35:40 CEST 2024
+Maintainer: dr. W.C.A. Wijngaards
+Category:
+Component:
+CmdDepends:
+Depends:
+Help:
+Pre: auth_tls_failcert.pre
+Post: auth_tls_failcert.post
+Test: auth_tls_failcert.test
+AuxFiles:
+Passed:
+Failure:
diff --git a/testdata/auth_tls_failcert.tdir/auth_tls_failcert.nsd.conf b/testdata/auth_tls_failcert.tdir/auth_tls_failcert.nsd.conf
new file mode 100644
index 000000000000..c20ed21dfe29
--- /dev/null
+++ b/testdata/auth_tls_failcert.tdir/auth_tls_failcert.nsd.conf
@@ -0,0 +1,21 @@
+server:
+ logfile: "/dev/stderr"
+ xfrdfile: xfrd.state
+ username: ""
+ chroot: ""
+ zonesdir: ""
+ pidfile: "nsd.pid"
+ zonelistfile: "zone.list"
+ verbosity: 5
+ port: @NSD_PORT@
+ interface: 127.0.0.1@@NSD_PORT@
+
+ tls-port: @NSD_PORT@
+ tls-service-key: "nsd_server.key"
+ tls-service-pem: "nsd_server.pem"
+
+zone:
+ name: "example.com"
+ zonefile: "example.com.zone"
+ provide-xfr: 0.0.0.0/0 NOKEY
+ provide-xfr: ::0/0 NOKEY
diff --git a/testdata/auth_tls_failcert.tdir/auth_tls_failcert.post b/testdata/auth_tls_failcert.tdir/auth_tls_failcert.post
new file mode 100644
index 000000000000..db103df70056
--- /dev/null
+++ b/testdata/auth_tls_failcert.tdir/auth_tls_failcert.post
@@ -0,0 +1,14 @@
+# #-- auth_tls_failcert.post --#
+# source the master var file when it's there
+[ -f ../.tpkg.var.master ] && source ../.tpkg.var.master
+# source the test var file when it's there
+[ -f .tpkg.var.test ] && source .tpkg.var.test
+#
+# do your teardown here
+. ../common.sh
+kill_pid $NSD_PID
+kill_pid $UNBOUND_PID
+echo "nsd.log"
+cat nsd.log
+echo "unbound.log"
+cat unbound.log
diff --git a/testdata/auth_tls_failcert.tdir/auth_tls_failcert.pre b/testdata/auth_tls_failcert.tdir/auth_tls_failcert.pre
new file mode 100644
index 000000000000..519c363dbb7a
--- /dev/null
+++ b/testdata/auth_tls_failcert.tdir/auth_tls_failcert.pre
@@ -0,0 +1,47 @@
+# #-- auth_tls_failcert.pre--#
+# source the master var file when it's there
+[ -f ../.tpkg.var.master ] && source ../.tpkg.var.master
+# use .tpkg.var.test for in test variable passing
+[ -f .tpkg.var.test ] && source .tpkg.var.test
+
+. ../common.sh
+PRE="../.."
+if test -n "$NSD"; then
+ :
+else
+ if `which nsd >/dev/null 2>&1`; then
+ # need nsd >= 4.2.0
+ NSD="nsd"
+ else
+ if test -f $PRE/../nsd/nsd; then
+ NSD="$PRE/../nsd/nsd"
+ else
+ skip_test "need nsd"
+ fi
+ fi
+fi
+echo "NSD=$NSD"
+
+get_random_port 2
+UNBOUND_PORT=$RND_PORT
+NSD_PORT=$(($RND_PORT + 1))
+echo "UNBOUND_PORT=$UNBOUND_PORT" >> .tpkg.var.test
+echo "NSD_PORT=$NSD_PORT" >> .tpkg.var.test
+
+# make config file
+sed -e 's/@UNBOUND_PORT\@/'$UNBOUND_PORT'/' -e 's/@NSD_PORT\@/'$NSD_PORT'/' < auth_tls_failcert.ub.conf > ub.conf
+sed -e 's/@UNBOUND_PORT\@/'$UNBOUND_PORT'/' -e 's/@NSD_PORT\@/'$NSD_PORT'/' < auth_tls_failcert.nsd.conf > nsd.conf
+
+# start nsd
+$NSD -d -c nsd.conf >nsd.log 2>&1 &
+NSD_PID=$!
+echo "NSD_PID=$NSD_PID" >> .tpkg.var.test
+
+# start unbound in the background
+$PRE/unbound -d -c ub.conf >unbound.log 2>&1 &
+UNBOUND_PID=$!
+echo "UNBOUND_PID=$UNBOUND_PID" >> .tpkg.var.test
+
+cat .tpkg.var.test
+wait_nsd_up nsd.log
+wait_unbound_up unbound.log
diff --git a/testdata/auth_tls_failcert.tdir/auth_tls_failcert.test b/testdata/auth_tls_failcert.tdir/auth_tls_failcert.test
new file mode 100644
index 000000000000..1f9e8e201c9e
--- /dev/null
+++ b/testdata/auth_tls_failcert.tdir/auth_tls_failcert.test
@@ -0,0 +1,56 @@
+# #-- auth_tls_failcert.test --#
+# source the master var file when it's there
+[ -f ../.tpkg.var.master ] && source ../.tpkg.var.master
+# use .tpkg.var.test for in test variable passing
+[ -f .tpkg.var.test ] && source .tpkg.var.test
+
+PRE="../.."
+# do the test
+echo "> dig www.example.com."
+dig @127.0.0.1 -p $UNBOUND_PORT www.example.com. | tee outfile
+if grep SERVFAIL outfile; then
+ echo "> try again"
+ dig @127.0.0.1 -p $UNBOUND_PORT www.example.com. | tee outfile
+fi
+if grep SERVFAIL outfile; then
+ echo "> try again"
+ sleep 1
+ dig @127.0.0.1 -p $UNBOUND_PORT www.example.com. | tee outfile
+fi
+if grep SERVFAIL outfile; then
+ echo "> try again"
+ sleep 1
+ dig @127.0.0.1 -p $UNBOUND_PORT www.example.com. | tee outfile
+fi
+if grep SERVFAIL outfile; then
+ echo "> try again"
+ sleep 1
+ dig @127.0.0.1 -p $UNBOUND_PORT www.example.com. | tee outfile
+fi
+if grep SERVFAIL outfile; then
+ echo "> try again"
+ sleep 1
+ dig @127.0.0.1 -p $UNBOUND_PORT www.example.com. | tee outfile
+fi
+if grep SERVFAIL outfile; then
+ echo "> try again"
+ sleep 1
+ dig @127.0.0.1 -p $UNBOUND_PORT www.example.com. | tee outfile
+fi
+echo "> check answer"
+if grep "1.2.3.4" outfile; then
+ echo "Not OK"
+ exit 1
+else
+ echo "OK not present"
+fi
+
+# But the server should be up
+if grep "SERVFAIL" outfile; then
+ echo "OK"
+else
+ echo "Not OK"
+ exit 1
+fi
+
+exit 0
diff --git a/testdata/auth_tls_failcert.tdir/auth_tls_failcert.ub.conf b/testdata/auth_tls_failcert.tdir/auth_tls_failcert.ub.conf
new file mode 100644
index 000000000000..57e3dcfcbc33
--- /dev/null
+++ b/testdata/auth_tls_failcert.tdir/auth_tls_failcert.ub.conf
@@ -0,0 +1,23 @@
+server:
+ verbosity: 7
+ # num-threads: 1
+ interface: 127.0.0.1
+ port: @UNBOUND_PORT@
+ use-syslog: no
+ directory: ""
+ pidfile: "unbound.pid"
+ chroot: ""
+ username: ""
+ do-not-query-localhost: no
+ tls-service-key: "unbound_server.key"
+ tls-service-pem: "unbound_server.pem"
+ tls-cert-bundle: "nsd_server.pem"
+
+auth-zone:
+ name: "example.com"
+ for-upstream: yes
+ for-downstream: yes
+ # actual working primary: "127.0.0.1@@NSD_PORT@#nsd"
+ primary: "127.0.0.1@@NSD_PORT@#wrongname"
+ allow-notify: "127.0.0.2@@NSD_PORT@"
+ allow-notify: 127.0.0.1
diff --git a/testdata/auth_tls_failcert.tdir/example.com.zone b/testdata/auth_tls_failcert.tdir/example.com.zone
new file mode 100644
index 000000000000..18b5b407eedd
--- /dev/null
+++ b/testdata/auth_tls_failcert.tdir/example.com.zone
@@ -0,0 +1,4 @@
+example.com. 240 IN SOA ns.nlnetlabs.nl. hostmaster.nlnetlabs.nl. 2024082400 28800 7200 604800 240
+example.com. NS ns.example.com.
+ns.example.com. IN A 192.0.2.1
+www.example.com. A 1.2.3.4
diff --git a/testdata/auth_tls_failcert.tdir/nsd_server.key b/testdata/auth_tls_failcert.tdir/nsd_server.key
new file mode 100644
index 000000000000..5d9f6103134e
--- /dev/null
+++ b/testdata/auth_tls_failcert.tdir/nsd_server.key
@@ -0,0 +1,39 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIG5QIBAAKCAYEAxLy5fFUI1OjXXbPcQ13303/K5AliTq6bCnS57edzQIbmPZj7
+XbGZ0RnU47cZ11GSAI9ptDIrSidNTsHzaqWZn431/IVjwrIkRgz95/aOWRov4fwm
+cS5qvbYV60l384NZLqmF4BDDxSt2MLT2+jWxFEK2iUm2YXZewifQ8zaHmjfAWlo8
+TlK5jzt0Qc0qPv5nCC6mwtjb7OHul3N3QolW6hZOc1KZVEeBdELedoU9TyMyzhPB
+vkqAXWoti/CwWj3YMTj/L7zNfQ9F1HW6n67Y+ltO8IadILPiZiiAVIrLqUh3EL2X
+fq+BcJ3QvADjyL9F5TH3AaWoi6iYgMGcgdqK9k6hj+ziuMxX6OsgzfzxTEzZCHhP
+Er39SX6j/fHzJP4aGQxAAHLAmv2p9P/oEZeZsvWPsBWYpULKgMZ0JDZhf26ddrB1
+mpTaqRQsG384dUZR9f/iyzTszwgc2PQ7JG6gVg723KoBhlD0g+DlC8XdxiRyaDbJ
+PXzSoXgLWumx02OhAgMBAAECggGBAMS7MARriBRX7hzuYaEgE1V0oe+cjqi9o542
+EUMcQjzRaOVJ2HrdwUG+wgsgKwAMuqJCxuIBlRZm7MCH5CDODivmKohk3thviSRf
+k3tlKv1g2Wby3YIqd2TT82FAK2nf+8tUi+H/AbVl+59DJwIXtMbc22m3w1/8nU8r
+v5+l9L27aGcxesKbqKDZRC0Uu10YyvD8rZeEgY+EcjESrrxjV/1nZvWdMGR9yK74
+uzrri95aBVDbos7l8yz2oysf+UmUMp5U9rWwuU4M/34pFSGeo7CHjtliwbBF4FHn
+uyompXaOr7Qrgeg4fc9NbZNaB4OAOV2d1sI202q6j3kEkhG4pD8LAG/RRnugCj7D
+PKGJL3iZKxknjA+tAKkgq50EbMpLHHv1qSiKWy8p+bR5FyBYPSheOSkOKTywpqnd
+OU+VDTi4iLDvkENt6E0TghSyhncl8yIcomYPktqepaNekCHquK5sX8NUhOzRe3WH
+gX7l3e/o8JRvbwXJ8UWfQlKhPO/hvQKBwQDiLXVMf+Hjl/OoXHtF6huerNBux5CS
+KYha5BLARs9W74kd9mTJ9F5IflenpzQJc1b/PnvvlcDDlniUvlgk463EA2th4qWp
+50jFniq/l4rUMFk1vZBXldvuUaL6f+Ihi8WmoUAyguEVAB9G/EJ1bXqHKdJtxuz+
+/TXGBsXrF5+sZOTjfq96CgQtBmbPXMncPto0NndoMqcEB0bjsFywQXGCk6ZZZ3Ac
+vwnZFqVwqro3aTwD+xllzVz+xBNK8GU+zW8CgcEA3q2EepAT7dlZAveC7VSLnFF/
+w86ziynGEuhoJly+zedDPkFIGxYje1SPaKhpMH2jOdCajyHPOGuWEeVfKMbzCrHP
+GdFyiTQDk3Pq0JRXpUUJSPGPusAQnPruE68XccDb+eBiJR6y+0vXHd1J3F8B4BMQ
+AloZZtlx9BkEZaaRjROxM7Ilbev4IjOcScTREb2GL8gU3vnI2FJjBMy6fI5cm4QK
+XEgiLcxGniM77bAZTeoVFbpd4SSICDXVn/NM/XfvAoHBAMHbjKphAc/9MY6gldg6
+7Cl4nb4VtshQaNremWPMTXKKJNBVm9WtahJgl+jO2z8uaOalO70CchIyKm/zJcGY
+lBtpguSHSs7xueIHy0QkM43jUtNJAyrO+46s0jA65Cs0jdhgZZHls944GJbTKHNV
+vquTIRWOZxu3FBwDOihiOy2b3MNQlj7XzvR4hC4/rZTlGkmeVYItyBEf25bUVt2L
+eisdOntuuR0qcNptGqgS7UEJJbOTyRUEjCyhCpg0q9LEaQKBwDF7N1wQ1gzdZlUt
+cO+SAO/8gDqfnPAImVYsRLB5nYCdqiiUUxSJx9qpALEN80nuMS4wt5ekuKpd5dwW
+Lx4dj3ZJ6q5fB2eLolvKv1wYCp3UCGsoGnsyIL7xV6QSHVCOvZL6FHURLE6BHM0r
+FjWc+wqy0bTkFo7vNM48HOkFqYRC4vaM2JpjfCEFfO47iQW7Kq1FdbXSpZnEPPKd
+F7eD3vpDzhWRhd7NbMfJJpD7t7PDl2nbnu7fska4x76iTvJoCwKBwQCcqj2yhl69
+1GfpzsOtfzh9rECrnKjAhmVbwRfKB1ivwe8G2tobgQjOUajBqkCYKpZgTy3wyhWn
+0D4AdwonGu1XYLZWX+Hw/ZWhNEg/6Ju2wfiMJfFWmy5pvTSvmOlNWvYKwmH/TDjX
+tEctSVj6D67xE5v6s3donTI0NFa1u7i1hwoGu4POCockbau52YN4n20R5K7enu2+
+YYpXfcUOmCi91Hpv+X1YbmY1tOo0m1ItYqupbuRFXnHVXJhKxsYXqlA=
+-----END RSA PRIVATE KEY-----
diff --git a/testdata/auth_tls_failcert.tdir/nsd_server.pem b/testdata/auth_tls_failcert.tdir/nsd_server.pem
new file mode 100644
index 000000000000..5d41ad2d6477
--- /dev/null
+++ b/testdata/auth_tls_failcert.tdir/nsd_server.pem
@@ -0,0 +1,22 @@
+-----BEGIN CERTIFICATE-----
+MIIDozCCAgsCFCAZislHgIerlrBBkLFt/ZOkKYVZMA0GCSqGSIb3DQEBCwUAMA4x
+DDAKBgNVBAMMA25zZDAeFw0xOTA0MjUxNTEzMjdaFw0yOTA0MjIxNTEzMjdaMA4x
+DDAKBgNVBAMMA25zZDCCAaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBAMS8
+uXxVCNTo112z3ENd99N/yuQJYk6umwp0ue3nc0CG5j2Y+12xmdEZ1OO3GddRkgCP
+abQyK0onTU7B82qlmZ+N9fyFY8KyJEYM/ef2jlkaL+H8JnEuar22FetJd/ODWS6p
+heAQw8UrdjC09vo1sRRCtolJtmF2XsIn0PM2h5o3wFpaPE5SuY87dEHNKj7+Zwgu
+psLY2+zh7pdzd0KJVuoWTnNSmVRHgXRC3naFPU8jMs4Twb5KgF1qLYvwsFo92DE4
+/y+8zX0PRdR1up+u2PpbTvCGnSCz4mYogFSKy6lIdxC9l36vgXCd0LwA48i/ReUx
+9wGlqIuomIDBnIHaivZOoY/s4rjMV+jrIM388UxM2Qh4TxK9/Ul+o/3x8yT+GhkM
+QABywJr9qfT/6BGXmbL1j7AVmKVCyoDGdCQ2YX9unXawdZqU2qkULBt/OHVGUfX/
+4ss07M8IHNj0OyRuoFYO9tyqAYZQ9IPg5QvF3cYkcmg2yT180qF4C1rpsdNjoQID
+AQABMA0GCSqGSIb3DQEBCwUAA4IBgQB+WGMopDqNkv7yDAO8Ik2EWieDqxTshqR4
+bT1do9zsC9WDrIVxoVcn+dtlIpEQl8MN9U5DTKBbRgk3grOwUsg2kC0Gujv3vAyQ
+bF+jxjHWd1xzrbQ+QUgz07P1OMFWxMzECL2L2078UZbawFqKqlmNv5avUk27G8nB
+GrujT/pUOIpRXC+rao8e14R84dPJLZuGm9IAeEBQIIdhY9sjFRyoQdCUubyKPpkm
+/fpcDMkt7PzZ4nTovj4NUxnnoUGonpXuj0pHA/RDDJkPYaRrND4OGldQXdZ9LJNM
+pROL6aCZ5iog74OY8yutVzCgGge9vZLkysceVP7Lyks9/fEAtIuozmulp9TUQAeR
+MVdDOcREWRd0vFNtAC9xSloRqV+66CzrFHwkSMpLo+gdgcAZ8s33rgQk+I4gfavU
+jPWMZVcZHXevtWuTRnxfOpMkbwiRyr2J8m549K7OKZgr+JRhdJTev4lvXVyfFia4
+zr6UOK4exZWP6VDXb4IyZbJh+LMjmws=
+-----END CERTIFICATE-----
diff --git a/testdata/auth_tls_failcert.tdir/unbound_server.key b/testdata/auth_tls_failcert.tdir/unbound_server.key
new file mode 100644
index 000000000000..370a7bbb2f22
--- /dev/null
+++ b/testdata/auth_tls_failcert.tdir/unbound_server.key
@@ -0,0 +1,39 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIG5AIBAAKCAYEAvjSVSN2QMXudpzukdLCqgg/IOhCX8KYkD0FFFfWcQjgKq5wI
+0x41iG32a6wbGanre4IX7VxaSPu9kkHfnGgynCk5nwDRedE/FLFhAU78PoT0+Nqq
+GRS7XVQ24vLmIz9Hqc2Ozx1um1BXBTmIT0UfN2e22I0LWQ6a3seZlEDRj45gnk7Z
+uh9MDgotaBdm+v1JAbupSf6Zis4VEH3JNdvVGE3O1DHEIeuuz/3BDhpf6WBDH+8K
+WaBe1ca4TZHr9ThL2gEMEfAQl0wXDwRWRoi3NjNMH+mw0L1rjwThI5GXqNIee7o5
+FzUReSXZuTdFMyGe3Owcx+XoYnwi6cplSNoGsDBu4B9bKKglR9YleJVw4L4Xi8xP
+q6O9UPj4+nypHk/DOoC7DIM3ufN0yxPBsFo5TVowxfhdjZXJbbftd2TZv7AH8+XL
+A5UoZgRzXgzECelXSCTBFlMTnT48LfA9pMLydyjAz2UdPHs5Iv+TK5nnI+aJoeaP
+7kFZSngxdy1+A/bNAgMBAAECggGBALpTOIqQwVg4CFBylL/a8K1IWJTI/I65sklf
+XxYL7G7SB2HlEJ//z+E+F0+S4Vlao1vyLQ5QkgE82pAUB8FoMWvY1qF0Y8A5wtm6
+iZSGk4OLK488ZbT8Ii9i+AGKgPe2XbVxsJwj8N4k7Zooqec9hz73Up8ATEWJkRz7
+2u7oMGG4z91E0PULA64dOi3l/vOQe5w/Aa+CwVbAWtI05o7kMvQEBMDJn6C7CByo
+MB5op9wueJMnz7PM7hns+U7Dy6oE4ljuolJUy51bDzFWwoM54cRoQqLFNHd8JVQj
+WxldCkbfF43iyprlsEcUrTyUjtdA+ZeiG39vg/mtdmgNpGmdupHJZQvSuG8IcVlz
+O+eMSeQS1QXPD6Ik8UK4SU0h+zOl8xIWtRrsxQuh4fnTN40udm/YUWl/6gOebsBI
+IrVLlKGqJSfB3tMjpCRqdTzJ0dA9keVpkqm2ugZkxEf1+/efq/rFIQ2pUBLCqNTN
+qpNqruK8y8FphP30I2uI4Ej2UIB8AQKBwQDd2Yptj2FyDyaXCycsyde0wYkNyzGU
+dRnzdibfHnMZwjgTjwAwgIUBVIS8H0/z7ZJQKN7osJfddMrtjJtYYUk9g/dCpHXs
+bNh2QSoWah3FdzNGuWd0iRf9+LFxhjAAMo/FS8zFJAJKrFsBdCGTfFUMdsLC0bjr
+YjiWBuvV72uKf8XIZX5KIZruKdWBBcWukcb21R1UDyFYyXRBsly5XHaIYKZql3km
+7pV7MKWO0IYgHbHIqGUqPQlzZ/lkunS1jKECgcEA23wHffD6Ou9/x3okPx2AWpTr
+gh8rgqbyo6hQkBW5Y90Wz824cqaYebZDaBR/xlVx/YwjKkohv8Bde2lpH/ZxRZ1Z
+5Sk2s6GJ/vU0L9RsJZgCgj4L6Coal1NMxuZtCXAlnOpiCdxSZgfqbshbTVz30KsG
+ZJG361Cua1ScdAHxlZBxT52/1Sm0zRC2hnxL7h4qo7Idmtzs40LAJvYOKekR0pPN
+oWeJfra7vgx/jVNvMFWoOoSLpidVO4g+ot4ery6tAoHAdW3rCic1C2zdnmH28Iw+
+s50l8Lk3mz+I5wgJd1zkzCO0DxZIoWPGA3g7cmCYr6N3KRsZMs4W9NAXgjpFGDkW
+zYsG3K21BdpvkdjYcFjnPVjlOXB2RIc0vehf9Jl02wXoeCSxVUDEPcaRvWk9RJYx
+ZpGOchUU7vNkxHURbIJ4yCzuAi9G8/Jp0dsu+kaV5tufF5SjG5WOrzKjaQsCbdN1
+oqaWMCHRrTvov/Z2C+xwsptFOdN5CSyZzg6hQiI4GMlBAoHAXyb6KINcOEi0YMp3
+BFXJ23tMTnEs78tozcKeipigcsbaqORK3omS+NEnj+uzKUzJyl4CsMbKstK2tFYS
+mSTCHqgE3PBtIpsZtEqhgUraR8IK9GPpzZDTTl9ynZgwFTNlWw3RyuyVXF56J+T8
+kCGJ3hEHCHqT/ZRQyX85BKIDFhA0z4tYKxWVqIFiYBNq56R0X9tMMmMs36mEnF93
+7Ht6mowxTZQRa7nU0qOgeKh/P7ki4Zus3y+WJ+T9IqahLtlRAoHBAIhqMrcxSAB8
+RpB9jukJlAnidw2jCMPgrFE8tP0khhVvGrXMldxAUsMKntDIo8dGCnG1KTcWDI0O
+jepvSPHSsxVLFugL79h0eVIS5z4huW48i9xgU8VlHdgAcgEPIAOFcOw2BCu/s0Vp
+O+MM/EyUOdo3NsibB3qc/GJI6iNBYS7AljYEVo6rXo5V/MZvZUF4vClen6Obzsre
+MTTb+4sJjfqleWuvr1XNMeu2mBfXBQkWGZP1byBK0MvD/aQ2PWq92A==
+-----END RSA PRIVATE KEY-----
diff --git a/testdata/auth_tls_failcert.tdir/unbound_server.pem b/testdata/auth_tls_failcert.tdir/unbound_server.pem
new file mode 100644
index 000000000000..986807310f2b
--- /dev/null
+++ b/testdata/auth_tls_failcert.tdir/unbound_server.pem
@@ -0,0 +1,22 @@
+-----BEGIN CERTIFICATE-----
+MIIDqzCCAhMCFBHWXeQ6ZIa9QcQbXLFfC6tj+KA+MA0GCSqGSIb3DQEBCwUAMBIx
+EDAOBgNVBAMMB3VuYm91bmQwHhcNMjAwNzA4MTMzMjI5WhcNNDAwMzI1MTMzMjI5
+WjASMRAwDgYDVQQDDAd1bmJvdW5kMIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIB
+igKCAYEAvjSVSN2QMXudpzukdLCqgg/IOhCX8KYkD0FFFfWcQjgKq5wI0x41iG32
+a6wbGanre4IX7VxaSPu9kkHfnGgynCk5nwDRedE/FLFhAU78PoT0+NqqGRS7XVQ2
+4vLmIz9Hqc2Ozx1um1BXBTmIT0UfN2e22I0LWQ6a3seZlEDRj45gnk7Zuh9MDgot
+aBdm+v1JAbupSf6Zis4VEH3JNdvVGE3O1DHEIeuuz/3BDhpf6WBDH+8KWaBe1ca4
+TZHr9ThL2gEMEfAQl0wXDwRWRoi3NjNMH+mw0L1rjwThI5GXqNIee7o5FzUReSXZ
+uTdFMyGe3Owcx+XoYnwi6cplSNoGsDBu4B9bKKglR9YleJVw4L4Xi8xPq6O9UPj4
++nypHk/DOoC7DIM3ufN0yxPBsFo5TVowxfhdjZXJbbftd2TZv7AH8+XLA5UoZgRz
+XgzECelXSCTBFlMTnT48LfA9pMLydyjAz2UdPHs5Iv+TK5nnI+aJoeaP7kFZSngx
+dy1+A/bNAgMBAAEwDQYJKoZIhvcNAQELBQADggGBABunf93MKaCUHiZgnoOTinsW
+84/EgInrgtKzAyH+BhnKkJOhhR0kkIAx5d9BpDlaSiRTACFon9moWCgDIIsK/Ar7
+JE0Kln9cV//wiiNoFU0O4mnzyGUIMvlaEX6QHMJJQYvL05+w/3AAcf5XmMJtR5ca
+fJ8FqvGC34b2WxX9lTQoyT52sRt+1KnQikiMEnEyAdKktMG+MwKsFDdOwDXyZhZg
+XZhRrfX3/NVJolqB6EahjWIGXDeKuSSKZVtCyib6LskyeMzN5lcRfvubKDdlqFVF
+qlD7rHBsKhQUWK/IO64mGf7y/de+CgHtED5vDvr/p2uj/9sABATfbrOQR3W/Of25
+sLBj4OEfrJ7lX8hQgFaxkMI3x6VFT3W8dTCp7xnQgb6bgROWB5fNEZ9jk/gjSRmD
+yIU+r0UbKe5kBk/CmZVFXL2TyJ92V5NYEQh8V4DGy19qZ6u/XKYyNJL4ocs35GGe
+CA8SBuyrmdhx38h1RHErR2Skzadi1S7MwGf1y431fQ==
+-----END CERTIFICATE-----
diff --git a/testdata/cookie_file.tdir/cookie_file.test b/testdata/cookie_file.tdir/cookie_file.test
index 7da4fa657bb8..d5d2c2d1fab8 100644
--- a/testdata/cookie_file.tdir/cookie_file.test
+++ b/testdata/cookie_file.tdir/cookie_file.test
@@ -238,10 +238,12 @@ then
echo "Got the same first cookie in the response while the second secret is active"
exit 1
fi
-if ! grep -q "COOKIE: $second_cookie" $outfile
+if ! grep -q "COOKIE: .* (good)$" $outfile
then
+ # dig can generate a different cookie value here than previous cookies.
+ # but make sure the output contains a valid cookie
cat $outfile
- echo "Did not get the same second cookie in the response"
+ echo "Did not get a valid cookie in the response"
exit 1
fi
diff --git a/testdata/dns64_prefetch_cache.rpl b/testdata/dns64_prefetch_cache.rpl
new file mode 100644
index 000000000000..a23b92f08d42
--- /dev/null
+++ b/testdata/dns64_prefetch_cache.rpl
@@ -0,0 +1,195 @@
+; config options
+server:
+ target-fetch-policy: "0 0 0 0 0"
+ qname-minimisation: "no"
+ module-config: "dns64 iterator"
+ dns64-prefix: 64:ff9b::0/96
+ minimal-responses: no
+ prefetch: yes
+
+stub-zone:
+ name: "."
+ stub-addr: 193.0.14.129 # K.ROOT-SERVERS.NET.
+CONFIG_END
+
+SCENARIO_BEGIN Test dns64 with prefetch and cache store.
+
+; K.ROOT-SERVERS.NET.
+RANGE_BEGIN 0 200
+ ADDRESS 193.0.14.129
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NOERROR
+SECTION QUESTION
+. IN NS
+SECTION ANSWER
+. IN NS K.ROOT-SERVERS.NET.
+SECTION ADDITIONAL
+K.ROOT-SERVERS.NET. IN A 193.0.14.129
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+com. IN NS
+SECTION AUTHORITY
+com. IN NS a.gtld-servers.net.
+SECTION ADDITIONAL
+a.gtld-servers.net. IN A 192.5.6.30
+ENTRY_END
+RANGE_END
+
+; a.gtld-servers.net.
+RANGE_BEGIN 0 200
+ ADDRESS 192.5.6.30
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NOERROR
+SECTION QUESTION
+com. IN NS
+SECTION ANSWER
+com. IN NS a.gtld-servers.net.
+SECTION ADDITIONAL
+a.gtld-servers.net. IN A 192.5.6.30
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+example.com. IN NS
+SECTION AUTHORITY
+example.com. IN NS ns.example.com.
+SECTION ADDITIONAL
+ns.example.com. IN A 1.2.3.4
+ENTRY_END
+RANGE_END
+
+; ns.example.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.2.3.4
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NOERROR
+SECTION QUESTION
+example.com. IN NS
+SECTION ANSWER
+example.com. IN NS ns.example.com.
+SECTION ADDITIONAL
+ns.example.com. IN A 1.2.3.4
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NOERROR
+SECTION QUESTION
+www.example.com. IN A
+SECTION ANSWER
+www.example.com. IN A 10.20.30.40
+SECTION AUTHORITY
+example.com. IN NS ns.example.com.
+SECTION ADDITIONAL
+ns.example.com. IN A 1.2.3.4
+ENTRY_END
+RANGE_END
+
+STEP 1 QUERY
+ENTRY_BEGIN
+REPLY RD
+SECTION QUESTION
+www.example.com. IN A
+ENTRY_END
+
+; recursion happens here.
+STEP 10 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all ttl
+REPLY QR RD RA NOERROR
+SECTION QUESTION
+www.example.com. IN A
+SECTION ANSWER
+www.example.com. 3600 IN A 10.20.30.40
+SECTION AUTHORITY
+example.com. 3600 IN NS ns.example.com.
+SECTION ADDITIONAL
+ns.example.com. 3600 IN A 1.2.3.4
+ENTRY_END
+
+STEP 20 TIME_PASSES ELAPSE 3500
+
+STEP 30 QUERY
+ENTRY_BEGIN
+REPLY RD
+SECTION QUESTION
+www.example.com. IN A
+ENTRY_END
+
+; the prefetch is started, the older cache reply is returned.
+STEP 40 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all ttl
+REPLY QR RD RA NOERROR
+SECTION QUESTION
+www.example.com. IN A
+SECTION ANSWER
+www.example.com. 100 IN A 10.20.30.40
+SECTION AUTHORITY
+example.com. 100 IN NS ns.example.com.
+SECTION ADDITIONAL
+ns.example.com. 100 IN A 1.2.3.4
+ENTRY_END
+
+; check what is in the cache
+STEP 42 QUERY
+ENTRY_BEGIN
+REPLY RD
+SECTION QUESTION
+www.example.com. IN A
+ENTRY_END
+
+STEP 43 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all ttl
+REPLY QR RD RA NOERROR
+SECTION QUESTION
+www.example.com. IN A
+SECTION ANSWER
+www.example.com. 3600 IN A 10.20.30.40
+SECTION AUTHORITY
+example.com. 3600 IN NS ns.example.com.
+SECTION ADDITIONAL
+ns.example.com. 3600 IN A 1.2.3.4
+ENTRY_END
+
+STEP 50 TIME_PASSES ELAPSE 300
+
+; now the upstream is offline, the prefetched answer should be in the cache.
+STEP 110 QUERY
+ENTRY_BEGIN
+REPLY RD
+SECTION QUESTION
+www.example.com. IN A
+ENTRY_END
+
+STEP 120 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all ttl
+REPLY QR RD RA NOERROR
+SECTION QUESTION
+www.example.com. IN A
+SECTION ANSWER
+www.example.com. 3300 IN A 10.20.30.40
+SECTION AUTHORITY
+example.com. 3300 IN NS ns.example.com.
+SECTION ADDITIONAL
+ns.example.com. 3300 IN A 1.2.3.4
+ENTRY_END
+
+SCENARIO_END
diff --git a/testdata/doh_downstream_buffer_size.tdir/doh_downstream_buffer_size.test b/testdata/doh_downstream_buffer_size.tdir/doh_downstream_buffer_size.test
index 45bde6564b2e..00389fde234c 100644
--- a/testdata/doh_downstream_buffer_size.tdir/doh_downstream_buffer_size.test
+++ b/testdata/doh_downstream_buffer_size.tdir/doh_downstream_buffer_size.test
@@ -33,7 +33,7 @@ echo "num answers $num and num write events $nummodew"
if [ $num -eq 8 ]; then
echo "content OK"
else
- if [ "(" $num -eq 9 -o $num -eq 10 ")" -a $nummodew -eq 2 ]; then
+ if [ "(" $num -eq 9 -o $num -eq 10 ")" -a "(" $nummodew -eq 2 -o $nummodew -eq 3 ")" ]; then
echo "skip buffer emptied event"
else
echo "result contents not OK"
diff --git a/testdata/doq_downstream.tdir/doq_downstream.conf b/testdata/doq_downstream.tdir/doq_downstream.conf
new file mode 100644
index 000000000000..babd3504123a
--- /dev/null
+++ b/testdata/doq_downstream.tdir/doq_downstream.conf
@@ -0,0 +1,21 @@
+server:
+ verbosity: 2
+ # num-threads: 1
+ interface: 127.0.0.1@@PORT@
+ quic-port: @PORT@
+ tls-service-key: "unbound_server.key"
+ tls-service-pem: "unbound_server.pem"
+ use-syslog: no
+ directory: .
+ pidfile: "unbound.pid"
+ chroot: ""
+ username: ""
+ do-not-query-localhost: no
+
+ local-zone: "example.net" static
+ local-data: "www.example.net. IN A 1.2.3.4"
+ local-zone: "drop.net" deny
+
+forward-zone:
+ name: "."
+ forward-addr: "127.0.0.1@@TOPORT@"
diff --git a/testdata/doq_downstream.tdir/doq_downstream.dsc b/testdata/doq_downstream.tdir/doq_downstream.dsc
new file mode 100644
index 000000000000..1e0b19d509d1
--- /dev/null
+++ b/testdata/doq_downstream.tdir/doq_downstream.dsc
@@ -0,0 +1,16 @@
+BaseName: doq_downstream
+Version: 1.0
+Description: Test DNS-over-QUIC query processing
+CreationDate: Mon Aug 01 16:00:00 CEST 2022
+Maintainer:
+Category:
+Component:
+CmdDepends:
+Depends:
+Help:
+Pre: doq_downstream.pre
+Post: doq_downstream.post
+Test: doq_downstream.test
+AuxFiles:
+Passed:
+Failure:
diff --git a/testdata/doq_downstream.tdir/doq_downstream.post b/testdata/doq_downstream.tdir/doq_downstream.post
new file mode 100644
index 000000000000..f1a31be3cd81
--- /dev/null
+++ b/testdata/doq_downstream.tdir/doq_downstream.post
@@ -0,0 +1,13 @@
+# #-- doq_downstream.post --#
+# source the master var file when it's there
+[ -f ../.tpkg.var.master ] && source ../.tpkg.var.master
+# source the test var file when it's there
+[ -f .tpkg.var.test ] && source .tpkg.var.test
+#
+# do your teardown here
+PRE="../.."
+. ../common.sh
+kill_pid $FWD_PID
+if test -f unbound.pid; then
+ kill_pid $UNBOUND_PID
+fi
diff --git a/testdata/doq_downstream.tdir/doq_downstream.pre b/testdata/doq_downstream.tdir/doq_downstream.pre
new file mode 100644
index 000000000000..f748cc1f5cf3
--- /dev/null
+++ b/testdata/doq_downstream.tdir/doq_downstream.pre
@@ -0,0 +1,44 @@
+# #-- doq_downstream.pre--#
+# source the master var file when it's there
+[ -f ../.tpkg.var.master ] && source ../.tpkg.var.master
+# use .tpkg.var.test for in test variable passing
+[ -f .tpkg.var.test ] && source .tpkg.var.test
+
+PRE="../.."
+. ../common.sh
+if grep "define HAVE_NGTCP2 1" $PRE/config.h; then echo test enabled; else skip_test "test skipped"; fi
+
+if test -f $PRE/unbound_do_valgrind_in_test; then
+ do_valgrind=yes
+else
+ do_valgrind=no
+fi
+VALGRIND_FLAGS="--leak-check=full --show-leak-kinds=all"
+
+get_random_port 2
+UNBOUND_PORT=$RND_PORT
+FWD_PORT=$(($RND_PORT + 1))
+echo "UNBOUND_PORT=$UNBOUND_PORT" >> .tpkg.var.test
+echo "FWD_PORT=$FWD_PORT" >> .tpkg.var.test
+
+# start forwarder
+get_ldns_testns
+$LDNS_TESTNS -p $FWD_PORT doq_downstream.testns >fwd.log 2>&1 &
+FWD_PID=$!
+echo "FWD_PID=$FWD_PID" >> .tpkg.var.test
+
+# make config file
+sed -e 's/@PORT\@/'$UNBOUND_PORT'/' -e 's/@TOPORT\@/'$FWD_PORT'/' < doq_downstream.conf > ub.conf
+# start unbound in the background
+if test $do_valgrind = "yes"; then
+valgrind $VALGRIND_FLAGS $PRE/unbound -vvvv -d -c ub.conf >unbound.log 2>&1 &
+else
+$PRE/unbound -vvvv -d -c ub.conf >unbound.log 2>&1 &
+fi
+UNBOUND_PID=$!
+echo "UNBOUND_PID=$UNBOUND_PID" >> .tpkg.var.test
+
+cat .tpkg.var.test
+wait_ldns_testns_up fwd.log
+wait_unbound_up unbound.log
+
diff --git a/testdata/doq_downstream.tdir/doq_downstream.test b/testdata/doq_downstream.tdir/doq_downstream.test
new file mode 100644
index 000000000000..a302e8da6b62
--- /dev/null
+++ b/testdata/doq_downstream.tdir/doq_downstream.test
@@ -0,0 +1,109 @@
+# #-- doq_downstream.test --#
+# source the master var file when it's there
+[ -f ../.tpkg.var.master ] && source ../.tpkg.var.master
+# use .tpkg.var.test for in test variable passing
+[ -f .tpkg.var.test ] && source .tpkg.var.test
+
+PRE="../.."
+. ../common.sh
+get_make
+(cd $PRE; $MAKE doqclient)
+
+# test query from local-data, immediate like from cache
+echo "> query www.example.net."
+$PRE/doqclient -s 127.0.0.1 -p $UNBOUND_PORT www.example.net. A IN >outfile 2>&1
+cat outfile
+if test "$?" -ne 0; then
+ echo "exit status not OK"
+ echo "> cat logfiles"
+ cat outfile
+ cat fwd.log
+ cat unbound.log
+ echo "Not OK"
+ exit 1
+fi
+if grep "www.example.net" outfile | grep "1.2.3.4"; then
+ echo "content OK"
+else
+ echo "result contents not OK"
+ echo "> cat logfiles"
+ cat outfile
+ cat fwd.log
+ cat unbound.log
+ echo "result contents not OK"
+ exit 1
+fi
+echo "OK"
+
+# test query that is resolved
+echo "> query www.example.com."
+$PRE/doqclient -s 127.0.0.1 -p $UNBOUND_PORT www.example.com. A IN >outfile 2>&1
+cat outfile
+if test "$?" -ne 0; then
+ echo "exit status not OK"
+ echo "> cat logfiles"
+ cat outfile
+ cat fwd.log
+ cat unbound.log
+ echo "Not OK"
+ exit 1
+fi
+if grep "www.example.com" outfile | grep "10.20.30.40"; then
+ echo "content OK"
+else
+ echo "result contents not OK"
+ echo "> cat logfiles"
+ cat outfile
+ cat fwd.log
+ cat unbound.log
+ echo "result contents not OK"
+ exit 1
+fi
+echo "OK"
+
+# Perform the lock verify tests, stop the server first.
+kill_pid $UNBOUND_PID
+cat unbound.log
+# Remove pidfile so that the post script does not try to stop the server,
+# it is already stopped.
+rm -f unbound.pid
+if test -f ublocktrace-doqclient.0; then
+ if $PRE/lock-verify ublocktrace-doqclient.* 2>&1; then
+ echo "lock-verify test ublocktrace-doqclient worked."
+ else
+ echo "lock-verify test ublocktrace-doqclient failed."
+ exit 1
+ fi
+fi
+if test -f ublocktrace.0; then
+ if $PRE/lock-verify ublocktrace.* 2>&1; then
+ echo "lock-verify test ublocktrace worked."
+ else
+ echo "lock-verify test ublocktrace failed."
+ exit 1
+ fi
+ if grep "lock error" unbound.log >/dev/null; then
+ echo "lock error"
+ exit 1
+ fi
+fi
+# check valgrind output
+if test -f $PRE/unbound_do_valgrind_in_test; then
+ if grep "All heap blocks were freed -- no leaks are possible" unbound.log; then
+ : # clean
+ else
+ grep "^==" unbound.log
+ echo "Memory leaked"
+ grep "in use at exit" unbound.log
+ exit 1
+ fi
+ if grep "ERROR SUMMARY: 0 errors from 0 contexts" unbound.log; then
+ : # clean
+ else
+ grep "^==" unbound.log
+ echo "Errors"
+ grep "ERROR SUMMARY" unbound.log
+ exit 1
+ fi
+fi
+exit 0
diff --git a/testdata/doq_downstream.tdir/doq_downstream.testns b/testdata/doq_downstream.tdir/doq_downstream.testns
new file mode 100644
index 000000000000..2d0ea45a4c3d
--- /dev/null
+++ b/testdata/doq_downstream.tdir/doq_downstream.testns
@@ -0,0 +1,13 @@
+; nameserver test file
+$ORIGIN example.com.
+$TTL 3600
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+REPLY QR AA NOERROR
+ADJUST copy_id
+SECTION QUESTION
+www IN A
+SECTION ANSWER
+www IN A 10.20.30.40
+ENTRY_END
diff --git a/testdata/doq_downstream.tdir/unbound_server.key b/testdata/doq_downstream.tdir/unbound_server.key
new file mode 100644
index 000000000000..4256c421dd0d
--- /dev/null
+++ b/testdata/doq_downstream.tdir/unbound_server.key
@@ -0,0 +1,15 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIICWwIBAAKBgQC3F7Jsv2u01pLL9rFnjsMU/IaCFUIz/624DcaE84Z4gjMl5kWA
+3axQcqul1wlwSrbKwrony+d9hH/+MX0tZwvl8w3OmhmOAiaQ+SHCsIuOjVwQjX0s
+RLB61Pz5+PAiVvnPa9JIYB5QrK6DVEsxIHj8MOc5JKORrnESsFDh6yeMeQIDAQAB
+AoGAAuWoGBprTOA8UGfl5LqYkaNxSWumsYXxLMFjC8WCsjN1NbtQDDr1uAwodSZS
+6ujzvX+ZTHnofs7y64XC8k34HTOCD2zlW7kijWbT8YjRYFU6o9F5zUGD9RCan0ds
+sVscT2psLSzfdsmFAcbmnGdxYkXk2PC1FHtaqExxehralGUCQQDcqrg9uQKXlhQi
+XAaPr8SiWvtRm2a9IMMZkRfUWZclPHq6fCWNuUaCD+cTat4wAuqeknAz33VEosw3
+fXGsok//AkEA1GjIHXrOcSlpfVJb6NeOBugjRtZ7ZDT5gbtnMS9ob0qntKV6saaL
+CNmJwuD9Q3XkU5j1+uHvYGP2NzcJd2CjhwJACV0hNlVMe9w9fHvFN4Gw6WbM9ViP
+0oS6YrJafYNTu5vGZXVxLoNnL4u3NYa6aPUmuZXjNwBLfJ8f5VboZPf6RwJAINd2
+oYA8bSi/A755MX4qmozH74r4Fx1Nuq5UHTm8RwDe/0Javx8F/j9MWpJY9lZDEF3l
+In5OebPa/NyInSmW/wJAZuP9aRn0nDBkHYri++1A7NykMiJ/nH0mDECbnk+wxx0S
+LwqIetBhxb8eQwMg45+iAH7CHAMQ8BQuF/nFE6eotg==
+-----END RSA PRIVATE KEY-----
diff --git a/testdata/doq_downstream.tdir/unbound_server.pem b/testdata/doq_downstream.tdir/unbound_server.pem
new file mode 100644
index 000000000000..aeda3ff11882
--- /dev/null
+++ b/testdata/doq_downstream.tdir/unbound_server.pem
@@ -0,0 +1,11 @@
+-----BEGIN CERTIFICATE-----
+MIIBmzCCAQQCCQDsNJ1UmphEFzANBgkqhkiG9w0BAQUFADASMRAwDgYDVQQDEwd1
+bmJvdW5kMB4XDTA4MDkxMTA5MDk0MFoXDTI4MDUyOTA5MDk0MFowEjEQMA4GA1UE
+AxMHdW5ib3VuZDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAtxeybL9rtNaS
+y/axZ47DFPyGghVCM/+tuA3GhPOGeIIzJeZFgN2sUHKrpdcJcEq2ysK6J8vnfYR/
+/jF9LWcL5fMNzpoZjgImkPkhwrCLjo1cEI19LESwetT8+fjwIlb5z2vSSGAeUKyu
+g1RLMSB4/DDnOSSjka5xErBQ4esnjHkCAwEAATANBgkqhkiG9w0BAQUFAAOBgQAZ
+9N0lnLENs4JMvPS+mn8C5m9bkkFITd32IiLjf0zgYpIUbFXH6XaEr9GNZBUG8feG
+l/6WRXnbnVSblI5odQ4XxGZ9inYY6qtW30uv76HvoKp+QZ1c3460ddR8NauhcCHH
+Z7S+QbLXi+r2JAhpPozZCjBHlRD0ixzA1mKQTJhJZg==
+-----END CERTIFICATE-----
diff --git a/testdata/iter_max_global_quota.rpl b/testdata/iter_max_global_quota.rpl
new file mode 100644
index 000000000000..2dddf035a70b
--- /dev/null
+++ b/testdata/iter_max_global_quota.rpl
@@ -0,0 +1,2236 @@
+; config options
+server:
+ target-fetch-policy: "0 0 0 0 0"
+ qname-minimisation: no
+ ; Move it down to make it exceeded.
+ max-global-quota: 10
+ ; With this limit the resolution succeeds.
+ ; max-global-quota: 250
+
+stub-zone:
+ name: "."
+ stub-addr: 193.0.14.129
+CONFIG_END
+
+SCENARIO_BEGIN Test the max-global-quota limit.
+; It looks up a name with 10 CNAMEs, and every cname needs 10 delegations.
+
+; K.ROOT-SERVERS.NET.
+RANGE_BEGIN 0 100
+ ADDRESS 193.0.14.129
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NOERROR
+SECTION QUESTION
+. IN NS
+SECTION ANSWER
+. IN NS K.ROOT-SERVERS.NET.
+SECTION ADDITIONAL
+K.ROOT-SERVERS.NET. IN A 193.0.14.129
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+com. IN NS
+SECTION AUTHORITY
+com. IN NS a.gtld-servers.net.
+SECTION ADDITIONAL
+a.gtld-servers.net. IN A 192.5.6.30
+ENTRY_END
+RANGE_END
+
+; a.gtld-servers.net.
+RANGE_BEGIN 0 100
+ ADDRESS 192.5.6.30
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+example.com. IN NS
+SECTION AUTHORITY
+example.com. IN NS ns.example.com.
+SECTION ADDITIONAL
+ns.example.com. IN A 1.2.3.4
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+foo.com. IN NS
+SECTION AUTHORITY
+foo.com. IN NS ns.foo.com.
+SECTION ADDITIONAL
+ns.foo.com. IN A 1.2.3.5
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+c1.com. IN NS
+SECTION AUTHORITY
+c1.com. IN NS ns.l1.l2.l3.l4.l5.l6.l7.l8.l9.l10c1.com.
+SECTION ADDITIONAL
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+c2.com. IN NS
+SECTION AUTHORITY
+c2.com. IN NS ns.l1.l2.l3.l4.l5.l6.l7.l8.l9.l10c2.com.
+SECTION ADDITIONAL
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+c3.com. IN NS
+SECTION AUTHORITY
+c3.com. IN NS ns.l1.l2.l3.l4.l5.l6.l7.l8.l9.l10c3.com.
+SECTION ADDITIONAL
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+c4.com. IN NS
+SECTION AUTHORITY
+c4.com. IN NS ns.l1.l2.l3.l4.l5.l6.l7.l8.l9.l10c4.com.
+SECTION ADDITIONAL
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+c5.com. IN NS
+SECTION AUTHORITY
+c5.com. IN NS ns.l1.l2.l3.l4.l5.l6.l7.l8.l9.l10c5.com.
+SECTION ADDITIONAL
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+c6.com. IN NS
+SECTION AUTHORITY
+c6.com. IN NS ns.l1.l2.l3.l4.l5.l6.l7.l8.l9.l10c6.com.
+SECTION ADDITIONAL
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+c7.com. IN NS
+SECTION AUTHORITY
+c7.com. IN NS ns.l1.l2.l3.l4.l5.l6.l7.l8.l9.l10c7.com.
+SECTION ADDITIONAL
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+c8.com. IN NS
+SECTION AUTHORITY
+c8.com. IN NS ns.l1.l2.l3.l4.l5.l6.l7.l8.l9.l10c8.com.
+SECTION ADDITIONAL
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+c9.com. IN NS
+SECTION AUTHORITY
+c9.com. IN NS ns.l1.l2.l3.l4.l5.l6.l7.l8.l9.l10c9.com.
+SECTION ADDITIONAL
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+c10.com. IN NS
+SECTION AUTHORITY
+c10.com. IN NS ns.l1.l2.l3.l4.l5.l6.l7.l8.l9.l10c10.com.
+SECTION ADDITIONAL
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l10c1.com. IN NS
+SECTION AUTHORITY
+l10c1.com. IN NS ns.l10c1.com.
+SECTION ADDITIONAL
+ns.l10c1.com. IN A 1.3.1.10
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l10c2.com. IN NS
+SECTION AUTHORITY
+l10c2.com. IN NS ns.l10c2.com.
+SECTION ADDITIONAL
+ns.l10c2.com. IN A 1.3.2.10
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l10c3.com. IN NS
+SECTION AUTHORITY
+l10c3.com. IN NS ns.l10c3.com.
+SECTION ADDITIONAL
+ns.l10c3.com. IN A 1.3.3.10
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l10c4.com. IN NS
+SECTION AUTHORITY
+l10c4.com. IN NS ns.l10c4.com.
+SECTION ADDITIONAL
+ns.l10c4.com. IN A 1.3.4.10
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l10c5.com. IN NS
+SECTION AUTHORITY
+l10c5.com. IN NS ns.l10c5.com.
+SECTION ADDITIONAL
+ns.l10c5.com. IN A 1.3.5.10
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l10c6.com. IN NS
+SECTION AUTHORITY
+l10c6.com. IN NS ns.l10c6.com.
+SECTION ADDITIONAL
+ns.l10c6.com. IN A 1.3.6.10
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l10c7.com. IN NS
+SECTION AUTHORITY
+l10c7.com. IN NS ns.l10c7.com.
+SECTION ADDITIONAL
+ns.l10c7.com. IN A 1.3.7.10
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l10c8.com. IN NS
+SECTION AUTHORITY
+l10c8.com. IN NS ns.l10c8.com.
+SECTION ADDITIONAL
+ns.l10c8.com. IN A 1.3.8.10
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l10c9.com. IN NS
+SECTION AUTHORITY
+l10c9.com. IN NS ns.l10c9.com.
+SECTION ADDITIONAL
+ns.l10c9.com. IN A 1.3.9.10
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l10c10.com. IN NS
+SECTION AUTHORITY
+l10c10.com. IN NS ns.l10c10.com.
+SECTION ADDITIONAL
+ns.l10c10.com. IN A 1.3.10.10
+ENTRY_END
+RANGE_END
+
+; ns.example.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.2.3.4
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NOERROR
+SECTION QUESTION
+www.example.com. IN A
+SECTION ANSWER
+www.example.com. IN CNAME www.c1.com.
+ENTRY_END
+RANGE_END
+
+; ns.foo.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.2.3.5
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NOERROR
+SECTION QUESTION
+www.foo.com. IN A
+SECTION ANSWER
+www.foo.com. IN A 1.2.3.4
+ENTRY_END
+RANGE_END
+
+; ns.l10c1.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.1.10
+$ORIGIN l10c1.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l9 IN NS
+SECTION AUTHORITY
+l9 IN NS ns.l9
+SECTION ADDITIONAL
+ns.l9 IN A 1.3.1.9
+ENTRY_END
+RANGE_END
+
+; ns.l9.l10c1.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.1.9
+$ORIGIN l9.l10c1.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l8 IN NS
+SECTION AUTHORITY
+l8 IN NS ns.l8
+SECTION ADDITIONAL
+ns.l8 IN A 1.3.1.8
+ENTRY_END
+RANGE_END
+
+; ns.l8.l9.l10c1.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.1.8
+$ORIGIN l8.l9.l10c1.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l7 IN NS
+SECTION AUTHORITY
+l7 IN NS ns.l7
+SECTION ADDITIONAL
+ns.l7 IN A 1.3.1.7
+ENTRY_END
+RANGE_END
+
+; ns.l7.l8.l9.l10c1.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.1.7
+$ORIGIN l7.l8.l9.l10c1.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l6 IN NS
+SECTION AUTHORITY
+l6 IN NS ns.l6
+SECTION ADDITIONAL
+ns.l6 IN A 1.3.1.6
+ENTRY_END
+RANGE_END
+
+; ns.l6.l7.l8.l9.l10c1.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.1.6
+$ORIGIN l6.l7.l8.l9.l10c1.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l5 IN NS
+SECTION AUTHORITY
+l5 IN NS ns.l5
+SECTION ADDITIONAL
+ns.l5 IN A 1.3.1.5
+ENTRY_END
+RANGE_END
+
+; ns.l5.l6.l7.l8.l9.l10c1.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.1.5
+$ORIGIN l5.l6.l7.l8.l9.l10c1.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l4 IN NS
+SECTION AUTHORITY
+l4 IN NS ns.l4
+SECTION ADDITIONAL
+ns.l4 IN A 1.3.1.4
+ENTRY_END
+RANGE_END
+
+; ns.l4.l5.l6.l7.l8.l9.l10c1.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.1.4
+$ORIGIN l4.l5.l6.l7.l8.l9.l10c1.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l3 IN NS
+SECTION AUTHORITY
+l3 IN NS ns.l3
+SECTION ADDITIONAL
+ns.l3 IN A 1.3.1.3
+ENTRY_END
+RANGE_END
+
+; ns.l3.l4.l5.l6.l7.l8.l9.l10c1.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.1.3
+$ORIGIN l3.l4.l5.l6.l7.l8.l9.l10c1.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l2 IN NS
+SECTION AUTHORITY
+l2 IN NS ns.l2
+SECTION ADDITIONAL
+ns.l2 IN A 1.3.1.2
+ENTRY_END
+RANGE_END
+
+; ns.l2.l3.l4.l5.l6.l7.l8.l9.l10c1.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.1.2
+$ORIGIN l2.l3.l4.l5.l6.l7.l8.l9.l10c1.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l1 IN NS
+SECTION AUTHORITY
+l1 IN NS ns.l1
+SECTION ADDITIONAL
+ns.l1 IN A 1.3.1.1
+ENTRY_END
+RANGE_END
+
+; ns.l1.l2.l3.l4.l5.l6.l7.l8.l9.l10c1.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.1.1
+$ORIGIN l1.l2.l3.l4.l5.l6.l7.l8.l9.l10c1.com.
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NOERROR
+SECTION QUESTION
+ns IN A
+SECTION ANSWER
+ns IN A 1.3.1.1
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NOERROR
+SECTION QUESTION
+ns IN AAAA
+SECTION AUTHORITY
+@ SOA ns host 2018060423 3600 300 86400 3600
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NOERROR
+SECTION QUESTION
+www.c1.com. IN A
+SECTION ANSWER
+www.c1.com. IN CNAME www.c2.com.
+ENTRY_END
+RANGE_END
+
+; ns.l10c2.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.2.10
+$ORIGIN l10c2.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l9 IN NS
+SECTION AUTHORITY
+l9 IN NS ns.l9
+SECTION ADDITIONAL
+ns.l9 IN A 1.3.2.9
+ENTRY_END
+RANGE_END
+
+; ns.l9.l10c2.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.2.9
+$ORIGIN l9.l10c2.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l8 IN NS
+SECTION AUTHORITY
+l8 IN NS ns.l8
+SECTION ADDITIONAL
+ns.l8 IN A 1.3.2.8
+ENTRY_END
+RANGE_END
+
+; ns.l8.l9.l10c2.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.2.8
+$ORIGIN l8.l9.l10c2.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l7 IN NS
+SECTION AUTHORITY
+l7 IN NS ns.l7
+SECTION ADDITIONAL
+ns.l7 IN A 1.3.2.7
+ENTRY_END
+RANGE_END
+
+; ns.l7.l8.l9.l10c2.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.2.7
+$ORIGIN l7.l8.l9.l10c2.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l6 IN NS
+SECTION AUTHORITY
+l6 IN NS ns.l6
+SECTION ADDITIONAL
+ns.l6 IN A 1.3.2.6
+ENTRY_END
+RANGE_END
+
+; ns.l6.l7.l8.l9.l10c2.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.2.6
+$ORIGIN l6.l7.l8.l9.l10c2.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l5 IN NS
+SECTION AUTHORITY
+l5 IN NS ns.l5
+SECTION ADDITIONAL
+ns.l5 IN A 1.3.2.5
+ENTRY_END
+RANGE_END
+
+; ns.l5.l6.l7.l8.l9.l10c2.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.2.5
+$ORIGIN l5.l6.l7.l8.l9.l10c2.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l4 IN NS
+SECTION AUTHORITY
+l4 IN NS ns.l4
+SECTION ADDITIONAL
+ns.l4 IN A 1.3.2.4
+ENTRY_END
+RANGE_END
+
+; ns.l4.l5.l6.l7.l8.l9.l10c2.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.2.4
+$ORIGIN l4.l5.l6.l7.l8.l9.l10c2.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l3 IN NS
+SECTION AUTHORITY
+l3 IN NS ns.l3
+SECTION ADDITIONAL
+ns.l3 IN A 1.3.2.3
+ENTRY_END
+RANGE_END
+
+; ns.l3.l4.l5.l6.l7.l8.l9.l10c2.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.2.3
+$ORIGIN l3.l4.l5.l6.l7.l8.l9.l10c2.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l2 IN NS
+SECTION AUTHORITY
+l2 IN NS ns.l2
+SECTION ADDITIONAL
+ns.l2 IN A 1.3.2.2
+ENTRY_END
+RANGE_END
+
+; ns.l2.l3.l4.l5.l6.l7.l8.l9.l10c2.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.2.2
+$ORIGIN l2.l3.l4.l5.l6.l7.l8.l9.l10c2.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l1 IN NS
+SECTION AUTHORITY
+l1 IN NS ns.l1
+SECTION ADDITIONAL
+ns.l1 IN A 1.3.2.1
+ENTRY_END
+RANGE_END
+
+; ns.l1.l2.l3.l4.l5.l6.l7.l8.l9.l10c2.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.2.1
+$ORIGIN l1.l2.l3.l4.l5.l6.l7.l8.l9.l10c2.com.
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NOERROR
+SECTION QUESTION
+ns IN A
+SECTION ANSWER
+ns IN A 1.3.2.1
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NOERROR
+SECTION QUESTION
+ns IN AAAA
+SECTION AUTHORITY
+@ SOA ns host 2018060423 3600 300 86400 3600
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NOERROR
+SECTION QUESTION
+www.c2.com. IN A
+SECTION ANSWER
+www.c2.com. IN CNAME www.c3.com.
+ENTRY_END
+RANGE_END
+
+; ns.l10c3.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.3.10
+$ORIGIN l10c3.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l9 IN NS
+SECTION AUTHORITY
+l9 IN NS ns.l9
+SECTION ADDITIONAL
+ns.l9 IN A 1.3.3.9
+ENTRY_END
+RANGE_END
+
+; ns.l9.l10c3.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.3.9
+$ORIGIN l9.l10c3.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l8 IN NS
+SECTION AUTHORITY
+l8 IN NS ns.l8
+SECTION ADDITIONAL
+ns.l8 IN A 1.3.3.8
+ENTRY_END
+RANGE_END
+
+; ns.l8.l9.l10c3.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.3.8
+$ORIGIN l8.l9.l10c3.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l7 IN NS
+SECTION AUTHORITY
+l7 IN NS ns.l7
+SECTION ADDITIONAL
+ns.l7 IN A 1.3.3.7
+ENTRY_END
+RANGE_END
+
+; ns.l7.l8.l9.l10c3.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.3.7
+$ORIGIN l7.l8.l9.l10c3.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l6 IN NS
+SECTION AUTHORITY
+l6 IN NS ns.l6
+SECTION ADDITIONAL
+ns.l6 IN A 1.3.3.6
+ENTRY_END
+RANGE_END
+
+; ns.l6.l7.l8.l9.l10c3.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.3.6
+$ORIGIN l6.l7.l8.l9.l10c3.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l5 IN NS
+SECTION AUTHORITY
+l5 IN NS ns.l5
+SECTION ADDITIONAL
+ns.l5 IN A 1.3.3.5
+ENTRY_END
+RANGE_END
+
+; ns.l5.l6.l7.l8.l9.l10c3.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.3.5
+$ORIGIN l5.l6.l7.l8.l9.l10c3.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l4 IN NS
+SECTION AUTHORITY
+l4 IN NS ns.l4
+SECTION ADDITIONAL
+ns.l4 IN A 1.3.3.4
+ENTRY_END
+RANGE_END
+
+; ns.l4.l5.l6.l7.l8.l9.l10c3.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.3.4
+$ORIGIN l4.l5.l6.l7.l8.l9.l10c3.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l3 IN NS
+SECTION AUTHORITY
+l3 IN NS ns.l3
+SECTION ADDITIONAL
+ns.l3 IN A 1.3.3.3
+ENTRY_END
+RANGE_END
+
+; ns.l3.l4.l5.l6.l7.l8.l9.l10c3.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.3.3
+$ORIGIN l3.l4.l5.l6.l7.l8.l9.l10c3.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l2 IN NS
+SECTION AUTHORITY
+l2 IN NS ns.l2
+SECTION ADDITIONAL
+ns.l2 IN A 1.3.3.2
+ENTRY_END
+RANGE_END
+
+; ns.l2.l3.l4.l5.l6.l7.l8.l9.l10c3.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.3.2
+$ORIGIN l2.l3.l4.l5.l6.l7.l8.l9.l10c3.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l1 IN NS
+SECTION AUTHORITY
+l1 IN NS ns.l1
+SECTION ADDITIONAL
+ns.l1 IN A 1.3.3.1
+ENTRY_END
+RANGE_END
+
+; ns.l1.l2.l3.l4.l5.l6.l7.l8.l9.l10c3.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.3.1
+$ORIGIN l1.l2.l3.l4.l5.l6.l7.l8.l9.l10c3.com.
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NOERROR
+SECTION QUESTION
+ns IN A
+SECTION ANSWER
+ns IN A 1.3.3.1
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NOERROR
+SECTION QUESTION
+ns IN AAAA
+SECTION AUTHORITY
+@ SOA ns host 2018060423 3600 300 86400 3600
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NOERROR
+SECTION QUESTION
+www.c3.com. IN A
+SECTION ANSWER
+www.c3.com. IN CNAME www.c4.com.
+ENTRY_END
+RANGE_END
+; ns.l10c4.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.4.10
+$ORIGIN l10c4.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l9 IN NS
+SECTION AUTHORITY
+l9 IN NS ns.l9
+SECTION ADDITIONAL
+ns.l9 IN A 1.3.4.9
+ENTRY_END
+RANGE_END
+
+; ns.l9.l10c4.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.4.9
+$ORIGIN l9.l10c4.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l8 IN NS
+SECTION AUTHORITY
+l8 IN NS ns.l8
+SECTION ADDITIONAL
+ns.l8 IN A 1.3.4.8
+ENTRY_END
+RANGE_END
+
+; ns.l8.l9.l10c4.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.4.8
+$ORIGIN l8.l9.l10c4.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l7 IN NS
+SECTION AUTHORITY
+l7 IN NS ns.l7
+SECTION ADDITIONAL
+ns.l7 IN A 1.3.4.7
+ENTRY_END
+RANGE_END
+
+; ns.l7.l8.l9.l10c4.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.4.7
+$ORIGIN l7.l8.l9.l10c4.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l6 IN NS
+SECTION AUTHORITY
+l6 IN NS ns.l6
+SECTION ADDITIONAL
+ns.l6 IN A 1.3.4.6
+ENTRY_END
+RANGE_END
+
+; ns.l6.l7.l8.l9.l10c4.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.4.6
+$ORIGIN l6.l7.l8.l9.l10c4.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l5 IN NS
+SECTION AUTHORITY
+l5 IN NS ns.l5
+SECTION ADDITIONAL
+ns.l5 IN A 1.3.4.5
+ENTRY_END
+RANGE_END
+
+; ns.l5.l6.l7.l8.l9.l10c4.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.4.5
+$ORIGIN l5.l6.l7.l8.l9.l10c4.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l4 IN NS
+SECTION AUTHORITY
+l4 IN NS ns.l4
+SECTION ADDITIONAL
+ns.l4 IN A 1.3.4.4
+ENTRY_END
+RANGE_END
+
+; ns.l4.l5.l6.l7.l8.l9.l10c4.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.4.4
+$ORIGIN l4.l5.l6.l7.l8.l9.l10c4.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l3 IN NS
+SECTION AUTHORITY
+l3 IN NS ns.l3
+SECTION ADDITIONAL
+ns.l3 IN A 1.3.4.3
+ENTRY_END
+RANGE_END
+
+; ns.l3.l4.l5.l6.l7.l8.l9.l10c4.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.4.3
+$ORIGIN l3.l4.l5.l6.l7.l8.l9.l10c4.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l2 IN NS
+SECTION AUTHORITY
+l2 IN NS ns.l2
+SECTION ADDITIONAL
+ns.l2 IN A 1.3.4.2
+ENTRY_END
+RANGE_END
+
+; ns.l2.l3.l4.l5.l6.l7.l8.l9.l10c4.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.4.2
+$ORIGIN l2.l3.l4.l5.l6.l7.l8.l9.l10c4.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l1 IN NS
+SECTION AUTHORITY
+l1 IN NS ns.l1
+SECTION ADDITIONAL
+ns.l1 IN A 1.3.4.1
+ENTRY_END
+RANGE_END
+
+; ns.l1.l2.l3.l4.l5.l6.l7.l8.l9.l10c4.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.4.1
+$ORIGIN l1.l2.l3.l4.l5.l6.l7.l8.l9.l10c4.com.
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NOERROR
+SECTION QUESTION
+ns IN A
+SECTION ANSWER
+ns IN A 1.3.4.1
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NOERROR
+SECTION QUESTION
+ns IN AAAA
+SECTION AUTHORITY
+@ SOA ns host 2018060423 3600 300 86400 3600
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NOERROR
+SECTION QUESTION
+www.c4.com. IN A
+SECTION ANSWER
+www.c4.com. IN CNAME www.c5.com.
+ENTRY_END
+RANGE_END
+; ns.l10c5.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.5.10
+$ORIGIN l10c5.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l9 IN NS
+SECTION AUTHORITY
+l9 IN NS ns.l9
+SECTION ADDITIONAL
+ns.l9 IN A 1.3.5.9
+ENTRY_END
+RANGE_END
+
+; ns.l9.l10c5.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.5.9
+$ORIGIN l9.l10c5.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l8 IN NS
+SECTION AUTHORITY
+l8 IN NS ns.l8
+SECTION ADDITIONAL
+ns.l8 IN A 1.3.5.8
+ENTRY_END
+RANGE_END
+
+; ns.l8.l9.l10c5.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.5.8
+$ORIGIN l8.l9.l10c5.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l7 IN NS
+SECTION AUTHORITY
+l7 IN NS ns.l7
+SECTION ADDITIONAL
+ns.l7 IN A 1.3.5.7
+ENTRY_END
+RANGE_END
+
+; ns.l7.l8.l9.l10c5.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.5.7
+$ORIGIN l7.l8.l9.l10c5.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l6 IN NS
+SECTION AUTHORITY
+l6 IN NS ns.l6
+SECTION ADDITIONAL
+ns.l6 IN A 1.3.5.6
+ENTRY_END
+RANGE_END
+
+; ns.l6.l7.l8.l9.l10c5.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.5.6
+$ORIGIN l6.l7.l8.l9.l10c5.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l5 IN NS
+SECTION AUTHORITY
+l5 IN NS ns.l5
+SECTION ADDITIONAL
+ns.l5 IN A 1.3.5.5
+ENTRY_END
+RANGE_END
+
+; ns.l5.l6.l7.l8.l9.l10c5.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.5.5
+$ORIGIN l5.l6.l7.l8.l9.l10c5.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l4 IN NS
+SECTION AUTHORITY
+l4 IN NS ns.l4
+SECTION ADDITIONAL
+ns.l4 IN A 1.3.5.4
+ENTRY_END
+RANGE_END
+
+; ns.l4.l5.l6.l7.l8.l9.l10c5.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.5.4
+$ORIGIN l4.l5.l6.l7.l8.l9.l10c5.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l3 IN NS
+SECTION AUTHORITY
+l3 IN NS ns.l3
+SECTION ADDITIONAL
+ns.l3 IN A 1.3.5.3
+ENTRY_END
+RANGE_END
+
+; ns.l3.l4.l5.l6.l7.l8.l9.l10c5.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.5.3
+$ORIGIN l3.l4.l5.l6.l7.l8.l9.l10c5.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l2 IN NS
+SECTION AUTHORITY
+l2 IN NS ns.l2
+SECTION ADDITIONAL
+ns.l2 IN A 1.3.5.2
+ENTRY_END
+RANGE_END
+
+; ns.l2.l3.l4.l5.l6.l7.l8.l9.l10c5.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.5.2
+$ORIGIN l2.l3.l4.l5.l6.l7.l8.l9.l10c5.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l1 IN NS
+SECTION AUTHORITY
+l1 IN NS ns.l1
+SECTION ADDITIONAL
+ns.l1 IN A 1.3.5.1
+ENTRY_END
+RANGE_END
+
+; ns.l1.l2.l3.l4.l5.l6.l7.l8.l9.l10c5.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.5.1
+$ORIGIN l1.l2.l3.l4.l5.l6.l7.l8.l9.l10c5.com.
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NOERROR
+SECTION QUESTION
+ns IN A
+SECTION ANSWER
+ns IN A 1.3.5.1
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NOERROR
+SECTION QUESTION
+ns IN AAAA
+SECTION AUTHORITY
+@ SOA ns host 2018060423 3600 300 86400 3600
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NOERROR
+SECTION QUESTION
+www.c5.com. IN A
+SECTION ANSWER
+www.c5.com. IN CNAME www.c6.com.
+ENTRY_END
+RANGE_END
+; ns.l10c6.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.6.10
+$ORIGIN l10c6.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l9 IN NS
+SECTION AUTHORITY
+l9 IN NS ns.l9
+SECTION ADDITIONAL
+ns.l9 IN A 1.3.6.9
+ENTRY_END
+RANGE_END
+
+; ns.l9.l10c6.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.6.9
+$ORIGIN l9.l10c6.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l8 IN NS
+SECTION AUTHORITY
+l8 IN NS ns.l8
+SECTION ADDITIONAL
+ns.l8 IN A 1.3.6.8
+ENTRY_END
+RANGE_END
+
+; ns.l8.l9.l10c6.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.6.8
+$ORIGIN l8.l9.l10c6.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l7 IN NS
+SECTION AUTHORITY
+l7 IN NS ns.l7
+SECTION ADDITIONAL
+ns.l7 IN A 1.3.6.7
+ENTRY_END
+RANGE_END
+
+; ns.l7.l8.l9.l10c6.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.6.7
+$ORIGIN l7.l8.l9.l10c6.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l6 IN NS
+SECTION AUTHORITY
+l6 IN NS ns.l6
+SECTION ADDITIONAL
+ns.l6 IN A 1.3.6.6
+ENTRY_END
+RANGE_END
+
+; ns.l6.l7.l8.l9.l10c6.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.6.6
+$ORIGIN l6.l7.l8.l9.l10c6.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l5 IN NS
+SECTION AUTHORITY
+l5 IN NS ns.l5
+SECTION ADDITIONAL
+ns.l5 IN A 1.3.6.5
+ENTRY_END
+RANGE_END
+
+; ns.l5.l6.l7.l8.l9.l10c6.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.6.5
+$ORIGIN l5.l6.l7.l8.l9.l10c6.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l4 IN NS
+SECTION AUTHORITY
+l4 IN NS ns.l4
+SECTION ADDITIONAL
+ns.l4 IN A 1.3.6.4
+ENTRY_END
+RANGE_END
+
+; ns.l4.l5.l6.l7.l8.l9.l10c6.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.6.4
+$ORIGIN l4.l5.l6.l7.l8.l9.l10c6.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l3 IN NS
+SECTION AUTHORITY
+l3 IN NS ns.l3
+SECTION ADDITIONAL
+ns.l3 IN A 1.3.6.3
+ENTRY_END
+RANGE_END
+
+; ns.l3.l4.l5.l6.l7.l8.l9.l10c6.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.6.3
+$ORIGIN l3.l4.l5.l6.l7.l8.l9.l10c6.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l2 IN NS
+SECTION AUTHORITY
+l2 IN NS ns.l2
+SECTION ADDITIONAL
+ns.l2 IN A 1.3.6.2
+ENTRY_END
+RANGE_END
+
+; ns.l2.l3.l4.l5.l6.l7.l8.l9.l10c6.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.6.2
+$ORIGIN l2.l3.l4.l5.l6.l7.l8.l9.l10c6.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l1 IN NS
+SECTION AUTHORITY
+l1 IN NS ns.l1
+SECTION ADDITIONAL
+ns.l1 IN A 1.3.6.1
+ENTRY_END
+RANGE_END
+
+; ns.l1.l2.l3.l4.l5.l6.l7.l8.l9.l10c6.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.6.1
+$ORIGIN l1.l2.l3.l4.l5.l6.l7.l8.l9.l10c6.com.
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NOERROR
+SECTION QUESTION
+ns IN A
+SECTION ANSWER
+ns IN A 1.3.6.1
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NOERROR
+SECTION QUESTION
+ns IN AAAA
+SECTION AUTHORITY
+@ SOA ns host 2018060423 3600 300 86400 3600
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NOERROR
+SECTION QUESTION
+www.c6.com. IN A
+SECTION ANSWER
+www.c6.com. IN CNAME www.c7.com.
+ENTRY_END
+RANGE_END
+; ns.l10c7.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.7.10
+$ORIGIN l10c7.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l9 IN NS
+SECTION AUTHORITY
+l9 IN NS ns.l9
+SECTION ADDITIONAL
+ns.l9 IN A 1.3.7.9
+ENTRY_END
+RANGE_END
+
+; ns.l9.l10c7.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.7.9
+$ORIGIN l9.l10c7.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l8 IN NS
+SECTION AUTHORITY
+l8 IN NS ns.l8
+SECTION ADDITIONAL
+ns.l8 IN A 1.3.7.8
+ENTRY_END
+RANGE_END
+
+; ns.l8.l9.l10c7.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.7.8
+$ORIGIN l8.l9.l10c7.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l7 IN NS
+SECTION AUTHORITY
+l7 IN NS ns.l7
+SECTION ADDITIONAL
+ns.l7 IN A 1.3.7.7
+ENTRY_END
+RANGE_END
+
+; ns.l7.l8.l9.l10c7.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.7.7
+$ORIGIN l7.l8.l9.l10c7.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l6 IN NS
+SECTION AUTHORITY
+l6 IN NS ns.l6
+SECTION ADDITIONAL
+ns.l6 IN A 1.3.7.6
+ENTRY_END
+RANGE_END
+
+; ns.l6.l7.l8.l9.l10c7.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.7.6
+$ORIGIN l6.l7.l8.l9.l10c7.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l5 IN NS
+SECTION AUTHORITY
+l5 IN NS ns.l5
+SECTION ADDITIONAL
+ns.l5 IN A 1.3.7.5
+ENTRY_END
+RANGE_END
+
+; ns.l5.l6.l7.l8.l9.l10c7.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.7.5
+$ORIGIN l5.l6.l7.l8.l9.l10c7.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l4 IN NS
+SECTION AUTHORITY
+l4 IN NS ns.l4
+SECTION ADDITIONAL
+ns.l4 IN A 1.3.7.4
+ENTRY_END
+RANGE_END
+
+; ns.l4.l5.l6.l7.l8.l9.l10c7.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.7.4
+$ORIGIN l4.l5.l6.l7.l8.l9.l10c7.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l3 IN NS
+SECTION AUTHORITY
+l3 IN NS ns.l3
+SECTION ADDITIONAL
+ns.l3 IN A 1.3.7.3
+ENTRY_END
+RANGE_END
+
+; ns.l3.l4.l5.l6.l7.l8.l9.l10c7.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.7.3
+$ORIGIN l3.l4.l5.l6.l7.l8.l9.l10c7.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l2 IN NS
+SECTION AUTHORITY
+l2 IN NS ns.l2
+SECTION ADDITIONAL
+ns.l2 IN A 1.3.7.2
+ENTRY_END
+RANGE_END
+
+; ns.l2.l3.l4.l5.l6.l7.l8.l9.l10c7.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.7.2
+$ORIGIN l2.l3.l4.l5.l6.l7.l8.l9.l10c7.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l1 IN NS
+SECTION AUTHORITY
+l1 IN NS ns.l1
+SECTION ADDITIONAL
+ns.l1 IN A 1.3.7.1
+ENTRY_END
+RANGE_END
+
+; ns.l1.l2.l3.l4.l5.l6.l7.l8.l9.l10c7.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.7.1
+$ORIGIN l1.l2.l3.l4.l5.l6.l7.l8.l9.l10c7.com.
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NOERROR
+SECTION QUESTION
+ns IN A
+SECTION ANSWER
+ns IN A 1.3.7.1
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NOERROR
+SECTION QUESTION
+ns IN AAAA
+SECTION AUTHORITY
+@ SOA ns host 2018060423 3600 300 86400 3600
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NOERROR
+SECTION QUESTION
+www.c7.com. IN A
+SECTION ANSWER
+www.c7.com. IN CNAME www.c8.com.
+ENTRY_END
+RANGE_END
+; ns.l10c8.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.8.10
+$ORIGIN l10c8.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l9 IN NS
+SECTION AUTHORITY
+l9 IN NS ns.l9
+SECTION ADDITIONAL
+ns.l9 IN A 1.3.8.9
+ENTRY_END
+RANGE_END
+
+; ns.l9.l10c8.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.8.9
+$ORIGIN l9.l10c8.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l8 IN NS
+SECTION AUTHORITY
+l8 IN NS ns.l8
+SECTION ADDITIONAL
+ns.l8 IN A 1.3.8.8
+ENTRY_END
+RANGE_END
+
+; ns.l8.l9.l10c8.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.8.8
+$ORIGIN l8.l9.l10c8.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l7 IN NS
+SECTION AUTHORITY
+l7 IN NS ns.l7
+SECTION ADDITIONAL
+ns.l7 IN A 1.3.8.7
+ENTRY_END
+RANGE_END
+
+; ns.l7.l8.l9.l10c8.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.8.7
+$ORIGIN l7.l8.l9.l10c8.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l6 IN NS
+SECTION AUTHORITY
+l6 IN NS ns.l6
+SECTION ADDITIONAL
+ns.l6 IN A 1.3.8.6
+ENTRY_END
+RANGE_END
+
+; ns.l6.l7.l8.l9.l10c8.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.8.6
+$ORIGIN l6.l7.l8.l9.l10c8.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l5 IN NS
+SECTION AUTHORITY
+l5 IN NS ns.l5
+SECTION ADDITIONAL
+ns.l5 IN A 1.3.8.5
+ENTRY_END
+RANGE_END
+
+; ns.l5.l6.l7.l8.l9.l10c8.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.8.5
+$ORIGIN l5.l6.l7.l8.l9.l10c8.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l4 IN NS
+SECTION AUTHORITY
+l4 IN NS ns.l4
+SECTION ADDITIONAL
+ns.l4 IN A 1.3.8.4
+ENTRY_END
+RANGE_END
+
+; ns.l4.l5.l6.l7.l8.l9.l10c8.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.8.4
+$ORIGIN l4.l5.l6.l7.l8.l9.l10c8.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l3 IN NS
+SECTION AUTHORITY
+l3 IN NS ns.l3
+SECTION ADDITIONAL
+ns.l3 IN A 1.3.8.3
+ENTRY_END
+RANGE_END
+
+; ns.l3.l4.l5.l6.l7.l8.l9.l10c8.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.8.3
+$ORIGIN l3.l4.l5.l6.l7.l8.l9.l10c8.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l2 IN NS
+SECTION AUTHORITY
+l2 IN NS ns.l2
+SECTION ADDITIONAL
+ns.l2 IN A 1.3.8.2
+ENTRY_END
+RANGE_END
+
+; ns.l2.l3.l4.l5.l6.l7.l8.l9.l10c8.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.8.2
+$ORIGIN l2.l3.l4.l5.l6.l7.l8.l9.l10c8.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l1 IN NS
+SECTION AUTHORITY
+l1 IN NS ns.l1
+SECTION ADDITIONAL
+ns.l1 IN A 1.3.8.1
+ENTRY_END
+RANGE_END
+
+; ns.l1.l2.l3.l4.l5.l6.l7.l8.l9.l10c8.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.8.1
+$ORIGIN l1.l2.l3.l4.l5.l6.l7.l8.l9.l10c8.com.
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NOERROR
+SECTION QUESTION
+ns IN A
+SECTION ANSWER
+ns IN A 1.3.8.1
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NOERROR
+SECTION QUESTION
+ns IN AAAA
+SECTION AUTHORITY
+@ SOA ns host 2018060423 3600 300 86400 3600
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NOERROR
+SECTION QUESTION
+www.c8.com. IN A
+SECTION ANSWER
+www.c8.com. IN CNAME www.c9.com.
+ENTRY_END
+RANGE_END
+; ns.l10c9.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.9.10
+$ORIGIN l10c9.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l9 IN NS
+SECTION AUTHORITY
+l9 IN NS ns.l9
+SECTION ADDITIONAL
+ns.l9 IN A 1.3.9.9
+ENTRY_END
+RANGE_END
+
+; ns.l9.l10c9.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.9.9
+$ORIGIN l9.l10c9.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l8 IN NS
+SECTION AUTHORITY
+l8 IN NS ns.l8
+SECTION ADDITIONAL
+ns.l8 IN A 1.3.9.8
+ENTRY_END
+RANGE_END
+
+; ns.l8.l9.l10c9.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.9.8
+$ORIGIN l8.l9.l10c9.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l7 IN NS
+SECTION AUTHORITY
+l7 IN NS ns.l7
+SECTION ADDITIONAL
+ns.l7 IN A 1.3.9.7
+ENTRY_END
+RANGE_END
+
+; ns.l7.l8.l9.l10c9.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.9.7
+$ORIGIN l7.l8.l9.l10c9.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l6 IN NS
+SECTION AUTHORITY
+l6 IN NS ns.l6
+SECTION ADDITIONAL
+ns.l6 IN A 1.3.9.6
+ENTRY_END
+RANGE_END
+
+; ns.l6.l7.l8.l9.l10c9.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.9.6
+$ORIGIN l6.l7.l8.l9.l10c9.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l5 IN NS
+SECTION AUTHORITY
+l5 IN NS ns.l5
+SECTION ADDITIONAL
+ns.l5 IN A 1.3.9.5
+ENTRY_END
+RANGE_END
+
+; ns.l5.l6.l7.l8.l9.l10c9.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.9.5
+$ORIGIN l5.l6.l7.l8.l9.l10c9.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l4 IN NS
+SECTION AUTHORITY
+l4 IN NS ns.l4
+SECTION ADDITIONAL
+ns.l4 IN A 1.3.9.4
+ENTRY_END
+RANGE_END
+
+; ns.l4.l5.l6.l7.l8.l9.l10c9.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.9.4
+$ORIGIN l4.l5.l6.l7.l8.l9.l10c9.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l3 IN NS
+SECTION AUTHORITY
+l3 IN NS ns.l3
+SECTION ADDITIONAL
+ns.l3 IN A 1.3.9.3
+ENTRY_END
+RANGE_END
+
+; ns.l3.l4.l5.l6.l7.l8.l9.l10c9.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.9.3
+$ORIGIN l3.l4.l5.l6.l7.l8.l9.l10c9.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l2 IN NS
+SECTION AUTHORITY
+l2 IN NS ns.l2
+SECTION ADDITIONAL
+ns.l2 IN A 1.3.9.2
+ENTRY_END
+RANGE_END
+
+; ns.l2.l3.l4.l5.l6.l7.l8.l9.l10c9.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.9.2
+$ORIGIN l2.l3.l4.l5.l6.l7.l8.l9.l10c9.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l1 IN NS
+SECTION AUTHORITY
+l1 IN NS ns.l1
+SECTION ADDITIONAL
+ns.l1 IN A 1.3.9.1
+ENTRY_END
+RANGE_END
+
+; ns.l1.l2.l3.l4.l5.l6.l7.l8.l9.l10c9.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.9.1
+$ORIGIN l1.l2.l3.l4.l5.l6.l7.l8.l9.l10c9.com.
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NOERROR
+SECTION QUESTION
+ns IN A
+SECTION ANSWER
+ns IN A 1.3.9.1
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NOERROR
+SECTION QUESTION
+ns IN AAAA
+SECTION AUTHORITY
+@ SOA ns host 2018060423 3600 300 86400 3600
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NOERROR
+SECTION QUESTION
+www.c9.com. IN A
+SECTION ANSWER
+www.c9.com. IN CNAME www.c10.com.
+ENTRY_END
+RANGE_END
+; ns.l10c10.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.10.10
+$ORIGIN l10c10.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l9 IN NS
+SECTION AUTHORITY
+l9 IN NS ns.l9
+SECTION ADDITIONAL
+ns.l9 IN A 1.3.10.9
+ENTRY_END
+RANGE_END
+
+; ns.l9.l10c10.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.10.9
+$ORIGIN l9.l10c10.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l8 IN NS
+SECTION AUTHORITY
+l8 IN NS ns.l8
+SECTION ADDITIONAL
+ns.l8 IN A 1.3.10.8
+ENTRY_END
+RANGE_END
+
+; ns.l8.l9.l10c10.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.10.8
+$ORIGIN l8.l9.l10c10.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l7 IN NS
+SECTION AUTHORITY
+l7 IN NS ns.l7
+SECTION ADDITIONAL
+ns.l7 IN A 1.3.10.7
+ENTRY_END
+RANGE_END
+
+; ns.l7.l8.l9.l10c10.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.10.7
+$ORIGIN l7.l8.l9.l10c10.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l6 IN NS
+SECTION AUTHORITY
+l6 IN NS ns.l6
+SECTION ADDITIONAL
+ns.l6 IN A 1.3.10.6
+ENTRY_END
+RANGE_END
+
+; ns.l6.l7.l8.l9.l10c10.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.10.6
+$ORIGIN l6.l7.l8.l9.l10c10.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l5 IN NS
+SECTION AUTHORITY
+l5 IN NS ns.l5
+SECTION ADDITIONAL
+ns.l5 IN A 1.3.10.5
+ENTRY_END
+RANGE_END
+
+; ns.l5.l6.l7.l8.l9.l10c10.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.10.5
+$ORIGIN l5.l6.l7.l8.l9.l10c10.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l4 IN NS
+SECTION AUTHORITY
+l4 IN NS ns.l4
+SECTION ADDITIONAL
+ns.l4 IN A 1.3.10.4
+ENTRY_END
+RANGE_END
+
+; ns.l4.l5.l6.l7.l8.l9.l10c10.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.10.4
+$ORIGIN l4.l5.l6.l7.l8.l9.l10c10.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l3 IN NS
+SECTION AUTHORITY
+l3 IN NS ns.l3
+SECTION ADDITIONAL
+ns.l3 IN A 1.3.10.3
+ENTRY_END
+RANGE_END
+
+; ns.l3.l4.l5.l6.l7.l8.l9.l10c10.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.10.3
+$ORIGIN l3.l4.l5.l6.l7.l8.l9.l10c10.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l2 IN NS
+SECTION AUTHORITY
+l2 IN NS ns.l2
+SECTION ADDITIONAL
+ns.l2 IN A 1.3.10.2
+ENTRY_END
+RANGE_END
+
+; ns.l2.l3.l4.l5.l6.l7.l8.l9.l10c10.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.10.2
+$ORIGIN l2.l3.l4.l5.l6.l7.l8.l9.l10c10.com.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+l1 IN NS
+SECTION AUTHORITY
+l1 IN NS ns.l1
+SECTION ADDITIONAL
+ns.l1 IN A 1.3.10.1
+ENTRY_END
+RANGE_END
+
+; ns.l1.l2.l3.l4.l5.l6.l7.l8.l9.l10c10.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.3.10.1
+$ORIGIN l1.l2.l3.l4.l5.l6.l7.l8.l9.l10c10.com.
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NOERROR
+SECTION QUESTION
+ns IN A
+SECTION ANSWER
+ns IN A 1.3.10.1
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NOERROR
+SECTION QUESTION
+ns IN AAAA
+SECTION AUTHORITY
+@ SOA ns host 2018060423 3600 300 86400 3600
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NOERROR
+SECTION QUESTION
+www.c10.com. IN A
+SECTION ANSWER
+www.c10.com. IN CNAME www.foo.com.
+ENTRY_END
+RANGE_END
+
+STEP 1 QUERY
+ENTRY_BEGIN
+REPLY RD
+SECTION QUESTION
+www.example.com. IN A
+ENTRY_END
+
+STEP 10 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all
+REPLY QR RD RA SERVFAIL
+SECTION QUESTION
+www.example.com. IN A
+SECTION ANSWER
+; This is the answer that is exceeding the global quota.
+; www.example.com. IN CNAME www.c1.com.
+; www.c1.com. IN CNAME www.c2.com.
+; www.c2.com. IN CNAME www.c3.com.
+; www.c3.com. IN CNAME www.c4.com.
+; www.c4.com. IN CNAME www.c5.com.
+; www.c5.com. IN CNAME www.c6.com.
+; www.c6.com. IN CNAME www.c7.com.
+; www.c7.com. IN CNAME www.c8.com.
+; www.c8.com. IN CNAME www.c9.com.
+; www.c9.com. IN CNAME www.c10.com.
+; www.c10.com. IN CNAME www.foo.com.
+; www.foo.com. IN A 1.2.3.4
+ENTRY_END
+
+STEP 20 TRAFFIC
+
+SCENARIO_END
diff --git a/testdata/iter_unverified_glue.rpl b/testdata/iter_unverified_glue.rpl
new file mode 100644
index 000000000000..017f220b6f1c
--- /dev/null
+++ b/testdata/iter_unverified_glue.rpl
@@ -0,0 +1,188 @@
+; config options
+server:
+ target-fetch-policy: "0 0 0 0 0"
+ qname-minimisation: no
+ minimal-responses: no
+ do-ip6: no
+ harden-unverified-glue: yes
+stub-zone:
+ name: "."
+ stub-addr: 193.0.14.129 # K.ROOT-SERVERS.NET.
+CONFIG_END
+
+SCENARIO_BEGIN Test iterative resolve with lame hints.
+
+; K.ROOT-SERVERS.NET.
+RANGE_BEGIN 0 100
+ ADDRESS 193.0.14.129
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR RA NOERROR
+SECTION QUESTION
+. IN NS
+SECTION ANSWER
+. IN NS K.ROOT-SERVERS.NET.
+SECTION ADDITIONAL
+K.ROOT-SERVERS.NET. IN A 193.0.14.129
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR RA NOERROR
+SECTION QUESTION
+a.gtld-servers.net. IN A
+SECTION AUTHORITY
+net. IN NS a.gtld-servers.net.
+SECTION ADDITIONAL
+a.gtld-servers.net. IN A 192.5.6.30
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR RA NOERROR
+SECTION QUESTION
+www.example.com. IN A
+SECTION AUTHORITY
+com. IN NS a.gtld-servers.net.
+SECTION ADDITIONAL
+a.gtld-servers.net. IN A 192.5.6.30
+ENTRY_END
+RANGE_END
+
+; a.gtld-servers.net.
+RANGE_BEGIN 0 100
+ ADDRESS 192.5.6.30
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NOERROR
+SECTION QUESTION
+a.gtld-servers.net. IN A
+SECTION ANSWER
+a.gtld-servers.net. IN A 192.5.6.30
+SECTION AUTHORITY
+net. IN NS a.gtld-servers.net.
+SECTION ADDITIONAL
+a.gtld-servers.net. IN A 192.5.6.30
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NOERROR
+SECTION QUESTION
+www.example.com. IN A
+SECTION AUTHORITY
+example.com. IN NS ns1.examplesibling.com.
+SECTION ADDITIONAL
+ns1.examplesibling.com. IN A 1.2.3.4
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NOERROR
+SECTION QUESTION
+com. IN NS
+SECTION ANSWER
+com. IN NS a.gtld-servers.net.
+SECTION ADDITIONAL
+a.gtld-servers.net. IN A 192.5.6.30
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NOERROR
+SECTION QUESTION
+ns1.examplesibling.com. IN A
+SECTION ANSWER
+ns1.examplesibling.com. IN A 1.2.3.5
+ENTRY_END
+RANGE_END
+
+; stale ns1.examplesibling.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.2.3.4
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NOERROR
+SECTION QUESTION
+example.com. IN NS
+SECTION ANSWER
+example.com. IN NS ns1.examplesibling.com.
+SECTION ADDITIONAL
+ns1.examplesibling.com. IN A 1.2.3.5
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NOERROR
+SECTION QUESTION
+www.example.com. IN A
+SECTION ANSWER
+www.example.com. IN A 10.20.30.40
+SECTION AUTHORITY
+example.com. IN NS ns1.examplesibling.com.
+SECTION ADDITIONAL
+ns1.examplesibling.com. IN A 1.2.3.5
+ENTRY_END
+RANGE_END
+
+; actual ns1.examplesibling.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.2.3.5
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NOERROR
+SECTION QUESTION
+example.com. IN NS
+SECTION ANSWER
+example.com. IN NS ns1.examplesibling.com.
+SECTION ADDITIONAL
+ns1.examplesibling.com. IN A 1.2.3.5
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NOERROR
+SECTION QUESTION
+www.example.com. IN A
+SECTION ANSWER
+www.example.com. IN A 10.20.30.50
+SECTION AUTHORITY
+example.com. IN NS ns1.examplesibling.com.
+SECTION ADDITIONAL
+ns1.examplesibling.com. IN A 1.2.3.5
+ENTRY_END
+RANGE_END
+
+STEP 1 QUERY
+ENTRY_BEGIN
+REPLY RD
+SECTION QUESTION
+www.example.com. IN A
+ENTRY_END
+
+; recursion happens here.
+STEP 10 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all
+REPLY QR RD RA NOERROR
+SECTION QUESTION
+www.example.com. IN A
+SECTION ANSWER
+www.example.com. IN A 10.20.30.50
+SECTION AUTHORITY
+example.com. IN NS ns1.examplesibling.com.
+ENTRY_END
+
+SCENARIO_END
diff --git a/testdata/iter_unverified_glue_fallback.rpl b/testdata/iter_unverified_glue_fallback.rpl
new file mode 100644
index 000000000000..386186d48b0c
--- /dev/null
+++ b/testdata/iter_unverified_glue_fallback.rpl
@@ -0,0 +1,138 @@
+; config options
+server:
+ target-fetch-policy: "0 0 0 0 0"
+ qname-minimisation: no
+ minimal-responses: no
+ do-ip6: no
+ harden-unverified-glue: yes
+stub-zone:
+ name: "."
+ stub-addr: 193.0.14.129 # K.ROOT-SERVERS.NET.
+CONFIG_END
+
+SCENARIO_BEGIN Test iterative resolve with lame hints.
+
+; K.ROOT-SERVERS.NET.
+RANGE_BEGIN 0 100
+ ADDRESS 193.0.14.129
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR RA NOERROR
+SECTION QUESTION
+. IN NS
+SECTION ANSWER
+. IN NS K.ROOT-SERVERS.NET.
+SECTION ADDITIONAL
+K.ROOT-SERVERS.NET. IN A 193.0.14.129
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR RA NOERROR
+SECTION QUESTION
+a.gtld-servers.net. IN A
+SECTION AUTHORITY
+net. IN NS a.gtld-servers.net.
+SECTION ADDITIONAL
+a.gtld-servers.net. IN A 192.5.6.30
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR RA NOERROR
+SECTION QUESTION
+www.example.com. IN A
+SECTION AUTHORITY
+com. IN NS a.gtld-servers.net.
+SECTION ADDITIONAL
+a.gtld-servers.net. IN A 192.5.6.30
+ENTRY_END
+RANGE_END
+
+; a.gtld-servers.net.
+RANGE_BEGIN 0 100
+ ADDRESS 192.5.6.30
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NOERROR
+SECTION QUESTION
+a.gtld-servers.net. IN A
+SECTION ANSWER
+a.gtld-servers.net. IN A 192.5.6.30
+SECTION AUTHORITY
+net. IN NS a.gtld-servers.net.
+SECTION ADDITIONAL
+a.gtld-servers.net. IN A 192.5.6.30
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NOERROR
+SECTION QUESTION
+www.example.com. IN A
+SECTION AUTHORITY
+example.com. IN NS ns1.examplesibling.com.
+SECTION ADDITIONAL
+ns1.examplesibling.com. IN A 1.2.3.4
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NOERROR
+SECTION QUESTION
+com. IN NS
+SECTION ANSWER
+com. IN NS a.gtld-servers.net.
+SECTION ADDITIONAL
+a.gtld-servers.net. IN A 192.5.6.30
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NXDOMAIN
+SECTION QUESTION
+ns1.examplesibling.com. IN A
+ENTRY_END
+RANGE_END
+
+; stale ns1.examplesibling.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.2.3.4
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NOERROR
+SECTION QUESTION
+www.example.com. IN A
+SECTION ANSWER
+www.example.com. IN A 10.20.30.40
+ENTRY_END
+RANGE_END
+
+STEP 1 QUERY
+ENTRY_BEGIN
+REPLY RD
+SECTION QUESTION
+www.example.com. IN A
+ENTRY_END
+
+; recursion happens here.
+STEP 10 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all
+REPLY QR RD RA NOERROR
+SECTION QUESTION
+www.example.com. IN A
+SECTION ANSWER
+www.example.com. IN A 10.20.30.40
+ENTRY_END
+
+SCENARIO_END
diff --git a/testdata/rpz_val_block.rpl b/testdata/rpz_val_block.rpl
new file mode 100644
index 000000000000..acde15294adb
--- /dev/null
+++ b/testdata/rpz_val_block.rpl
@@ -0,0 +1,643 @@
+; config options
+server:
+ module-config: "respip validator iterator"
+ target-fetch-policy: "0 0 0 0 0"
+ qname-minimisation: no
+ trust-anchor: "org. DS 1444 8 2 5224fb17d630a2e3efdc863a05a4032c5db415b5de3f32472ee9abed42e10146"
+ val-override-date: "20070916134226"
+ trust-anchor-signaling: no
+ log-servfail: yes
+ val-log-level: 2
+ ede: yes
+
+stub-zone:
+ name: "."
+ stub-addr: 193.0.14.129 # K.ROOT-SERVERS.NET.
+
+rpz:
+ name: "rpz.example.com."
+ rpz-log: yes
+ rpz-log-name: "rpz.example.com"
+ zonefile:
+TEMPFILE_NAME rpz.example.com
+TEMPFILE_CONTENTS rpz.example.com
+$ORIGIN example.com.
+rpz 3600 IN SOA ns1.rpz.example.com. hostmaster.rpz.example.com. (
+ 1379078166 28800 7200 604800 7200 )
+ 3600 IN NS ns1.rpz.example.com.
+ 3600 IN NS ns2.rpz.example.com.
+$ORIGIN rpz.example.com.
+foo.org CNAME .
+foo2.org CNAME .
+foo3.org CNAME .
+bok.foo4.org A 4.0.5.5
+www.foo5.org CNAME alt.foo5.org.
+TEMPFILE_END
+
+CONFIG_END
+
+SCENARIO_BEGIN Test RPZ with validator handles blocked zone.
+; The DNSKEY and DS lookups are stopped.
+
+; K.ROOT-SERVERS.NET.
+RANGE_BEGIN 0 1000
+ ADDRESS 193.0.14.129
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NOERROR
+SECTION QUESTION
+. IN NS
+SECTION ANSWER
+. IN NS K.ROOT-SERVERS.NET.
+SECTION ADDITIONAL
+K.ROOT-SERVERS.NET. IN A 193.0.14.129
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+org. IN NS
+SECTION AUTHORITY
+org. IN NS ns1.servers.org.
+SECTION ADDITIONAL
+ns1.servers.org. IN A 1.2.3.51
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+com. IN NS
+SECTION AUTHORITY
+com. IN NS ns1.servers.com.
+SECTION ADDITIONAL
+ns1.servers.com. IN A 1.2.3.52
+ENTRY_END
+RANGE_END
+
+; ns1.servers.org for .org
+RANGE_BEGIN 0 1000
+ ADDRESS 1.2.3.51
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NOERROR
+SECTION QUESTION
+org. IN NS
+SECTION ANSWER
+org. 3600 IN NS ns1.servers.org.
+org. 3600 IN RRSIG NS 8 1 3600 20070926134150 20070829134150 1444 org. arkVLr3b2Ip4bkWpjPTywYWzoVqay11KLB+ZygfoIWtq7mKW20SjRGI+AzIviHHWPv8iibzA8nwcTehuSmqIuRTmZXYj58hpi/AxrqqzJNiwE60swi1dKn3ti0SZKZaLMRnxrrAv7yu3PR6zGt7CD7gJgxfMfQMc6QryQJQbiyM=
+SECTION ADDITIONAL
+ns1.servers.org. 3600 IN A 1.2.3.51
+ns1.servers.org. 3600 IN RRSIG A 8 3 3600 20070926134150 20070829134150 1444 org. k+9JSbFm5GWSzEbVckC9bVXvzQYwbLvMbHMYmL5tIjt8RMhVhbkyqu+XER5m8xUFL0nrUqJ8ad6SKI9X/8FYGk1iSegpAjIh4bHGzea7vvM7CWw0HfTmmwDhS569IvUfxHyjH4TjSVlM1x9o/d8NGSLAa7h34b0s+NXLEEjNNbI=
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NOERROR
+SECTION QUESTION
+org. IN DNSKEY
+SECTION ANSWER
+org. 3600 IN DNSKEY 257 3 8 AwEAAbd9WqjzE2Pynz21OG5doSf9hFzMr5dhzz2waZ3vTa+0o5r7AjTAqmA1yH/B3+aAMihUm5ucZSfVqo7+kOaRE8yFj9aivOmA1n1+JLevJq/oyvQyjxQN2Qb89LyaNUT5oKZIiL+uyyhNW3KDR3SSbQ/GBwQNDHVcZi+JDR3RC0r7 ;{id = 1444 (ksk), size = 1024b}
+org. 3600 IN RRSIG DNSKEY 8 1 3600 20070926134150 20070829134150 1444 org. pJVKrXD3veTg0qOB2PSQAWdeTEyFFzSbMHJ2F9J9WyxVuMMIDj119aJrkHtkXTmLT7wdOd9RZxDfG0A1H30lQeQdvaJoymaVUgWLXfiwIAYg+4Uk7vZrP7UzHJO2BgDnGdf42h2vgBoboyP9szNMHTGGQdpUk7VkhtE6djonzwg=
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+foo.org. IN NS
+SECTION AUTHORITY
+foo.org. 3600 IN DS 29332 8 2 d38b124648bd7e32033a7fe9fd94ceab56e971ea9e61b3365566ccc028c15c98
+foo.org. 3600 IN RRSIG DS 8 2 3600 20070926134150 20070829134150 1444 org. BE2cR03ecUYk/nRsJNMcNfsOWnSoOfkwx4zmF9eEqwoRn/i5QzsrRBEUdorfBsFjpdKqB2R6jSu53CTQAGv392w8AE0cRANPBxcDUiWaRyFZ7CaqspKorPijOJCKEtgztEfFgC9YXab3xvRkJVUZzZRJ4nCrpmNIGzvmf7LlCTg=
+foo.org. IN NS ns.foo.org.
+SECTION ADDITIONAL
+ns.foo.org. IN A 1.2.3.53
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+foo2.org. IN NS
+SECTION AUTHORITY
+foo2.org. 3600 IN NSEC foo3.org. NS RRSIG NSEC
+foo2.org. 3600 IN RRSIG NSEC 8 2 3600 20070926134150 20070829134150 1444 org. RfkRfmLeyLYtdDKrLBaXTk/KXTkUn9/4dMZtm3Kl5k5oa9/LkbPmnPb0z+zZ/3aBBKZu0QIevS7w++fdYWfIQiK+DIgG9hhp+lNxakLKp4M5SiWuh+zlTjwbRzlf4abWe/c/FR4bjesgObUdLnaIoM4h3aQUS1KsjyGFmLOCUGM=
+foo2.org. IN NS ns.foo2.org.
+SECTION ADDITIONAL
+ns.foo2.org. IN A 1.2.3.54
+ENTRY_END
+
+; for this entry the org zone is suddenly resigned with NSEC3.
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+foo3.org. IN NS
+SECTION AUTHORITY
+; org. NSEC3PARAM 1 0 0 -
+; org. -> mvnq25j8mo8ge527pikocn5rl72s2o0s.
+; foo3.org. -> n3dm0vverfek5tl6klsp0k0gduj0gk92.
+mvnq25j8mo8ge527pikocn5rl72s2o0s.org. IN NSEC3 1 0 0 - mvnq25j8mo8ge527pikocn5rl72s2o0t NS SOA RRSIG DNSKEY
+mvnq25j8mo8ge527pikocn5rl72s2o0s.org. 3600 IN RRSIG NSEC3 8 2 3600 20070926134150 20070829134150 1444 org. MBmDCmjCeXShkwoDI/I04KK7w33FkNs7vci+SKoR5uWS24E3yt2AVgfkwFkKh42+MgqZnBUJEdRPOfATc80XDwxDhdymB3Ff4W1KAVFpJAkU42ii3bdiyYr+YPWVWdCYG2EfSpLcJiD6E21mW2DNRR7Lj9/W89WmndeUEgpjALA=
+n3dm0vverfek5tl6klsp0k0gduj0gk91.org. IN NSEC3 1 0 0 - n3dm0vverfek5tl6klsp0k0gduj0gk93 NS DS RRSIG
+n3dm0vverfek5tl6klsp0k0gduj0gk91.org. 3600 IN RRSIG NSEC3 8 2 3600 20070926134150 20070829134150 1444 org. H5aeeVc6k8fTSwUYDA9BW4ScHazb2b3NfvdQwRbKYj97tlJnJa+cojgOnyvP3qW9YoqO0aRT8rzUjFPJajOIRoS/6XVWCZ3ymDNQIi8oW6vT8qQYA2ldmoWDvFK9fHSgiwqJzQiKXtNGdqTfj2HEyVKVbFTv/Cgxh5jLcB6r9jM=
+foo3.org. IN NS ns.foo3.org.
+SECTION ADDITIONAL
+ns.foo3.org. IN A 1.2.3.55
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+foo4.org. IN NS
+SECTION AUTHORITY
+foo4.org. 3600 IN DS 55567 8 2 db658962fbd0a03e81f1a68c33bb53eef3bc30e980040cb476fb191b24dfdd5a
+foo4.org. 3600 IN RRSIG DS 8 2 3600 20070926134150 20070829134150 1444 org. kO2d+9du+9y0HcAUq056qnqBoXLwT+/EN82lEocJjCE7lx9qxv4YpwfNd1Sr3J9lwvZbfEm5uRPmSwtrythlI4+qmlsEWE90mfUntH+JqlXj7t2E514AZ/SZPSUd6h6AKPlB/DIhHuI/fAEKB+S263NnvVMccaHh8ScJMsY9nGI=
+foo4.org. IN NS ns.foo4.org.
+SECTION ADDITIONAL
+ns.foo4.org. IN A 1.2.3.56
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+foo5.org. IN NS
+SECTION AUTHORITY
+foo5.org. 3600 IN DS 55567 8 2 4046e908302813cad9b4448cd4c243be118b7c18f8414b820bce0a1eab6f6889
+foo5.org. 3600 IN RRSIG DS 8 2 3600 20070926134150 20070829134150 1444 org. e0+FRSrwoSeQxd35dcvsEFGQIO9nz+H6p52LAwPDUTOSwFcbR+q+x4OKX+eG8dbFXK7MGztdGdpPji95HzlezXRTt/66sXqYeDM61NezxVM6N/OjPIOL3VTGeyG4nvDj4ycvBbgjJqdhmev6aWYmTQwFa0+6Nxrlsldrl5/chW4=
+foo5.org. IN NS ns.foo5.org.
+SECTION ADDITIONAL
+ns.foo5.org. IN A 1.2.3.57
+ENTRY_END
+RANGE_END
+
+; ns1.servers.com for .com
+RANGE_BEGIN 0 1000
+ ADDRESS 1.2.3.52
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NOERROR
+SECTION QUESTION
+com. IN NS
+SECTION ANSWER
+com. IN NS ns1.servers.com.
+SECTION ADDITIONAL
+ns1.servers.com. IN A 1.2.3.52
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NOERROR
+SECTION QUESTION
+foo.com. IN TXT
+SECTION ANSWER
+foo.com. IN CNAME www.foo.org.
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NOERROR
+SECTION QUESTION
+foo2.com. IN TXT
+SECTION ANSWER
+foo2.com. IN CNAME www.foo2.org.
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NOERROR
+SECTION QUESTION
+foo4.com. IN A
+SECTION ANSWER
+foo4.com. IN CNAME www.foo4.org.
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NOERROR
+SECTION QUESTION
+foo5.com. IN A
+SECTION ANSWER
+foo5.com. IN CNAME www.foo5.org.
+ENTRY_END
+RANGE_END
+
+; ns.foo.org for foo.org
+RANGE_BEGIN 0 1000
+ ADDRESS 1.2.3.53
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NOERROR
+SECTION QUESTION
+foo.org. IN NS
+SECTION ANSWER
+foo.org. 3600 IN NS ns.foo.org.
+foo.org. 3600 IN RRSIG NS 8 2 3600 20070926134150 20070829134150 29332 foo.org. WfSshqIf/LdScUjw5uyB10t3yoF36aOc+lkhTQsAiR7gat14Un+F1s8bQiG3gU8mnMirsu7M1aMBeQlbJncFhLu4av6ZkkI5L/qvojBAL0AF7Rj0gUWKbMc2NsAeAKY8ySzDXqF7ol9YEskHWW35aL+r5DB91u4joZVsANSqeAfLWAhm47hDGlWgzQ1us72dWOPxPqNBG0sx48xaFxiZJjowXVs/zbRQ1TyIFPeKztayc6HL2gaOPPUoOuHp/AEecySqjamXI28mqBBs8MGJoArFaJ05wIuWEdOzsfc+BcYnmuCaTVgEHUvZMbNvi2CYCY4l0jcl1UD7i4FzPhC4jQ==
+SECTION ADDITIONAL
+ns.foo.org. 3600 IN A 1.2.3.53
+ns.foo.org. 3600 IN RRSIG A 8 3 3600 20070926134150 20070829134150 29332 foo.org. pScBuh9fyXazJLV4yPGQsDKAnNgAGe5G5712sQ46V9CA4Rv+STTI9p6JDyqu1EWVJupLwbL7dqqypSwcSy8CpCO1nH/n/yBnT/9txduEpzvr4OtVJnRZS1LMMlpb4NrT+QPpzxXZH5Zlc+Axevbxj7FVeFIAUq9Fh2+yO6lYXffIy9BW85VOZa1S08/O/2ZyZwPh6pdxB7HRGe/KuD86TMjfjVsveYL4w7UFC+wk1XGQA+zuXOIm+9MQC+UzM/cVR38nW/7Oj1hY2iAgvevFrT75tesf+H927uaHaPrWqSVJLPRIfm4O5wT5K1bgvfYDSlpU/YLf7vaCtJ+kKSOpJw==
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NOERROR
+SECTION QUESTION
+foo.org. IN DNSKEY
+SECTION ANSWER
+foo.org. 3600 IN DNSKEY 257 3 8 AwEAAb4WMOTBLTFvmBra5m6SK4VfViOzmvyUAU0qv861ZQXeEFvwlndqNU9rwRsMxrSWAYs5nHErKDn49usC/HyxxW1477iGFHhfgL4mjNreJm9zft2QFB1VLbRbEPYdDMLCn4co0qnG7/KG8W2i8Pym1L7f+aREwbLo+/716AS2PbaKMhfWLKLiq5wnBcUClQMNzCiwhqxDJp1oePqfkVdeUgXOtgi0dYRIKyQFhJ5VWJ22npoi/Gif0XLCADAlAwRLKc8o/yJkCxskzgpHpw5Cki1lclg0aq4ssOuPRQ+ne6IHYCz9D2mwzulblhLFamKdq7aHzNt4NlyxhpANVFiKLD8= ;{id = 29332 (ksk), size = 2048b}
+foo.org. 3600 IN RRSIG DNSKEY 8 2 3600 20070926134150 20070829134150 29332 foo.org. qlZQpZG+prXK6vsd+zObdHj8DbPBCpjB16B7UgTwsgmVxGRX9nSBnkqUqcIrnszJMHvEwu7VPWjegPX3E8LESgz2Slepa5T8hWmcoega2vWakIzIRNtDxH9PXDy804Dmduk/fxBzMlbbFLfsSrG5+cK5PhingjjxNbEuG3V124xTjFUGHKu4NM6kMfPcHOwjTTQLt6azJ10i6CeyaUXCSYz5xGE7Z4PSLYAstlLsM64EtLTGQHAZIEr2Dq6C23u23sRrj/0qcMFo0Nv8E3rjnkfJIo+RYuqqAznFsLMqfveX42ElWBl5YVLQHSo+kFbXcvgX7gzL8X9u4Z6MJ9zUkw==
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NOERROR
+SECTION QUESTION
+foo.org. IN TXT
+SECTION ANSWER
+foo.org. 3600 IN TXT "a.b.c."
+foo.org. 3600 IN RRSIG TXT 8 2 3600 20070926134150 20070829134150 29332 foo.org. UW/T+M0crcfzQ6PVM/0o1ZtXF2o26VTm/V/9/+F873aQnDwfRLH+tzYSC+yfWZ/0niuif6fv9FYWisE8CyAIIMZ8mrxM7M4JgEZ0/vFOC2sN0qnmqSoZoZaeOEjJIAS6F2om+L6AAFtAH2Khbm0wkHc0jBWj3vK8HoXO38iLe1pPnuBK6BhE2+tyDIcUCoABFrycT0E5NBKFERQL+CzYMEzMUS/joSeWloFw1AB1X9Z94ezgmD+g2MnbW78DR6TRZXGD4DWXuxYNswRnfp4VENSOsSbhX9ixtuxwGn1fhiZeTxN84zE/ERiLK59Yo1bQ3TFjOY0cCvj+c2NulTAr9w==
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NOERROR
+SECTION QUESTION
+www.foo.org. IN TXT
+SECTION ANSWER
+www.foo.org. 3600 IN TXT "a.b.d."
+www.foo.org. 3600 IN RRSIG TXT 8 3 3600 20070926134150 20070829134150 29332 foo.org. EjFHdpJdlFFLDWabiMsMzUPE1+brzq/0ecRG39bpPuU/6MW4HCQs4rlLlZNmmJP/vj+kLTGfguSrKyLQt8n9Tf1fKbvD6NUOIOwiVUOE4kb54JghbiBhWeCnRLmUQwi7DKy0UEw8niX3SY6WwJxO/e7+leQJY7Gpg3S00vKskTAjnKeDYiHcrO69Dpyc0l/qtR1Bb98xcs4vMsh6//BBklSlPTMKBcu2uK6sK7G2ZR1lOtShoginq5UHa+EZWR6Pxn8pLkfQGOXTjGq5WaTeEdcinBlvXYBGhAPKWXHwcEtEjClkWi1ZXOnSgwHu9dRxgSk/jcfSmjBFzw2bycq2Lg==
+ENTRY_END
+RANGE_END
+
+; ns.foo2.org for foo2.org
+RANGE_BEGIN 0 1000
+ ADDRESS 1.2.3.54
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NOERROR
+SECTION QUESTION
+foo2.org. IN NS
+SECTION ANSWER
+foo2.org. IN NS ns.foo2.org.
+SECTION ADDITIONAL
+ns.foo2.org. IN A 1.2.3.54
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NOERROR
+SECTION QUESTION
+www.foo2.org. IN TXT
+SECTION ANSWER
+www.foo2.org. IN TXT "a.b.e."
+ENTRY_END
+RANGE_END
+
+; ns.foo3.org for foo3.org
+RANGE_BEGIN 0 1000
+ ADDRESS 1.2.3.55
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NOERROR
+SECTION QUESTION
+foo3.org. IN NS
+SECTION ANSWER
+foo3.org. IN NS ns.foo3.org.
+SECTION ADDITIONAL
+ns.foo3.org. IN A 1.2.3.55
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NOERROR
+SECTION QUESTION
+ns.foo3.org. IN A
+SECTION ANSWER
+ns.foo3.org. IN A 1.2.3.55
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NOERROR
+SECTION QUESTION
+ns.foo3.org. IN AAAA
+SECTION AUTHORITY
+foo3.org. IN SOA ns.foo3.org. host.foo3.org. 2007090422 3600 300 604800 3600
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NOERROR
+SECTION QUESTION
+www.foo3.org. IN TXT
+SECTION ANSWER
+www.foo3.org. IN TXT "a.b.f."
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NOERROR
+SECTION QUESTION
+www2.foo3.org. IN TXT
+SECTION ANSWER
+www2.foo3.org. IN TXT "a.b.g."
+ENTRY_END
+RANGE_END
+
+; ns.foo4.org for foo4.org
+RANGE_BEGIN 0 1000
+ ADDRESS 1.2.3.56
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NOERROR
+SECTION QUESTION
+foo4.org. IN NS
+SECTION ANSWER
+foo4.org. 3600 IN NS ns.foo4.org.
+foo4.org. 3600 IN RRSIG NS 8 2 3600 20070926134150 20070829134150 55567 foo4.org. FXwXqJ8EW2XZDzHiMSiqiUpkk6tHGsJdlH1pfuOO6yPsmAmg6sSnyE9UsIDeW1bGwanYxbZGiD4YR9ED/NzdlMUrCI0fs4c0fa0yJjcF5WY0yZCL9OZbyn/dPIcqZ3D6UWjVVMW6EhZSPqzuz5gWYEiXkBDEc1s2BEjIYSwZo4g=
+SECTION ADDITIONAL
+ns.foo4.org. 3600 IN A 1.2.3.56
+ns.foo4.org. 3600 IN RRSIG A 8 3 3600 20070926134150 20070829134150 55567 foo4.org. MgKROh4mE6pUyp0ik2CHTZuf7n9M4WaDvTLdI9qb+AvvpJJiwA1+7/v004A3PADvohsUytQttldYKwK6J9+c8R48lpieT+e/WzeyoCM1ieFhbP73By32Bl/akH+8cOUxfqqLD8Y+1z/oKV55LyqKP0H0DCb6vfYtSxWAYQym9PQ=
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NOERROR
+SECTION QUESTION
+foo4.org. IN DNSKEY
+SECTION ANSWER
+foo4.org. IN DNSKEY 257 3 8 AwEAAdug/L739i0mgN2nuK/bhxu3wFn5Ud9nK2+XUmZQlPUEZUC5YZvm1rfMmEWTGBn87fFxEu/kjFZHJ55JLzqsbbpVHLbmKCTT2gYR2FV2WDKROGKuYbVkJIXdKAjJ0ONuK507NinYvlWXIoxHn22KAWOd9wKgSTNHBlmGkX+ts3hh ;{id = 55567 (ksk), size = 1024b}
+foo4.org. 3600 IN RRSIG DNSKEY 8 2 3600 20070926134150 20070829134150 55567 foo4.org. Hy1tP0xBPp23e+w2YJ49e09e8AB9hLDP3ksWI/8ujNFK51Kuwo8HBx4R6zbcuOELlqWxr6IQU2w6AwB6UqClS88mc2sIgeEbw7Nm+nCDWPSPklPP4qa9pdXFh2M4txF4NxymrgRABjTTJiXK4oeWtFBNKkUu0hf6RGb9OJmdzF0=
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NOERROR
+SECTION QUESTION
+www.foo4.org. IN A
+SECTION ANSWER
+www.foo4.org. 3600 IN CNAME bok.foo4.org.
+www.foo4.org. 3600 IN RRSIG CNAME 8 3 3600 20070926134150 20070829134150 55567 foo4.org. ZRY/v7TPmkuKVNB739kTMiqPh84jtDO01hx2EtuPI2YwG4EnhWFV0fuz86FDMPKUD17MXRHKsi0+RUopqGUEbuZ7G9MzUFtuuTnVD8f9lNJVp2AfE2RAr1le8zZpdSvlmB1Y07HsrFPxxZAPYdBC2IY3VcpI0xaT1nHGsSpcoXc=
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NOERROR
+SECTION QUESTION
+bok.foo4.org. IN A
+SECTION ANSWER
+bok.foo4.org. 3600 IN A 1.2.3.4
+bok.foo4.org. 3600 IN RRSIG A 8 3 3600 20070926134150 20070829134150 55567 foo4.org. xDPRNYlwWTxfQaX6kKHbYeKC/ro/U1TAQzEexUoQb/GDpx1zB1oqvYBuauivIjHyKwjrGg7f9WHyyzMxSby0G62hJLPoMJMLscLce17mwkWcG2AuojBiDwLBr5QXvJXhvT21LpOFt8xplLZuzNRyw4EsUau0ecd2nQ/5vtIz5aU=
+ENTRY_END
+RANGE_END
+
+; ns.foo5.org for foo5.org
+RANGE_BEGIN 0 1000
+ ADDRESS 1.2.3.57
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NOERROR
+SECTION QUESTION
+foo5.org. IN NS
+SECTION ANSWER
+foo5.org. 3600 IN NS ns.foo5.org.
+foo5.org. 3600 IN RRSIG NS 8 2 3600 20070926134150 20070829134150 55567 foo5.org. Zv/zSvsLucTxX2LL+i4IZfFw/D/5HvzNKmRcohBjmP2W+F53KddGJpRHb2FPqcBzKhvjL/Awf0x1mhHUUBCSQcHA3FZQ9q2kfXK4pzg4XbI03U/hsY5b/1M8SC/DfGE+4jN59QadXZ6N4ouV4Ka9sqRfqXiQFED1Rz9WuMyHfXY=
+SECTION ADDITIONAL
+ns.foo5.org. 3600 IN A 1.2.3.57
+ns.foo5.org. 3600 IN RRSIG A 8 3 3600 20070926134150 20070829134150 55567 foo5.org. TcHl2qjwwcfoM1kJ+rwje/VRmPJT62RvJvjHwri5NqJopKp9tcaKz1dYByTlhbGbB0tGihWPa271ja3s31dHuOlZsuWd8hdMr7Hq/COpyn7iVOoeU8bLRtkvReLyiD3Ju9IMmzLMyWCGNNzpuZrEBfbBwTC4ali5iL4OgPjMdhc=
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NOERROR
+SECTION QUESTION
+foo5.org. IN DNSKEY
+SECTION ANSWER
+foo5.org. IN DNSKEY 257 3 8 AwEAAdug/L739i0mgN2nuK/bhxu3wFn5Ud9nK2+XUmZQlPUEZUC5YZvm1rfMmEWTGBn87fFxEu/kjFZHJ55JLzqsbbpVHLbmKCTT2gYR2FV2WDKROGKuYbVkJIXdKAjJ0ONuK507NinYvlWXIoxHn22KAWOd9wKgSTNHBlmGkX+ts3hh ;{id = 55567 (ksk), size = 1024b}
+foo5.org. 3600 IN RRSIG DNSKEY 8 2 3600 20070926134150 20070829134150 55567 foo5.org. wq5nET6vQal5aXvNr6lhUI5VzGJNM52k9RVdNsntiN25GehtBKF/+O2OhrD4YoLCIkMM4dzSSlO/nbbtx/8V8Y5LlA5Kxx3DU+QWpn4iwJg01VwXhJaw8KqK20bUS+PbkG+ZwAqVD1veAdtKR7lfYI35XZojZQ1ReSMWb/vLv4s=
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qname
+ADJUST copy_id copy_query
+REPLY QR AA NOERROR
+SECTION QUESTION
+www.foo5.org. IN A
+SECTION ANSWER
+www.foo5.org. 3600 IN CNAME bok.foo5.org.
+www.foo5.org. 3600 IN RRSIG CNAME 8 3 3600 20070926134150 20070829134150 55567 foo5.org. L/KOVafKFY401Y2k3J+QjkX0XcBTsMperFyhKfTmyQYY3lI5shvdJT0UGu6ogZ9cCWM+tLNyVr804+dfK6QL/wdYOx9hkK/fiePUhAU6lzepJBdg7wotw560Eu6J7UhhtopHKrWa5ElQFG1UFR/qjcx/m4Ms6BgCWh8yWy20N1E=
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NOERROR
+SECTION QUESTION
+alt.foo5.org. IN A
+SECTION ANSWER
+alt.foo5.org. 3600 IN A 4.0.5.6
+alt.foo5.org. 3600 IN RRSIG A 8 3 3600 20070926134150 20070829134150 55567 foo5.org. vG+qffAmazC38iBE2QsZq5kFxNW5Mo+65epMjAA/06syLzjOKkfh8dbe++jQqvwqCqrIBb56miVFDCW1VEYOdh8vReptt9KtbQjXXMfRF39V3ccvbhEfP1xMG8Z8B7tkIBtLvfCNrsfYaccvYgq+gkPeeL1JEiK3ntOukJUbapM=
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NOERROR
+SECTION QUESTION
+bok.foo5.org. IN A
+SECTION ANSWER
+bok.foo5.org. 3600 IN A 1.2.3.4
+bok.foo5.org. 3600 IN RRSIG A 8 3 3600 20070926134150 20070829134150 55567 foo5.org. rlBgWgq0R4yT+bK0CyuZfFJ36dCsZnpvc9/7tShcMAzDPDu4+hgbXuyMWcsnsZjX3ZfR0a4wRwOwH86ZNLLxdkXNO1/bSDq+IsLyXesoVBDmcNvtdq5PgupCNW5I/cBP4tK0DCytXDLRFtU7LOxdgPps4dFANhHU6Q6LboqW4t8=
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NOERROR
+SECTION QUESTION
+alt.foo5.org. IN DS
+SECTION ANSWER
+SECTION AUTHORITY
+foo5.org. 3600 IN SOA ns.foo5.org. host.foo5.org. 2007090422 3600 300 604800 3600
+foo5.org. 3600 IN RRSIG SOA 8 2 3600 20070926134150 20070829134150 55567 foo5.org. cHo00Jg0OI9sRaQV9t6WMybhkRwG6UFx6gEq87HOeOm2gPSbXFjIImyH6l1u8MPdXj8kYcGsUotWUEPuBTfA88bGb/lKfbu4aMD9GaqjB9oZF1iOCf7IdkXqHg/0iZNHOXbUNyNlCJgjkrVdZysJ1D1tAx7qmJgmzsJHerDuQzA=
+alt.foo5.org. 3600 IN NSEC alt2.foo5.org. A RRSIG NSEC
+alt.foo5.org. 3600 IN RRSIG NSEC 8 3 3600 20070926134150 20070829134150 55567 foo5.org. fgOxxCj+ZnRWyfVFlNCS/9UDg4n8+JaSmMjQzsqUoXk5Db9fMzOd3ScYqVxweXC/ER6Ly+XHz9RFVsAOA4I67eWGL6YJ5sA/MUJd3tB4Dk3xp0ycHH0ARvys9YedG9PLUvBY9B5qT/nhrw2N9yRtkq04z6DhjLh3uC0UJKsSiVc=
+ENTRY_END
+RANGE_END
+
+; Test query
+STEP 10 QUERY
+ENTRY_BEGIN
+REPLY RD
+SECTION QUESTION
+foo.org. IN TXT
+ENTRY_END
+
+; It is blocked
+STEP 11 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all
+REPLY QR RD RA AA NXDOMAIN
+SECTION QUESTION
+foo.org. IN TXT
+SECTION ANSWER
+ENTRY_END
+
+; The foo2.org domain has no DS with NSEC. The queries for foo2.org DS and
+; DNSKEY are blocked.
+STEP 20 QUERY
+ENTRY_BEGIN
+REPLY RD
+SECTION QUESTION
+www.foo2.org. IN TXT
+ENTRY_END
+
+STEP 21 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all
+REPLY QR RD RA NOERROR
+SECTION QUESTION
+www.foo2.org. IN TXT
+SECTION ANSWER
+www.foo2.org. IN TXT "a.b.e."
+ENTRY_END
+
+; The foo3.org domain has no DS with NSEC3. The queries for foo3.org DS and
+; DNSKEY are blocked. Because it is nsec3, there is no negative cache entry,
+; and a type DS query is made, that is then blocked.
+STEP 30 QUERY
+ENTRY_BEGIN
+REPLY RD
+SECTION QUESTION
+www.foo3.org. IN TXT
+ENTRY_END
+
+STEP 31 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all
+REPLY QR RD RA NOERROR
+SECTION QUESTION
+www.foo3.org. IN TXT
+SECTION ANSWER
+www.foo3.org. IN TXT "a.b.f."
+ENTRY_END
+
+; This query would use a validation failure for foo3.org from the key cache,
+; if it previously failed.
+STEP 32 QUERY
+ENTRY_BEGIN
+REPLY RD
+SECTION QUESTION
+www2.foo3.org. IN TXT
+ENTRY_END
+
+STEP 33 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all
+REPLY QR RD RA NOERROR
+SECTION QUESTION
+www2.foo3.org. IN TXT
+SECTION ANSWER
+www2.foo3.org. IN TXT "a.b.g."
+ENTRY_END
+
+; This query has a CNAME to www.foo.org. It is signed, but foo.org is blocked,
+; for DS and DNSKEY queries. There is a DS, but the DNSKEY query is blocked.
+STEP 40 QUERY
+ENTRY_BEGIN
+REPLY RD
+SECTION QUESTION
+foo.com. IN TXT
+ENTRY_END
+
+STEP 41 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all
+REPLY QR RD RA NOERROR
+SECTION QUESTION
+foo.com. IN TXT
+SECTION ANSWER
+foo.com. IN CNAME www.foo.org.
+www.foo.org. 3600 IN TXT "a.b.d."
+ENTRY_END
+
+; The foo4.com query has a CNAME to a validly signed domain www.foo4.org,
+; that has a cname to bok.foo4.org. The bok.foo4.org name is RPZ filtered,
+; with a new A record in the response, that is not signed, from RPZ.
+STEP 50 QUERY
+ENTRY_BEGIN
+REPLY RD
+SECTION QUESTION
+foo4.com. IN A
+ENTRY_END
+
+STEP 51 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all
+REPLY QR RD RA AA NOERROR
+SECTION QUESTION
+foo4.com. IN A
+SECTION ANSWER
+foo4.com. IN CNAME www.foo4.org.
+www.foo4.org. IN CNAME bok.foo4.org.
+bok.foo4.org IN A 4.0.5.5
+ENTRY_END
+
+; The foo5.com query has a CNAME to a signed domain www.foo5.org,
+; the www.foo5.org is filtered by RPZ with a different CNAME to another,
+; DNSSEC signed A record, alt.foo5.org, instead of bok.foo5.org.
+STEP 60 QUERY
+ENTRY_BEGIN
+REPLY RD
+SECTION QUESTION
+foo5.com. IN A
+ENTRY_END
+
+STEP 61 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all
+REPLY QR RD RA NOERROR
+SECTION QUESTION
+foo5.com. IN A
+SECTION ANSWER
+foo5.com. IN CNAME www.foo5.org.
+www.foo5.org. IN CNAME alt.foo5.org.
+alt.foo5.org IN A 4.0.5.6
+ENTRY_END
+
+SCENARIO_END
diff --git a/testdata/serve_expired_cached_servfail.rpl b/testdata/serve_expired_cached_servfail.rpl
index f5f4c7030198..edec7447940f 100644
--- a/testdata/serve_expired_cached_servfail.rpl
+++ b/testdata/serve_expired_cached_servfail.rpl
@@ -38,7 +38,7 @@ RANGE_BEGIN 0 20
RANGE_END
; ns.example.com.
-RANGE_BEGIN 30 100
+RANGE_BEGIN 40 100
ADDRESS 1.2.3.4
ENTRY_BEGIN
MATCH opcode qtype qname
diff --git a/testdata/serve_expired_cached_servfail_refresh.rpl b/testdata/serve_expired_cached_servfail_refresh.rpl
index 9b7c1fda16c1..4d14dd948ffb 100644
--- a/testdata/serve_expired_cached_servfail_refresh.rpl
+++ b/testdata/serve_expired_cached_servfail_refresh.rpl
@@ -15,7 +15,7 @@ stub-zone:
stub-addr: 1.2.3.4
CONFIG_END
-SCENARIO_BEGIN Test serve-expired with client-timeout and a SERVFAIL upstream reply
+SCENARIO_BEGIN Test serve-expired without client-timeout and a SERVFAIL upstream reply
; Scenario overview:
; - query for example.com. IN A
; - answer from upstream is SERVFAIL; will be cached for NORR_TTL(5)
diff --git a/testdata/serve_expired_client_timeout_servfail.rpl b/testdata/serve_expired_client_timeout_servfail.rpl
index 51aa04370da8..cea216d4c60f 100644
--- a/testdata/serve_expired_client_timeout_servfail.rpl
+++ b/testdata/serve_expired_client_timeout_servfail.rpl
@@ -22,7 +22,13 @@ SCENARIO_BEGIN Test serve-expired with client-timeout and a SERVFAIL upstream re
; - check that we get an answer for example.com. IN A with the correct TTL
; - query again right after the TTL expired
; - answer from upstream is servfail
-; - check that we get the expired cached answer instead
+; - (expired cached answer will not be replaced, instead marked as unresolvable for NORR_TTL(5))
+; - check that we get the expired cached answer
+; - query again (the answer is available on the upstream server now)
+; - check that we get the immediate expired answer back instead
+; - (the upstream query does happen after the expired reply and updates the cache)
+; - query again (the upstream has no answer)
+; - check that we get the freshly cached answer
; ns.example.com.
RANGE_BEGIN 0 20
@@ -55,7 +61,7 @@ RANGE_BEGIN 0 20
RANGE_END
; ns.example.com.
-RANGE_BEGIN 30 70
+RANGE_BEGIN 30 40
ADDRESS 1.2.3.4
; response to A query
ENTRY_BEGIN
@@ -67,6 +73,25 @@ RANGE_BEGIN 30 70
ENTRY_END
RANGE_END
+; ns.example.com.
+RANGE_BEGIN 50 60
+ ADDRESS 1.2.3.4
+ ; response to A query
+ ENTRY_BEGIN
+ MATCH opcode qtype qname
+ ADJUST copy_id
+ REPLY QR NOERROR
+ SECTION QUESTION
+ example.com. IN A
+ SECTION ANSWER
+ example.com. 10 IN A 5.6.7.8
+ SECTION AUTHORITY
+ example.com. 10 IN NS ns.example.com.
+ SECTION ADDITIONAL
+ ns.example.com. 10 IN A 1.2.3.4
+ ENTRY_END
+RANGE_END
+
; Query with RD flag
STEP 1 QUERY
ENTRY_BEGIN
@@ -101,7 +126,7 @@ ENTRY_BEGIN
example.com. IN A
ENTRY_END
-; Check that we got a stale answer
+; Check that we got a stale answer because of the upstream SERVFAIL
STEP 40 CHECK_ANSWER
ENTRY_BEGIN
MATCH all ttl ede=3
@@ -116,4 +141,56 @@ ENTRY_BEGIN
ns.example.com. 123 IN A 1.2.3.4
ENTRY_END
+; Query again
+STEP 50 QUERY
+ENTRY_BEGIN
+ REPLY RD DO
+ SECTION QUESTION
+ example.com. IN A
+ENTRY_END
+
+; Allow for upstream query to resolve.
+STEP 51 TRAFFIC
+
+; Check that we got an immediate stale answer because of the previous failure,
+; regardless if upstream has the answer already in this range. The query will
+; be resolved after the immediate cached answer and will cache the result.
+STEP 60 CHECK_ANSWER
+ENTRY_BEGIN
+ MATCH all ttl ede=3
+ REPLY QR RD RA DO NOERROR
+ SECTION QUESTION
+ example.com. IN A
+ SECTION ANSWER
+ example.com. 123 IN A 5.6.7.8
+ SECTION AUTHORITY
+ example.com. 123 IN NS ns.example.com.
+ SECTION ADDITIONAL
+ ns.example.com. 123 IN A 1.2.3.4
+ENTRY_END
+
+; Query again
+STEP 70 QUERY
+ENTRY_BEGIN
+ REPLY RD
+ SECTION QUESTION
+ example.com. IN A
+ENTRY_END
+
+; Check that we got the cached updated answer from the previous step since
+; there is no upstream in this range.
+STEP 80 CHECK_ANSWER
+ENTRY_BEGIN
+ MATCH all ttl
+ REPLY QR RD RA NOERROR
+ SECTION QUESTION
+ example.com. IN A
+ SECTION ANSWER
+ example.com. 10 IN A 5.6.7.8
+ SECTION AUTHORITY
+ example.com. 10 IN NS ns.example.com.
+ SECTION ADDITIONAL
+ ns.example.com. 10 IN A 1.2.3.4
+ENTRY_END
+
SCENARIO_END
diff --git a/testdata/serve_expired_client_timeout_val_bogus.rpl b/testdata/serve_expired_client_timeout_val_bogus.rpl
new file mode 100644
index 000000000000..f4937a16c538
--- /dev/null
+++ b/testdata/serve_expired_client_timeout_val_bogus.rpl
@@ -0,0 +1,317 @@
+; config options
+; The island of trust is at example.com
+server:
+ trust-anchor: "example.com. 3600 IN DS 2854 3 1 46e4ffc6e9a4793b488954bd3f0cc6af0dfb201b"
+ val-override-date: "20070916134226"
+ target-fetch-policy: "0 0 0 0 0"
+ qname-minimisation: "no"
+ fake-sha1: yes
+ trust-anchor-signaling: no
+ minimal-responses: no
+
+ serve-expired: yes
+ serve-expired-client-timeout: 1
+ serve-expired-reply-ttl: 123
+ ede: yes
+ ede-serve-expired: yes
+
+ # No need for AAAA nameserver queries
+ do-ip6: no
+
+stub-zone:
+ name: "."
+ stub-addr: 193.0.14.129 # K.ROOT-SERVERS.NET.
+CONFIG_END
+
+SCENARIO_BEGIN Test serve-expired with client-timeout and bogus answer
+; Scenario overview:
+; - query for www.example.com. IN A
+; - check the answer
+; - wait for the record to expire
+; - (upstream now has a bogus response)
+; - query again for www.example.com. IN A
+; - check that we get the expired valid response instead
+; - query once more
+; - (upstream has the valid response again)
+; - check that we get the immediate expired valid response
+; - (the prefetch query updates the cache with the valid response)
+; - query one last time
+; - check that we get the immediate valid cache response; upstream does not have an answer at this moment
+
+;;
+;; K.ROOT-SERVERS.NET.
+;;
+RANGE_BEGIN 0 100
+ ADDRESS 193.0.14.129
+ ENTRY_BEGIN
+ MATCH opcode qtype qname
+ ADJUST copy_id
+ REPLY QR NOERROR
+ SECTION QUESTION
+ . IN NS
+ SECTION ANSWER
+ . IN NS K.ROOT-SERVERS.NET.
+ SECTION ADDITIONAL
+ K.ROOT-SERVERS.NET. IN A 193.0.14.129
+ ENTRY_END
+
+ ENTRY_BEGIN
+ MATCH opcode
+ ADJUST copy_id copy_query
+ REPLY QR NOERROR
+ SECTION QUESTION
+ www.example.com. IN A
+ SECTION AUTHORITY
+ com. IN NS a.gtld-servers.net.
+ SECTION ADDITIONAL
+ a.gtld-servers.net. IN A 192.5.6.30
+ ENTRY_END
+RANGE_END
+
+;;
+;; a.gtld-servers.net.
+;;
+RANGE_BEGIN 0 100
+ ADDRESS 192.5.6.30
+ ENTRY_BEGIN
+ MATCH opcode qtype qname
+ ADJUST copy_id
+ REPLY QR NOERROR
+ SECTION QUESTION
+ com. IN NS
+ SECTION ANSWER
+ com. IN NS a.gtld-servers.net.
+ SECTION ADDITIONAL
+ a.gtld-servers.net. IN A 192.5.6.30
+ ENTRY_END
+
+ ENTRY_BEGIN
+ MATCH opcode
+ ADJUST copy_id copy_query
+ REPLY QR NOERROR
+ SECTION QUESTION
+ www.example.com. IN A
+ SECTION AUTHORITY
+ example.com. IN NS ns.example.com.
+ SECTION ADDITIONAL
+ ns.example.com. IN A 1.2.3.4
+ ENTRY_END
+RANGE_END
+
+;;
+;; ns.example.com. with generic valid data
+;;
+RANGE_BEGIN 0 100
+ ADDRESS 1.2.3.4
+ ENTRY_BEGIN
+ MATCH opcode qtype qname
+ ADJUST copy_id
+ REPLY QR NOERROR
+ SECTION QUESTION
+ example.com. IN NS
+ SECTION ANSWER
+ example.com. IN NS ns.example.com.
+ example.com. 3600 IN RRSIG NS 3 2 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCN+qHdJxoI/2tNKwsb08pra/G7aAIUAWA5sDdJTbrXA1/3OaesGBAO3sI= ;{id = 2854}
+ SECTION ADDITIONAL
+ ns.example.com. IN A 1.2.3.4
+ ns.example.com. 3600 IN RRSIG A 3 3 3600 20070926135752 20070829135752 2854 example.com. MC0CFQCMSWxVehgOQLoYclB9PIAbNP229AIUeH0vNNGJhjnZiqgIOKvs1EhzqAo= ;{id = 2854}
+ ENTRY_END
+
+ ; response to DNSKEY priming query
+ ENTRY_BEGIN
+ MATCH opcode qtype qname
+ ADJUST copy_id
+ REPLY QR NOERROR
+ SECTION QUESTION
+ example.com. IN DNSKEY
+ SECTION ANSWER
+ example.com. 3600 IN DNSKEY 256 3 3 ALXLUsWqUrY3JYER3T4TBJII s70j+sDS/UT2QRp61SE7S3E EXopNXoFE73JLRmvpi/UrOO/Vz4Se 6wXv/CYCKjGw06U4WRgR YXcpEhJROyNapmdIKSx hOzfLVE1gqA0PweZR8d tY3aNQSRn3sPpwJr6Mi /PqQKAMMrZ9ckJpf1+b QMOOvxgzz2U1GS18b3y ZKcgTMEaJzd/GZYzi/B N2DzQ0MsrSwYXfsNLFO Bbs8PJMW4LYIxeeOe6rUgkWOF 7CC9Dh/dduQ1QrsJhmZAEFfd6ByYV+ ;{id = 2854 (zsk), size = 1688b}
+ example.com. 3600 IN RRSIG DNSKEY 3 2 3600 20070926134802 20070829134802 2854 example.com. MCwCFG1yhRNtTEa3Eno2zhVVuy2EJX3wAhQeLyUp6+UXcpC5qGNu9tkrTEgPUg== ;{id = 2854}
+ SECTION AUTHORITY
+ example.com. IN NS ns.example.com.
+ example.com. 3600 IN RRSIG NS 3 2 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCN+qHdJxoI/2tNKwsb08pra/G7aAIUAWA5sDdJTbrXA1/3OaesGBAO3sI= ;{id = 2854}
+ SECTION ADDITIONAL
+ ns.example.com. IN A 1.2.3.4
+ ns.example.com. 3600 IN RRSIG A 3 3 3600 20070926135752 20070829135752 2854 example.com. MC0CFQCMSWxVehgOQLoYclB9PIAbNP229AIUeH0vNNGJhjnZiqgIOKvs1EhzqAo= ;{id = 2854}
+ ENTRY_END
+RANGE_END
+
+;;
+;; ns.example.com with valid data
+;;
+RANGE_BEGIN 0 10
+ ADDRESS 1.2.3.4
+ ; response to query of interest
+ ENTRY_BEGIN
+ MATCH opcode qtype qname
+ ADJUST copy_id
+ REPLY QR NOERROR
+ SECTION QUESTION
+ www.example.com. IN A
+ SECTION ANSWER
+ www.example.com. IN A 10.20.30.40
+ ns.example.com. 3600 IN RRSIG A 3 3 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCQMyTjn7WWwpwAR1LlVeLpRgZGuQIUCcJDEkwAuzytTDRlYK7nIMwH1CM= ;{id = 2854}
+ SECTION AUTHORITY
+ example.com. IN NS ns.example.com.
+ example.com. 3600 IN RRSIG NS 3 2 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCN+qHdJxoI/2tNKwsb08pra/G7aAIUAWA5sDdJTbrXA1/3OaesGBAO3sI= ;{id = 2854}
+ SECTION ADDITIONAL
+ ns.example.com. IN A 1.2.3.4
+ www.example.com. 3600 IN RRSIG A 3 3 3600 20070926134150 20070829134150 2854 example.com. MC0CFC99iE9K5y2WNgI0gFvBWaTi9wm6AhUAoUqOpDtG5Zct+Qr9F3mSdnbc6V4= ;{id = 2854}
+ ENTRY_END
+RANGE_END
+
+;;
+;; ns.example.com. with bogus data
+;;
+RANGE_BEGIN 20 30
+ ADDRESS 1.2.3.4
+ ; response to query of interest (bogus answer)
+ ENTRY_BEGIN
+ MATCH opcode qtype qname
+ ADJUST copy_id
+ REPLY QR NOERROR
+ SECTION QUESTION
+ www.example.com. IN A
+ SECTION ANSWER
+ www.example.com. IN A 10.20.30.40
+ ns.example.com. 3600 IN RRSIG A 3 3 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCQMyTjn7WWwpwAR1LlVeLpRgZGuQIUCcJDEkwAuzytTDRlYK7nIMwH1CM= ;{id = 2854}
+ SECTION AUTHORITY
+ example.com. IN NS ns.example.com.
+ example.com. 3600 IN RRSIG NS 3 2 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCN+qHdJxoI/2tNKwsb08pra/G7aAIUAWA5sDdJTbrXA1/3OaesGBAO3sI= ;{id = 2854}
+ SECTION ADDITIONAL
+ ns.example.com. IN A 1.2.3.4
+ ;; (valid signature)
+ ;; www.example.com. 3600 IN RRSIG A 3 3 3600 20070926134150 20070829134150 2854 example.com. MC0CFC99iE9K5y2WNgI0gFvBWaTi9wm6AhUAoUqOpDtG5Zct+Qr9F3mSdnbc6V4= ;{id = 2854}
+ ;; (bogus signature)
+ www.example.com. 3600 IN RRSIG A 3 3 3600 20070926134150 20070829134150 2854 example.com.
+ ENTRY_END
+RANGE_END
+
+;;
+;; ns.example.com. with valid data again
+;;
+RANGE_BEGIN 40 60
+ ADDRESS 1.2.3.4
+ ; response to query of interest
+ ENTRY_BEGIN
+ MATCH opcode qtype qname
+ ADJUST copy_id
+ REPLY QR NOERROR
+ SECTION QUESTION
+ www.example.com. IN A
+ SECTION ANSWER
+ www.example.com. IN A 10.20.30.40
+ ns.example.com. 3600 IN RRSIG A 3 3 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCQMyTjn7WWwpwAR1LlVeLpRgZGuQIUCcJDEkwAuzytTDRlYK7nIMwH1CM= ;{id = 2854}
+ SECTION AUTHORITY
+ example.com. IN NS ns.example.com.
+ example.com. 3600 IN RRSIG NS 3 2 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCN+qHdJxoI/2tNKwsb08pra/G7aAIUAWA5sDdJTbrXA1/3OaesGBAO3sI= ;{id = 2854}
+ SECTION ADDITIONAL
+ ns.example.com. IN A 1.2.3.4
+ www.example.com. 3600 IN RRSIG A 3 3 3600 20070926134150 20070829134150 2854 example.com. MC0CFC99iE9K5y2WNgI0gFvBWaTi9wm6AhUAoUqOpDtG5Zct+Qr9F3mSdnbc6V4= ;{id = 2854}
+ ENTRY_END
+RANGE_END
+
+STEP 1 QUERY
+ENTRY_BEGIN
+REPLY RD DO
+SECTION QUESTION
+www.example.com. IN A
+ENTRY_END
+
+; recursion happens here.
+STEP 10 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all ttl
+REPLY QR RD RA AD DO NOERROR
+SECTION QUESTION
+www.example.com. IN A
+SECTION ANSWER
+www.example.com. IN A 10.20.30.40
+www.example.com. 3600 IN RRSIG A 3 3 3600 20070926134150 20070829134150 2854 example.com. MC0CFC99iE9K5y2WNgI0gFvBWaTi9wm6AhUAoUqOpDtG5Zct+Qr9F3mSdnbc6V4= ;{id = 2854}
+SECTION AUTHORITY
+example.com. IN NS ns.example.com.
+example.com. 3600 IN RRSIG NS 3 2 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCN+qHdJxoI/2tNKwsb08pra/G7aAIUAWA5sDdJTbrXA1/3OaesGBAO3sI= ;{id = 2854}
+SECTION ADDITIONAL
+ns.example.com. IN A 1.2.3.4
+ns.example.com. 3600 IN RRSIG A 3 3 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCQMyTjn7WWwpwAR1LlVeLpRgZGuQIUCcJDEkwAuzytTDRlYK7nIMwH1CM= ;{id = 2854}
+ENTRY_END
+
+STEP 11 TIME_PASSES ELAPSE 3601
+
+STEP 20 QUERY
+ENTRY_BEGIN
+REPLY RD DO
+SECTION QUESTION
+www.example.com. IN A
+ENTRY_END
+
+; expired answer because upstream is bogus
+STEP 30 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all ttl ede=3
+REPLY QR RD RA AD DO NOERROR
+SECTION QUESTION
+www.example.com. IN A
+SECTION ANSWER
+www.example.com. 123 IN A 10.20.30.40
+www.example.com. 123 IN RRSIG A 3 3 3600 20070926134150 20070829134150 2854 example.com. MC0CFC99iE9K5y2WNgI0gFvBWaTi9wm6AhUAoUqOpDtG5Zct+Qr9F3mSdnbc6V4= ;{id = 2854}
+SECTION AUTHORITY
+example.com. 123 IN NS ns.example.com.
+example.com. 123 IN RRSIG NS 3 2 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCN+qHdJxoI/2tNKwsb08pra/G7aAIUAWA5sDdJTbrXA1/3OaesGBAO3sI= ;{id = 2854}
+SECTION ADDITIONAL
+ns.example.com. 123 IN A 1.2.3.4
+ns.example.com. 123 IN RRSIG A 3 3 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCQMyTjn7WWwpwAR1LlVeLpRgZGuQIUCcJDEkwAuzytTDRlYK7nIMwH1CM= ;{id = 2854}
+ENTRY_END
+
+STEP 40 QUERY
+ENTRY_BEGIN
+REPLY RD DO
+SECTION QUESTION
+www.example.com. IN A
+ENTRY_END
+
+; immediate cached answer because upstream is valid again
+STEP 50 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all ttl ede=3
+REPLY QR RD RA AD DO NOERROR
+SECTION QUESTION
+www.example.com. IN A
+SECTION ANSWER
+www.example.com. 123 IN A 10.20.30.40
+www.example.com. 123 IN RRSIG A 3 3 3600 20070926134150 20070829134150 2854 example.com. MC0CFC99iE9K5y2WNgI0gFvBWaTi9wm6AhUAoUqOpDtG5Zct+Qr9F3mSdnbc6V4= ;{id = 2854}
+SECTION AUTHORITY
+example.com. 123 IN NS ns.example.com.
+example.com. 123 IN RRSIG NS 3 2 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCN+qHdJxoI/2tNKwsb08pra/G7aAIUAWA5sDdJTbrXA1/3OaesGBAO3sI= ;{id = 2854}
+SECTION ADDITIONAL
+ns.example.com. 123 IN A 1.2.3.4
+ns.example.com. 123 IN RRSIG A 3 3 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCQMyTjn7WWwpwAR1LlVeLpRgZGuQIUCcJDEkwAuzytTDRlYK7nIMwH1CM= ;{id = 2854}
+ENTRY_END
+
+; upstream query is resolved before this query comes in
+STEP 60 QUERY
+ENTRY_BEGIN
+REPLY RD DO
+SECTION QUESTION
+www.example.com. IN A
+ENTRY_END
+
+; prefetch query updated the cache, since there is no upstream response in this range
+STEP 70 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all ttl
+REPLY QR RD RA AD DO NOERROR
+SECTION QUESTION
+www.example.com. IN A
+SECTION ANSWER
+www.example.com. IN A 10.20.30.40
+www.example.com. 3600 IN RRSIG A 3 3 3600 20070926134150 20070829134150 2854 example.com. MC0CFC99iE9K5y2WNgI0gFvBWaTi9wm6AhUAoUqOpDtG5Zct+Qr9F3mSdnbc6V4= ;{id = 2854}
+SECTION AUTHORITY
+example.com. IN NS ns.example.com.
+example.com. 3600 IN RRSIG NS 3 2 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCN+qHdJxoI/2tNKwsb08pra/G7aAIUAWA5sDdJTbrXA1/3OaesGBAO3sI= ;{id = 2854}
+SECTION ADDITIONAL
+ns.example.com. IN A 1.2.3.4
+ns.example.com. 3600 IN RRSIG A 3 3 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCQMyTjn7WWwpwAR1LlVeLpRgZGuQIUCcJDEkwAuzytTDRlYK7nIMwH1CM= ;{id = 2854}
+ENTRY_END
+
+SCENARIO_END
diff --git a/testdata/serve_expired_client_timeout_val_insecure_delegation.rpl b/testdata/serve_expired_client_timeout_val_insecure_delegation.rpl
new file mode 100644
index 000000000000..6654a2c68409
--- /dev/null
+++ b/testdata/serve_expired_client_timeout_val_insecure_delegation.rpl
@@ -0,0 +1,247 @@
+; config options
+server:
+ trust-anchor: "example. DNSKEY 257 3 7 AwEAAcUlFV1vhmqx6NSOUOq2R/dsR7Xm3upJ ( j7IommWSpJABVfW8Q0rOvXdM6kzt+TAu92L9 AbsUdblMFin8CVF3n4s= )"
+ val-override-date: "20120420235959"
+ val-max-restart: 0
+ outbound-msg-retry: 0
+ target-fetch-policy: "0 0 0 0 0"
+ qname-minimisation: "no"
+ fake-sha1: yes
+ trust-anchor-signaling: no
+ minimal-responses: no
+ rrset-roundrobin: no
+
+ serve-expired: yes
+ serve-expired-client-timeout: 1
+ serve-expired-reply-ttl: 123
+ ede: yes
+ ede-serve-expired: yes
+
+ # No need for AAAA nameserver queries
+ do-ip6: no
+
+stub-zone:
+ name: "."
+ stub-addr: 193.0.14.129 # K.ROOT-SERVERS.NET.
+CONFIG_END
+
+SCENARIO_BEGIN Test serve-expired with client-timeout and failed DNSSEC parent of insecure zone
+; Scenario overview:
+; - query for mc.c.example. IN MX
+; - check the answer
+; - wait for all the records to expire
+; - (example. now has a bogus DNSKEY response)
+; - query again for mc.c.example. IN MX
+; - (validator fails priming the trust anchor because of the bogus DNSKEY)
+; - check that we get the expired insecure response instead
+
+;;
+;; K.ROOT-SERVERS.NET.
+;;
+RANGE_BEGIN 0 100
+ ADDRESS 193.0.14.129
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NOERROR
+SECTION QUESTION
+. IN NS
+SECTION ANSWER
+. IN NS K.ROOT-SERVERS.NET.
+SECTION ADDITIONAL
+K.ROOT-SERVERS.NET. IN A 193.0.14.129
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+. IN A
+SECTION AUTHORITY
+example. IN NS ns1.example.
+SECTION ADDITIONAL
+ns1.example. IN A 192.0.2.1
+ENTRY_END
+RANGE_END
+
+;;
+;; ns1.example. generic data
+;;
+RANGE_BEGIN 0 100
+ ADDRESS 192.0.2.1
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id copy_query
+REPLY QR REFUSED
+SECTION QUESTION
+example. IN NS
+SECTION ANSWER
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NOERROR
+SECTION QUESTION
+ns1.example. IN A
+SECTION ANSWER
+ns1.example. IN A 192.0.2.1
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA DO NOERROR
+SECTION QUESTION
+mc.c.example. IN MX
+SECTION AUTHORITY
+;; NSEC3 RR that covers the "next closer" name (c.example)
+;; H(c.example) = 4g6p9u5gvfshp30pqecj98b3maqbn1ck
+35mthgpgcu1qg68fab165klnsnk3dpvl.example. NSEC3 1 1 12 aabbccdd ( b4um86eghhds6nea196smvmlo4ors995 NS DS RRSIG )
+35mthgpgcu1qg68fab165klnsnk3dpvl.example. RRSIG NSEC3 7 2 3600 20150420235959 20051021000000 ( 40430 example. g6jPUUpduAJKRljUsN8gB4UagAX0NxY9shwQ Aynzo8EUWH+z6hEIBlUTPGj15eZll6VhQqgZ XtAIR3chwgW+SA== )
+;; NSEC3 RR that matches the closest encloser (example)
+;; H(example) = 0p9mhaveqvm6t7vbl5lop2u3t2rp3tom
+0p9mhaveqvm6t7vbl5lop2u3t2rp3tom.example. NSEC3 1 1 12 aabbccdd ( 2t7b4g4vsa5smi47k61mv5bv1a22bojr MX DNSKEY NS SOA NSEC3PARAM RRSIG )
+0p9mhaveqvm6t7vbl5lop2u3t2rp3tom.example. RRSIG NSEC3 7 2 3600 20150420235959 20051021000000 ( 40430 example. OSgWSm26B+cS+dDL8b5QrWr/dEWhtCsKlwKL IBHYH6blRxK9rC0bMJPwQ4mLIuw85H2EY762 BOCXJZMnpuwhpA== )
+c.example. NS ns1.c.example.
+SECTION ADDITIONAL
+ns1.c.example. A 192.0.2.7
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA DO NOERROR
+SECTION QUESTION
+c.example. IN DS
+SECTION AUTHORITY
+;; NSEC3 RR that covers the "next closer" name (c.example)
+;; H(c.example) = 4g6p9u5gvfshp30pqecj98b3maqbn1ck
+35mthgpgcu1qg68fab165klnsnk3dpvl.example. NSEC3 1 1 12 aabbccdd ( b4um86eghhds6nea196smvmlo4ors995 NS DS RRSIG )
+35mthgpgcu1qg68fab165klnsnk3dpvl.example. RRSIG NSEC3 7 2 3600 20150420235959 20051021000000 ( 40430 example. g6jPUUpduAJKRljUsN8gB4UagAX0NxY9shwQ Aynzo8EUWH+z6hEIBlUTPGj15eZll6VhQqgZ XtAIR3chwgW+SA== )
+;; NSEC3 RR that matches the closest encloser (example)
+;; H(example) = 0p9mhaveqvm6t7vbl5lop2u3t2rp3tom
+0p9mhaveqvm6t7vbl5lop2u3t2rp3tom.example. NSEC3 1 1 12 aabbccdd ( 2t7b4g4vsa5smi47k61mv5bv1a22bojr MX DNSKEY NS SOA NSEC3PARAM RRSIG )
+0p9mhaveqvm6t7vbl5lop2u3t2rp3tom.example. RRSIG NSEC3 7 2 3600 20150420235959 20051021000000 ( 40430 example. OSgWSm26B+cS+dDL8b5QrWr/dEWhtCsKlwKL IBHYH6blRxK9rC0bMJPwQ4mLIuw85H2EY762 BOCXJZMnpuwhpA== )
+ENTRY_END
+RANGE_END
+
+;;
+;; ns1.example. with valid DNSKEY data
+;;
+RANGE_BEGIN 0 20
+ ADDRESS 192.0.2.1
+; response to DNSKEY priming query
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NOERROR
+SECTION QUESTION
+example. IN DNSKEY
+SECTION ANSWER
+example. DNSKEY 256 3 7 AwEAAaetidLzsKWUt4swWR8yu0wPHPiUi8LU ( sAD0QPWU+wzt89epO6tHzkMBVDkC7qphQO2h TY4hHn9npWFRw5BYubE= )
+example. DNSKEY 257 3 7 AwEAAcUlFV1vhmqx6NSOUOq2R/dsR7Xm3upJ ( j7IommWSpJABVfW8Q0rOvXdM6kzt+TAu92L9 AbsUdblMFin8CVF3n4s= )
+example. RRSIG DNSKEY 7 1 3600 20150420235959 ( 20051021000000 12708 example. AuU4juU9RaxescSmStrQks3Gh9FblGBlVU31 uzMZ/U/FpsUb8aC6QZS+sTsJXnLnz7flGOsm MGQZf3bH+QsCtg== )
+ENTRY_END
+RANGE_END
+
+;;
+;; ns1.example. with bogus DNSKEY data
+;;
+RANGE_BEGIN 30 40
+ ADDRESS 192.0.2.1
+; response to DNSKEY priming query
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NOERROR
+SECTION QUESTION
+example. IN DNSKEY
+SECTION ANSWER
+example. DNSKEY 256 3 7 AwEAAaetidLzsKWUt4swWR8yu0wPHPiUi8LU ( sAD0QPWU+wzt89epO6tHzkMBVDkC7qphQO2h TY4hHn9npWFRw5BYubE= )
+example. DNSKEY 257 3 7 AwEAAcUlFV1vhmqx6NSOUOq2R/dsR7Xm3upJ ( j7IommWSpJABVfW8Q0rOvXdM6kzt+TAu92L9 AbsUdblMFin8CVF3n4s= )
+;; (bogus signature)
+example. RRSIG DNSKEY 7 1 3600 20150420235959 20051021000000 12708 example.
+ENTRY_END
+RANGE_END
+
+;;
+;; ns1.c.example.
+;;
+RANGE_BEGIN 0 100
+ ADDRESS 192.0.2.7
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NOERROR
+SECTION QUESTION
+c.example. IN NS
+SECTION ANSWER
+c.example. NS ns1.c.example.
+SECTION ADDITIONAL
+ns1.c.example. A 192.0.2.7
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NOERROR
+SECTION QUESTION
+mc.c.example. IN MX
+SECTION ANSWER
+mc.c.example. IN MX 50 mx.c.example.
+SECTION AUTHORITY
+c.example. NS ns1.c.example.
+SECTION ADDITIONAL
+ns1.c.example. A 192.0.2.7
+ENTRY_END
+RANGE_END
+
+
+STEP 0 QUERY
+ENTRY_BEGIN
+REPLY RD DO
+SECTION QUESTION
+mc.c.example. IN MX
+ENTRY_END
+
+; recursion happens here.
+STEP 10 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all ttl
+REPLY QR RD RA DO NOERROR
+SECTION QUESTION
+mc.c.example. IN MX
+SECTION ANSWER
+mc.c.example. IN MX 50 mx.c.example.
+SECTION AUTHORITY
+c.example. NS ns1.c.example.
+SECTION ADDITIONAL
+ns1.c.example. A 192.0.2.7
+ENTRY_END
+
+STEP 20 TIME_PASSES ELAPSE 3601
+
+STEP 30 QUERY
+ENTRY_BEGIN
+REPLY RD DO
+SECTION QUESTION
+mc.c.example. IN MX
+ENTRY_END
+
+STEP 40 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all ttl ede=3
+REPLY QR RD RA DO NOERROR
+SECTION QUESTION
+mc.c.example. IN MX
+SECTION ANSWER
+mc.c.example. 123 IN MX 50 mx.c.example.
+SECTION AUTHORITY
+c.example. 123 NS ns1.c.example.
+SECTION ADDITIONAL
+ns1.c.example. 123 A 192.0.2.7
+ENTRY_END
+
+SCENARIO_END
diff --git a/testdata/serve_expired_ttl_reset.rpl b/testdata/serve_expired_ttl_reset.rpl
new file mode 100644
index 000000000000..521d5a0f04ca
--- /dev/null
+++ b/testdata/serve_expired_ttl_reset.rpl
@@ -0,0 +1,102 @@
+; config options go here.
+server:
+ serve-expired: yes
+ serve-expired-ttl: 1
+ serve-expired-ttl-reset: yes
+ serve-expired-reply-ttl: 123
+ ede: yes
+ ede-serve-expired: yes
+forward-zone: name: "." forward-addr: 216.0.0.1
+CONFIG_END
+SCENARIO_BEGIN Serve expired ttl with reset on forwarder with a timeout on upstream query
+; Scenario overview:
+; - Send query
+; - Get reply
+; - Wait for it to expire (+ serve-expired-ttl)
+; - Send query again
+; - Upstream timeouts
+; - Error response from iterator SERVFAIL, resets expired-ttl on cache
+; - Check we are getting the SERVFAIL response
+; - Query again
+; - Check we are getting the expired answer
+; - Upstream still timeouts
+
+STEP 1 QUERY
+ENTRY_BEGIN
+REPLY RD
+SECTION QUESTION
+www.example.com. IN A
+ENTRY_END
+
+; Upstream reply
+STEP 2 REPLY
+ENTRY_BEGIN
+REPLY QR AA NOERROR
+SECTION QUESTION
+www.example.com. IN A
+SECTION ANSWER
+www.example.com. 10 IN A 0.0.0.0
+ENTRY_END
+
+STEP 3 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all ttl
+REPLY QR RA RD NOERROR
+SECTION QUESTION
+www.example.com. IN A
+SECTION ANSWER
+www.example.com. 10 IN A 0.0.0.0
+ENTRY_END
+
+; Expire the record (+ serve-expired-ttl)
+STEP 4 TIME_PASSES ELAPSE 12
+
+STEP 5 QUERY
+ENTRY_BEGIN
+REPLY RD
+SECTION QUESTION
+www.example.com. IN A
+ENTRY_END
+
+; But the pending query times out!
+; outbound-msg-retry times timeout.
+STEP 6 TIMEOUT
+STEP 7 TIMEOUT
+STEP 8 TIMEOUT
+STEP 9 TIMEOUT
+STEP 10 TIMEOUT
+
+; Returns servfail
+; but error response from iterator resets the expired ttl
+STEP 11 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all ttl
+REPLY QR RA RD SERVFAIL
+SECTION QUESTION
+www.example.com. IN A
+ENTRY_END
+
+; Query again
+STEP 12 QUERY
+ENTRY_BEGIN
+REPLY RD DO
+SECTION QUESTION
+www.example.com. IN A
+ENTRY_END
+
+; Check that we get the expired answer
+STEP 13 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all ttl ede=3
+REPLY QR RA RD DO NOERROR
+SECTION QUESTION
+www.example.com. IN A
+SECTION ANSWER
+www.example.com. 123 IN A 0.0.0.0
+ENTRY_END
+
+; But the pending query times out!
+; Only one because RTT reached the limit.
+STEP 16 TIMEOUT
+
+SCENARIO_END
diff --git a/testdata/serve_expired_val_bogus.rpl b/testdata/serve_expired_val_bogus.rpl
new file mode 100644
index 000000000000..35365beef973
--- /dev/null
+++ b/testdata/serve_expired_val_bogus.rpl
@@ -0,0 +1,316 @@
+; config options
+; The island of trust is at example.com
+server:
+ trust-anchor: "example.com. 3600 IN DS 2854 3 1 46e4ffc6e9a4793b488954bd3f0cc6af0dfb201b"
+ val-override-date: "20070916134226"
+ target-fetch-policy: "0 0 0 0 0"
+ qname-minimisation: "no"
+ fake-sha1: yes
+ trust-anchor-signaling: no
+ minimal-responses: no
+
+ serve-expired: yes
+ serve-expired-reply-ttl: 123
+ ede: yes
+ ede-serve-expired: yes
+
+ # No need for AAAA nameserver queries
+ do-ip6: no
+
+stub-zone:
+ name: "."
+ stub-addr: 193.0.14.129 # K.ROOT-SERVERS.NET.
+CONFIG_END
+
+SCENARIO_BEGIN Test serve-expired with client-timeout and bogus answer
+; Scenario overview:
+; - query for www.example.com. IN A
+; - check the answer
+; - wait for the record to expire
+; - (upstream now has a bogus response)
+; - query again for www.example.com. IN A
+; - check that we get the immediate expired valid response
+; - (prefetch response is bogus and is not cached)
+; - query once more
+; - check that we still get the immediate expired valid response and not the fresh bogus one
+; - (upstream has a valid response again; prefetch will update the cache)
+; - query one last time
+; - check that we get an immediate valid cache response
+
+;;
+;; K.ROOT-SERVERS.NET.
+;;
+RANGE_BEGIN 0 100
+ ADDRESS 193.0.14.129
+ ENTRY_BEGIN
+ MATCH opcode qtype qname
+ ADJUST copy_id
+ REPLY QR NOERROR
+ SECTION QUESTION
+ . IN NS
+ SECTION ANSWER
+ . IN NS K.ROOT-SERVERS.NET.
+ SECTION ADDITIONAL
+ K.ROOT-SERVERS.NET. IN A 193.0.14.129
+ ENTRY_END
+
+ ENTRY_BEGIN
+ MATCH opcode
+ ADJUST copy_id copy_query
+ REPLY QR NOERROR
+ SECTION QUESTION
+ www.example.com. IN A
+ SECTION AUTHORITY
+ com. IN NS a.gtld-servers.net.
+ SECTION ADDITIONAL
+ a.gtld-servers.net. IN A 192.5.6.30
+ ENTRY_END
+RANGE_END
+
+;;
+;; a.gtld-servers.net.
+;;
+RANGE_BEGIN 0 100
+ ADDRESS 192.5.6.30
+ ENTRY_BEGIN
+ MATCH opcode qtype qname
+ ADJUST copy_id
+ REPLY QR NOERROR
+ SECTION QUESTION
+ com. IN NS
+ SECTION ANSWER
+ com. IN NS a.gtld-servers.net.
+ SECTION ADDITIONAL
+ a.gtld-servers.net. IN A 192.5.6.30
+ ENTRY_END
+
+ ENTRY_BEGIN
+ MATCH opcode
+ ADJUST copy_id copy_query
+ REPLY QR NOERROR
+ SECTION QUESTION
+ www.example.com. IN A
+ SECTION AUTHORITY
+ example.com. IN NS ns.example.com.
+ SECTION ADDITIONAL
+ ns.example.com. IN A 1.2.3.4
+ ENTRY_END
+RANGE_END
+
+;;
+;; ns.example.com. with generic data
+;;
+RANGE_BEGIN 0 100
+ ADDRESS 1.2.3.4
+ ENTRY_BEGIN
+ MATCH opcode qtype qname
+ ADJUST copy_id
+ REPLY QR NOERROR
+ SECTION QUESTION
+ example.com. IN NS
+ SECTION ANSWER
+ example.com. IN NS ns.example.com.
+ example.com. 3600 IN RRSIG NS 3 2 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCN+qHdJxoI/2tNKwsb08pra/G7aAIUAWA5sDdJTbrXA1/3OaesGBAO3sI= ;{id = 2854}
+ SECTION ADDITIONAL
+ ns.example.com. IN A 1.2.3.4
+ ns.example.com. 3600 IN RRSIG A 3 3 3600 20070926135752 20070829135752 2854 example.com. MC0CFQCMSWxVehgOQLoYclB9PIAbNP229AIUeH0vNNGJhjnZiqgIOKvs1EhzqAo= ;{id = 2854}
+ ENTRY_END
+
+ ; response to DNSKEY priming query
+ ENTRY_BEGIN
+ MATCH opcode qtype qname
+ ADJUST copy_id
+ REPLY QR NOERROR
+ SECTION QUESTION
+ example.com. IN DNSKEY
+ SECTION ANSWER
+ example.com. 3600 IN DNSKEY 256 3 3 ALXLUsWqUrY3JYER3T4TBJII s70j+sDS/UT2QRp61SE7S3E EXopNXoFE73JLRmvpi/UrOO/Vz4Se 6wXv/CYCKjGw06U4WRgR YXcpEhJROyNapmdIKSx hOzfLVE1gqA0PweZR8d tY3aNQSRn3sPpwJr6Mi /PqQKAMMrZ9ckJpf1+b QMOOvxgzz2U1GS18b3y ZKcgTMEaJzd/GZYzi/B N2DzQ0MsrSwYXfsNLFO Bbs8PJMW4LYIxeeOe6rUgkWOF 7CC9Dh/dduQ1QrsJhmZAEFfd6ByYV+ ;{id = 2854 (zsk), size = 1688b}
+ example.com. 3600 IN RRSIG DNSKEY 3 2 3600 20070926134802 20070829134802 2854 example.com. MCwCFG1yhRNtTEa3Eno2zhVVuy2EJX3wAhQeLyUp6+UXcpC5qGNu9tkrTEgPUg== ;{id = 2854}
+ SECTION AUTHORITY
+ example.com. IN NS ns.example.com.
+ example.com. 3600 IN RRSIG NS 3 2 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCN+qHdJxoI/2tNKwsb08pra/G7aAIUAWA5sDdJTbrXA1/3OaesGBAO3sI= ;{id = 2854}
+ SECTION ADDITIONAL
+ ns.example.com. IN A 1.2.3.4
+ ns.example.com. 3600 IN RRSIG A 3 3 3600 20070926135752 20070829135752 2854 example.com. MC0CFQCMSWxVehgOQLoYclB9PIAbNP229AIUeH0vNNGJhjnZiqgIOKvs1EhzqAo= ;{id = 2854}
+ ENTRY_END
+RANGE_END
+
+;;
+;; ns.example.com. with valid data
+;;
+RANGE_BEGIN 0 10
+ ADDRESS 1.2.3.4
+ ; response to query of interest
+ ENTRY_BEGIN
+ MATCH opcode qtype qname
+ ADJUST copy_id
+ REPLY QR NOERROR
+ SECTION QUESTION
+ www.example.com. IN A
+ SECTION ANSWER
+ www.example.com. IN A 10.20.30.40
+ ns.example.com. 3600 IN RRSIG A 3 3 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCQMyTjn7WWwpwAR1LlVeLpRgZGuQIUCcJDEkwAuzytTDRlYK7nIMwH1CM= ;{id = 2854}
+ SECTION AUTHORITY
+ example.com. IN NS ns.example.com.
+ example.com. 3600 IN RRSIG NS 3 2 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCN+qHdJxoI/2tNKwsb08pra/G7aAIUAWA5sDdJTbrXA1/3OaesGBAO3sI= ;{id = 2854}
+ SECTION ADDITIONAL
+ ns.example.com. IN A 1.2.3.4
+ www.example.com. 3600 IN RRSIG A 3 3 3600 20070926134150 20070829134150 2854 example.com. MC0CFC99iE9K5y2WNgI0gFvBWaTi9wm6AhUAoUqOpDtG5Zct+Qr9F3mSdnbc6V4= ;{id = 2854}
+ ENTRY_END
+RANGE_END
+
+;;
+;; ns.example.com. with bogus data
+;;
+RANGE_BEGIN 20 40
+ ADDRESS 1.2.3.4
+ ; response to query of interest (bogus answer)
+ ENTRY_BEGIN
+ MATCH opcode qtype qname
+ ADJUST copy_id
+ REPLY QR NOERROR
+ SECTION QUESTION
+ www.example.com. IN A
+ SECTION ANSWER
+ www.example.com. IN A 10.20.30.40
+ ns.example.com. 3600 IN RRSIG A 3 3 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCQMyTjn7WWwpwAR1LlVeLpRgZGuQIUCcJDEkwAuzytTDRlYK7nIMwH1CM= ;{id = 2854}
+ SECTION AUTHORITY
+ example.com. IN NS ns.example.com.
+ example.com. 3600 IN RRSIG NS 3 2 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCN+qHdJxoI/2tNKwsb08pra/G7aAIUAWA5sDdJTbrXA1/3OaesGBAO3sI= ;{id = 2854}
+ SECTION ADDITIONAL
+ ns.example.com. IN A 1.2.3.4
+ ;; (valid signature)
+ ;; www.example.com. 3600 IN RRSIG A 3 3 3600 20070926134150 20070829134150 2854 example.com. MC0CFC99iE9K5y2WNgI0gFvBWaTi9wm6AhUAoUqOpDtG5Zct+Qr9F3mSdnbc6V4= ;{id = 2854}
+ ;; (bogus signature)
+ www.example.com. 3600 IN RRSIG A 3 3 3600 20070926134150 20070829134150 2854 example.com.
+ ENTRY_END
+RANGE_END
+
+;;
+;; ns.example.com. with valid data again
+;;
+RANGE_BEGIN 50 100
+ ADDRESS 1.2.3.4
+ ; response to query of interest
+ ENTRY_BEGIN
+ MATCH opcode qtype qname
+ ADJUST copy_id
+ REPLY QR NOERROR
+ SECTION QUESTION
+ www.example.com. IN A
+ SECTION ANSWER
+ www.example.com. IN A 10.20.30.40
+ ns.example.com. 3600 IN RRSIG A 3 3 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCQMyTjn7WWwpwAR1LlVeLpRgZGuQIUCcJDEkwAuzytTDRlYK7nIMwH1CM= ;{id = 2854}
+ SECTION AUTHORITY
+ example.com. IN NS ns.example.com.
+ example.com. 3600 IN RRSIG NS 3 2 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCN+qHdJxoI/2tNKwsb08pra/G7aAIUAWA5sDdJTbrXA1/3OaesGBAO3sI= ;{id = 2854}
+ SECTION ADDITIONAL
+ ns.example.com. IN A 1.2.3.4
+ www.example.com. 3600 IN RRSIG A 3 3 3600 20070926134150 20070829134150 2854 example.com. MC0CFC99iE9K5y2WNgI0gFvBWaTi9wm6AhUAoUqOpDtG5Zct+Qr9F3mSdnbc6V4= ;{id = 2854}
+ ENTRY_END
+RANGE_END
+
+
+STEP 1 QUERY
+ENTRY_BEGIN
+REPLY RD DO
+SECTION QUESTION
+www.example.com. IN A
+ENTRY_END
+
+; this is the valid answer
+STEP 10 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all ttl
+REPLY QR RD RA AD DO NOERROR
+SECTION QUESTION
+www.example.com. IN A
+SECTION ANSWER
+www.example.com. IN A 10.20.30.40
+www.example.com. 3600 IN RRSIG A 3 3 3600 20070926134150 20070829134150 2854 example.com. MC0CFC99iE9K5y2WNgI0gFvBWaTi9wm6AhUAoUqOpDtG5Zct+Qr9F3mSdnbc6V4= ;{id = 2854}
+SECTION AUTHORITY
+example.com. IN NS ns.example.com.
+example.com. 3600 IN RRSIG NS 3 2 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCN+qHdJxoI/2tNKwsb08pra/G7aAIUAWA5sDdJTbrXA1/3OaesGBAO3sI= ;{id = 2854}
+SECTION ADDITIONAL
+ns.example.com. IN A 1.2.3.4
+ns.example.com. 3600 IN RRSIG A 3 3 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCQMyTjn7WWwpwAR1LlVeLpRgZGuQIUCcJDEkwAuzytTDRlYK7nIMwH1CM= ;{id = 2854}
+ENTRY_END
+
+STEP 11 TIME_PASSES ELAPSE 3601
+
+STEP 20 QUERY
+ENTRY_BEGIN
+REPLY RD DO
+SECTION QUESTION
+www.example.com. IN A
+ENTRY_END
+
+; this is the immediate expired cache response
+STEP 30 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all ttl ede=3
+REPLY QR RD RA AD DO NOERROR
+SECTION QUESTION
+www.example.com. IN A
+SECTION ANSWER
+www.example.com. 123 IN A 10.20.30.40
+www.example.com. 123 IN RRSIG A 3 3 3600 20070926134150 20070829134150 2854 example.com. MC0CFC99iE9K5y2WNgI0gFvBWaTi9wm6AhUAoUqOpDtG5Zct+Qr9F3mSdnbc6V4= ;{id = 2854}
+SECTION AUTHORITY
+example.com. 123 IN NS ns.example.com.
+example.com. 123 IN RRSIG NS 3 2 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCN+qHdJxoI/2tNKwsb08pra/G7aAIUAWA5sDdJTbrXA1/3OaesGBAO3sI= ;{id = 2854}
+SECTION ADDITIONAL
+ns.example.com. 123 IN A 1.2.3.4
+ns.example.com. 123 IN RRSIG A 3 3 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCQMyTjn7WWwpwAR1LlVeLpRgZGuQIUCcJDEkwAuzytTDRlYK7nIMwH1CM= ;{id = 2854}
+ENTRY_END
+
+STEP 40 QUERY
+ENTRY_BEGIN
+REPLY RD DO
+SECTION QUESTION
+www.example.com. IN A
+ENTRY_END
+
+; this is still the immediate cache response because the previous upstream response was bogus
+STEP 50 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all ttl ede=3
+REPLY QR RD RA AD DO NOERROR
+SECTION QUESTION
+www.example.com. IN A
+SECTION ANSWER
+www.example.com. 123 IN A 10.20.30.40
+www.example.com. 123 IN RRSIG A 3 3 3600 20070926134150 20070829134150 2854 example.com. MC0CFC99iE9K5y2WNgI0gFvBWaTi9wm6AhUAoUqOpDtG5Zct+Qr9F3mSdnbc6V4= ;{id = 2854}
+SECTION AUTHORITY
+example.com. 123 IN NS ns.example.com.
+example.com. 123 IN RRSIG NS 3 2 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCN+qHdJxoI/2tNKwsb08pra/G7aAIUAWA5sDdJTbrXA1/3OaesGBAO3sI= ;{id = 2854}
+SECTION ADDITIONAL
+ns.example.com. 123 IN A 1.2.3.4
+ns.example.com. 123 IN RRSIG A 3 3 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCQMyTjn7WWwpwAR1LlVeLpRgZGuQIUCcJDEkwAuzytTDRlYK7nIMwH1CM= ;{id = 2854}
+ENTRY_END
+
+STEP 60 QUERY
+ENTRY_BEGIN
+REPLY RD DO
+SECTION QUESTION
+www.example.com. IN A
+ENTRY_END
+
+; this is the immediate cache response because the previous upstream response was valid
+STEP 70 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all ttl
+REPLY QR RD RA AD DO NOERROR
+SECTION QUESTION
+www.example.com. IN A
+SECTION ANSWER
+www.example.com. IN A 10.20.30.40
+www.example.com. 3600 IN RRSIG A 3 3 3600 20070926134150 20070829134150 2854 example.com. MC0CFC99iE9K5y2WNgI0gFvBWaTi9wm6AhUAoUqOpDtG5Zct+Qr9F3mSdnbc6V4= ;{id = 2854}
+SECTION AUTHORITY
+example.com. IN NS ns.example.com.
+example.com. 3600 IN RRSIG NS 3 2 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCN+qHdJxoI/2tNKwsb08pra/G7aAIUAWA5sDdJTbrXA1/3OaesGBAO3sI= ;{id = 2854}
+SECTION ADDITIONAL
+ns.example.com. IN A 1.2.3.4
+ns.example.com. 3600 IN RRSIG A 3 3 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCQMyTjn7WWwpwAR1LlVeLpRgZGuQIUCcJDEkwAuzytTDRlYK7nIMwH1CM= ;{id = 2854}
+ENTRY_END
+
+SCENARIO_END
diff --git a/testdata/val_negcache_ttl.rpl b/testdata/val_negcache_ttl.rpl
new file mode 100644
index 000000000000..328b9b6ecba8
--- /dev/null
+++ b/testdata/val_negcache_ttl.rpl
@@ -0,0 +1,188 @@
+; config options
+; The island of trust is at testzone.nlnetlabs.nl
+server:
+ trust-anchor: "testzone.nlnetlabs.nl. 3600 IN DS 1444 8 2 07633464c1c7b93abd6fc24c73f904a40f0f304b279a80667d7e33908eed43be"
+ val-override-date: "20180213111425"
+ target-fetch-policy: "0 0 0 0 0"
+ qname-minimisation: "no"
+ trust-anchor-signaling: no
+ aggressive-nsec: yes
+
+stub-zone:
+ name: "testzone.nlnetlabs.nl"
+ stub-addr: 185.49.140.60
+CONFIG_END
+
+SCENARIO_BEGIN Test validator with negative cache TTL (aggressive NSEC)
+; Scenario overview:
+; - query for antelope.testzone.nlnetlabs.nl. IN TXT (NXDOMAIN)
+; - answer from upstream is NXDOMAIN with NSEC records that cover ant.testzone.nlnetlabs.nl
+; - the NSEC records should be cached for 900 seconds only (minimum of SOA)
+; - check that ant.testzone.nlnetlabs.nl gets the synthesized NXDOMAIN from aggressive-nsec
+; - let NSEC records expire
+; - query for ant.testzone.nlnetlabs.nl. IN TXT which is now available on the nameserver
+; - check that aggressive-nsec cannot synthesize NXDOMAIN (expired NSECs) and the query is resolved
+
+; testzone.nlnetlabs.nl nameserver
+RANGE_BEGIN 0 100
+ ADDRESS 185.49.140.60
+
+; response to DNSKEY priming query
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NOERROR
+SECTION QUESTION
+testzone.nlnetlabs.nl. IN DNSKEY
+SECTION ANSWER
+testzone.nlnetlabs.nl. 3600 IN DNSKEY 257 3 8 AwEAAbd9WqjzE2Pynz21OG5doSf9hFzMr5dhzz2waZ3vTa+0o5r7AjTAqmA1yH/B3+aAMihUm5ucZSfVqo7+kOaRE8yFj9aivOmA1n1+JLevJq/oyvQyjxQN2Qb89LyaNUT5oKZIiL+uyyhNW3KDR3SSbQ/GBwQNDHVcZi+JDR3RC0r7 ;{id = 1444 (ksk), size = 1024b}
+testzone.nlnetlabs.nl. 3600 IN RRSIG DNSKEY 8 3 3600 20180313101254 20180213101254 1444 testzone.nlnetlabs.nl. kQ2sc41aQeMxQ7KInz2HrHi4nQcUGdv1olro0GmVYgPvIJh7SqBKW3yZWYeQrbWWwdc3klBERBbBI8gnkNYbl5kX3BBa5su8w71mpTQPRGtMxDTB17daxc0SxpPUxM35CpWU9QlBuDXcu+VNyVUuLvZGGLznlqr6ku888U2Rz+c=
+ENTRY_END
+
+; response for antelope.testzone.nlnetlabs.nl.
+; NSECs cover ant.testzone.nlnetlabs.nl as non-existent.
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NXDOMAIN
+SECTION QUESTION
+antelope.testzone.nlnetlabs.nl. IN TXT
+SECTION ANSWER
+SECTION AUTHORITY
+testzone.nlnetlabs.nl. 3600 IN NSEC alligator.testzone.nlnetlabs.nl. NS SOA RRSIG NSEC DNSKEY
+testzone.nlnetlabs.nl. 3600 IN RRSIG NSEC 8 3 3600 20180313101254 20180213101254 1444 testzone.nlnetlabs.nl. tcW20hZu5Ao+ikM+qjqAlRt3ujNxTKi6kZF3waWJGY7Ldyp9XyWzB1DeoQzaNJ6zflPYFO32RUhj7jWhEIUphG4+lEvm7VGJAdSteUZ2yOppN6eZvOk0Nc0nAGPFGBjLO6ul1Wh1X+jL61q7mWt3nY+IFBZHWmhsi2Qi7vM/W4E=
+alligator.testzone.nlnetlabs.nl. 3600 IN NSEC cheetah.testzone.nlnetlabs.nl. TXT RRSIG NSEC
+alligator.testzone.nlnetlabs.nl. 3600 IN RRSIG NSEC 8 4 3600 20180313101254 20180213101254 1444 testzone.nlnetlabs.nl. Zfkp3kmN8heAuIF/apf6RHhZAoGyXnvZLALRYTKIH7E9XC2wtvG9dZla4WLSr3ndA4d0CFgnKOt8mSVSLyNn232D0ahx4DFAnOJitnt9odT2+2sYhJbwCx38tPKhAUWmIn2jGZGMVjbVbEVi7WyQBrJYQqyhE/lADEDSdQZBNyA=
+testzone.nlnetlabs.nl. 900 IN SOA ns.nlnetlabs.nl. ralph.nlnetlabs.nl. 1 14400 3600 604800 3600
+testzone.nlnetlabs.nl. 900 IN RRSIG SOA 8 3 900 20180313101254 20180213101254 1444 testzone.nlnetlabs.nl. abG0cByo/q5NaDNMz6FPvNvehHqUDhQRwLdvG72315hMGzCavLRWuAB5gieibMCrICH2WVHVj7fisjSuY0iPwf9xZlCGts3Z+xD9D72VRiTz7QXF+JjRWKl+3Uk6c29+pvIRKXC1Ht0r9uBXGmDTaHdV7cZCveoDwIVSngY+mQ0=
+SECTION ADDITIONAL
+ENTRY_END
+
+; No answer for ant.testzone.nlnetlabs.nl in this range
+
+; response for peanut.testzone.nlnetlabs.nl. AAAA
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NOERROR
+SECTION QUESTION
+peanut.testzone.nlnetlabs.nl. IN AAAA
+SECTION AUTHORITY
+peanut.testzone.nlnetlabs.nl. IN NSEC rust.testzone.nlnetlabs.nl. A RRSIG NSEC
+peanut.testzone.nlnetlabs.nl. 3600 IN RRSIG NSEC 8 4 3600 20180313101254 20180213101254 1444 testzone.nlnetlabs.nl. GhUUt3n1oVZCbU5l7XhbtE1kAhFXBRvQRvp/s3INitoHm1D54VERXWR33g+aQMcLAyCOe2TmpJMH1zDSbccf0zabvwEzqDzPmgcPt0KjXUdrN84/2XN+C4U84golbUui61lhhU+6bL8rylPuv3XtqQ4ppXy8sSe+gfsskauhMpg=
+testzone.nlnetlabs.nl. 900 IN SOA ns.nlnetlabs.nl. ralph.nlnetlabs.nl. 1 14400 3600 604800 3600
+testzone.nlnetlabs.nl. 900 IN RRSIG SOA 8 3 900 20180313101254 20180213101254 1444 testzone.nlnetlabs.nl. abG0cByo/q5NaDNMz6FPvNvehHqUDhQRwLdvG72315hMGzCavLRWuAB5gieibMCrICH2WVHVj7fisjSuY0iPwf9xZlCGts3Z+xD9D72VRiTz7QXF+JjRWKl+3Uk6c29+pvIRKXC1Ht0r9uBXGmDTaHdV7cZCveoDwIVSngY+mQ0=
+SECTION ADDITIONAL
+ENTRY_END
+RANGE_END
+
+; testzone.nlnetlabs.nl nameserver
+RANGE_BEGIN 100 200
+ ADDRESS 185.49.140.60
+; response for ant.testzone.nlnetlabs.nl
+ENTRY_BEGIN
+REPLY QR AA NOERROR
+SECTION QUESTION
+ant.testzone.nlnetlabs.nl. IN TXT
+SECTION ANSWER
+ant.testzone.nlnetlabs.nl. TXT "heap"
+ant.testzone.nlnetlabs.nl. 3600 IN RRSIG TXT 8 4 3600 20180313101254 20180213101254 1444 testzone.nlnetlabs.nl. Sn8dBGMSYGGKs7yGWO0CShxbm3ba5Y6ysHyE/HJyFnS8NmsKIx/KVdFPRQx/Jm7a3hektRXrjxetfhfJm0SzJ2UFeKlkE+VJ/Lj2oAETqN1oqqkNr+RDdbKLMzLApMRgrhStSAO1Yb8/8oUIflyrjNbuDbAHSMbkOE+Z49LIais=
+ENTRY_END
+RANGE_END
+
+STEP 1 QUERY
+ENTRY_BEGIN
+REPLY RD DO
+SECTION QUESTION
+antelope.testzone.nlnetlabs.nl. IN TXT
+ENTRY_END
+
+; recursion happens here. Expect NXDOMAIN.
+STEP 10 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all ttl
+REPLY QR RD RA DO AD NXDOMAIN
+SECTION QUESTION
+antelope.testzone.nlnetlabs.nl. IN TXT
+SECTION ANSWER
+SECTION AUTHORITY
+testzone.nlnetlabs.nl. 3600 IN NSEC alligator.testzone.nlnetlabs.nl. NS SOA RRSIG NSEC DNSKEY
+testzone.nlnetlabs.nl. 3600 IN RRSIG NSEC 8 3 3600 20180313101254 20180213101254 1444 testzone.nlnetlabs.nl. tcW20hZu5Ao+ikM+qjqAlRt3ujNxTKi6kZF3waWJGY7Ldyp9XyWzB1DeoQzaNJ6zflPYFO32RUhj7jWhEIUphG4+lEvm7VGJAdSteUZ2yOppN6eZvOk0Nc0nAGPFGBjLO6ul1Wh1X+jL61q7mWt3nY+IFBZHWmhsi2Qi7vM/W4E=
+alligator.testzone.nlnetlabs.nl. 3600 IN NSEC cheetah.testzone.nlnetlabs.nl. TXT RRSIG NSEC
+alligator.testzone.nlnetlabs.nl. 3600 IN RRSIG NSEC 8 4 3600 20180313101254 20180213101254 1444 testzone.nlnetlabs.nl. Zfkp3kmN8heAuIF/apf6RHhZAoGyXnvZLALRYTKIH7E9XC2wtvG9dZla4WLSr3ndA4d0CFgnKOt8mSVSLyNn232D0ahx4DFAnOJitnt9odT2+2sYhJbwCx38tPKhAUWmIn2jGZGMVjbVbEVi7WyQBrJYQqyhE/lADEDSdQZBNyA=
+testzone.nlnetlabs.nl. 900 IN SOA ns.nlnetlabs.nl. ralph.nlnetlabs.nl. 1 14400 3600 604800 3600
+testzone.nlnetlabs.nl. 900 IN RRSIG SOA 8 3 900 20180313101254 20180213101254 1444 testzone.nlnetlabs.nl. abG0cByo/q5NaDNMz6FPvNvehHqUDhQRwLdvG72315hMGzCavLRWuAB5gieibMCrICH2WVHVj7fisjSuY0iPwf9xZlCGts3Z+xD9D72VRiTz7QXF+JjRWKl+3Uk6c29+pvIRKXC1Ht0r9uBXGmDTaHdV7cZCveoDwIVSngY+mQ0=
+SECTION ADDITIONAL
+ENTRY_END
+
+; query for ant.testzone.nlnetlabs.nl (non-existent)
+STEP 11 QUERY
+ENTRY_BEGIN
+REPLY RD DO
+SECTION QUESTION
+ant.testzone.nlnetlabs.nl. IN TXT
+ENTRY_END
+
+; this is the synthesized NXDOMAIN from aggressive-nsec
+STEP 12 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all ttl
+REPLY QR RD RA AD DO NXDOMAIN
+SECTION QUESTION
+ant.testzone.nlnetlabs.nl. IN TXT
+SECTION ANSWER
+SECTION AUTHORITY
+testzone.nlnetlabs.nl. 3600 IN NSEC alligator.testzone.nlnetlabs.nl. NS SOA RRSIG NSEC DNSKEY
+testzone.nlnetlabs.nl. 3600 IN RRSIG NSEC 8 3 3600 20180313101254 20180213101254 1444 testzone.nlnetlabs.nl. tcW20hZu5Ao+ikM+qjqAlRt3ujNxTKi6kZF3waWJGY7Ldyp9XyWzB1DeoQzaNJ6zflPYFO32RUhj7jWhEIUphG4+lEvm7VGJAdSteUZ2yOppN6eZvOk0Nc0nAGPFGBjLO6ul1Wh1X+jL61q7mWt3nY+IFBZHWmhsi2Qi7vM/W4E=
+alligator.testzone.nlnetlabs.nl. 3600 IN NSEC cheetah.testzone.nlnetlabs.nl. TXT RRSIG NSEC
+alligator.testzone.nlnetlabs.nl. 3600 IN RRSIG NSEC 8 4 3600 20180313101254 20180213101254 1444 testzone.nlnetlabs.nl. Zfkp3kmN8heAuIF/apf6RHhZAoGyXnvZLALRYTKIH7E9XC2wtvG9dZla4WLSr3ndA4d0CFgnKOt8mSVSLyNn232D0ahx4DFAnOJitnt9odT2+2sYhJbwCx38tPKhAUWmIn2jGZGMVjbVbEVi7WyQBrJYQqyhE/lADEDSdQZBNyA=
+testzone.nlnetlabs.nl. 900 IN SOA ns.nlnetlabs.nl. ralph.nlnetlabs.nl. 1 14400 3600 604800 3600
+testzone.nlnetlabs.nl. 900 IN RRSIG SOA 8 3 900 20180313101254 20180213101254 1444 testzone.nlnetlabs.nl. abG0cByo/q5NaDNMz6FPvNvehHqUDhQRwLdvG72315hMGzCavLRWuAB5gieibMCrICH2WVHVj7fisjSuY0iPwf9xZlCGts3Z+xD9D72VRiTz7QXF+JjRWKl+3Uk6c29+pvIRKXC1Ht0r9uBXGmDTaHdV7cZCveoDwIVSngY+mQ0=
+ENTRY_END
+
+; Time passes and NSECs should be expired.
+STEP 20 TIME_PASSES ELAPSE 910
+
+; query something that gets the SOA record for the testzone in cache.
+STEP 30 QUERY
+ENTRY_BEGIN
+REPLY RD DO
+SECTION QUESTION
+peanut.testzone.nlnetlabs.nl. IN AAAA
+ENTRY_END
+
+STEP 40 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all ttl
+REPLY QR RD RA AD DO NOERROR
+SECTION QUESTION
+peanut.testzone.nlnetlabs.nl. IN AAAA
+SECTION AUTHORITY
+peanut.testzone.nlnetlabs.nl. IN NSEC rust.testzone.nlnetlabs.nl. A RRSIG NSEC
+peanut.testzone.nlnetlabs.nl. 3600 IN RRSIG NSEC 8 4 3600 20180313101254 20180213101254 1444 testzone.nlnetlabs.nl. GhUUt3n1oVZCbU5l7XhbtE1kAhFXBRvQRvp/s3INitoHm1D54VERXWR33g+aQMcLAyCOe2TmpJMH1zDSbccf0zabvwEzqDzPmgcPt0KjXUdrN84/2XN+C4U84golbUui61lhhU+6bL8rylPuv3XtqQ4ppXy8sSe+gfsskauhMpg=
+testzone.nlnetlabs.nl. 900 IN SOA ns.nlnetlabs.nl. ralph.nlnetlabs.nl. 1 14400 3600 604800 3600
+testzone.nlnetlabs.nl. 900 IN RRSIG SOA 8 3 900 20180313101254 20180213101254 1444 testzone.nlnetlabs.nl. abG0cByo/q5NaDNMz6FPvNvehHqUDhQRwLdvG72315hMGzCavLRWuAB5gieibMCrICH2WVHVj7fisjSuY0iPwf9xZlCGts3Z+xD9D72VRiTz7QXF+JjRWKl+3Uk6c29+pvIRKXC1Ht0r9uBXGmDTaHdV7cZCveoDwIVSngY+mQ0=
+ENTRY_END
+
+; query for ant.testzone.nlnetlabs.nl. In this range it is on the nameserver.
+STEP 110 QUERY
+ENTRY_BEGIN
+REPLY RD DO
+SECTION QUESTION
+ant.testzone.nlnetlabs.nl. IN TXT
+ENTRY_END
+
+; Expect an answer since the 3600 TTL NSECs from STEP 10 should have been
+; limited to 900 and be expired by now.
+STEP 120 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all ttl
+REPLY QR RD RA AD DO NOERROR
+SECTION QUESTION
+ant.testzone.nlnetlabs.nl. IN TXT
+SECTION ANSWER
+ant.testzone.nlnetlabs.nl. TXT "heap"
+ant.testzone.nlnetlabs.nl. 3600 IN RRSIG TXT 8 4 3600 20180313101254 20180213101254 1444 testzone.nlnetlabs.nl. Sn8dBGMSYGGKs7yGWO0CShxbm3ba5Y6ysHyE/HJyFnS8NmsKIx/KVdFPRQx/Jm7a3hektRXrjxetfhfJm0SzJ2UFeKlkE+VJ/Lj2oAETqN1oqqkNr+RDdbKLMzLApMRgrhStSAO1Yb8/8oUIflyrjNbuDbAHSMbkOE+Z49LIais=
+ENTRY_END
+
+SCENARIO_END
diff --git a/testdata/val_negcache_ttl_prefetch.rpl b/testdata/val_negcache_ttl_prefetch.rpl
new file mode 100644
index 000000000000..103c81fbaba4
--- /dev/null
+++ b/testdata/val_negcache_ttl_prefetch.rpl
@@ -0,0 +1,316 @@
+; config options
+; The island of trust is at testzone.nlnetlabs.nl
+server:
+ trust-anchor: "testzone.nlnetlabs.nl. 3600 IN DS 1444 8 2 07633464c1c7b93abd6fc24c73f904a40f0f304b279a80667d7e33908eed43be"
+ val-override-date: "20180213111425"
+ target-fetch-policy: "0 0 0 0 0"
+ qname-minimisation: "no"
+ trust-anchor-signaling: no
+ aggressive-nsec: yes
+ prefetch: yes
+
+stub-zone:
+ name: "testzone.nlnetlabs.nl"
+ stub-addr: 185.49.140.60
+stub-zone:
+ name: "zone2.nlnetlabs.nl"
+ stub-addr: 185.49.140.61
+CONFIG_END
+
+SCENARIO_BEGIN Test validator with negative cache TTL (aggressive NSEC) and some prefetch.
+; The NSEC records are restricted by the TTL of 900 of the SOA record.
+; There are prefetch actions, both with and without a CNAME preceding.
+
+; testzone.nlnetlabs.nl nameserver
+RANGE_BEGIN 0 100
+ ADDRESS 185.49.140.60
+
+; response to DNSKEY priming query
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NOERROR
+SECTION QUESTION
+testzone.nlnetlabs.nl. IN DNSKEY
+SECTION ANSWER
+testzone.nlnetlabs.nl. 3600 IN DNSKEY 257 3 8 AwEAAbd9WqjzE2Pynz21OG5doSf9hFzMr5dhzz2waZ3vTa+0o5r7AjTAqmA1yH/B3+aAMihUm5ucZSfVqo7+kOaRE8yFj9aivOmA1n1+JLevJq/oyvQyjxQN2Qb89LyaNUT5oKZIiL+uyyhNW3KDR3SSbQ/GBwQNDHVcZi+JDR3RC0r7 ;{id = 1444 (ksk), size = 1024b}
+testzone.nlnetlabs.nl. 3600 IN RRSIG DNSKEY 8 3 3600 20180313101254 20180213101254 1444 testzone.nlnetlabs.nl. kQ2sc41aQeMxQ7KInz2HrHi4nQcUGdv1olro0GmVYgPvIJh7SqBKW3yZWYeQrbWWwdc3klBERBbBI8gnkNYbl5kX3BBa5su8w71mpTQPRGtMxDTB17daxc0SxpPUxM35CpWU9QlBuDXcu+VNyVUuLvZGGLznlqr6ku888U2Rz+c=
+ENTRY_END
+
+; response for antelope.testzone.nlnetlabs.nl.
+; NSECs cover ant.testzone.nlnetlabs.nl as non-existent.
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NXDOMAIN
+SECTION QUESTION
+antelope.testzone.nlnetlabs.nl. IN TXT
+SECTION ANSWER
+SECTION AUTHORITY
+testzone.nlnetlabs.nl. 3600 IN NSEC alligator.testzone.nlnetlabs.nl. NS SOA RRSIG NSEC DNSKEY
+testzone.nlnetlabs.nl. 3600 IN RRSIG NSEC 8 3 3600 20180313101254 20180213101254 1444 testzone.nlnetlabs.nl. tcW20hZu5Ao+ikM+qjqAlRt3ujNxTKi6kZF3waWJGY7Ldyp9XyWzB1DeoQzaNJ6zflPYFO32RUhj7jWhEIUphG4+lEvm7VGJAdSteUZ2yOppN6eZvOk0Nc0nAGPFGBjLO6ul1Wh1X+jL61q7mWt3nY+IFBZHWmhsi2Qi7vM/W4E=
+alligator.testzone.nlnetlabs.nl. 3600 IN NSEC cheetah.testzone.nlnetlabs.nl. TXT RRSIG NSEC
+alligator.testzone.nlnetlabs.nl. 3600 IN RRSIG NSEC 8 4 3600 20180313101254 20180213101254 1444 testzone.nlnetlabs.nl. Zfkp3kmN8heAuIF/apf6RHhZAoGyXnvZLALRYTKIH7E9XC2wtvG9dZla4WLSr3ndA4d0CFgnKOt8mSVSLyNn232D0ahx4DFAnOJitnt9odT2+2sYhJbwCx38tPKhAUWmIn2jGZGMVjbVbEVi7WyQBrJYQqyhE/lADEDSdQZBNyA=
+testzone.nlnetlabs.nl. 900 IN SOA ns.nlnetlabs.nl. ralph.nlnetlabs.nl. 1 14400 3600 604800 3600
+testzone.nlnetlabs.nl. 900 IN RRSIG SOA 8 3 900 20180313101254 20180213101254 1444 testzone.nlnetlabs.nl. abG0cByo/q5NaDNMz6FPvNvehHqUDhQRwLdvG72315hMGzCavLRWuAB5gieibMCrICH2WVHVj7fisjSuY0iPwf9xZlCGts3Z+xD9D72VRiTz7QXF+JjRWKl+3Uk6c29+pvIRKXC1Ht0r9uBXGmDTaHdV7cZCveoDwIVSngY+mQ0=
+SECTION ADDITIONAL
+ENTRY_END
+
+; No answer for ant.testzone.nlnetlabs.nl in this range
+
+; response for peanut.testzone.nlnetlabs.nl. AAAA
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NOERROR
+SECTION QUESTION
+peanut.testzone.nlnetlabs.nl. IN AAAA
+SECTION AUTHORITY
+peanut.testzone.nlnetlabs.nl. IN NSEC rust.testzone.nlnetlabs.nl. A RRSIG NSEC
+peanut.testzone.nlnetlabs.nl. 3600 IN RRSIG NSEC 8 4 3600 20180313101254 20180213101254 1444 testzone.nlnetlabs.nl. GhUUt3n1oVZCbU5l7XhbtE1kAhFXBRvQRvp/s3INitoHm1D54VERXWR33g+aQMcLAyCOe2TmpJMH1zDSbccf0zabvwEzqDzPmgcPt0KjXUdrN84/2XN+C4U84golbUui61lhhU+6bL8rylPuv3XtqQ4ppXy8sSe+gfsskauhMpg=
+testzone.nlnetlabs.nl. 900 IN SOA ns.nlnetlabs.nl. ralph.nlnetlabs.nl. 1 14400 3600 604800 3600
+testzone.nlnetlabs.nl. 900 IN RRSIG SOA 8 3 900 20180313101254 20180213101254 1444 testzone.nlnetlabs.nl. abG0cByo/q5NaDNMz6FPvNvehHqUDhQRwLdvG72315hMGzCavLRWuAB5gieibMCrICH2WVHVj7fisjSuY0iPwf9xZlCGts3Z+xD9D72VRiTz7QXF+JjRWKl+3Uk6c29+pvIRKXC1Ht0r9uBXGmDTaHdV7cZCveoDwIVSngY+mQ0=
+SECTION ADDITIONAL
+ENTRY_END
+RANGE_END
+
+; testzone.nlnetlabs.nl nameserver
+RANGE_BEGIN 100 200
+ ADDRESS 185.49.140.60
+; response for ant.testzone.nlnetlabs.nl
+ENTRY_BEGIN
+MATCH opcode qtype qname
+REPLY QR AA NOERROR
+SECTION QUESTION
+ant.testzone.nlnetlabs.nl. IN TXT
+SECTION ANSWER
+ant.testzone.nlnetlabs.nl. TXT "heap"
+ant.testzone.nlnetlabs.nl. 3600 IN RRSIG TXT 8 4 3600 20180313101254 20180213101254 1444 testzone.nlnetlabs.nl. Sn8dBGMSYGGKs7yGWO0CShxbm3ba5Y6ysHyE/HJyFnS8NmsKIx/KVdFPRQx/Jm7a3hektRXrjxetfhfJm0SzJ2UFeKlkE+VJ/Lj2oAETqN1oqqkNr+RDdbKLMzLApMRgrhStSAO1Yb8/8oUIflyrjNbuDbAHSMbkOE+Z49LIais=
+ENTRY_END
+RANGE_END
+
+; zone2.nlnetlabs.nl nameserver
+RANGE_BEGIN 0 100
+ ADDRESS 185.49.140.61
+ENTRY_BEGIN
+MATCH opcode qtype qname
+REPLY QR AA NOERROR
+SECTION QUESTION
+redir.zone2.nlnetlabs.nl. IN TXT
+SECTION ANSWER
+redir.zone2.nlnetlabs.nl. 15 IN CNAME antelope.testzone.nlnetlabs.nl.
+ENTRY_END
+RANGE_END
+
+STEP 1 QUERY
+ENTRY_BEGIN
+REPLY RD DO
+SECTION QUESTION
+antelope.testzone.nlnetlabs.nl. IN TXT
+ENTRY_END
+
+; recursion happens here. Expect NXDOMAIN.
+STEP 2 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all ttl
+REPLY QR RD RA DO AD NXDOMAIN
+SECTION QUESTION
+antelope.testzone.nlnetlabs.nl. IN TXT
+SECTION ANSWER
+SECTION AUTHORITY
+testzone.nlnetlabs.nl. 3600 IN NSEC alligator.testzone.nlnetlabs.nl. NS SOA RRSIG NSEC DNSKEY
+testzone.nlnetlabs.nl. 3600 IN RRSIG NSEC 8 3 3600 20180313101254 20180213101254 1444 testzone.nlnetlabs.nl. tcW20hZu5Ao+ikM+qjqAlRt3ujNxTKi6kZF3waWJGY7Ldyp9XyWzB1DeoQzaNJ6zflPYFO32RUhj7jWhEIUphG4+lEvm7VGJAdSteUZ2yOppN6eZvOk0Nc0nAGPFGBjLO6ul1Wh1X+jL61q7mWt3nY+IFBZHWmhsi2Qi7vM/W4E=
+alligator.testzone.nlnetlabs.nl. 3600 IN NSEC cheetah.testzone.nlnetlabs.nl. TXT RRSIG NSEC
+alligator.testzone.nlnetlabs.nl. 3600 IN RRSIG NSEC 8 4 3600 20180313101254 20180213101254 1444 testzone.nlnetlabs.nl. Zfkp3kmN8heAuIF/apf6RHhZAoGyXnvZLALRYTKIH7E9XC2wtvG9dZla4WLSr3ndA4d0CFgnKOt8mSVSLyNn232D0ahx4DFAnOJitnt9odT2+2sYhJbwCx38tPKhAUWmIn2jGZGMVjbVbEVi7WyQBrJYQqyhE/lADEDSdQZBNyA=
+testzone.nlnetlabs.nl. 900 IN SOA ns.nlnetlabs.nl. ralph.nlnetlabs.nl. 1 14400 3600 604800 3600
+testzone.nlnetlabs.nl. 900 IN RRSIG SOA 8 3 900 20180313101254 20180213101254 1444 testzone.nlnetlabs.nl. abG0cByo/q5NaDNMz6FPvNvehHqUDhQRwLdvG72315hMGzCavLRWuAB5gieibMCrICH2WVHVj7fisjSuY0iPwf9xZlCGts3Z+xD9D72VRiTz7QXF+JjRWKl+3Uk6c29+pvIRKXC1Ht0r9uBXGmDTaHdV7cZCveoDwIVSngY+mQ0=
+SECTION ADDITIONAL
+ENTRY_END
+
+STEP 4 QUERY
+ENTRY_BEGIN
+REPLY RD DO
+SECTION QUESTION
+peanut.testzone.nlnetlabs.nl. IN AAAA
+ENTRY_END
+
+STEP 5 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all ttl
+REPLY QR RD RA AD DO NOERROR
+SECTION QUESTION
+peanut.testzone.nlnetlabs.nl. IN AAAA
+SECTION AUTHORITY
+peanut.testzone.nlnetlabs.nl. IN NSEC rust.testzone.nlnetlabs.nl. A RRSIG NSEC
+peanut.testzone.nlnetlabs.nl. 3600 IN RRSIG NSEC 8 4 3600 20180313101254 20180213101254 1444 testzone.nlnetlabs.nl. GhUUt3n1oVZCbU5l7XhbtE1kAhFXBRvQRvp/s3INitoHm1D54VERXWR33g+aQMcLAyCOe2TmpJMH1zDSbccf0zabvwEzqDzPmgcPt0KjXUdrN84/2XN+C4U84golbUui61lhhU+6bL8rylPuv3XtqQ4ppXy8sSe+gfsskauhMpg=
+testzone.nlnetlabs.nl. 900 IN SOA ns.nlnetlabs.nl. ralph.nlnetlabs.nl. 1 14400 3600 604800 3600
+testzone.nlnetlabs.nl. 900 IN RRSIG SOA 8 3 900 20180313101254 20180213101254 1444 testzone.nlnetlabs.nl. abG0cByo/q5NaDNMz6FPvNvehHqUDhQRwLdvG72315hMGzCavLRWuAB5gieibMCrICH2WVHVj7fisjSuY0iPwf9xZlCGts3Z+xD9D72VRiTz7QXF+JjRWKl+3Uk6c29+pvIRKXC1Ht0r9uBXGmDTaHdV7cZCveoDwIVSngY+mQ0=
+ENTRY_END
+
+; query for ant.testzone.nlnetlabs.nl (non-existent)
+STEP 11 QUERY
+ENTRY_BEGIN
+REPLY RD DO
+SECTION QUESTION
+ant.testzone.nlnetlabs.nl. IN TXT
+ENTRY_END
+
+; this is the synthesized NXDOMAIN from aggressive-nsec
+STEP 12 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all ttl
+REPLY QR RD RA AD DO NXDOMAIN
+SECTION QUESTION
+ant.testzone.nlnetlabs.nl. IN TXT
+SECTION ANSWER
+SECTION AUTHORITY
+testzone.nlnetlabs.nl. 3600 IN NSEC alligator.testzone.nlnetlabs.nl. NS SOA RRSIG NSEC DNSKEY
+testzone.nlnetlabs.nl. 3600 IN RRSIG NSEC 8 3 3600 20180313101254 20180213101254 1444 testzone.nlnetlabs.nl. tcW20hZu5Ao+ikM+qjqAlRt3ujNxTKi6kZF3waWJGY7Ldyp9XyWzB1DeoQzaNJ6zflPYFO32RUhj7jWhEIUphG4+lEvm7VGJAdSteUZ2yOppN6eZvOk0Nc0nAGPFGBjLO6ul1Wh1X+jL61q7mWt3nY+IFBZHWmhsi2Qi7vM/W4E=
+alligator.testzone.nlnetlabs.nl. 3600 IN NSEC cheetah.testzone.nlnetlabs.nl. TXT RRSIG NSEC
+alligator.testzone.nlnetlabs.nl. 3600 IN RRSIG NSEC 8 4 3600 20180313101254 20180213101254 1444 testzone.nlnetlabs.nl. Zfkp3kmN8heAuIF/apf6RHhZAoGyXnvZLALRYTKIH7E9XC2wtvG9dZla4WLSr3ndA4d0CFgnKOt8mSVSLyNn232D0ahx4DFAnOJitnt9odT2+2sYhJbwCx38tPKhAUWmIn2jGZGMVjbVbEVi7WyQBrJYQqyhE/lADEDSdQZBNyA=
+testzone.nlnetlabs.nl. 900 IN SOA ns.nlnetlabs.nl. ralph.nlnetlabs.nl. 1 14400 3600 604800 3600
+testzone.nlnetlabs.nl. 900 IN RRSIG SOA 8 3 900 20180313101254 20180213101254 1444 testzone.nlnetlabs.nl. abG0cByo/q5NaDNMz6FPvNvehHqUDhQRwLdvG72315hMGzCavLRWuAB5gieibMCrICH2WVHVj7fisjSuY0iPwf9xZlCGts3Z+xD9D72VRiTz7QXF+JjRWKl+3Uk6c29+pvIRKXC1Ht0r9uBXGmDTaHdV7cZCveoDwIVSngY+mQ0=
+ENTRY_END
+
+STEP 13 TIME_PASSES ELAPSE 860
+STEP 14 QUERY
+ENTRY_BEGIN
+REPLY RD DO
+SECTION QUESTION
+redir.zone2.nlnetlabs.nl. IN TXT
+ENTRY_END
+
+STEP 15 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all ttl
+REPLY QR RD RA DO NXDOMAIN
+SECTION QUESTION
+redir.zone2.nlnetlabs.nl. IN TXT
+SECTION ANSWER
+redir.zone2.nlnetlabs.nl. 15 IN CNAME antelope.testzone.nlnetlabs.nl.
+SECTION AUTHORITY
+testzone.nlnetlabs.nl. 2740 IN NSEC alligator.testzone.nlnetlabs.nl. NS SOA RRSIG NSEC DNSKEY
+testzone.nlnetlabs.nl. 2740 IN RRSIG NSEC 8 3 3600 20180313101254 20180213101254 1444 testzone.nlnetlabs.nl. tcW20hZu5Ao+ikM+qjqAlRt3ujNxTKi6kZF3waWJGY7Ldyp9XyWzB1DeoQzaNJ6zflPYFO32RUhj7jWhEIUphG4+lEvm7VGJAdSteUZ2yOppN6eZvOk0Nc0nAGPFGBjLO6ul1Wh1X+jL61q7mWt3nY+IFBZHWmhsi2Qi7vM/W4E=
+alligator.testzone.nlnetlabs.nl. 2740 IN NSEC cheetah.testzone.nlnetlabs.nl. TXT RRSIG NSEC
+alligator.testzone.nlnetlabs.nl. 2740 IN RRSIG NSEC 8 4 3600 20180313101254 20180213101254 1444 testzone.nlnetlabs.nl. Zfkp3kmN8heAuIF/apf6RHhZAoGyXnvZLALRYTKIH7E9XC2wtvG9dZla4WLSr3ndA4d0CFgnKOt8mSVSLyNn232D0ahx4DFAnOJitnt9odT2+2sYhJbwCx38tPKhAUWmIn2jGZGMVjbVbEVi7WyQBrJYQqyhE/lADEDSdQZBNyA=
+testzone.nlnetlabs.nl. 40 IN SOA ns.nlnetlabs.nl. ralph.nlnetlabs.nl. 1 14400 3600 604800 3600
+testzone.nlnetlabs.nl. 40 IN RRSIG SOA 8 3 900 20180313101254 20180213101254 1444 testzone.nlnetlabs.nl. abG0cByo/q5NaDNMz6FPvNvehHqUDhQRwLdvG72315hMGzCavLRWuAB5gieibMCrICH2WVHVj7fisjSuY0iPwf9xZlCGts3Z+xD9D72VRiTz7QXF+JjRWKl+3Uk6c29+pvIRKXC1Ht0r9uBXGmDTaHdV7cZCveoDwIVSngY+mQ0=
+ENTRY_END
+
+STEP 16 TIME_PASSES ELAPSE 14
+STEP 17 QUERY
+ENTRY_BEGIN
+REPLY RD DO
+SECTION QUESTION
+redir.zone2.nlnetlabs.nl. IN TXT
+ENTRY_END
+
+STEP 18 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all ttl
+REPLY QR RD RA DO NXDOMAIN
+SECTION QUESTION
+redir.zone2.nlnetlabs.nl. IN TXT
+SECTION ANSWER
+redir.zone2.nlnetlabs.nl. 1 IN CNAME antelope.testzone.nlnetlabs.nl.
+SECTION AUTHORITY
+testzone.nlnetlabs.nl. 2726 IN NSEC alligator.testzone.nlnetlabs.nl. NS SOA RRSIG NSEC DNSKEY
+testzone.nlnetlabs.nl. 2726 IN RRSIG NSEC 8 3 3600 20180313101254 20180213101254 1444 testzone.nlnetlabs.nl. tcW20hZu5Ao+ikM+qjqAlRt3ujNxTKi6kZF3waWJGY7Ldyp9XyWzB1DeoQzaNJ6zflPYFO32RUhj7jWhEIUphG4+lEvm7VGJAdSteUZ2yOppN6eZvOk0Nc0nAGPFGBjLO6ul1Wh1X+jL61q7mWt3nY+IFBZHWmhsi2Qi7vM/W4E=
+alligator.testzone.nlnetlabs.nl. 2726 IN NSEC cheetah.testzone.nlnetlabs.nl. TXT RRSIG NSEC
+alligator.testzone.nlnetlabs.nl. 2726 IN RRSIG NSEC 8 4 3600 20180313101254 20180213101254 1444 testzone.nlnetlabs.nl. Zfkp3kmN8heAuIF/apf6RHhZAoGyXnvZLALRYTKIH7E9XC2wtvG9dZla4WLSr3ndA4d0CFgnKOt8mSVSLyNn232D0ahx4DFAnOJitnt9odT2+2sYhJbwCx38tPKhAUWmIn2jGZGMVjbVbEVi7WyQBrJYQqyhE/lADEDSdQZBNyA=
+testzone.nlnetlabs.nl. 26 IN SOA ns.nlnetlabs.nl. ralph.nlnetlabs.nl. 1 14400 3600 604800 3600
+testzone.nlnetlabs.nl. 26 IN RRSIG SOA 8 3 900 20180313101254 20180213101254 1444 testzone.nlnetlabs.nl. abG0cByo/q5NaDNMz6FPvNvehHqUDhQRwLdvG72315hMGzCavLRWuAB5gieibMCrICH2WVHVj7fisjSuY0iPwf9xZlCGts3Z+xD9D72VRiTz7QXF+JjRWKl+3Uk6c29+pvIRKXC1Ht0r9uBXGmDTaHdV7cZCveoDwIVSngY+mQ0=
+ENTRY_END
+
+STEP 19 TRAFFIC
+
+STEP 20 QUERY
+ENTRY_BEGIN
+REPLY RD DO
+SECTION QUESTION
+peanut.testzone.nlnetlabs.nl. IN AAAA
+ENTRY_END
+
+STEP 21 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all ttl
+REPLY QR RD RA AD DO NOERROR
+SECTION QUESTION
+peanut.testzone.nlnetlabs.nl. IN AAAA
+SECTION AUTHORITY
+peanut.testzone.nlnetlabs.nl. 2726 IN NSEC rust.testzone.nlnetlabs.nl. A RRSIG NSEC
+peanut.testzone.nlnetlabs.nl. 2726 IN RRSIG NSEC 8 4 3600 20180313101254 20180213101254 1444 testzone.nlnetlabs.nl. GhUUt3n1oVZCbU5l7XhbtE1kAhFXBRvQRvp/s3INitoHm1D54VERXWR33g+aQMcLAyCOe2TmpJMH1zDSbccf0zabvwEzqDzPmgcPt0KjXUdrN84/2XN+C4U84golbUui61lhhU+6bL8rylPuv3XtqQ4ppXy8sSe+gfsskauhMpg=
+testzone.nlnetlabs.nl. 900 IN SOA ns.nlnetlabs.nl. ralph.nlnetlabs.nl. 1 14400 3600 604800 3600
+testzone.nlnetlabs.nl. 900 IN RRSIG SOA 8 3 900 20180313101254 20180213101254 1444 testzone.nlnetlabs.nl. abG0cByo/q5NaDNMz6FPvNvehHqUDhQRwLdvG72315hMGzCavLRWuAB5gieibMCrICH2WVHVj7fisjSuY0iPwf9xZlCGts3Z+xD9D72VRiTz7QXF+JjRWKl+3Uk6c29+pvIRKXC1Ht0r9uBXGmDTaHdV7cZCveoDwIVSngY+mQ0=
+ENTRY_END
+
+STEP 22 TRAFFIC
+STEP 23 TIME_PASSES ELAPSE 901
+
+STEP 24 QUERY
+ENTRY_BEGIN
+REPLY RD DO
+SECTION QUESTION
+peanut.testzone.nlnetlabs.nl. IN AAAA
+ENTRY_END
+
+STEP 25 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all ttl
+REPLY QR RD RA AD DO NOERROR
+SECTION QUESTION
+peanut.testzone.nlnetlabs.nl. IN AAAA
+SECTION AUTHORITY
+peanut.testzone.nlnetlabs.nl. IN NSEC rust.testzone.nlnetlabs.nl. A RRSIG NSEC
+peanut.testzone.nlnetlabs.nl. 3600 IN RRSIG NSEC 8 4 3600 20180313101254 20180213101254 1444 testzone.nlnetlabs.nl. GhUUt3n1oVZCbU5l7XhbtE1kAhFXBRvQRvp/s3INitoHm1D54VERXWR33g+aQMcLAyCOe2TmpJMH1zDSbccf0zabvwEzqDzPmgcPt0KjXUdrN84/2XN+C4U84golbUui61lhhU+6bL8rylPuv3XtqQ4ppXy8sSe+gfsskauhMpg=
+testzone.nlnetlabs.nl. 900 IN SOA ns.nlnetlabs.nl. ralph.nlnetlabs.nl. 1 14400 3600 604800 3600
+testzone.nlnetlabs.nl. 900 IN RRSIG SOA 8 3 900 20180313101254 20180213101254 1444 testzone.nlnetlabs.nl. abG0cByo/q5NaDNMz6FPvNvehHqUDhQRwLdvG72315hMGzCavLRWuAB5gieibMCrICH2WVHVj7fisjSuY0iPwf9xZlCGts3Z+xD9D72VRiTz7QXF+JjRWKl+3Uk6c29+pvIRKXC1Ht0r9uBXGmDTaHdV7cZCveoDwIVSngY+mQ0=
+ENTRY_END
+STEP 26 TRAFFIC
+
+; Time passes and NSECs should be expired.
+STEP 60 TIME_PASSES ELAPSE 60
+
+; query something that gets the SOA record for the testzone in cache.
+STEP 70 QUERY
+ENTRY_BEGIN
+REPLY RD DO
+SECTION QUESTION
+peanut.testzone.nlnetlabs.nl. IN AAAA
+ENTRY_END
+
+STEP 80 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all ttl
+REPLY QR RD RA AD DO NOERROR
+SECTION QUESTION
+peanut.testzone.nlnetlabs.nl. IN AAAA
+SECTION AUTHORITY
+peanut.testzone.nlnetlabs.nl. 3540 IN NSEC rust.testzone.nlnetlabs.nl. A RRSIG NSEC
+peanut.testzone.nlnetlabs.nl. 3540 IN RRSIG NSEC 8 4 3600 20180313101254 20180213101254 1444 testzone.nlnetlabs.nl. GhUUt3n1oVZCbU5l7XhbtE1kAhFXBRvQRvp/s3INitoHm1D54VERXWR33g+aQMcLAyCOe2TmpJMH1zDSbccf0zabvwEzqDzPmgcPt0KjXUdrN84/2XN+C4U84golbUui61lhhU+6bL8rylPuv3XtqQ4ppXy8sSe+gfsskauhMpg=
+testzone.nlnetlabs.nl. 840 IN SOA ns.nlnetlabs.nl. ralph.nlnetlabs.nl. 1 14400 3600 604800 3600
+testzone.nlnetlabs.nl. 840 IN RRSIG SOA 8 3 900 20180313101254 20180213101254 1444 testzone.nlnetlabs.nl. abG0cByo/q5NaDNMz6FPvNvehHqUDhQRwLdvG72315hMGzCavLRWuAB5gieibMCrICH2WVHVj7fisjSuY0iPwf9xZlCGts3Z+xD9D72VRiTz7QXF+JjRWKl+3Uk6c29+pvIRKXC1Ht0r9uBXGmDTaHdV7cZCveoDwIVSngY+mQ0=
+ENTRY_END
+
+; query for ant.testzone.nlnetlabs.nl. In this range it is on the nameserver.
+STEP 110 QUERY
+ENTRY_BEGIN
+REPLY RD DO
+SECTION QUESTION
+ant.testzone.nlnetlabs.nl. IN TXT
+ENTRY_END
+
+; Expect an answer since the 3600 TTL NSECs from STEP 10 should have been
+; limited to 900 and be expired by now.
+STEP 120 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all ttl
+REPLY QR RD RA AD DO NOERROR
+SECTION QUESTION
+ant.testzone.nlnetlabs.nl. IN TXT
+SECTION ANSWER
+ant.testzone.nlnetlabs.nl. TXT "heap"
+ant.testzone.nlnetlabs.nl. 3600 IN RRSIG TXT 8 4 3600 20180313101254 20180213101254 1444 testzone.nlnetlabs.nl. Sn8dBGMSYGGKs7yGWO0CShxbm3ba5Y6ysHyE/HJyFnS8NmsKIx/KVdFPRQx/Jm7a3hektRXrjxetfhfJm0SzJ2UFeKlkE+VJ/Lj2oAETqN1oqqkNr+RDdbKLMzLApMRgrhStSAO1Yb8/8oUIflyrjNbuDbAHSMbkOE+Z49LIais=
+ENTRY_END
+
+SCENARIO_END
diff --git a/testdata/zonemd.example_a5.zone b/testdata/zonemd.example_a5.zone
index 246f5e2376db..114862aab2e6 100644
--- a/testdata/zonemd.example_a5.zone
+++ b/testdata/zonemd.example_a5.zone
@@ -16,8 +16,8 @@ root-servers.net. 3600000 IN NS m.root-servers.net.
a.root-servers.net. 3600000 IN AAAA 2001:503:ba3e::2:30
a.root-servers.net. 3600000 IN A 198.41.0.4
b.root-servers.net. 3600000 IN MX 20 mail.isi.edu.
-b.root-servers.net. 3600000 IN AAAA 2001:500:200::b
-b.root-servers.net. 3600000 IN A 199.9.14.201
+b.root-servers.net. 3600000 IN AAAA 2801:1b8:10::b
+b.root-servers.net. 3600000 IN A 170.247.170.2
c.root-servers.net. 3600000 IN AAAA 2001:500:2::c
c.root-servers.net. 3600000 IN A 192.33.4.12
d.root-servers.net. 3600000 IN AAAA 2001:500:2d::d
diff --git a/util/alloc.c b/util/alloc.c
index a6c91180356e..9a99246f589c 100644
--- a/util/alloc.c
+++ b/util/alloc.c
@@ -519,6 +519,15 @@ void *unbound_stat_realloc_log(void *ptr, size_t size, const char* file,
return unbound_stat_realloc(ptr, size);
}
+/** log to file where alloc was done */
+void *unbound_stat_reallocarray_log(void *ptr, size_t nmemb, size_t size,
+ const char* file, int line, const char* func)
+{
+ log_info("%s:%d %s reallocarray(%p, %u, %u)", file, line, func,
+ ptr, (unsigned)nmemb, (unsigned)size);
+ return unbound_stat_realloc(ptr, nmemb*size);
+}
+
/** log to file where strdup was done */
char *unbound_stat_strdup_log(const char *s, const char* file, int line,
const char* func)
diff --git a/util/config_file.c b/util/config_file.c
index 9a93befd3061..aca0039d487a 100644
--- a/util/config_file.c
+++ b/util/config_file.c
@@ -135,9 +135,12 @@ config_create(void)
cfg->http_query_buffer_size = 4*1024*1024;
cfg->http_response_buffer_size = 4*1024*1024;
cfg->http_nodelay = 1;
+ cfg->quic_port = UNBOUND_DNS_OVER_QUIC_PORT;
+ cfg->quic_size = 8*1024*1024;
cfg->use_syslog = 1;
cfg->log_identity = NULL; /* changed later with argv[0] */
cfg->log_time_ascii = 0;
+ cfg->log_time_iso = 0;
cfg->log_queries = 0;
cfg->log_replies = 0;
cfg->log_tag_queryreply = 0;
@@ -237,6 +240,7 @@ config_create(void)
cfg->harden_short_bufsize = 1;
cfg->harden_large_queries = 0;
cfg->harden_glue = 1;
+ cfg->harden_unverified_glue = 0;
cfg->harden_dnssec_stripped = 1;
cfg->harden_below_nxdomain = 1;
cfg->harden_referral_path = 0;
@@ -398,6 +402,8 @@ config_create(void)
cfg->redis_server_path = NULL;
cfg->redis_server_password = NULL;
cfg->redis_timeout = 100;
+ cfg->redis_command_timeout = 0;
+ cfg->redis_connect_timeout = 0;
cfg->redis_server_port = 6379;
cfg->redis_expire_records = 0;
cfg->redis_logical_db = 0;
@@ -408,6 +414,9 @@ config_create(void)
cfg->ipset_name_v6 = NULL;
#endif
cfg->ede = 0;
+ cfg->iter_scrub_ns = 20;
+ cfg->iter_scrub_cname = 11;
+ cfg->max_global_quota = 128;
return cfg;
error_exit:
config_delete(cfg);
@@ -541,6 +550,9 @@ int config_set_option(struct config_file* cfg, const char* opt,
else if(strcmp(opt, "log-time-ascii:") == 0)
{ IS_YES_OR_NO; cfg->log_time_ascii = (strcmp(val, "yes") == 0);
log_set_time_asc(cfg->log_time_ascii); }
+ else if(strcmp(opt, "log-time-iso:") == 0)
+ { IS_YES_OR_NO; cfg->log_time_iso = (strcmp(val, "yes") == 0);
+ log_set_time_iso(cfg->log_time_iso); }
else S_SIZET_NONZERO("max-udp-size:", max_udp_size)
else S_YNO("use-syslog:", use_syslog)
else S_STR("log-identity:", log_identity)
@@ -594,6 +606,8 @@ int config_set_option(struct config_file* cfg, const char* opt,
else S_MEMSIZE("http-response-buffer-size:", http_response_buffer_size)
else S_YNO("http-nodelay:", http_nodelay)
else S_YNO("http-notls-downstream:", http_notls_downstream)
+ else S_NUMBER_NONZERO("quic-port:", quic_port)
+ else S_MEMSIZE("quic-size:", quic_size)
else S_YNO("interface-automatic:", if_automatic)
else S_STR("interface-automatic-ports:", if_automatic_ports)
else S_YNO("use-systemd:", use_systemd)
@@ -672,6 +686,7 @@ int config_set_option(struct config_file* cfg, const char* opt,
else S_STRLIST("root-hints:", root_hints)
else S_STR("target-fetch-policy:", target_fetch_policy)
else S_YNO("harden-glue:", harden_glue)
+ else S_YNO("harden-unverified-glue:", harden_unverified_glue)
else S_YNO("harden-short-bufsize:", harden_short_bufsize)
else S_YNO("harden-large-queries:", harden_large_queries)
else S_YNO("harden-dnssec-stripped:", harden_dnssec_stripped)
@@ -712,12 +727,17 @@ int config_set_option(struct config_file* cfg, const char* opt,
SERVE_EXPIRED = cfg->serve_expired; }
else if(strcmp(opt, "serve-expired-ttl:") == 0)
{ IS_NUMBER_OR_ZERO; cfg->serve_expired_ttl = atoi(val); SERVE_EXPIRED_TTL=(time_t)cfg->serve_expired_ttl;}
- else S_YNO("serve-expired-ttl-reset:", serve_expired_ttl_reset)
+ else if(strcmp(opt, "serve-expired-ttl-reset:") == 0)
+ { IS_YES_OR_NO; cfg->serve_expired_ttl_reset = (strcmp(val, "yes") == 0);
+ SERVE_EXPIRED_TTL_RESET = cfg->serve_expired_ttl_reset; }
else if(strcmp(opt, "serve-expired-reply-ttl:") == 0)
{ IS_NUMBER_OR_ZERO; cfg->serve_expired_reply_ttl = atoi(val); SERVE_EXPIRED_REPLY_TTL=(time_t)cfg->serve_expired_reply_ttl;}
else S_NUMBER_OR_ZERO("serve-expired-client-timeout:", serve_expired_client_timeout)
else S_YNO("ede:", ede)
else S_YNO("ede-serve-expired:", ede_serve_expired)
+ else S_NUMBER_OR_ZERO("iter-scrub-ns:", iter_scrub_ns)
+ else S_NUMBER_OR_ZERO("iter-scrub-cname:", iter_scrub_cname)
+ else S_NUMBER_OR_ZERO("max-global-quota:", max_global_quota)
else S_YNO("serve-original-ttl:", serve_original_ttl)
else S_STR("val-nsec3-keysize-iterations:", val_nsec3_key_iterations)
else S_YNO("zonemd-permissive-mode:", zonemd_permissive_mode)
@@ -1054,6 +1074,7 @@ config_get_option(struct config_file* cfg, const char* opt,
else O_YNO(opt, "use-syslog", use_syslog)
else O_STR(opt, "log-identity", log_identity)
else O_YNO(opt, "log-time-ascii", log_time_ascii)
+ else O_YNO(opt, "log-time-iso", log_time_iso)
else O_DEC(opt, "num-threads", num_threads)
else O_IFC(opt, "interface", num_ifs, ifs)
else O_IFC(opt, "outgoing-interface", num_out_ifs, out_ifs)
@@ -1137,6 +1158,8 @@ config_get_option(struct config_file* cfg, const char* opt,
else O_MEM(opt, "http-response-buffer-size", http_response_buffer_size)
else O_YNO(opt, "http-nodelay", http_nodelay)
else O_YNO(opt, "http-notls-downstream", http_notls_downstream)
+ else O_DEC(opt, "quic-port", quic_port)
+ else O_MEM(opt, "quic-size", quic_size)
else O_YNO(opt, "use-systemd", use_systemd)
else O_YNO(opt, "do-daemonize", do_daemonize)
else O_STR(opt, "chroot", chrootdir)
@@ -1162,6 +1185,7 @@ config_get_option(struct config_file* cfg, const char* opt,
else O_YNO(opt, "harden-short-bufsize", harden_short_bufsize)
else O_YNO(opt, "harden-large-queries", harden_large_queries)
else O_YNO(opt, "harden-glue", harden_glue)
+ else O_YNO(opt, "harden-unverified-glue", harden_unverified_glue)
else O_YNO(opt, "harden-dnssec-stripped", harden_dnssec_stripped)
else O_YNO(opt, "harden-below-nxdomain", harden_below_nxdomain)
else O_YNO(opt, "harden-referral-path", harden_referral_path)
@@ -1186,6 +1210,9 @@ config_get_option(struct config_file* cfg, const char* opt,
else O_DEC(opt, "serve-expired-client-timeout", serve_expired_client_timeout)
else O_YNO(opt, "ede", ede)
else O_YNO(opt, "ede-serve-expired", ede_serve_expired)
+ else O_DEC(opt, "iter-scrub-ns", iter_scrub_ns)
+ else O_DEC(opt, "iter-scrub-cname", iter_scrub_cname)
+ else O_DEC(opt, "max-global-quota", max_global_quota)
else O_YNO(opt, "serve-original-ttl", serve_original_ttl)
else O_STR(opt, "val-nsec3-keysize-iterations",val_nsec3_key_iterations)
else O_YNO(opt, "zonemd-permissive-mode", zonemd_permissive_mode)
@@ -1352,6 +1379,8 @@ config_get_option(struct config_file* cfg, const char* opt,
else O_STR(opt, "redis-server-path", redis_server_path)
else O_STR(opt, "redis-server-password", redis_server_password)
else O_DEC(opt, "redis-timeout", redis_timeout)
+ else O_DEC(opt, "redis-command-timeout", redis_command_timeout)
+ else O_DEC(opt, "redis-connect-timeout", redis_connect_timeout)
else O_YNO(opt, "redis-expire-records", redis_expire_records)
else O_DEC(opt, "redis-logical-db", redis_logical_db)
#endif /* USE_REDIS */
@@ -2323,7 +2352,7 @@ uint8_t* cfg_parse_nsid(const char* str, uint16_t* nsid_len)
uint8_t *dp;
for ( ch = str, dp = nsid
- ; isxdigit(ch[0]) && isxdigit(ch[1])
+ ; isxdigit((unsigned char)ch[0]) && isxdigit((unsigned char)ch[1])
; ch += 2, dp++) {
*dp = (uint8_t)sldns_hexdigit_to_int(ch[0]) * 16;
*dp += (uint8_t)sldns_hexdigit_to_int(ch[1]);
@@ -2379,6 +2408,7 @@ config_apply(struct config_file* config)
MIN_TTL = (time_t)config->min_ttl;
SERVE_EXPIRED = config->serve_expired;
SERVE_EXPIRED_TTL = (time_t)config->serve_expired_ttl;
+ SERVE_EXPIRED_TTL_RESET = config->serve_expired_ttl_reset;
SERVE_EXPIRED_REPLY_TTL = (time_t)config->serve_expired_reply_ttl;
SERVE_ORIGINAL_TTL = config->serve_original_ttl;
MAX_NEG_TTL = (time_t)config->max_negative_ttl;
@@ -2389,10 +2419,12 @@ config_apply(struct config_file* config)
MINIMAL_RESPONSES = config->minimal_responses;
RRSET_ROUNDROBIN = config->rrset_roundrobin;
LOG_TAG_QUERYREPLY = config->log_tag_queryreply;
+ MAX_GLOBAL_QUOTA = config->max_global_quota;
UNKNOWN_SERVER_NICENESS = config->unknown_server_time_limit;
USEFUL_SERVER_TOP_TIMEOUT = RTT_MAX_TIMEOUT;
BLACKLIST_PENALTY = USEFUL_SERVER_TOP_TIMEOUT*4;
log_set_time_asc(config->log_time_ascii);
+ log_set_time_iso(config->log_time_iso);
autr_permit_small_holddown = config->permit_small_holddown;
stream_wait_max = config->stream_wait_size;
http2_query_buffer_max = config->http_query_buffer_size;
@@ -2795,3 +2827,22 @@ if_is_dnscrypt(const char* ifname, const char* port, int dnscrypt_port)
return 0;
#endif
}
+
+/** see if interface is quic, its port number == the quic port number */
+int
+if_is_quic(const char* ifname, const char* port, int quic_port)
+{
+#ifndef HAVE_NGTCP2
+ (void)ifname;
+ (void)port;
+ (void)quic_port;
+ return 0;
+#else
+ char* p = strchr(ifname, '@');
+ if(!p && atoi(port) == quic_port)
+ return 1;
+ if(p && atoi(p+1) == quic_port)
+ return 1;
+ return 0;
+#endif
+}
diff --git a/util/config_file.h b/util/config_file.h
index 23aacc67aa77..2969f8433963 100644
--- a/util/config_file.h
+++ b/util/config_file.h
@@ -161,6 +161,11 @@ struct config_file {
/** Disable TLS for http sockets downstream */
int http_notls_downstream;
+ /** port on which to provide DNS over QUIC service */
+ int quic_port;
+ /** size of the quic data, max bytes */
+ size_t quic_size;
+
/** outgoing port range number of ports (per thread) */
int outgoing_num_ports;
/** number of outgoing tcp buffers per (per thread) */
@@ -288,6 +293,8 @@ struct config_file {
int harden_large_queries;
/** harden against spoofed glue (out of zone data) */
int harden_glue;
+ /** harden against unverified glue */
+ int harden_unverified_glue;
/** harden against receiving no DNSSEC data for trust anchor */
int harden_dnssec_stripped;
/** harden against queries that fall under known nxdomain names */
@@ -339,6 +346,8 @@ struct config_file {
int use_syslog;
/** log timestamp in ascii UTC */
int log_time_ascii;
+ /** log timestamp in ISO8601 format */
+ int log_time_iso;
/** log queries with one line per query */
int log_queries;
/** log replies with one line per reply */
@@ -737,6 +746,10 @@ struct config_file {
char* redis_server_password;
/** timeout (in ms) for communication with the redis server */
int redis_timeout;
+ /** timeout (in ms) for redis commands */
+ int redis_command_timeout;
+ /** timeout (in ms) for redis connection set up */
+ int redis_connect_timeout;
/** set timeout on redis records based on DNS response ttl */
int redis_expire_records;
/** set the redis logical database upon connection */
@@ -760,6 +773,12 @@ struct config_file {
#endif
/** respond with Extended DNS Errors (RFC8914) */
int ede;
+ /** limit on NS RRs in RRset for the iterator scrubber. */
+ size_t iter_scrub_ns;
+ /** limit on CNAME, DNAME RRs in answer for the iterator scrubber. */
+ int iter_scrub_cname;
+ /** limit on upstream queries for an incoming query and subqueries. */
+ int max_global_quota;
};
/** from cfg username, after daemonize setup performed */
@@ -1392,6 +1411,10 @@ int if_is_pp2(const char* ifname, const char* port,
/** see if interface is DNSCRYPT, its port number == the dnscrypt port number */
int if_is_dnscrypt(const char* ifname, const char* port, int dnscrypt_port);
+
+/** see if interface is quic, its port number == the quic port number */
+int if_is_quic(const char* ifname, const char* port, int quic_port);
+
#ifdef USE_LINUX_IP_LOCAL_PORT_RANGE
#define LINUX_IP_LOCAL_PORT_RANGE_PATH "/proc/sys/net/ipv4/ip_local_port_range"
#endif
diff --git a/util/configlexer.c b/util/configlexer.c
index 69a20c1ac1a0..c452d78fd3a2 100644
--- a/util/configlexer.c
+++ b/util/configlexer.c
@@ -354,8 +354,8 @@ static void yynoreturn yy_fatal_error ( const char* msg );
(yy_hold_char) = *yy_cp; \
*yy_cp = '\0'; \
(yy_c_buf_p) = yy_cp;
-#define YY_NUM_RULES 394
-#define YY_END_OF_BUFFER 395
+#define YY_NUM_RULES 403
+#define YY_END_OF_BUFFER 404
/* This struct is not used in this scanner,
but its presence is necessary. */
struct yy_trans_info
@@ -363,439 +363,450 @@ struct yy_trans_info
flex_int32_t yy_verify;
flex_int32_t yy_nxt;
};
-static const flex_int16_t yy_accept[3921] =
+static const flex_int16_t yy_accept[4016] =
{ 0,
- 1, 1, 368, 368, 372, 372, 376, 376, 380, 380,
- 1, 1, 384, 384, 388, 388, 395, 392, 1, 366,
- 366, 393, 2, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 393, 368, 369, 369,
- 370, 393, 372, 373, 373, 374, 393, 379, 376, 377,
- 377, 378, 393, 380, 381, 381, 382, 393, 391, 367,
- 2, 371, 391, 393, 387, 384, 385, 385, 386, 393,
- 388, 389, 389, 390, 393, 392, 0, 1, 2, 2,
- 2, 2, 392, 392, 392, 392, 392, 392, 392, 392,
-
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 368, 0, 372, 0, 379, 0, 376, 380,
- 0, 391, 0, 2, 2, 391, 387, 0, 384, 388,
- 0, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
-
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 391, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
-
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 364, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 137, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 147, 392,
-
- 392, 392, 392, 392, 392, 392, 392, 391, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 119, 392, 392, 363, 392,
-
- 392, 392, 392, 392, 392, 392, 392, 8, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 138, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 152, 392, 392, 392, 391, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
-
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 353, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
-
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 391, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 71, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
-
- 392, 392, 392, 392, 273, 392, 14, 15, 392, 392,
- 20, 19, 392, 392, 247, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 145, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
-
- 245, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 3, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 391, 392, 392, 392, 392,
- 392, 392, 392, 392, 342, 392, 392, 392, 341, 392,
-
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 375, 392, 392, 392, 392, 392, 392,
- 392, 392, 70, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 74, 392, 311, 392, 392, 392, 392, 392, 392, 392,
-
- 392, 392, 392, 392, 354, 355, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 75, 392, 392, 146, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 141, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 234, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 22, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
-
- 392, 392, 392, 173, 392, 392, 392, 392, 392, 392,
- 391, 375, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 117, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 319, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 16,
- 392, 392, 392, 392, 392, 392, 392, 392, 201, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
-
- 392, 172, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 116, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 37, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
-
- 392, 392, 392, 392, 392, 392, 392, 392, 38, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 72, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 144, 392, 392,
- 392, 391, 392, 392, 392, 392, 392, 392, 136, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 73, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 277, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 202, 392,
-
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 60, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
-
- 297, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 65, 392, 66, 392, 392, 392, 392, 392,
- 392, 120, 392, 121, 392, 392, 392, 392, 392, 118,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 7, 392, 392, 392, 392, 392, 391,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
-
- 392, 392, 392, 262, 392, 392, 392, 392, 392, 392,
- 176, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 278, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 51, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 61, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 225, 392, 224,
-
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 17, 18, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 76, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 233, 392, 392, 392, 392,
- 392, 392, 392, 123, 392, 122, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
-
- 392, 392, 215, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 153, 392, 253, 392, 392, 392, 391, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 111, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 98, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 246, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 103, 392, 392, 392, 392, 392,
-
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 69, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 218, 219, 392, 392, 392, 313, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 6, 392, 392, 392, 392, 392,
- 392, 392, 332, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 317, 392, 392, 392, 392, 392, 392,
-
- 392, 343, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 48, 392, 392,
- 392, 392, 392, 50, 392, 392, 392, 99, 392, 392,
- 392, 392, 392, 58, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 391, 392, 211,
- 392, 392, 392, 148, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 238, 392,
- 392, 212, 392, 392, 392, 392, 392, 258, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
-
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 59,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 150, 129, 392, 130, 392, 392, 392, 392, 128,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 169, 392, 392, 56, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 295, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 213, 392, 392, 392, 392, 392,
- 223, 216, 392, 222, 392, 392, 392, 392, 392, 392,
- 392, 392, 257, 392, 392, 392, 392, 392, 392, 261,
-
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 115, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 142, 392, 392, 392, 392, 392, 392,
- 392, 392, 67, 392, 392, 392, 392, 31, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 21, 392, 392, 392, 392, 392, 392, 392, 32, 41,
- 392, 181, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 209, 392,
- 392, 391, 392, 392, 392, 392, 358, 392, 392, 84,
-
- 392, 87, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 359, 392, 392, 392, 392, 392, 392, 392,
- 392, 321, 392, 392, 392, 392, 274, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 131, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 168, 392, 52, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 268, 392, 392,
- 392, 392, 392, 392, 392, 392, 336, 392, 392, 392,
-
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 175, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 330, 392, 392, 392, 392, 244, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 350,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 194, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 124, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 188, 392,
-
- 203, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 391, 392, 156, 392, 392, 392, 392, 392, 392, 392,
- 392, 110, 392, 392, 392, 392, 236, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 259, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 286, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 149, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 192, 392, 392, 392, 392,
- 392, 392, 392, 88, 392, 89, 392, 392, 392, 392,
-
- 392, 271, 392, 392, 392, 392, 392, 68, 339, 392,
- 392, 392, 392, 392, 97, 204, 392, 226, 392, 263,
- 392, 392, 217, 314, 392, 392, 392, 392, 309, 392,
- 392, 392, 80, 392, 206, 392, 392, 392, 392, 392,
- 392, 9, 392, 392, 392, 392, 392, 114, 392, 392,
- 392, 392, 392, 392, 301, 392, 392, 392, 392, 392,
- 392, 235, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
-
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 391, 392, 392, 392, 392, 191, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 193, 252, 177, 392, 320, 392, 392, 392, 392, 392,
- 285, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 248, 392, 392, 392, 392, 392, 392,
- 312, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 174,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
-
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 340, 392, 205, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 79, 81, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 113, 392, 392, 392, 392,
- 392, 392, 299, 392, 392, 392, 392, 392, 392, 392,
- 316, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 240, 392, 39, 33, 35, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 40, 392, 34, 36, 392, 42, 392, 392,
- 392, 392, 392, 392, 392, 109, 392, 187, 392, 392,
-
- 392, 392, 392, 392, 392, 392, 392, 391, 392, 392,
- 392, 392, 392, 392, 392, 392, 344, 392, 392, 392,
- 392, 392, 242, 239, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 78, 392, 392, 392, 151,
- 392, 132, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 170, 53, 392, 392, 392, 383, 13,
- 392, 392, 392, 392, 392, 392, 392, 157, 392, 392,
- 392, 392, 392, 392, 392, 392, 334, 392, 337, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
-
- 392, 392, 12, 392, 392, 23, 392, 392, 392, 392,
- 392, 392, 392, 305, 392, 392, 352, 392, 392, 392,
- 392, 318, 392, 392, 392, 392, 82, 392, 250, 392,
- 392, 392, 392, 392, 241, 392, 392, 392, 392, 77,
- 392, 392, 392, 392, 392, 392, 24, 392, 392, 49,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 186, 185, 392, 392, 392, 392, 383, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 243, 237, 392, 392, 260, 392, 392, 322, 392, 392,
- 392, 392, 392, 392, 293, 392, 392, 392, 392, 392,
-
- 392, 392, 392, 199, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 90, 392, 392, 392,
- 392, 392, 392, 392, 392, 300, 392, 392, 392, 392,
- 221, 392, 392, 392, 392, 392, 392, 249, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 307, 392,
- 392, 392, 346, 392, 348, 347, 183, 392, 392, 392,
- 83, 392, 392, 392, 392, 195, 392, 392, 392, 392,
- 392, 125, 127, 126, 392, 392, 392, 26, 392, 392,
- 178, 392, 180, 392, 227, 392, 392, 392, 392, 184,
-
- 392, 392, 254, 392, 392, 392, 392, 264, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 159, 360, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 276, 392, 392, 392, 392, 392, 392, 392, 361,
- 392, 28, 392, 315, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 95, 228, 392, 392, 270, 392, 392, 392,
- 298, 392, 338, 392, 220, 392, 392, 310, 392, 392,
- 392, 308, 62, 392, 392, 392, 392, 392, 392, 392,
- 4, 392, 392, 392, 392, 392, 140, 392, 158, 392,
-
- 392, 392, 200, 30, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 267, 43, 44, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 323, 392, 392,
- 392, 392, 392, 392, 392, 284, 392, 392, 392, 392,
- 392, 392, 392, 392, 231, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 94, 93, 392, 392, 63, 392, 392, 296, 304, 392,
- 272, 392, 392, 392, 392, 392, 11, 392, 392, 392,
- 392, 365, 392, 392, 392, 392, 392, 139, 392, 392,
-
- 392, 392, 392, 392, 229, 100, 392, 392, 46, 392,
- 392, 392, 392, 392, 392, 392, 392, 190, 392, 255,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 161,
- 392, 392, 392, 392, 275, 392, 392, 392, 392, 392,
- 283, 392, 392, 392, 392, 154, 392, 392, 392, 133,
- 135, 134, 392, 392, 392, 102, 106, 101, 392, 171,
- 392, 392, 392, 392, 91, 392, 269, 306, 392, 392,
- 392, 392, 392, 392, 10, 392, 392, 392, 392, 392,
- 302, 351, 392, 392, 392, 392, 392, 392, 392, 392,
- 357, 45, 392, 392, 392, 392, 392, 189, 392, 392,
-
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 107, 105, 392, 392,
- 57, 392, 392, 92, 392, 335, 392, 392, 392, 392,
- 25, 392, 392, 392, 392, 392, 214, 392, 392, 349,
- 392, 392, 392, 392, 230, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 210, 392, 392, 179, 85,
- 86, 392, 392, 392, 392, 392, 392, 324, 392, 392,
- 392, 392, 392, 392, 392, 280, 392, 392, 279, 155,
- 392, 392, 104, 392, 54, 392, 392, 162, 163, 166,
-
- 167, 164, 165, 96, 333, 392, 392, 303, 143, 392,
- 392, 392, 392, 27, 392, 182, 392, 392, 392, 392,
- 392, 208, 392, 266, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 197, 196, 232,
- 47, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 331, 392, 392,
- 392, 392, 112, 392, 392, 265, 392, 392, 294, 328,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
-
- 392, 362, 392, 108, 55, 64, 5, 392, 392, 251,
- 392, 392, 392, 392, 329, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 281, 29, 392, 392, 392, 256,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 282, 392, 392, 392, 392, 160, 392, 392, 392, 392,
- 392, 392, 392, 392, 198, 392, 207, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 325, 392,
- 392, 392, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 392, 392, 392, 392, 392, 392, 356, 345, 392,
- 392, 289, 392, 392, 392, 392, 392, 326, 392, 392,
-
- 392, 392, 392, 392, 327, 392, 392, 392, 287, 392,
- 290, 291, 392, 392, 392, 392, 392, 288, 292, 0
+ 1, 1, 377, 377, 381, 381, 385, 385, 389, 389,
+ 1, 1, 393, 393, 397, 397, 404, 401, 1, 375,
+ 375, 402, 2, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 402, 377, 378, 378,
+ 379, 402, 381, 382, 382, 383, 402, 388, 385, 386,
+ 386, 387, 402, 389, 390, 390, 391, 402, 400, 376,
+ 2, 380, 400, 402, 396, 393, 394, 394, 395, 402,
+ 397, 398, 398, 399, 402, 401, 0, 1, 2, 2,
+ 2, 2, 401, 401, 401, 401, 401, 401, 401, 401,
+
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 377, 0, 381, 0, 388, 0,
+ 385, 389, 0, 400, 0, 2, 2, 400, 396, 0,
+ 393, 397, 0, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 400, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 370, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 140, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+
+ 401, 401, 401, 401, 150, 401, 401, 401, 401, 401,
+ 401, 401, 401, 400, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+
+ 401, 401, 401, 122, 401, 401, 369, 401, 401, 401,
+ 401, 401, 401, 401, 401, 8, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 141,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 155, 401, 401, 401, 400, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 359, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 400, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+
+ 73, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 277, 401, 14,
+ 15, 401, 401, 20, 19, 401, 401, 251, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 148, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 249, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 3, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+
+ 401, 401, 401, 400, 401, 401, 401, 401, 401, 401,
+ 401, 401, 346, 401, 401, 401, 345, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 384, 401, 401, 401, 401, 401, 401, 401, 401,
+ 72, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 76,
+ 401, 315, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 360, 361, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 77, 401, 401, 149, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 144, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 238,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 22, 401, 401, 401, 401, 401, 401,
+
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 176, 401, 401, 401,
+ 401, 401, 401, 400, 384, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 120, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 323, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 16, 401, 401, 401, 401, 401, 401, 401,
+ 401, 204, 401, 401, 401, 401, 401, 401, 401, 401,
+
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 175, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 119, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 37, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 38, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 74, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 147, 401, 401, 401,
+ 400, 401, 401, 401, 401, 401, 401, 139, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 75, 401, 401, 401,
+
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 281, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 205, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 62, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 58, 59, 401, 301, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 67,
+ 401, 68, 401, 401, 401, 401, 401, 401, 123, 401,
+ 124, 401, 401, 401, 401, 401, 121, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 7, 401, 401, 401, 401, 401, 400, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 266, 401, 401, 401, 401, 401, 401, 179, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 282, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+
+ 401, 401, 401, 401, 401, 401, 401, 401, 51, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 63, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 229, 401, 228, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 17, 18, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 78, 401, 401, 401, 401, 401,
+
+ 401, 401, 401, 401, 401, 401, 401, 401, 237, 401,
+ 401, 401, 401, 401, 401, 401, 126, 401, 125, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 218, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 156, 401, 257, 401, 401,
+ 401, 400, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 114, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 100, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 250, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 105, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 71, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 222, 223,
+ 401, 401, 401, 401, 317, 401, 401, 401, 401, 401,
+
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 6, 401, 401, 401, 401, 401, 401, 401,
+ 336, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 321, 401, 401, 401, 401, 401, 401,
+ 401, 347, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 48, 401, 401,
+ 401, 401, 401, 50, 401, 401, 401, 101, 401, 401,
+ 401, 401, 401, 60, 401, 401, 401, 401, 401, 401,
+
+ 401, 401, 401, 401, 401, 401, 401, 400, 401, 214,
+ 401, 401, 401, 151, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 242, 401,
+ 401, 215, 401, 401, 401, 401, 401, 262, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 61,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 153, 132, 401, 133, 401, 401, 401, 401, 131,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 172, 401, 401, 56, 401, 401, 401, 401, 401,
+
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 299, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 216, 401, 401,
+ 401, 401, 401, 227, 219, 401, 226, 401, 401, 221,
+ 401, 401, 401, 401, 401, 401, 401, 261, 401, 401,
+ 401, 401, 401, 401, 265, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 118, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 145, 401, 401, 401, 401, 401, 401, 401, 401, 69,
+
+ 401, 401, 401, 401, 31, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 21, 401, 401,
+ 401, 401, 401, 401, 401, 32, 41, 401, 184, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 212, 401, 401, 400, 401,
+ 401, 401, 401, 364, 401, 401, 86, 401, 89, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 365,
+ 401, 401, 401, 401, 401, 401, 401, 401, 325, 401,
+ 401, 401, 401, 278, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+
+ 401, 401, 401, 401, 401, 401, 401, 401, 134, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 171, 401, 52, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 272, 401, 401, 401, 401,
+ 401, 401, 401, 401, 340, 401, 401, 401, 401, 401,
+ 372, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 178,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 334, 401, 401, 401, 401, 248, 401,
+
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 354, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 197, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 127, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 191, 401, 206, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 400, 401, 159, 401, 401, 401, 401,
+ 401, 401, 401, 401, 113, 401, 401, 401, 401, 240,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 263,
+
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 290, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 152,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 195,
+ 401, 401, 401, 401, 401, 401, 401, 90, 401, 91,
+ 401, 401, 401, 401, 401, 275, 401, 401, 401, 401,
+ 401, 70, 343, 401, 401, 401, 401, 401, 401, 99,
+ 207, 401, 230, 401, 267, 401, 401, 220, 318, 401,
+ 401, 401, 401, 401, 313, 401, 401, 401, 82, 401,
+
+ 209, 401, 401, 401, 401, 401, 401, 9, 401, 401,
+ 401, 401, 401, 117, 401, 401, 401, 401, 401, 401,
+ 305, 401, 401, 401, 401, 401, 401, 401, 401, 239,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 400, 401,
+ 401, 401, 401, 194, 401, 401, 401, 401, 401, 401,
+
+ 401, 401, 401, 401, 401, 401, 401, 401, 196, 256,
+ 180, 401, 324, 401, 401, 401, 401, 401, 289, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 252, 401, 401, 401, 401, 401, 401, 316, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 177, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 344, 401, 401, 208, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 81, 83, 401, 401, 401, 401,
+
+ 401, 401, 401, 401, 401, 401, 116, 401, 401, 401,
+ 401, 401, 401, 303, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 320, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 244, 401, 39,
+ 33, 35, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 40, 401, 34, 36, 401,
+ 42, 401, 401, 401, 401, 401, 401, 401, 112, 401,
+ 190, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 400, 401, 401, 401, 401, 401, 401, 401, 401, 348,
+ 401, 401, 401, 401, 401, 246, 243, 401, 401, 401,
+
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 80, 401,
+ 401, 401, 154, 401, 135, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 173, 53, 401,
+ 401, 401, 392, 13, 401, 401, 401, 401, 401, 401,
+ 401, 160, 401, 401, 401, 401, 401, 401, 401, 401,
+ 338, 401, 341, 401, 373, 401, 401, 401, 401, 401,
+ 374, 401, 401, 401, 401, 401, 401, 401, 12, 401,
+ 401, 23, 401, 401, 401, 401, 401, 401, 401, 309,
+ 401, 401, 401, 401, 358, 401, 401, 401, 401, 322,
+
+ 401, 401, 401, 401, 84, 401, 254, 401, 401, 401,
+ 401, 401, 245, 401, 401, 401, 401, 79, 401, 401,
+ 401, 401, 401, 401, 24, 401, 401, 49, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 189, 188, 401, 401, 401, 401, 392, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 247, 241,
+ 401, 401, 264, 401, 401, 326, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 202, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+
+ 401, 401, 401, 401, 401, 92, 401, 401, 401, 401,
+ 401, 401, 401, 401, 304, 401, 401, 401, 401, 225,
+ 401, 401, 401, 401, 401, 401, 253, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 311, 401, 401,
+ 401, 401, 401, 350, 401, 352, 351, 186, 401, 401,
+ 401, 85, 401, 401, 401, 401, 198, 401, 401, 401,
+ 401, 401, 128, 130, 129, 401, 401, 401, 26, 401,
+ 401, 181, 401, 183, 401, 231, 401, 401, 401, 401,
+ 187, 401, 401, 258, 401, 401, 401, 401, 268, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 162, 366,
+
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 297, 401, 401, 280, 401, 401, 401, 401, 401, 401,
+ 401, 367, 401, 28, 401, 319, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 97, 232, 401, 401, 274,
+ 401, 401, 401, 302, 401, 342, 401, 224, 401, 401,
+ 314, 401, 401, 401, 312, 64, 401, 401, 401, 401,
+ 401, 401, 401, 4, 401, 401, 401, 401, 401, 401,
+ 401, 143, 401, 161, 401, 401, 401, 203, 30, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 271, 43, 44, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 327, 401, 401, 401, 401, 401, 401, 401,
+ 288, 401, 401, 401, 401, 401, 401, 401, 401, 235,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 96, 95, 401, 401,
+ 65, 401, 401, 300, 308, 401, 276, 401, 401, 401,
+ 401, 401, 11, 401, 401, 401, 401, 371, 401, 401,
+ 401, 401, 401, 401, 401, 142, 401, 401, 401, 401,
+ 401, 401, 233, 102, 401, 401, 46, 401, 401, 401,
+
+ 401, 401, 401, 401, 401, 193, 401, 259, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 164, 401, 401,
+ 401, 401, 279, 401, 401, 401, 401, 401, 287, 401,
+ 401, 401, 401, 157, 401, 401, 401, 136, 138, 137,
+ 401, 401, 401, 104, 109, 103, 401, 401, 174, 401,
+ 401, 401, 401, 93, 401, 273, 310, 401, 401, 401,
+ 401, 401, 401, 10, 401, 401, 401, 401, 401, 306,
+ 401, 401, 357, 401, 401, 401, 401, 401, 401, 401,
+ 401, 363, 45, 401, 401, 401, 401, 401, 192, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 110, 108, 401,
+ 401, 401, 57, 401, 401, 94, 401, 339, 401, 401,
+ 401, 401, 25, 401, 401, 401, 401, 401, 217, 401,
+ 401, 355, 356, 353, 401, 401, 401, 401, 234, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 213,
+ 401, 401, 182, 87, 88, 401, 401, 401, 401, 401,
+ 401, 328, 401, 401, 401, 401, 401, 401, 401, 284,
+ 401, 401, 283, 158, 401, 401, 107, 401, 106, 54,
+ 401, 401, 165, 166, 169, 170, 167, 168, 98, 337,
+
+ 401, 401, 307, 146, 401, 401, 401, 401, 27, 401,
+ 185, 401, 401, 401, 401, 401, 211, 401, 270, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 200, 199, 236, 47, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 335, 401, 401, 401, 401, 115, 401, 401,
+ 269, 401, 401, 298, 332, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 368, 401, 111, 55,
+
+ 66, 5, 401, 401, 255, 401, 401, 401, 401, 333,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 285,
+ 29, 401, 401, 401, 260, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 286, 401, 401, 401, 401,
+ 163, 401, 401, 401, 401, 401, 401, 401, 401, 201,
+ 401, 210, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 329, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 362, 349, 401, 401, 293, 401, 401, 401,
+ 401, 401, 330, 401, 401, 401, 401, 401, 401, 331,
+
+ 401, 401, 401, 291, 401, 294, 295, 401, 401, 401,
+ 401, 401, 292, 296, 0
} ;
static const YY_CHAR yy_ec[256] =
@@ -841,881 +852,903 @@ static const YY_CHAR yy_meta[67] =
1, 1, 1, 1, 1, 1
} ;
-static const flex_int16_t yy_base[3939] =
+static const flex_int16_t yy_base[4034] =
{ 0,
0, 0, 64, 67, 70, 72, 78, 84, 89, 92,
- 131, 137, 112, 118, 123, 142, 574, 532, 96,11178,
- 11178,11178, 160, 185, 116, 183, 229, 132, 175, 173,
- 232, 50, 66, 120, 263, 275, 159, 323, 134, 375,
- 416, 286, 308, 283, 177, 126, 258, 520,11178,11178,
- 11178, 95, 471,11178,11178,11178, 236, 462, 476,11178,
- 11178,11178, 351, 398,11178,11178,11178, 104, 388,11178,
- 369,11178, 167, 375, 385, 383,11178,11178,11178, 390,
- 330,11178,11178,11178, 146, 309, 394, 177, 0, 406,
- 0, 0, 210, 224, 235, 281, 310, 259, 343, 389,
-
- 256, 187, 396, 428, 426, 325, 382, 446, 303, 425,
- 402, 463, 344, 381, 423, 450, 451, 454, 473, 469,
- 472, 480, 501, 498, 496, 507, 453, 513, 487, 518,
- 503, 509, 535, 523, 538, 528, 543, 537, 386, 547,
- 559, 556, 351, 561, 573, 568, 594, 565, 592, 599,
- 585, 596, 595, 609, 627, 618, 626, 620, 621, 636,
- 637, 635, 291, 180, 273, 238, 270, 678, 306, 258,
- 342, 230, 689, 693, 0, 668, 152, 697, 188, 138,
- 455, 669, 666, 672, 677, 680, 697, 683, 698, 681,
- 696, 704, 695, 702, 707, 740, 701, 732, 743, 226,
-
- 749, 793, 750, 733, 754, 728, 753, 756, 772, 762,
- 767, 788, 795, 785, 777, 783, 811, 748, 803, 816,
- 853, 828, 817, 789, 240, 835, 850, 250, 819, 607,
- 852, 847, 723, 860, 91, 768, 845, 863, 887, 872,
- 569, 864, 855, 879, 883, 877, 895, 880, 904, 842,
- 898, 892, 891, 929, 910, 899, 923, 912, 938, 928,
- 930, 948, 925, 944, 951, 939, 952, 956, 965, 943,
- 968, 955, 950, 980, 969, 992, 989, 986, 970, 979,
- 985, 991, 982, 994, 984, 995, 1011, 1009, 1028, 1029,
- 1020, 1030, 1038, 1024, 1026, 1027, 1033, 1032, 1036, 1023,
-
- 1054, 1055, 1041, 1063, 1073, 233, 1059, 1075, 1078, 1067,
- 1092, 1081, 1085, 1086, 1087, 1090,11178, 1097, 1101, 1102,
- 1116, 1103, 1117, 1098, 1122, 1136, 1137, 1113, 1123, 1125,
- 1126, 1134, 1144, 1140, 1151, 1150, 1152, 1171, 1157, 1173,
- 1168, 1162, 1178, 1174, 1217, 1179, 1196, 1185, 1262, 1189,
- 1191, 1212, 1225, 1230, 486, 1219, 1211, 1249, 1218, 1232,
- 1255, 1241, 1261, 1258, 1282, 1274, 1277, 1259, 1276, 1285,
- 1286, 1296, 1299, 1301, 1164, 1321,11178, 1300, 1325, 1215,
- 1326, 1327, 1334, 1336, 1341, 1353, 1335, 1354, 1346, 1370,
- 1371, 1403, 1451, 1358, 1381, 1373, 1380, 1396,11178, 1390,
-
- 1399, 1500, 1417, 1419, 1391, 1392, 1429, 1420, 1430, 1423,
- 1444, 1439, 1450, 1446, 1434, 1462, 1469, 1480, 1499, 1473,
- 1478, 1491, 1518, 1527, 1509, 1468, 1507, 1501, 1525, 1520,
- 1530, 1558, 1465, 1539, 1551, 1562, 1543, 1547, 1552, 1553,
- 1559, 1570, 1571, 1585, 1577, 1597, 1583, 1590, 1591, 1586,
- 1603, 1593, 1617, 1662, 1596, 1613, 1614, 1623, 1629, 1636,
- 1624, 1641, 1631, 1654, 1650, 1651, 1658, 1660, 1642, 1665,
- 1677, 1687, 1666, 1686, 1692, 1684, 1674, 1700, 1703, 1711,
- 1697, 1701, 1698, 1717, 1728, 1713, 1732, 1736, 1738, 1733,
- 1748, 1746, 1750, 1752, 1735,11178, 1755, 1765,11178, 1760,
-
- 1759, 1762, 1761, 1764, 1769, 1775, 1778,11178, 1786, 1782,
- 1787, 1808, 1797, 1820, 1809, 1821, 1794, 1805, 1817, 1826,
- 1816, 1822, 1814, 1844, 1831, 1839, 1845, 1840, 1855, 1843,
- 1841, 1857, 1856, 1869, 1864, 1870, 1877, 1867, 1872, 1920,
- 11178, 1878, 1882, 1880, 1904, 1891, 1906, 1900, 1925, 1945,
- 1917, 1937, 1941, 1949, 1970, 1956, 1963, 1977, 1951, 1966,
- 1981, 1967, 1987, 1976, 1983, 1984, 2004, 1993, 1892, 2011,
- 2008, 2002, 2009, 1918,11178, 2013, 2014, 2026, 2029, 1922,
- 2015, 2019, 2018, 2035, 2001, 2032, 2040, 2051, 2050, 2064,
- 2041, 2061, 2070, 2076, 2060, 2078, 2080, 2067, 2081, 2075,
-
- 2068, 2093, 2082, 2097, 2103, 2088, 2123, 2101, 2117, 2121,
- 158, 2106, 2126, 2129, 2137, 2140, 2116, 2115, 2133, 2135,
- 2142, 2132, 2144, 2154, 2150, 2143, 2149, 2169, 2159, 2160,
- 2171, 2165, 2184, 2174, 2190, 2170, 2178, 2198, 2187, 2192,
- 2193, 2163, 2204, 2207, 2234, 2205, 2226, 2211, 2212, 2217,
- 2236, 2233, 2243,11178, 2248, 2250, 2249, 2261, 2262, 2266,
- 2264, 2273, 2268, 2272, 2275, 2270, 2291, 2286, 2224, 2292,
- 2285, 2298, 2294, 2293, 2300, 2313, 2312, 2331, 2323, 2332,
- 2338, 2325, 2342, 2339, 2328, 2333, 2334, 2349, 2351, 2337,
- 2352, 2358, 2360, 2355, 2362, 2361, 2391, 2379, 2382, 2393,
-
- 2388, 2381, 2387, 2394, 2383, 2401, 2404, 2409, 2430, 2422,
- 2423, 2419, 2442, 2440, 2420, 2450, 2436, 2451, 2437, 2438,
- 2463, 2466, 2467, 2468, 2449, 2469, 2462, 2472, 2476, 2474,
- 2478, 2504, 2494, 2475, 2490, 2498, 2508, 2503, 2502, 2513,
- 2524, 2515, 2511, 2526, 2538, 2539, 2542, 2536, 2548, 2545,
- 2560, 2553, 2551, 2563, 2565, 2571, 2566, 2577, 2568, 2592,
- 2595, 2598, 2583, 2597, 2606, 2594, 2608, 2604, 2603, 2609,
- 2619, 2625, 2479, 2636, 2640, 2644, 2633, 2642, 2634, 2650,
- 2645, 2635, 2654, 2657, 2687, 2668, 2670,11178, 2669, 2550,
- 2671, 2672, 2685, 2682, 2676, 2684, 2696, 2709, 2697, 2700,
-
- 2695, 2683, 2698, 2744,11178, 2715,11178,11178, 759, 2714,
- 11178,11178, 2711, 2727,11178, 2721, 2745, 2741, 2758, 2748,
- 2754, 2760, 2773, 2768, 2775, 2772, 2742, 2819, 2777, 2798,
- 2785, 2787, 2814, 2783, 2824, 2822, 2790, 2830, 2841, 2834,
- 2812, 2767, 2836, 2851, 2845, 2861, 2868, 2870, 2871, 2872,
- 2873, 2878, 2864, 2862, 2886, 2865, 2887, 2901, 2883, 2900,
- 2896, 2904, 2893, 2907, 2910, 2897, 2931, 2924, 2930, 2940,
- 11178, 2927, 2943, 2921, 2928, 2933, 2946, 2945, 2949, 2958,
- 2956, 2955, 2964, 2965, 2951, 2960, 2957, 2966, 2977, 2972,
- 2976, 2970, 2982, 3000, 2996, 2999, 3010, 3016, 2997, 2993,
-
- 11178, 3008, 3009, 2995, 3014, 3020, 3021, 3028, 3033, 3026,
- 3024, 3041, 3046, 3066, 3048, 3053, 3055, 3044, 3060, 3061,
- 3056, 3081,11178, 3076, 3064, 3073, 3090, 3077, 3097, 3052,
- 3086, 3087, 3096, 3101, 3103, 3111, 3100, 3112, 3125, 3123,
- 3122, 3119, 3121, 3127, 3138, 3139, 3137, 3150, 3156, 3153,
- 3143, 3148, 3149, 3152, 3161, 3164, 3166, 3174, 3175, 3178,
- 3197, 3184, 3202, 3189, 3180, 3209, 3211, 3206, 3196, 3208,
- 3212, 3205, 3213, 3223, 3224, 3231, 3225, 3232, 3236, 3229,
- 3246, 3230, 3241, 3255, 3261, 3267, 3251, 3265, 3270, 3258,
- 3263, 3259, 3284, 3276,11178, 3275, 3286, 3305,11178, 3296,
-
- 3294, 3291, 3344, 3310, 3316, 3321, 3330, 3324, 3304, 3354,
- 3341, 3335, 3352, 3362, 3356, 3369, 3364, 3376, 3391, 3383,
- 3400, 3372, 3397, 3392, 3404, 3387, 3399, 3403, 3411, 3414,
- 3418, 3426, 3441, 3437, 760, 3449, 3424, 3429, 3434, 3479,
- 3442, 3450, 3443, 3447, 3461, 3486, 3475, 3451, 3474, 3481,
- 3477, 3484, 3500, 3502, 3504, 3507, 3497, 3512, 3517, 3520,
- 3467, 3529, 3521,11178, 3526, 3534, 3530, 3540, 3539, 3555,
- 3546, 3544,11178, 3550, 3560, 3554, 3579, 3566, 3561, 3578,
- 3564, 3571, 3588, 3572, 3582, 3586, 3591, 3597, 3587, 3606,
- 11178, 3601,11178, 3609, 3605, 3610, 3615, 3613, 3607, 3624,
-
- 3621, 3614, 3640, 3641,11178,11178, 3644, 3650, 3634, 3653,
- 3662, 3663, 3651, 3659, 3656,11178, 3648, 3684,11178, 3691,
- 3670, 3690, 3680, 3678, 3672, 3696, 3682, 3689, 3699, 3709,
- 3686, 3713, 3716, 3705, 3720,11178, 3723, 3725, 3717, 3730,
- 3737, 3729, 3739, 3741, 3744, 3747,11178, 3754, 3751, 3757,
- 3756, 3758, 3770, 3771, 3761, 3786, 3781, 3773, 3774, 3772,
- 3799, 3783, 3800, 3808, 3810, 3806, 3807, 3819, 3816, 3820,
- 11178, 3817, 3813, 3805, 3829, 3823, 3830, 3827, 3832, 3837,
- 3833, 3826, 3858, 3859, 3854, 3866, 3849, 3863, 3855, 3878,
- 3882, 3864, 3890, 3870, 3877, 3873, 3872, 3885, 1348, 3889,
-
- 3899, 3891, 3888,11178, 3900, 3911, 3921, 3916, 3923, 3926,
- 3905, 128, 3915, 3918, 3927, 3936, 3935, 3934, 3957, 3945,
- 3964, 3969, 3959, 3955, 3958, 3968, 3975, 3976, 3966, 3984,
- 3978, 3972, 3990, 3985, 3999, 4001, 3994,11178, 4018, 4005,
- 4020, 4014, 4004, 4012, 4028, 4010, 4048,11178, 4025, 4041,
- 4033, 4044, 4051, 4046, 4049, 4069, 4047, 4052, 4068,11178,
- 4076, 4065, 4071, 4087, 4095, 4074, 4091, 4086,11178, 4106,
- 4104, 4107, 4096, 4114, 4113, 4111, 4110, 4115, 4126, 4146,
- 4133, 4128, 4138, 4132, 4140, 4136, 4160, 4141, 4153, 4174,
- 4159, 4162, 4175, 4177, 4171, 4183, 4178, 4169, 4185, 4176,
-
- 4187,11178, 4204, 4193, 4199, 4210, 4196, 4209, 4223, 4203,
- 4238, 4220, 4227, 4219, 4243, 4271, 4235, 4242, 4234, 4255,
- 4259, 4254, 4265, 4262, 4268, 4282, 4292, 4275, 4303, 4305,
- 4295, 4298, 4302, 4317, 4321, 4309, 4306, 4322, 4314, 4320,
- 4339, 4334, 4344, 4341, 4348, 4337, 4371, 4351, 4343, 4368,
- 3473, 4361,11178, 4355, 4366, 4370, 4374, 4367, 4405, 4393,
- 4395, 4384, 4408, 4396, 4400, 4407, 4411, 4401, 4429, 4420,
- 4427, 4417, 4431, 4436, 4432, 4434, 4442, 4433, 4437, 4450,
- 4465, 4452, 4471, 4469, 4473,11178, 4477, 4476, 4464, 4478,
- 4484, 4466, 4485, 4489, 4492, 4488, 4499, 4500, 4495, 4498,
-
- 4506, 4525, 4510, 4504, 4524, 4526, 4532, 4522,11178, 4536,
- 4527, 4531, 4533, 4550, 4541, 4562, 4567, 4571, 4573, 4575,
- 4577, 4561, 4580, 4583, 4568,11178, 4548, 4585, 4587, 4588,
- 4589, 4602, 4599, 4610, 4596, 4604, 4605,11178, 4617, 4609,
- 4620, 4613, 4614, 4612, 4638, 4647, 4637, 4639,11178, 4651,
- 4649, 4653, 4654, 4658, 4648, 4644, 4665, 4664, 4671, 4677,
- 4662, 4666, 4683, 4685, 4701, 4690, 4700,11178, 4689, 4693,
- 4706, 4723, 4704, 4712, 4717, 4715, 4711, 4736, 4750, 4732,
- 4735, 4733,11178, 4748, 4745, 4753, 4756, 4770, 4752, 4760,
- 4772, 4764, 4768, 4784, 4774, 4782, 4788, 4783,11178, 4791,
-
- 4794, 4796, 4806, 4800, 4808, 4809, 4781, 4810, 4824, 4819,
- 4829, 4827, 4830, 4825, 4853, 4841, 4854, 4846, 4833, 4855,
- 4852, 4862, 4835, 4857, 4867, 4877, 4888, 4897, 4881, 4898,
- 4896, 4894, 4885, 4886, 4904, 4902, 4903, 4911, 4915, 4917,
- 11178, 4919, 4928, 4924, 4922, 4908, 4927, 4935, 4945, 4947,
- 4936, 4949, 4953, 4951, 4942, 4986, 4987, 4966, 4969, 4972,
- 4971, 4975, 4982, 4996, 4976, 4984, 4988, 5010, 5002, 5008,
- 4992, 5005, 4998, 5013, 5011, 5021, 5015, 5017, 5032, 5031,
- 5033, 5037, 5042, 5035, 5044, 5028, 5045, 5063, 5048, 5055,
- 5068, 5078, 5081, 5079, 5082, 5072, 5076, 5087, 5089, 5098,
-
- 11178, 5092, 5094, 5115, 5107, 5106, 5112, 5130, 5127, 5140,
- 5121, 5125, 5145, 5141, 5139, 5147, 5142, 5153, 5149, 5155,
- 5150, 5156,11178, 5161,11178, 5165, 5160, 5159, 5183, 5166,
- 5170,11178, 5194,11178, 5192, 5196, 5185, 5187, 5188,11178,
- 5197, 5178, 5189, 5198, 5193, 5217, 5214, 5211, 5216, 5228,
- 5223, 5244, 5241, 5238, 5230, 5231, 5224, 5234, 5251, 5239,
- 5245, 5262, 5255, 5277, 5279, 5264, 5285, 5265, 5269, 5282,
- 5291, 5280, 5296,11178, 5298, 5305, 5300, 5289, 5312, 5292,
- 5306, 5307, 5318, 5322, 5315, 5332, 5330, 5342, 5323, 5348,
- 5334, 5349, 5358, 5346, 5351, 5357, 5363, 5364, 5367, 5361,
-
- 5375, 5376, 5381,11178, 5378, 5355, 5379, 5382, 5391, 5394,
- 11178, 5402, 5387, 5414, 5416, 5406, 5408, 5397, 5427, 5431,
- 5418, 5425, 5428, 5443, 5438, 5445, 5451, 5463,11178, 5453,
- 5464, 5454, 5457, 5467, 5444, 5490, 5491, 5487, 5473, 5496,
- 5503, 5494, 5489, 5486, 5488, 5485, 5508, 5513, 5515, 5525,
- 5517, 5530, 5510, 5523, 5527, 5531, 5521, 5526, 5532, 5524,
- 5541, 5542, 5548, 5550, 5549, 5553, 5568, 5563, 5552, 5574,
- 11178, 5570, 5573, 5580, 5589, 5576, 5586, 5584, 5592, 5607,
- 5613, 5608,11178, 5615, 5598, 5616, 5612, 5625, 5623, 5622,
- 5603, 5629, 5637, 5642, 5651, 5650, 5644,11178, 5652,11178,
-
- 5643, 5641, 5673, 5675, 5680, 5669, 5664, 5687, 5683, 5679,
- 5678, 5693, 5696, 5708, 5691, 5699, 5694, 5700, 5706, 5703,
- 5720, 5710, 5727, 5746, 5744, 5738, 5728, 5737, 5733, 5739,
- 5741, 5767, 5747, 5758,11178,11178, 5756, 5764, 5768, 5773,
- 5771, 5777, 5788, 5791, 5790, 5796, 5804, 5794, 5803, 5807,
- 5827,11178, 5821, 5822, 5814, 5833, 5826, 5763, 5828, 5842,
- 5816, 5839, 5831, 5852, 5850,11178, 5841, 5854, 5843, 5855,
- 5862, 5877, 5864,11178, 5868,11178, 5866, 5871, 5873, 5870,
- 5882, 5897, 5881, 5901, 5898, 5902, 5904, 5899, 5927, 5928,
- 5912, 5917, 5932, 5914, 5922, 5929, 5935, 5923, 5951, 5931,
-
- 5944, 5946,11178, 5952, 5945, 5962, 5963, 5949, 5972, 5976,
- 5961, 5959,11178, 5971,11178, 5973, 5993, 5980, 5994, 5990,
- 6013, 5995, 6003, 5997, 6018, 6020, 6009, 6012, 6022, 6021,
- 6026, 6024, 6017,11178, 6039, 6036, 5999, 6042, 6041, 6051,
- 6060, 6064, 6050, 6071,11178, 6068, 6077, 6061, 6065, 6080,
- 6079, 6078, 6087, 6093, 6082, 6086, 6092, 6094, 6106, 6113,
- 6115, 6114, 6107, 6120, 6123, 6121, 6134, 6151, 6139, 6131,
- 6132, 6104, 6141,11178, 6148, 6150, 6153, 6149, 6140, 6177,
- 6168, 6173, 6185, 6186, 6178, 6188, 6192, 6176, 6181, 6189,
- 6194, 6203, 6219, 6214,11178, 6223, 6204, 6228, 6209, 6221,
-
- 6208, 6224, 6238, 6220, 6234, 6242, 6230, 6231, 6251, 6257,
- 6263, 6265, 6248, 6268, 6266, 6258, 6274, 6273, 6278, 6279,
- 6289, 6283,11178, 6317, 6297, 6303, 6275, 6308, 6305, 6327,
- 6322, 6309, 6307, 6333, 6313, 6336, 6321, 6330, 6342, 6350,
- 6351, 6345,11178,11178, 6353, 6334, 6358,11178, 6362, 6354,
- 6347, 6357, 6366, 6369, 6373, 6370, 6372, 6381, 6386, 6378,
- 6389, 6401, 6380, 6396,11178, 6416, 6414, 6425, 6407, 6417,
- 6426, 6428,11178, 6410, 6431, 6432, 6433, 6436, 6420, 6422,
- 6421, 6447, 6449, 6463, 6446, 6444, 6467, 6480, 6469, 6483,
- 6459, 6472, 6478,11178, 6465, 6462, 6495, 6501, 6489, 6496,
-
- 6502,11178, 6499, 6516, 6503, 6526, 6510, 6521, 6524, 6530,
- 6525, 6535, 6528, 6540, 6531, 6551, 6544, 6545, 6546, 6543,
- 6557, 6559, 6577, 6567, 6569, 6578, 6581,11178, 6586, 6587,
- 6570, 6583, 6589,11178, 6599, 6623, 6592,11178, 6605, 6594,
- 6606, 6612, 6632,11178, 6616, 6625, 6619, 6633, 6610, 6641,
- 6618, 6646, 6627, 6639, 6648, 6630, 6643, 6659, 6653,11178,
- 6660, 6655, 6673,11178, 6677, 6676, 6680, 6683, 6684, 6688,
- 6689, 6682, 6675, 6694, 6687, 6691, 6692, 6704,11178, 6712,
- 6732,11178, 6723, 6724, 6708, 6718, 6733,11178, 6725, 6731,
- 6736, 6738, 6739, 6742, 6744, 6751, 6746, 6752, 6753, 6759,
-
- 6763, 6788, 6780, 6786, 6790, 6769, 6783, 6775, 6781,11178,
- 6800, 6776, 6789, 6796, 6804, 6825, 6820, 6818, 6813, 6828,
- 6822,11178,11178, 6836,11178, 6838, 6821, 6827, 6842,11178,
- 6844, 6852, 6811, 6850, 6845, 6872, 6861, 6860, 6876, 6873,
- 11178, 6880, 6882,11178, 6868, 6884, 6855, 6892, 6889, 6893,
- 6877, 6911, 6913, 6900, 6886, 6916, 6917, 6918, 6908, 6920,
- 6931, 6936, 6927, 6962,11178, 6933, 6943, 6940, 6951, 6956,
- 6949, 6972, 6977, 6967,11178, 6979, 6983, 6970, 6993, 6996,
- 11178,11178, 6991,11178, 6989, 7004, 6978, 7017, 7002, 7006,
- 7027, 7008,11178, 7022, 7018, 7036, 7011, 7034, 7040,11178,
-
- 7038, 7045, 7029, 7044, 7048, 7046, 7052, 7063, 7066, 7085,
- 7073,11178, 7064, 7072, 7070, 7060, 7087, 7090, 7077, 7091,
- 7099, 7093, 7094, 7089, 7127, 7116, 7102, 7118, 7134, 7136,
- 7122, 7128, 7121,11178, 7138, 7141, 7144, 7149, 7152, 7155,
- 7147, 7160,11178, 7162, 7166, 7176, 7179,11178, 7173, 7187,
- 7182, 7185, 7174, 7197, 7198, 7194, 7171, 7190, 7205, 7221,
- 11178, 7217, 7218, 7208, 7222, 7231, 7224, 7223,11178,11178,
- 7240,11178, 7255, 7239, 7237, 7247, 7244, 7263, 7270, 7266,
- 7276, 7260, 7258, 7279, 7286, 7267, 7285, 7281,11178, 7290,
- 7289, 7292, 7320, 7303, 7316, 7318,11178, 7315, 7302,11178,
-
- 7304,11178, 7310, 7307, 7326, 7331, 7329, 7335, 7339, 7342,
- 7337, 7362,11178, 7344, 7348, 7350, 7356, 7371, 7374, 7373,
- 7349,11178, 7375, 7360, 7381, 7366,11178, 7367, 7391, 7387,
- 7388, 7393, 7399, 7398, 7401, 7402, 7419, 7405, 7409, 7429,
- 7420, 7434, 7423, 7426, 7430, 7428, 7444, 7437, 7432, 7447,
- 7458,11178, 7462, 7454, 7457, 7459, 7460, 7453, 7469, 7472,
- 7479, 7474, 7487, 7499,11178, 7492,11178, 7485, 7494, 7496,
- 7509, 7497, 7513, 7522, 7525, 7503, 7515, 7518, 7520, 7530,
- 7537, 7544, 7541, 7535, 7536, 7540, 7568,11178, 7548, 7555,
- 7559, 7560, 7567, 7565, 7570, 7580,11178, 7584, 7571, 7573,
-
- 7578, 7581, 7602, 7594, 7604, 7592, 7609, 7599, 7617, 7615,
- 7623, 7611, 7618, 7629, 7607, 7628, 7619, 7616,11178, 7634,
- 7632, 7644, 7647, 7640, 7643, 7659, 7650, 7667, 7664, 7654,
- 7657, 7674,11178, 7678, 7660, 7669, 7687,11178, 7677, 7692,
- 7675, 7694, 7684, 7689, 7699, 7703, 7713, 7712, 7722,11178,
- 7728, 7711, 7725, 7715, 7730, 7733, 7726, 7720, 7742, 7752,
- 7760, 7763,11178, 7738, 7755, 7769, 7771, 7772, 7759, 7778,
- 7779, 7786, 7775, 7788,11178, 7792, 7804, 7807, 7801, 7790,
- 7825, 7802, 7806, 7830, 7827, 7833, 7810, 7813, 7839, 7824,
- 7836, 7837, 7840, 7847, 7841, 7852, 7863, 7857,11178, 7850,
-
- 11178, 7858, 7866, 7879, 7886, 7890, 7876, 7892, 7889, 7895,
- 7903, 7907,11178, 7885, 7888, 7909, 7905, 7915, 7928, 7925,
- 7934,11178, 7926, 7930, 7935, 7931,11178, 7941, 7940, 7949,
- 7954, 7947, 7948, 7978, 7979, 7981,11178, 7980, 7984, 7983,
- 7989, 7990, 7985, 7991, 7986, 7992, 8010, 7996, 8011, 8007,
- 8001, 8003, 8017, 8027,11178, 8029, 8036, 8035, 8037, 8038,
- 8041, 8046, 8020, 8044, 8045, 8061,11178, 8052, 8056, 8058,
- 8060, 8067, 8082, 8069, 8085, 8009, 8087, 8091, 8094, 8079,
- 8083, 8096, 8099, 8106, 8098,11178, 8116, 8114, 8129, 8105,
- 8140, 8131, 8109,11178, 8135,11178, 8123, 8132, 8147, 8142,
-
- 8150,11178, 8149, 8138, 8157, 8155, 8162,11178,11178, 8164,
- 8175, 8171, 8185, 8177,11178,11178, 8188,11178, 8174,11178,
- 8179, 8178,11178,11178, 8191, 8173, 8189, 8176,11178, 8204,
- 8206, 8214,11178, 8217,11178, 8227, 8205, 8228, 8219, 8215,
- 8234,11178, 8221, 8242, 8231, 8238, 8230,11178, 8233, 8244,
- 8241, 8232, 8255, 8236,11178, 8275, 8276, 8281, 8265, 8266,
- 8269,11178, 8288, 8290, 8292, 8277, 8282, 8294, 8293, 8299,
- 8309, 8313, 8317, 8325, 8311, 8312, 8328, 8335, 8322, 8341,
- 8342, 8343, 8334, 8345, 8348, 8358, 8350, 8352, 8364, 8355,
- 8356, 8359, 8361, 8368, 8380, 8384, 8378, 8387, 8399, 8390,
-
- 8400, 8392, 8395, 8394, 8393, 8405, 8398, 8414, 8409, 8403,
- 8415, 8417, 8426, 8422, 8423, 8424, 8439, 8440, 8432, 8453,
- 8444, 8457, 8451, 8449, 8462,11178, 8445, 8466, 8470, 8481,
- 8468, 8471, 8493, 8485, 8495, 8497, 8501, 8503, 8498, 8504,
- 11178,11178,11178, 8506,11178, 8508, 8520, 8528, 8521, 8526,
- 11178, 8522, 8525, 8523, 8524, 8534, 8537, 8536, 8555, 8558,
- 8559, 8561, 8573,11178, 8571, 8560, 8562, 8568, 8582, 8580,
- 11178, 8583, 8593, 8581, 8594, 8595, 8589, 8600, 8606, 8607,
- 8614, 8609, 8627, 8622, 8611, 8632, 8617, 8635, 8639,11178,
- 8643, 8646, 8567, 8642, 8647, 8648, 8649, 8657, 8656, 8650,
-
- 8658, 8659, 8662, 8670, 8680, 8673, 8689, 8697, 8696, 8700,
- 8701,11178, 8684,11178, 8695, 8698, 8707, 8712, 8708, 8716,
- 8710, 8718, 8714,11178,11178, 8727, 8730, 8746, 8750, 8737,
- 8735, 8751, 8744, 8741, 8754,11178, 8757, 8771, 8760, 8763,
- 8761, 8776,11178, 8777, 8769, 8775, 8778, 8783, 8780, 8801,
- 11178, 8794, 8799, 8805, 8810, 8812, 8796, 8814, 8820, 8821,
- 8813, 8819, 8823, 8817,11178, 8824,11178,11178,11178, 8833,
- 8840, 8832, 8853, 8842, 8850, 8851, 8856, 8857, 8859, 8862,
- 8867, 8858,11178, 8871,11178,11178, 8869,11178, 8870, 8885,
- 8883, 8895, 8886, 8897, 8896,11178, 8892,11178, 8911, 8912,
-
- 8893, 8909, 8918, 8920, 8913, 8922, 8902, 8937, 8934, 8945,
- 8924, 8935, 8640, 8951, 8952, 8932,11178, 8959, 8943, 8961,
- 8963, 8965,11178,11178, 8962, 8968, 8971, 8972, 8996, 8977,
- 8992, 8986, 8884, 8999, 9001, 9002, 9005, 8995, 9004, 8990,
- 9020, 9021, 9013, 9023, 8974,11178, 9029, 9037, 9022,11178,
- 9031,11178, 9039, 9041, 9048, 9033, 9052, 9045, 9050, 9056,
- 9058, 9070, 9071,11178,11178, 9064, 9060, 9083,11178,11178,
- 9069, 9073, 9075, 9080, 9090, 9097, 9086,11178, 9102, 9103,
- 9107, 9091, 9110, 9113, 9114, 9117,11178, 9127,11178, 9123,
- 9121, 9145, 9122, 9126, 9132, 9137, 9133, 9162, 9158, 9153,
-
- 9140, 9163,11178, 9157, 9160,11178, 9167, 9172, 9177, 9164,
- 9183, 9171, 9186,11178, 9178, 9185,11178, 9196, 9184, 9214,
- 9215,11178, 9216, 9213, 9220, 9209,11178, 9219,11178, 9202,
- 9221, 9223, 9232, 9227,11178, 9211, 9236, 9237, 9250,11178,
- 9233, 9255, 9261, 9262, 9254, 9258,11178, 9268, 9252,11178,
- 9249, 9272, 9273, 9275, 9276, 9280, 9277, 9287, 9279, 9292,
- 9286, 9304,11178,11178, 9315, 9306, 9316, 9307, 115, 9321,
- 9299, 9303, 9317, 9318, 9330, 9332, 9333, 9313, 9325, 9341,
- 11178,11178, 9346, 9342,11178, 9345, 9351,11178, 9336, 9352,
- 9357, 9349, 9365, 9344, 73, 9363, 9372, 9375, 9373, 9392,
-
- 9377, 9379, 9388,11178, 9412, 9416, 9382, 9405, 9407, 9419,
- 9423, 9425, 9428, 9411, 9431, 9413, 9415, 9435, 9434, 9432,
- 9430, 9440, 9456, 9446, 9450, 9454,11178, 9469, 9478, 9476,
- 9467, 9480, 9481, 9483, 9468,11178, 9484, 9491, 9485, 9494,
- 11178, 9489, 9493, 9495, 9490, 9510, 9514,11178, 9506, 9500,
- 9528, 9526, 9525, 9513, 9527, 9520, 9516, 9544,11178, 9529,
- 9539, 9541,11178, 9543,11178,11178,11178, 9555, 9549, 9550,
- 11178, 9567, 9559, 9553, 9556,11178, 9579, 9581, 9575, 9593,
- 9577,11178,11178,11178, 9565, 9591, 9586,11178, 9583, 9598,
- 11178, 9585,11178, 9588,11178, 9594, 9602, 9613, 9610,11178,
-
- 9622, 9617,11178, 9621, 9615, 9624, 9646,11178, 9633, 9635,
- 9639, 9634, 9625, 9636, 9648, 9649, 9652,11178,11178, 9658,
- 9659, 9666, 9669, 9660, 9670, 9679, 9675, 9663, 9693, 9674,
- 9689,11178, 9688, 9698, 9705, 9711, 9694, 9702, 9707,11178,
- 9684,11178, 9714,11178, 9715, 9720, 9723, 9731, 9734, 9729,
- 9727, 9740, 9747, 9737, 9739, 9750, 9744, 9758, 9742, 9765,
- 9781, 9763,11178,11178, 9788, 9773,11178, 9783, 9791, 9793,
- 11178, 9775,11178, 9794,11178, 9785, 9790,11178, 9792, 9795,
- 9799,11178,11178, 9798, 9807, 9820, 9810, 9809, 9813, 9816,
- 11178, 9838, 9828, 9822, 9826, 9830,11178, 9850,11178, 9831,
-
- 9853, 9847,11178,11178, 9845, 9834, 9846, 9863, 9849, 9855,
- 9870, 9872, 9876, 9861, 9891, 9865, 9886, 9873, 9895, 9896,
- 9904, 9890, 9903, 9911, 9908,11178,11178,11178, 9907, 9917,
- 9920, 9916, 9912, 9915, 9923, 9929, 9927,11178, 9944, 9951,
- 9947, 9936, 9932, 9943, 9957,11178, 9946, 9948, 9956, 9964,
- 9962, 9967, 9953, 9983,11178, 9968, 9990, 9997, 9993, 9985,
- 9995,10001,10002,10003, 9996,10006, 9994, 9988,10016,10004,
- 11178,11178,10018,10019,11178,10037,10038,11178,11178,10020,
- 11178,10022,10026,10023,10029,10053,11178,10040,10031,10033,
- 10041,11178,10043,10050,10061,10072,10069,11178,10056,10081,
-
- 10065,10068,10084,10086,11178,11178,10076,10093,11178,10094,
- 10099,10088,10103,10095,10098,10105,10112,11178,10108,11178,
- 10115,10118,10116,10120,10122,10125,10126,10130,10135,11178,
- 10143,10139,10149,10152,11178,10153,10157,10164,10156,10183,
- 11178,10184,10166,10165,10185,11178,10167,10192,10193,11178,
- 11178,11178,10174,10197,10198,11178,11178,11178,10203,11178,
- 10205,10216,10204,10207,11178,10211,11178,11178,10227,10237,
- 10241,10228,10243,10240,11178,10242,10248,10246,10231,10238,
- 11178,11178,10251,10255,10239,10260,10258,10261,10254,10269,
- 11178,11178,10266,10270,10288,10285,10283,11178,10282,10293,
-
- 10296,10302,10297,10304,10303,10308,10311,10312,10299,10331,
- 10328,10347,10318,10319,10333,10322,10345,10346,10335,10352,
- 10358,10353,10356,10357,10361,10360,11178,11178,10366,10355,
- 11178,10368,10380,11178,10372,11178,10391,10394,10397,10398,
- 11178,10400,10401,10402,10404,10379,11178,10399,10409,11178,
- 10410,10403,10407,10393,11178,10396,10414,10423,10422,10418,
- 10430,10432,10446,10436,10451,11178,10437,10453,11178,11178,
- 11178,10449,10438,10455,10435,10465,10450,11178,10464,10460,
- 10470,10481,10471,10478,10473,11178,10493,10492,11178,11178,
- 10498,10488,11178,10505,11178,10483,10487,11178,11178,11178,
-
- 11178,11178,11178,11178,11178,10513,10519,11178,11178,10508,
- 10504,10512,10524,11178,10527,11178,10514,10529,10539,10530,
- 10532,11178,10528,11178,10549,10535,10541,10548,10559,10545,
- 10562,10554,10564,10555,10568,10571,10577,10588,10566,10594,
- 10580,10590,10598,10587,10608,10589,10607,11178,11178,11178,
- 11178,10604,10593,10622,10623,10624,10637,10633,10640,10642,
- 10643,10625,10626,10645,10650,10651,10636,10647,10652,10666,
- 10664,10679,10658,10667,10681,10686,10690,11178,10692,10682,
- 10677,10695,11178,10683,10688,11178,10678,10694,11178,11178,
- 10700,10715,10693,10711,10723,10736,10718,10720,10721,10729,
-
- 10735,11178,10737,11178,11178,11178,11178,10725,10724,11178,
- 10727,10749,10739,10754,11178,10745,10748,10750,10757,10761,
- 10759,10782,10784,10779,11178,11178,10763,10773,10775,11178,
- 10786,10793,10798,10804,10806,10810,10812,10814,10805,10809,
- 11178,10808,10818,10826,10811,11178,10836,10828,10841,10830,
- 10833,10832,10835,10845,11178,10842,11178,10856,10864,10868,
- 10860,10859,10863,10871,10872,10888,10876,10890,11178,10870,
- 10900,10883,10905,10907,10909,10911,10903,10912,10913,10919,
- 10923,10926,10930,10935,10928,10938,10929,11178,11178,10931,
- 10940,11178,10939,10949,10941,10953,10962,11178,10961,10958,
-
- 10964,10978,10973,10975,11178,10984,10992,10986,11178,10989,
- 11178,11178,10990,10988,10999,10996,10997,11178,11178,11178,
- 11058,11065,11072,11079,11086,11093,11100, 100,11107,11114,
- 11121,11128,11135,11142,11149,11156,11163,11170
+ 131, 137, 112, 118, 123, 142, 573, 532, 96,11459,
+ 11459,11459, 160, 185, 116, 183, 229, 132, 175, 173,
+ 278, 50, 66, 120, 230, 268, 159, 325, 226, 377,
+ 418, 290, 318, 279, 177, 126, 380, 531,11459,11459,
+ 11459, 95, 469,11459,11459,11459, 181, 464, 493,11459,
+ 11459,11459, 238, 424,11459,11459,11459, 104, 422,11459,
+ 394,11459, 167, 350, 380, 402,11459,11459,11459, 405,
+ 329,11459,11459,11459, 146, 306, 424, 168, 0, 436,
+ 0, 0, 225, 219, 252, 209, 319, 215, 248, 357,
+
+ 283, 339, 417, 428, 429, 354, 371, 444, 263, 463,
+ 304, 461, 384, 425, 233, 456, 374, 452, 486, 483,
+ 482, 435, 493, 494, 503, 509, 481, 320, 521, 504,
+ 526, 524, 519, 536, 525, 538, 529, 566, 552, 556,
+ 546, 558, 573, 561, 563, 568, 593, 588, 614, 579,
+ 609, 615, 605, 612, 341, 608, 641, 628, 642, 634,
+ 632, 648, 636, 651, 296, 174, 286, 364, 276, 692,
+ 310, 270, 179, 256, 696, 704, 0, 673, 236, 710,
+ 207, 152, 222, 684, 699, 679, 690, 385, 706, 696,
+ 701, 691, 698, 715, 692, 711, 718, 749, 726, 725,
+
+ 755, 419, 760, 804, 742, 734, 765, 745, 757, 761,
+ 759, 747, 773, 775, 790, 783, 787, 788, 817, 793,
+ 807, 814, 859, 816, 809, 822, 831, 499, 854, 858,
+ 585, 841, 599, 862, 845, 602, 868, 91, 810, 872,
+ 867, 894, 875, 870, 878, 887, 902, 900, 885, 910,
+ 903, 912, 914, 911, 917, 934, 904, 953, 928, 936,
+ 948, 935, 931, 946, 945, 971, 947, 963, 974, 951,
+ 962, 987, 990, 980, 991, 981, 986, 1001, 988, 992,
+ 1009, 1003, 989, 1004, 1006, 1013, 1015, 1027, 1021, 1018,
+ 1020, 1039, 1026, 1051, 1050, 1052, 1061, 1045, 1049, 1040,
+
+ 1056, 1059, 1066, 1064, 1069, 1072, 1078, 1093, 1096, 150,
+ 1077, 1102, 1105, 1082, 1111, 1107, 1104, 1109, 1119, 1121,
+ 11459, 1086, 1100, 1116, 1115, 1120, 1145, 1150, 1147, 1155,
+ 1161, 1134, 1141, 1136, 1156, 1163, 1162, 1167, 1171, 1168,
+ 1179, 1172, 1183, 1200, 1209, 1196, 1210, 1212, 1199, 1244,
+ 1204, 1198, 1214, 1289, 1230, 1205, 1238, 1249, 1222, 488,
+ 1255, 1254, 1278, 1257, 1259, 1285, 1284, 1288, 1273, 1282,
+ 1312, 1316, 1301, 1321, 1322, 1239, 1319, 1323, 1318, 1332,
+ 1337, 1354,11459, 1340, 1351, 1367, 1363, 1365, 1372, 1371,
+ 1384, 1398, 1379, 1395, 1391, 1380, 1400, 1446, 1494, 1389,
+
+ 1410, 1393, 1406, 1412,11459, 1435, 1415, 1543, 1430, 1425,
+ 1471, 1448, 1472, 1403, 1441, 1462, 1475, 1461, 1474, 1482,
+ 1466, 1443, 1489, 1534, 1491, 1505, 1506, 1493, 1542, 1544,
+ 1521, 1533, 1550, 1548, 1527, 1561, 1553, 1569, 1565, 1571,
+ 1576, 1601, 1577, 1582, 1589, 1591, 1596, 1609, 1588, 1619,
+ 1623, 1626, 1624, 1614, 1616, 1628, 1629, 1599, 1653, 1698,
+ 1640, 1650, 1637, 1664, 1654, 1670, 1657, 1677, 1690, 1679,
+ 1691, 1681, 1686, 1680, 1479, 1705, 1717, 1713, 1728, 1704,
+ 1730, 1723, 1718, 1720, 1731, 1732, 1760, 1740, 1745, 1748,
+ 1758, 1768, 1762, 1755, 1772, 1773, 1779, 1782, 1780, 1785,
+
+ 1792, 1801, 1789,11459, 1753, 1814,11459, 1797, 1812, 1804,
+ 1817, 1806, 1829, 1803, 1810,11459, 1828, 1833, 1816, 1837,
+ 1843, 1840, 1849, 1850, 1863, 1861, 1855, 1872, 1871, 1867,
+ 1864, 1876, 1877, 1882, 1884, 1905, 1899, 1892, 1893, 1895,
+ 1914, 1900, 1920, 1906, 1926, 1912, 1911, 1922, 1962,11459,
+ 1939, 1944, 1919, 1933, 1948, 1964, 1956, 1973, 1975, 1983,
+ 1996, 1997, 2003, 2022, 1991, 2004, 2011, 2009, 1999, 2028,
+ 2010, 2033, 2030, 2038, 2036, 2041, 2025, 2031, 2059, 2057,
+ 2048, 2055, 2068,11459, 2061, 2072, 2075, 2083, 2088, 2077,
+ 2090, 2084, 2071, 2095, 2092, 1844, 2109, 2108, 2116, 2096,
+
+ 2117, 2124, 2101, 2114, 2132, 2134, 2119, 2130, 2123, 2127,
+ 2144, 2135, 2152, 2154, 2140, 2177, 2161, 2138, 2168, 782,
+ 2180, 2178, 2184, 2185, 2191, 2169, 2171, 2181, 2186, 2194,
+ 2183, 2195, 2206, 2210, 2200, 2198, 2220, 2211, 2208, 2227,
+ 2214, 2229, 2225, 2242, 2230, 2219, 2244, 2241, 2237, 2254,
+ 2267, 2258, 2251, 2285, 2255, 2276, 2257, 2279, 2278, 2281,
+ 2284, 2292,11459, 2306, 2294, 2290, 2311, 2323, 2310, 2313,
+ 2325, 2326, 2316, 2312, 2335, 2333, 2339, 2341, 2347, 2354,
+ 2345, 2350, 2343, 2357, 2353, 2366, 2370, 2371, 2390, 2380,
+ 2384, 2397, 2373, 2396, 2398, 2394, 2388, 2404, 2414, 2401,
+
+ 2406, 2417, 2409, 2405, 2413, 2429, 2421, 2455, 2430, 2427,
+ 2444, 2439, 2480, 2432, 2441, 2454, 2446, 2447, 2461, 2468,
+ 2469, 2488, 2477, 2474, 2493, 2514, 2496, 2503, 2509, 2502,
+ 2515, 2495, 2513, 2519, 2527, 2520, 2529, 2555, 2530, 2542,
+ 2538, 2544, 2550, 2533, 2571, 2548, 2567, 2561, 2570, 2573,
+ 2572, 2566, 2577, 2588, 2589, 2586, 2599, 2603, 2601, 2605,
+ 2604, 2611, 2626, 2629, 2623, 2616, 2628, 2631, 2636, 2630,
+ 2640, 2648, 2658, 2664, 2663, 2647, 2672, 2673, 2662, 2674,
+ 2667, 2668, 2675, 2697, 2698, 2578, 2688, 2709, 2713, 2700,
+ 2707, 2703, 2719, 2715, 2705, 2505, 2746, 2757, 2733, 2739,
+
+ 11459, 2704, 2692, 2732, 2734, 2731, 2752, 2742, 2745, 2773,
+ 2775, 2768, 2770, 2753, 2758, 2766, 2812,11459, 2774,11459,
+ 11459, 777, 2779,11459,11459, 2799, 2782,11459, 2798, 2813,
+ 2802, 2806, 2823, 2829, 2835, 2826, 2825, 2828, 2840, 2850,
+ 2887, 2845, 2863, 2852, 2848, 2870, 2856, 2882, 2871, 2877,
+ 2907, 2895, 2892, 2921, 2925, 2904, 2926, 2913, 2931, 2929,
+ 2937, 2938, 2940, 2943, 2944, 2935, 2956, 2955, 2958, 2957,
+ 2960, 2953, 2965, 2963, 2969, 2967, 2990, 2980, 2983, 2987,
+ 3002, 2994, 3000, 3020,11459, 2996, 3016, 3010, 3006, 3011,
+ 3014, 3018, 3026, 3037, 3032, 3013, 3036, 3042, 3048, 3038,
+
+ 3041, 3052, 3045, 3051, 3047, 3062, 3057, 3066, 3060, 3077,
+ 3082, 3067, 3071, 3074, 3069,11459, 3093, 3081, 3079, 3094,
+ 3095, 3087, 3101, 3113, 3114, 3121, 3120, 3117, 3108, 3127,
+ 3126, 3161, 3128, 3145, 3144, 3130, 3153, 3140, 3147, 3167,
+ 11459, 3166, 3175, 3156, 3174, 3160, 3180, 3176, 3189, 3188,
+ 3191, 3190, 3197, 3194, 3195, 3200, 3100, 3205, 3216, 3215,
+ 3225, 3221, 3223, 3222, 3237, 3234, 3233, 3226, 3243, 3250,
+ 3247, 3246, 3248, 3257, 3261, 3249, 3262, 3270, 3288, 3271,
+ 3292, 3277, 3273, 3297, 3304, 3298, 3284, 3296, 3300, 3301,
+ 3309, 3306, 3318, 3311, 3299, 3321, 3326, 3319, 3340, 3324,
+
+ 3337, 3347, 3354, 3359, 3341, 3351, 3361, 3336, 3353, 3360,
+ 3366, 3376,11459, 3367, 3378, 3387,11459, 3383, 3384, 3385,
+ 3431, 3403, 3423, 3412, 3411, 3421, 3402, 3441, 3417, 3444,
+ 3435, 3450, 3443, 3465, 3466, 3464, 3479, 3470, 3489, 3469,
+ 3482, 3474, 3480, 3492, 3484, 3491, 3515, 3497, 3518, 3414,
+ 3531, 3528, 414, 3534, 3510, 3514, 3517, 3562, 3526, 3546,
+ 3525, 3544, 3547, 3552, 3559, 3550, 3553, 3558, 3573, 3574,
+ 3571, 3607, 3599, 3594, 3595, 3589, 3600, 3610, 3611, 3608,
+ 3597,11459, 3615, 3620, 3622, 3624, 3630, 3635, 3631, 3627,
+ 11459, 3639, 3644, 3645, 3657, 3638, 3651, 3650, 3662, 3654,
+
+ 3665, 3663, 3656, 3670, 3684, 3686, 3692, 3683, 3690,11459,
+ 3688,11459, 3685, 3687, 3701, 3691, 3703, 3710, 3705, 3709,
+ 3715, 3725, 3734, 3736,11459,11459, 3742, 3743, 3729, 3744,
+ 3726, 3749, 3737, 3762, 3765,11459, 3763, 3754,11459, 3781,
+ 3768, 3784, 3766, 3771, 3789, 3776, 3786, 3801, 3795, 3770,
+ 3806, 3805, 3829, 3810, 3836, 3823, 3834, 3821,11459, 3824,
+ 3837, 3822, 3848, 3849, 3842, 3832, 3850, 3866, 3833,11459,
+ 3867, 3862, 3868, 3863, 3888, 3757, 3870, 3869, 3883, 3890,
+ 3881, 3885, 3882, 3889, 3894, 3893, 3908, 3927, 3918, 3919,
+ 3930, 3928, 3932,11459, 3931, 3920, 3917, 3935, 3934, 3759,
+
+ 3940, 3943, 3948, 3950, 3954, 3966, 3971, 3945, 3977, 3960,
+ 3972, 3967, 3976, 3990, 3987, 3983, 3989, 3993, 3992, 3995,
+ 4000, 158, 4003, 3999, 4004, 4011,11459, 4005, 4016, 4028,
+ 4029, 4035, 4039, 4022, 115, 4027, 4031, 4045, 4048, 4038,
+ 4055, 4059, 4056, 4065, 4066, 4069, 4063, 4071, 4074, 4083,
+ 4084, 4067, 4086, 4090, 4092, 4072, 4099, 4108, 4094, 4101,
+ 11459, 4123, 4110, 4121, 4122, 4112, 4117, 4127, 4118, 4148,
+ 11459, 4139, 4145, 4136, 4155, 4149, 4158, 4147, 4166, 4159,
+ 4163, 4168,11459, 4174, 4165, 4175, 4202, 4194, 4186, 4192,
+ 4188,11459, 4209, 4205, 4211, 4197, 4213, 4208, 4214, 4227,
+
+ 4231, 4201, 4245, 4234, 4226, 4239, 4236, 4204, 4238, 4253,
+ 4247, 4266, 4269, 4265, 4267, 4270, 4275, 4272, 4283, 4281,
+ 4276, 4292, 4286, 4278,11459, 4314, 4296, 4302, 4312, 4304,
+ 4305, 4325, 4323, 4342, 4317, 4319, 4313, 4344, 4372, 4347,
+ 4343, 4352, 4359, 4365, 4362, 4351, 4375, 4363, 4382, 4392,
+ 4400, 4389, 4404, 4393, 4406, 4403, 4417, 4408, 4411, 4412,
+ 4425, 4416, 4440, 4427, 4428, 4422, 4444, 4452, 4453, 4447,
+ 4449, 4481, 4454, 4443, 4464, 4484, 4476,11459, 4471, 4473,
+ 4485, 4486, 4498, 4466, 4469, 4521, 4493, 4496, 4500, 4520,
+ 4508, 4513, 4524, 4532, 4523, 4525, 4535, 4548, 4545, 4527,
+
+ 4547, 4550, 4553, 4556, 4551, 4554, 4566, 4565, 4562, 4579,
+ 4571, 4595, 4591, 4597,11459, 4598, 4600, 4583, 4594, 4604,
+ 4587, 4608, 4611, 4610, 4619, 4620, 4622, 4609, 4624, 4628,
+ 4630, 4632, 4621, 4648, 4647, 4659, 4636,11459, 4655, 4635,
+ 4651, 4660, 4662, 4668, 4682, 4679, 4666, 4689, 4696, 4693,
+ 4681, 4695, 4700, 4691,11459, 4710, 4715, 4708, 4709, 4717,
+ 4720, 4711, 4721, 4719, 4723, 4725,11459, 4728, 4731, 4741,
+ 4738, 4734, 4739, 4744, 4768, 4758, 4756,11459, 4774, 4759,
+ 4770, 4772, 4780, 4776, 4775, 4778, 4791, 4797, 4788, 4785,
+ 4795, 4811, 4802, 4821, 4803, 4822,11459, 4812, 4814, 4819,
+
+ 4850, 4815, 4825, 4836, 4837, 4841, 4847, 4861, 4848, 4868,
+ 4853,11459, 4877, 4860, 4875, 4871, 4886, 4872, 4874, 4887,
+ 4880, 4903, 4906, 4892, 4895, 4912, 4896,11459, 4907, 4902,
+ 4913, 4923, 4922, 4918, 4927, 4930, 4929, 4939, 4933, 4945,
+ 4947, 4949, 4942, 4960, 4963, 4966, 4957, 4953, 4972, 4974,
+ 4969, 4980, 4985, 4994, 4986, 4982, 4990, 5016, 5001, 5013,
+ 5018, 5017, 5004, 4998, 5021, 5029, 5034, 5037, 5035, 5038,
+ 11459, 5049, 5047, 5043, 5041, 5042, 5053, 5056, 5048, 5072,
+ 5057, 5080, 5062, 5085, 5078, 5074, 5096, 5102, 5091, 5083,
+ 5105, 5089, 5094, 5100, 5119, 5107, 5112, 5117, 5120, 5116,
+
+ 5123, 5130, 5127, 5121, 5134, 5133, 5147, 5143, 5146, 5161,
+ 5144, 5157, 5148, 5150, 5164, 5168, 5171, 5176, 5165, 5177,
+ 5179, 5181, 5192, 5189, 5199, 5202, 5208, 5214, 5204, 5205,
+ 5206, 5209,11459,11459, 5237,11459, 5224, 5241, 5203, 5231,
+ 5245, 5238, 5235, 5244, 5254, 5252, 5242, 5248, 5261, 5264,
+ 5262, 5272, 5281, 5266, 5277, 5269, 5280, 5297, 5298,11459,
+ 5284,11459, 5311, 5288, 5305, 5313, 5321, 5299,11459, 5317,
+ 11459, 5315, 5320, 5307, 5312, 5327,11459, 5330, 5331, 5329,
+ 5326, 5339, 5350, 5346, 5342, 5345, 5360, 5353, 5373, 5370,
+ 5366, 5356, 5369, 5378, 5362, 5380, 5385, 5377, 5401, 5398,
+
+ 5410, 5411, 5394, 5416, 5396, 5400, 5409, 5425, 5405, 5426,
+ 11459, 5434, 5454, 5432, 5437, 5443, 5439, 5442, 5449, 5452,
+ 5451, 5458, 5459, 5466, 5469, 5453, 5479, 5477, 5485, 5486,
+ 5489, 5482, 5498, 5487, 5500, 5512, 5513, 5499, 5525, 5516,
+ 11459, 5508, 5523, 5509, 5514, 5526, 5532,11459, 5537, 5527,
+ 5544, 5546, 5543, 5548, 5541, 5558, 5562, 5549, 5565, 5559,
+ 5592, 5569, 5585, 5582, 5588,11459, 5590, 5596, 5575, 5594,
+ 5603, 5589, 5616, 5625, 5624, 5604, 5632, 5640, 5631, 5626,
+ 5620, 5622, 5628, 5642, 5647, 5649, 5651, 5652, 5655, 5650,
+ 5656, 5654, 5659, 5644, 5660, 5670, 5672, 5674, 5675, 5678,
+
+ 5682, 5684, 5676, 5679, 5706, 5711, 5689, 5707,11459, 5703,
+ 5712, 5705, 5731, 5709, 5727, 5726, 5730, 5745, 5749, 5738,
+ 11459, 5728, 5732, 5755, 5751, 5761, 5753, 5767, 5740, 5765,
+ 5775, 5782, 5771, 5790, 5791, 5788,11459, 5799,11459, 5789,
+ 5795, 5798, 5805, 5806, 5809, 5811, 5832, 5822, 5839, 5827,
+ 5823, 5838, 5828, 5846, 5841, 5831, 5848, 5855, 5860, 5854,
+ 5858, 5879, 5833, 5880, 5866, 5883, 5885, 5875, 5873, 5878,
+ 5884, 5881, 5899, 5904, 5902,11459,11459, 5903, 5915, 5916,
+ 5918, 5911, 5923, 5934, 5936, 5940, 5942, 5943, 5948, 5957,
+ 5947, 5950, 5954, 5987,11459, 5974, 5975, 5964, 5984, 5979,
+
+ 5973, 5976, 5920, 6000, 5991, 5983, 6009, 5999,11459, 5992,
+ 6002, 6011, 6013, 6015, 6032, 6036,11459, 6026,11459, 6018,
+ 6024, 6027, 6039, 6045, 6021, 6031, 6051, 6052, 6042, 6053,
+ 6075, 6081, 6086, 6079, 6071, 6085, 6068, 6072, 6070, 6091,
+ 6080, 6105, 6092, 6094, 6104,11459, 6101, 6106, 6120, 6098,
+ 6107, 6130, 6131, 6129, 6116,11459, 6141,11459, 6134, 6133,
+ 6137, 6147, 6158, 6148, 6151, 6164, 6160, 6150, 6175, 6167,
+ 6177, 6171, 6182, 6178, 6185, 6168,11459, 6174, 6172, 6218,
+ 6202, 6203, 6216, 6224, 6223, 6205, 6227,11459, 6228, 6236,
+ 6219, 6229, 6240, 6237, 6230, 6245, 6241, 6239, 6248, 6255,
+
+ 6258, 6257, 6272, 6269, 6267, 6265, 6282, 6283, 6286, 6271,
+ 6307, 6296, 6275, 6293, 6316, 6300,11459, 6309, 6305, 6310,
+ 6314, 6306, 6336, 6328, 6339, 6331, 6345, 6327, 6349, 6358,
+ 6341, 6343, 6352, 6350, 6356, 6366, 6372,11459, 6383, 6363,
+ 6385, 6361, 6386, 6377, 6367, 6393, 6397, 6378, 6401, 6403,
+ 6399, 6394, 6402, 6411, 6417, 6422, 6436, 6434, 6412, 6433,
+ 6430, 6440, 6435, 6438, 6445, 6459,11459, 6471, 6442, 6461,
+ 6466, 6470, 6469, 6475, 6478, 6472, 6480, 6482, 6479, 6489,
+ 6486, 6503, 6490, 6493, 6517, 6522, 6523, 6505,11459,11459,
+ 6524, 6508, 6520, 6526,11459, 6527, 6513, 6543, 6537, 6538,
+
+ 6532, 6541, 6546, 6545, 6547, 6560, 6568, 6552, 6570, 6569,
+ 6554, 6572,11459, 6581, 6585, 6591, 6582, 6576, 6596, 6598,
+ 11459, 6587, 6597, 6601, 6608, 6607, 6604, 6610, 6617, 6618,
+ 6599, 6629, 6623, 6625, 6638, 6643, 6622, 6627, 6646, 6660,
+ 6633, 6649, 6657,11459, 6652, 6640, 6666, 6675, 6659, 6663,
+ 6679,11459, 6673, 6691, 6680, 6690, 6688, 6701, 6702, 6699,
+ 6709, 6705, 6706, 6717, 6715, 6708, 6719, 6721, 6723, 6742,
+ 6733, 6730, 6744, 6740, 6755, 6758, 6752,11459, 6754, 6773,
+ 6767, 6769, 6764,11459, 6765, 6793, 6778,11459, 6780, 6771,
+ 6772, 6783, 6807,11459, 6791, 6802, 6796, 6811, 6788, 6814,
+
+ 6799, 6822, 6804, 6820, 6827, 6809, 6817, 6838, 6830,11459,
+ 6833, 6831, 6846,11459, 6832, 6853, 6860, 6862, 6865, 6863,
+ 6858, 6852, 6848, 6876, 6875, 6869, 6878, 6873,11459, 6886,
+ 6904,11459, 6894, 6902, 6889, 6895, 6911,11459, 6903, 6905,
+ 6893, 6914, 6918, 6921, 6923, 6916, 6935, 6920, 6942, 6931,
+ 6933, 6941, 6953, 6954, 6961, 6945, 6955, 6947, 6956,11459,
+ 6984, 6948, 6962, 6968, 6967, 6972, 6992, 6990, 6982, 7000,
+ 6993,11459,11459, 7007,11459, 7010, 6999, 7008, 7009,11459,
+ 7016, 7027, 7021, 7022, 7017, 7036, 7032, 7044, 7029, 7053,
+ 7049,11459, 7055, 7059,11459, 7052, 7056, 7066, 7058, 7063,
+
+ 7042, 7061, 7077, 7091, 7074, 7082, 7084, 7083, 7101, 7080,
+ 7103, 7099, 7120, 7108, 7140,11459, 7097, 7111, 7124, 7129,
+ 7127, 7128, 7147, 7144, 7151, 7137, 7133,11459, 7157, 7163,
+ 7164, 7161, 7174,11459,11459, 7176,11459, 7169, 7186,11459,
+ 7171, 7192, 7178, 7184, 7180, 7207, 7196,11459, 7202, 7201,
+ 7206, 7191, 7220, 7228,11459, 7227, 7231, 7219, 7221, 7218,
+ 7240, 7244, 7243, 7241, 7274, 7252,11459, 7254, 7248, 7265,
+ 7251, 7271, 7275, 7267, 7264, 7266, 7280, 7288, 7293, 7300,
+ 7278, 7302, 7298, 7303, 7304, 7307, 7309, 7312, 7313, 7301,
+ 11459, 7320, 7340, 7330, 7317, 7355, 7341, 7333, 7344,11459,
+
+ 7345, 7350, 7359, 7361,11459, 7357, 7367, 7354, 7373, 7374,
+ 7377, 7378, 7382, 7381, 7385, 7388, 7402,11459, 7401, 7404,
+ 7390, 7415, 7419, 7409, 7414,11459,11459, 7429,11459, 7433,
+ 7426, 7423, 7434, 7430, 7445, 7444, 7458, 7463, 7446, 7450,
+ 7466, 7473, 7461, 7453, 7472,11459, 7479, 7327, 7462, 7507,
+ 7488, 7491, 7500,11459, 7496, 7489,11459, 7490,11459, 7485,
+ 7495, 7487, 7523, 7512, 7520, 7525, 7516, 7514, 7527,11459,
+ 7534, 7529, 7537, 7540, 7541, 7546, 7553, 7567,11459, 7559,
+ 7550, 7562, 7554,11459, 7571, 7573, 7552, 7568, 7564, 7587,
+ 7581, 7588, 7586, 7598, 7585, 7611, 7612, 7602, 7613, 7609,
+
+ 7594, 7610, 7623, 7605, 7636, 7629, 7630, 7622,11459, 7638,
+ 7633, 7634, 7639, 7644, 7650, 7645, 7649, 7666, 7660, 7687,
+ 7675, 7688,11459, 7671,11459, 7676, 7682, 7693, 7690, 7680,
+ 7695, 7701, 7707, 7691, 7697, 7698, 7716, 7731, 7730, 7733,
+ 7736, 7723, 7725, 7728, 7743,11459, 7742, 7745, 7734, 7750,
+ 7770, 7753, 7754, 7759,11459, 7761, 7763, 7765, 7772, 7762,
+ 11459, 7787, 7794, 7776, 7796, 7780, 7800, 7786, 7799, 7805,
+ 7808, 7802, 7806, 7797, 7818, 7803, 7834, 7822, 7821,11459,
+ 7832, 7838, 7831, 7839, 7833, 7847, 7835, 7853, 7854, 7857,
+ 7866, 7860, 7867,11459, 7861, 7871, 7872, 7859,11459, 7880,
+
+ 7874, 7868, 7877, 7901, 7906, 7894, 7888, 7902, 7904, 7907,
+ 7899, 7924,11459, 7910, 7903, 7935, 7929, 7926, 7927, 7931,
+ 7921, 7954, 7948, 7958, 7973,11459, 7968, 7953, 7956, 7962,
+ 7972, 7971, 7984, 7980, 7981, 8000, 7983,11459, 8007, 8008,
+ 8010, 7987, 8011, 8021, 7998, 8016, 8026, 8017, 8025, 8020,
+ 8028, 8047, 8034, 8024, 8053, 8055, 8056, 8049, 8061, 8071,
+ 8066,11459, 8058,11459, 8059, 8060, 8072, 8076, 8093, 8084,
+ 8099, 8098, 8103, 8105, 8092,11459, 8097, 8100, 7959, 8108,
+ 8106, 8109, 8130, 8139,11459, 8134, 8131, 8133, 8137,11459,
+ 8150, 8151, 8132, 8145, 8143, 8162, 8163, 8167, 8168,11459,
+
+ 8184, 8182, 8181, 8173, 8192, 8179, 8191, 8183, 8198, 8189,
+ 8202, 8190, 8195, 8206, 8210, 8209, 8215,11459, 8217, 8224,
+ 8232, 8230, 8233, 8231, 8234, 8219, 8241, 8249, 8242,11459,
+ 8247, 8236, 8244, 8253, 8261, 8274, 8257, 8276, 8258, 8280,
+ 8288, 8282, 8291, 8272, 8279, 8293, 8305, 8300, 8295,11459,
+ 8284, 8308, 8323, 8299, 8302, 8322, 8329,11459, 8325,11459,
+ 8319, 8326, 8335, 8338, 8342,11459, 8344, 8339, 8356, 8346,
+ 8363,11459,11459, 8371, 8349, 8365, 8378, 8370, 8380,11459,
+ 11459, 8382,11459, 8366,11459, 8373, 8392,11459,11459, 8383,
+ 8368, 8395, 8398, 8397,11459, 8412, 8415, 8401,11459, 8403,
+
+ 11459, 8431, 8407, 8428, 8421, 8411, 8435,11459, 8422, 8443,
+ 8424, 8438, 8432,11459, 8445, 8444, 8451, 8471, 8456, 8454,
+ 11459, 8452, 8466, 8467, 8479, 8483, 8468, 8470, 8473,11459,
+ 8498, 8486, 8500, 8493, 8495, 8494, 8503, 8513, 8509, 8510,
+ 8516, 8514, 8525, 8527, 8534, 8529, 8533, 8544, 8549, 8553,
+ 8546, 8555, 8541, 8560, 8561, 8563, 8566, 8569, 8550, 8571,
+ 8575, 8578, 8584, 8579, 8582, 8603, 8604, 8596, 8612, 8602,
+ 8606, 8605, 8598, 8610, 8616, 8626, 8620, 8629, 8621, 8623,
+ 8631, 8639, 8630, 8641, 8650, 8648, 8640, 8667, 8658, 8663,
+ 8665, 8656, 8657,11459, 8675, 8673, 8681, 8683, 8680, 8682,
+
+ 8701, 8692, 8707, 8708, 8711, 8714, 8709, 8715,11459,11459,
+ 11459, 8717,11459, 8722, 8719, 8736, 8732, 8738,11459, 8734,
+ 8739, 8733, 8742, 8748, 8743, 8756, 8765, 8766, 8769, 8770,
+ 8771,11459, 8773, 8729, 8744, 8779, 8781, 8791,11459, 8793,
+ 8805, 8789, 8792, 8794, 8804, 8808, 8806, 8809, 8814, 8821,
+ 8818, 8838, 8819, 8825, 8843, 8835, 8829, 8852,11459, 8844,
+ 8859, 8865, 8845, 8846, 8851, 8849, 8861, 8872, 8880, 8867,
+ 8869, 8878, 8870, 8873, 8883, 8896, 8904, 8909, 8910, 8913,
+ 11459, 8899, 8915,11459, 8908, 8900, 8920, 8902, 8916, 8924,
+ 8914, 8933, 8930, 8935,11459,11459, 8936, 8937, 8949, 8953,
+
+ 8943, 8948, 8967, 8957, 8959, 8965,11459, 8963, 8972, 8982,
+ 8985, 8971, 8984,11459, 8990, 8991, 8992, 8973, 8986, 8983,
+ 9000, 9001, 9020,11459, 9010, 9014, 9028, 9024, 9026, 9017,
+ 9038, 9034, 9031, 9027, 9030, 9044, 9045,11459, 9035,11459,
+ 11459,11459, 9059, 9065, 9046, 9075, 9063, 9066, 9067, 9069,
+ 9072, 9073, 9077, 9090, 9070,11459, 9084,11459,11459, 9093,
+ 11459, 9108, 9100, 9111, 9107, 9099, 9112, 9120,11459, 9104,
+ 11459, 9117, 9124, 9135, 9130, 9132, 9131, 9137, 9148, 9141,
+ 9154, 9158, 9156, 9149, 9151, 9171, 9168, 9177, 9170,11459,
+ 9185, 9174, 9188, 9172, 9190,11459,11459, 9197, 9178, 9203,
+
+ 9204, 9219, 9201, 9205, 9194, 9227, 9221, 9218, 9231, 9217,
+ 9224, 9230, 9220, 9232, 9245, 9237, 9243, 9249,11459, 9253,
+ 9251, 9258,11459, 9250,11459, 9266, 9268, 9269, 9257, 9254,
+ 9270, 9277, 9289, 9282, 9288, 9304, 9298,11459,11459, 9287,
+ 9312, 9302,11459,11459, 9301, 9306, 9307, 9317, 9310, 9314,
+ 9319,11459, 9313, 9315, 9342, 9330, 9341, 9337, 9355, 9339,
+ 11459, 9344,11459, 9340,11459, 9357, 9356, 9348, 9367, 9379,
+ 11459, 9362, 9372, 9383, 9376, 9384, 9366, 9375,11459, 9386,
+ 9385,11459, 9401, 9394, 9400, 9387, 9402, 9409, 9408,11459,
+ 9414, 9421, 9425, 9419,11459, 9420, 9411, 9433, 9439,11459,
+
+ 9440, 9441, 9444, 9442,11459, 9454,11459, 9435, 9453, 9447,
+ 9470, 9461,11459, 9436, 9457, 9467, 9474,11459, 9479, 9489,
+ 9490, 9488, 9480, 9482,11459, 9492, 9478,11459, 9483, 9498,
+ 9507, 9499, 9497, 9511, 9500, 9510, 9515, 9526, 9531, 9532,
+ 11459,11459, 9546, 9530, 9537, 9538, 73, 9549, 9524, 9525,
+ 9534, 9542, 9555, 9567, 9571, 9552, 9564, 9578,11459,11459,
+ 9580, 9579,11459, 9575, 9582,11459, 9561, 9587, 9588, 9601,
+ 9594, 9602, 9596, 9604, 9608, 9600, 9611, 9629, 9616, 9614,
+ 9626,11459, 9642, 9644, 9631, 9636, 9647, 9653, 9661, 9663,
+ 9665, 9652, 9667, 9656, 9658, 9646, 9671, 9673, 9681, 9677,
+
+ 9692, 9693, 9689, 9690, 9695,11459, 9701, 9706, 9704, 9703,
+ 9712, 9719, 9716, 9708,11459, 9727, 9731, 9732, 9735,11459,
+ 9741, 9742, 9746, 9744, 9747, 9748,11459, 9743, 9749, 9750,
+ 9759, 9770, 9745, 9769, 9766, 9765, 9794,11459, 9774, 9786,
+ 9783, 9784, 9796,11459, 9788,11459,11459,11459, 9797, 9804,
+ 9791,11459, 9809, 9806, 9792, 9810,11459, 9816, 9834, 9826,
+ 9576, 9827,11459,11459,11459, 9813, 9836, 9833,11459, 9825,
+ 9851,11459, 9837,11459, 9829,11459, 9843, 9852, 9858, 9862,
+ 11459, 9868, 9853,11459, 9863, 9869, 9877, 9898,11459, 9881,
+ 9883, 9887, 9879, 9885, 9893, 9884, 9897, 9912,11459,11459,
+
+ 9924, 9918, 9922, 9907, 9910, 9909, 9914, 9926, 9915, 9943,
+ 11459, 9932, 9946,11459, 9948, 9942, 9951, 9960, 9944, 9949,
+ 9950,11459, 9962,11459, 9966,11459, 9954, 9959, 9983, 9976,
+ 9986, 9981, 9979, 9977,10000, 9991, 9989, 9994,10016, 9993,
+ 10008,10004,10015,10019,10018,11459,11459,10039,10022,11459,
+ 10027,10040,10047,11459,10029,11459,10048,11459,10035,10042,
+ 11459,10054,10045,10060,11459,11459,10052,10053,10062, 9973,
+ 10067,10055,10049,11459,10069,10077,10072,10080,10083,10085,
+ 10084,11459,10088,11459,10086,10110,10104,11459,11459,10092,
+ 10095,10108,10116,10111,10105,10123,10113,10118,10119,10149,
+
+ 10128,10122,10136,10157,10153,10159,10145,10161,10162,10166,
+ 11459,11459,11459,10163,10150,10151,10168,10184,10181,10179,
+ 10201,10185,11459,10194,10204,10200,10188,10206,10196,10210,
+ 11459,10208,10198,10192,10209,10218,10219,10223,10215,11459,
+ 10229,10248,10252,10249,10241,10253,10257,10259,10260,10261,
+ 10242,10262,10251,10245,10266,10268,11459,11459,10267,10276,
+ 11459,10274,10277,11459,11459,10280,11459,10283,10284,10289,
+ 10287,10295,11459,10302,10286,10298,10301,11459,10300,10321,
+ 10318,10304,10314,10337,10336,11459,10325,10326,10329,10319,
+ 10345,10353,11459,11459,10333,10355,11459,10359,10357,10352,
+
+ 10373,10363,10361,10371,10378,11459,10367,11459,10370,10386,
+ 10372,10384,10390,10394,10396,10385,10401,11459,10412,10397,
+ 10405,10409,11459,10419,10399,10423,10417,10422,11459,10443,
+ 10431,10450,10452,11459,10433,10456,10442,11459,11459,11459,
+ 10461,10462,10467,11459,11459,11459,10458,10469,11459,10463,
+ 10476,10468,10466,11459,10477,11459,11459,10472,10507,10511,
+ 10491,10513,10493,11459,10510,10508,10502,10498,10509,11459,
+ 10521,10522,11459,10526,10527,10512,10525,10536,10530,10529,
+ 10531,11459,11459,10535,10539,10557,10555,10550,11459,10549,
+ 10568,10566,10569,10572,10574,10579,10580,10583,10563,10588,
+
+ 10584,10605,10609,10591,10594,10598,10599,10595,10618,10610,
+ 10624,10633,10625,10634,10635,10627,10638,11459,11459,10639,
+ 10641,10648,11459,10649,10644,11459,10645,11459,10657,10659,
+ 10664,10667,11459,10673,10674,10677,10678,10661,11459,10670,
+ 10681,11459,11459,11459,10683,10676,10680,10669,11459,10684,
+ 10693,10690,10695,10698,10702,10706,10720,10711,10724,11459,
+ 10712,10728,11459,11459,11459,10725,10714,10731,10717,10736,
+ 10735,11459,10746,10740,10742,10755,10747,10750,10759,11459,
+ 10765,10763,11459,11459,10774,10764,11459,10780,11459,11459,
+ 10758,10769,11459,11459,11459,11459,11459,11459,11459,11459,
+
+ 10783,10791,11459,11459,10787,10797,10803,10804,11459,10809,
+ 11459,10790,10810,10808,10802,10805,11459,10811,11459,10828,
+ 10818,10815,10829,10831,10835,10842,10838,10840,10830,10847,
+ 10839,10856,10845,10861,10874,10855,10868,10882,10865,10885,
+ 10869,10888,11459,11459,11459,11459,10883,10898,10894,10890,
+ 10901,10902,10900,10907,10913,10919,10903,10916,10920,10928,
+ 10932,10914,10927,10943,10930,10940,10946,10948,10938,10953,
+ 10956,10961,11459,10962,10957,10949,10974,11459,10966,10971,
+ 11459,10963,10959,11459,11459,10991,10993,10984,10978,11001,
+ 11005,10988,10990,11004,11007,11006,11459,11010,11459,11459,
+
+ 11459,11459,10995,11015,11459,10999,11025,11011,11032,11459,
+ 11021,11039,11026,11033,11034,11030,11050,11051,11058,11459,
+ 11459,11059,11057,11061,11459,11060,11064,11062,11070,11089,
+ 11076,11087,11088,11082,11100,11459,11098,11094,11104,11095,
+ 11459,11106,11105,11111,11115,11116,11117,11120,11123,11459,
+ 11128,11459,11125,11141,11137,11143,11140,11150,11145,11152,
+ 11155,11161,11167,11459,11157,11164,11162,11177,11189,11188,
+ 11192,11176,11197,11200,11201,11205,11202,11204,11214,11216,
+ 11213,11217,11459,11459,11212,11223,11459,11220,11232,11227,
+ 11230,11250,11459,11253,11239,11241,11254,11256,11263,11459,
+
+ 11261,11265,11264,11459,11262,11459,11459,11269,11276,11280,
+ 11275,11279,11459,11459,11459,11339,11346,11353,11360,11367,
+ 11374,11381, 100,11388,11395,11402,11409,11416,11423,11430,
+ 11437,11444,11451
} ;
-static const flex_int16_t yy_def[3939] =
+static const flex_int16_t yy_def[4034] =
{ 0,
- 3920, 1, 3921, 3921, 3922, 3922, 3923, 3923, 3924, 3924,
- 3925, 3925, 3926, 3926, 3927, 3927, 3920, 3928, 3920, 3920,
- 3920, 3920, 3929, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3930, 3920, 3920,
- 3920, 3930, 3931, 3920, 3920, 3920, 3931, 3932, 3920, 3920,
- 3920, 3920, 3932, 3933, 3920, 3920, 3920, 3933, 3934, 3920,
- 3935, 3920, 3934, 3934, 3936, 3920, 3920, 3920, 3920, 3936,
- 3937, 3920, 3920, 3920, 3937, 3928, 3928, 3920, 3938, 3929,
- 3938, 3929, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
-
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3930, 3930, 3931, 3931, 3932, 3932, 3920, 3933,
- 3933, 3934, 3934, 3935, 3935, 3934, 3936, 3936, 3920, 3937,
- 3937, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
-
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3934, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
-
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3920, 3928,
-
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3934, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928, 3920, 3928,
-
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3920, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928, 3934, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
-
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
-
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3934, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
-
- 3928, 3928, 3928, 3928, 3920, 3928, 3920, 3920, 3928, 3928,
- 3920, 3920, 3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3920, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
-
- 3920, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3934, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928, 3920, 3928,
-
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3920, 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
-
- 3928, 3928, 3928, 3928, 3920, 3920, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928, 3920, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3920, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
-
- 3928, 3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928,
- 3934, 3934, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3920,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3920, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
-
- 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
-
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3920, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928,
- 3928, 3934, 3928, 3928, 3928, 3928, 3928, 3928, 3920, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3920, 3928,
-
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3920, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
-
- 3920, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3920, 3928, 3920, 3928, 3928, 3928, 3928, 3928,
- 3928, 3920, 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3920,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3934,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
-
- 3928, 3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928,
- 3920, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3920, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3920, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3920,
-
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3920, 3920, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3920, 3928, 3920, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
-
- 3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3920, 3928, 3920, 3928, 3928, 3928, 3934, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928,
-
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3920, 3920, 3928, 3928, 3928, 3920, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928,
-
- 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928,
- 3928, 3928, 3928, 3920, 3928, 3928, 3928, 3920, 3928, 3928,
- 3928, 3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3934, 3928, 3920,
- 3928, 3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3920, 3928,
- 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
-
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3920,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3920, 3920, 3928, 3920, 3928, 3928, 3928, 3928, 3920,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3920, 3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928,
- 3920, 3920, 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928, 3920,
-
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3920, 3928, 3928, 3928, 3928, 3920, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3920, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3920, 3920,
- 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3920, 3928,
- 3928, 3934, 3928, 3928, 3928, 3928, 3920, 3928, 3928, 3920,
-
- 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3920, 3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3920, 3928, 3920, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928,
-
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3920, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3920, 3928, 3928, 3928, 3928, 3920, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3920,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3920, 3928,
-
- 3920, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3934, 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3920, 3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3920, 3928, 3920, 3928, 3928, 3928, 3928,
-
- 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3920, 3920, 3928,
- 3928, 3928, 3928, 3928, 3920, 3920, 3928, 3920, 3928, 3920,
- 3928, 3928, 3920, 3920, 3928, 3928, 3928, 3928, 3920, 3928,
- 3928, 3928, 3920, 3928, 3920, 3928, 3928, 3928, 3928, 3928,
- 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928,
- 3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928,
- 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
-
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3934, 3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3920, 3920, 3920, 3928, 3920, 3928, 3928, 3928, 3928, 3928,
- 3920, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928,
- 3920, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3920,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
-
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3920, 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3920, 3920, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928, 3928,
- 3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3920, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3920, 3928, 3920, 3920, 3920, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3920, 3928, 3920, 3920, 3928, 3920, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3920, 3928, 3928,
-
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3934, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928,
- 3928, 3928, 3920, 3920, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928, 3920,
- 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3920, 3920, 3928, 3928, 3928, 3920, 3920,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3920, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
-
- 3928, 3928, 3920, 3928, 3928, 3920, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3920, 3928, 3928, 3920, 3928, 3928, 3928,
- 3928, 3920, 3928, 3928, 3928, 3928, 3920, 3928, 3920, 3928,
- 3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928, 3928, 3920,
- 3928, 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928, 3920,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3920, 3920, 3928, 3928, 3928, 3928, 3934, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3920, 3920, 3928, 3928, 3920, 3928, 3928, 3920, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
-
- 3928, 3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928, 3928,
- 3920, 3928, 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3920, 3928,
- 3928, 3928, 3920, 3928, 3920, 3920, 3920, 3928, 3928, 3928,
- 3920, 3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928, 3928,
- 3928, 3920, 3920, 3920, 3928, 3928, 3928, 3920, 3928, 3928,
- 3920, 3928, 3920, 3928, 3920, 3928, 3928, 3928, 3928, 3920,
-
- 3928, 3928, 3920, 3928, 3928, 3928, 3928, 3920, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3920, 3920, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3920,
- 3928, 3920, 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3920, 3920, 3928, 3928, 3920, 3928, 3928, 3928,
- 3920, 3928, 3920, 3928, 3920, 3928, 3928, 3920, 3928, 3928,
- 3928, 3920, 3920, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3920, 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3920, 3928,
-
- 3928, 3928, 3920, 3920, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3920, 3920, 3920, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3920, 3920, 3928, 3928, 3920, 3928, 3928, 3920, 3920, 3928,
- 3920, 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928,
- 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928,
-
- 3928, 3928, 3928, 3928, 3920, 3920, 3928, 3928, 3920, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3920,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3920,
- 3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928,
- 3920, 3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928, 3920,
- 3920, 3920, 3928, 3928, 3928, 3920, 3920, 3920, 3928, 3920,
- 3928, 3928, 3928, 3928, 3920, 3928, 3920, 3920, 3928, 3928,
- 3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928,
- 3920, 3920, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3920, 3920, 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928,
-
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3920, 3920, 3928, 3928,
- 3920, 3928, 3928, 3920, 3928, 3920, 3928, 3928, 3928, 3928,
- 3920, 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928, 3920,
- 3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928, 3920, 3920,
- 3920, 3928, 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928, 3920, 3920,
- 3928, 3928, 3920, 3928, 3920, 3928, 3928, 3920, 3920, 3920,
-
- 3920, 3920, 3920, 3920, 3920, 3928, 3928, 3920, 3920, 3928,
- 3928, 3928, 3928, 3920, 3928, 3920, 3928, 3928, 3928, 3928,
- 3928, 3920, 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3920, 3920, 3920,
- 3920, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928,
- 3928, 3928, 3920, 3928, 3928, 3920, 3928, 3928, 3920, 3920,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
-
- 3928, 3920, 3928, 3920, 3920, 3920, 3920, 3928, 3928, 3920,
- 3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3920, 3920, 3928, 3928, 3928, 3920,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3920, 3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3920, 3928, 3920, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3920, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
- 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3920, 3920, 3928,
- 3928, 3920, 3928, 3928, 3928, 3928, 3928, 3920, 3928, 3928,
-
- 3928, 3928, 3928, 3928, 3920, 3928, 3928, 3928, 3920, 3928,
- 3920, 3920, 3928, 3928, 3928, 3928, 3928, 3920, 3920, 0,
- 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920,
- 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920
+ 4015, 1, 4016, 4016, 4017, 4017, 4018, 4018, 4019, 4019,
+ 4020, 4020, 4021, 4021, 4022, 4022, 4015, 4023, 4015, 4015,
+ 4015, 4015, 4024, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4025, 4015, 4015,
+ 4015, 4025, 4026, 4015, 4015, 4015, 4026, 4027, 4015, 4015,
+ 4015, 4015, 4027, 4028, 4015, 4015, 4015, 4028, 4029, 4015,
+ 4030, 4015, 4029, 4029, 4031, 4015, 4015, 4015, 4015, 4031,
+ 4032, 4015, 4015, 4015, 4032, 4023, 4023, 4015, 4033, 4024,
+ 4033, 4024, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4025, 4025, 4026, 4026, 4027, 4027,
+ 4015, 4028, 4028, 4029, 4029, 4030, 4030, 4029, 4031, 4031,
+ 4015, 4032, 4032, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4029, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4015, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4015, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+
+ 4023, 4023, 4023, 4023, 4015, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4029, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+
+ 4023, 4023, 4023, 4015, 4023, 4023, 4015, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4015, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4015,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4015, 4023, 4023, 4023, 4029, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4015, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4029, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+
+ 4015, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4015, 4023, 4015,
+ 4015, 4023, 4023, 4015, 4015, 4023, 4023, 4015, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4015, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4015, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4015, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+
+ 4023, 4023, 4023, 4029, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4015, 4023, 4023, 4023, 4015, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4015, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4015, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4015,
+ 4023, 4015, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4015, 4015, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4015, 4023, 4023, 4015, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4015, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4015,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4015, 4023, 4023, 4023, 4023, 4023, 4023,
+
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4015, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4029, 4029, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4015, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4015, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4015, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4015, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4015, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4015, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4015, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4015, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4015, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4015, 4023, 4023, 4023,
+ 4029, 4023, 4023, 4023, 4023, 4023, 4023, 4015, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4015, 4023, 4023, 4023,
+
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4015, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4015, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4015, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4015, 4015, 4023, 4015, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4015,
+ 4023, 4015, 4023, 4023, 4023, 4023, 4023, 4023, 4015, 4023,
+ 4015, 4023, 4023, 4023, 4023, 4023, 4015, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4015, 4023, 4023, 4023, 4023, 4023, 4029, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4015, 4023, 4023, 4023, 4023, 4023, 4023, 4015, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4015, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4015, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4015, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4015, 4023, 4015, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4015, 4015, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4015, 4023, 4023, 4023, 4023, 4023,
+
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4015, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4015, 4023, 4015, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4015, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4015, 4023, 4015, 4023, 4023,
+ 4023, 4029, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4015, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4015, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4015, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4015, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4015, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4015, 4015,
+ 4023, 4023, 4023, 4023, 4015, 4023, 4023, 4023, 4023, 4023,
+
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4015, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4015, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4015, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4015, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4015, 4023, 4023,
+ 4023, 4023, 4023, 4015, 4023, 4023, 4023, 4015, 4023, 4023,
+ 4023, 4023, 4023, 4015, 4023, 4023, 4023, 4023, 4023, 4023,
+
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4029, 4023, 4015,
+ 4023, 4023, 4023, 4015, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4015, 4023,
+ 4023, 4015, 4023, 4023, 4023, 4023, 4023, 4015, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4015,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4015, 4015, 4023, 4015, 4023, 4023, 4023, 4023, 4015,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4015, 4023, 4023, 4015, 4023, 4023, 4023, 4023, 4023,
+
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4015, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4015, 4023, 4023,
+ 4023, 4023, 4023, 4015, 4015, 4023, 4015, 4023, 4023, 4015,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4015, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4015, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4015, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4015, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4015,
+
+ 4023, 4023, 4023, 4023, 4015, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4015, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4015, 4015, 4023, 4015, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4015, 4023, 4023, 4029, 4023,
+ 4023, 4023, 4023, 4015, 4023, 4023, 4015, 4023, 4015, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4015,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4015, 4023,
+ 4023, 4023, 4023, 4015, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4015, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4015, 4023, 4015, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4015, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4015, 4023, 4023, 4023, 4023, 4023,
+ 4015, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4015,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4015, 4023, 4023, 4023, 4023, 4015, 4023,
+
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4015, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4015, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4015, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4015, 4023, 4015, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4029, 4023, 4015, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4015, 4023, 4023, 4023, 4023, 4015,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4015,
+
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4015, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4015,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4015,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4015, 4023, 4015,
+ 4023, 4023, 4023, 4023, 4023, 4015, 4023, 4023, 4023, 4023,
+ 4023, 4015, 4015, 4023, 4023, 4023, 4023, 4023, 4023, 4015,
+ 4015, 4023, 4015, 4023, 4015, 4023, 4023, 4015, 4015, 4023,
+ 4023, 4023, 4023, 4023, 4015, 4023, 4023, 4023, 4015, 4023,
+
+ 4015, 4023, 4023, 4023, 4023, 4023, 4023, 4015, 4023, 4023,
+ 4023, 4023, 4023, 4015, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4015, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4015,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4029, 4023,
+ 4023, 4023, 4023, 4015, 4023, 4023, 4023, 4023, 4023, 4023,
+
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4015, 4015,
+ 4015, 4023, 4015, 4023, 4023, 4023, 4023, 4023, 4015, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4015, 4023, 4023, 4023, 4023, 4023, 4023, 4015, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4015, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4015, 4023, 4023, 4015, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4015, 4015, 4023, 4023, 4023, 4023,
+
+ 4023, 4023, 4023, 4023, 4023, 4023, 4015, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4015, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4015, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4015, 4023, 4015,
+ 4015, 4015, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4015, 4023, 4015, 4015, 4023,
+ 4015, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4015, 4023,
+ 4015, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4029, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4015,
+ 4023, 4023, 4023, 4023, 4023, 4015, 4015, 4023, 4023, 4023,
+
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4015, 4023,
+ 4023, 4023, 4015, 4023, 4015, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4015, 4015, 4023,
+ 4023, 4023, 4015, 4015, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4015, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4015, 4023, 4015, 4023, 4015, 4023, 4023, 4023, 4023, 4023,
+ 4015, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4015, 4023,
+ 4023, 4015, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4015,
+ 4023, 4023, 4023, 4023, 4015, 4023, 4023, 4023, 4023, 4015,
+
+ 4023, 4023, 4023, 4023, 4015, 4023, 4015, 4023, 4023, 4023,
+ 4023, 4023, 4015, 4023, 4023, 4023, 4023, 4015, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4015, 4023, 4023, 4015, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4015, 4015, 4023, 4023, 4023, 4023, 4029, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4015, 4015,
+ 4023, 4023, 4015, 4023, 4023, 4015, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4015, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+
+ 4023, 4023, 4023, 4023, 4023, 4015, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4015, 4023, 4023, 4023, 4023, 4015,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4015, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4015, 4023, 4023,
+ 4023, 4023, 4023, 4015, 4023, 4015, 4015, 4015, 4023, 4023,
+ 4023, 4015, 4023, 4023, 4023, 4023, 4015, 4023, 4023, 4023,
+ 4023, 4023, 4015, 4015, 4015, 4023, 4023, 4023, 4015, 4023,
+ 4023, 4015, 4023, 4015, 4023, 4015, 4023, 4023, 4023, 4023,
+ 4015, 4023, 4023, 4015, 4023, 4023, 4023, 4023, 4015, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4015, 4015,
+
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4015, 4023, 4023, 4015, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4015, 4023, 4015, 4023, 4015, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4015, 4015, 4023, 4023, 4015,
+ 4023, 4023, 4023, 4015, 4023, 4015, 4023, 4015, 4023, 4023,
+ 4015, 4023, 4023, 4023, 4015, 4015, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4015, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4015, 4023, 4015, 4023, 4023, 4023, 4015, 4015, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4015, 4015, 4015, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4015, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4015, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4015,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4015, 4015, 4023, 4023,
+ 4015, 4023, 4023, 4015, 4015, 4023, 4015, 4023, 4023, 4023,
+ 4023, 4023, 4015, 4023, 4023, 4023, 4023, 4015, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4015, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4015, 4015, 4023, 4023, 4015, 4023, 4023, 4023,
+
+ 4023, 4023, 4023, 4023, 4023, 4015, 4023, 4015, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4015, 4023, 4023,
+ 4023, 4023, 4015, 4023, 4023, 4023, 4023, 4023, 4015, 4023,
+ 4023, 4023, 4023, 4015, 4023, 4023, 4023, 4015, 4015, 4015,
+ 4023, 4023, 4023, 4015, 4015, 4015, 4023, 4023, 4015, 4023,
+ 4023, 4023, 4023, 4015, 4023, 4015, 4015, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4015, 4023, 4023, 4023, 4023, 4023, 4015,
+ 4023, 4023, 4015, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4015, 4015, 4023, 4023, 4023, 4023, 4023, 4015, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4015, 4015, 4023,
+ 4023, 4023, 4015, 4023, 4023, 4015, 4023, 4015, 4023, 4023,
+ 4023, 4023, 4015, 4023, 4023, 4023, 4023, 4023, 4015, 4023,
+ 4023, 4015, 4015, 4015, 4023, 4023, 4023, 4023, 4015, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4015,
+ 4023, 4023, 4015, 4015, 4015, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4015, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4015,
+ 4023, 4023, 4015, 4015, 4023, 4023, 4015, 4023, 4015, 4015,
+ 4023, 4023, 4015, 4015, 4015, 4015, 4015, 4015, 4015, 4015,
+
+ 4023, 4023, 4015, 4015, 4023, 4023, 4023, 4023, 4015, 4023,
+ 4015, 4023, 4023, 4023, 4023, 4023, 4015, 4023, 4015, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4015, 4015, 4015, 4015, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4015, 4023, 4023, 4023, 4023, 4015, 4023, 4023,
+ 4015, 4023, 4023, 4015, 4015, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4015, 4023, 4015, 4015,
+
+ 4015, 4015, 4023, 4023, 4015, 4023, 4023, 4023, 4023, 4015,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4015,
+ 4015, 4023, 4023, 4023, 4015, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4015, 4023, 4023, 4023, 4023,
+ 4015, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4015,
+ 4023, 4015, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4015, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4015, 4015, 4023, 4023, 4015, 4023, 4023, 4023,
+ 4023, 4023, 4015, 4023, 4023, 4023, 4023, 4023, 4023, 4015,
+
+ 4023, 4023, 4023, 4015, 4023, 4015, 4015, 4023, 4023, 4023,
+ 4023, 4023, 4015, 4015, 0, 4015, 4015, 4015, 4015, 4015,
+ 4015, 4015, 4015, 4015, 4015, 4015, 4015, 4015, 4015, 4015,
+ 4015, 4015, 4015
} ;
-static const flex_int16_t yy_nxt[11245] =
+static const flex_int16_t yy_nxt[11526] =
{ 0,
18, 19, 20, 21, 22, 23, 22, 18, 18, 18,
18, 18, 22, 24, 25, 26, 27, 28, 29, 18,
@@ -1724,1239 +1757,1270 @@ static const flex_int16_t yy_nxt[11245] =
24, 25, 26, 27, 28, 29, 18, 30, 31, 32,
33, 34, 35, 36, 37, 38, 39, 40, 41, 42,
43, 44, 45, 18, 18, 46, 49, 50, 51, 49,
- 50, 51, 54, 55, 54, 55, 56, 121, 56, 59,
- 60, 61, 62, 122, 22, 59, 60, 61, 62, 87,
- 22, 65, 66, 67, 65, 66, 67, 88, 163, 163,
+ 50, 51, 54, 55, 54, 55, 56, 122, 56, 59,
+ 60, 61, 62, 123, 22, 59, 60, 61, 62, 87,
+ 22, 65, 66, 67, 65, 66, 67, 88, 165, 165,
- 86, 89, 355, 52, 121, 87, 52, 170, 170, 57,
- 122, 57, 87, 76, 77, 78, 79, 63, 22, 76,
+ 86, 89, 360, 52, 122, 87, 52, 172, 172, 57,
+ 123, 57, 175, 76, 77, 78, 79, 63, 22, 76,
77, 78, 79, 63, 22, 82, 83, 84, 68, 99,
87, 68, 19, 20, 21, 70, 71, 72, 19, 20,
- 21, 70, 71, 72, 82, 83, 84, 123, 110, 180,
- 180, 80, 73, 162, 173, 87, 99, 80, 73, 87,
- 139, 91, 85, 91, 91, 87, 91, 173, 111, 809,
- 74, 87, 91, 87, 123, 110, 74, 181, 88, 73,
- 162, 85, 89, 163, 163, 73, 114, 139, 112, 179,
- 161, 178, 132, 176, 115, 111, 100, 87, 87, 92,
-
- 93, 94, 113, 101, 95, 116, 173, 102, 192, 96,
- 103, 97, 87, 114, 87, 112, 87, 161, 98, 132,
- 176, 115, 87, 100, 87, 182, 87, 93, 94, 113,
- 101, 95, 116, 305, 102, 192, 96, 103, 97, 165,
- 183, 165, 165, 432, 165, 98, 104, 343, 117, 87,
- 105, 118, 182, 106, 184, 107, 108, 347, 119, 86,
- 120, 86, 86, 87, 86, 87, 109, 183, 87, 173,
- 86, 87, 87, 104, 87, 117, 124, 105, 118, 87,
- 106, 184, 107, 108, 125, 119, 191, 120, 128, 87,
- 126, 187, 129, 109, 127, 87, 158, 171, 87, 150,
-
- 159, 151, 87, 124, 160, 185, 130, 169, 131, 168,
- 152, 125, 166, 191, 87, 128, 153, 126, 187, 129,
- 87, 127, 87, 158, 154, 87, 150, 159, 151, 204,
- 164, 160, 185, 130, 155, 131, 133, 152, 156, 157,
- 134, 186, 87, 153, 135, 170, 170, 87, 87, 87,
- 136, 154, 167, 137, 167, 167, 204, 167, 188, 200,
- 138, 155, 87, 133, 87, 156, 157, 134, 186, 181,
- 91, 135, 91, 91, 211, 91, 172, 136, 172, 172,
- 137, 172, 87, 87, 179, 188, 200, 138, 140, 254,
- 87, 177, 141, 177, 177, 86, 177, 86, 86, 248,
-
- 86, 211, 142, 143, 189, 144, 86, 91, 175, 91,
- 91, 212, 91, 201, 87, 140, 254, 190, 91, 141,
- 87, 87, 193, 194, 178, 87, 248, 173, 87, 142,
- 143, 189, 144, 145, 207, 87, 146, 171, 212, 213,
- 201, 87, 205, 147, 190, 92, 195, 148, 149, 193,
- 194, 206, 196, 202, 197, 87, 198, 199, 180, 180,
- 145, 207, 87, 146, 87, 87, 213, 87, 215, 205,
- 147, 203, 233, 195, 148, 149, 221, 169, 206, 196,
- 216, 197, 214, 198, 199, 87, 208, 209, 217, 87,
- 87, 218, 87, 87, 210, 215, 497, 224, 203, 233,
-
- 222, 168, 87, 223, 219, 220, 236, 216, 87, 214,
- 166, 87, 87, 208, 209, 217, 226, 225, 218, 87,
- 227, 210, 231, 232, 224, 87, 87, 222, 238, 229,
- 223, 219, 220, 236, 230, 87, 228, 87, 234, 237,
- 87, 239, 87, 226, 225, 235, 87, 227, 87, 231,
- 232, 240, 87, 241, 242, 238, 229, 87, 243, 164,
- 244, 230, 87, 228, 245, 234, 237, 87, 239, 247,
- 246, 87, 235, 3920, 87, 250, 87, 87, 240, 249,
- 241, 242, 87, 253, 251, 243, 87, 244, 256, 262,
- 252, 245, 255, 259, 362, 87, 247, 246, 87, 257,
-
- 87, 260, 250, 258, 87, 263, 249, 87, 87, 261,
- 253, 251, 87, 268, 349, 256, 262, 252, 266, 255,
- 259, 362, 264, 3920, 87, 265, 257, 269, 270, 267,
- 258, 87, 263, 87, 87, 87, 261, 271, 87, 3920,
- 268, 272, 275, 276, 277, 266, 87, 3920, 87, 264,
- 273, 278, 265, 279, 269, 270, 267, 87, 280, 87,
- 87, 281, 274, 3920, 271, 87, 87, 3920, 272, 275,
- 276, 277, 3920, 284, 87, 87, 87, 273, 278, 167,
- 279, 167, 167, 282, 167, 280, 283, 285, 281, 274,
- 172, 3920, 172, 172, 91, 172, 91, 91, 177, 91,
-
- 177, 177, 286, 177, 287, 87, 291, 173, 87, 3920,
- 282, 87, 293, 283, 285, 288, 87, 289, 292, 87,
- 87, 295, 87, 294, 290, 297, 3920, 296, 298, 286,
- 353, 287, 175, 291, 87, 87, 87, 87, 301, 293,
- 87, 87, 288, 87, 289, 292, 87, 299, 295, 302,
- 294, 290, 297, 300, 296, 298, 303, 315, 304, 318,
- 306, 316, 87, 314, 307, 301, 317, 87, 1270, 1025,
- 319, 87, 87, 320, 323, 356, 302, 3920, 332, 87,
- 300, 308, 87, 303, 315, 304, 318, 87, 87, 87,
- 314, 307, 87, 87, 322, 87, 321, 319, 87, 87,
-
- 320, 87, 324, 328, 325, 332, 87, 87, 308, 309,
- 329, 87, 326, 327, 310, 3920, 87, 342, 3920, 311,
- 333, 322, 87, 321, 87, 312, 313, 87, 87, 324,
- 328, 325, 87, 334, 87, 330, 309, 329, 331, 326,
- 327, 310, 87, 3920, 342, 340, 311, 333, 344, 341,
- 87, 348, 312, 313, 3920, 87, 87, 345, 87, 350,
- 334, 357, 330, 372, 3920, 331, 335, 87, 346, 336,
- 358, 337, 340, 351, 87, 344, 341, 354, 348, 361,
- 352, 87, 363, 338, 87, 339, 87, 364, 357, 87,
- 372, 87, 87, 335, 87, 346, 336, 365, 337, 87,
-
- 351, 359, 87, 87, 354, 370, 360, 352, 366, 363,
- 338, 87, 339, 368, 364, 369, 87, 367, 87, 87,
- 374, 371, 87, 375, 365, 373, 87, 378, 359, 379,
- 87, 87, 370, 360, 87, 366, 376, 87, 87, 380,
- 368, 377, 369, 87, 367, 382, 381, 374, 371, 87,
- 375, 87, 373, 385, 378, 386, 379, 387, 383, 384,
- 3920, 388, 87, 392, 87, 389, 380, 87, 87, 87,
- 390, 391, 393, 381, 394, 395, 397, 87, 87, 396,
- 385, 399, 87, 87, 387, 383, 384, 87, 388, 87,
- 87, 87, 389, 398, 87, 87, 402, 390, 391, 400,
-
- 403, 394, 407, 397, 87, 405, 396, 87, 87, 87,
- 3920, 406, 412, 409, 410, 408, 411, 404, 87, 87,
- 398, 87, 401, 87, 87, 87, 414, 403, 87, 407,
- 173, 87, 405, 87, 87, 415, 416, 417, 406, 412,
- 409, 410, 408, 411, 404, 419, 413, 418, 87, 401,
- 87, 420, 421, 414, 423, 429, 425, 422, 424, 87,
- 426, 427, 87, 87, 417, 87, 87, 87, 87, 87,
- 428, 87, 87, 413, 418, 87, 430, 87, 420, 421,
- 87, 423, 429, 425, 422, 424, 431, 426, 434, 433,
- 3920, 435, 3920, 87, 87, 436, 439, 428, 87, 3920,
-
- 3920, 440, 87, 430, 444, 437, 87, 441, 442, 446,
- 448, 451, 87, 431, 87, 434, 433, 87, 435, 438,
- 87, 443, 436, 439, 87, 87, 87, 445, 440, 87,
- 447, 87, 437, 449, 441, 442, 87, 87, 451, 452,
- 87, 87, 87, 453, 454, 456, 438, 460, 443, 3920,
- 450, 459, 87, 457, 445, 87, 87, 447, 458, 461,
- 449, 87, 87, 3920, 87, 87, 452, 463, 455, 471,
- 462, 519, 456, 87, 460, 87, 87, 450, 459, 87,
- 457, 464, 465, 87, 466, 458, 461, 467, 468, 87,
- 87, 87, 470, 472, 463, 455, 87, 462, 473, 3920,
-
- 481, 87, 483, 87, 490, 469, 3920, 87, 464, 465,
- 87, 466, 87, 87, 467, 468, 491, 87, 87, 470,
- 472, 3920, 526, 499, 87, 473, 482, 481, 87, 483,
- 87, 490, 469, 474, 498, 87, 492, 495, 475, 493,
- 494, 476, 496, 491, 3920, 502, 477, 478, 479, 480,
- 87, 87, 3920, 482, 87, 3920, 87, 87, 87, 503,
- 474, 498, 506, 492, 87, 475, 493, 494, 476, 87,
- 508, 87, 502, 477, 478, 479, 480, 484, 500, 485,
- 87, 501, 507, 3920, 504, 505, 503, 510, 87, 506,
- 511, 486, 487, 488, 87, 489, 512, 87, 87, 509,
-
- 87, 87, 514, 513, 484, 500, 485, 3920, 501, 507,
- 515, 504, 505, 87, 510, 87, 87, 511, 486, 487,
- 488, 87, 489, 512, 87, 87, 509, 516, 518, 514,
- 513, 517, 524, 3920, 520, 87, 521, 515, 87, 87,
- 87, 3920, 525, 527, 528, 522, 3920, 3920, 533, 530,
- 529, 531, 523, 540, 516, 518, 538, 1431, 517, 524,
- 87, 520, 532, 521, 87, 87, 87, 539, 534, 525,
- 527, 528, 522, 87, 87, 87, 530, 529, 531, 523,
- 87, 535, 541, 538, 536, 87, 537, 87, 542, 532,
- 555, 3920, 87, 87, 539, 534, 556, 87, 574, 576,
-
- 558, 3920, 3920, 575, 3920, 561, 3920, 559, 535, 87,
- 87, 536, 87, 537, 557, 542, 543, 555, 544, 87,
- 87, 562, 560, 556, 545, 563, 3920, 558, 546, 87,
- 87, 87, 561, 547, 559, 87, 548, 3920, 87, 3920,
- 573, 557, 87, 543, 572, 544, 3920, 577, 562, 560,
- 581, 545, 563, 579, 578, 546, 87, 584, 87, 173,
- 547, 580, 87, 548, 549, 582, 550, 573, 87, 87,
- 583, 572, 586, 87, 577, 599, 585, 581, 87, 551,
- 579, 578, 552, 87, 553, 87, 554, 589, 580, 87,
- 87, 549, 582, 550, 587, 588, 590, 583, 3920, 586,
-
- 3920, 87, 606, 585, 87, 593, 551, 87, 87, 552,
- 594, 553, 87, 554, 564, 565, 591, 87, 595, 87,
- 600, 587, 588, 590, 566, 567, 568, 569, 570, 606,
- 87, 571, 593, 601, 592, 596, 598, 594, 87, 87,
- 87, 564, 565, 591, 597, 595, 87, 600, 87, 602,
- 603, 566, 567, 568, 569, 570, 604, 87, 571, 87,
- 601, 592, 596, 598, 87, 605, 87, 607, 608, 87,
- 3920, 597, 609, 610, 3920, 611, 602, 603, 87, 612,
- 613, 614, 87, 604, 616, 615, 87, 3920, 617, 3920,
- 87, 87, 87, 621, 607, 608, 624, 87, 87, 618,
-
- 619, 87, 611, 640, 3920, 3920, 612, 613, 614, 87,
- 87, 616, 615, 622, 627, 617, 87, 620, 626, 629,
- 621, 625, 87, 624, 87, 87, 618, 619, 623, 87,
- 87, 642, 87, 628, 641, 87, 87, 630, 631, 643,
- 622, 627, 87, 645, 620, 626, 629, 648, 625, 632,
- 644, 633, 87, 87, 654, 623, 87, 646, 642, 647,
- 628, 641, 87, 87, 630, 631, 643, 650, 87, 649,
- 87, 652, 3920, 658, 648, 87, 632, 644, 633, 634,
- 87, 87, 655, 651, 646, 653, 647, 635, 636, 87,
- 87, 637, 638, 87, 650, 639, 649, 87, 652, 87,
-
- 657, 87, 656, 659, 87, 87, 634, 662, 660, 655,
- 651, 661, 653, 87, 635, 636, 87, 663, 637, 638,
- 664, 667, 639, 87, 665, 87, 87, 657, 669, 656,
- 659, 87, 666, 668, 662, 660, 87, 87, 661, 87,
- 87, 670, 87, 671, 663, 3920, 672, 664, 667, 673,
- 87, 665, 87, 674, 675, 669, 87, 676, 3920, 666,
- 668, 677, 682, 678, 3920, 680, 3920, 87, 670, 681,
- 671, 87, 87, 672, 87, 87, 673, 87, 683, 685,
- 674, 675, 687, 679, 676, 87, 689, 87, 677, 87,
- 678, 87, 680, 684, 87, 686, 681, 688, 87, 87,
-
- 87, 87, 691, 87, 87, 683, 685, 690, 87, 687,
- 679, 701, 694, 689, 87, 696, 692, 87, 693, 695,
- 684, 87, 686, 697, 688, 87, 87, 698, 700, 691,
- 699, 702, 3920, 87, 690, 708, 87, 703, 701, 694,
- 704, 705, 706, 692, 87, 693, 695, 87, 87, 707,
- 697, 709, 712, 87, 711, 87, 87, 699, 702, 87,
- 87, 87, 708, 710, 703, 87, 714, 704, 705, 706,
- 87, 3920, 715, 718, 717, 713, 707, 716, 87, 87,
- 87, 711, 87, 87, 87, 719, 720, 722, 3920, 3920,
- 710, 721, 3920, 714, 87, 87, 87, 725, 724, 715,
-
- 718, 717, 713, 87, 716, 723, 87, 736, 87, 87,
- 734, 87, 719, 720, 722, 735, 87, 87, 721, 87,
- 737, 87, 738, 739, 725, 724, 765, 3920, 740, 775,
- 87, 87, 723, 726, 736, 3920, 770, 734, 727, 87,
- 728, 741, 735, 87, 744, 87, 729, 737, 730, 738,
- 739, 731, 732, 765, 745, 740, 87, 87, 733, 87,
- 726, 87, 742, 770, 87, 727, 743, 728, 741, 747,
- 749, 744, 748, 729, 746, 730, 87, 750, 731, 732,
- 87, 745, 3920, 752, 87, 733, 755, 751, 87, 742,
- 87, 753, 754, 743, 757, 87, 747, 749, 756, 748,
-
- 759, 746, 87, 760, 758, 87, 87, 761, 780, 87,
- 752, 762, 3920, 755, 751, 87, 87, 763, 753, 754,
- 87, 757, 87, 87, 764, 756, 87, 759, 766, 767,
- 760, 758, 87, 768, 761, 772, 769, 771, 762, 776,
- 87, 87, 773, 87, 763, 774, 777, 87, 87, 778,
- 87, 764, 87, 87, 87, 766, 767, 87, 87, 781,
- 768, 779, 772, 769, 771, 87, 776, 783, 173, 773,
- 782, 87, 774, 777, 87, 784, 778, 786, 785, 87,
- 87, 787, 788, 789, 790, 791, 781, 792, 779, 87,
- 87, 793, 3920, 3920, 783, 796, 794, 782, 798, 87,
-
- 87, 795, 784, 87, 786, 785, 87, 87, 787, 87,
- 797, 790, 799, 810, 87, 87, 803, 87, 793, 87,
- 87, 87, 796, 794, 800, 798, 806, 87, 795, 807,
- 804, 801, 87, 808, 802, 805, 87, 797, 811, 799,
- 87, 812, 87, 803, 813, 87, 816, 814, 817, 3920,
- 819, 800, 815, 806, 87, 87, 87, 818, 801, 820,
- 87, 802, 87, 821, 822, 87, 828, 824, 87, 823,
- 841, 87, 87, 816, 87, 817, 87, 819, 825, 87,
- 826, 87, 87, 87, 818, 827, 820, 830, 87, 87,
- 821, 822, 829, 87, 824, 831, 823, 835, 87, 87,
-
- 833, 832, 87, 834, 87, 825, 3920, 826, 87, 87,
- 87, 836, 827, 87, 830, 837, 3920, 87, 838, 829,
- 839, 842, 831, 87, 835, 840, 87, 833, 832, 87,
- 834, 87, 87, 843, 852, 848, 871, 87, 836, 849,
- 851, 850, 837, 87, 87, 838, 87, 839, 842, 844,
- 87, 87, 840, 853, 845, 856, 87, 846, 847, 854,
- 843, 852, 848, 87, 858, 87, 849, 851, 850, 3920,
- 855, 857, 87, 87, 3920, 87, 844, 859, 3920, 863,
- 853, 845, 87, 862, 846, 847, 854, 87, 87, 87,
- 864, 858, 3920, 861, 867, 868, 865, 855, 857, 860,
-
- 87, 87, 866, 87, 859, 87, 863, 87, 869, 87,
- 862, 87, 87, 872, 87, 874, 873, 864, 870, 876,
- 861, 867, 868, 865, 87, 87, 860, 875, 877, 866,
- 87, 87, 87, 87, 878, 869, 879, 87, 880, 87,
- 872, 881, 874, 873, 893, 870, 876, 882, 883, 884,
- 3920, 87, 87, 885, 875, 877, 887, 886, 888, 889,
- 890, 878, 87, 879, 87, 895, 891, 87, 881, 894,
- 87, 87, 87, 87, 882, 896, 87, 87, 87, 898,
- 885, 87, 892, 887, 886, 888, 889, 890, 87, 899,
- 87, 87, 897, 891, 87, 908, 894, 87, 900, 87,
-
- 87, 87, 896, 901, 902, 3920, 898, 903, 910, 892,
- 904, 911, 909, 3920, 913, 912, 899, 905, 87, 897,
- 87, 87, 87, 914, 906, 907, 87, 87, 915, 918,
- 87, 902, 87, 87, 903, 910, 920, 904, 911, 909,
- 87, 913, 912, 87, 905, 916, 921, 919, 87, 922,
- 914, 906, 907, 924, 923, 915, 935, 925, 87, 87,
- 917, 87, 87, 920, 926, 928, 3920, 927, 930, 87,
- 929, 3920, 916, 921, 919, 87, 87, 87, 3920, 87,
- 924, 87, 945, 937, 925, 936, 985, 917, 87, 87,
- 87, 926, 928, 931, 927, 930, 932, 929, 933, 938,
-
- 934, 87, 87, 939, 940, 87, 87, 87, 87, 941,
- 937, 87, 936, 87, 87, 87, 3920, 87, 87, 942,
- 931, 944, 946, 932, 947, 933, 938, 934, 943, 87,
- 939, 940, 948, 87, 949, 950, 941, 87, 3920, 954,
- 952, 87, 87, 87, 951, 953, 942, 87, 944, 946,
- 87, 947, 87, 960, 87, 943, 955, 1003, 962, 948,
- 3920, 949, 950, 87, 3920, 87, 954, 952, 956, 957,
- 958, 951, 953, 959, 961, 87, 963, 87, 87, 964,
- 960, 87, 965, 955, 87, 962, 966, 87, 968, 87,
- 87, 967, 87, 971, 969, 956, 957, 958, 3920, 87,
-
- 959, 961, 87, 963, 87, 87, 964, 87, 970, 965,
- 87, 972, 973, 966, 976, 968, 87, 974, 967, 975,
- 971, 969, 87, 977, 978, 980, 3920, 979, 3920, 981,
- 982, 87, 3920, 87, 87, 970, 87, 87, 972, 973,
- 983, 976, 87, 87, 974, 87, 975, 87, 87, 984,
- 977, 978, 980, 986, 979, 987, 981, 982, 87, 989,
- 988, 991, 3920, 990, 87, 992, 995, 983, 994, 3920,
- 996, 993, 87, 87, 87, 173, 984, 3920, 997, 87,
- 986, 87, 987, 87, 87, 1000, 989, 988, 991, 87,
- 990, 1001, 992, 87, 998, 994, 87, 996, 993, 999,
-
- 1002, 1006, 1004, 1010, 1005, 997, 1007, 87, 87, 87,
- 87, 87, 1000, 1008, 1009, 87, 1011, 1012, 1001, 1013,
- 1015, 87, 87, 87, 87, 1014, 87, 1002, 1006, 1004,
- 1016, 1005, 1027, 1007, 87, 87, 87, 87, 3920, 87,
- 1008, 1009, 1024, 1026, 1012, 1028, 1013, 1015, 87, 1040,
- 87, 3920, 1014, 87, 87, 1029, 3920, 1016, 1017, 1027,
- 87, 1018, 1031, 1030, 1033, 1019, 87, 1034, 1020, 1024,
- 1026, 3920, 1028, 1035, 1063, 1021, 1022, 3920, 1023, 1064,
- 87, 87, 1029, 87, 87, 1017, 1032, 87, 1018, 1031,
- 1030, 1033, 1019, 87, 1034, 1020, 1036, 87, 1037, 87,
-
- 1035, 1038, 1021, 1022, 1039, 1023, 87, 87, 3920, 1049,
- 3920, 87, 87, 1032, 87, 1050, 87, 1052, 1051, 1054,
- 3920, 1058, 87, 1036, 87, 1037, 87, 1062, 1038, 87,
- 1053, 1039, 1041, 1042, 3920, 1043, 1049, 87, 1044, 1057,
- 1055, 3920, 1050, 1045, 1052, 1051, 1054, 1059, 1058, 1046,
- 1047, 87, 1048, 87, 1062, 1065, 1056, 1053, 87, 1041,
- 1042, 87, 1043, 87, 1066, 1044, 1057, 1055, 1060, 87,
- 1045, 1061, 1067, 87, 1059, 87, 1046, 1047, 1068, 1048,
- 87, 1069, 1065, 1056, 87, 1073, 1071, 1070, 1075, 1072,
- 87, 1066, 1074, 1076, 3920, 1060, 1081, 1078, 1061, 1067,
-
- 87, 87, 1077, 87, 87, 1068, 1085, 87, 1069, 87,
- 87, 87, 87, 1071, 1070, 1075, 1072, 87, 1079, 1074,
- 1076, 1080, 87, 1081, 1078, 87, 87, 1082, 1083, 1077,
- 1084, 1088, 87, 1085, 1087, 87, 87, 1086, 1089, 87,
- 87, 1090, 1091, 87, 1094, 1079, 87, 1092, 1080, 87,
- 1095, 1096, 1093, 1099, 1082, 1083, 1101, 1084, 1088, 1097,
- 87, 1087, 1100, 87, 1086, 1098, 87, 87, 1090, 87,
- 87, 1094, 87, 1102, 1103, 1104, 1105, 1106, 1096, 87,
- 1108, 1107, 87, 1110, 87, 87, 1097, 1109, 87, 1100,
- 87, 1112, 1098, 1111, 87, 87, 87, 87, 1114, 87,
-
- 1102, 1103, 1104, 87, 87, 87, 1113, 1108, 1107, 87,
- 1110, 87, 1116, 1115, 1109, 87, 87, 1117, 1112, 1118,
- 1111, 87, 1119, 1120, 1122, 1114, 3920, 1121, 3920, 1123,
- 1124, 1125, 87, 1113, 87, 87, 87, 1127, 87, 87,
- 1115, 1126, 1128, 1129, 1117, 3920, 1118, 87, 87, 87,
- 1130, 1122, 1131, 87, 1121, 87, 1123, 1124, 1125, 87,
- 87, 1132, 1133, 87, 1127, 87, 1138, 87, 1126, 1128,
- 1129, 1134, 87, 1135, 1137, 1140, 1147, 1130, 1136, 1131,
- 87, 1141, 1139, 87, 1152, 87, 1143, 87, 1132, 1133,
- 1146, 87, 87, 1138, 87, 87, 1144, 1142, 1134, 87,
-
- 87, 1137, 1140, 87, 1145, 87, 1148, 1149, 1141, 1139,
- 1150, 1152, 87, 1143, 1151, 87, 87, 1146, 1153, 3920,
- 87, 1154, 1156, 1144, 1142, 87, 87, 1158, 1155, 87,
- 1159, 1145, 1161, 1148, 1149, 87, 87, 1150, 1157, 87,
- 87, 1151, 87, 1160, 1162, 1153, 1163, 1164, 1154, 1156,
- 87, 87, 1165, 1166, 1158, 1155, 1167, 1159, 87, 1168,
- 87, 87, 87, 1169, 87, 1157, 87, 1170, 1171, 1174,
- 1160, 1162, 1176, 1163, 1164, 1173, 87, 87, 87, 1165,
- 1166, 1175, 87, 1167, 1172, 1182, 1168, 87, 87, 87,
- 1169, 87, 87, 1177, 1170, 87, 1174, 1179, 1178, 1176,
-
- 87, 3920, 1173, 87, 1183, 87, 1180, 1181, 1175, 1185,
- 1184, 1172, 1187, 87, 87, 1186, 1188, 87, 1189, 87,
- 1177, 3920, 1190, 87, 1179, 1178, 1196, 1191, 87, 1194,
- 1197, 1198, 1192, 1180, 1181, 87, 87, 1184, 1195, 1187,
- 1193, 87, 1186, 1202, 87, 87, 1199, 87, 87, 1190,
- 87, 87, 87, 1196, 1191, 1200, 1194, 1201, 1204, 1192,
- 1205, 1203, 87, 87, 87, 1195, 1206, 1193, 87, 87,
- 87, 87, 1207, 1199, 1211, 87, 1208, 3920, 1213, 1212,
- 87, 1214, 1200, 1215, 1201, 87, 1218, 1205, 1203, 1209,
- 87, 1210, 1216, 1206, 87, 1217, 3920, 87, 87, 1207,
-
- 87, 1219, 87, 1208, 87, 1213, 173, 1220, 1214, 87,
- 1215, 1221, 1222, 1218, 87, 87, 1209, 3920, 1210, 1216,
- 1223, 1225, 1217, 87, 1227, 87, 1226, 1234, 1219, 1235,
- 87, 1224, 3920, 87, 1220, 87, 1238, 1236, 1221, 1222,
- 3920, 1239, 3920, 87, 87, 3920, 3920, 1223, 1225, 87,
- 3920, 1227, 3920, 1226, 1234, 87, 1235, 1237, 1224, 1228,
- 87, 1229, 1243, 87, 1236, 1230, 3920, 1231, 1239, 87,
- 1240, 1241, 1232, 1242, 87, 3920, 1247, 1233, 1244, 1245,
- 87, 1248, 1246, 87, 1237, 1249, 1228, 3920, 1229, 1243,
- 3920, 87, 1230, 87, 1231, 87, 1257, 1240, 1241, 1232,
-
- 1242, 87, 1250, 87, 1233, 1244, 1245, 1251, 87, 1246,
- 1253, 87, 1249, 1254, 1258, 87, 1260, 1255, 1259, 1252,
- 1261, 3920, 87, 1257, 1263, 1262, 87, 1256, 1264, 1250,
- 87, 87, 1265, 1267, 1251, 1266, 87, 1253, 87, 87,
- 1254, 1258, 87, 87, 1255, 1259, 1252, 1261, 1268, 1269,
- 87, 1263, 1262, 87, 1256, 1264, 1271, 87, 1272, 1265,
- 1273, 3920, 1266, 87, 1274, 87, 1282, 1283, 87, 1284,
- 3920, 1285, 3920, 87, 1286, 3920, 87, 1289, 3920, 1302,
- 87, 87, 87, 1592, 1593, 1272, 87, 1273, 87, 87,
- 87, 1274, 1275, 1282, 1283, 1288, 1284, 1276, 1285, 1277,
-
- 87, 1286, 1290, 1287, 1289, 1278, 87, 1291, 1292, 1295,
- 1279, 1280, 87, 87, 87, 1293, 87, 1281, 87, 1275,
- 87, 1296, 1288, 87, 1276, 87, 1277, 1298, 1294, 1290,
- 1287, 1297, 1278, 1305, 1291, 1292, 87, 1279, 1280, 87,
- 1299, 87, 1293, 87, 1281, 1303, 87, 1300, 1296, 1306,
- 1301, 87, 3920, 1304, 1298, 1294, 87, 1308, 1297, 87,
- 87, 1307, 1310, 1311, 1309, 87, 3920, 1299, 87, 87,
- 3920, 1313, 1303, 87, 1300, 1312, 1306, 1301, 87, 87,
- 1304, 1314, 1315, 87, 1308, 87, 1316, 1317, 1307, 87,
- 1311, 1309, 1318, 87, 87, 1319, 1320, 1321, 1313, 87,
-
- 87, 1322, 1312, 87, 1323, 87, 1324, 1325, 1314, 1315,
- 87, 87, 1326, 1329, 1317, 1327, 1328, 87, 87, 1318,
- 1335, 87, 1319, 1320, 1321, 87, 87, 87, 1322, 1330,
- 87, 1323, 1334, 1324, 1325, 1331, 87, 1332, 1336, 1326,
- 87, 1339, 1327, 1328, 87, 87, 87, 1333, 87, 87,
- 1337, 1338, 87, 87, 87, 1344, 1330, 1340, 1341, 1334,
- 87, 1342, 1331, 87, 1332, 1336, 1345, 1343, 1339, 1346,
- 1347, 3920, 1348, 87, 1333, 3920, 1351, 1337, 1338, 87,
- 87, 1350, 1344, 87, 1340, 1341, 1349, 87, 1342, 87,
- 87, 1352, 87, 1345, 1343, 87, 1353, 1356, 87, 1348,
-
- 1360, 87, 87, 1351, 1354, 1357, 1358, 1355, 1350, 87,
- 1359, 87, 1362, 1349, 1363, 1361, 1365, 87, 1366, 87,
- 1367, 87, 1369, 87, 1356, 87, 1364, 1360, 87, 87,
- 87, 1354, 1357, 1358, 1355, 87, 1371, 1359, 87, 1362,
- 1372, 1363, 1361, 1368, 87, 1366, 1370, 1374, 87, 1369,
- 1373, 3920, 87, 1364, 1375, 87, 87, 1376, 1378, 87,
- 1377, 1379, 87, 1371, 87, 1385, 3920, 1372, 87, 87,
- 1368, 1380, 1381, 1370, 1374, 1383, 87, 1373, 87, 1382,
- 87, 1375, 1386, 87, 1376, 1378, 87, 1377, 1379, 1384,
- 87, 1388, 1387, 87, 1390, 87, 87, 87, 1380, 1381,
-
- 87, 1389, 1383, 1391, 1393, 1392, 1382, 1396, 1395, 87,
- 87, 87, 87, 87, 1394, 1397, 1384, 1398, 1388, 1387,
- 87, 1390, 87, 1399, 1400, 87, 1401, 1403, 1389, 3920,
- 1391, 1393, 1392, 1402, 1404, 1395, 1407, 1406, 87, 87,
- 1408, 1394, 1409, 1405, 87, 87, 87, 87, 1410, 87,
- 1399, 1400, 87, 1411, 1412, 87, 87, 1414, 87, 87,
- 1402, 1404, 87, 1413, 1406, 87, 87, 1408, 87, 87,
- 1405, 87, 87, 1415, 1416, 1410, 87, 1417, 3920, 1419,
- 1411, 1412, 1426, 1418, 1414, 1422, 1421, 1420, 87, 1423,
- 1413, 1424, 3920, 87, 87, 3920, 1429, 87, 87, 1428,
-
- 1415, 1416, 87, 87, 1417, 87, 1419, 1425, 1427, 87,
- 1418, 87, 87, 1421, 1420, 1430, 87, 87, 1424, 1432,
- 1433, 87, 1434, 1429, 87, 1435, 1428, 87, 87, 87,
- 87, 1436, 1437, 1438, 1425, 1427, 1439, 1442, 87, 87,
- 1440, 1443, 1430, 1441, 173, 1444, 1432, 1433, 3920, 1434,
- 87, 1445, 1435, 1446, 87, 87, 1447, 87, 1436, 1437,
- 87, 1448, 87, 1439, 1442, 87, 87, 1440, 1443, 1449,
- 1441, 1451, 1444, 87, 87, 87, 1452, 1450, 1445, 1453,
- 1446, 3920, 1454, 1447, 87, 1456, 1455, 3920, 1448, 1457,
- 3920, 3920, 1459, 1458, 87, 1461, 87, 87, 87, 1462,
-
- 1464, 3920, 3920, 87, 1450, 87, 1453, 87, 87, 1454,
- 1460, 87, 1456, 1455, 87, 87, 1457, 87, 1465, 1459,
- 1458, 1463, 1461, 87, 87, 1467, 1462, 1464, 1466, 87,
- 1468, 1469, 3920, 87, 1472, 1471, 1470, 1460, 87, 1473,
- 87, 1480, 1475, 87, 87, 1465, 1474, 3920, 1463, 87,
- 1482, 87, 1467, 87, 1481, 1466, 1483, 87, 1469, 87,
- 3920, 1472, 1471, 1470, 87, 1476, 1473, 87, 1480, 1475,
- 1484, 1485, 87, 1474, 1477, 1486, 1478, 1482, 1488, 1479,
- 87, 1481, 1489, 87, 1487, 87, 87, 87, 87, 1490,
- 87, 87, 1476, 1491, 1494, 1493, 1492, 1484, 1485, 3920,
-
- 1496, 1477, 1486, 1478, 87, 1488, 1479, 87, 87, 1489,
- 87, 1487, 1495, 87, 1497, 87, 1490, 1498, 1499, 3920,
- 1491, 1500, 1493, 1492, 1501, 87, 87, 1496, 1502, 1504,
- 87, 1503, 1505, 3920, 87, 87, 3920, 1506, 3920, 1495,
- 3920, 1497, 1507, 87, 1498, 87, 87, 1512, 1500, 87,
- 87, 1501, 87, 87, 87, 1502, 1504, 1508, 1503, 1505,
- 1511, 1509, 1513, 1514, 1506, 87, 1516, 87, 1518, 1507,
- 1510, 87, 87, 1515, 1512, 87, 1519, 87, 1517, 87,
- 87, 1520, 3920, 1530, 1508, 87, 3920, 1511, 1509, 1513,
- 1514, 1521, 87, 1516, 1522, 1518, 1523, 1510, 87, 87,
-
- 1515, 87, 1525, 1519, 1524, 1517, 1528, 1526, 87, 1527,
- 87, 1532, 1529, 87, 87, 87, 87, 87, 1521, 1531,
- 1533, 1522, 87, 1523, 87, 1534, 87, 1539, 1536, 1525,
- 1535, 1524, 87, 1528, 1526, 87, 1527, 1537, 87, 1529,
- 1538, 1555, 87, 87, 1544, 1540, 1531, 1533, 87, 87,
- 1541, 1542, 1534, 1543, 1539, 1536, 1545, 1535, 87, 87,
- 1553, 3920, 87, 1554, 1537, 3920, 87, 1538, 1556, 1560,
- 1558, 1544, 3920, 87, 87, 3920, 1557, 87, 1542, 3920,
- 1543, 87, 87, 1545, 1546, 1561, 1559, 1553, 1547, 3920,
- 1554, 1548, 1549, 87, 87, 1556, 1550, 1558, 87, 1562,
-
- 3920, 87, 1551, 1557, 87, 1563, 1552, 87, 1564, 1570,
- 87, 1546, 1561, 1559, 87, 1547, 1565, 3920, 1548, 1549,
- 1566, 87, 1567, 1550, 1571, 3920, 1562, 1568, 1569, 1551,
- 1573, 87, 1563, 1552, 87, 1564, 1572, 87, 1574, 1575,
- 1576, 87, 87, 1565, 87, 87, 1578, 1566, 87, 1567,
- 1577, 1580, 1579, 87, 1568, 1569, 87, 1573, 1581, 87,
- 87, 87, 1583, 1572, 1582, 1574, 1575, 1576, 1589, 1590,
- 3920, 1595, 3920, 87, 3920, 3920, 87, 1577, 87, 1579,
- 87, 1591, 87, 87, 1594, 1581, 3920, 87, 1599, 1583,
- 87, 1582, 1584, 1596, 87, 1589, 1590, 1585, 1595, 1586,
-
- 87, 1587, 1597, 1588, 1598, 87, 87, 87, 1591, 87,
- 87, 1594, 1600, 87, 1602, 1599, 1603, 1601, 1604, 1584,
- 1596, 1607, 1606, 87, 1585, 1605, 1586, 1610, 1587, 1597,
- 1588, 1598, 87, 1612, 87, 87, 1611, 1614, 1608, 87,
- 87, 1602, 1609, 1603, 87, 1604, 87, 87, 1607, 1606,
- 87, 1613, 1605, 1616, 1610, 1618, 87, 1615, 1617, 87,
- 1612, 1619, 3920, 1620, 1614, 1608, 87, 1622, 87, 1609,
- 87, 87, 87, 87, 1621, 87, 87, 1623, 1613, 1624,
- 1616, 87, 1618, 1625, 1615, 1617, 1626, 1627, 1619, 87,
- 1620, 87, 1628, 1629, 1622, 1630, 1632, 1634, 1633, 1631,
-
- 3920, 1621, 1635, 87, 87, 87, 1624, 1640, 87, 1636,
- 87, 1645, 87, 1626, 1627, 87, 87, 87, 3920, 1628,
- 1629, 1637, 1630, 87, 87, 1633, 1631, 87, 87, 1635,
- 1641, 87, 1638, 1639, 87, 1642, 1636, 87, 87, 87,
- 1643, 1646, 1644, 87, 3920, 87, 1648, 1647, 1637, 87,
- 1653, 1650, 1649, 3920, 1651, 1666, 1652, 1641, 1655, 1638,
- 1639, 87, 1642, 87, 87, 87, 87, 1643, 1646, 1644,
- 87, 87, 87, 1648, 1647, 87, 1654, 1653, 1650, 1649,
- 87, 1651, 1656, 1652, 1657, 1655, 1658, 87, 1660, 87,
- 1659, 1662, 1667, 1665, 1661, 3920, 1670, 3920, 1663, 3920,
-
- 87, 87, 1664, 1654, 1668, 1669, 87, 87, 1674, 1656,
- 87, 1657, 87, 1658, 87, 1660, 87, 1659, 1662, 87,
- 1665, 1661, 87, 1671, 87, 1663, 87, 87, 87, 1664,
- 1672, 1668, 1669, 1673, 1677, 87, 1675, 1676, 87, 1678,
- 1680, 87, 1679, 87, 87, 1683, 1681, 1682, 87, 87,
- 1671, 87, 173, 87, 1684, 1685, 87, 1672, 1687, 87,
- 1673, 1677, 1686, 1675, 1676, 1693, 1678, 1680, 1695, 1679,
- 3920, 1692, 3920, 1681, 1682, 1688, 87, 87, 87, 1690,
- 1694, 1689, 1685, 87, 1698, 1691, 87, 87, 87, 1686,
- 87, 1696, 87, 87, 1697, 1695, 1701, 87, 1692, 1700,
-
- 1702, 87, 1688, 87, 87, 87, 1690, 1694, 1689, 1699,
- 87, 1698, 1691, 1704, 3920, 1703, 87, 1706, 1696, 1708,
- 1707, 1697, 87, 1701, 87, 1705, 1700, 1702, 87, 87,
- 1710, 1709, 87, 1713, 1712, 1711, 1699, 1714, 1716, 87,
- 87, 1715, 1703, 87, 1706, 87, 1708, 1707, 3920, 1722,
- 87, 87, 1705, 1721, 87, 1724, 87, 3920, 1709, 1723,
- 1713, 1712, 87, 1717, 1714, 1716, 1718, 1719, 1715, 1726,
- 1720, 87, 87, 1725, 87, 87, 1722, 1728, 3920, 1727,
- 1721, 1733, 1729, 1730, 87, 1734, 1723, 87, 1747, 87,
- 1717, 87, 87, 1718, 1719, 87, 1726, 1720, 1731, 87,
-
- 1725, 1735, 1732, 87, 1736, 1738, 1727, 87, 1733, 87,
- 1730, 87, 1734, 87, 1737, 1739, 1744, 1740, 3920, 1743,
- 87, 87, 87, 87, 1741, 1731, 1742, 87, 1735, 1732,
- 87, 1736, 1738, 87, 1748, 87, 3920, 3920, 1745, 87,
- 1746, 1737, 1739, 1744, 1740, 87, 1743, 87, 87, 87,
- 1750, 1741, 1749, 1742, 1752, 1751, 1754, 1753, 87, 1759,
- 1756, 1748, 1763, 87, 87, 1745, 87, 1746, 87, 87,
- 1755, 1757, 87, 1761, 87, 1762, 1758, 1750, 1764, 1749,
- 87, 1752, 1751, 1754, 1753, 87, 1759, 1756, 1760, 1763,
- 1766, 87, 87, 87, 87, 1767, 87, 1755, 1757, 1765,
-
- 1761, 87, 1762, 1758, 1768, 1764, 87, 1769, 1771, 1776,
- 1777, 1770, 1772, 1773, 3920, 1760, 87, 1766, 1778, 1774,
- 87, 1775, 3920, 3920, 87, 87, 1765, 87, 1779, 3920,
- 1780, 1783, 1787, 87, 1769, 87, 87, 87, 1770, 1772,
- 1773, 87, 87, 87, 1784, 1785, 1774, 87, 1775, 1781,
- 87, 1782, 1786, 1788, 87, 1779, 87, 1780, 87, 1787,
- 1791, 87, 1789, 87, 1790, 3920, 87, 87, 1792, 1793,
- 1794, 1784, 1785, 1796, 87, 87, 1781, 1795, 1782, 1786,
- 1788, 87, 1801, 3920, 87, 1803, 87, 1791, 87, 1789,
- 87, 1790, 87, 1797, 1799, 1792, 1793, 1794, 1798, 1800,
-
- 1796, 1802, 1804, 1806, 1795, 87, 1805, 1808, 87, 1801,
- 87, 87, 1803, 1807, 87, 87, 1809, 1811, 1810, 1812,
- 1817, 87, 1820, 87, 1814, 87, 87, 87, 1802, 1804,
- 1806, 87, 1815, 1805, 1808, 87, 1816, 87, 1813, 1819,
- 1807, 87, 1818, 1809, 87, 1810, 1812, 87, 1821, 87,
- 87, 1814, 87, 1822, 87, 1829, 87, 3920, 1830, 1815,
- 87, 1827, 1823, 1816, 1824, 1813, 1819, 87, 1825, 1818,
- 87, 87, 87, 1826, 87, 1821, 87, 1828, 1831, 1832,
- 1822, 87, 1829, 87, 87, 1830, 1833, 87, 1827, 1823,
- 1835, 1824, 1834, 1836, 87, 1825, 1837, 1839, 1838, 3920,
-
- 1826, 3920, 87, 1840, 1828, 1831, 1832, 87, 1841, 1847,
- 3920, 87, 1843, 1833, 1842, 87, 1844, 87, 87, 1834,
- 87, 87, 1846, 1837, 1839, 1838, 87, 3920, 87, 1845,
- 1840, 87, 1848, 87, 1849, 1841, 1847, 87, 1850, 1843,
- 1851, 1842, 1852, 1844, 1853, 87, 87, 1854, 1855, 1846,
- 1856, 87, 1857, 3920, 87, 1859, 1845, 1865, 1858, 1848,
- 87, 1849, 3920, 1860, 87, 1850, 87, 1851, 1866, 87,
- 1863, 1853, 1868, 1872, 1861, 1855, 1870, 1856, 87, 87,
- 87, 87, 1859, 1862, 87, 1858, 87, 1864, 87, 87,
- 1860, 1867, 87, 1869, 87, 87, 1871, 1863, 87, 87,
-
- 87, 1861, 1873, 1870, 87, 87, 1874, 1875, 1876, 87,
- 1862, 1881, 1880, 1877, 1864, 1878, 1879, 87, 1867, 1883,
- 1869, 1882, 87, 1871, 87, 1884, 87, 87, 87, 1873,
- 1885, 87, 87, 87, 1875, 87, 87, 87, 1881, 1880,
- 1877, 1886, 1878, 1879, 1887, 1889, 1883, 1888, 1882, 1890,
- 87, 1891, 1884, 87, 1892, 87, 87, 1885, 1895, 1893,
- 1894, 1896, 87, 87, 1898, 1899, 1897, 87, 1886, 87,
- 87, 1887, 1889, 87, 1888, 1900, 1890, 87, 87, 1901,
- 87, 1892, 1902, 87, 87, 1895, 1893, 1894, 1896, 1903,
- 87, 1898, 1899, 1897, 87, 1904, 1905, 3920, 1906, 1907,
-
- 1908, 87, 1900, 87, 87, 1909, 1901, 1910, 87, 1902,
- 1913, 1911, 1914, 1912, 1917, 1916, 87, 1915, 87, 87,
- 1919, 87, 1904, 1905, 87, 1906, 1907, 1908, 87, 1918,
- 87, 173, 1909, 1921, 1910, 87, 1920, 87, 1911, 87,
- 1912, 1917, 1916, 1927, 87, 87, 87, 1919, 1924, 1922,
- 1923, 87, 1925, 1926, 87, 1929, 1918, 87, 1934, 1928,
- 1921, 87, 87, 1920, 1932, 1930, 1931, 1945, 1940, 87,
- 1927, 87, 1935, 87, 1936, 1924, 1922, 1923, 1938, 1925,
- 1926, 87, 1929, 1942, 1939, 87, 1928, 87, 87, 1933,
- 87, 1932, 1930, 1931, 87, 1937, 87, 87, 1943, 1935,
-
- 87, 1936, 87, 87, 1944, 1938, 87, 1941, 1948, 3920,
- 1946, 1939, 1949, 1947, 87, 87, 1933, 87, 87, 1950,
- 87, 87, 1937, 1951, 1956, 1943, 87, 1952, 3920, 1953,
- 87, 1944, 1954, 87, 1941, 1948, 87, 1946, 1955, 1949,
- 1947, 87, 1957, 3920, 1958, 87, 1950, 87, 1959, 1960,
- 1951, 1956, 1966, 87, 1952, 87, 1953, 87, 1962, 1954,
- 1961, 1963, 1965, 3920, 87, 1955, 87, 87, 1967, 1957,
- 87, 1958, 1973, 1964, 1970, 1959, 1960, 87, 1968, 1974,
- 1975, 1971, 87, 87, 87, 1962, 1979, 1961, 1963, 1965,
- 87, 1972, 87, 87, 1969, 1967, 87, 1976, 1977, 1973,
-
- 1964, 1970, 87, 87, 1978, 1968, 87, 1975, 1971, 1980,
- 1981, 1982, 87, 1979, 1983, 3920, 1984, 1986, 1972, 1985,
- 1988, 1969, 1989, 1987, 87, 87, 87, 87, 87, 87,
- 87, 1978, 1990, 87, 1991, 87, 1980, 1992, 1982, 1995,
- 1994, 1983, 87, 1984, 1986, 1993, 1985, 87, 1996, 87,
- 1987, 1997, 87, 3920, 87, 2000, 87, 3920, 1998, 1999,
- 87, 1991, 87, 87, 87, 87, 87, 1994, 2002, 87,
- 87, 87, 1993, 2001, 2003, 1996, 2004, 2008, 1997, 2005,
- 87, 87, 2000, 2009, 2007, 1998, 1999, 87, 87, 87,
- 2006, 87, 87, 2010, 2011, 2002, 2014, 2012, 3920, 3920,
-
- 2001, 2003, 87, 2004, 2008, 2013, 2005, 87, 2015, 87,
- 2009, 2007, 87, 87, 2016, 87, 2017, 2006, 2018, 87,
- 2010, 2011, 2019, 87, 2012, 87, 2021, 2023, 87, 2022,
- 2024, 87, 2013, 2025, 3920, 2015, 2026, 87, 2027, 2030,
- 2020, 2016, 87, 2017, 3920, 2018, 87, 87, 2029, 2019,
- 2028, 87, 87, 2021, 87, 87, 2022, 2024, 2032, 2031,
- 2025, 87, 87, 2026, 87, 2027, 2030, 2020, 87, 2033,
- 2034, 2035, 2037, 2040, 2036, 2029, 87, 2028, 2041, 2038,
- 87, 87, 87, 87, 2039, 2032, 2031, 2043, 2042, 87,
- 87, 87, 2044, 2045, 2046, 2048, 2033, 2034, 2035, 2037,
-
- 2040, 2036, 2047, 87, 2049, 2041, 2038, 3920, 87, 2050,
- 2051, 2039, 87, 2052, 87, 2042, 2055, 87, 87, 87,
- 2045, 2046, 87, 2053, 2054, 2056, 87, 2058, 2057, 2047,
- 87, 2049, 87, 87, 2059, 87, 2050, 2051, 87, 87,
- 2052, 2060, 87, 2055, 2061, 87, 2062, 87, 2063, 87,
- 2053, 2054, 2056, 2064, 2058, 2057, 2065, 2066, 3920, 87,
- 2067, 2059, 2068, 2069, 2074, 2070, 87, 87, 2060, 2071,
- 2100, 2061, 87, 2062, 2072, 2063, 87, 87, 87, 2073,
- 87, 2078, 2075, 87, 2066, 87, 87, 2067, 2079, 2068,
- 2069, 2074, 2070, 2076, 2077, 87, 2071, 87, 2081, 2080,
-
- 3920, 2082, 87, 87, 2084, 2083, 87, 87, 2078, 2075,
- 87, 2086, 87, 2088, 2087, 2079, 87, 2089, 2085, 3920,
- 2076, 2077, 3920, 2103, 2090, 2081, 2080, 87, 2082, 87,
- 87, 2084, 2083, 87, 2093, 87, 2091, 2092, 2086, 2094,
- 2088, 2087, 87, 87, 2089, 2085, 87, 2095, 2097, 2096,
- 2098, 2090, 2099, 87, 2102, 87, 2104, 2105, 2101, 2106,
- 87, 87, 2111, 2091, 2092, 87, 87, 87, 2107, 2110,
- 87, 2115, 87, 2108, 2095, 2097, 2096, 2098, 87, 2099,
- 87, 87, 87, 2104, 2105, 2101, 2109, 2112, 2116, 87,
- 2120, 87, 2113, 87, 87, 2107, 2110, 2117, 2114, 2121,
-
- 2108, 87, 2118, 87, 2119, 87, 2123, 87, 3920, 87,
- 87, 2128, 87, 2109, 2112, 2116, 87, 2120, 2122, 2113,
- 87, 87, 2124, 2125, 2117, 2114, 2121, 2132, 2126, 2118,
- 2127, 2119, 2129, 2123, 2130, 2131, 87, 87, 87, 3920,
- 87, 87, 2133, 87, 2134, 2122, 2135, 2138, 2139, 2124,
- 2125, 87, 2136, 87, 2132, 2126, 87, 2127, 2140, 2129,
- 2137, 87, 87, 3920, 2144, 2141, 87, 87, 87, 2133,
- 87, 87, 2142, 2135, 87, 2139, 2143, 2145, 2146, 2136,
- 2147, 2148, 2151, 87, 87, 87, 2153, 2137, 87, 2149,
- 87, 87, 2141, 2150, 2152, 2157, 2155, 2154, 87, 2142,
-
- 87, 87, 87, 2143, 2145, 2146, 2175, 2147, 2148, 2151,
- 87, 87, 87, 2153, 2156, 87, 2149, 2159, 2158, 87,
- 2150, 2152, 2157, 2155, 2154, 2160, 2161, 2162, 2163, 87,
- 2164, 2167, 87, 173, 87, 2166, 87, 2165, 87, 3920,
- 2169, 2156, 87, 3920, 2159, 2158, 2168, 2171, 87, 2172,
- 2170, 87, 87, 2161, 2162, 2163, 87, 87, 2167, 87,
- 87, 87, 2166, 87, 2165, 87, 2176, 2169, 2174, 2178,
- 2173, 2177, 2179, 2168, 2171, 87, 2172, 2170, 87, 2180,
- 87, 87, 2181, 2182, 2184, 2183, 2186, 2187, 2185, 87,
- 87, 2188, 3920, 2176, 3920, 2174, 2178, 2173, 2177, 87,
-
- 87, 2190, 2189, 87, 87, 3920, 2180, 87, 2191, 2181,
- 87, 2211, 2183, 2186, 2192, 2185, 87, 87, 87, 87,
- 2193, 87, 2194, 2196, 2195, 87, 87, 3920, 2190, 2189,
- 2197, 87, 87, 87, 2200, 2191, 2198, 2201, 2199, 3920,
- 2202, 2192, 2203, 87, 2210, 87, 87, 2193, 3920, 2194,
- 2196, 2195, 87, 87, 87, 2204, 2208, 2197, 2209, 87,
- 87, 2200, 87, 2198, 2201, 2199, 2205, 2202, 2206, 2203,
- 87, 87, 2217, 87, 2212, 2207, 2213, 2216, 87, 87,
- 87, 2214, 2204, 2208, 2215, 2209, 2221, 87, 87, 87,
- 87, 2218, 87, 2205, 2219, 2206, 2220, 2222, 2223, 2217,
-
- 2225, 2212, 2207, 2213, 2216, 2226, 2230, 87, 2214, 2227,
- 2224, 2215, 87, 2221, 2228, 87, 87, 87, 2218, 2231,
- 87, 2219, 2229, 2220, 87, 87, 2232, 87, 87, 2233,
- 2234, 87, 2226, 87, 2235, 2236, 2227, 2224, 2238, 2240,
- 3920, 2228, 87, 87, 2237, 2239, 2231, 87, 87, 2229,
- 2241, 2243, 2242, 87, 2244, 2251, 2233, 2245, 87, 87,
- 87, 2235, 87, 87, 2246, 2238, 2240, 87, 2247, 87,
- 87, 2237, 2239, 87, 2248, 3920, 2249, 87, 2243, 2242,
- 2259, 87, 2250, 3920, 2245, 3920, 3920, 87, 2257, 2268,
- 87, 2246, 2252, 2253, 2254, 2247, 87, 87, 2256, 2255,
-
- 2263, 2248, 87, 2249, 87, 87, 2258, 87, 2262, 2250,
- 2260, 2261, 87, 87, 87, 2257, 2268, 87, 87, 2252,
- 2253, 2254, 87, 2266, 2264, 2256, 2255, 2263, 87, 2265,
- 2267, 2269, 2270, 2258, 2271, 2262, 87, 2260, 2261, 3920,
- 2274, 2273, 87, 2272, 87, 2275, 87, 87, 87, 2277,
- 2266, 2276, 87, 2278, 2289, 2280, 87, 2267, 2269, 2270,
- 87, 87, 2281, 2282, 2279, 2284, 87, 2274, 2273, 87,
- 2272, 2285, 87, 87, 3920, 87, 2277, 2283, 2276, 2286,
- 2278, 87, 2280, 2287, 87, 2293, 87, 2288, 2290, 87,
- 87, 2279, 87, 87, 2291, 2292, 87, 87, 2285, 2295,
-
- 2296, 87, 2299, 2294, 2283, 87, 2286, 2297, 87, 87,
- 2287, 87, 87, 2300, 2288, 2290, 2298, 87, 2301, 87,
- 87, 2291, 2292, 2303, 2302, 87, 2295, 2296, 87, 2299,
- 2294, 2304, 2305, 2308, 2297, 87, 2307, 3920, 2311, 2306,
- 87, 2310, 2309, 2298, 2312, 2301, 87, 2315, 3920, 87,
- 2313, 2302, 2317, 87, 2316, 87, 87, 2314, 2304, 87,
- 87, 87, 2318, 2307, 87, 87, 2306, 87, 2310, 2309,
- 87, 87, 87, 2319, 2315, 87, 2321, 2313, 2320, 2317,
- 2323, 2316, 2322, 87, 2314, 87, 87, 2324, 87, 2318,
- 2326, 2327, 3920, 2325, 2329, 3920, 2332, 2331, 87, 2328,
-
- 2319, 87, 87, 2321, 87, 2320, 87, 2323, 87, 2322,
- 2330, 87, 2333, 2334, 3920, 3920, 2340, 87, 2327, 87,
- 2325, 2329, 87, 2332, 2331, 2335, 2328, 2336, 87, 2337,
- 2338, 2342, 2339, 2343, 87, 87, 3920, 2330, 87, 2333,
- 87, 87, 87, 2340, 2341, 2344, 2345, 2348, 2346, 87,
- 2356, 3920, 2335, 2347, 2336, 87, 2337, 2338, 2342, 2339,
- 87, 2349, 2351, 87, 87, 87, 2350, 87, 2352, 87,
- 87, 2341, 2344, 2345, 87, 2346, 2353, 2354, 2355, 87,
- 2347, 2361, 87, 87, 87, 87, 2358, 2357, 2349, 2351,
- 87, 2362, 2360, 2350, 2359, 2352, 87, 2363, 87, 2373,
-
- 2368, 2369, 2367, 2353, 2354, 2355, 87, 2364, 87, 87,
- 2365, 2370, 2374, 2358, 2357, 2366, 87, 87, 2362, 2360,
- 87, 2359, 87, 2376, 2363, 87, 87, 2368, 87, 2367,
- 2371, 87, 2375, 87, 2364, 2372, 2377, 2365, 87, 2378,
- 2379, 2380, 2366, 2381, 87, 87, 2382, 2383, 2384, 87,
- 2376, 87, 2385, 2386, 2387, 87, 2388, 87, 87, 2375,
- 2389, 2390, 87, 2377, 87, 3920, 87, 2379, 2380, 87,
- 2381, 87, 87, 2382, 2383, 2391, 2392, 2393, 87, 2385,
- 87, 2387, 87, 2388, 2394, 87, 2395, 87, 2390, 2397,
- 2396, 2398, 87, 2399, 87, 2400, 2403, 2401, 173, 87,
-
- 2402, 2406, 2391, 2392, 2393, 2407, 3920, 2405, 2408, 2404,
- 2409, 2394, 87, 2395, 87, 87, 87, 2396, 2398, 87,
- 2399, 87, 87, 87, 2401, 2410, 87, 87, 87, 2411,
- 87, 87, 2407, 87, 2405, 2408, 2404, 2409, 2414, 2412,
- 2415, 2416, 2417, 87, 2413, 3920, 2418, 87, 3920, 2419,
- 2422, 87, 2410, 2421, 3920, 2420, 2411, 87, 2427, 2424,
- 2423, 2425, 87, 87, 87, 2414, 2426, 2415, 2416, 2417,
- 87, 87, 87, 2418, 2429, 87, 2419, 87, 87, 3920,
- 2421, 87, 2420, 87, 2428, 87, 2424, 2423, 2425, 2430,
- 87, 87, 87, 2426, 2431, 2432, 2433, 2435, 87, 2436,
-
- 3920, 2429, 87, 2434, 2437, 2438, 2442, 2439, 87, 3920,
- 2443, 2428, 3920, 2440, 87, 87, 2430, 2444, 2459, 87,
- 87, 2431, 87, 2433, 2441, 87, 2436, 87, 87, 87,
- 2434, 2437, 2438, 2442, 2439, 87, 2445, 2443, 2446, 87,
- 2440, 2447, 2448, 87, 2444, 2450, 2449, 2451, 2452, 2454,
- 87, 2441, 87, 2453, 3920, 2455, 3920, 87, 2461, 87,
- 87, 87, 2471, 2445, 87, 2446, 87, 87, 2447, 2448,
- 2456, 2457, 2450, 2449, 2451, 87, 2454, 87, 2458, 2460,
- 2453, 87, 2455, 87, 87, 2461, 2462, 2463, 2465, 87,
- 2464, 87, 2467, 2466, 87, 2468, 3920, 2456, 2457, 87,
-
- 87, 3920, 2470, 2469, 3920, 2458, 2460, 87, 2473, 2475,
- 2480, 87, 87, 2462, 2463, 87, 87, 2464, 2472, 87,
- 2466, 87, 2468, 87, 2476, 87, 2477, 2474, 87, 2470,
- 2469, 87, 87, 2479, 2478, 2473, 2475, 2480, 3920, 87,
- 2481, 2485, 2483, 2487, 2482, 2472, 2484, 87, 2488, 3920,
- 87, 2476, 87, 2477, 2474, 87, 87, 87, 2486, 87,
- 2479, 2478, 2489, 2497, 2496, 2494, 87, 2481, 2485, 2483,
- 87, 2482, 87, 2484, 3920, 87, 2490, 2491, 2495, 87,
- 2492, 2499, 87, 3920, 3920, 2486, 2498, 2500, 87, 2489,
- 87, 2496, 2494, 2493, 2501, 87, 2503, 2504, 3920, 2502,
-
- 2505, 87, 2511, 2490, 2491, 2495, 87, 2492, 2499, 87,
- 2506, 87, 2508, 2498, 2500, 2507, 87, 87, 87, 2509,
- 2493, 2501, 87, 2503, 2504, 2510, 2502, 2505, 87, 2511,
- 87, 2512, 87, 2513, 2515, 87, 2517, 2506, 2514, 2508,
- 2516, 87, 2507, 87, 2518, 87, 2509, 87, 2519, 2520,
- 87, 2521, 2510, 2528, 2522, 2523, 87, 87, 2512, 2525,
- 2513, 87, 2524, 2517, 3920, 2514, 87, 2516, 87, 2529,
- 3920, 2518, 2538, 87, 2526, 87, 2520, 87, 2521, 87,
- 2527, 2522, 2523, 87, 87, 87, 2525, 87, 2530, 2524,
- 2531, 87, 2532, 2534, 2537, 2535, 2529, 2533, 2536, 87,
-
- 2539, 2526, 87, 87, 2541, 87, 2543, 2527, 2545, 87,
- 2544, 87, 87, 2540, 2550, 2530, 87, 2531, 3920, 2546,
- 2534, 2537, 2535, 2542, 87, 2536, 87, 2539, 87, 87,
- 87, 2541, 87, 87, 2547, 2545, 2548, 2544, 87, 3920,
- 2540, 87, 2551, 2554, 2549, 2555, 2546, 2552, 3920, 2553,
- 2542, 2556, 3920, 3920, 2557, 87, 3920, 87, 2560, 2562,
- 87, 87, 2558, 2548, 2563, 2559, 87, 87, 2565, 2551,
- 2554, 2549, 2555, 87, 2552, 87, 2553, 87, 2556, 2564,
- 87, 2557, 2561, 87, 2566, 2560, 87, 2567, 87, 2558,
- 2568, 87, 2559, 2569, 87, 2565, 2570, 2575, 2571, 87,
-
- 3920, 87, 3920, 2574, 2576, 87, 2564, 2572, 2580, 2561,
- 87, 2566, 87, 87, 2567, 87, 2581, 2568, 87, 2573,
- 2569, 87, 2579, 2570, 87, 2571, 87, 2577, 2578, 87,
- 2574, 2576, 2582, 87, 2572, 2580, 87, 87, 2583, 2587,
- 2586, 2584, 2585, 2581, 87, 2589, 2573, 87, 2588, 2579,
- 3920, 3920, 3920, 2590, 2577, 2578, 87, 87, 2591, 2582,
- 87, 87, 87, 87, 2595, 2583, 2587, 2586, 2584, 2585,
- 87, 2592, 2589, 2593, 2594, 2588, 87, 2596, 87, 87,
- 2590, 2597, 2599, 87, 2598, 2591, 87, 2600, 2601, 2603,
- 2602, 2595, 2606, 3920, 87, 2604, 2610, 87, 2592, 87,
-
- 2593, 2594, 87, 2605, 2596, 87, 87, 3920, 2597, 87,
- 2614, 2598, 2607, 2608, 2600, 87, 2603, 2602, 87, 2606,
- 87, 2609, 2604, 2615, 87, 87, 2611, 2612, 87, 87,
- 2605, 173, 2613, 2616, 2618, 2617, 2619, 2621, 2622, 2607,
- 2608, 87, 87, 87, 2623, 2620, 87, 2627, 2609, 87,
- 2626, 2632, 2628, 2611, 87, 87, 2639, 87, 2624, 87,
- 2616, 2618, 2617, 2619, 2621, 87, 2629, 2630, 87, 2625,
- 87, 2623, 2620, 2635, 87, 2633, 87, 2626, 87, 2628,
- 2631, 87, 2634, 87, 2636, 2624, 2637, 87, 87, 87,
- 2638, 2640, 2641, 2629, 2630, 87, 2625, 2642, 2643, 87,
-
- 2635, 87, 2633, 3920, 2644, 87, 87, 2631, 2645, 2634,
- 87, 2636, 87, 87, 87, 2647, 2649, 2638, 2640, 2641,
- 87, 2655, 2646, 2648, 2642, 2643, 87, 87, 2650, 2651,
- 87, 2644, 87, 3920, 2652, 2645, 2653, 87, 87, 2654,
- 87, 87, 2647, 2649, 87, 2656, 3920, 2657, 87, 2646,
- 2648, 2658, 2662, 2659, 2664, 2650, 2651, 2665, 87, 87,
- 2661, 2652, 87, 2653, 2660, 87, 2654, 87, 87, 87,
- 2667, 87, 2656, 87, 2657, 2663, 87, 2666, 2658, 2662,
- 2659, 2664, 2668, 87, 2665, 2669, 87, 2661, 2670, 2673,
- 2671, 2660, 87, 87, 2678, 2672, 87, 87, 87, 87,
-
- 2674, 87, 2663, 2676, 2666, 2675, 2679, 2677, 87, 2668,
- 2681, 87, 2669, 87, 2683, 2670, 2673, 2671, 87, 2680,
- 2682, 3920, 2672, 2684, 87, 2686, 87, 2674, 2689, 2685,
- 2676, 87, 2675, 87, 2677, 87, 87, 2681, 87, 2687,
- 2688, 2683, 87, 2693, 2691, 2692, 2680, 2682, 87, 2694,
- 2684, 2690, 87, 2696, 87, 2689, 2685, 87, 2695, 87,
- 2702, 87, 2697, 2698, 87, 2699, 2687, 2688, 2703, 87,
- 2693, 2691, 2692, 2705, 87, 87, 87, 2708, 2690, 87,
- 87, 2700, 2709, 87, 2701, 2695, 2704, 87, 2706, 2697,
- 2698, 2707, 2699, 2715, 87, 2703, 3920, 2710, 87, 87,
-
- 2705, 2711, 2714, 2712, 87, 2713, 87, 87, 2700, 87,
- 87, 2701, 87, 2704, 2716, 2706, 2718, 87, 2707, 87,
- 87, 2720, 2719, 87, 2710, 2717, 2721, 2723, 2711, 2714,
- 2712, 87, 2713, 87, 2722, 2724, 2728, 2725, 87, 2726,
- 2729, 87, 2727, 87, 2733, 2730, 87, 2731, 87, 2719,
- 87, 2732, 2717, 2721, 87, 87, 87, 87, 87, 2735,
- 2737, 2722, 87, 2728, 2725, 2739, 2726, 87, 87, 2727,
- 2736, 87, 2730, 87, 2731, 2734, 2742, 2738, 2732, 87,
- 2740, 2748, 87, 87, 2744, 2743, 87, 2737, 2745, 87,
- 3920, 2747, 2739, 87, 2749, 2741, 87, 2736, 87, 87,
-
- 2754, 2755, 2734, 87, 2738, 2746, 87, 2740, 87, 2750,
- 2752, 2744, 2743, 87, 87, 2745, 87, 87, 2747, 2751,
- 2757, 2753, 2741, 87, 3920, 3920, 87, 2754, 87, 2758,
- 2756, 87, 2746, 87, 3920, 2760, 2750, 2752, 87, 2759,
- 2762, 2765, 87, 2763, 2764, 2776, 2751, 2757, 2753, 2761,
- 87, 87, 87, 2768, 87, 2770, 2758, 2756, 2769, 87,
- 2766, 87, 2760, 2767, 87, 87, 2759, 87, 2765, 87,
- 2763, 2764, 87, 2771, 2772, 3920, 2761, 87, 2773, 2777,
- 2768, 87, 2770, 3920, 3920, 2769, 2778, 2766, 2779, 2780,
- 2767, 87, 2785, 2774, 87, 2775, 2781, 2791, 87, 87,
-
- 2771, 2772, 87, 2782, 3920, 2773, 2777, 2784, 87, 2787,
- 87, 87, 2783, 2778, 87, 2779, 2780, 87, 87, 2785,
- 2774, 2788, 2775, 2781, 2789, 87, 2786, 87, 2790, 87,
- 2782, 87, 2792, 2794, 2784, 2793, 2787, 2795, 2799, 2783,
- 87, 87, 3920, 87, 2796, 87, 87, 2798, 2788, 87,
- 2797, 2789, 87, 2786, 2800, 2790, 2801, 2802, 2803, 2807,
- 2794, 2804, 2793, 87, 87, 2799, 87, 2806, 2805, 87,
- 2808, 2796, 87, 2809, 2798, 87, 87, 2797, 87, 87,
- 87, 2800, 2810, 2801, 2802, 2803, 87, 2812, 2804, 87,
- 2811, 87, 2813, 2814, 2806, 2805, 87, 87, 3920, 2817,
-
- 2809, 3920, 87, 2815, 3920, 87, 2818, 3920, 2820, 2810,
- 2819, 2816, 3920, 2824, 2812, 87, 2825, 2811, 87, 2813,
- 2821, 2826, 3920, 3920, 87, 87, 2817, 87, 87, 87,
- 2815, 87, 2827, 2818, 87, 2820, 2828, 2819, 2816, 2822,
- 2824, 2823, 173, 2825, 87, 2830, 87, 2821, 87, 2829,
- 2832, 2831, 3920, 3920, 87, 2835, 2836, 2837, 2833, 2827,
- 2841, 3920, 2834, 2828, 87, 87, 2822, 87, 2823, 87,
- 87, 2840, 2830, 87, 87, 2839, 2829, 2832, 2831, 87,
- 87, 2838, 2835, 2836, 2837, 2833, 87, 87, 87, 2834,
- 2842, 2843, 2845, 87, 2844, 3920, 2848, 2849, 2840, 2846,
-
- 2847, 3920, 2839, 2851, 3920, 2853, 2850, 3920, 2838, 2855,
- 2859, 3920, 2852, 3920, 2858, 3920, 2881, 87, 87, 87,
- 87, 2844, 87, 87, 87, 87, 2846, 2847, 87, 87,
- 87, 87, 2853, 2850, 2854, 87, 2855, 2856, 2857, 2852,
- 87, 2858, 87, 2860, 2861, 2862, 87, 2864, 87, 87,
- 87, 2863, 2869, 3920, 2865, 2866, 87, 2871, 3920, 87,
- 2870, 2854, 2867, 3920, 2856, 2857, 87, 2868, 87, 2873,
- 2860, 2861, 2862, 3920, 87, 87, 87, 87, 2863, 2869,
- 87, 2865, 2866, 87, 87, 87, 2872, 2870, 2874, 2867,
- 2875, 87, 2876, 2877, 2868, 87, 2873, 87, 2878, 87,
-
- 87, 2879, 2880, 3920, 2883, 2882, 87, 2884, 87, 2885,
- 2890, 3920, 2894, 2872, 2886, 2874, 2888, 2875, 87, 2876,
- 2877, 87, 87, 2897, 87, 2878, 87, 2887, 2879, 2880,
- 87, 2883, 2882, 87, 2884, 87, 2885, 87, 87, 2889,
- 2891, 2886, 2892, 2888, 87, 87, 2893, 2895, 87, 2899,
- 2897, 2896, 3920, 87, 2887, 87, 2898, 2902, 2900, 3920,
- 2901, 3920, 87, 2903, 2904, 2905, 2889, 2891, 87, 2892,
- 87, 87, 2906, 2893, 87, 2908, 2899, 87, 2896, 87,
- 2909, 87, 2910, 2898, 2902, 2900, 87, 2901, 87, 87,
- 2903, 2904, 2905, 2907, 87, 2911, 87, 2912, 2913, 2906,
-
- 2914, 87, 2908, 87, 2915, 2916, 2917, 2909, 2918, 2921,
- 87, 2919, 87, 87, 87, 87, 87, 87, 87, 2920,
- 2907, 2922, 2911, 2923, 87, 2913, 2924, 87, 87, 2925,
- 87, 2915, 2916, 2917, 2926, 2918, 2921, 2927, 2919, 2940,
- 3920, 2928, 2936, 87, 87, 87, 2920, 2929, 2922, 2930,
- 2923, 2931, 2932, 87, 87, 2934, 87, 2933, 87, 2939,
- 87, 2937, 2935, 2942, 2927, 2938, 87, 87, 2928, 87,
- 87, 87, 87, 87, 2929, 87, 2930, 87, 2931, 2932,
- 87, 87, 2934, 87, 2933, 2941, 2939, 2943, 2937, 2935,
- 2942, 2944, 2938, 3920, 87, 2945, 2946, 2947, 2948, 2949,
-
- 3920, 2950, 2951, 2954, 87, 87, 3920, 2953, 87, 2952,
- 2956, 3920, 2941, 2957, 87, 87, 87, 3920, 2944, 2955,
- 87, 87, 2945, 2946, 2947, 2948, 2949, 87, 2950, 87,
- 2954, 87, 87, 87, 2953, 2958, 2952, 2956, 87, 2959,
- 2957, 2960, 2961, 2962, 2963, 2964, 2955, 2965, 87, 2966,
- 87, 87, 87, 2967, 2968, 2969, 87, 3920, 2970, 2971,
- 3920, 87, 2958, 2974, 87, 2975, 2959, 87, 2960, 2961,
- 2962, 2963, 2964, 87, 87, 2973, 2966, 2976, 2972, 2977,
- 87, 87, 87, 2979, 87, 2970, 2971, 87, 2978, 87,
- 2974, 87, 2975, 2980, 87, 87, 2983, 87, 87, 2985,
-
- 87, 2981, 2973, 87, 2976, 2972, 2977, 87, 2982, 2984,
- 2979, 2986, 2988, 2987, 2990, 2978, 2989, 87, 2991, 87,
- 2980, 2996, 2993, 87, 2997, 2992, 87, 2998, 2981, 87,
- 2994, 87, 87, 87, 87, 2982, 2984, 87, 87, 87,
- 2987, 2990, 87, 2989, 87, 2991, 2995, 3001, 87, 2993,
- 3003, 2997, 2992, 87, 87, 2999, 87, 2994, 3000, 3002,
- 3004, 87, 87, 87, 3005, 87, 3006, 3007, 3008, 3920,
- 3009, 87, 3010, 2995, 3001, 3013, 3011, 3003, 87, 87,
- 3017, 3920, 2999, 173, 87, 3000, 3002, 3004, 87, 3012,
- 87, 3005, 87, 3006, 3007, 3008, 87, 3009, 3016, 3010,
-
- 3014, 87, 3013, 3011, 3015, 87, 3018, 87, 3019, 87,
- 87, 3020, 3021, 3023, 3022, 3024, 3012, 3026, 3920, 3027,
- 87, 3028, 3025, 3920, 87, 3016, 3920, 3014, 3920, 3920,
- 3920, 3015, 87, 3018, 87, 3019, 87, 87, 3020, 3021,
- 87, 3022, 87, 87, 3026, 87, 3027, 87, 3028, 3025,
- 3029, 3030, 3031, 3032, 3033, 3034, 3036, 3035, 3038, 87,
- 87, 87, 87, 87, 87, 87, 3037, 87, 3039, 3040,
- 3920, 3920, 3046, 87, 3071, 87, 87, 3029, 3030, 3031,
- 3032, 3033, 3034, 3036, 3035, 3038, 3044, 3045, 3047, 3042,
- 3041, 3043, 3050, 3037, 87, 3039, 3040, 87, 87, 87,
-
- 87, 87, 3048, 3049, 3051, 3052, 87, 87, 3056, 3920,
- 87, 3053, 87, 3044, 3045, 3047, 3042, 3041, 3043, 87,
- 87, 87, 87, 3064, 3054, 3055, 3920, 3057, 87, 3048,
- 3049, 3051, 87, 87, 87, 3056, 3058, 3059, 3053, 87,
- 3061, 3063, 3060, 3062, 3065, 87, 87, 3174, 87, 3066,
- 87, 3054, 3055, 87, 3057, 3069, 87, 3068, 3070, 3920,
- 3920, 87, 3078, 3058, 3059, 3067, 87, 3061, 3063, 3060,
- 3062, 87, 3072, 3077, 87, 3074, 3066, 3073, 87, 87,
- 3075, 87, 87, 3076, 3068, 87, 87, 87, 87, 87,
- 3079, 3080, 3067, 3082, 3081, 87, 87, 87, 87, 3072,
-
- 3077, 87, 3074, 3083, 3073, 3084, 3085, 3075, 3087, 87,
- 3076, 3086, 87, 3089, 3088, 3090, 3091, 3079, 3080, 87,
- 3082, 3081, 3920, 87, 3920, 3095, 3920, 3097, 87, 3092,
- 3083, 3093, 3084, 3085, 87, 87, 87, 87, 3086, 87,
- 87, 3088, 3090, 3091, 3094, 3099, 87, 87, 3096, 87,
- 3098, 87, 3095, 87, 3097, 87, 3092, 87, 3093, 3100,
- 3101, 3102, 3103, 3106, 3104, 3105, 87, 3107, 3108, 87,
- 3109, 3094, 3099, 3114, 87, 3096, 87, 3098, 3112, 3113,
- 87, 3117, 3920, 87, 3110, 87, 3100, 3101, 3102, 87,
- 87, 3104, 3105, 87, 3107, 3108, 87, 3109, 3111, 87,
-
- 87, 3115, 87, 3120, 3116, 3112, 3113, 3118, 87, 3119,
- 87, 3110, 3121, 3122, 87, 87, 87, 87, 3123, 87,
- 3124, 3125, 87, 3126, 3127, 3111, 3129, 3128, 3115, 3135,
- 3120, 3116, 3920, 87, 3118, 87, 3119, 3130, 87, 3121,
- 87, 3132, 3131, 3133, 87, 3123, 3137, 3124, 3125, 87,
- 3126, 87, 87, 87, 3128, 3134, 87, 3136, 87, 87,
- 87, 3138, 87, 87, 3130, 3140, 3139, 3141, 3132, 3131,
- 3133, 87, 87, 3137, 3147, 3142, 3143, 3144, 3145, 87,
- 3146, 87, 3134, 3150, 3136, 3149, 3151, 3152, 3138, 87,
- 87, 3192, 87, 3139, 3141, 87, 87, 87, 87, 3148,
-
- 3154, 87, 3142, 3143, 3144, 3145, 87, 3146, 87, 87,
- 87, 3153, 3149, 3151, 3152, 3155, 3158, 3156, 3157, 3159,
- 3162, 3163, 87, 87, 87, 87, 3148, 3154, 3160, 3161,
- 3164, 87, 87, 3168, 87, 87, 87, 3165, 3153, 3167,
- 3166, 87, 3155, 3158, 3156, 3157, 3159, 3162, 87, 3169,
- 87, 87, 87, 3170, 3172, 3160, 3161, 87, 3177, 87,
- 3168, 87, 3171, 87, 3165, 3173, 3167, 3166, 3175, 3176,
- 3179, 87, 3178, 87, 87, 3181, 173, 3182, 3180, 3183,
- 3170, 3172, 87, 3185, 87, 3177, 3204, 3186, 3920, 3171,
- 87, 87, 3173, 3184, 3189, 3175, 3176, 3179, 87, 3178,
-
- 87, 87, 87, 3187, 87, 3180, 3183, 87, 3188, 3190,
- 87, 87, 3191, 87, 3186, 3193, 87, 3920, 3194, 3195,
- 3184, 3189, 3197, 3199, 3198, 87, 3196, 3200, 3201, 87,
- 3202, 87, 3920, 3920, 87, 87, 3190, 3207, 87, 3191,
- 87, 87, 3193, 87, 87, 3194, 3195, 3203, 3205, 3197,
- 3199, 3198, 87, 3196, 3206, 3208, 3209, 3202, 3210, 87,
- 87, 87, 87, 3212, 3207, 3211, 3214, 3221, 87, 3216,
- 87, 3215, 87, 3920, 3203, 3205, 87, 3213, 87, 3217,
- 87, 3206, 3208, 3209, 87, 3210, 3218, 87, 3219, 87,
- 3212, 87, 3211, 3214, 3220, 87, 3216, 87, 3215, 87,
-
- 3223, 3222, 3227, 87, 3213, 3224, 3217, 3225, 87, 87,
- 87, 3226, 87, 3218, 87, 3219, 3228, 3229, 3233, 87,
- 3232, 3220, 87, 3230, 3231, 87, 3236, 3223, 3222, 87,
- 87, 3234, 3224, 3243, 3225, 3920, 87, 3240, 3226, 3244,
- 3235, 87, 87, 3228, 3229, 3233, 87, 3232, 3237, 87,
- 3230, 3231, 87, 87, 3238, 3239, 87, 3241, 3234, 3242,
- 87, 87, 87, 3246, 3240, 87, 87, 3235, 3245, 3247,
- 3248, 87, 87, 3249, 3254, 3237, 87, 3250, 3252, 87,
- 3251, 3238, 3239, 3259, 87, 3253, 3242, 3255, 3920, 3920,
- 3246, 3261, 87, 3256, 3257, 3245, 87, 87, 3920, 87,
-
- 3249, 87, 87, 87, 3250, 3252, 87, 3251, 3263, 3258,
- 87, 87, 3253, 3260, 3255, 3262, 87, 87, 3261, 3264,
- 3256, 3257, 87, 87, 87, 87, 3265, 3266, 3267, 3268,
- 3270, 3271, 3920, 3920, 3272, 87, 3258, 3269, 3273, 3275,
- 3260, 87, 3262, 3278, 3276, 3282, 3264, 3274, 87, 3920,
- 87, 3277, 87, 87, 87, 87, 3268, 3270, 87, 87,
- 87, 3272, 87, 3281, 3269, 3273, 87, 3283, 3279, 3280,
- 3278, 87, 87, 3284, 3274, 87, 87, 3285, 3277, 3286,
- 3288, 3290, 3289, 3287, 3291, 3920, 3292, 3293, 87, 87,
- 3281, 87, 3295, 87, 87, 3279, 3280, 87, 3300, 3299,
-
- 87, 87, 3296, 3294, 3285, 3298, 3286, 87, 3290, 3289,
- 3287, 87, 87, 3292, 87, 87, 87, 3297, 87, 87,
- 3301, 3304, 3302, 3305, 3306, 87, 87, 3303, 3307, 3296,
- 3294, 87, 3298, 3308, 3309, 3310, 3312, 3313, 87, 3314,
- 3315, 3317, 87, 87, 3297, 87, 87, 3301, 3304, 3311,
- 3316, 3306, 87, 3318, 87, 87, 87, 87, 3319, 3320,
- 87, 3309, 3310, 3312, 87, 3321, 3322, 3324, 3317, 87,
- 3325, 87, 87, 3323, 3329, 87, 3311, 3316, 3326, 3327,
- 87, 87, 3328, 87, 87, 87, 3320, 3332, 87, 3920,
- 87, 87, 3321, 3322, 3324, 3330, 87, 3325, 3331, 3333,
-
- 3323, 3329, 87, 3336, 87, 3326, 3327, 3334, 3338, 3328,
- 3337, 87, 87, 3343, 87, 3335, 87, 3344, 87, 3339,
- 3345, 87, 3330, 3341, 3340, 3331, 3333, 87, 3342, 3920,
- 3336, 87, 3346, 3920, 3334, 3338, 3347, 3337, 3348, 3350,
- 3343, 3349, 3335, 3920, 87, 3352, 87, 3345, 3351, 3356,
- 87, 87, 87, 3353, 87, 87, 3354, 3358, 87, 3346,
- 3355, 3357, 87, 3347, 87, 3348, 3350, 87, 3349, 87,
- 87, 87, 3352, 87, 87, 3351, 3356, 3359, 3360, 87,
- 3353, 3363, 3361, 3354, 3358, 87, 3362, 3355, 3357, 87,
- 3364, 3365, 3367, 87, 3366, 87, 3371, 3373, 3370, 3368,
-
- 3369, 3375, 3378, 3920, 3359, 3360, 87, 87, 87, 3361,
- 3372, 3374, 3382, 3362, 3376, 87, 3377, 87, 3365, 87,
- 87, 3366, 87, 87, 87, 3370, 3368, 3369, 87, 87,
- 87, 3379, 87, 87, 87, 3380, 3381, 3372, 3374, 87,
- 3383, 3376, 3384, 3377, 3386, 87, 3385, 3388, 3389, 87,
- 3387, 3390, 87, 87, 3392, 87, 3391, 3394, 3379, 87,
- 3393, 3397, 3380, 3381, 87, 87, 87, 87, 87, 3384,
- 3395, 3386, 3396, 3385, 3388, 3389, 3398, 3387, 87, 3399,
- 87, 3392, 87, 87, 3394, 3400, 3402, 3393, 87, 87,
- 3401, 3403, 87, 3404, 87, 87, 3405, 3395, 87, 3396,
-
- 3406, 3407, 3408, 3398, 87, 3412, 87, 3410, 3409, 3413,
- 3920, 3415, 3400, 3402, 87, 3411, 87, 3401, 87, 3416,
- 87, 3414, 87, 3405, 87, 87, 3417, 87, 3407, 3408,
- 87, 3418, 87, 87, 3410, 3409, 3413, 87, 3415, 3419,
- 3422, 87, 3411, 3420, 3421, 3426, 3416, 3427, 3414, 87,
- 3423, 3428, 87, 3417, 87, 3429, 87, 3430, 3418, 3424,
- 87, 87, 3425, 87, 87, 3435, 3419, 3422, 3431, 3434,
- 3420, 3421, 87, 87, 87, 87, 3436, 3423, 87, 3432,
- 3433, 3438, 3429, 3437, 3430, 87, 3424, 87, 87, 3425,
- 3439, 87, 3442, 3443, 3440, 3431, 3434, 87, 87, 87,
-
- 3444, 3446, 87, 3436, 3447, 87, 3432, 3433, 87, 87,
- 3437, 3445, 3441, 87, 87, 3448, 3454, 3439, 87, 3442,
- 3443, 3440, 3449, 87, 3450, 3451, 3455, 87, 87, 3452,
- 3920, 3447, 87, 87, 3453, 3920, 3920, 87, 3445, 3441,
- 3456, 87, 3448, 3454, 87, 3457, 87, 3459, 3458, 3449,
- 87, 3450, 3451, 87, 87, 3460, 3452, 3461, 3462, 87,
- 3463, 3453, 87, 3467, 3464, 3468, 87, 3456, 87, 3465,
- 87, 3466, 3457, 87, 3459, 3458, 87, 3471, 87, 87,
- 3470, 87, 3460, 87, 3461, 3462, 87, 3463, 3469, 87,
- 3467, 3464, 3468, 3472, 3473, 3474, 3465, 87, 3466, 3476,
-
- 3475, 3477, 87, 3478, 87, 3479, 3481, 3470, 3480, 3484,
- 3487, 3920, 87, 3482, 87, 3469, 3486, 3490, 3483, 3920,
- 87, 3473, 87, 3485, 87, 3492, 3476, 87, 3477, 87,
- 87, 87, 87, 87, 87, 3480, 3484, 87, 87, 3488,
- 3482, 3489, 3498, 3486, 3491, 3483, 87, 3493, 87, 87,
- 3485, 3494, 87, 3496, 3495, 87, 3497, 3499, 3505, 87,
- 3501, 87, 3920, 3500, 3502, 87, 3488, 87, 3489, 87,
- 87, 3491, 3504, 87, 3493, 3506, 3507, 87, 3494, 3503,
- 3496, 3495, 3509, 3497, 87, 87, 87, 3508, 87, 87,
- 3500, 3502, 87, 3513, 87, 3511, 3515, 3512, 3514, 3504,
-
- 87, 3510, 87, 3507, 87, 3517, 3503, 3518, 3920, 87,
- 3516, 87, 87, 3519, 3508, 87, 3520, 3521, 3522, 3529,
- 3513, 3524, 3511, 3515, 3512, 87, 3523, 3530, 3510, 87,
- 87, 3525, 3517, 3528, 87, 87, 3532, 3516, 3531, 3538,
- 3519, 3920, 87, 87, 3521, 3522, 87, 87, 3524, 3526,
- 87, 87, 3527, 3523, 87, 87, 87, 3533, 3525, 87,
- 3528, 3534, 87, 3535, 3536, 3531, 87, 3537, 87, 3541,
- 3542, 87, 3539, 3540, 3546, 87, 3526, 3920, 3543, 3527,
- 3550, 3548, 87, 87, 3533, 87, 87, 87, 3534, 3545,
- 87, 3536, 87, 3544, 3537, 87, 87, 3542, 3547, 3539,
-
- 3540, 87, 3551, 87, 3549, 3543, 87, 87, 3548, 3552,
- 3553, 3554, 3555, 3556, 3557, 3558, 3545, 3559, 3560, 3561,
- 3544, 3564, 87, 3563, 87, 3547, 3562, 87, 3920, 87,
- 3565, 3549, 87, 87, 87, 87, 87, 3553, 3554, 3555,
- 87, 87, 87, 87, 3559, 87, 3561, 3566, 3564, 3567,
- 3568, 3569, 3575, 3562, 3572, 87, 3570, 87, 87, 87,
- 3571, 87, 87, 3573, 3577, 87, 3574, 3578, 87, 3576,
- 87, 3580, 87, 3581, 3566, 3579, 87, 87, 3569, 87,
- 87, 3572, 87, 3570, 3582, 3583, 3584, 3571, 3585, 87,
- 3573, 3577, 87, 3574, 3578, 87, 3576, 3586, 3580, 3587,
-
- 87, 3588, 3579, 3589, 87, 3591, 3592, 87, 87, 3590,
- 3595, 87, 3583, 3584, 3594, 87, 3593, 3598, 3597, 3596,
- 87, 3920, 3920, 87, 3586, 87, 3587, 87, 3588, 3599,
- 3589, 3601, 87, 87, 87, 3602, 3590, 87, 87, 3605,
- 3600, 3594, 87, 3593, 87, 3597, 3596, 87, 3603, 3606,
- 3607, 87, 3604, 3609, 87, 87, 3599, 87, 3601, 87,
- 3608, 87, 3602, 3610, 87, 87, 3605, 3600, 3920, 87,
- 3611, 3920, 3622, 3920, 87, 3603, 3606, 3607, 87, 3604,
- 3609, 3612, 87, 3614, 3613, 3615, 3627, 3608, 87, 3618,
- 3610, 87, 87, 3616, 3617, 87, 87, 3611, 3621, 3624,
-
- 3619, 3620, 3623, 87, 87, 87, 87, 3625, 3612, 3628,
- 3614, 3613, 3615, 87, 3629, 3920, 3618, 3631, 3626, 3634,
- 3616, 3617, 87, 87, 87, 3621, 3624, 3619, 3620, 3623,
- 3630, 87, 87, 3632, 3625, 3633, 87, 87, 3635, 3636,
- 3641, 3629, 87, 87, 87, 3626, 87, 3637, 3638, 3920,
- 87, 3639, 3640, 3642, 3643, 87, 3644, 3630, 3647, 3645,
- 3632, 3648, 3633, 3650, 3649, 3635, 87, 87, 3651, 3646,
- 87, 3652, 3920, 3655, 3920, 3654, 87, 87, 87, 87,
- 87, 87, 87, 3644, 3656, 87, 3645, 87, 3648, 3659,
- 87, 3649, 3653, 87, 87, 3651, 3646, 87, 3652, 87,
-
- 87, 3657, 3654, 3658, 3660, 87, 3661, 3664, 87, 87,
- 3662, 3656, 3663, 3665, 3666, 3669, 3659, 3668, 3667, 3653,
- 3670, 87, 87, 3671, 87, 3679, 3673, 87, 3657, 3920,
- 3658, 3660, 87, 3661, 3664, 87, 87, 3662, 87, 3663,
- 3665, 87, 87, 87, 3668, 3667, 3672, 87, 3674, 3675,
- 87, 87, 3676, 3673, 3677, 3682, 3680, 87, 87, 3678,
- 3681, 87, 3683, 3684, 3686, 3687, 3685, 87, 3689, 3690,
- 87, 3688, 87, 3672, 87, 3674, 3675, 3692, 3693, 3676,
- 3695, 3694, 3682, 3680, 87, 87, 87, 3681, 3691, 3683,
- 3684, 87, 87, 3685, 87, 87, 87, 87, 3688, 87,
-
- 87, 3696, 3697, 3698, 3692, 87, 3699, 87, 3694, 3700,
- 3701, 87, 3702, 3703, 3704, 3691, 3705, 3706, 87, 87,
- 3707, 3708, 3709, 3713, 3710, 3712, 3714, 3920, 3696, 3697,
- 87, 3711, 87, 87, 3716, 87, 87, 87, 87, 87,
- 87, 87, 87, 87, 3706, 3717, 87, 3707, 87, 87,
- 3713, 3710, 3712, 87, 3715, 3718, 3719, 87, 3711, 3720,
- 3721, 87, 87, 3722, 3723, 3724, 3725, 3732, 3726, 87,
- 3727, 87, 3717, 3728, 87, 87, 87, 87, 3729, 3731,
- 3730, 3715, 3718, 3719, 3920, 87, 3720, 3721, 87, 87,
- 87, 3723, 87, 3725, 87, 3726, 3733, 3727, 3734, 87,
-
- 3728, 3737, 3735, 87, 87, 3729, 3731, 3730, 3736, 87,
- 87, 3738, 87, 3739, 3740, 3741, 3748, 87, 3742, 3744,
- 87, 3743, 87, 3733, 3749, 3734, 87, 87, 3737, 3735,
- 3745, 87, 87, 3747, 3746, 3736, 3750, 87, 3738, 3751,
- 3739, 3740, 3741, 87, 87, 3742, 3744, 87, 3743, 3752,
- 3753, 87, 87, 87, 3757, 3754, 3758, 3745, 87, 3756,
- 3747, 3746, 3755, 87, 3760, 3761, 87, 87, 87, 87,
- 3759, 87, 3763, 3762, 87, 3764, 3752, 3753, 87, 3765,
- 87, 3757, 3754, 3920, 87, 3767, 3756, 87, 87, 3755,
- 3772, 3760, 3761, 87, 87, 3766, 3768, 3759, 87, 3763,
-
- 3762, 87, 3764, 87, 3770, 87, 3765, 87, 3769, 3771,
- 87, 3773, 3767, 3774, 3775, 3776, 87, 3772, 3777, 87,
- 3778, 3779, 3766, 3768, 3780, 3782, 87, 87, 87, 87,
- 3781, 3770, 87, 87, 3783, 3769, 3771, 87, 3773, 3785,
- 3774, 3775, 3776, 87, 3784, 3777, 87, 87, 3779, 3786,
- 3787, 3780, 3782, 3788, 3789, 3790, 3791, 3781, 3792, 3798,
- 3793, 87, 87, 87, 87, 87, 3785, 3794, 3795, 3920,
- 3802, 3784, 87, 3796, 3797, 87, 87, 3787, 3920, 87,
- 3788, 87, 87, 3791, 87, 3792, 87, 3793, 3800, 87,
- 87, 87, 3799, 3804, 3794, 3795, 3801, 87, 3805, 3803,
-
- 3796, 3797, 3806, 87, 3807, 87, 87, 3810, 3809, 3808,
- 3811, 3812, 3815, 3817, 3813, 3800, 87, 87, 87, 3799,
- 87, 87, 87, 3801, 3814, 87, 3803, 87, 3816, 87,
- 3819, 87, 87, 87, 87, 3809, 3808, 3811, 3812, 87,
- 3817, 3813, 3818, 3820, 3821, 3822, 3824, 3825, 3920, 3826,
- 87, 3814, 3823, 3829, 87, 3816, 3828, 87, 3827, 87,
- 87, 3830, 87, 87, 87, 3834, 87, 3831, 87, 3818,
- 3832, 3821, 3822, 3824, 87, 87, 87, 3833, 87, 3823,
- 3829, 3835, 3836, 3828, 87, 3827, 3837, 87, 87, 87,
- 3838, 3841, 3834, 87, 3831, 3842, 87, 3832, 87, 3839,
-
- 87, 3840, 87, 3843, 3833, 3846, 3844, 3845, 3835, 3836,
- 3920, 3848, 87, 3837, 87, 3847, 3854, 3838, 87, 3849,
- 3855, 87, 3842, 87, 3920, 87, 3839, 3850, 3840, 3851,
- 3843, 3852, 87, 3844, 3845, 3856, 3853, 87, 3857, 3864,
- 3920, 3858, 3847, 87, 87, 87, 3849, 87, 87, 87,
- 87, 87, 3859, 87, 3850, 3867, 3851, 87, 3852, 3860,
- 3861, 3862, 3856, 3853, 3863, 87, 3865, 87, 3858, 87,
- 3866, 87, 87, 3868, 87, 87, 3869, 3872, 3920, 3859,
- 87, 87, 3867, 3920, 87, 3876, 3860, 3861, 3862, 3870,
- 3873, 3863, 3871, 3865, 3874, 87, 3875, 3866, 87, 87,
-
- 3868, 3878, 87, 87, 3872, 3877, 3879, 87, 3880, 87,
- 87, 87, 3876, 3881, 3882, 87, 3870, 3873, 3883, 3871,
- 3884, 3874, 87, 3875, 3888, 3889, 3885, 87, 3878, 87,
- 3886, 3920, 3877, 3879, 3887, 3880, 3890, 3891, 3892, 87,
- 3881, 3882, 87, 3898, 87, 3883, 87, 3884, 87, 3893,
- 87, 87, 87, 3885, 3894, 3896, 3900, 3886, 87, 3895,
- 3897, 3887, 87, 3890, 3891, 87, 3901, 87, 87, 87,
- 87, 3899, 3902, 3905, 87, 3904, 3893, 87, 87, 87,
- 87, 3894, 3896, 3900, 3903, 3909, 3895, 3897, 87, 3906,
- 3920, 3908, 87, 3901, 3910, 3907, 3911, 87, 3899, 3902,
-
- 87, 87, 3904, 87, 3912, 3913, 3914, 3915, 3918, 3919,
- 3920, 3903, 87, 3920, 87, 3920, 3906, 87, 3908, 3916,
- 3920, 3910, 3907, 87, 3920, 87, 3920, 87, 87, 87,
- 3917, 87, 3913, 3914, 3915, 87, 87, 3920, 87, 3920,
- 3920, 3920, 3920, 3920, 3920, 3920, 3916, 3920, 3920, 3920,
- 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3917, 48, 48,
- 48, 48, 48, 48, 48, 53, 53, 53, 53, 53,
- 53, 53, 58, 58, 58, 58, 58, 58, 58, 64,
- 64, 64, 64, 64, 64, 64, 69, 69, 69, 69,
- 69, 69, 69, 75, 75, 75, 75, 75, 75, 75,
-
- 81, 81, 81, 81, 81, 81, 81, 90, 90, 3920,
- 90, 90, 90, 90, 163, 163, 3920, 3920, 3920, 163,
- 163, 165, 165, 3920, 3920, 165, 3920, 165, 167, 3920,
- 3920, 3920, 3920, 3920, 167, 170, 170, 3920, 3920, 3920,
- 170, 170, 172, 3920, 3920, 3920, 3920, 3920, 172, 174,
- 174, 3920, 174, 174, 174, 174, 177, 3920, 3920, 3920,
- 3920, 3920, 177, 180, 180, 3920, 3920, 3920, 180, 180,
- 91, 91, 3920, 91, 91, 91, 91, 17, 3920, 3920,
- 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920,
- 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920,
-
- 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920,
- 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920,
- 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920,
- 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920,
- 3920, 3920, 3920, 3920
+ 21, 70, 71, 72, 82, 83, 84, 124, 110, 182,
+ 182, 80, 73, 164, 175, 87, 99, 80, 73, 87,
+ 438, 91, 85, 91, 91, 87, 91, 1460, 111, 88,
+ 74, 87, 91, 89, 124, 110, 74, 165, 165, 73,
+ 164, 85, 172, 172, 167, 73, 114, 167, 112, 87,
+ 163, 183, 133, 178, 115, 111, 100, 87, 87, 92,
+
+ 93, 94, 113, 101, 95, 116, 175, 102, 181, 96,
+ 103, 97, 87, 114, 87, 112, 87, 163, 98, 133,
+ 178, 115, 87, 100, 87, 182, 182, 93, 94, 113,
+ 101, 95, 116, 187, 102, 185, 96, 103, 97, 169,
+ 184, 169, 169, 125, 169, 98, 104, 189, 87, 215,
+ 105, 126, 140, 106, 87, 107, 108, 127, 87, 141,
+ 187, 128, 185, 190, 87, 87, 109, 184, 87, 87,
+ 125, 186, 87, 104, 189, 180, 215, 105, 126, 140,
+ 106, 129, 107, 108, 127, 130, 141, 87, 128, 206,
+ 190, 87, 160, 109, 117, 175, 161, 118, 186, 131,
+
+ 162, 132, 87, 152, 119, 153, 120, 87, 129, 173,
+ 121, 171, 130, 193, 154, 170, 206, 87, 87, 160,
+ 155, 117, 87, 161, 118, 168, 131, 162, 132, 87,
+ 152, 119, 153, 120, 156, 166, 209, 121, 134, 236,
+ 193, 154, 135, 87, 157, 87, 136, 155, 158, 159,
+ 188, 174, 137, 174, 174, 138, 174, 87, 87, 87,
+ 194, 156, 139, 209, 87, 134, 236, 167, 183, 135,
+ 167, 157, 191, 136, 274, 158, 159, 188, 87, 137,
+ 87, 86, 138, 86, 86, 192, 86, 194, 202, 139,
+ 142, 217, 86, 87, 143, 91, 87, 91, 91, 191,
+
+ 91, 274, 203, 181, 144, 145, 179, 146, 179, 179,
+ 87, 179, 192, 87, 213, 202, 87, 142, 217, 180,
+ 292, 143, 1293, 87, 87, 86, 309, 86, 86, 203,
+ 86, 144, 145, 177, 146, 147, 86, 91, 148, 91,
+ 91, 213, 91, 195, 196, 149, 197, 292, 91, 150,
+ 151, 204, 198, 87, 199, 214, 87, 87, 87, 200,
+ 201, 175, 147, 173, 87, 148, 226, 87, 87, 205,
+ 195, 196, 149, 197, 87, 92, 150, 151, 218, 198,
+ 207, 199, 214, 87, 210, 211, 200, 201, 216, 208,
+ 223, 87, 212, 226, 171, 87, 205, 235, 505, 225,
+
+ 87, 219, 87, 170, 220, 218, 348, 207, 168, 229,
+ 227, 210, 211, 230, 224, 216, 208, 221, 222, 212,
+ 87, 87, 87, 239, 235, 87, 225, 87, 219, 231,
+ 228, 220, 87, 87, 232, 234, 229, 227, 87, 233,
+ 230, 224, 87, 87, 221, 222, 237, 240, 87, 241,
+ 239, 242, 243, 238, 245, 244, 231, 228, 87, 246,
+ 87, 232, 234, 87, 87, 87, 233, 252, 87, 251,
+ 166, 87, 4015, 237, 240, 87, 241, 87, 242, 243,
+ 238, 245, 244, 247, 250, 87, 246, 248, 257, 254,
+ 253, 87, 352, 249, 252, 87, 251, 87, 255, 259,
+
+ 87, 258, 87, 266, 256, 87, 354, 87, 260, 358,
+ 247, 250, 87, 263, 248, 257, 254, 253, 87, 261,
+ 249, 264, 267, 262, 87, 255, 259, 87, 258, 265,
+ 266, 256, 87, 272, 270, 260, 275, 4015, 87, 268,
+ 263, 87, 269, 273, 87, 271, 261, 87, 87, 267,
+ 262, 87, 279, 87, 87, 276, 265, 284, 281, 280,
+ 272, 270, 282, 275, 277, 283, 268, 87, 4015, 269,
+ 273, 87, 271, 87, 4015, 87, 278, 285, 4015, 279,
+ 87, 87, 276, 4015, 284, 281, 280, 87, 286, 282,
+ 87, 277, 283, 169, 4015, 169, 169, 174, 169, 174,
+
+ 174, 287, 174, 278, 285, 91, 288, 91, 91, 290,
+ 91, 179, 175, 179, 179, 286, 179, 291, 87, 295,
+ 289, 296, 297, 87, 300, 298, 293, 4015, 287, 87,
+ 87, 87, 299, 294, 301, 87, 290, 87, 87, 302,
+ 87, 4015, 306, 177, 291, 87, 295, 289, 296, 297,
+ 87, 300, 298, 293, 87, 318, 303, 87, 319, 299,
+ 294, 301, 304, 305, 87, 87, 302, 4015, 307, 306,
+ 308, 310, 320, 87, 323, 311, 322, 321, 324, 326,
+ 327, 87, 318, 325, 87, 319, 87, 1043, 87, 304,
+ 305, 329, 312, 822, 87, 307, 87, 308, 87, 87,
+
+ 87, 323, 311, 322, 87, 324, 326, 330, 328, 4015,
+ 325, 331, 87, 332, 87, 333, 87, 361, 329, 312,
+ 313, 87, 87, 336, 337, 314, 87, 87, 4015, 87,
+ 315, 338, 87, 344, 330, 328, 316, 317, 331, 345,
+ 332, 334, 333, 87, 335, 4015, 87, 313, 87, 87,
+ 336, 337, 314, 87, 346, 87, 87, 315, 338, 347,
+ 344, 87, 4015, 316, 317, 350, 345, 349, 334, 355,
+ 87, 335, 339, 353, 363, 340, 351, 341, 357, 4015,
+ 87, 346, 366, 356, 87, 359, 347, 4015, 362, 342,
+ 4015, 343, 4015, 87, 349, 367, 368, 87, 87, 339,
+
+ 353, 87, 340, 351, 341, 357, 87, 87, 364, 87,
+ 356, 87, 359, 365, 87, 362, 342, 87, 343, 369,
+ 370, 373, 367, 368, 87, 371, 87, 376, 375, 4015,
+ 374, 377, 378, 87, 372, 364, 381, 4015, 388, 87,
+ 365, 87, 87, 87, 379, 384, 369, 370, 373, 87,
+ 87, 87, 371, 87, 376, 375, 87, 374, 377, 378,
+ 382, 372, 380, 381, 386, 383, 385, 87, 391, 387,
+ 87, 379, 384, 87, 87, 87, 389, 390, 392, 393,
+ 394, 397, 396, 4015, 87, 87, 87, 87, 395, 380,
+ 87, 386, 87, 385, 398, 391, 387, 399, 401, 406,
+
+ 405, 87, 87, 389, 390, 402, 393, 394, 397, 396,
+ 87, 400, 403, 87, 404, 395, 408, 409, 4015, 87,
+ 87, 4015, 407, 413, 411, 87, 87, 87, 87, 87,
+ 87, 87, 402, 421, 410, 418, 412, 414, 400, 403,
+ 87, 404, 87, 87, 409, 87, 415, 416, 87, 407,
+ 413, 411, 175, 417, 87, 419, 420, 87, 422, 87,
+ 87, 410, 418, 412, 414, 87, 87, 423, 425, 424,
+ 428, 4015, 426, 415, 416, 427, 433, 429, 87, 87,
+ 417, 4015, 419, 420, 87, 430, 431, 434, 87, 87,
+ 87, 87, 435, 450, 423, 87, 424, 428, 87, 426,
+
+ 87, 432, 427, 87, 429, 87, 436, 439, 87, 437,
+ 442, 87, 430, 431, 434, 440, 87, 87, 441, 435,
+ 446, 87, 445, 452, 443, 87, 451, 454, 432, 453,
+ 447, 4015, 87, 436, 439, 87, 437, 442, 444, 87,
+ 448, 87, 440, 87, 87, 441, 87, 446, 87, 445,
+ 87, 443, 449, 451, 87, 87, 453, 447, 87, 87,
+ 87, 455, 459, 457, 458, 444, 462, 448, 460, 464,
+ 4015, 463, 4015, 87, 4015, 87, 466, 467, 456, 449,
+ 87, 465, 4015, 4015, 87, 472, 87, 469, 455, 87,
+ 457, 458, 461, 462, 87, 87, 464, 468, 463, 470,
+
+ 87, 87, 87, 466, 467, 456, 87, 87, 465, 471,
+ 87, 87, 472, 473, 469, 474, 476, 478, 87, 461,
+ 477, 4015, 87, 480, 468, 488, 470, 479, 489, 503,
+ 499, 490, 475, 4015, 504, 87, 471, 87, 87, 87,
+ 473, 4015, 474, 87, 87, 498, 523, 477, 87, 87,
+ 480, 87, 488, 87, 479, 489, 4015, 499, 490, 475,
+ 481, 87, 500, 501, 502, 482, 507, 4015, 483, 87,
+ 506, 4015, 498, 484, 485, 486, 487, 87, 87, 4015,
+ 4015, 4015, 4015, 87, 510, 516, 511, 481, 87, 500,
+ 501, 502, 482, 87, 87, 483, 87, 506, 87, 517,
+
+ 484, 485, 486, 487, 491, 514, 492, 508, 493, 515,
+ 509, 510, 87, 511, 512, 513, 4015, 87, 494, 495,
+ 496, 87, 497, 87, 87, 518, 517, 87, 87, 519,
+ 4015, 491, 514, 492, 508, 493, 515, 509, 520, 522,
+ 87, 512, 513, 524, 528, 494, 495, 496, 521, 497,
+ 526, 87, 518, 4015, 525, 87, 519, 87, 87, 527,
+ 87, 87, 87, 4015, 4015, 520, 522, 529, 534, 530,
+ 524, 87, 533, 4015, 535, 521, 87, 526, 531, 87,
+ 536, 525, 537, 4015, 4015, 532, 527, 539, 538, 540,
+ 87, 542, 550, 87, 529, 534, 530, 541, 549, 533,
+
+ 547, 4015, 87, 4015, 87, 531, 87, 536, 548, 537,
+ 87, 87, 532, 543, 539, 538, 540, 551, 87, 87,
+ 567, 564, 4015, 87, 541, 565, 544, 547, 87, 545,
+ 87, 546, 87, 568, 87, 548, 588, 87, 569, 87,
+ 543, 572, 175, 566, 551, 87, 582, 567, 564, 87,
+ 570, 87, 565, 544, 87, 585, 545, 581, 546, 552,
+ 568, 553, 4015, 588, 87, 569, 571, 554, 572, 87,
+ 566, 555, 589, 582, 87, 596, 556, 570, 583, 557,
+ 87, 593, 87, 584, 581, 87, 552, 87, 553, 590,
+ 586, 663, 592, 571, 554, 4015, 591, 587, 555, 589,
+
+ 87, 87, 596, 556, 595, 87, 557, 558, 600, 559,
+ 87, 87, 594, 87, 87, 597, 590, 586, 87, 592,
+ 604, 87, 560, 591, 587, 561, 601, 562, 87, 563,
+ 87, 595, 87, 87, 558, 600, 559, 602, 603, 594,
+ 608, 598, 597, 4015, 87, 87, 4015, 604, 607, 560,
+ 599, 611, 561, 601, 562, 4015, 563, 573, 574, 605,
+ 87, 606, 4015, 609, 602, 603, 87, 575, 576, 577,
+ 578, 579, 87, 87, 580, 607, 614, 599, 611, 613,
+ 610, 87, 87, 87, 573, 574, 605, 87, 606, 87,
+ 609, 612, 87, 617, 575, 576, 577, 578, 579, 616,
+
+ 87, 580, 615, 4015, 87, 626, 613, 610, 87, 620,
+ 87, 618, 619, 4015, 621, 87, 87, 622, 612, 623,
+ 617, 87, 624, 625, 4015, 638, 616, 87, 87, 615,
+ 87, 4015, 626, 627, 628, 87, 620, 633, 87, 630,
+ 87, 621, 631, 635, 622, 634, 623, 649, 87, 624,
+ 625, 629, 638, 87, 651, 87, 636, 632, 87, 637,
+ 627, 628, 87, 87, 633, 87, 630, 87, 87, 631,
+ 635, 650, 634, 639, 640, 653, 87, 654, 629, 87,
+ 652, 651, 4015, 636, 632, 641, 637, 642, 4015, 87,
+ 655, 4015, 87, 87, 658, 656, 87, 4015, 650, 661,
+
+ 639, 640, 653, 87, 4015, 662, 657, 652, 659, 87,
+ 4015, 668, 641, 660, 642, 643, 87, 655, 87, 87,
+ 87, 658, 656, 644, 645, 87, 661, 646, 647, 87,
+ 87, 648, 662, 657, 665, 659, 664, 87, 666, 670,
+ 660, 667, 643, 87, 87, 671, 4015, 669, 673, 674,
+ 644, 645, 87, 672, 646, 647, 87, 87, 648, 87,
+ 693, 665, 87, 664, 677, 666, 670, 87, 667, 87,
+ 87, 87, 671, 675, 669, 673, 674, 678, 679, 87,
+ 672, 676, 680, 681, 87, 4015, 682, 87, 683, 684,
+ 685, 677, 87, 688, 87, 686, 4015, 87, 4015, 87,
+
+ 675, 87, 689, 4015, 678, 679, 687, 87, 676, 680,
+ 681, 87, 87, 682, 691, 683, 684, 685, 87, 87,
+ 688, 87, 686, 692, 87, 690, 4015, 694, 87, 689,
+ 695, 87, 696, 687, 702, 701, 87, 697, 698, 699,
+ 87, 691, 87, 87, 707, 87, 700, 709, 706, 87,
+ 692, 87, 690, 87, 694, 87, 87, 695, 703, 696,
+ 704, 702, 701, 705, 697, 698, 699, 87, 87, 708,
+ 713, 712, 87, 700, 795, 706, 87, 710, 714, 87,
+ 711, 715, 87, 87, 722, 703, 718, 704, 87, 87,
+ 705, 720, 716, 719, 87, 717, 708, 721, 712, 724,
+
+ 87, 795, 87, 87, 710, 714, 87, 711, 715, 728,
+ 87, 87, 725, 718, 723, 87, 87, 4015, 720, 716,
+ 719, 87, 717, 87, 721, 727, 724, 729, 730, 732,
+ 731, 87, 87, 734, 87, 726, 728, 733, 87, 87,
+ 736, 723, 737, 735, 87, 87, 749, 738, 4015, 750,
+ 87, 87, 727, 87, 729, 730, 732, 731, 87, 87,
+ 734, 87, 726, 4015, 733, 87, 4015, 736, 4015, 737,
+ 735, 747, 87, 749, 738, 739, 750, 748, 87, 751,
+ 740, 752, 741, 87, 753, 4015, 4015, 87, 742, 754,
+ 743, 4015, 755, 744, 745, 87, 756, 4015, 747, 4015,
+
+ 746, 87, 739, 87, 748, 4015, 751, 740, 752, 741,
+ 757, 753, 87, 758, 87, 742, 754, 743, 765, 755,
+ 744, 745, 87, 756, 762, 760, 767, 746, 761, 763,
+ 87, 769, 766, 759, 4015, 87, 87, 757, 87, 764,
+ 758, 770, 87, 87, 768, 765, 772, 771, 87, 87,
+ 87, 762, 760, 767, 776, 761, 777, 773, 769, 766,
+ 759, 87, 774, 775, 87, 778, 764, 87, 770, 87,
+ 87, 768, 87, 772, 771, 87, 779, 87, 780, 781,
+ 87, 776, 782, 777, 773, 784, 783, 87, 4015, 774,
+ 775, 786, 778, 785, 87, 788, 87, 792, 87, 787,
+
+ 87, 789, 793, 779, 4015, 780, 781, 87, 802, 782,
+ 87, 87, 784, 783, 87, 791, 87, 790, 786, 794,
+ 785, 4015, 175, 87, 792, 796, 787, 87, 789, 87,
+ 798, 87, 799, 797, 87, 87, 801, 800, 803, 804,
+ 87, 805, 791, 806, 790, 807, 794, 87, 87, 808,
+ 820, 811, 796, 87, 809, 87, 87, 798, 87, 799,
+ 797, 810, 87, 87, 800, 803, 87, 812, 816, 87,
+ 806, 87, 807, 87, 87, 813, 808, 87, 811, 87,
+ 821, 809, 814, 87, 817, 815, 819, 823, 810, 818,
+ 824, 87, 826, 87, 812, 816, 825, 4015, 827, 829,
+
+ 87, 832, 813, 828, 830, 831, 4015, 87, 87, 814,
+ 87, 833, 815, 819, 834, 835, 87, 87, 841, 87,
+ 87, 836, 87, 87, 87, 87, 829, 837, 832, 839,
+ 87, 830, 831, 87, 87, 838, 840, 87, 833, 87,
+ 842, 834, 835, 843, 844, 87, 845, 87, 836, 87,
+ 87, 846, 849, 87, 837, 847, 839, 848, 87, 87,
+ 4015, 850, 838, 840, 87, 852, 87, 842, 87, 87,
+ 843, 844, 851, 845, 854, 855, 87, 856, 846, 849,
+ 87, 87, 847, 87, 848, 861, 853, 863, 850, 862,
+ 87, 4015, 852, 87, 87, 865, 87, 87, 866, 851,
+
+ 857, 870, 855, 4015, 856, 858, 87, 864, 859, 860,
+ 867, 871, 861, 853, 863, 87, 862, 87, 87, 868,
+ 87, 869, 865, 87, 87, 866, 872, 857, 4015, 87,
+ 876, 87, 858, 87, 864, 859, 860, 867, 871, 873,
+ 877, 875, 880, 878, 879, 87, 868, 4015, 869, 87,
+ 87, 87, 87, 872, 881, 87, 883, 876, 882, 885,
+ 889, 874, 87, 4015, 87, 87, 873, 877, 875, 880,
+ 878, 879, 87, 884, 87, 886, 887, 888, 87, 891,
+ 87, 881, 87, 883, 87, 882, 87, 889, 874, 87,
+ 890, 893, 87, 87, 892, 894, 87, 895, 896, 897,
+
+ 884, 900, 886, 887, 888, 87, 891, 898, 899, 87,
+ 87, 901, 87, 908, 904, 902, 910, 890, 893, 87,
+ 911, 892, 894, 87, 903, 896, 897, 87, 900, 87,
+ 905, 906, 907, 87, 909, 87, 87, 87, 901, 926,
+ 87, 904, 902, 87, 87, 87, 913, 911, 87, 914,
+ 912, 903, 87, 87, 918, 917, 87, 905, 906, 907,
+ 87, 909, 915, 929, 920, 919, 87, 916, 87, 87,
+ 4015, 87, 927, 913, 931, 928, 914, 912, 87, 930,
+ 87, 918, 917, 87, 936, 87, 87, 932, 933, 4015,
+ 929, 920, 919, 87, 87, 921, 4015, 922, 937, 927,
+
+ 87, 931, 928, 934, 923, 4015, 930, 87, 87, 942,
+ 938, 924, 925, 87, 932, 933, 87, 1013, 935, 87,
+ 939, 940, 921, 944, 922, 937, 941, 87, 947, 946,
+ 934, 923, 87, 945, 87, 87, 942, 938, 924, 925,
+ 943, 87, 87, 948, 87, 935, 954, 939, 87, 949,
+ 944, 951, 87, 87, 87, 947, 946, 950, 87, 87,
+ 945, 952, 953, 955, 959, 956, 87, 943, 87, 87,
+ 948, 957, 87, 954, 963, 962, 949, 87, 951, 4015,
+ 958, 87, 4015, 87, 950, 1003, 960, 87, 952, 87,
+ 955, 959, 956, 964, 87, 961, 965, 966, 957, 968,
+
+ 87, 4015, 962, 967, 970, 87, 87, 958, 969, 87,
+ 87, 87, 87, 960, 972, 4015, 87, 87, 4015, 971,
+ 964, 978, 961, 965, 966, 87, 968, 87, 87, 973,
+ 967, 970, 976, 974, 975, 969, 977, 979, 87, 980,
+ 87, 972, 87, 87, 87, 981, 971, 983, 978, 982,
+ 87, 984, 4015, 986, 4015, 87, 973, 985, 987, 976,
+ 974, 975, 87, 977, 979, 87, 980, 87, 87, 87,
+ 87, 988, 981, 989, 983, 87, 982, 990, 984, 87,
+ 986, 991, 992, 993, 985, 987, 87, 87, 998, 994,
+ 995, 4015, 996, 997, 999, 4015, 1000, 87, 988, 1021,
+
+ 989, 87, 87, 87, 990, 1004, 87, 87, 991, 992,
+ 993, 87, 87, 87, 87, 998, 994, 995, 1001, 996,
+ 997, 999, 1002, 1000, 1005, 4015, 1007, 175, 1008, 1006,
+ 1009, 87, 1004, 4015, 1010, 1020, 87, 87, 1012, 87,
+ 4015, 1011, 87, 87, 87, 1001, 87, 1024, 87, 1002,
+ 1018, 1005, 87, 1007, 87, 1008, 1006, 1009, 87, 1014,
+ 1019, 1010, 1020, 1022, 1016, 1012, 1023, 1015, 1011, 1017,
+ 87, 87, 87, 87, 1024, 1027, 1025, 1018, 87, 1026,
+ 1028, 87, 1029, 1032, 87, 87, 1014, 1019, 1030, 1031,
+ 1022, 87, 87, 1023, 1015, 1033, 87, 87, 1034, 4015,
+
+ 1046, 1042, 1027, 1025, 4015, 87, 1026, 87, 1044, 87,
+ 1032, 4015, 87, 87, 87, 1030, 1031, 4015, 87, 4015,
+ 1045, 87, 1033, 1049, 4015, 1034, 1035, 1046, 1042, 1036,
+ 4015, 1048, 1047, 1037, 1050, 1044, 1038, 87, 87, 1051,
+ 4015, 87, 1052, 1039, 1040, 87, 1041, 1045, 1053, 1054,
+ 1049, 87, 87, 1035, 1056, 1055, 1036, 1058, 1048, 1047,
+ 1037, 1050, 87, 1038, 87, 87, 1051, 87, 87, 1052,
+ 1039, 1040, 1057, 1041, 87, 1053, 1054, 1067, 1070, 87,
+ 1068, 1056, 1055, 4015, 87, 1069, 1071, 87, 1075, 87,
+ 4015, 87, 1072, 4015, 4015, 87, 4015, 4015, 1073, 1057,
+
+ 1059, 1060, 87, 1061, 1067, 1070, 1062, 1068, 1076, 87,
+ 87, 1063, 1069, 1071, 1074, 1075, 87, 1064, 1065, 1072,
+ 1066, 87, 1078, 1083, 1077, 1073, 87, 1059, 1060, 1079,
+ 1061, 87, 1081, 1062, 87, 1076, 1080, 1082, 1063, 1084,
+ 1085, 1074, 1087, 87, 1064, 1065, 87, 1066, 1086, 1078,
+ 1083, 1077, 87, 1089, 1088, 1091, 1079, 1090, 1092, 1093,
+ 87, 4015, 4015, 1080, 87, 87, 1084, 1085, 87, 1087,
+ 87, 1095, 4015, 1099, 87, 1086, 87, 87, 1100, 87,
+ 1089, 1088, 87, 87, 1090, 1092, 1093, 1094, 1096, 1097,
+ 1101, 1098, 87, 1103, 87, 87, 87, 87, 1095, 87,
+
+ 1099, 1102, 87, 1104, 87, 1100, 87, 1106, 87, 1108,
+ 1105, 1109, 1110, 1113, 1094, 1096, 1097, 1101, 1098, 87,
+ 1103, 1107, 87, 1114, 1115, 1119, 87, 1111, 1102, 87,
+ 1104, 1123, 1112, 87, 1106, 87, 1116, 1105, 1109, 87,
+ 1113, 87, 1117, 1120, 1121, 87, 1118, 1122, 1107, 87,
+ 87, 1115, 87, 87, 1125, 87, 1124, 87, 1123, 87,
+ 1126, 1128, 1130, 1116, 4015, 87, 1132, 1131, 1127, 1117,
+ 1120, 87, 1136, 1118, 1122, 87, 87, 87, 1140, 1139,
+ 87, 87, 1129, 1124, 87, 1134, 87, 87, 1128, 1130,
+ 87, 87, 1133, 1132, 1131, 1127, 87, 1135, 1137, 87,
+
+ 1142, 87, 1138, 4015, 1141, 87, 87, 1184, 87, 1129,
+ 87, 1144, 1134, 87, 1143, 1146, 87, 1145, 87, 1133,
+ 87, 87, 1147, 1148, 1135, 1137, 87, 1142, 1149, 1138,
+ 1150, 1141, 87, 87, 87, 1151, 1152, 1153, 1144, 87,
+ 87, 1143, 1146, 1154, 1145, 1155, 4015, 87, 1156, 1147,
+ 1148, 1157, 87, 87, 1160, 1149, 87, 1150, 1161, 87,
+ 87, 1163, 1151, 1152, 1153, 87, 87, 87, 1158, 87,
+ 1154, 1162, 1155, 1159, 1164, 1156, 1165, 1166, 1157, 87,
+ 1169, 1160, 1167, 87, 87, 1161, 87, 1170, 1163, 1171,
+ 1168, 1172, 87, 1173, 4015, 87, 4015, 1174, 1162, 87,
+
+ 87, 1164, 4015, 1165, 1166, 87, 87, 1169, 1175, 1167,
+ 1181, 1179, 4015, 87, 87, 87, 1171, 1168, 1172, 87,
+ 1173, 1176, 1177, 1178, 1174, 1182, 1185, 87, 87, 87,
+ 87, 1183, 1180, 87, 87, 1175, 87, 1181, 1179, 87,
+ 1186, 1190, 1191, 1187, 87, 1194, 4015, 1189, 1176, 1177,
+ 1178, 1193, 1182, 1185, 87, 87, 1188, 1195, 1183, 1180,
+ 87, 87, 87, 1192, 87, 87, 1199, 1186, 1190, 1191,
+ 1187, 1197, 87, 87, 1189, 1196, 87, 1205, 1193, 1198,
+ 1200, 1203, 87, 1188, 1195, 87, 87, 87, 87, 87,
+ 1192, 1201, 1202, 1199, 1204, 1206, 87, 1207, 1197, 1208,
+
+ 87, 87, 1196, 1209, 1211, 1210, 1198, 1200, 1203, 87,
+ 87, 1212, 87, 1220, 1213, 1214, 87, 1217, 1201, 1202,
+ 1215, 1204, 1219, 87, 1207, 1221, 1222, 87, 1216, 1223,
+ 1209, 87, 1210, 1225, 1218, 87, 87, 87, 87, 87,
+ 87, 1213, 1214, 87, 1217, 87, 1224, 1215, 87, 1219,
+ 87, 1226, 1227, 1222, 1228, 1216, 1223, 87, 87, 4015,
+ 87, 1218, 1229, 87, 1230, 87, 1234, 1237, 1236, 1231,
+ 1239, 1235, 4015, 1224, 1238, 87, 87, 4015, 1226, 87,
+ 87, 1228, 1232, 1242, 1233, 1240, 87, 1241, 4015, 1229,
+ 87, 1230, 87, 87, 1237, 1236, 1231, 1239, 175, 87,
+
+ 87, 1238, 1246, 1244, 1245, 87, 87, 1243, 1248, 1232,
+ 1242, 1233, 1240, 1247, 1241, 87, 1249, 87, 1250, 4015,
+ 1257, 1290, 87, 87, 87, 4015, 87, 4015, 1259, 1246,
+ 1244, 1245, 4015, 1261, 1243, 1248, 1258, 4015, 1260, 1262,
+ 1247, 87, 87, 1249, 4015, 1250, 1251, 1257, 1252, 1265,
+ 87, 87, 1253, 87, 1254, 1259, 87, 1263, 1264, 1255,
+ 87, 1267, 87, 1258, 1256, 1260, 1262, 1268, 4015, 1269,
+ 87, 1266, 1270, 1251, 87, 1252, 1265, 1271, 4015, 1253,
+ 87, 1254, 87, 87, 1263, 1264, 1255, 1272, 1267, 87,
+ 1273, 1256, 1283, 1280, 1268, 1274, 1269, 1276, 1266, 1281,
+
+ 1282, 4015, 1277, 87, 87, 87, 1278, 1275, 87, 87,
+ 1285, 4015, 1286, 87, 1272, 1288, 1279, 1273, 87, 87,
+ 1280, 87, 1274, 87, 1276, 1284, 1281, 1282, 87, 1277,
+ 87, 87, 1287, 1278, 1275, 1289, 87, 1285, 1291, 1286,
+ 1292, 1294, 1288, 1279, 1295, 1296, 4015, 1297, 4015, 87,
+ 1305, 1307, 1284, 87, 87, 4015, 87, 87, 4015, 1287,
+ 1309, 4015, 1289, 1306, 87, 87, 4015, 87, 1308, 1310,
+ 87, 1295, 1296, 87, 1297, 1298, 1312, 1305, 1307, 1311,
+ 1299, 1313, 1300, 87, 1314, 87, 87, 1309, 1301, 87,
+ 1306, 87, 87, 1302, 1303, 1308, 1310, 87, 87, 1317,
+
+ 1304, 87, 1298, 1312, 1315, 1316, 1311, 1299, 1313, 1300,
+ 87, 1314, 87, 87, 1318, 1301, 1319, 1322, 1320, 4015,
+ 1302, 1303, 1328, 1325, 1326, 1321, 1317, 1304, 87, 1327,
+ 1323, 1315, 1316, 87, 87, 1329, 87, 4015, 87, 87,
+ 1324, 1331, 1333, 1319, 1322, 1320, 87, 87, 1334, 87,
+ 87, 1326, 1321, 1330, 87, 1332, 1327, 1323, 1335, 87,
+ 1336, 87, 1329, 87, 1339, 1337, 87, 1324, 1331, 87,
+ 87, 1340, 1341, 1338, 87, 1334, 1346, 87, 87, 1343,
+ 1330, 1342, 1332, 87, 87, 1335, 1344, 1336, 1347, 87,
+ 87, 1345, 1337, 87, 1348, 87, 87, 1353, 1340, 1341,
+
+ 1338, 87, 87, 1346, 87, 1349, 1343, 1350, 1342, 87,
+ 1351, 1355, 1352, 1344, 1357, 1347, 1354, 1360, 1345, 1356,
+ 1359, 1348, 87, 87, 87, 87, 87, 87, 1358, 87,
+ 87, 87, 1349, 1371, 1350, 1362, 1361, 1351, 1355, 1352,
+ 87, 1357, 87, 1354, 87, 1363, 1356, 1359, 87, 87,
+ 1369, 1365, 1364, 1366, 87, 1358, 1372, 1370, 1373, 1367,
+ 1368, 1377, 1362, 1361, 87, 87, 1378, 4015, 87, 1415,
+ 4015, 1438, 1363, 87, 4015, 87, 87, 1369, 1365, 1364,
+ 1366, 87, 87, 87, 1370, 1373, 1367, 1368, 87, 1374,
+ 1375, 1376, 1383, 87, 1379, 1381, 87, 1380, 87, 1382,
+
+ 1391, 87, 87, 1384, 87, 87, 1385, 87, 1386, 87,
+ 87, 1387, 1388, 4015, 1390, 87, 1374, 1375, 1376, 1383,
+ 87, 1379, 1381, 87, 1380, 87, 1382, 1391, 87, 1389,
+ 1384, 1392, 1393, 1385, 87, 1386, 1394, 1400, 1387, 1388,
+ 87, 1390, 1395, 1396, 87, 87, 4015, 1399, 4015, 87,
+ 1397, 1398, 1401, 1406, 4015, 1402, 1389, 1409, 1392, 1393,
+ 87, 87, 87, 87, 1400, 1403, 1404, 1407, 87, 1395,
+ 1405, 87, 87, 87, 1399, 87, 87, 1397, 1398, 1401,
+ 1406, 87, 1402, 1408, 1409, 1410, 1412, 87, 87, 87,
+ 1411, 1416, 1403, 1404, 1407, 1414, 1413, 1405, 1418, 1417,
+
+ 1425, 87, 87, 1419, 1423, 87, 87, 87, 87, 87,
+ 1408, 1420, 1410, 1412, 1422, 1426, 1421, 1411, 1416, 1424,
+ 87, 87, 87, 1413, 87, 1418, 1417, 87, 87, 87,
+ 1419, 1423, 87, 87, 1427, 1428, 1429, 1430, 1420, 1432,
+ 4015, 1422, 1436, 1421, 4015, 1431, 1424, 87, 1433, 1435,
+ 1434, 1437, 4015, 4015, 4015, 4015, 87, 87, 87, 87,
+ 4015, 1439, 1428, 1429, 1440, 1441, 87, 87, 1446, 87,
+ 87, 87, 1431, 87, 87, 1433, 1435, 1434, 1437, 87,
+ 1442, 1444, 87, 1451, 87, 1443, 1445, 87, 1439, 87,
+ 1448, 1440, 1441, 87, 1447, 1446, 1449, 1452, 1450, 87,
+
+ 1454, 1455, 4015, 4015, 4015, 87, 87, 1442, 1444, 4015,
+ 87, 87, 1443, 1445, 1453, 87, 87, 1448, 1457, 1458,
+ 1462, 1447, 87, 1449, 1456, 1450, 87, 1454, 87, 87,
+ 1459, 87, 87, 1461, 87, 1463, 1465, 1466, 87, 87,
+ 1467, 1453, 87, 87, 87, 1457, 1458, 1462, 1464, 1468,
+ 87, 1456, 1469, 1472, 1471, 87, 1470, 1459, 1473, 1476,
+ 1461, 175, 1463, 1465, 1466, 1475, 87, 87, 87, 1474,
+ 87, 1478, 1480, 1481, 87, 1464, 1468, 87, 87, 1469,
+ 1472, 1471, 1477, 1470, 87, 1473, 1476, 87, 1479, 1482,
+ 1483, 1485, 1475, 1488, 87, 87, 1474, 1486, 87, 1484,
+
+ 4015, 1487, 87, 1492, 87, 87, 87, 1490, 87, 1477,
+ 87, 87, 1489, 87, 1493, 1479, 1482, 1483, 1485, 1491,
+ 1488, 1495, 87, 87, 1486, 87, 1484, 1494, 1487, 87,
+ 1492, 87, 1496, 87, 1490, 1497, 1498, 1499, 87, 1489,
+ 87, 1493, 1501, 1500, 1502, 1503, 1491, 87, 1495, 87,
+ 1504, 87, 4015, 1511, 1494, 1509, 87, 87, 1510, 1496,
+ 87, 87, 87, 1498, 1499, 1505, 87, 1512, 1513, 1501,
+ 1500, 1502, 1503, 1515, 1506, 87, 1507, 1504, 87, 1508,
+ 1511, 1516, 1509, 1514, 87, 1510, 87, 87, 87, 1519,
+ 1517, 1520, 1505, 1518, 87, 1513, 1521, 87, 87, 1522,
+
+ 1515, 1506, 87, 1507, 87, 87, 1508, 87, 1516, 1523,
+ 1514, 1524, 1525, 87, 87, 1526, 1519, 1517, 1520, 1527,
+ 1518, 1528, 1529, 1521, 1533, 87, 1522, 87, 1530, 1531,
+ 1532, 87, 1537, 87, 4015, 1534, 87, 1544, 1524, 1525,
+ 87, 87, 1526, 87, 87, 1541, 1527, 87, 87, 1529,
+ 87, 1533, 87, 87, 1535, 1530, 1531, 1532, 1536, 1537,
+ 1538, 1540, 1534, 1542, 1544, 87, 87, 1543, 1545, 1539,
+ 87, 1546, 1541, 87, 1547, 87, 1550, 87, 87, 4015,
+ 4015, 1535, 4015, 4015, 87, 1536, 87, 1538, 1540, 1548,
+ 1542, 1553, 87, 1560, 1543, 1545, 1539, 1551, 1546, 1552,
+
+ 1549, 1547, 1554, 1555, 87, 87, 87, 1556, 87, 87,
+ 1561, 87, 1557, 1558, 87, 87, 1548, 87, 1553, 1559,
+ 87, 1562, 87, 1563, 1551, 87, 1552, 1549, 1564, 1554,
+ 1555, 87, 1565, 1567, 1556, 87, 1566, 1561, 1574, 1557,
+ 1558, 87, 1568, 87, 87, 1573, 1559, 1569, 1572, 1570,
+ 1563, 87, 87, 87, 1571, 1564, 87, 1575, 87, 1565,
+ 1567, 1583, 87, 1566, 87, 1574, 1586, 1589, 1584, 1568,
+ 1591, 4015, 1573, 1585, 1569, 1572, 4015, 4015, 1587, 1588,
+ 4015, 87, 87, 87, 1575, 1576, 87, 4015, 1583, 1577,
+ 87, 87, 1578, 1579, 1589, 1584, 1590, 1580, 87, 1592,
+
+ 1585, 87, 87, 1581, 87, 1587, 1588, 1582, 1598, 1593,
+ 1599, 87, 1576, 1594, 87, 1603, 1577, 1596, 1604, 1578,
+ 1579, 87, 1595, 1590, 1580, 1597, 1592, 1605, 87, 1611,
+ 1581, 87, 87, 1601, 1582, 1598, 1593, 1599, 1600, 87,
+ 1594, 1602, 87, 87, 1596, 87, 1606, 87, 1607, 1595,
+ 87, 87, 1597, 1609, 1605, 87, 87, 1608, 1610, 1613,
+ 1601, 87, 1612, 1615, 87, 1600, 87, 87, 1602, 1623,
+ 1614, 1622, 4015, 1606, 1616, 1607, 4015, 1624, 1633, 87,
+ 1609, 1634, 87, 87, 1608, 1610, 87, 1628, 87, 1612,
+ 1615, 87, 87, 87, 1625, 1626, 1623, 1614, 1622, 1627,
+
+ 1629, 1616, 1617, 87, 1624, 87, 4015, 1618, 87, 1619,
+ 87, 1620, 87, 1621, 1628, 87, 1631, 1630, 1637, 1632,
+ 87, 1639, 1638, 87, 87, 87, 1627, 1629, 1635, 1617,
+ 1642, 4015, 87, 1636, 1618, 87, 1619, 87, 1620, 87,
+ 1621, 1640, 1641, 1631, 1630, 1637, 1632, 87, 1639, 1638,
+ 1643, 1650, 87, 1644, 1645, 1648, 1646, 1642, 1649, 87,
+ 87, 1647, 87, 87, 87, 4015, 87, 1651, 1640, 1641,
+ 1653, 87, 1655, 1656, 87, 4015, 1652, 1643, 1650, 1659,
+ 1644, 1645, 1654, 1646, 87, 1649, 87, 87, 1647, 87,
+ 87, 1660, 87, 87, 1651, 87, 1657, 1653, 1661, 1655,
+
+ 1656, 87, 1658, 1652, 87, 87, 1659, 1662, 1663, 1654,
+ 87, 1664, 4015, 1665, 1667, 1668, 1669, 1666, 87, 1670,
+ 1671, 1677, 87, 1657, 1672, 1661, 87, 1673, 1682, 1658,
+ 87, 4015, 4015, 87, 87, 1663, 87, 87, 1664, 87,
+ 1665, 1667, 1668, 87, 1666, 1680, 1670, 87, 87, 87,
+ 87, 1672, 1674, 1675, 1673, 1676, 1678, 1679, 87, 87,
+ 87, 87, 1688, 87, 1681, 1683, 1686, 87, 1684, 87,
+ 1687, 87, 1680, 1685, 87, 87, 1689, 1690, 4015, 1674,
+ 1675, 1695, 1676, 1678, 1679, 1692, 87, 87, 1691, 1688,
+ 87, 1681, 1683, 1686, 87, 1684, 1694, 1687, 87, 87,
+
+ 1685, 87, 1693, 1689, 1690, 87, 1696, 87, 1695, 1697,
+ 1698, 1699, 1692, 1700, 4015, 1691, 1702, 1703, 87, 1701,
+ 87, 87, 1704, 1694, 1707, 1705, 1706, 4015, 87, 1693,
+ 87, 1711, 87, 1696, 87, 87, 1697, 1698, 1699, 87,
+ 1700, 1708, 1709, 1702, 1710, 1714, 1701, 87, 87, 87,
+ 87, 1720, 1705, 1706, 87, 1712, 87, 1713, 87, 87,
+ 87, 1715, 87, 1716, 87, 1717, 1718, 87, 1708, 1709,
+ 87, 1710, 1714, 87, 1719, 1721, 1722, 175, 87, 1723,
+ 87, 1724, 1712, 87, 1713, 1725, 4015, 1730, 1715, 1729,
+ 1716, 1726, 1717, 1718, 4015, 87, 1727, 87, 87, 1732,
+
+ 4015, 1719, 1728, 1722, 1733, 4015, 1723, 87, 1731, 87,
+ 1735, 87, 1725, 87, 87, 87, 1729, 87, 1726, 87,
+ 1736, 1734, 1737, 1727, 87, 1738, 1732, 87, 1739, 1728,
+ 87, 1733, 1740, 1741, 87, 1731, 87, 1735, 1742, 1743,
+ 1745, 87, 87, 1744, 1746, 1749, 1750, 1736, 1734, 1737,
+ 87, 87, 1738, 87, 87, 1739, 1751, 1747, 87, 1740,
+ 87, 87, 1748, 1752, 87, 1742, 1743, 1745, 1753, 1758,
+ 1744, 1746, 1749, 1750, 1754, 87, 87, 1755, 1756, 1760,
+ 87, 1757, 1759, 1751, 1761, 4015, 87, 87, 1762, 87,
+ 1752, 1763, 87, 1765, 1764, 1753, 1758, 1770, 1766, 87,
+
+ 87, 1754, 4015, 1767, 1755, 1756, 1760, 87, 1757, 1759,
+ 87, 87, 1768, 87, 87, 1762, 87, 1769, 1763, 87,
+ 1771, 1764, 1773, 1772, 1770, 87, 87, 1774, 1776, 1775,
+ 1767, 87, 1778, 1777, 87, 87, 1780, 1784, 1781, 1768,
+ 4015, 87, 87, 1779, 1769, 87, 87, 1771, 1782, 1773,
+ 1772, 87, 87, 1785, 1774, 1776, 1775, 87, 1783, 1778,
+ 1777, 87, 87, 1780, 1787, 1781, 87, 1786, 87, 87,
+ 1779, 1788, 87, 1791, 1789, 1782, 1790, 1792, 87, 1796,
+ 1785, 87, 1793, 1794, 87, 1783, 87, 1795, 87, 1797,
+ 1799, 1787, 87, 1800, 1786, 1804, 87, 1805, 1788, 87,
+
+ 1791, 1789, 87, 1790, 1792, 87, 1796, 1798, 87, 1793,
+ 1794, 87, 1801, 87, 1795, 1802, 1797, 1799, 1803, 87,
+ 1800, 87, 1804, 1806, 87, 87, 1808, 1807, 4015, 87,
+ 1809, 1812, 1811, 87, 1798, 1810, 1814, 87, 1813, 1801,
+ 87, 1815, 1802, 87, 1816, 1803, 4015, 4015, 1817, 4015,
+ 4015, 1818, 87, 1808, 1807, 87, 87, 87, 1812, 1811,
+ 87, 1821, 1810, 1822, 1823, 1813, 1825, 1828, 87, 1832,
+ 1819, 1824, 1820, 87, 87, 1817, 87, 87, 1818, 1826,
+ 87, 87, 87, 1827, 4015, 1829, 87, 87, 87, 1830,
+ 1822, 1823, 87, 1825, 1828, 87, 87, 1819, 1824, 1820,
+
+ 1831, 87, 1833, 1836, 1834, 1835, 1826, 1840, 1837, 1838,
+ 1827, 87, 1829, 87, 1839, 1841, 1830, 87, 1842, 87,
+ 1843, 1845, 87, 1851, 87, 1844, 4015, 1831, 87, 1833,
+ 87, 1834, 1835, 87, 1840, 87, 1846, 1853, 1847, 87,
+ 1852, 87, 1841, 1848, 87, 1842, 87, 1843, 1845, 1849,
+ 1850, 87, 1844, 1855, 1858, 87, 87, 1854, 87, 87,
+ 87, 1856, 87, 1846, 1860, 1847, 87, 1852, 1861, 87,
+ 1848, 1857, 87, 87, 1859, 1862, 1849, 1850, 1863, 1864,
+ 1855, 1865, 87, 87, 1854, 87, 87, 87, 1856, 87,
+ 1871, 1860, 1870, 4015, 1872, 1866, 87, 1868, 1857, 1867,
+
+ 87, 1859, 1862, 87, 87, 1863, 1864, 87, 1865, 1869,
+ 87, 1876, 1873, 1875, 1877, 87, 87, 1871, 87, 1870,
+ 87, 1872, 1866, 1874, 1868, 1878, 1867, 1882, 87, 1880,
+ 1879, 87, 1881, 1889, 1883, 4015, 1869, 1887, 87, 1873,
+ 1875, 87, 87, 87, 87, 87, 1890, 87, 87, 1897,
+ 1874, 1884, 1878, 87, 1882, 1885, 1880, 1879, 1888, 1881,
+ 1889, 1883, 1891, 87, 1887, 1892, 1895, 1893, 1886, 1896,
+ 87, 1900, 1894, 1890, 87, 1898, 87, 87, 1884, 1901,
+ 87, 87, 1885, 87, 87, 1888, 1899, 87, 1902, 1891,
+ 1906, 87, 1892, 87, 1893, 1886, 1896, 1903, 1904, 1894,
+
+ 87, 87, 1898, 87, 1908, 87, 1901, 1905, 87, 4015,
+ 1909, 87, 1907, 1899, 1910, 1902, 87, 1906, 1911, 87,
+ 87, 1912, 1913, 87, 1903, 1904, 1914, 87, 1915, 1917,
+ 1918, 1916, 1919, 4015, 1905, 1920, 87, 87, 87, 1907,
+ 1921, 1910, 4015, 4015, 87, 1923, 87, 1926, 1912, 1913,
+ 87, 87, 87, 1914, 87, 1922, 87, 1918, 1916, 87,
+ 87, 1925, 1920, 1928, 1924, 87, 87, 1921, 87, 87,
+ 87, 1927, 1923, 1929, 1926, 1930, 1931, 1932, 87, 1933,
+ 1934, 87, 1922, 1935, 87, 87, 1937, 1936, 1925, 87,
+ 1928, 1924, 87, 1941, 1940, 87, 1938, 4015, 1927, 87,
+
+ 1929, 87, 1930, 1931, 1932, 87, 1933, 1943, 87, 87,
+ 1935, 1942, 87, 1937, 1936, 1939, 87, 87, 1944, 87,
+ 1941, 1940, 1946, 1938, 87, 1945, 1948, 1947, 4015, 1949,
+ 1950, 1951, 1952, 87, 1943, 87, 1954, 87, 1942, 87,
+ 87, 1953, 1939, 1955, 87, 1944, 1956, 1959, 87, 87,
+ 87, 4015, 1945, 1948, 1947, 87, 1949, 1950, 1951, 1952,
+ 1961, 1957, 1960, 1954, 87, 87, 1958, 1962, 1953, 4015,
+ 1955, 87, 1963, 87, 1959, 1964, 87, 1967, 175, 1970,
+ 1969, 87, 87, 1965, 1966, 1972, 1971, 1961, 87, 1960,
+ 87, 87, 87, 87, 1962, 1968, 1973, 87, 87, 1963,
+
+ 1975, 1977, 1964, 1978, 1967, 87, 1970, 1969, 87, 1974,
+ 1965, 1966, 1972, 1971, 1981, 1979, 87, 1976, 87, 1980,
+ 1983, 87, 1968, 1973, 87, 87, 87, 1975, 87, 1982,
+ 1978, 1984, 1985, 1986, 1987, 1988, 1974, 87, 87, 87,
+ 1989, 1981, 1979, 1991, 1976, 1990, 1980, 87, 87, 4015,
+ 1992, 87, 87, 87, 1993, 87, 1982, 1995, 1984, 1996,
+ 1986, 1987, 87, 1994, 87, 87, 87, 1989, 1999, 1997,
+ 1991, 87, 1990, 2000, 4015, 2001, 87, 1992, 1998, 2002,
+ 87, 1993, 87, 87, 1995, 87, 1996, 87, 87, 2003,
+ 1994, 2004, 2009, 2008, 4015, 1999, 1997, 87, 87, 2010,
+
+ 2000, 87, 2001, 2011, 87, 1998, 2002, 2005, 87, 2016,
+ 2006, 2013, 2015, 2014, 87, 2017, 2003, 2022, 2004, 2012,
+ 2008, 87, 2007, 2019, 87, 2018, 2010, 87, 87, 87,
+ 2011, 87, 2020, 87, 2005, 87, 2016, 2006, 2013, 2015,
+ 2014, 2021, 87, 87, 2022, 2023, 2012, 2024, 2025, 2007,
+ 2027, 2026, 2018, 2028, 2031, 87, 2032, 2030, 2033, 87,
+ 2029, 87, 2035, 87, 87, 87, 2038, 87, 2021, 2034,
+ 87, 87, 2023, 2037, 2040, 2025, 2039, 2027, 2026, 87,
+ 2028, 87, 4015, 87, 2030, 2036, 87, 2029, 87, 87,
+ 87, 87, 2041, 87, 87, 87, 2034, 2042, 87, 87,
+
+ 2037, 2040, 2043, 2039, 2046, 2044, 2049, 2045, 2047, 87,
+ 2048, 87, 2036, 87, 87, 87, 2050, 87, 87, 2041,
+ 2053, 87, 2051, 87, 2042, 2052, 2054, 2055, 87, 2043,
+ 2057, 2046, 2044, 2049, 2045, 2047, 2056, 2048, 2058, 4015,
+ 2067, 2059, 87, 2050, 87, 87, 87, 2053, 87, 2051,
+ 87, 87, 2052, 2054, 2055, 2060, 2062, 2057, 2061, 2066,
+ 2063, 4015, 2065, 2056, 2068, 87, 87, 87, 2059, 87,
+ 87, 87, 2069, 4015, 2071, 2070, 2074, 87, 2064, 87,
+ 2072, 4015, 2060, 2062, 87, 2061, 2066, 2063, 87, 2065,
+ 87, 2068, 87, 2073, 87, 2075, 2076, 2077, 2079, 2069,
+
+ 87, 2071, 2070, 2074, 87, 2064, 87, 2072, 2078, 2080,
+ 87, 4015, 2081, 2088, 87, 2082, 2083, 2089, 2090, 2086,
+ 2073, 87, 2075, 2076, 2077, 2079, 2084, 87, 87, 87,
+ 87, 2085, 2087, 2091, 87, 2078, 2080, 87, 87, 2081,
+ 2088, 2092, 2082, 2083, 87, 87, 2086, 2093, 87, 2094,
+ 87, 2095, 2096, 2084, 2097, 2098, 2101, 2099, 2085, 2087,
+ 2091, 87, 87, 2100, 2102, 2103, 87, 87, 2092, 2110,
+ 87, 87, 87, 2112, 2093, 2106, 2094, 87, 87, 2096,
+ 87, 2097, 2098, 2101, 2099, 87, 2104, 87, 2105, 2107,
+ 2100, 2102, 2103, 87, 87, 2113, 2110, 87, 2116, 87,
+
+ 2108, 2111, 2106, 2109, 2114, 87, 2120, 2115, 2117, 2119,
+ 2118, 2121, 87, 2104, 87, 2105, 2107, 87, 87, 87,
+ 87, 2122, 87, 87, 87, 2116, 2123, 2108, 2111, 2126,
+ 2109, 2114, 2152, 2127, 2115, 2117, 2119, 2118, 87, 2128,
+ 2124, 87, 87, 87, 2129, 2125, 4015, 2130, 2122, 2132,
+ 87, 2131, 4015, 2123, 87, 87, 2126, 87, 2137, 87,
+ 2127, 2134, 87, 2133, 2135, 2138, 2128, 2124, 2136, 4015,
+ 2139, 2129, 2125, 87, 2130, 87, 2132, 2140, 2131, 87,
+ 2150, 87, 87, 2141, 2142, 2137, 87, 87, 2134, 87,
+ 2133, 2135, 2138, 87, 2143, 2136, 87, 2139, 2147, 2144,
+
+ 2145, 2148, 2146, 87, 2140, 2149, 2151, 2153, 2154, 2155,
+ 2141, 2142, 87, 87, 87, 87, 2156, 2157, 87, 4015,
+ 2161, 4015, 87, 87, 2158, 2147, 87, 2145, 2148, 2146,
+ 87, 87, 2149, 2151, 2159, 2154, 2155, 2160, 87, 87,
+ 2162, 87, 2172, 2165, 2157, 4015, 2166, 2163, 87, 2167,
+ 87, 2158, 87, 2164, 87, 2168, 2173, 87, 2169, 2170,
+ 87, 2159, 2171, 87, 2160, 87, 87, 2162, 2176, 2172,
+ 87, 87, 2174, 2166, 2163, 87, 2167, 2175, 87, 2177,
+ 2164, 87, 2168, 2173, 87, 2169, 2170, 2178, 2180, 2171,
+ 87, 87, 87, 2181, 2182, 2176, 2183, 2184, 4015, 2174,
+
+ 2185, 2187, 2186, 2188, 2175, 2189, 2177, 87, 2179, 87,
+ 87, 87, 2190, 2194, 87, 2197, 4015, 4015, 87, 87,
+ 87, 2182, 2192, 2183, 87, 87, 2191, 2185, 2187, 2186,
+ 87, 87, 2189, 87, 2193, 2179, 2196, 87, 2195, 2198,
+ 87, 4015, 2197, 87, 87, 87, 87, 2199, 2200, 2192,
+ 2201, 2202, 2207, 2191, 2206, 87, 2203, 2205, 4015, 87,
+ 2210, 2193, 2214, 2196, 4015, 2195, 2198, 2204, 87, 87,
+ 87, 2208, 87, 87, 2199, 2200, 87, 2201, 2202, 2207,
+ 87, 2206, 2211, 2203, 2205, 2209, 175, 87, 2212, 87,
+ 87, 2213, 2215, 2216, 2204, 2218, 2217, 87, 2208, 87,
+
+ 2222, 2219, 2220, 87, 2224, 2223, 87, 87, 2221, 2211,
+ 87, 87, 2209, 87, 87, 2212, 87, 87, 2213, 2215,
+ 2216, 87, 2218, 2217, 87, 2225, 2226, 2222, 2219, 2220,
+ 4015, 2224, 2223, 2227, 2228, 2221, 2229, 2231, 2230, 2232,
+ 4015, 87, 87, 2234, 87, 2233, 2235, 2237, 4015, 2238,
+ 2236, 4015, 4015, 2226, 2239, 87, 2241, 87, 87, 2240,
+ 2227, 2228, 87, 87, 2231, 2230, 87, 87, 87, 87,
+ 4015, 2242, 2233, 2235, 2246, 87, 87, 2236, 87, 87,
+ 87, 2239, 2243, 2241, 87, 2244, 2240, 87, 2245, 2247,
+ 2248, 2249, 2250, 4015, 87, 4015, 87, 87, 2242, 2251,
+
+ 2252, 2246, 2259, 2255, 87, 2260, 87, 2253, 87, 2243,
+ 87, 87, 2244, 2258, 87, 2245, 2247, 2248, 2249, 2250,
+ 2254, 87, 87, 2261, 2256, 87, 2251, 2252, 4015, 2259,
+ 2255, 2257, 87, 2262, 2253, 87, 2264, 2263, 2267, 87,
+ 2258, 2265, 2266, 2272, 87, 87, 87, 2254, 87, 87,
+ 2268, 2256, 2271, 87, 2269, 87, 2270, 2273, 2257, 2274,
+ 2262, 2275, 2280, 2264, 2263, 2267, 87, 87, 2265, 2266,
+ 87, 2276, 2281, 2282, 2277, 87, 2278, 2268, 87, 2271,
+ 87, 2269, 87, 2270, 87, 2279, 2274, 2283, 87, 87,
+ 2284, 87, 2286, 2285, 2289, 87, 2287, 87, 2276, 2281,
+
+ 87, 2277, 87, 2278, 2290, 87, 87, 2288, 2291, 2292,
+ 2293, 87, 2279, 4015, 2283, 2295, 87, 87, 2294, 2298,
+ 2285, 2289, 87, 2287, 87, 87, 2296, 2297, 2299, 4015,
+ 2300, 2290, 87, 87, 2288, 2291, 87, 2293, 87, 2301,
+ 87, 87, 87, 2302, 2307, 2294, 2298, 2310, 4015, 4015,
+ 87, 87, 4015, 2296, 2297, 2299, 87, 2300, 2303, 2304,
+ 2305, 87, 2309, 2308, 2313, 2306, 2301, 2311, 2317, 87,
+ 2312, 2307, 87, 87, 87, 87, 2314, 87, 2315, 87,
+ 2319, 87, 2322, 2316, 87, 2303, 2304, 2305, 2318, 2309,
+ 2308, 2313, 2306, 2320, 2311, 2317, 2321, 2312, 87, 2323,
+
+ 87, 2328, 4015, 2314, 2324, 87, 2325, 2319, 87, 87,
+ 87, 87, 2327, 2326, 87, 2318, 2330, 87, 87, 87,
+ 2320, 87, 2331, 2321, 2329, 87, 2323, 2332, 87, 87,
+ 2333, 2324, 87, 2325, 2334, 2335, 2337, 2336, 2340, 2327,
+ 2326, 2339, 87, 2330, 87, 2338, 2342, 87, 2341, 2331,
+ 2343, 2329, 87, 4015, 2332, 4015, 87, 2333, 2348, 87,
+ 2346, 87, 87, 87, 2336, 87, 87, 2347, 2339, 2345,
+ 2344, 87, 2338, 2342, 2350, 2341, 87, 87, 2349, 2351,
+ 87, 2355, 87, 2354, 87, 87, 87, 2346, 2358, 2352,
+ 2353, 87, 2356, 87, 2347, 2362, 2345, 2344, 2360, 87,
+
+ 2357, 2350, 2359, 2363, 2366, 2349, 2351, 87, 87, 87,
+ 2354, 87, 2364, 2367, 2361, 87, 2352, 2353, 2365, 2356,
+ 87, 87, 2362, 2374, 87, 2368, 87, 2357, 2369, 2359,
+ 87, 2370, 4015, 2373, 2381, 87, 87, 87, 87, 2364,
+ 87, 2361, 2371, 87, 2375, 2365, 87, 87, 2372, 87,
+ 2374, 2378, 2368, 2376, 2380, 2369, 87, 87, 2370, 2379,
+ 2373, 87, 87, 2377, 87, 2384, 87, 2383, 87, 2371,
+ 2382, 2375, 87, 2386, 2389, 2372, 2385, 87, 2378, 87,
+ 2376, 2380, 87, 2390, 2388, 87, 2379, 2391, 87, 2387,
+ 2377, 87, 2384, 2397, 2393, 2392, 87, 2382, 87, 87,
+
+ 2386, 2389, 87, 2385, 2395, 87, 2394, 2396, 2398, 2399,
+ 2390, 2388, 87, 2400, 87, 2402, 2387, 2405, 87, 87,
+ 2397, 2393, 2392, 2401, 4015, 2409, 4015, 87, 4015, 87,
+ 87, 2395, 2403, 2394, 2396, 2398, 2399, 2404, 87, 2406,
+ 87, 87, 2402, 2407, 87, 87, 2408, 87, 87, 2413,
+ 2401, 2410, 2409, 2411, 87, 2412, 87, 2415, 87, 2403,
+ 87, 2416, 87, 2414, 2404, 2417, 2406, 2418, 2420, 87,
+ 2407, 2419, 87, 2408, 4015, 2421, 2426, 2427, 2410, 87,
+ 2411, 87, 2412, 87, 2415, 2430, 2425, 2431, 2416, 2433,
+ 2414, 87, 2417, 87, 87, 2420, 2422, 87, 2419, 2424,
+
+ 2428, 2423, 2421, 87, 87, 2429, 87, 2434, 87, 2432,
+ 87, 87, 87, 2425, 2435, 2436, 2433, 87, 2437, 87,
+ 2438, 2441, 87, 2422, 2439, 2440, 2424, 87, 2423, 2443,
+ 87, 2444, 87, 2442, 2434, 87, 2432, 2445, 87, 2446,
+ 2447, 87, 2436, 87, 2454, 2437, 87, 2438, 87, 2448,
+ 87, 2439, 2440, 87, 2450, 2449, 87, 2451, 2444, 87,
+ 2442, 87, 2452, 2453, 2445, 2460, 87, 2447, 2455, 87,
+ 87, 87, 87, 2456, 2457, 2459, 2448, 175, 2458, 2461,
+ 2462, 2450, 2449, 2463, 2451, 87, 2465, 87, 4015, 2452,
+ 2453, 87, 87, 2464, 2467, 2455, 2466, 87, 4015, 87,
+
+ 2456, 87, 87, 2468, 87, 2458, 2461, 2462, 87, 2471,
+ 2478, 2469, 87, 2465, 87, 87, 2470, 87, 2472, 2474,
+ 2464, 2467, 2473, 2466, 2475, 87, 2479, 2476, 87, 2477,
+ 2468, 2483, 87, 87, 87, 4015, 2471, 2478, 2481, 2480,
+ 2482, 87, 87, 87, 87, 2472, 2474, 2484, 2489, 2473,
+ 87, 2475, 2485, 87, 2476, 87, 2477, 87, 2483, 87,
+ 87, 2487, 87, 2486, 2488, 2481, 2480, 2482, 2492, 2490,
+ 87, 2491, 87, 4015, 87, 2493, 2494, 2495, 2499, 2485,
+ 87, 87, 2496, 2500, 87, 2503, 87, 87, 2487, 2501,
+ 2486, 2488, 87, 87, 87, 87, 2490, 2497, 2491, 2502,
+
+ 87, 87, 2493, 2494, 2495, 2499, 87, 87, 2498, 2496,
+ 2500, 87, 2503, 2504, 2505, 2506, 2501, 2507, 2508, 2509,
+ 4015, 87, 4015, 87, 2497, 2510, 2502, 2511, 2516, 87,
+ 2518, 87, 87, 4015, 4015, 2498, 2512, 2513, 87, 87,
+ 2504, 2505, 2506, 2514, 2507, 2508, 87, 87, 87, 87,
+ 2519, 2517, 2510, 2515, 2511, 87, 87, 2518, 2520, 2522,
+ 87, 87, 2521, 2512, 2513, 2523, 87, 2525, 87, 2524,
+ 2514, 87, 2526, 2529, 2528, 87, 2532, 2519, 2517, 4015,
+ 2515, 87, 2531, 87, 2530, 2520, 2522, 2527, 87, 2521,
+ 2534, 87, 87, 2533, 87, 87, 2524, 87, 87, 2526,
+
+ 87, 2528, 87, 2532, 2535, 87, 2538, 2537, 2539, 2531,
+ 2540, 2530, 2536, 87, 2527, 4015, 87, 2534, 2542, 87,
+ 2533, 87, 87, 87, 2543, 2541, 2544, 2545, 4015, 2552,
+ 87, 2535, 2546, 2538, 2537, 2539, 87, 2540, 87, 2536,
+ 87, 2555, 87, 2547, 4015, 2542, 2553, 87, 2554, 2561,
+ 87, 2543, 2541, 2544, 2548, 2549, 2552, 2556, 2550, 87,
+ 2557, 2559, 2558, 87, 2560, 2562, 87, 87, 87, 4015,
+ 2547, 2551, 87, 2553, 2563, 2554, 87, 2564, 2566, 87,
+ 4015, 2548, 2549, 87, 2556, 2550, 87, 2557, 2559, 2558,
+ 87, 2560, 2562, 2567, 2565, 2571, 87, 2568, 2551, 2569,
+
+ 87, 2563, 87, 87, 2564, 2566, 2572, 2570, 87, 2573,
+ 87, 2574, 2575, 87, 2576, 87, 2578, 87, 2580, 87,
+ 2567, 2565, 2571, 87, 2568, 87, 2569, 2579, 2577, 2581,
+ 87, 87, 4015, 2572, 2570, 87, 2573, 2582, 2574, 2575,
+ 87, 87, 2583, 2578, 2584, 87, 87, 2589, 2585, 2586,
+ 2588, 2587, 4015, 4015, 2579, 2577, 2581, 87, 87, 87,
+ 87, 2590, 4015, 2599, 2582, 2592, 87, 87, 2591, 2583,
+ 87, 2584, 2595, 2604, 2597, 2585, 2586, 2588, 2587, 87,
+ 87, 2593, 87, 87, 2600, 2596, 2594, 87, 2590, 2598,
+ 87, 87, 2592, 87, 2602, 2591, 2603, 2605, 2601, 2595,
+
+ 2607, 2597, 2606, 87, 87, 87, 87, 2608, 2609, 2610,
+ 87, 2600, 2596, 87, 87, 2613, 2598, 87, 2611, 87,
+ 2615, 2602, 2616, 2603, 2605, 2601, 2612, 87, 2614, 2606,
+ 2618, 2619, 87, 2617, 2673, 2609, 2620, 87, 4015, 87,
+ 87, 87, 87, 87, 2623, 2611, 87, 2615, 87, 2616,
+ 2624, 87, 87, 2612, 2628, 2614, 87, 2618, 2619, 87,
+ 2617, 2621, 2625, 2620, 2622, 2627, 87, 2626, 2629, 87,
+ 2630, 2623, 87, 4015, 2631, 2637, 2632, 2624, 2633, 87,
+ 87, 2628, 2634, 87, 87, 2638, 4015, 2635, 2621, 87,
+ 4015, 2622, 2627, 87, 87, 2629, 87, 2630, 87, 2636,
+
+ 87, 2631, 2637, 2632, 2639, 2633, 87, 2640, 2641, 2634,
+ 2642, 2644, 87, 87, 2635, 2645, 87, 87, 2643, 2646,
+ 87, 87, 2649, 4015, 87, 2647, 2636, 87, 2648, 87,
+ 2652, 2639, 2650, 4015, 2640, 2641, 2651, 2642, 2644, 4015,
+ 87, 87, 2645, 87, 2653, 2643, 2646, 2654, 87, 2649,
+ 2658, 2656, 2647, 87, 87, 2648, 2662, 2652, 87, 2650,
+ 2655, 2657, 87, 2651, 2659, 87, 2661, 2660, 87, 87,
+ 4015, 2653, 87, 87, 2654, 2664, 2665, 2658, 2656, 2663,
+ 2670, 2666, 2667, 87, 87, 87, 2669, 2655, 2657, 87,
+ 2668, 2659, 87, 2661, 2660, 2677, 2674, 87, 2678, 2685,
+
+ 87, 175, 87, 2665, 2671, 87, 2663, 2670, 2666, 2667,
+ 2672, 87, 87, 2669, 2675, 2679, 2680, 2668, 87, 2676,
+ 2683, 2681, 2682, 2674, 87, 2684, 87, 87, 87, 87,
+ 87, 2671, 2690, 2689, 87, 87, 2686, 2672, 2691, 87,
+ 2692, 2695, 2679, 2680, 2693, 2694, 87, 2683, 2681, 2682,
+ 2687, 87, 2684, 87, 2699, 87, 2696, 2698, 2700, 87,
+ 2689, 2688, 87, 2686, 87, 2691, 87, 2692, 87, 2697,
+ 2701, 2693, 2694, 87, 2702, 2703, 87, 2687, 2705, 87,
+ 87, 2699, 2704, 2696, 2698, 87, 2706, 2709, 2688, 87,
+ 2708, 87, 87, 87, 2711, 2710, 2697, 2701, 87, 4015,
+
+ 4015, 87, 2703, 87, 2712, 2705, 87, 87, 2707, 2704,
+ 87, 2713, 87, 2706, 2709, 2716, 2714, 2708, 2715, 2717,
+ 87, 2711, 2710, 2718, 87, 87, 87, 87, 2719, 2720,
+ 2721, 2712, 2723, 87, 2730, 2707, 2726, 87, 2713, 2722,
+ 2724, 87, 2716, 2714, 87, 2715, 2717, 2725, 87, 87,
+ 87, 87, 87, 2727, 2728, 2719, 2720, 2721, 2731, 2723,
+ 2729, 87, 87, 2726, 2732, 2733, 2722, 2724, 87, 87,
+ 2734, 4015, 87, 87, 2725, 87, 2737, 87, 87, 2735,
+ 2727, 2728, 2738, 87, 87, 2731, 2736, 2729, 87, 87,
+ 2739, 2732, 2733, 2740, 2741, 2743, 2742, 2734, 2744, 87,
+
+ 4015, 2745, 4015, 2737, 2748, 87, 2735, 2750, 2746, 2738,
+ 87, 2747, 2749, 2736, 87, 87, 2753, 2739, 2751, 87,
+ 2740, 87, 2752, 2742, 2755, 2744, 87, 87, 2745, 87,
+ 87, 2748, 87, 2754, 87, 2746, 87, 87, 2747, 2749,
+ 87, 2756, 2758, 2753, 2757, 2751, 87, 2759, 2760, 2752,
+ 2761, 2755, 2762, 2763, 2766, 87, 2764, 4015, 2767, 2765,
+ 2754, 2768, 87, 2769, 87, 2772, 2773, 87, 2756, 87,
+ 87, 2757, 87, 87, 2759, 87, 2774, 2761, 2775, 2762,
+ 2763, 87, 87, 2764, 87, 2767, 2765, 2779, 2768, 87,
+ 2769, 2770, 87, 87, 2771, 2776, 2778, 2777, 87, 2780,
+
+ 87, 87, 87, 2774, 87, 2775, 2781, 2782, 2783, 87,
+ 2784, 87, 2785, 2786, 2779, 87, 2787, 2788, 2770, 87,
+ 2789, 2771, 2776, 2778, 2777, 87, 87, 2791, 2790, 2792,
+ 4015, 2793, 2794, 87, 2782, 87, 87, 2784, 87, 87,
+ 2786, 87, 87, 2787, 87, 87, 2795, 87, 2796, 2798,
+ 2799, 2801, 2797, 2804, 2791, 2790, 2792, 87, 2793, 2794,
+ 87, 87, 2800, 2802, 2803, 4015, 2815, 2806, 2805, 2808,
+ 87, 87, 87, 87, 87, 2796, 2798, 87, 87, 2797,
+ 2804, 2811, 2807, 4015, 2814, 4015, 87, 2810, 2812, 2800,
+ 2802, 2803, 87, 87, 2806, 2805, 87, 2809, 87, 87,
+
+ 87, 2817, 2813, 2818, 2819, 87, 87, 87, 2811, 2807,
+ 87, 87, 2816, 87, 2810, 2812, 87, 2820, 2821, 87,
+ 2823, 2825, 2830, 2826, 2809, 2822, 2827, 87, 2817, 2813,
+ 2818, 2819, 4015, 87, 2824, 2831, 4015, 2828, 87, 2816,
+ 87, 87, 87, 87, 2820, 87, 87, 2823, 2825, 87,
+ 2826, 2829, 2822, 2827, 2832, 2833, 2834, 2835, 2836, 2837,
+ 87, 2824, 2831, 87, 2828, 87, 87, 2838, 87, 2839,
+ 87, 2894, 2840, 2846, 87, 2844, 4015, 2845, 2829, 2847,
+ 4015, 2832, 2833, 2834, 2835, 2836, 2837, 87, 2841, 2848,
+ 4015, 4015, 87, 87, 2838, 87, 2839, 87, 87, 2840,
+
+ 2846, 87, 2852, 2842, 2845, 2843, 2847, 87, 2849, 2850,
+ 87, 87, 87, 2851, 2858, 2841, 2848, 2853, 2859, 87,
+ 87, 2854, 87, 87, 2855, 2856, 87, 2857, 2860, 2852,
+ 2842, 2861, 2843, 2863, 2864, 2849, 2850, 87, 4015, 87,
+ 2851, 2858, 2865, 2862, 2853, 2870, 87, 87, 2854, 87,
+ 87, 2855, 2856, 2867, 2857, 87, 87, 2866, 2861, 87,
+ 87, 2864, 2868, 87, 87, 87, 2869, 87, 2875, 2865,
+ 2862, 4015, 2870, 87, 2871, 2874, 2872, 2873, 2876, 4015,
+ 2867, 2880, 2877, 2882, 2866, 2881, 87, 4015, 87, 2868,
+ 2878, 2879, 87, 2869, 87, 87, 4015, 87, 87, 87,
+
+ 87, 2871, 2874, 2872, 2873, 87, 2883, 2885, 2880, 2877,
+ 87, 87, 2881, 2886, 2884, 87, 2888, 2878, 2879, 2887,
+ 4015, 4015, 2889, 87, 2890, 2892, 2891, 2896, 2893, 4015,
+ 2897, 87, 87, 2883, 2885, 2895, 87, 87, 87, 87,
+ 2886, 2884, 87, 2888, 175, 87, 2887, 87, 87, 2889,
+ 2898, 2890, 2892, 2891, 2896, 2893, 2899, 2897, 2900, 2901,
+ 2902, 2903, 2895, 4015, 2906, 2904, 2907, 2908, 2905, 87,
+ 87, 87, 87, 87, 2909, 2910, 87, 2898, 87, 2911,
+ 2916, 2912, 87, 2899, 87, 2900, 2901, 2902, 2903, 87,
+ 87, 2906, 2904, 2907, 2908, 2905, 2913, 2914, 2915, 2917,
+
+ 2918, 87, 87, 2919, 4015, 4015, 87, 87, 2912, 2920,
+ 4015, 2921, 87, 2922, 4015, 2923, 2924, 2927, 87, 2926,
+ 87, 87, 87, 87, 2914, 2915, 2925, 2918, 87, 87,
+ 87, 87, 2929, 2930, 87, 2928, 2920, 87, 2921, 2931,
+ 2922, 87, 2923, 2924, 2932, 87, 2926, 2933, 87, 87,
+ 2934, 2937, 2935, 2925, 87, 2936, 87, 2938, 87, 2929,
+ 2930, 2939, 2928, 87, 2941, 2949, 2931, 2940, 2942, 87,
+ 87, 87, 87, 87, 2933, 87, 2943, 2934, 2937, 2935,
+ 87, 87, 2936, 87, 2938, 2944, 87, 2945, 87, 2947,
+ 2946, 2941, 87, 2948, 2940, 2942, 87, 87, 2950, 2952,
+
+ 87, 2951, 2954, 2943, 2953, 4015, 2963, 2959, 2960, 2964,
+ 2955, 87, 2944, 87, 2945, 87, 2947, 2946, 87, 87,
+ 2948, 87, 2957, 87, 2956, 2950, 2952, 87, 2951, 2954,
+ 87, 2953, 87, 2958, 87, 2960, 2961, 2955, 87, 87,
+ 2962, 87, 2965, 2966, 87, 2968, 2967, 87, 2970, 2957,
+ 4015, 2956, 2969, 2971, 4015, 2972, 2979, 4015, 87, 2973,
+ 2958, 87, 87, 2961, 87, 87, 2974, 2962, 87, 2965,
+ 2966, 2975, 2968, 2967, 87, 2970, 2977, 87, 87, 2969,
+ 2971, 87, 2972, 87, 2976, 87, 2973, 2978, 87, 2980,
+ 2981, 2982, 4015, 2974, 2984, 87, 2985, 2983, 2975, 2986,
+
+ 2988, 4015, 87, 2977, 87, 87, 2989, 87, 2990, 87,
+ 87, 2976, 87, 2995, 2978, 2996, 2980, 87, 2982, 87,
+ 2987, 87, 87, 2985, 2983, 4015, 2986, 2988, 2991, 2993,
+ 2992, 87, 2994, 2989, 87, 2990, 87, 87, 2997, 2998,
+ 87, 2999, 87, 4015, 3007, 3001, 87, 2987, 3005, 3000,
+ 87, 87, 3002, 3003, 87, 2991, 2993, 2992, 3004, 2994,
+ 87, 87, 3006, 87, 3014, 3009, 2998, 87, 2999, 3010,
+ 87, 87, 3001, 3008, 87, 3005, 3000, 87, 3011, 3002,
+ 3003, 3013, 87, 87, 87, 3004, 3012, 3015, 3016, 3006,
+ 87, 87, 3009, 87, 3017, 87, 3010, 3018, 3024, 3019,
+
+ 3008, 3020, 3021, 3022, 4015, 87, 87, 87, 3013, 87,
+ 87, 3023, 87, 3012, 3015, 3016, 3027, 3025, 87, 3028,
+ 3029, 3017, 87, 3026, 3018, 87, 3019, 3030, 3020, 3021,
+ 3022, 3034, 87, 87, 87, 3031, 3032, 87, 3023, 87,
+ 3033, 3038, 87, 3027, 3025, 4015, 3028, 3029, 87, 87,
+ 3026, 3037, 87, 87, 3030, 87, 3040, 3035, 3034, 3036,
+ 3039, 3041, 3031, 3032, 87, 3042, 87, 3033, 87, 3044,
+ 3043, 3045, 87, 87, 3047, 4015, 3048, 3046, 3037, 3049,
+ 87, 4015, 3051, 87, 3035, 87, 3036, 3039, 87, 87,
+ 4015, 3056, 87, 3050, 87, 3052, 3044, 3043, 3045, 87,
+
+ 87, 3047, 87, 3048, 3046, 87, 3049, 3053, 87, 3051,
+ 87, 3054, 3055, 3057, 87, 3058, 3059, 87, 87, 3060,
+ 3050, 87, 3052, 87, 3061, 3063, 3062, 3066, 4015, 3064,
+ 3065, 4015, 3069, 3071, 3053, 87, 4015, 87, 3054, 3055,
+ 3057, 87, 87, 87, 87, 87, 3060, 4015, 3067, 87,
+ 3070, 87, 3063, 3062, 3066, 87, 3064, 3065, 3068, 87,
+ 87, 3072, 87, 3073, 3074, 87, 3075, 3076, 87, 87,
+ 87, 3077, 3078, 4015, 3079, 3067, 3082, 3070, 87, 87,
+ 87, 3080, 3081, 3084, 3085, 3068, 3083, 87, 3072, 87,
+ 3073, 3074, 3090, 3075, 3076, 87, 87, 175, 3077, 3078,
+
+ 3089, 3079, 87, 3082, 87, 3086, 87, 3087, 3080, 3081,
+ 3084, 3085, 87, 3083, 87, 3088, 3092, 3091, 3093, 87,
+ 87, 87, 87, 3096, 3094, 3095, 3097, 3089, 3099, 4015,
+ 3100, 87, 3086, 3098, 3087, 3101, 4015, 4015, 4015, 4015,
+ 87, 3119, 3088, 3092, 3091, 3093, 87, 87, 87, 3102,
+ 87, 3094, 3095, 87, 87, 3099, 87, 3100, 87, 3103,
+ 3098, 87, 3101, 3104, 3111, 3105, 3106, 3108, 87, 3107,
+ 3120, 87, 87, 87, 3109, 87, 3102, 87, 87, 3113,
+ 3110, 87, 87, 87, 3117, 4015, 3103, 87, 3112, 3118,
+ 3104, 3111, 3105, 3106, 3108, 87, 3107, 3120, 3114, 3115,
+
+ 3116, 3109, 3122, 3123, 87, 87, 3113, 3110, 87, 87,
+ 87, 3117, 87, 3121, 3124, 3112, 3118, 3125, 87, 3126,
+ 87, 4015, 3127, 3129, 3128, 3114, 3115, 3116, 87, 3122,
+ 87, 87, 87, 87, 3135, 3130, 3131, 3138, 3137, 3132,
+ 3121, 3124, 3133, 87, 87, 87, 3126, 87, 87, 3127,
+ 3129, 3128, 3134, 87, 3136, 3139, 3143, 87, 87, 3141,
+ 87, 3135, 3130, 3131, 87, 3137, 3132, 3140, 87, 3133,
+ 3142, 3144, 3145, 4015, 87, 3146, 3147, 87, 3148, 3134,
+ 3149, 3136, 87, 87, 87, 87, 3141, 3150, 87, 3151,
+ 87, 87, 3152, 3156, 3140, 4015, 3157, 3142, 87, 3153,
+
+ 87, 3154, 3146, 3147, 87, 3148, 87, 3149, 87, 87,
+ 3155, 87, 87, 3159, 3150, 3158, 3151, 87, 3160, 87,
+ 3156, 3161, 87, 3157, 3162, 3163, 3153, 3165, 3154, 3166,
+ 3164, 3167, 4015, 3170, 3169, 87, 3171, 3155, 87, 87,
+ 3159, 87, 3158, 87, 3168, 3160, 3172, 87, 87, 87,
+ 3173, 3162, 87, 87, 87, 87, 3166, 3164, 3167, 87,
+ 3170, 3169, 3174, 87, 3178, 3179, 3175, 3177, 3176, 87,
+ 3180, 3168, 87, 3172, 87, 87, 87, 3173, 3181, 3182,
+ 3183, 3185, 87, 3190, 4015, 3195, 3184, 87, 87, 3174,
+ 3186, 3178, 87, 3175, 3177, 3176, 87, 3180, 87, 3187,
+
+ 3188, 3189, 87, 4015, 87, 3181, 87, 3183, 3185, 3191,
+ 87, 87, 87, 3184, 3197, 3192, 3193, 3186, 3196, 3194,
+ 3198, 87, 87, 87, 87, 87, 3187, 3188, 3189, 87,
+ 87, 87, 3200, 3199, 3201, 3202, 3191, 3204, 3205, 87,
+ 87, 3197, 3192, 3193, 3203, 3196, 3194, 3198, 3206, 87,
+ 3207, 3208, 3209, 87, 3211, 3210, 87, 3213, 4015, 87,
+ 3199, 3201, 3202, 87, 3204, 87, 87, 87, 3214, 87,
+ 87, 3203, 3215, 87, 87, 3206, 3212, 87, 3208, 3209,
+ 3217, 3211, 3210, 87, 87, 87, 3216, 3218, 3219, 3225,
+ 3222, 3220, 3221, 3223, 3224, 3214, 3228, 3227, 87, 3215,
+
+ 4015, 4015, 87, 3212, 87, 87, 87, 3217, 87, 87,
+ 3229, 87, 87, 3216, 87, 3219, 87, 3222, 3220, 3221,
+ 3223, 3224, 3226, 87, 3227, 3230, 3231, 3233, 3232, 87,
+ 3234, 3237, 87, 3235, 3238, 4015, 4015, 3229, 87, 87,
+ 3236, 3239, 3241, 87, 3242, 4015, 87, 87, 3243, 3226,
+ 87, 87, 3230, 3231, 3233, 3232, 87, 3234, 3237, 87,
+ 3235, 3238, 3240, 87, 3244, 3245, 3247, 3236, 3239, 87,
+ 87, 87, 3246, 3249, 87, 3243, 87, 3248, 3252, 3250,
+ 87, 3251, 4015, 4015, 3259, 3253, 4015, 87, 87, 3240,
+ 87, 3244, 3245, 175, 3254, 87, 3255, 87, 3256, 3246,
+
+ 3249, 3257, 3260, 3262, 3248, 3258, 3250, 87, 3251, 87,
+ 87, 87, 3253, 87, 3261, 3263, 87, 87, 3267, 3264,
+ 3269, 3254, 3268, 3255, 87, 3256, 3265, 87, 3257, 87,
+ 3262, 3266, 3258, 87, 3270, 3272, 87, 3271, 3274, 3278,
+ 87, 3261, 87, 87, 87, 3267, 3264, 3269, 3273, 3268,
+ 3276, 3275, 3279, 3277, 3280, 4015, 87, 87, 87, 87,
+ 87, 3282, 3272, 87, 3271, 3274, 87, 3281, 3284, 87,
+ 87, 87, 3283, 3285, 3286, 3273, 87, 3276, 3275, 3291,
+ 3277, 3280, 87, 3287, 87, 3288, 3289, 3290, 87, 87,
+ 87, 3292, 87, 87, 3281, 3284, 87, 87, 3293, 3283,
+
+ 3285, 3286, 3294, 3295, 3296, 87, 3291, 87, 87, 87,
+ 3287, 3297, 3288, 3289, 3290, 3298, 87, 3299, 3292, 3300,
+ 3301, 87, 3306, 4015, 4015, 3293, 87, 87, 87, 3294,
+ 3295, 3296, 3302, 3307, 3309, 4015, 3310, 87, 3303, 3304,
+ 87, 87, 3298, 87, 3299, 87, 87, 3301, 3305, 87,
+ 3308, 87, 87, 87, 87, 3311, 87, 3312, 87, 3302,
+ 3307, 3309, 3313, 3310, 3314, 3303, 3304, 3315, 3320, 87,
+ 3316, 3317, 3318, 3319, 3322, 3305, 87, 3308, 87, 87,
+ 87, 87, 3311, 87, 3312, 3321, 3323, 87, 3327, 3313,
+ 3326, 3314, 3330, 3324, 87, 87, 87, 3316, 3317, 3318,
+
+ 3319, 87, 3325, 3329, 3328, 87, 87, 3331, 3333, 3334,
+ 3332, 87, 3321, 4015, 87, 87, 3335, 3336, 87, 3330,
+ 3324, 3338, 87, 87, 87, 87, 87, 3340, 3337, 3325,
+ 3329, 3328, 3344, 87, 3331, 3339, 3334, 3332, 3341, 87,
+ 87, 87, 3342, 3335, 3336, 3346, 3345, 87, 87, 3343,
+ 87, 3347, 3348, 87, 3340, 3337, 4015, 3349, 87, 87,
+ 87, 3350, 3339, 3351, 87, 3341, 3352, 3353, 3359, 3342,
+ 3354, 3355, 87, 3345, 87, 87, 3343, 3356, 87, 87,
+ 87, 87, 3357, 87, 3349, 3358, 87, 3362, 3350, 3360,
+ 3351, 3363, 87, 87, 3353, 3359, 87, 3354, 3355, 3361,
+
+ 87, 3364, 3365, 3366, 3369, 3367, 87, 3368, 3370, 87,
+ 3372, 3374, 3358, 87, 3362, 3371, 3360, 87, 87, 87,
+ 3373, 87, 87, 3376, 3375, 3377, 3361, 87, 87, 87,
+ 3366, 87, 3367, 3380, 3368, 3370, 87, 87, 87, 87,
+ 3378, 3379, 3371, 3381, 3386, 3385, 87, 3373, 3382, 87,
+ 87, 3375, 3377, 3383, 87, 3387, 3388, 3391, 3384, 3390,
+ 3393, 3389, 3394, 87, 87, 87, 3392, 3378, 3379, 87,
+ 87, 87, 3385, 87, 3395, 3382, 87, 87, 3396, 4015,
+ 3398, 87, 3387, 3491, 3391, 87, 3390, 3393, 87, 3397,
+ 3399, 87, 3400, 3392, 87, 3402, 3401, 3403, 3404, 4015,
+
+ 87, 3406, 3405, 87, 4015, 4015, 87, 3398, 3411, 4015,
+ 87, 3409, 3414, 4015, 87, 87, 3397, 87, 87, 87,
+ 4015, 87, 3402, 3401, 3403, 3404, 87, 87, 3406, 3405,
+ 3407, 3408, 3410, 87, 3413, 87, 3412, 3415, 3409, 87,
+ 87, 87, 3418, 87, 3416, 3419, 3420, 87, 3426, 3421,
+ 87, 3423, 3417, 87, 3422, 87, 3424, 3407, 3408, 3410,
+ 3427, 3413, 3425, 3412, 3415, 87, 3428, 3436, 87, 3418,
+ 87, 3416, 3419, 3420, 3429, 87, 3430, 4015, 3431, 3417,
+ 3432, 87, 4015, 87, 3433, 87, 87, 3427, 3434, 3425,
+ 3437, 87, 87, 3428, 3436, 87, 3435, 87, 3439, 3438,
+
+ 87, 3429, 87, 3430, 87, 3431, 87, 3432, 3440, 3441,
+ 87, 3433, 87, 3446, 3442, 3434, 87, 3437, 3447, 3448,
+ 87, 3443, 3444, 3435, 3450, 3439, 3438, 3445, 87, 87,
+ 3449, 87, 87, 3452, 87, 3440, 3441, 3451, 3453, 3454,
+ 87, 3442, 87, 87, 3456, 87, 3448, 87, 3443, 3444,
+ 3455, 87, 3457, 3458, 3445, 87, 3461, 3449, 87, 4015,
+ 3452, 3465, 3466, 3459, 3451, 3453, 87, 3460, 3462, 3463,
+ 87, 87, 4015, 3464, 87, 3467, 3469, 3455, 4015, 3457,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 3459, 3468, 3470, 3471, 3460, 3462, 3463, 3472, 87, 3475,
+
+ 3464, 3473, 3467, 3469, 87, 87, 3474, 3476, 87, 87,
+ 3477, 3478, 3479, 87, 3481, 3480, 3482, 3483, 3468, 3470,
+ 3471, 3484, 87, 87, 3472, 87, 3475, 87, 3488, 3486,
+ 87, 87, 3485, 87, 3476, 87, 87, 3477, 3478, 3479,
+ 3487, 3481, 3480, 87, 3483, 87, 3489, 3490, 87, 87,
+ 3493, 3492, 87, 3494, 3495, 87, 3486, 3496, 3497, 3485,
+ 3500, 3498, 3499, 4015, 87, 87, 87, 3487, 87, 3501,
+ 4015, 3502, 87, 87, 3490, 87, 87, 3493, 3492, 3505,
+ 3494, 3495, 87, 3503, 3496, 3504, 3506, 3500, 3498, 3499,
+ 87, 87, 87, 3511, 3507, 3512, 3501, 87, 3502, 3513,
+
+ 3514, 87, 87, 3508, 4015, 4015, 3505, 87, 87, 4015,
+ 3503, 3509, 3504, 3506, 3510, 3517, 87, 3515, 87, 3523,
+ 87, 3507, 87, 87, 87, 3516, 87, 3514, 3518, 3519,
+ 3508, 3520, 87, 3525, 4015, 3521, 87, 87, 3509, 3522,
+ 3524, 3510, 3517, 3527, 3515, 3528, 87, 3526, 87, 87,
+ 3529, 87, 3516, 87, 87, 3518, 3519, 87, 3531, 3533,
+ 3525, 87, 3521, 87, 3532, 87, 3522, 3524, 3534, 3530,
+ 3527, 87, 3528, 3535, 3526, 3536, 3537, 3538, 3540, 3541,
+ 3576, 87, 87, 87, 3542, 87, 3533, 87, 87, 87,
+ 87, 3532, 3544, 87, 3539, 3534, 3530, 3548, 87, 87,
+
+ 3535, 87, 3536, 3537, 3538, 87, 3541, 3545, 3543, 3546,
+ 3547, 3542, 87, 3551, 3554, 87, 87, 3549, 87, 3544,
+ 87, 3539, 87, 3550, 3548, 87, 3552, 3557, 87, 3553,
+ 87, 3558, 87, 87, 3545, 3543, 3546, 3547, 3555, 87,
+ 3551, 3554, 3556, 87, 3549, 3563, 3560, 87, 3562, 3559,
+ 3550, 3561, 3564, 3552, 87, 87, 3553, 87, 87, 3565,
+ 3567, 87, 3566, 3568, 3573, 3555, 87, 3578, 87, 3556,
+ 3569, 3570, 3563, 3571, 87, 3562, 3559, 3572, 87, 87,
+ 3579, 87, 3580, 3575, 87, 3574, 87, 87, 87, 3566,
+ 3568, 87, 87, 87, 87, 3587, 3586, 3569, 3570, 87,
+
+ 3571, 87, 3577, 3581, 3572, 3582, 87, 3579, 87, 3580,
+ 3575, 87, 3574, 3583, 3584, 3585, 87, 3589, 3588, 87,
+ 3593, 3590, 87, 87, 87, 87, 3591, 87, 3594, 3577,
+ 3581, 87, 3582, 3592, 87, 3597, 3599, 3596, 3595, 3600,
+ 3583, 3584, 3585, 87, 87, 3588, 3604, 87, 3590, 87,
+ 87, 3601, 87, 3591, 3598, 87, 3602, 87, 87, 3603,
+ 3592, 87, 87, 3599, 3596, 3595, 3600, 87, 3605, 3606,
+ 3607, 3608, 3609, 3604, 4015, 87, 3610, 3611, 3601, 3612,
+ 4015, 3598, 3614, 3615, 87, 3616, 3603, 3613, 87, 87,
+ 87, 3617, 87, 3618, 3619, 3605, 87, 3607, 87, 3609,
+
+ 87, 87, 87, 3610, 3611, 87, 3612, 87, 3620, 3614,
+ 3615, 3622, 3616, 3626, 3613, 3621, 3623, 3624, 87, 3625,
+ 87, 3619, 3629, 87, 87, 3627, 3628, 87, 3631, 3632,
+ 3634, 87, 3630, 87, 3633, 87, 3637, 87, 3622, 87,
+ 87, 3638, 3621, 87, 3624, 87, 3625, 87, 87, 87,
+ 3635, 3636, 3627, 3628, 87, 3631, 3632, 87, 87, 3630,
+ 3639, 3633, 87, 3637, 3640, 4015, 3641, 3642, 87, 3644,
+ 3643, 3645, 3646, 3652, 3649, 3648, 3650, 3635, 3636, 3654,
+ 87, 87, 3647, 3651, 87, 3653, 3656, 87, 87, 3657,
+ 87, 87, 87, 3641, 3642, 4015, 87, 3643, 87, 87,
+
+ 87, 87, 3648, 3650, 3655, 87, 87, 87, 3663, 3647,
+ 3651, 3658, 3653, 87, 3664, 87, 87, 3659, 3660, 87,
+ 3661, 3662, 87, 87, 3665, 87, 87, 3667, 87, 3666,
+ 3670, 3655, 3668, 3676, 87, 3663, 3671, 87, 3658, 87,
+ 87, 87, 3669, 87, 3659, 3660, 3672, 3661, 3662, 3673,
+ 3678, 3665, 3674, 87, 3667, 3675, 3666, 87, 87, 3668,
+ 87, 3677, 3679, 3671, 87, 87, 3681, 3682, 87, 3669,
+ 3680, 3683, 87, 3672, 3684, 87, 87, 3678, 3685, 3674,
+ 3686, 3688, 3675, 3689, 87, 4015, 3692, 3687, 3677, 3679,
+ 4015, 87, 87, 3681, 87, 3690, 87, 3680, 87, 3691,
+
+ 87, 3684, 87, 3693, 3694, 3685, 87, 3696, 3688, 87,
+ 87, 87, 87, 3692, 3687, 3699, 3695, 87, 3697, 3700,
+ 3698, 4015, 3690, 87, 87, 87, 3691, 3706, 3702, 87,
+ 3693, 3694, 3701, 87, 3696, 87, 87, 3703, 87, 3710,
+ 87, 3704, 3699, 3695, 87, 3697, 3700, 3698, 87, 3705,
+ 3709, 87, 3707, 3708, 3706, 3702, 87, 3713, 87, 3701,
+ 3711, 87, 87, 3712, 3703, 3715, 3710, 3717, 3704, 3714,
+ 87, 3716, 87, 3718, 3719, 3723, 3705, 3709, 3726, 3707,
+ 3708, 87, 87, 3720, 3728, 3721, 3722, 3711, 4015, 87,
+ 3712, 87, 3715, 3724, 3717, 87, 3714, 87, 3716, 3725,
+
+ 87, 87, 87, 3733, 3727, 87, 87, 87, 87, 3736,
+ 3720, 87, 3721, 3722, 3739, 87, 87, 3729, 3730, 4015,
+ 3724, 3731, 3732, 3734, 3735, 4015, 3725, 3737, 3740, 3738,
+ 87, 3727, 87, 3742, 3743, 3741, 3736, 87, 3744, 4015,
+ 3745, 87, 3749, 4015, 3746, 4015, 87, 87, 87, 87,
+ 87, 87, 87, 3748, 3737, 3740, 3738, 3747, 3753, 3750,
+ 87, 87, 3741, 3751, 87, 87, 87, 3745, 87, 87,
+ 87, 3746, 3752, 3754, 87, 87, 3755, 3756, 87, 3757,
+ 3748, 3760, 3758, 3759, 3747, 3753, 3750, 3762, 87, 87,
+ 3751, 3763, 3764, 3761, 87, 3765, 87, 3766, 3773, 3752,
+
+ 3754, 3768, 87, 3755, 3756, 87, 3757, 87, 87, 3758,
+ 3759, 87, 3777, 87, 3762, 3767, 3771, 4015, 87, 87,
+ 3761, 3772, 87, 87, 3766, 3775, 3769, 87, 3768, 3770,
+ 87, 3774, 3776, 87, 87, 3778, 3780, 87, 87, 3777,
+ 3781, 3779, 3767, 3782, 87, 4015, 3783, 3784, 87, 87,
+ 4015, 3787, 3775, 3769, 3785, 3786, 3770, 87, 3774, 3776,
+ 3789, 3790, 3778, 87, 87, 3791, 87, 3788, 3779, 3793,
+ 3782, 3794, 87, 87, 87, 3792, 3795, 87, 87, 3796,
+ 87, 3785, 3786, 87, 87, 3797, 3798, 87, 87, 3799,
+ 3800, 3802, 3791, 3803, 3788, 3804, 87, 3805, 87, 3801,
+
+ 87, 3807, 3792, 87, 3806, 3809, 87, 3811, 87, 87,
+ 4015, 3808, 87, 87, 4015, 87, 87, 87, 3802, 87,
+ 87, 3810, 87, 87, 3805, 3812, 3801, 3813, 3807, 87,
+ 3814, 3806, 87, 3815, 87, 3816, 3817, 87, 3808, 3818,
+ 3819, 87, 3820, 4015, 3821, 87, 3822, 3827, 3810, 3824,
+ 87, 87, 3812, 87, 3813, 3823, 87, 3814, 4015, 87,
+ 3815, 3826, 3816, 87, 87, 3825, 3818, 87, 3828, 3820,
+ 87, 3821, 3829, 3822, 87, 87, 3824, 4015, 3830, 87,
+ 3831, 87, 3823, 3833, 3834, 87, 87, 3832, 3826, 87,
+ 3835, 3836, 3825, 3837, 87, 3828, 3838, 87, 87, 3829,
+
+ 3840, 3839, 87, 87, 87, 3830, 3841, 3831, 87, 3843,
+ 3833, 3834, 3842, 87, 3832, 3844, 3845, 3835, 3836, 87,
+ 3837, 3846, 87, 3838, 3849, 3847, 87, 3840, 3839, 87,
+ 87, 3848, 3851, 3841, 3850, 3853, 87, 3852, 3855, 3842,
+ 4015, 87, 87, 87, 87, 3857, 3856, 87, 87, 87,
+ 87, 3849, 3847, 3854, 87, 3859, 4015, 87, 3848, 3851,
+ 3862, 3850, 3858, 3860, 3852, 3855, 3866, 87, 87, 87,
+ 87, 3861, 3857, 3856, 87, 3863, 3864, 87, 87, 87,
+ 3854, 87, 3859, 3865, 87, 3867, 87, 3862, 3869, 3858,
+ 3860, 3868, 3870, 3866, 87, 87, 3872, 3873, 3861, 3871,
+
+ 87, 3874, 3863, 3864, 87, 3875, 3878, 87, 87, 3876,
+ 3865, 3879, 3867, 87, 3881, 3869, 3880, 3882, 3868, 3870,
+ 3883, 87, 87, 3872, 87, 3884, 3871, 87, 3874, 87,
+ 3877, 3885, 3875, 87, 3886, 3888, 3876, 87, 3879, 87,
+ 87, 87, 87, 3880, 3882, 3889, 87, 3883, 3887, 3890,
+ 3893, 3891, 87, 87, 3892, 87, 3894, 3877, 87, 87,
+ 3897, 3886, 3888, 3896, 3895, 3899, 87, 87, 3900, 87,
+ 3898, 87, 3889, 3901, 3902, 3887, 3890, 87, 3891, 87,
+ 3904, 3892, 87, 3894, 3903, 87, 3905, 87, 87, 3909,
+ 3896, 3895, 87, 3906, 3907, 87, 87, 3898, 87, 3908,
+
+ 87, 87, 87, 3910, 3912, 87, 3911, 3904, 3914, 3913,
+ 87, 3903, 3915, 87, 3916, 3917, 3909, 87, 3920, 4015,
+ 3906, 3907, 3921, 87, 3919, 3924, 3908, 87, 3922, 87,
+ 87, 3912, 87, 3911, 87, 3918, 3913, 3925, 87, 3926,
+ 87, 3916, 3917, 87, 87, 87, 87, 3923, 3927, 87,
+ 87, 3919, 3924, 3928, 87, 3922, 3929, 3930, 3931, 3932,
+ 87, 3933, 3918, 4015, 87, 87, 3926, 3934, 3935, 87,
+ 3936, 87, 87, 87, 3923, 3927, 3941, 3943, 87, 3942,
+ 3928, 3940, 4015, 3929, 3930, 3931, 3932, 3938, 3933, 87,
+ 87, 3937, 3939, 3945, 3934, 3935, 87, 87, 87, 87,
+
+ 87, 87, 3944, 87, 3946, 3947, 3942, 3949, 3940, 87,
+ 3950, 3951, 4015, 3948, 3938, 87, 3952, 4015, 3937, 3939,
+ 3945, 87, 3954, 4015, 3959, 3953, 87, 87, 87, 3944,
+ 3956, 3946, 3947, 87, 87, 4015, 3955, 87, 3951, 87,
+ 3948, 3962, 3963, 87, 87, 87, 3957, 3958, 3961, 3954,
+ 87, 3960, 3953, 3964, 87, 87, 87, 3956, 3965, 87,
+ 3967, 3966, 87, 3955, 87, 3971, 4015, 87, 3962, 3963,
+ 3970, 3968, 3972, 3957, 3958, 3961, 87, 3976, 3960, 87,
+ 87, 3969, 87, 3974, 87, 3965, 3973, 3967, 3966, 87,
+ 3978, 87, 3971, 3977, 87, 3975, 87, 3970, 3968, 3972,
+
+ 87, 87, 3979, 87, 3976, 3980, 87, 3982, 3969, 3983,
+ 3974, 3981, 3984, 3973, 3987, 87, 87, 3978, 3985, 3986,
+ 3977, 4015, 3975, 3988, 3993, 4015, 4015, 87, 87, 3979,
+ 3991, 87, 3980, 3989, 3982, 4015, 87, 3995, 3981, 87,
+ 87, 87, 4015, 87, 87, 3985, 3986, 3990, 3992, 3996,
+ 3988, 87, 87, 87, 3994, 87, 87, 3991, 3997, 87,
+ 3989, 3998, 87, 3999, 3995, 4000, 87, 4003, 4004, 87,
+ 4001, 87, 4002, 4006, 3990, 3992, 3996, 4007, 87, 4009,
+ 87, 3994, 4005, 4008, 4015, 3997, 4010, 4013, 3998, 87,
+ 3999, 4014, 87, 87, 4003, 87, 4015, 4001, 4015, 4002,
+
+ 87, 87, 87, 87, 87, 4015, 4009, 4011, 87, 4005,
+ 4008, 4012, 4015, 4010, 87, 87, 4015, 4015, 87, 87,
+ 4015, 4015, 4015, 4015, 4015, 4015, 4015, 4015, 4015, 4015,
+ 4015, 4015, 4015, 4015, 4011, 4015, 4015, 4015, 4012, 48,
+ 48, 48, 48, 48, 48, 48, 53, 53, 53, 53,
+ 53, 53, 53, 58, 58, 58, 58, 58, 58, 58,
+ 64, 64, 64, 64, 64, 64, 64, 69, 69, 69,
+ 69, 69, 69, 69, 75, 75, 75, 75, 75, 75,
+ 75, 81, 81, 81, 81, 81, 81, 81, 90, 90,
+ 4015, 90, 90, 90, 90, 165, 165, 4015, 4015, 4015,
+
+ 165, 165, 167, 167, 4015, 4015, 167, 4015, 167, 169,
+ 4015, 4015, 4015, 4015, 4015, 169, 172, 172, 4015, 4015,
+ 4015, 172, 172, 174, 4015, 4015, 4015, 4015, 4015, 174,
+ 176, 176, 4015, 176, 176, 176, 176, 179, 4015, 4015,
+ 4015, 4015, 4015, 179, 182, 182, 4015, 4015, 4015, 182,
+ 182, 91, 91, 4015, 91, 91, 91, 91, 17, 4015,
+ 4015, 4015, 4015, 4015, 4015, 4015, 4015, 4015, 4015, 4015,
+ 4015, 4015, 4015, 4015, 4015, 4015, 4015, 4015, 4015, 4015,
+ 4015, 4015, 4015, 4015, 4015, 4015, 4015, 4015, 4015, 4015,
+ 4015, 4015, 4015, 4015, 4015, 4015, 4015, 4015, 4015, 4015,
+
+ 4015, 4015, 4015, 4015, 4015, 4015, 4015, 4015, 4015, 4015,
+ 4015, 4015, 4015, 4015, 4015, 4015, 4015, 4015, 4015, 4015,
+ 4015, 4015, 4015, 4015, 4015
} ;
-static const flex_int16_t yy_chk[11245] =
+static const flex_int16_t yy_chk[11526] =
{ 0,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
@@ -2969,1232 +3033,1263 @@ static const flex_int16_t yy_chk[11245] =
7, 7, 7, 33, 7, 8, 8, 8, 8, 32,
8, 9, 9, 9, 10, 10, 10, 19, 52, 52,
- 3928, 19, 235, 3, 32, 33, 4, 68, 68, 5,
- 33, 6, 3195, 13, 13, 13, 13, 7, 13, 14,
+ 4023, 19, 238, 3, 32, 33, 4, 68, 68, 5,
+ 33, 6, 3247, 13, 13, 13, 13, 7, 13, 14,
14, 14, 14, 8, 14, 15, 15, 15, 9, 25,
- 235, 10, 11, 11, 11, 11, 11, 11, 12, 12,
+ 238, 10, 11, 11, 11, 11, 11, 11, 12, 12,
12, 12, 12, 12, 16, 16, 16, 34, 28, 85,
- 85, 13, 11, 46, 3169, 25, 25, 14, 12, 34,
- 39, 23, 15, 23, 23, 46, 23, 1212, 28, 611,
- 11, 28, 23, 39, 34, 28, 12, 180, 88, 11,
- 46, 16, 88, 164, 164, 12, 30, 39, 29, 179,
- 45, 177, 37, 73, 30, 28, 26, 611, 37, 23,
+ 85, 13, 11, 46, 1235, 25, 25, 14, 12, 34,
+ 310, 23, 15, 23, 23, 46, 23, 1222, 28, 88,
+ 11, 28, 23, 88, 34, 28, 12, 166, 166, 11,
+ 46, 16, 173, 173, 57, 12, 30, 57, 29, 310,
+ 45, 182, 37, 73, 30, 28, 26, 1222, 37, 23,
- 24, 24, 29, 26, 24, 30, 73, 26, 102, 24,
+ 24, 24, 29, 26, 24, 30, 73, 26, 181, 24,
26, 24, 30, 30, 29, 29, 45, 45, 24, 37,
- 73, 30, 26, 26, 24, 93, 102, 24, 24, 29,
- 26, 24, 30, 200, 26, 102, 24, 26, 24, 57,
- 94, 166, 57, 306, 166, 24, 27, 225, 31, 93,
- 27, 31, 93, 27, 95, 27, 27, 228, 31, 47,
- 31, 47, 47, 94, 47, 200, 27, 94, 27, 172,
- 47, 31, 306, 27, 95, 31, 35, 27, 31, 225,
- 27, 95, 27, 27, 35, 31, 101, 31, 36, 228,
- 35, 98, 36, 27, 35, 101, 44, 170, 98, 42,
-
- 44, 42, 35, 35, 44, 96, 36, 169, 36, 167,
- 42, 35, 165, 101, 36, 36, 42, 35, 98, 36,
- 96, 35, 44, 44, 43, 42, 42, 44, 42, 109,
- 163, 44, 96, 36, 43, 36, 38, 42, 43, 43,
- 38, 97, 109, 42, 38, 171, 171, 43, 86, 97,
- 38, 43, 63, 38, 63, 63, 109, 63, 99, 106,
- 38, 43, 38, 38, 106, 43, 43, 38, 97, 81,
- 71, 38, 71, 71, 113, 71, 74, 38, 74, 74,
- 38, 74, 99, 113, 76, 99, 106, 38, 40, 143,
- 143, 80, 40, 80, 80, 87, 80, 87, 87, 139,
-
- 87, 113, 40, 40, 100, 40, 87, 90, 71, 90,
- 90, 114, 90, 107, 40, 40, 143, 100, 90, 40,
- 114, 107, 103, 103, 75, 139, 139, 69, 100, 40,
- 40, 100, 40, 41, 111, 103, 41, 64, 114, 115,
- 107, 111, 110, 41, 100, 90, 104, 41, 41, 103,
- 103, 110, 104, 108, 104, 41, 105, 105, 181, 181,
- 41, 111, 115, 41, 110, 105, 115, 104, 117, 110,
- 41, 108, 127, 104, 41, 41, 120, 59, 110, 104,
- 118, 104, 116, 105, 105, 108, 112, 112, 119, 116,
- 117, 119, 127, 118, 112, 117, 355, 122, 108, 127,
-
- 120, 58, 112, 121, 119, 119, 129, 118, 120, 116,
- 53, 121, 119, 112, 112, 119, 123, 122, 119, 122,
- 123, 112, 125, 126, 122, 355, 129, 120, 131, 124,
- 121, 119, 119, 129, 124, 125, 123, 124, 128, 130,
- 123, 132, 131, 123, 122, 128, 126, 123, 132, 125,
- 126, 133, 128, 134, 135, 131, 124, 130, 136, 48,
- 137, 124, 134, 123, 137, 128, 130, 136, 132, 138,
- 137, 18, 128, 17, 133, 141, 138, 135, 133, 140,
- 134, 135, 137, 142, 141, 136, 140, 137, 145, 148,
- 141, 137, 144, 146, 241, 142, 138, 137, 141, 145,
-
- 144, 147, 141, 145, 148, 149, 140, 146, 241, 147,
- 142, 141, 145, 151, 230, 145, 148, 141, 150, 144,
- 146, 241, 149, 0, 151, 149, 145, 152, 153, 150,
- 145, 149, 149, 147, 153, 152, 147, 154, 150, 0,
- 151, 155, 156, 157, 158, 150, 230, 0, 154, 149,
- 155, 159, 149, 160, 152, 153, 150, 156, 161, 158,
- 159, 162, 155, 0, 154, 157, 155, 0, 155, 156,
- 157, 158, 0, 183, 162, 160, 161, 155, 159, 168,
- 160, 168, 168, 176, 168, 161, 182, 183, 162, 155,
- 173, 0, 173, 173, 174, 173, 174, 174, 178, 174,
-
- 178, 178, 184, 178, 185, 183, 188, 176, 182, 0,
- 176, 184, 190, 182, 183, 186, 185, 187, 189, 186,
- 190, 192, 188, 191, 187, 194, 0, 193, 195, 184,
- 233, 185, 174, 188, 193, 191, 187, 189, 197, 190,
- 197, 194, 186, 192, 187, 189, 195, 196, 192, 198,
- 191, 187, 194, 196, 193, 195, 199, 204, 199, 206,
- 201, 205, 233, 203, 201, 197, 205, 206, 1035, 809,
- 207, 198, 204, 208, 211, 236, 198, 0, 218, 196,
- 196, 201, 199, 199, 204, 199, 206, 218, 201, 203,
- 203, 201, 207, 205, 210, 208, 209, 207, 809, 1035,
-
- 208, 210, 211, 215, 212, 218, 211, 236, 201, 202,
- 216, 209, 213, 214, 202, 0, 215, 224, 0, 202,
- 219, 210, 216, 209, 214, 202, 202, 212, 224, 211,
- 215, 212, 202, 220, 213, 217, 202, 216, 217, 213,
- 214, 202, 219, 0, 224, 222, 202, 219, 226, 223,
- 217, 229, 202, 202, 0, 220, 223, 227, 229, 231,
- 220, 237, 217, 250, 0, 217, 221, 222, 227, 221,
- 238, 221, 222, 231, 226, 226, 223, 234, 229, 240,
- 232, 250, 242, 221, 237, 221, 232, 243, 237, 227,
- 250, 231, 221, 221, 243, 227, 221, 244, 221, 234,
-
- 231, 239, 238, 242, 234, 248, 239, 232, 245, 242,
- 221, 240, 221, 246, 243, 247, 246, 245, 244, 248,
- 252, 249, 245, 253, 244, 251, 239, 255, 239, 256,
- 253, 252, 248, 239, 247, 245, 254, 251, 256, 257,
- 246, 254, 247, 249, 245, 259, 258, 252, 249, 255,
- 253, 258, 251, 261, 255, 262, 256, 263, 260, 260,
- 0, 264, 257, 268, 263, 265, 257, 260, 254, 261,
- 266, 267, 269, 258, 270, 271, 273, 259, 266, 272,
- 261, 275, 270, 264, 263, 260, 260, 262, 264, 273,
- 265, 267, 265, 274, 272, 268, 277, 266, 267, 276,
-
- 278, 270, 281, 273, 269, 279, 272, 271, 275, 279,
- 0, 280, 286, 283, 284, 282, 285, 278, 280, 274,
- 274, 283, 276, 285, 281, 278, 288, 278, 277, 281,
- 282, 276, 279, 284, 286, 289, 290, 291, 280, 286,
- 283, 284, 282, 285, 278, 293, 287, 292, 288, 276,
- 287, 294, 295, 288, 297, 303, 299, 296, 298, 291,
- 300, 301, 300, 294, 291, 295, 296, 289, 290, 292,
- 302, 298, 297, 287, 292, 299, 304, 293, 294, 295,
- 303, 297, 303, 299, 296, 298, 305, 300, 308, 307,
- 0, 309, 0, 301, 302, 310, 312, 302, 307, 0,
-
- 0, 313, 304, 304, 318, 311, 310, 314, 315, 320,
- 322, 324, 305, 305, 308, 308, 307, 309, 309, 311,
- 312, 316, 310, 312, 313, 314, 315, 319, 313, 316,
- 321, 311, 311, 323, 314, 315, 318, 324, 324, 325,
- 319, 320, 322, 326, 327, 328, 311, 332, 316, 0,
- 323, 331, 328, 329, 319, 321, 323, 321, 330, 333,
- 323, 325, 329, 0, 330, 331, 325, 335, 327, 342,
- 334, 375, 328, 332, 332, 326, 327, 323, 331, 334,
- 329, 336, 337, 333, 338, 330, 333, 339, 340, 336,
- 335, 337, 341, 343, 335, 327, 339, 334, 344, 0,
-
- 346, 342, 348, 375, 350, 340, 0, 341, 336, 337,
- 338, 338, 340, 344, 339, 340, 351, 343, 346, 341,
- 343, 0, 380, 357, 348, 344, 347, 346, 350, 348,
- 351, 350, 340, 345, 356, 347, 352, 354, 345, 353,
- 353, 345, 354, 351, 0, 359, 345, 345, 345, 345,
- 357, 352, 0, 347, 380, 0, 345, 359, 356, 360,
- 345, 356, 362, 352, 353, 345, 353, 353, 345, 354,
- 364, 360, 359, 345, 345, 345, 345, 349, 358, 349,
- 362, 358, 363, 0, 361, 361, 360, 366, 358, 362,
- 367, 349, 349, 349, 361, 349, 368, 364, 368, 365,
-
- 363, 349, 370, 369, 349, 358, 349, 0, 358, 363,
- 371, 361, 361, 366, 366, 369, 367, 367, 349, 349,
- 349, 365, 349, 368, 370, 371, 365, 372, 374, 370,
- 369, 373, 378, 0, 376, 372, 376, 371, 373, 378,
- 374, 0, 379, 381, 382, 376, 0, 0, 385, 383,
- 382, 383, 376, 389, 372, 374, 387, 1199, 373, 378,
- 376, 376, 384, 376, 379, 381, 382, 388, 386, 379,
- 381, 382, 376, 383, 387, 384, 383, 382, 383, 376,
- 385, 386, 390, 387, 386, 389, 386, 1199, 391, 384,
- 394, 0, 386, 388, 388, 386, 395, 394, 405, 406,
-
- 396, 0, 0, 405, 0, 400, 0, 397, 386, 390,
- 391, 386, 396, 386, 395, 391, 392, 394, 392, 397,
- 395, 400, 398, 395, 392, 401, 0, 396, 392, 400,
- 405, 406, 400, 392, 397, 398, 392, 0, 401, 0,
- 404, 395, 392, 392, 403, 392, 0, 407, 400, 398,
- 410, 392, 401, 408, 407, 392, 403, 413, 404, 408,
- 392, 409, 410, 392, 393, 411, 393, 404, 407, 409,
- 412, 403, 415, 415, 407, 426, 414, 410, 412, 393,
- 408, 407, 393, 411, 393, 414, 393, 418, 409, 413,
- 393, 393, 411, 393, 416, 417, 418, 412, 0, 415,
-
- 0, 416, 433, 414, 433, 420, 393, 426, 417, 393,
- 421, 393, 420, 393, 402, 402, 419, 421, 422, 418,
- 427, 416, 417, 418, 402, 402, 402, 402, 402, 433,
- 422, 402, 420, 428, 419, 423, 425, 421, 419, 402,
- 428, 402, 402, 419, 424, 422, 427, 427, 425, 429,
- 430, 402, 402, 402, 402, 402, 431, 423, 402, 430,
- 428, 419, 423, 425, 429, 432, 424, 434, 435, 431,
- 0, 424, 436, 436, 0, 437, 429, 430, 434, 438,
- 439, 440, 437, 431, 442, 441, 438, 0, 443, 0,
- 435, 439, 440, 445, 434, 435, 447, 432, 441, 444,
-
- 444, 436, 437, 455, 0, 0, 438, 439, 440, 442,
- 443, 442, 441, 446, 450, 443, 445, 444, 449, 452,
- 445, 448, 447, 447, 444, 450, 444, 444, 446, 448,
- 449, 457, 452, 451, 456, 455, 446, 453, 453, 458,
- 446, 450, 451, 460, 444, 449, 452, 463, 448, 453,
- 459, 453, 456, 457, 469, 446, 453, 461, 457, 462,
- 451, 456, 458, 461, 453, 453, 458, 465, 459, 464,
- 463, 467, 0, 473, 463, 460, 453, 459, 453, 454,
- 462, 469, 470, 466, 461, 468, 462, 454, 454, 465,
- 466, 454, 454, 464, 465, 454, 464, 467, 467, 468,
-
- 472, 454, 471, 474, 470, 473, 454, 477, 475, 470,
- 466, 476, 468, 477, 454, 454, 471, 478, 454, 454,
- 479, 481, 454, 476, 480, 474, 472, 472, 483, 471,
- 474, 475, 480, 482, 477, 475, 481, 483, 476, 478,
- 482, 484, 479, 485, 478, 0, 486, 479, 481, 487,
- 480, 480, 486, 488, 489, 483, 484, 490, 0, 480,
- 482, 491, 497, 492, 0, 494, 0, 485, 484, 495,
- 485, 487, 490, 486, 495, 488, 487, 489, 498, 501,
- 488, 489, 503, 493, 490, 492, 505, 491, 491, 493,
- 492, 494, 494, 500, 497, 502, 495, 504, 501, 500,
-
- 503, 502, 507, 504, 498, 498, 501, 506, 505, 503,
- 493, 517, 510, 505, 506, 512, 509, 507, 509, 511,
- 500, 510, 502, 513, 504, 509, 511, 514, 516, 507,
- 515, 518, 0, 517, 506, 523, 513, 519, 517, 510,
- 519, 520, 521, 509, 518, 509, 511, 512, 515, 522,
- 513, 524, 527, 523, 526, 521, 519, 515, 518, 514,
- 516, 522, 523, 525, 519, 520, 528, 519, 520, 521,
- 525, 0, 529, 532, 531, 527, 522, 530, 526, 528,
- 531, 526, 530, 524, 527, 533, 534, 536, 0, 0,
- 525, 535, 0, 528, 529, 533, 532, 539, 538, 529,
-
- 532, 531, 527, 535, 530, 537, 538, 544, 534, 536,
- 542, 539, 533, 534, 536, 543, 537, 542, 535, 544,
- 545, 543, 546, 547, 539, 538, 569, 0, 548, 580,
- 546, 569, 537, 540, 544, 0, 574, 542, 540, 548,
- 540, 549, 543, 545, 551, 547, 540, 545, 540, 546,
- 547, 540, 540, 569, 552, 548, 551, 574, 540, 540,
- 540, 580, 550, 574, 549, 540, 550, 540, 549, 553,
- 554, 551, 553, 540, 552, 540, 552, 555, 540, 540,
- 553, 552, 0, 556, 550, 540, 559, 555, 554, 550,
- 559, 557, 558, 550, 561, 556, 553, 554, 560, 553,
-
- 563, 552, 557, 564, 562, 560, 562, 565, 585, 555,
- 556, 566, 0, 559, 555, 564, 558, 567, 557, 558,
- 561, 561, 565, 566, 568, 560, 563, 563, 570, 571,
- 564, 562, 568, 572, 565, 577, 573, 576, 566, 581,
- 585, 572, 578, 567, 567, 579, 582, 571, 573, 583,
- 570, 568, 576, 577, 581, 570, 571, 583, 582, 586,
- 572, 584, 577, 573, 576, 578, 581, 588, 579, 578,
- 587, 586, 579, 582, 584, 589, 583, 591, 590, 587,
- 591, 592, 593, 594, 595, 596, 586, 597, 584, 589,
- 588, 598, 0, 0, 588, 601, 599, 587, 603, 595,
-
- 592, 600, 589, 590, 591, 590, 598, 601, 592, 593,
- 602, 595, 604, 612, 600, 594, 606, 596, 598, 597,
- 599, 603, 601, 599, 605, 603, 608, 606, 600, 609,
- 607, 605, 602, 610, 605, 607, 604, 602, 613, 604,
- 608, 614, 605, 606, 615, 612, 617, 616, 618, 0,
- 620, 605, 616, 608, 618, 617, 609, 619, 605, 621,
- 610, 605, 607, 622, 623, 613, 629, 625, 614, 624,
- 642, 622, 619, 617, 620, 618, 615, 620, 626, 616,
- 627, 621, 626, 623, 619, 628, 621, 631, 627, 625,
- 622, 623, 630, 624, 625, 632, 624, 636, 629, 630,
-
- 634, 633, 642, 635, 632, 626, 0, 627, 628, 636,
- 631, 637, 628, 634, 631, 638, 0, 637, 639, 630,
- 640, 643, 632, 633, 636, 641, 639, 634, 633, 635,
- 635, 640, 641, 644, 650, 646, 669, 638, 637, 647,
- 649, 648, 638, 643, 646, 639, 644, 640, 643, 645,
- 648, 649, 641, 651, 645, 655, 650, 645, 645, 652,
- 644, 650, 646, 669, 657, 647, 647, 649, 648, 0,
- 653, 656, 652, 645, 0, 651, 645, 658, 0, 661,
- 651, 645, 653, 660, 645, 645, 652, 655, 657, 656,
- 662, 657, 0, 659, 665, 666, 663, 653, 656, 658,
-
- 658, 659, 664, 661, 658, 660, 661, 663, 667, 666,
- 660, 664, 662, 670, 665, 672, 671, 662, 668, 674,
- 659, 665, 666, 663, 671, 668, 658, 673, 675, 664,
- 667, 670, 674, 673, 676, 667, 677, 672, 678, 675,
- 670, 679, 672, 671, 690, 668, 674, 680, 681, 681,
- 0, 677, 676, 682, 673, 675, 684, 683, 685, 686,
- 687, 676, 679, 677, 682, 692, 688, 685, 679, 691,
- 678, 680, 686, 687, 680, 693, 690, 681, 684, 695,
- 682, 683, 689, 684, 683, 685, 686, 687, 688, 696,
- 689, 691, 694, 688, 694, 701, 691, 692, 697, 693,
-
- 696, 695, 693, 697, 698, 0, 695, 699, 703, 689,
- 700, 704, 702, 0, 706, 705, 696, 700, 698, 694,
- 702, 699, 705, 707, 700, 700, 703, 701, 708, 710,
- 697, 698, 700, 704, 699, 703, 712, 700, 704, 702,
- 706, 706, 705, 707, 700, 709, 712, 711, 708, 713,
- 707, 700, 700, 714, 713, 708, 725, 715, 712, 715,
- 709, 710, 711, 712, 716, 718, 0, 717, 720, 709,
- 719, 0, 709, 712, 711, 717, 719, 720, 0, 714,
- 714, 713, 734, 727, 715, 726, 773, 709, 725, 716,
- 718, 716, 718, 721, 717, 720, 722, 719, 723, 728,
-
- 724, 727, 721, 729, 730, 722, 723, 724, 726, 731,
- 727, 728, 726, 730, 734, 729, 0, 731, 773, 732,
- 721, 733, 735, 722, 736, 723, 728, 724, 732, 735,
- 729, 730, 737, 733, 738, 739, 731, 736, 0, 743,
- 741, 739, 738, 732, 740, 742, 732, 737, 733, 735,
- 743, 736, 740, 748, 742, 732, 744, 790, 750, 737,
- 0, 738, 739, 741, 0, 744, 743, 741, 745, 745,
- 746, 740, 742, 747, 749, 748, 751, 745, 746, 752,
- 748, 747, 753, 744, 750, 750, 754, 749, 756, 790,
- 753, 755, 752, 759, 757, 745, 745, 746, 0, 751,
-
- 747, 749, 754, 751, 755, 757, 752, 759, 758, 753,
- 756, 760, 761, 754, 764, 756, 758, 762, 755, 763,
- 759, 757, 763, 765, 766, 768, 0, 767, 0, 769,
- 770, 760, 0, 766, 761, 758, 764, 762, 760, 761,
- 771, 764, 769, 768, 762, 765, 763, 767, 770, 772,
- 765, 766, 768, 774, 767, 775, 769, 770, 771, 777,
- 776, 779, 0, 778, 772, 780, 783, 771, 782, 0,
- 784, 781, 777, 779, 782, 774, 772, 0, 784, 775,
- 774, 778, 775, 776, 781, 786, 777, 776, 779, 780,
- 778, 787, 780, 783, 785, 782, 784, 784, 781, 785,
-
- 789, 793, 791, 797, 792, 784, 794, 786, 789, 787,
- 791, 792, 786, 795, 796, 795, 798, 799, 787, 800,
- 802, 794, 802, 796, 793, 801, 785, 789, 793, 791,
- 803, 792, 813, 794, 801, 797, 799, 803, 0, 800,
- 795, 796, 806, 810, 799, 814, 800, 802, 798, 827,
- 813, 0, 801, 810, 806, 816, 0, 803, 804, 813,
- 816, 804, 818, 817, 820, 804, 814, 821, 804, 806,
- 810, 0, 814, 822, 842, 804, 804, 0, 804, 842,
- 818, 827, 816, 804, 817, 804, 819, 820, 804, 818,
- 817, 820, 804, 821, 821, 804, 823, 819, 824, 822,
-
- 822, 825, 804, 804, 826, 804, 842, 824, 0, 829,
- 0, 826, 823, 819, 825, 830, 829, 832, 831, 834,
- 0, 837, 834, 823, 831, 824, 832, 841, 825, 837,
- 833, 826, 828, 828, 0, 828, 829, 830, 828, 836,
- 835, 0, 830, 828, 832, 831, 834, 838, 837, 828,
- 828, 841, 828, 833, 841, 843, 835, 833, 828, 828,
- 828, 836, 828, 835, 844, 828, 836, 835, 839, 838,
- 828, 840, 845, 840, 838, 843, 828, 828, 846, 828,
- 839, 847, 843, 835, 845, 851, 849, 848, 853, 850,
- 844, 844, 852, 854, 0, 839, 859, 856, 840, 845,
-
- 846, 854, 855, 853, 856, 846, 863, 847, 847, 848,
- 849, 850, 851, 849, 848, 853, 850, 852, 857, 852,
- 854, 858, 859, 859, 856, 855, 857, 860, 861, 855,
- 862, 866, 863, 863, 865, 861, 866, 864, 867, 860,
- 858, 868, 869, 862, 872, 857, 864, 870, 858, 865,
- 873, 874, 870, 877, 860, 861, 879, 862, 866, 875,
- 874, 865, 878, 868, 864, 876, 872, 875, 868, 869,
- 867, 872, 876, 880, 881, 882, 883, 884, 874, 870,
- 886, 885, 873, 888, 878, 877, 875, 887, 879, 878,
- 885, 890, 876, 889, 882, 881, 887, 880, 892, 886,
-
- 880, 881, 882, 883, 884, 888, 891, 886, 885, 892,
- 888, 890, 894, 893, 887, 891, 889, 895, 890, 896,
- 889, 893, 897, 898, 900, 892, 0, 899, 0, 902,
- 903, 904, 900, 891, 904, 895, 899, 906, 896, 894,
- 893, 905, 907, 908, 895, 0, 896, 902, 903, 897,
- 909, 900, 910, 905, 899, 898, 902, 903, 904, 906,
- 907, 911, 912, 911, 906, 910, 916, 908, 905, 907,
- 908, 913, 909, 914, 915, 918, 925, 909, 914, 910,
- 912, 919, 917, 918, 930, 913, 921, 915, 911, 912,
- 924, 930, 916, 916, 917, 921, 922, 920, 913, 919,
-
- 920, 915, 918, 925, 922, 914, 926, 927, 919, 917,
- 928, 930, 926, 921, 929, 924, 928, 924, 931, 0,
- 922, 932, 934, 922, 920, 931, 932, 936, 933, 927,
- 937, 922, 939, 926, 927, 933, 929, 928, 935, 937,
- 934, 929, 935, 938, 940, 931, 941, 942, 932, 934,
- 936, 938, 943, 944, 936, 933, 945, 937, 942, 946,
- 943, 941, 940, 947, 939, 935, 944, 948, 949, 952,
- 938, 940, 954, 941, 942, 951, 947, 945, 946, 943,
- 944, 953, 951, 945, 950, 960, 946, 952, 953, 948,
- 947, 954, 950, 955, 948, 949, 952, 957, 956, 954,
-
- 955, 0, 951, 956, 961, 957, 958, 959, 953, 963,
- 962, 950, 965, 958, 959, 964, 966, 960, 967, 965,
- 955, 0, 968, 962, 957, 956, 973, 969, 964, 971,
- 974, 975, 970, 958, 959, 969, 961, 962, 972, 965,
- 970, 963, 964, 979, 972, 968, 976, 970, 966, 968,
- 967, 971, 973, 973, 969, 977, 971, 978, 981, 970,
- 982, 980, 974, 975, 977, 972, 983, 970, 980, 982,
- 976, 978, 984, 976, 986, 979, 985, 0, 987, 986,
- 983, 988, 977, 989, 978, 981, 992, 982, 980, 985,
- 987, 985, 990, 983, 984, 991, 0, 990, 992, 984,
-
- 985, 993, 991, 985, 988, 987, 986, 994, 988, 989,
- 989, 996, 997, 992, 996, 994, 985, 0, 985, 990,
- 998, 1000, 991, 993, 1002, 997, 1001, 1004, 993, 1005,
- 1002, 998, 0, 1001, 994, 1000, 1008, 1006, 996, 997,
- 0, 1009, 0, 1009, 998, 0, 0, 998, 1000, 1004,
- 0, 1002, 0, 1001, 1004, 1005, 1005, 1007, 998, 1003,
- 1006, 1003, 1012, 1008, 1006, 1003, 0, 1003, 1009, 1007,
- 1010, 1010, 1003, 1011, 1012, 0, 1016, 1003, 1013, 1014,
- 1011, 1016, 1015, 1003, 1007, 1017, 1003, 0, 1003, 1012,
- 0, 1013, 1003, 1010, 1003, 1015, 1022, 1010, 1010, 1003,
-
- 1011, 1014, 1018, 1017, 1003, 1013, 1014, 1019, 1016, 1015,
- 1020, 1022, 1017, 1021, 1023, 1018, 1025, 1021, 1024, 1019,
- 1026, 0, 1020, 1022, 1028, 1027, 1026, 1021, 1029, 1018,
- 1019, 1024, 1030, 1032, 1019, 1031, 1023, 1020, 1027, 1021,
- 1021, 1023, 1028, 1025, 1021, 1024, 1019, 1026, 1033, 1034,
- 1029, 1028, 1027, 1030, 1021, 1029, 1036, 1031, 1037, 1030,
- 1038, 0, 1031, 1037, 1039, 1032, 1041, 1042, 1038, 1043,
- 0, 1044, 0, 1039, 1045, 0, 1034, 1048, 0, 1061,
- 1033, 1041, 1043, 1351, 1351, 1037, 1044, 1038, 1036, 1042,
- 1048, 1039, 1040, 1041, 1042, 1047, 1043, 1040, 1044, 1040,
-
- 1045, 1045, 1049, 1046, 1048, 1040, 1061, 1050, 1051, 1054,
- 1040, 1040, 1351, 1049, 1047, 1052, 1051, 1040, 1040, 1040,
- 1050, 1055, 1047, 1052, 1040, 1046, 1040, 1057, 1053, 1049,
- 1046, 1056, 1040, 1065, 1050, 1051, 1057, 1040, 1040, 1053,
- 1058, 1054, 1052, 1055, 1040, 1062, 1056, 1059, 1055, 1066,
- 1060, 1058, 0, 1063, 1057, 1053, 1059, 1068, 1056, 1060,
- 1063, 1067, 1070, 1071, 1069, 1065, 0, 1058, 1062, 1067,
- 0, 1074, 1062, 1066, 1059, 1072, 1066, 1060, 1069, 1068,
- 1063, 1075, 1076, 1072, 1068, 1071, 1077, 1078, 1067, 1074,
- 1071, 1069, 1079, 1076, 1070, 1080, 1081, 1082, 1074, 1075,
-
- 1079, 1083, 1072, 1081, 1084, 1078, 1085, 1086, 1075, 1076,
- 1082, 1084, 1087, 1090, 1078, 1088, 1089, 1080, 1077, 1079,
- 1098, 1085, 1080, 1081, 1082, 1086, 1089, 1083, 1083, 1092,
- 1087, 1084, 1097, 1085, 1086, 1094, 1088, 1095, 1099, 1087,
- 1092, 1102, 1088, 1089, 1095, 1090, 1099, 1096, 1094, 1096,
- 1100, 1101, 1098, 1102, 1097, 1109, 1092, 1103, 1104, 1097,
- 1101, 1107, 1094, 1100, 1095, 1099, 1110, 1108, 1102, 1111,
- 1112, 0, 1113, 1109, 1096, 0, 1117, 1100, 1101, 1103,
- 1104, 1115, 1109, 1107, 1103, 1104, 1114, 1117, 1107, 1108,
- 1113, 1118, 1110, 1110, 1108, 1115, 1118, 1121, 1114, 1113,
-
- 1125, 1111, 1112, 1117, 1120, 1122, 1123, 1120, 1115, 1121,
- 1124, 1125, 1127, 1114, 1128, 1126, 1130, 1124, 1131, 1123,
- 1132, 1127, 1134, 1118, 1121, 1131, 1129, 1125, 1128, 1122,
- 1120, 1120, 1122, 1123, 1120, 1126, 1137, 1124, 1129, 1127,
- 1138, 1128, 1126, 1133, 1134, 1131, 1135, 1140, 1130, 1134,
- 1139, 0, 1132, 1129, 1141, 1133, 1139, 1142, 1144, 1135,
- 1143, 1145, 1137, 1137, 1138, 1152, 0, 1138, 1142, 1140,
- 1133, 1146, 1148, 1135, 1140, 1150, 1141, 1139, 1143, 1149,
- 1144, 1141, 1153, 1145, 1142, 1144, 1146, 1143, 1145, 1151,
- 1149, 1155, 1154, 1148, 1157, 1151, 1150, 1152, 1146, 1148,
-
- 1155, 1156, 1150, 1158, 1160, 1159, 1149, 1163, 1162, 1153,
- 1154, 1160, 1158, 1159, 1161, 1164, 1151, 1165, 1155, 1154,
- 1157, 1157, 1162, 1166, 1167, 1156, 1168, 1170, 1156, 0,
- 1158, 1160, 1159, 1169, 1172, 1162, 1175, 1174, 1161, 1163,
- 1176, 1161, 1177, 1173, 1174, 1166, 1167, 1164, 1178, 1165,
- 1166, 1167, 1173, 1179, 1180, 1169, 1172, 1182, 1168, 1170,
- 1169, 1172, 1176, 1181, 1174, 1182, 1178, 1176, 1175, 1177,
- 1173, 1179, 1181, 1183, 1184, 1178, 1180, 1185, 0, 1187,
- 1179, 1180, 1194, 1186, 1182, 1190, 1189, 1188, 1187, 1191,
- 1181, 1192, 0, 1185, 1189, 0, 1197, 1183, 1184, 1196,
-
- 1183, 1184, 1188, 1192, 1185, 1186, 1187, 1193, 1195, 1194,
- 1186, 1197, 1196, 1189, 1188, 1198, 1195, 1190, 1192, 1200,
- 1201, 1191, 1202, 1197, 1198, 1203, 1196, 1203, 1200, 1193,
- 1202, 1205, 1206, 1207, 1193, 1195, 1208, 1211, 1201, 1205,
- 1209, 1213, 1198, 1210, 1211, 1214, 1200, 1201, 0, 1202,
- 1206, 1215, 1203, 1216, 1213, 1208, 1217, 1214, 1205, 1206,
- 1207, 1218, 1209, 1208, 1211, 1210, 1215, 1209, 1213, 1219,
- 1210, 1221, 1214, 1218, 1217, 1216, 1222, 1220, 1215, 1223,
- 1216, 0, 1224, 1217, 1220, 1226, 1225, 0, 1218, 1227,
- 0, 0, 1229, 1228, 1224, 1231, 1219, 1225, 1223, 1232,
-
- 1234, 0, 0, 1221, 1220, 1229, 1223, 1226, 1222, 1224,
- 1230, 1232, 1226, 1225, 1227, 1228, 1227, 1231, 1235, 1229,
- 1228, 1233, 1231, 1230, 1234, 1237, 1232, 1234, 1236, 1233,
- 1239, 1240, 0, 1237, 1243, 1242, 1241, 1230, 1235, 1244,
- 1236, 1249, 1246, 1243, 1240, 1235, 1245, 0, 1233, 1246,
- 1251, 1244, 1237, 1242, 1250, 1236, 1252, 1239, 1240, 1241,
- 0, 1243, 1242, 1241, 1249, 1247, 1244, 1245, 1249, 1246,
- 1253, 1254, 1251, 1245, 1247, 1255, 1247, 1251, 1257, 1247,
- 1250, 1250, 1258, 1252, 1256, 1254, 1257, 1247, 1255, 1259,
- 1253, 1258, 1247, 1261, 1264, 1263, 1262, 1253, 1254, 0,
-
- 1266, 1247, 1255, 1247, 1262, 1257, 1247, 1259, 1256, 1258,
- 1263, 1256, 1265, 1266, 1267, 1261, 1259, 1268, 1270, 0,
- 1261, 1271, 1263, 1262, 1272, 1268, 1264, 1266, 1273, 1275,
- 1267, 1274, 1276, 0, 1265, 1273, 0, 1277, 0, 1265,
- 0, 1267, 1278, 1271, 1268, 1270, 1272, 1282, 1271, 1277,
- 1276, 1272, 1275, 1274, 1278, 1273, 1275, 1279, 1274, 1276,
- 1281, 1280, 1283, 1284, 1277, 1279, 1286, 1282, 1288, 1278,
- 1280, 1284, 1281, 1285, 1282, 1286, 1289, 1283, 1287, 1285,
- 1288, 1290, 0, 1300, 1279, 1280, 0, 1281, 1280, 1283,
- 1284, 1291, 1289, 1286, 1292, 1288, 1293, 1280, 1291, 1287,
-
- 1285, 1292, 1295, 1289, 1294, 1287, 1298, 1296, 1298, 1297,
- 1295, 1303, 1299, 1290, 1293, 1300, 1294, 1297, 1291, 1301,
- 1304, 1292, 1296, 1293, 1299, 1305, 1301, 1310, 1307, 1295,
- 1306, 1294, 1304, 1298, 1296, 1307, 1297, 1308, 1305, 1299,
- 1309, 1319, 1310, 1303, 1314, 1311, 1301, 1304, 1308, 1306,
- 1311, 1312, 1305, 1313, 1310, 1307, 1315, 1306, 1314, 1312,
- 1317, 0, 1309, 1318, 1308, 0, 1313, 1309, 1320, 1324,
- 1322, 1314, 0, 1319, 1317, 0, 1321, 1311, 1312, 0,
- 1313, 1318, 1315, 1315, 1316, 1325, 1323, 1317, 1316, 0,
- 1318, 1316, 1316, 1322, 1320, 1320, 1316, 1322, 1321, 1326,
-
- 0, 1324, 1316, 1321, 1323, 1327, 1316, 1325, 1328, 1333,
- 1316, 1316, 1325, 1323, 1328, 1316, 1329, 0, 1316, 1316,
- 1330, 1326, 1330, 1316, 1334, 0, 1326, 1331, 1332, 1316,
- 1336, 1327, 1327, 1316, 1331, 1328, 1335, 1332, 1337, 1338,
- 1339, 1333, 1329, 1329, 1330, 1337, 1341, 1330, 1336, 1330,
- 1340, 1343, 1342, 1339, 1331, 1332, 1334, 1336, 1344, 1340,
- 1335, 1338, 1346, 1335, 1345, 1337, 1338, 1339, 1348, 1349,
- 0, 1354, 0, 1342, 0, 0, 1346, 1340, 1341, 1342,
- 1344, 1350, 1349, 1343, 1352, 1344, 0, 1345, 1358, 1346,
- 1348, 1345, 1347, 1355, 1354, 1348, 1349, 1347, 1354, 1347,
-
- 1352, 1347, 1356, 1347, 1357, 1355, 1358, 1350, 1350, 1356,
- 1347, 1352, 1359, 1357, 1360, 1358, 1361, 1359, 1362, 1347,
- 1355, 1365, 1364, 1362, 1347, 1363, 1347, 1368, 1347, 1356,
- 1347, 1357, 1360, 1370, 1361, 1364, 1369, 1372, 1366, 1365,
- 1368, 1360, 1367, 1361, 1359, 1362, 1366, 1363, 1365, 1364,
- 1367, 1371, 1363, 1374, 1368, 1376, 1372, 1373, 1375, 1370,
- 1370, 1377, 0, 1378, 1372, 1366, 1371, 1380, 1369, 1367,
- 1373, 1375, 1378, 1376, 1379, 1374, 1379, 1381, 1371, 1382,
- 1374, 1377, 1376, 1383, 1373, 1375, 1384, 1385, 1377, 1380,
- 1378, 1382, 1387, 1388, 1380, 1389, 1391, 1393, 1392, 1390,
-
- 0, 1379, 1394, 1389, 1381, 1392, 1382, 1399, 1384, 1395,
- 1383, 1404, 1385, 1384, 1385, 1388, 1387, 1390, 0, 1387,
- 1388, 1396, 1389, 1391, 1393, 1392, 1390, 1396, 1394, 1394,
- 1400, 1395, 1397, 1398, 1399, 1401, 1395, 1400, 1397, 1398,
- 1402, 1405, 1403, 1404, 0, 1401, 1407, 1406, 1396, 1403,
- 1413, 1410, 1408, 0, 1411, 1427, 1412, 1400, 1415, 1397,
- 1398, 1408, 1401, 1405, 1402, 1406, 1411, 1402, 1405, 1403,
- 1412, 1407, 1413, 1407, 1406, 1410, 1414, 1413, 1410, 1408,
- 1415, 1411, 1416, 1412, 1417, 1415, 1418, 1427, 1420, 1414,
- 1419, 1422, 1428, 1425, 1421, 0, 1431, 0, 1423, 0,
-
- 1422, 1416, 1424, 1414, 1429, 1430, 1417, 1425, 1435, 1416,
- 1418, 1417, 1419, 1418, 1420, 1420, 1421, 1419, 1422, 1423,
- 1425, 1421, 1424, 1432, 1428, 1423, 1429, 1430, 1431, 1424,
- 1433, 1429, 1430, 1434, 1439, 1435, 1436, 1437, 1433, 1440,
- 1442, 1432, 1441, 1436, 1437, 1445, 1443, 1444, 1440, 1434,
- 1432, 1444, 1442, 1443, 1446, 1447, 1439, 1433, 1450, 1441,
- 1434, 1439, 1448, 1436, 1437, 1454, 1440, 1442, 1456, 1441,
- 0, 1453, 0, 1443, 1444, 1451, 1447, 1445, 1448, 1452,
- 1455, 1451, 1447, 1456, 1459, 1452, 1446, 1455, 1451, 1448,
- 1450, 1457, 1452, 1453, 1458, 1456, 1462, 1454, 1453, 1461,
-
- 1463, 1461, 1451, 1458, 1457, 1462, 1452, 1455, 1451, 1460,
- 1459, 1459, 1452, 1465, 0, 1464, 1460, 1467, 1457, 1470,
- 1469, 1458, 1463, 1462, 1464, 1466, 1461, 1463, 1469, 1466,
- 1472, 1471, 1470, 1474, 1473, 1472, 1460, 1475, 1477, 1467,
- 1465, 1476, 1464, 1473, 1467, 1471, 1470, 1469, 0, 1481,
- 1477, 1474, 1466, 1480, 1476, 1484, 1475, 0, 1471, 1482,
- 1474, 1473, 1472, 1478, 1475, 1477, 1478, 1479, 1476, 1486,
- 1479, 1480, 1482, 1485, 1481, 1478, 1481, 1488, 0, 1487,
- 1480, 1492, 1488, 1489, 1485, 1493, 1482, 1484, 1507, 1479,
- 1478, 1489, 1486, 1478, 1479, 1487, 1486, 1479, 1490, 1490,
-
- 1485, 1494, 1491, 1492, 1495, 1497, 1487, 1493, 1492, 1488,
- 1489, 1491, 1493, 1495, 1496, 1498, 1504, 1500, 0, 1503,
- 1507, 1496, 1498, 1494, 1501, 1490, 1502, 1497, 1494, 1491,
- 1500, 1495, 1497, 1501, 1508, 1502, 0, 0, 1505, 1504,
- 1506, 1496, 1498, 1504, 1500, 1503, 1503, 1505, 1506, 1508,
- 1510, 1501, 1509, 1502, 1512, 1511, 1514, 1513, 1510, 1519,
- 1516, 1508, 1523, 1509, 1514, 1505, 1512, 1506, 1511, 1513,
- 1515, 1517, 1519, 1521, 1523, 1522, 1518, 1510, 1524, 1509,
- 1516, 1512, 1511, 1514, 1513, 1518, 1519, 1516, 1520, 1523,
- 1526, 1521, 1515, 1517, 1520, 1527, 1524, 1515, 1517, 1525,
-
- 1521, 1522, 1522, 1518, 1528, 1524, 1525, 1529, 1531, 1536,
- 1537, 1530, 1532, 1533, 0, 1520, 1526, 1526, 1538, 1534,
- 1529, 1535, 0, 0, 1533, 1534, 1525, 1527, 1539, 0,
- 1540, 1542, 1546, 1532, 1529, 1531, 1528, 1530, 1530, 1532,
- 1533, 1536, 1537, 1535, 1543, 1544, 1534, 1546, 1535, 1540,
- 1538, 1540, 1545, 1547, 1539, 1539, 1540, 1540, 1542, 1546,
- 1550, 1545, 1548, 1544, 1549, 0, 1547, 1543, 1551, 1552,
- 1553, 1543, 1544, 1555, 1548, 1551, 1540, 1554, 1540, 1545,
- 1547, 1555, 1558, 0, 1549, 1560, 1550, 1550, 1552, 1548,
- 1554, 1549, 1553, 1556, 1557, 1551, 1552, 1553, 1556, 1557,
-
- 1555, 1559, 1561, 1563, 1554, 1558, 1562, 1565, 1559, 1558,
- 1561, 1560, 1560, 1564, 1562, 1565, 1566, 1568, 1567, 1569,
- 1574, 1563, 1577, 1566, 1571, 1556, 1557, 1567, 1559, 1561,
- 1563, 1571, 1572, 1562, 1565, 1564, 1573, 1573, 1570, 1576,
- 1564, 1569, 1575, 1566, 1572, 1567, 1569, 1570, 1578, 1568,
- 1575, 1571, 1574, 1579, 1577, 1586, 1578, 0, 1587, 1572,
- 1576, 1584, 1580, 1573, 1581, 1570, 1576, 1586, 1582, 1575,
- 1580, 1579, 1581, 1583, 1584, 1578, 1582, 1585, 1588, 1589,
- 1579, 1583, 1586, 1585, 1587, 1587, 1590, 1589, 1584, 1580,
- 1592, 1581, 1591, 1593, 1590, 1582, 1594, 1596, 1595, 0,
-
- 1583, 0, 1588, 1597, 1585, 1588, 1589, 1591, 1598, 1603,
- 0, 1596, 1600, 1590, 1599, 1597, 1600, 1592, 1594, 1591,
- 1593, 1595, 1602, 1594, 1596, 1595, 1598, 0, 1599, 1600,
- 1597, 1602, 1604, 1603, 1605, 1598, 1603, 1600, 1606, 1600,
- 1607, 1599, 1608, 1600, 1609, 1606, 1605, 1610, 1611, 1602,
- 1612, 1607, 1613, 0, 1604, 1615, 1600, 1621, 1614, 1604,
- 1611, 1605, 0, 1616, 1612, 1606, 1609, 1607, 1622, 1608,
- 1619, 1609, 1626, 1630, 1617, 1611, 1628, 1612, 1615, 1610,
- 1614, 1617, 1615, 1618, 1613, 1614, 1616, 1620, 1619, 1621,
- 1616, 1624, 1618, 1627, 1620, 1622, 1629, 1619, 1628, 1627,
-
- 1624, 1617, 1631, 1628, 1626, 1630, 1633, 1635, 1636, 1631,
- 1618, 1642, 1641, 1637, 1620, 1638, 1639, 1642, 1624, 1644,
- 1627, 1643, 1629, 1629, 1637, 1645, 1638, 1639, 1643, 1631,
- 1646, 1635, 1645, 1633, 1635, 1636, 1641, 1644, 1642, 1641,
- 1637, 1647, 1638, 1639, 1648, 1650, 1644, 1649, 1643, 1651,
- 1648, 1652, 1645, 1647, 1653, 1649, 1646, 1646, 1656, 1654,
- 1655, 1657, 1651, 1657, 1659, 1660, 1658, 1650, 1647, 1655,
- 1656, 1648, 1650, 1658, 1649, 1661, 1651, 1654, 1660, 1662,
- 1653, 1653, 1663, 1652, 1661, 1656, 1654, 1655, 1657, 1664,
- 1659, 1659, 1660, 1658, 1663, 1665, 1666, 0, 1667, 1668,
-
- 1669, 1662, 1661, 1666, 1668, 1670, 1662, 1671, 1669, 1663,
- 1675, 1672, 1676, 1673, 1678, 1677, 1664, 1676, 1665, 1672,
- 1680, 1670, 1665, 1666, 1667, 1667, 1668, 1669, 1678, 1679,
- 1671, 1680, 1670, 1682, 1671, 1673, 1681, 1675, 1672, 1677,
- 1673, 1678, 1677, 1687, 1676, 1681, 1682, 1680, 1684, 1683,
- 1683, 1679, 1685, 1686, 1685, 1689, 1679, 1683, 1694, 1688,
- 1682, 1684, 1689, 1681, 1692, 1690, 1691, 1706, 1700, 1687,
- 1687, 1686, 1695, 1691, 1696, 1684, 1683, 1683, 1698, 1685,
- 1686, 1688, 1689, 1702, 1699, 1694, 1688, 1690, 1692, 1693,
- 1695, 1692, 1690, 1691, 1706, 1697, 1696, 1693, 1703, 1695,
-
- 1700, 1696, 1697, 1698, 1705, 1698, 1699, 1701, 1709, 0,
- 1707, 1699, 1710, 1708, 1701, 1702, 1693, 1705, 1707, 1712,
- 1703, 1708, 1697, 1713, 1718, 1703, 1713, 1714, 0, 1715,
- 1709, 1705, 1716, 1710, 1701, 1709, 1718, 1707, 1717, 1710,
- 1708, 1712, 1719, 0, 1720, 1716, 1712, 1717, 1721, 1722,
- 1713, 1718, 1726, 1714, 1714, 1715, 1715, 1721, 1724, 1716,
- 1723, 1724, 1725, 0, 1722, 1717, 1719, 1723, 1727, 1719,
- 1720, 1720, 1733, 1724, 1730, 1721, 1722, 1725, 1728, 1734,
- 1735, 1731, 1724, 1735, 1726, 1724, 1739, 1723, 1724, 1725,
- 1727, 1732, 1730, 1732, 1728, 1727, 1733, 1736, 1737, 1733,
-
- 1724, 1730, 1728, 1731, 1738, 1728, 1734, 1735, 1731, 1740,
- 1741, 1742, 1739, 1739, 1743, 0, 1744, 1746, 1732, 1745,
- 1748, 1728, 1749, 1747, 1746, 1744, 1738, 1745, 1743, 1736,
- 1737, 1738, 1750, 1742, 1751, 1740, 1740, 1752, 1742, 1755,
- 1754, 1743, 1741, 1744, 1746, 1753, 1745, 1747, 1756, 1753,
- 1747, 1757, 1748, 0, 1749, 1760, 1751, 0, 1758, 1759,
- 1757, 1751, 1754, 1760, 1750, 1758, 1755, 1754, 1762, 1752,
- 1756, 1759, 1753, 1761, 1763, 1756, 1764, 1768, 1757, 1765,
- 1761, 1762, 1760, 1769, 1767, 1758, 1759, 1763, 1765, 1764,
- 1766, 1769, 1766, 1770, 1772, 1762, 1775, 1773, 0, 0,
-
- 1761, 1763, 1768, 1764, 1768, 1774, 1765, 1767, 1776, 1772,
- 1769, 1767, 1773, 1770, 1777, 1776, 1778, 1766, 1779, 1774,
- 1770, 1772, 1780, 1778, 1773, 1777, 1781, 1784, 1775, 1782,
- 1785, 1779, 1774, 1786, 0, 1776, 1787, 1785, 1788, 1791,
- 1780, 1777, 1791, 1778, 0, 1779, 1780, 1782, 1790, 1780,
- 1789, 1787, 1781, 1781, 1784, 1786, 1782, 1785, 1793, 1792,
- 1786, 1790, 1789, 1787, 1788, 1788, 1791, 1780, 1792, 1794,
- 1795, 1796, 1797, 1801, 1796, 1790, 1793, 1789, 1802, 1799,
- 1802, 1794, 1801, 1797, 1799, 1793, 1792, 1804, 1803, 1796,
- 1795, 1799, 1805, 1806, 1807, 1809, 1794, 1795, 1796, 1797,
-
- 1801, 1796, 1808, 1807, 1810, 1802, 1799, 0, 1806, 1811,
- 1812, 1799, 1803, 1813, 1804, 1803, 1816, 1811, 1810, 1805,
- 1806, 1807, 1809, 1814, 1815, 1817, 1808, 1819, 1818, 1808,
- 1815, 1810, 1812, 1817, 1820, 1813, 1811, 1812, 1816, 1818,
- 1813, 1821, 1820, 1816, 1821, 1819, 1822, 1814, 1823, 1822,
- 1814, 1815, 1817, 1824, 1819, 1818, 1825, 1826, 0, 1821,
- 1827, 1820, 1828, 1829, 1833, 1830, 1823, 1827, 1821, 1831,
- 1858, 1821, 1829, 1822, 1832, 1823, 1828, 1826, 1830, 1832,
- 1831, 1839, 1834, 1825, 1826, 1824, 1833, 1827, 1840, 1828,
- 1829, 1833, 1830, 1837, 1838, 1837, 1831, 1834, 1842, 1841,
-
- 0, 1843, 1858, 1838, 1844, 1843, 1832, 1839, 1839, 1834,
- 1841, 1845, 1840, 1846, 1845, 1840, 1842, 1847, 1844, 0,
- 1837, 1838, 0, 1861, 1848, 1842, 1841, 1843, 1843, 1845,
- 1844, 1844, 1843, 1848, 1851, 1846, 1849, 1850, 1845, 1851,
- 1846, 1845, 1849, 1847, 1847, 1844, 1850, 1853, 1855, 1854,
- 1856, 1848, 1857, 1855, 1860, 1861, 1862, 1863, 1859, 1864,
- 1853, 1854, 1870, 1849, 1850, 1857, 1851, 1859, 1865, 1869,
- 1863, 1873, 1856, 1867, 1853, 1855, 1854, 1856, 1862, 1857,
- 1867, 1860, 1869, 1862, 1863, 1859, 1868, 1871, 1875, 1865,
- 1880, 1864, 1872, 1868, 1870, 1865, 1869, 1877, 1872, 1881,
-
- 1867, 1871, 1878, 1873, 1879, 1877, 1883, 1875, 0, 1880,
- 1878, 1888, 1879, 1868, 1871, 1875, 1872, 1880, 1882, 1872,
- 1883, 1881, 1884, 1885, 1877, 1872, 1881, 1891, 1886, 1878,
- 1887, 1879, 1888, 1883, 1889, 1890, 1882, 1885, 1888, 0,
- 1884, 1886, 1892, 1887, 1893, 1882, 1894, 1897, 1898, 1884,
- 1885, 1891, 1895, 1894, 1891, 1886, 1892, 1887, 1899, 1888,
- 1896, 1895, 1898, 0, 1904, 1900, 1889, 1890, 1896, 1892,
- 1900, 1893, 1901, 1894, 1897, 1898, 1902, 1905, 1906, 1895,
- 1907, 1908, 1911, 1901, 1905, 1902, 1914, 1896, 1908, 1909,
- 1899, 1904, 1900, 1910, 1912, 1918, 1916, 1914, 1912, 1901,
-
- 1911, 1906, 1907, 1902, 1905, 1906, 1937, 1907, 1908, 1911,
- 1914, 1909, 1916, 1914, 1917, 1910, 1909, 1920, 1919, 1918,
- 1910, 1912, 1918, 1916, 1914, 1921, 1922, 1923, 1924, 1920,
- 1925, 1928, 1917, 1919, 1922, 1927, 1924, 1926, 1937, 0,
- 1930, 1917, 1923, 0, 1920, 1919, 1929, 1932, 1927, 1933,
- 1931, 1928, 1921, 1922, 1923, 1924, 1933, 1925, 1928, 1926,
- 1930, 1929, 1927, 1932, 1926, 1931, 1938, 1930, 1936, 1940,
- 1935, 1939, 1941, 1929, 1932, 1936, 1933, 1931, 1935, 1942,
- 1939, 1938, 1943, 1944, 1947, 1946, 1949, 1950, 1948, 1943,
- 1940, 1951, 0, 1938, 0, 1936, 1940, 1935, 1939, 1941,
-
- 1948, 1953, 1952, 1942, 1949, 0, 1942, 1946, 1954, 1943,
- 1944, 1972, 1946, 1949, 1955, 1948, 1947, 1952, 1951, 1950,
- 1956, 1955, 1957, 1959, 1958, 1956, 1953, 0, 1953, 1952,
- 1960, 1957, 1954, 1958, 1963, 1954, 1961, 1964, 1962, 0,
- 1965, 1955, 1966, 1972, 1971, 1959, 1963, 1956, 0, 1957,
- 1959, 1958, 1960, 1962, 1961, 1966, 1969, 1960, 1970, 1964,
- 1966, 1963, 1965, 1961, 1964, 1962, 1967, 1965, 1968, 1966,
- 1970, 1971, 1979, 1967, 1973, 1968, 1975, 1978, 1969, 1979,
- 1973, 1976, 1966, 1969, 1977, 1970, 1982, 1975, 1978, 1976,
- 1968, 1980, 1977, 1967, 1981, 1968, 1981, 1983, 1984, 1979,
-
- 1986, 1973, 1968, 1975, 1978, 1987, 1991, 1981, 1976, 1988,
- 1985, 1977, 1982, 1982, 1989, 1988, 1980, 1985, 1980, 1992,
- 1989, 1981, 1990, 1981, 1983, 1984, 1993, 1986, 1990, 1994,
- 1996, 1987, 1987, 1991, 1997, 1998, 1988, 1985, 2000, 2002,
- 0, 1989, 1992, 1997, 1999, 2001, 1992, 2001, 1999, 1990,
- 2003, 2005, 2004, 1994, 2006, 2013, 1994, 2007, 1993, 2004,
- 2000, 1997, 1996, 2002, 2008, 2000, 2002, 1998, 2009, 2007,
- 2008, 1999, 2001, 2005, 2010, 0, 2011, 2003, 2005, 2004,
- 2018, 2006, 2012, 0, 2007, 0, 0, 2013, 2016, 2027,
- 2009, 2008, 2014, 2014, 2014, 2009, 2010, 2016, 2015, 2014,
-
- 2022, 2010, 2011, 2011, 2012, 2015, 2017, 2014, 2021, 2012,
- 2019, 2020, 2018, 2017, 2027, 2016, 2027, 2019, 2020, 2014,
- 2014, 2014, 2022, 2025, 2024, 2015, 2014, 2022, 2021, 2024,
- 2026, 2028, 2029, 2017, 2030, 2021, 2025, 2019, 2020, 0,
- 2033, 2032, 2026, 2031, 2029, 2034, 2033, 2028, 2032, 2036,
- 2025, 2035, 2035, 2037, 2051, 2039, 2024, 2026, 2028, 2029,
- 2037, 2031, 2040, 2041, 2038, 2045, 2030, 2033, 2032, 2038,
- 2031, 2046, 2034, 2046, 0, 2036, 2036, 2042, 2035, 2047,
- 2037, 2039, 2039, 2049, 2042, 2055, 2051, 2050, 2052, 2040,
- 2041, 2038, 2045, 2050, 2053, 2054, 2052, 2047, 2046, 2057,
-
- 2058, 2049, 2061, 2056, 2042, 2053, 2047, 2059, 2054, 2056,
- 2049, 2057, 2055, 2062, 2050, 2052, 2060, 2060, 2063, 2063,
- 2058, 2053, 2054, 2066, 2064, 2059, 2057, 2058, 2061, 2061,
- 2056, 2067, 2068, 2071, 2059, 2064, 2070, 0, 2075, 2069,
- 2062, 2074, 2072, 2060, 2076, 2063, 2069, 2079, 0, 2074,
- 2077, 2064, 2081, 2067, 2080, 2066, 2070, 2078, 2067, 2079,
- 2081, 2080, 2082, 2070, 2068, 2071, 2069, 2072, 2074, 2072,
- 2075, 2076, 2077, 2083, 2079, 2078, 2085, 2077, 2084, 2081,
- 2087, 2080, 2086, 2086, 2078, 2085, 2082, 2088, 2083, 2082,
- 2090, 2091, 0, 2089, 2093, 0, 2096, 2095, 2091, 2092,
-
- 2083, 2096, 2084, 2085, 2095, 2084, 2087, 2087, 2089, 2086,
- 2093, 2092, 2097, 2098, 0, 0, 2105, 2093, 2091, 2088,
- 2089, 2093, 2090, 2096, 2095, 2099, 2092, 2100, 2099, 2101,
- 2103, 2107, 2104, 2108, 2097, 2100, 0, 2093, 2103, 2097,
- 2098, 2101, 2105, 2105, 2106, 2109, 2110, 2112, 2111, 2107,
- 2120, 0, 2099, 2111, 2100, 2104, 2101, 2103, 2107, 2104,
- 2108, 2113, 2115, 2109, 2111, 2106, 2114, 2113, 2116, 2110,
- 2115, 2106, 2109, 2110, 2112, 2111, 2117, 2118, 2119, 2114,
- 2111, 2125, 2120, 2117, 2118, 2119, 2122, 2121, 2113, 2115,
- 2116, 2126, 2124, 2114, 2123, 2116, 2121, 2127, 2122, 2137,
-
- 2132, 2133, 2131, 2117, 2118, 2119, 2124, 2129, 2125, 2131,
- 2130, 2135, 2139, 2122, 2121, 2130, 2123, 2126, 2126, 2124,
- 2127, 2123, 2132, 2141, 2127, 2129, 2130, 2132, 2133, 2131,
- 2136, 2137, 2140, 2140, 2129, 2136, 2142, 2130, 2135, 2143,
- 2145, 2146, 2130, 2147, 2139, 2141, 2148, 2149, 2150, 2149,
- 2141, 2142, 2151, 2152, 2153, 2145, 2154, 2151, 2147, 2140,
- 2155, 2156, 2136, 2142, 2146, 0, 2153, 2145, 2146, 2156,
- 2147, 2143, 2148, 2148, 2149, 2157, 2158, 2159, 2154, 2151,
- 2150, 2153, 2157, 2154, 2161, 2152, 2162, 2155, 2156, 2165,
- 2163, 2166, 2159, 2167, 2162, 2168, 2171, 2169, 2158, 2161,
-
- 2170, 2174, 2157, 2158, 2159, 2175, 0, 2173, 2176, 2172,
- 2177, 2161, 2163, 2162, 2173, 2166, 2165, 2163, 2166, 2167,
- 2167, 2172, 2168, 2169, 2169, 2178, 2175, 2170, 2171, 2180,
- 2176, 2177, 2175, 2174, 2173, 2176, 2172, 2177, 2183, 2181,
- 2184, 2185, 2186, 2178, 2181, 0, 2187, 2185, 0, 2189,
- 2192, 2180, 2178, 2191, 0, 2190, 2180, 2186, 2197, 2194,
- 2193, 2195, 2183, 2184, 2189, 2183, 2196, 2184, 2185, 2186,
- 2190, 2181, 2187, 2187, 2199, 2191, 2189, 2192, 2193, 0,
- 2191, 2194, 2190, 2195, 2198, 2197, 2194, 2193, 2195, 2200,
- 2196, 2198, 2199, 2196, 2201, 2202, 2203, 2205, 2200, 2206,
-
- 0, 2199, 2201, 2204, 2207, 2208, 2212, 2209, 2206, 0,
- 2213, 2198, 0, 2211, 2208, 2212, 2200, 2214, 2233, 2203,
- 2209, 2201, 2207, 2203, 2211, 2204, 2206, 2202, 2213, 2205,
- 2204, 2207, 2208, 2212, 2209, 2214, 2215, 2213, 2216, 2211,
- 2211, 2217, 2218, 2215, 2214, 2220, 2219, 2221, 2224, 2227,
- 2233, 2211, 2219, 2226, 0, 2228, 0, 2218, 2235, 2217,
- 2227, 2221, 2247, 2215, 2216, 2216, 2228, 2220, 2217, 2218,
- 2229, 2231, 2220, 2219, 2221, 2224, 2227, 2226, 2232, 2234,
- 2226, 2229, 2228, 2231, 2235, 2235, 2236, 2237, 2239, 2234,
- 2238, 2232, 2242, 2240, 2247, 2243, 0, 2229, 2231, 2238,
-
- 2237, 0, 2246, 2245, 0, 2232, 2234, 2245, 2249, 2251,
- 2255, 2236, 2240, 2236, 2237, 2239, 2251, 2238, 2248, 2242,
- 2240, 2243, 2243, 2246, 2252, 2255, 2253, 2250, 2249, 2246,
- 2245, 2248, 2250, 2254, 2253, 2249, 2251, 2255, 0, 2254,
- 2256, 2260, 2258, 2262, 2257, 2248, 2259, 2259, 2262, 0,
- 2252, 2252, 2253, 2253, 2250, 2256, 2257, 2258, 2261, 2260,
- 2254, 2253, 2263, 2269, 2268, 2266, 2263, 2256, 2260, 2258,
- 2261, 2257, 2266, 2259, 0, 2262, 2264, 2264, 2267, 2268,
- 2264, 2271, 2267, 0, 0, 2261, 2270, 2272, 2271, 2263,
- 2269, 2268, 2266, 2264, 2273, 2270, 2276, 2277, 0, 2274,
-
- 2278, 2264, 2287, 2264, 2264, 2267, 2274, 2264, 2271, 2278,
- 2279, 2272, 2283, 2270, 2272, 2280, 2273, 2287, 2276, 2285,
- 2264, 2273, 2277, 2276, 2277, 2286, 2274, 2278, 2285, 2287,
- 2283, 2288, 2279, 2289, 2291, 2280, 2294, 2279, 2290, 2283,
- 2292, 2289, 2280, 2286, 2295, 2290, 2285, 2292, 2296, 2297,
- 2297, 2298, 2286, 2306, 2299, 2301, 2288, 2295, 2288, 2303,
- 2289, 2294, 2302, 2294, 0, 2290, 2291, 2292, 2303, 2307,
- 0, 2295, 2316, 2298, 2304, 2296, 2297, 2301, 2298, 2299,
- 2305, 2299, 2301, 2304, 2302, 2306, 2303, 2305, 2308, 2302,
- 2309, 2307, 2310, 2311, 2315, 2313, 2307, 2310, 2314, 2316,
-
- 2317, 2304, 2308, 2313, 2319, 2309, 2321, 2305, 2323, 2315,
- 2322, 2314, 2311, 2318, 2327, 2308, 2319, 2309, 0, 2324,
- 2311, 2315, 2313, 2320, 2310, 2314, 2317, 2317, 2324, 2318,
- 2320, 2319, 2322, 2323, 2325, 2323, 2326, 2322, 2321, 0,
- 2318, 2327, 2328, 2331, 2326, 2332, 2324, 2329, 0, 2330,
- 2320, 2333, 0, 0, 2335, 2326, 0, 2328, 2337, 2339,
- 2333, 2331, 2336, 2326, 2339, 2336, 2325, 2332, 2341, 2328,
- 2331, 2326, 2332, 2329, 2329, 2330, 2330, 2335, 2333, 2340,
- 2336, 2335, 2338, 2337, 2342, 2337, 2341, 2344, 2338, 2336,
- 2345, 2339, 2336, 2346, 2340, 2341, 2347, 2352, 2349, 2342,
-
- 0, 2344, 0, 2351, 2353, 2345, 2340, 2350, 2357, 2338,
- 2357, 2342, 2349, 2353, 2344, 2346, 2358, 2345, 2347, 2350,
- 2346, 2351, 2356, 2347, 2352, 2349, 2350, 2354, 2355, 2358,
- 2351, 2353, 2359, 2356, 2350, 2357, 2354, 2355, 2360, 2365,
- 2364, 2362, 2363, 2358, 2359, 2367, 2350, 2364, 2366, 2356,
- 0, 0, 0, 2368, 2354, 2355, 2362, 2363, 2371, 2359,
- 2360, 2365, 2368, 2367, 2375, 2360, 2365, 2364, 2362, 2363,
- 2366, 2371, 2367, 2373, 2374, 2366, 2375, 2376, 2374, 2371,
- 2368, 2377, 2379, 2377, 2378, 2371, 2376, 2380, 2381, 2383,
- 2382, 2375, 2386, 0, 2373, 2384, 2391, 2383, 2371, 2382,
-
- 2373, 2374, 2378, 2385, 2376, 2380, 2386, 0, 2377, 2379,
- 2394, 2378, 2387, 2388, 2380, 2381, 2383, 2382, 2384, 2386,
- 2388, 2390, 2384, 2395, 2387, 2385, 2392, 2393, 2391, 2390,
- 2385, 2392, 2393, 2396, 2399, 2398, 2401, 2404, 2405, 2387,
- 2388, 2399, 2394, 2401, 2406, 2403, 2404, 2408, 2390, 2403,
- 2407, 2414, 2409, 2392, 2398, 2395, 2421, 2396, 2406, 2393,
- 2396, 2399, 2398, 2401, 2404, 2405, 2410, 2411, 2407, 2406,
- 2406, 2406, 2403, 2417, 2408, 2415, 2411, 2407, 2409, 2409,
- 2412, 2410, 2416, 2414, 2418, 2406, 2419, 2415, 2421, 2416,
- 2420, 2423, 2424, 2410, 2411, 2417, 2406, 2425, 2426, 2424,
-
- 2417, 2412, 2415, 0, 2428, 2426, 2428, 2412, 2429, 2416,
- 2418, 2418, 2420, 2419, 2423, 2431, 2433, 2420, 2423, 2424,
- 2425, 2439, 2430, 2432, 2425, 2426, 2430, 2431, 2434, 2435,
- 2429, 2428, 2432, 0, 2436, 2429, 2437, 2434, 2433, 2438,
- 2435, 2436, 2431, 2433, 2438, 2440, 0, 2441, 2439, 2430,
- 2432, 2442, 2446, 2443, 2448, 2434, 2435, 2449, 2437, 2441,
- 2445, 2436, 2443, 2437, 2444, 2444, 2438, 2446, 2440, 2445,
- 2451, 2449, 2440, 2442, 2441, 2447, 2448, 2450, 2442, 2446,
- 2443, 2448, 2453, 2447, 2449, 2454, 2450, 2445, 2455, 2458,
- 2456, 2444, 2458, 2454, 2463, 2457, 2455, 2451, 2456, 2457,
-
- 2459, 2453, 2447, 2461, 2450, 2460, 2464, 2462, 2459, 2453,
- 2468, 2460, 2454, 2462, 2470, 2455, 2458, 2456, 2461, 2466,
- 2469, 0, 2457, 2471, 2468, 2473, 2463, 2459, 2476, 2472,
- 2461, 2466, 2460, 2469, 2462, 2470, 2472, 2468, 2464, 2474,
- 2475, 2470, 2476, 2480, 2478, 2479, 2466, 2469, 2471, 2481,
- 2471, 2477, 2473, 2483, 2477, 2476, 2472, 2478, 2482, 2479,
- 2489, 2474, 2484, 2485, 2475, 2486, 2474, 2475, 2490, 2480,
- 2480, 2478, 2479, 2492, 2484, 2485, 2481, 2494, 2477, 2486,
- 2483, 2487, 2495, 2482, 2487, 2482, 2491, 2489, 2493, 2484,
- 2485, 2493, 2486, 2502, 2490, 2490, 0, 2496, 2491, 2492,
-
- 2492, 2498, 2501, 2499, 2494, 2500, 2493, 2487, 2487, 2495,
- 2499, 2487, 2500, 2491, 2503, 2493, 2505, 2501, 2493, 2496,
- 2502, 2507, 2506, 2498, 2496, 2504, 2508, 2510, 2498, 2501,
- 2499, 2506, 2500, 2504, 2509, 2511, 2515, 2512, 2508, 2513,
- 2516, 2503, 2514, 2505, 2521, 2517, 2515, 2518, 2507, 2506,
- 2512, 2520, 2504, 2508, 2510, 2518, 2509, 2513, 2517, 2523,
- 2525, 2509, 2511, 2515, 2512, 2527, 2513, 2516, 2514, 2514,
- 2524, 2521, 2517, 2520, 2518, 2522, 2529, 2526, 2520, 2524,
- 2528, 2536, 2525, 2522, 2531, 2530, 2523, 2525, 2532, 2527,
- 0, 2535, 2527, 2530, 2537, 2528, 2531, 2524, 2526, 2535,
-
- 2543, 2544, 2522, 2529, 2526, 2534, 2528, 2528, 2536, 2539,
- 2541, 2531, 2530, 2532, 2541, 2532, 2539, 2534, 2535, 2540,
- 2546, 2542, 2528, 2543, 0, 0, 2537, 2543, 2544, 2547,
- 2545, 2540, 2534, 2542, 0, 2549, 2539, 2541, 2545, 2548,
- 2551, 2554, 2546, 2552, 2553, 2564, 2540, 2546, 2542, 2549,
- 2552, 2548, 2547, 2557, 2554, 2559, 2547, 2545, 2558, 2558,
- 2555, 2549, 2549, 2556, 2553, 2557, 2548, 2551, 2554, 2555,
- 2552, 2553, 2556, 2560, 2561, 0, 2549, 2564, 2562, 2565,
- 2557, 2559, 2559, 0, 0, 2558, 2566, 2555, 2567, 2568,
- 2556, 2560, 2573, 2562, 2565, 2562, 2569, 2580, 2569, 2561,
-
- 2560, 2561, 2562, 2570, 0, 2562, 2565, 2572, 2566, 2576,
- 2567, 2568, 2571, 2566, 2573, 2567, 2568, 2570, 2571, 2573,
- 2562, 2577, 2562, 2569, 2578, 2572, 2574, 2574, 2579, 2580,
- 2570, 2576, 2581, 2583, 2572, 2582, 2576, 2584, 2588, 2571,
- 2579, 2582, 0, 2577, 2585, 2583, 2578, 2587, 2577, 2587,
- 2586, 2578, 2588, 2574, 2589, 2579, 2590, 2591, 2592, 2596,
- 2583, 2593, 2582, 2590, 2581, 2588, 2585, 2595, 2594, 2584,
- 2597, 2585, 2586, 2598, 2587, 2591, 2592, 2586, 2589, 2593,
- 2595, 2589, 2600, 2590, 2591, 2592, 2594, 2603, 2593, 2600,
- 2602, 2596, 2604, 2605, 2595, 2594, 2598, 2602, 0, 2607,
-
- 2598, 0, 2597, 2606, 0, 2603, 2608, 0, 2610, 2600,
- 2609, 2606, 0, 2614, 2603, 2607, 2615, 2602, 2604, 2604,
- 2611, 2616, 0, 0, 2614, 2605, 2607, 2615, 2609, 2606,
- 2606, 2608, 2617, 2608, 2610, 2610, 2618, 2609, 2606, 2612,
- 2614, 2612, 2611, 2615, 2617, 2620, 2612, 2611, 2616, 2619,
- 2623, 2621, 0, 0, 2618, 2626, 2628, 2629, 2624, 2617,
- 2633, 0, 2625, 2618, 2620, 2623, 2612, 2619, 2612, 2624,
- 2626, 2632, 2620, 2621, 2625, 2631, 2619, 2623, 2621, 2629,
- 2628, 2630, 2626, 2628, 2629, 2624, 2632, 2633, 2630, 2625,
- 2634, 2635, 2638, 2631, 2636, 0, 2641, 2642, 2632, 2639,
-
- 2640, 0, 2631, 2644, 0, 2646, 2643, 0, 2630, 2648,
- 2652, 0, 2645, 0, 2651, 0, 2676, 2634, 2635, 2638,
- 2636, 2636, 2640, 2639, 2643, 2645, 2639, 2640, 2641, 2642,
- 2644, 2646, 2646, 2643, 2647, 2648, 2648, 2649, 2650, 2645,
- 2651, 2651, 2652, 2653, 2654, 2656, 2650, 2658, 2676, 2647,
- 2649, 2657, 2663, 0, 2659, 2660, 2653, 2665, 0, 2663,
- 2664, 2647, 2661, 0, 2649, 2650, 2654, 2662, 2656, 2668,
- 2653, 2654, 2656, 0, 2658, 2657, 2659, 2660, 2657, 2663,
- 2661, 2659, 2660, 2664, 2665, 2662, 2666, 2664, 2669, 2661,
- 2670, 2668, 2671, 2672, 2662, 2669, 2668, 2670, 2673, 2671,
-
- 2666, 2674, 2675, 0, 2678, 2677, 2672, 2679, 2674, 2680,
- 2685, 0, 2690, 2666, 2681, 2669, 2683, 2670, 2680, 2671,
- 2672, 2673, 2681, 2693, 2675, 2673, 2677, 2682, 2674, 2675,
- 2678, 2678, 2677, 2679, 2679, 2682, 2680, 2685, 2683, 2684,
- 2687, 2681, 2688, 2683, 2690, 2684, 2689, 2691, 2693, 2697,
- 2693, 2692, 0, 2688, 2682, 2687, 2695, 2700, 2698, 0,
- 2699, 0, 2697, 2701, 2703, 2704, 2684, 2687, 2689, 2688,
- 2692, 2698, 2705, 2689, 2695, 2707, 2697, 2704, 2692, 2691,
- 2710, 2700, 2711, 2695, 2700, 2698, 2699, 2699, 2703, 2701,
- 2701, 2703, 2704, 2706, 2706, 2712, 2705, 2713, 2714, 2705,
-
- 2717, 2707, 2707, 2710, 2719, 2721, 2722, 2710, 2725, 2728,
- 2712, 2726, 2726, 2719, 2711, 2728, 2714, 2722, 2721, 2727,
- 2706, 2730, 2712, 2731, 2713, 2714, 2732, 2717, 2727, 2734,
- 2725, 2719, 2721, 2722, 2736, 2725, 2728, 2737, 2726, 2752,
- 0, 2738, 2747, 2730, 2737, 2731, 2727, 2739, 2730, 2740,
- 2731, 2741, 2743, 2732, 2740, 2745, 2734, 2744, 2739, 2751,
- 2743, 2749, 2746, 2754, 2737, 2750, 2736, 2738, 2738, 2747,
- 2745, 2752, 2749, 2741, 2739, 2754, 2740, 2746, 2741, 2743,
- 2751, 2744, 2745, 2750, 2744, 2753, 2751, 2756, 2749, 2746,
- 2754, 2757, 2750, 0, 2753, 2758, 2759, 2760, 2760, 2761,
-
- 0, 2763, 2764, 2767, 2759, 2760, 0, 2766, 2761, 2765,
- 2769, 0, 2753, 2770, 2756, 2757, 2766, 0, 2757, 2768,
- 2758, 2767, 2758, 2759, 2760, 2760, 2761, 2763, 2763, 2764,
- 2767, 2765, 2769, 2768, 2766, 2771, 2765, 2769, 2770, 2772,
- 2770, 2773, 2774, 2775, 2776, 2777, 2768, 2778, 2771, 2779,
- 2775, 2776, 2772, 2780, 2781, 2782, 2773, 0, 2783, 2784,
- 0, 2779, 2771, 2787, 2774, 2788, 2772, 2777, 2773, 2774,
- 2775, 2776, 2777, 2783, 2778, 2786, 2779, 2789, 2785, 2790,
- 2780, 2781, 2782, 2792, 2784, 2783, 2784, 2785, 2791, 2787,
- 2787, 2788, 2788, 2793, 2790, 2791, 2796, 2786, 2792, 2798,
-
- 2793, 2794, 2786, 2789, 2789, 2785, 2790, 2794, 2795, 2797,
- 2792, 2799, 2801, 2800, 2803, 2791, 2802, 2797, 2804, 2795,
- 2793, 2809, 2806, 2796, 2810, 2805, 2798, 2811, 2794, 2800,
- 2807, 2802, 2805, 2804, 2803, 2795, 2797, 2807, 2799, 2801,
- 2800, 2803, 2810, 2802, 2806, 2804, 2808, 2814, 2809, 2806,
- 2816, 2810, 2805, 2808, 2811, 2812, 2812, 2807, 2813, 2815,
- 2817, 2814, 2815, 2816, 2818, 2813, 2819, 2820, 2821, 0,
- 2822, 2819, 2823, 2808, 2814, 2827, 2824, 2816, 2817, 2818,
- 2831, 0, 2812, 2821, 2827, 2813, 2815, 2817, 2824, 2825,
- 2823, 2818, 2820, 2819, 2820, 2821, 2822, 2822, 2830, 2823,
-
- 2828, 2825, 2827, 2824, 2829, 2828, 2832, 2831, 2833, 2829,
- 2832, 2834, 2835, 2837, 2836, 2838, 2825, 2840, 0, 2844,
- 2830, 2846, 2839, 0, 2834, 2830, 0, 2828, 0, 0,
- 0, 2829, 2833, 2832, 2835, 2833, 2836, 2839, 2834, 2835,
- 2837, 2836, 2838, 2840, 2840, 2844, 2844, 2846, 2846, 2839,
- 2847, 2848, 2849, 2850, 2852, 2853, 2855, 2854, 2857, 2847,
- 2849, 2852, 2854, 2855, 2853, 2850, 2856, 2848, 2858, 2859,
- 0, 0, 2866, 2856, 2893, 2858, 2857, 2847, 2848, 2849,
- 2850, 2852, 2853, 2855, 2854, 2857, 2863, 2865, 2867, 2861,
- 2860, 2862, 2870, 2856, 2859, 2858, 2859, 2860, 2861, 2866,
-
- 2862, 2867, 2868, 2869, 2872, 2873, 2893, 2868, 2877, 0,
- 2865, 2874, 2863, 2863, 2865, 2867, 2861, 2860, 2862, 2870,
- 2874, 2869, 2872, 2885, 2875, 2876, 0, 2878, 2877, 2868,
- 2869, 2872, 2873, 2875, 2876, 2877, 2879, 2880, 2874, 2878,
- 2882, 2884, 2881, 2883, 2886, 2879, 2880, 3013, 2882, 2887,
- 2885, 2875, 2876, 2881, 2878, 2891, 2887, 2889, 2892, 0,
- 0, 2884, 2900, 2879, 2880, 2888, 2883, 2882, 2884, 2881,
- 2883, 2886, 2894, 2899, 2888, 2896, 2887, 2895, 2889, 3013,
- 2897, 2894, 2891, 2898, 2889, 2892, 2895, 2896, 2897, 2900,
- 2901, 2902, 2888, 2904, 2903, 2899, 2898, 2901, 2902, 2894,
-
- 2899, 2903, 2896, 2905, 2895, 2906, 2907, 2897, 2909, 2904,
- 2898, 2908, 2906, 2911, 2910, 2913, 2915, 2901, 2902, 2905,
- 2904, 2903, 0, 2913, 0, 2919, 0, 2921, 2907, 2916,
- 2905, 2917, 2906, 2907, 2915, 2909, 2908, 2916, 2908, 2910,
- 2911, 2910, 2913, 2915, 2918, 2923, 2917, 2919, 2920, 2921,
- 2922, 2918, 2919, 2923, 2921, 2920, 2916, 2922, 2917, 2926,
- 2927, 2928, 2929, 2932, 2930, 2931, 2926, 2933, 2934, 2927,
- 2935, 2918, 2923, 2941, 2931, 2920, 2930, 2922, 2939, 2940,
- 2934, 2945, 0, 2933, 2937, 2928, 2926, 2927, 2928, 2929,
- 2932, 2930, 2931, 2935, 2933, 2934, 2937, 2935, 2938, 2939,
-
- 2941, 2942, 2940, 2948, 2944, 2939, 2940, 2946, 2945, 2947,
- 2938, 2937, 2949, 2950, 2946, 2942, 2944, 2947, 2952, 2949,
- 2953, 2954, 2948, 2955, 2956, 2938, 2958, 2957, 2942, 2964,
- 2948, 2944, 0, 2952, 2946, 2957, 2947, 2959, 2953, 2949,
- 2950, 2961, 2960, 2962, 2954, 2952, 2970, 2953, 2954, 2955,
- 2955, 2956, 2961, 2958, 2957, 2963, 2964, 2966, 2962, 2959,
- 2960, 2971, 2963, 2966, 2959, 2973, 2972, 2974, 2961, 2960,
- 2962, 2972, 2970, 2970, 2980, 2975, 2976, 2977, 2978, 2971,
- 2979, 2974, 2963, 2984, 2966, 2982, 2987, 2989, 2971, 2975,
- 2976, 3033, 2973, 2972, 2974, 2977, 2978, 2982, 2979, 2981,
-
- 2991, 2980, 2975, 2976, 2977, 2978, 2981, 2979, 2987, 2989,
- 2984, 2990, 2982, 2987, 2989, 2992, 2995, 2993, 2994, 2997,
- 3001, 3002, 2991, 3033, 2990, 2993, 2981, 2991, 2999, 3000,
- 3003, 2997, 3001, 3007, 2992, 2995, 2994, 3004, 2990, 3006,
- 3005, 3007, 2992, 2995, 2993, 2994, 2997, 3001, 3002, 3008,
- 2999, 3000, 3005, 3009, 3011, 2999, 3000, 3003, 3016, 3004,
- 3007, 3006, 3010, 3011, 3004, 3012, 3006, 3005, 3014, 3015,
- 3019, 3016, 3018, 3009, 3012, 3021, 3008, 3022, 3020, 3025,
- 3009, 3011, 3019, 3027, 3010, 3016, 3045, 3028, 0, 3010,
- 3014, 3015, 3012, 3026, 3030, 3014, 3015, 3019, 3018, 3018,
-
- 3020, 3025, 3021, 3029, 3022, 3020, 3025, 3026, 3029, 3031,
- 3027, 3028, 3032, 3045, 3028, 3034, 3030, 0, 3035, 3036,
- 3026, 3030, 3038, 3040, 3039, 3032, 3037, 3041, 3042, 3040,
- 3043, 3031, 0, 0, 3038, 3029, 3031, 3049, 3034, 3032,
- 3035, 3036, 3034, 3039, 3037, 3035, 3036, 3044, 3047, 3038,
- 3040, 3039, 3043, 3037, 3048, 3051, 3053, 3043, 3054, 3041,
- 3042, 3049, 3044, 3056, 3049, 3055, 3058, 3067, 3047, 3060,
- 3051, 3059, 3056, 0, 3044, 3047, 3048, 3057, 3053, 3061,
- 3054, 3048, 3051, 3053, 3058, 3054, 3062, 3055, 3063, 3059,
- 3056, 3057, 3055, 3058, 3066, 3060, 3060, 3061, 3059, 3067,
-
- 3071, 3068, 3075, 3066, 3057, 3072, 3061, 3073, 3071, 3062,
- 3063, 3074, 3072, 3062, 3073, 3063, 3076, 3077, 3082, 3074,
- 3081, 3066, 3068, 3079, 3080, 3077, 3085, 3071, 3068, 3075,
- 3082, 3083, 3072, 3094, 3073, 0, 3076, 3091, 3074, 3095,
- 3084, 3079, 3080, 3076, 3077, 3082, 3081, 3081, 3086, 3083,
- 3079, 3080, 3084, 3085, 3088, 3090, 3086, 3092, 3083, 3093,
- 3091, 3093, 3090, 3097, 3091, 3094, 3088, 3084, 3096, 3098,
- 3099, 3095, 3097, 3100, 3107, 3086, 3096, 3101, 3104, 3101,
- 3102, 3088, 3090, 3112, 3092, 3105, 3093, 3108, 0, 0,
- 3097, 3115, 3100, 3109, 3110, 3096, 3104, 3099, 0, 3105,
-
- 3100, 3098, 3102, 3110, 3101, 3104, 3107, 3102, 3118, 3111,
- 3112, 3108, 3105, 3113, 3108, 3116, 3109, 3115, 3115, 3119,
- 3109, 3110, 3111, 3119, 3116, 3113, 3120, 3121, 3123, 3124,
- 3126, 3128, 0, 0, 3130, 3118, 3111, 3125, 3131, 3133,
- 3113, 3130, 3116, 3136, 3133, 3141, 3119, 3132, 3126, 0,
- 3136, 3134, 3124, 3120, 3121, 3123, 3124, 3126, 3128, 3125,
- 3131, 3130, 3132, 3139, 3125, 3131, 3134, 3142, 3137, 3138,
- 3136, 3133, 3141, 3143, 3132, 3137, 3138, 3144, 3134, 3145,
- 3148, 3151, 3149, 3146, 3152, 0, 3153, 3154, 3151, 3139,
- 3139, 3149, 3156, 3145, 3142, 3137, 3138, 3146, 3161, 3160,
-
- 3143, 3144, 3157, 3155, 3144, 3159, 3145, 3148, 3151, 3149,
- 3146, 3152, 3153, 3153, 3154, 3155, 3157, 3158, 3159, 3156,
- 3162, 3166, 3165, 3167, 3168, 3161, 3158, 3165, 3170, 3157,
- 3155, 3160, 3159, 3170, 3171, 3172, 3174, 3175, 3171, 3176,
- 3177, 3179, 3172, 3162, 3158, 3166, 3168, 3162, 3166, 3173,
- 3178, 3168, 3178, 3180, 3165, 3167, 3173, 3174, 3183, 3184,
- 3170, 3171, 3172, 3174, 3179, 3186, 3187, 3190, 3179, 3175,
- 3191, 3176, 3177, 3189, 3194, 3189, 3173, 3178, 3192, 3192,
- 3180, 3184, 3193, 3194, 3186, 3183, 3184, 3198, 3192, 0,
- 3187, 3190, 3186, 3187, 3190, 3196, 3191, 3191, 3197, 3199,
-
- 3189, 3194, 3196, 3201, 3193, 3192, 3192, 3200, 3203, 3193,
- 3202, 3197, 3199, 3207, 3198, 3200, 3201, 3208, 3202, 3205,
- 3209, 3207, 3196, 3206, 3205, 3197, 3199, 3203, 3206, 0,
- 3201, 3200, 3210, 0, 3200, 3203, 3211, 3202, 3212, 3214,
- 3207, 3213, 3200, 0, 3208, 3216, 3209, 3209, 3215, 3220,
- 3214, 3205, 3216, 3217, 3217, 3206, 3218, 3222, 3210, 3210,
- 3219, 3221, 3211, 3211, 3212, 3212, 3214, 3213, 3213, 3221,
- 3215, 3220, 3216, 3219, 3218, 3215, 3220, 3223, 3224, 3222,
- 3217, 3228, 3225, 3218, 3222, 3224, 3226, 3219, 3221, 3225,
- 3229, 3230, 3232, 3226, 3231, 3223, 3237, 3239, 3235, 3233,
-
- 3234, 3242, 3245, 0, 3223, 3224, 3231, 3235, 3228, 3225,
- 3238, 3240, 3250, 3226, 3243, 3230, 3244, 3229, 3230, 3232,
- 3233, 3231, 3234, 3237, 3239, 3235, 3233, 3234, 3242, 3245,
- 3238, 3246, 3243, 3240, 3244, 3247, 3249, 3238, 3240, 3250,
- 3251, 3243, 3252, 3244, 3254, 3249, 3253, 3256, 3257, 3246,
- 3255, 3258, 3254, 3247, 3260, 3257, 3258, 3262, 3246, 3256,
- 3261, 3269, 3247, 3249, 3253, 3252, 3255, 3251, 3260, 3252,
- 3264, 3254, 3268, 3253, 3256, 3257, 3270, 3255, 3261, 3272,
- 3262, 3260, 3264, 3258, 3262, 3273, 3275, 3261, 3269, 3270,
- 3274, 3277, 3274, 3278, 3268, 3275, 3279, 3264, 3273, 3268,
-
- 3280, 3281, 3285, 3270, 3285, 3290, 3272, 3287, 3286, 3292,
- 0, 3296, 3273, 3275, 3279, 3289, 3281, 3274, 3277, 3297,
- 3278, 3294, 3289, 3279, 3292, 3287, 3298, 3294, 3281, 3285,
- 3286, 3299, 3280, 3296, 3287, 3286, 3292, 3290, 3296, 3301,
- 3305, 3297, 3289, 3302, 3304, 3309, 3297, 3310, 3294, 3299,
- 3306, 3311, 3298, 3298, 3305, 3312, 3302, 3313, 3299, 3307,
- 3304, 3301, 3307, 3306, 3313, 3320, 3301, 3305, 3314, 3317,
- 3302, 3304, 3309, 3312, 3310, 3314, 3321, 3306, 3311, 3315,
- 3316, 3323, 3312, 3322, 3313, 3307, 3307, 3315, 3316, 3307,
- 3324, 3317, 3327, 3328, 3325, 3314, 3317, 3320, 3321, 3324,
-
- 3329, 3331, 3328, 3321, 3333, 3322, 3315, 3316, 3323, 3325,
- 3322, 3330, 3326, 3330, 3327, 3334, 3341, 3324, 3326, 3327,
- 3328, 3325, 3335, 3341, 3336, 3337, 3343, 3333, 3331, 3338,
- 0, 3333, 3329, 3337, 3339, 0, 0, 3334, 3330, 3326,
- 3345, 3338, 3334, 3341, 3335, 3346, 3339, 3348, 3347, 3335,
- 3336, 3336, 3337, 3343, 3345, 3349, 3338, 3350, 3351, 3346,
- 3352, 3339, 3347, 3356, 3353, 3357, 3351, 3345, 3350, 3354,
- 3348, 3355, 3346, 3349, 3348, 3347, 3354, 3360, 3355, 3352,
- 3359, 3359, 3349, 3357, 3350, 3351, 3353, 3352, 3358, 3356,
- 3356, 3353, 3357, 3361, 3362, 3365, 3354, 3358, 3355, 3366,
-
- 3365, 3368, 3362, 3369, 3360, 3370, 3374, 3359, 3372, 3379,
- 3384, 0, 3366, 3376, 3372, 3358, 3381, 3387, 3377, 0,
- 3361, 3362, 3368, 3380, 3376, 3389, 3366, 3365, 3368, 3377,
- 3369, 3379, 3370, 3374, 3380, 3372, 3379, 3384, 3381, 3385,
- 3376, 3386, 3396, 3381, 3388, 3377, 3385, 3390, 3388, 3387,
- 3380, 3392, 3389, 3394, 3393, 3390, 3395, 3398, 3407, 3386,
- 3401, 3394, 0, 3400, 3402, 3395, 3385, 3393, 3386, 3396,
- 3400, 3388, 3406, 3406, 3390, 3408, 3409, 3392, 3392, 3405,
- 3394, 3393, 3411, 3395, 3405, 3407, 3402, 3410, 3409, 3398,
- 3400, 3402, 3401, 3414, 3410, 3412, 3416, 3413, 3415, 3406,
-
- 3414, 3411, 3408, 3409, 3416, 3418, 3405, 3419, 0, 3411,
- 3417, 3412, 3418, 3420, 3410, 3413, 3421, 3422, 3423, 3433,
- 3414, 3425, 3412, 3416, 3413, 3417, 3424, 3434, 3411, 3422,
- 3415, 3429, 3418, 3432, 3419, 3420, 3436, 3417, 3435, 3443,
- 3420, 0, 3423, 3421, 3422, 3423, 3429, 3425, 3425, 3430,
- 3424, 3433, 3431, 3424, 3434, 3432, 3430, 3437, 3429, 3431,
- 3432, 3439, 3435, 3440, 3441, 3435, 3437, 3442, 3436, 3445,
- 3447, 3443, 3444, 3444, 3451, 3442, 3430, 0, 3448, 3431,
- 3456, 3453, 3444, 3439, 3437, 3447, 3441, 3448, 3439, 3450,
- 3440, 3441, 3453, 3449, 3442, 3449, 3445, 3447, 3452, 3444,
-
- 3444, 3451, 3457, 3450, 3454, 3448, 3452, 3456, 3453, 3458,
- 3459, 3460, 3461, 3462, 3463, 3464, 3450, 3465, 3466, 3467,
- 3449, 3470, 3454, 3469, 3460, 3452, 3468, 3468, 0, 3457,
- 3473, 3454, 3459, 3467, 3461, 3465, 3458, 3459, 3460, 3461,
- 3462, 3463, 3464, 3470, 3465, 3466, 3467, 3474, 3470, 3476,
- 3477, 3480, 3488, 3468, 3484, 3469, 3482, 3473, 3474, 3480,
- 3483, 3482, 3484, 3485, 3490, 3483, 3486, 3491, 3485, 3489,
- 3489, 3494, 3490, 3495, 3474, 3493, 3476, 3477, 3480, 3488,
- 3491, 3484, 3493, 3482, 3496, 3497, 3499, 3483, 3500, 3494,
- 3485, 3490, 3486, 3486, 3491, 3499, 3489, 3501, 3494, 3502,
-
- 3495, 3503, 3493, 3504, 3501, 3508, 3510, 3502, 3497, 3507,
- 3513, 3496, 3497, 3499, 3512, 3507, 3511, 3516, 3515, 3514,
- 3500, 0, 0, 3503, 3501, 3504, 3502, 3512, 3503, 3517,
- 3504, 3521, 3508, 3510, 3514, 3522, 3507, 3515, 3511, 3525,
- 3519, 3512, 3513, 3511, 3516, 3515, 3514, 3519, 3523, 3526,
- 3527, 3517, 3524, 3529, 3521, 3523, 3517, 3522, 3521, 3524,
- 3528, 3525, 3522, 3531, 3526, 3527, 3525, 3519, 0, 3528,
- 3532, 0, 3544, 0, 3529, 3523, 3526, 3527, 3532, 3524,
- 3529, 3533, 3531, 3536, 3534, 3537, 3553, 3528, 3533, 3539,
- 3531, 3534, 3536, 3538, 3538, 3539, 3537, 3532, 3543, 3547,
-
- 3540, 3542, 3545, 3538, 3544, 3543, 3547, 3548, 3533, 3554,
- 3536, 3534, 3537, 3553, 3555, 0, 3539, 3561, 3549, 3564,
- 3538, 3538, 3540, 3542, 3545, 3543, 3547, 3540, 3542, 3545,
- 3559, 3548, 3549, 3562, 3548, 3563, 3554, 3555, 3566, 3569,
- 3572, 3555, 3559, 3563, 3561, 3549, 3564, 3570, 3570, 0,
- 3566, 3571, 3571, 3573, 3573, 3562, 3574, 3559, 3578, 3576,
- 3562, 3579, 3563, 3583, 3580, 3566, 3569, 3572, 3584, 3577,
- 3579, 3585, 0, 3588, 0, 3587, 3570, 3580, 3585, 3574,
- 3571, 3576, 3573, 3574, 3589, 3578, 3576, 3577, 3579, 3594,
- 3583, 3580, 3586, 3589, 3584, 3584, 3577, 3587, 3585, 3586,
-
- 3588, 3590, 3587, 3593, 3595, 3593, 3596, 3600, 3590, 3594,
- 3597, 3589, 3599, 3601, 3602, 3605, 3594, 3604, 3603, 3586,
- 3606, 3599, 3597, 3607, 3596, 3613, 3609, 3595, 3590, 0,
- 3593, 3595, 3600, 3596, 3600, 3601, 3603, 3597, 3609, 3599,
- 3601, 3602, 3605, 3604, 3604, 3603, 3608, 3606, 3610, 3611,
- 3607, 3608, 3611, 3609, 3612, 3616, 3614, 3613, 3614, 3612,
- 3615, 3616, 3617, 3618, 3620, 3621, 3619, 3611, 3623, 3624,
- 3610, 3622, 3615, 3608, 3619, 3610, 3611, 3626, 3629, 3611,
- 3632, 3630, 3616, 3614, 3617, 3618, 3612, 3615, 3625, 3617,
- 3618, 3620, 3622, 3619, 3630, 3623, 3624, 3621, 3622, 3626,
-
- 3625, 3633, 3635, 3637, 3626, 3629, 3638, 3632, 3630, 3639,
- 3640, 3635, 3642, 3643, 3644, 3625, 3645, 3646, 3646, 3633,
- 3648, 3649, 3651, 3656, 3652, 3654, 3657, 0, 3633, 3635,
- 3637, 3653, 3654, 3638, 3659, 3656, 3639, 3640, 3648, 3642,
- 3643, 3644, 3652, 3645, 3646, 3660, 3653, 3648, 3649, 3651,
- 3656, 3652, 3654, 3657, 3658, 3661, 3662, 3660, 3653, 3663,
- 3664, 3659, 3658, 3665, 3667, 3668, 3672, 3680, 3673, 3661,
- 3674, 3662, 3660, 3675, 3675, 3664, 3667, 3673, 3676, 3679,
- 3677, 3658, 3661, 3662, 0, 3663, 3663, 3664, 3672, 3677,
- 3665, 3667, 3668, 3672, 3674, 3673, 3681, 3674, 3682, 3680,
-
- 3675, 3685, 3683, 3679, 3676, 3676, 3679, 3677, 3684, 3681,
- 3683, 3687, 3685, 3688, 3691, 3692, 3711, 3684, 3694, 3697,
- 3682, 3696, 3696, 3681, 3712, 3682, 3697, 3692, 3685, 3683,
- 3706, 3688, 3687, 3710, 3707, 3684, 3713, 3691, 3687, 3715,
- 3688, 3691, 3692, 3711, 3694, 3694, 3697, 3710, 3696, 3717,
- 3718, 3712, 3706, 3717, 3723, 3719, 3725, 3706, 3707, 3721,
- 3710, 3707, 3720, 3713, 3727, 3728, 3715, 3723, 3718, 3720,
- 3726, 3721, 3730, 3729, 3726, 3731, 3717, 3718, 3719, 3732,
- 3727, 3723, 3719, 0, 3730, 3734, 3721, 3728, 3725, 3720,
- 3739, 3727, 3728, 3732, 3734, 3733, 3735, 3726, 3729, 3730,
-
- 3729, 3731, 3731, 3733, 3737, 3739, 3732, 3735, 3736, 3738,
- 3736, 3740, 3734, 3741, 3742, 3743, 3737, 3739, 3744, 3741,
- 3745, 3746, 3733, 3735, 3747, 3753, 3744, 3738, 3746, 3742,
- 3752, 3737, 3753, 3740, 3754, 3736, 3738, 3743, 3740, 3756,
- 3741, 3742, 3743, 3752, 3755, 3744, 3747, 3745, 3746, 3757,
- 3758, 3747, 3753, 3759, 3760, 3761, 3762, 3752, 3763, 3769,
- 3764, 3754, 3755, 3756, 3762, 3763, 3756, 3765, 3766, 0,
- 3773, 3755, 3758, 3767, 3768, 3767, 3757, 3758, 0, 3759,
- 3759, 3760, 3761, 3762, 3764, 3763, 3768, 3764, 3771, 3765,
- 3766, 3769, 3770, 3775, 3765, 3766, 3772, 3773, 3776, 3774,
-
- 3767, 3768, 3777, 3771, 3779, 3770, 3774, 3782, 3781, 3780,
- 3784, 3785, 3791, 3793, 3787, 3771, 3781, 3787, 3772, 3770,
- 3775, 3780, 3784, 3772, 3788, 3776, 3774, 3785, 3792, 3777,
- 3795, 3779, 3793, 3788, 3782, 3781, 3780, 3784, 3785, 3791,
- 3793, 3787, 3794, 3796, 3797, 3798, 3800, 3801, 0, 3803,
- 3794, 3788, 3799, 3811, 3792, 3792, 3809, 3797, 3808, 3798,
- 3799, 3812, 3795, 3809, 3808, 3817, 3811, 3813, 3800, 3794,
- 3814, 3797, 3798, 3800, 3801, 3796, 3803, 3816, 3813, 3799,
- 3811, 3818, 3819, 3809, 3816, 3808, 3820, 3817, 3812, 3818,
- 3821, 3824, 3817, 3814, 3813, 3827, 3819, 3814, 3821, 3822,
-
- 3820, 3823, 3827, 3828, 3816, 3832, 3829, 3831, 3818, 3819,
- 0, 3834, 3828, 3820, 3829, 3833, 3840, 3821, 3824, 3835,
- 3842, 3822, 3827, 3823, 0, 3831, 3822, 3836, 3823, 3837,
- 3828, 3838, 3832, 3829, 3831, 3843, 3839, 3833, 3844, 3852,
- 0, 3845, 3833, 3834, 3839, 3835, 3835, 3842, 3840, 3836,
- 3845, 3837, 3847, 3838, 3836, 3856, 3837, 3843, 3838, 3848,
- 3849, 3850, 3843, 3839, 3851, 3844, 3853, 3848, 3845, 3850,
- 3854, 3852, 3851, 3858, 3853, 3847, 3859, 3861, 0, 3847,
- 3849, 3856, 3856, 0, 3854, 3865, 3848, 3849, 3850, 3860,
- 3862, 3851, 3860, 3853, 3863, 3858, 3864, 3854, 3862, 3861,
-
- 3858, 3867, 3863, 3859, 3861, 3866, 3868, 3860, 3870, 3870,
- 3864, 3865, 3865, 3871, 3872, 3867, 3860, 3862, 3873, 3860,
- 3874, 3863, 3872, 3864, 3878, 3879, 3875, 3866, 3867, 3868,
- 3876, 0, 3866, 3868, 3877, 3870, 3880, 3881, 3882, 3871,
- 3871, 3872, 3877, 3890, 3873, 3873, 3874, 3874, 3875, 3883,
- 3876, 3878, 3879, 3875, 3884, 3886, 3893, 3876, 3880, 3885,
- 3887, 3877, 3881, 3880, 3881, 3882, 3894, 3885, 3887, 3883,
- 3890, 3891, 3895, 3899, 3884, 3897, 3883, 3886, 3893, 3891,
- 3895, 3884, 3886, 3893, 3896, 3903, 3885, 3887, 3894, 3900,
- 0, 3902, 3896, 3894, 3904, 3901, 3906, 3900, 3891, 3895,
-
- 3899, 3897, 3897, 3901, 3907, 3908, 3910, 3913, 3916, 3917,
- 0, 3896, 3903, 0, 3904, 0, 3900, 3902, 3902, 3914,
- 0, 3904, 3901, 3906, 0, 3908, 0, 3914, 3910, 3913,
- 3915, 3907, 3908, 3910, 3913, 3916, 3917, 0, 3915, 0,
- 0, 0, 0, 0, 0, 0, 3914, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 3915, 3921, 3921,
- 3921, 3921, 3921, 3921, 3921, 3922, 3922, 3922, 3922, 3922,
- 3922, 3922, 3923, 3923, 3923, 3923, 3923, 3923, 3923, 3924,
- 3924, 3924, 3924, 3924, 3924, 3924, 3925, 3925, 3925, 3925,
- 3925, 3925, 3925, 3926, 3926, 3926, 3926, 3926, 3926, 3926,
-
- 3927, 3927, 3927, 3927, 3927, 3927, 3927, 3929, 3929, 0,
- 3929, 3929, 3929, 3929, 3930, 3930, 0, 0, 0, 3930,
- 3930, 3931, 3931, 0, 0, 3931, 0, 3931, 3932, 0,
- 0, 0, 0, 0, 3932, 3933, 3933, 0, 0, 0,
- 3933, 3933, 3934, 0, 0, 0, 0, 0, 3934, 3935,
- 3935, 0, 3935, 3935, 3935, 3935, 3936, 0, 0, 0,
- 0, 0, 3936, 3937, 3937, 0, 0, 0, 3937, 3937,
- 3938, 3938, 0, 3938, 3938, 3938, 3938, 3920, 3920, 3920,
- 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920,
- 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920,
-
- 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920,
- 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920,
- 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920,
- 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920,
- 3920, 3920, 3920, 3920
+ 73, 30, 26, 26, 24, 183, 183, 24, 24, 29,
+ 26, 24, 30, 96, 26, 94, 24, 26, 24, 63,
+ 93, 63, 63, 35, 63, 24, 27, 98, 96, 115,
+ 27, 35, 39, 27, 98, 27, 27, 35, 94, 39,
+ 96, 35, 94, 99, 93, 39, 27, 93, 27, 35,
+ 35, 95, 115, 27, 98, 179, 115, 27, 35, 39,
+ 27, 36, 27, 27, 35, 36, 39, 99, 35, 109,
+ 99, 95, 44, 27, 31, 174, 44, 31, 95, 36,
+
+ 44, 36, 109, 42, 31, 42, 31, 36, 36, 172,
+ 31, 171, 36, 101, 42, 169, 109, 31, 44, 44,
+ 42, 31, 101, 44, 31, 167, 36, 44, 36, 42,
+ 42, 31, 42, 31, 43, 165, 111, 31, 38, 128,
+ 101, 42, 38, 111, 43, 86, 38, 42, 43, 43,
+ 97, 74, 38, 74, 74, 38, 74, 43, 97, 128,
+ 102, 43, 38, 111, 38, 38, 128, 168, 81, 38,
+ 168, 43, 100, 38, 155, 43, 43, 97, 102, 38,
+ 155, 47, 38, 47, 47, 100, 47, 102, 106, 38,
+ 40, 117, 47, 106, 40, 71, 100, 71, 71, 100,
+
+ 71, 155, 107, 76, 40, 40, 80, 40, 80, 80,
+ 107, 80, 100, 117, 113, 106, 40, 40, 117, 75,
+ 188, 40, 1053, 113, 188, 87, 202, 87, 87, 107,
+ 87, 40, 40, 71, 40, 41, 87, 90, 41, 90,
+ 90, 113, 90, 103, 103, 41, 104, 188, 90, 41,
+ 41, 108, 104, 1053, 104, 114, 103, 41, 202, 105,
+ 105, 69, 41, 64, 114, 41, 122, 104, 105, 108,
+ 103, 103, 41, 104, 122, 90, 41, 41, 118, 104,
+ 110, 104, 114, 108, 112, 112, 105, 105, 116, 110,
+ 120, 118, 112, 122, 59, 116, 108, 127, 360, 121,
+
+ 112, 119, 110, 58, 119, 118, 228, 110, 53, 124,
+ 123, 112, 112, 124, 120, 116, 110, 119, 119, 112,
+ 127, 121, 120, 130, 127, 119, 121, 360, 119, 124,
+ 123, 119, 123, 124, 125, 126, 124, 123, 228, 125,
+ 124, 120, 125, 130, 119, 119, 129, 131, 126, 132,
+ 130, 133, 134, 129, 136, 135, 124, 123, 133, 137,
+ 129, 125, 126, 132, 135, 131, 125, 141, 137, 140,
+ 48, 18, 17, 129, 131, 134, 132, 136, 133, 134,
+ 129, 136, 135, 138, 139, 141, 137, 138, 144, 143,
+ 142, 139, 231, 138, 141, 140, 140, 142, 143, 146,
+
+ 144, 145, 145, 150, 143, 138, 233, 146, 147, 236,
+ 138, 139, 143, 148, 138, 144, 143, 142, 150, 147,
+ 138, 149, 151, 147, 231, 143, 146, 148, 145, 149,
+ 150, 143, 147, 153, 152, 147, 156, 0, 233, 151,
+ 148, 236, 151, 154, 153, 152, 147, 156, 151, 151,
+ 147, 154, 158, 149, 152, 157, 149, 163, 160, 159,
+ 153, 152, 161, 156, 157, 162, 151, 158, 0, 151,
+ 154, 161, 152, 160, 0, 163, 157, 164, 0, 158,
+ 157, 159, 157, 0, 163, 160, 159, 162, 178, 161,
+ 164, 157, 162, 170, 0, 170, 170, 175, 170, 175,
+
+ 175, 184, 175, 157, 164, 176, 185, 176, 176, 186,
+ 176, 180, 178, 180, 180, 178, 180, 187, 186, 190,
+ 185, 191, 192, 184, 195, 193, 189, 0, 184, 187,
+ 192, 195, 194, 189, 196, 190, 186, 193, 185, 197,
+ 191, 0, 200, 176, 187, 189, 190, 185, 191, 192,
+ 196, 195, 193, 189, 194, 205, 198, 197, 206, 194,
+ 189, 196, 198, 199, 200, 199, 197, 0, 201, 200,
+ 201, 203, 207, 206, 209, 203, 208, 207, 210, 212,
+ 213, 205, 205, 211, 208, 206, 212, 822, 198, 198,
+ 199, 214, 203, 620, 201, 201, 209, 201, 211, 203,
+
+ 210, 209, 203, 208, 207, 210, 212, 215, 213, 0,
+ 211, 216, 213, 217, 214, 218, 822, 239, 214, 203,
+ 204, 620, 216, 220, 221, 204, 217, 218, 0, 215,
+ 204, 222, 220, 224, 215, 213, 204, 204, 216, 225,
+ 217, 219, 218, 204, 219, 0, 221, 204, 225, 239,
+ 220, 221, 204, 222, 226, 224, 219, 204, 222, 227,
+ 224, 226, 0, 204, 204, 230, 225, 229, 219, 234,
+ 227, 219, 223, 232, 241, 223, 230, 223, 235, 0,
+ 232, 226, 243, 234, 235, 237, 227, 0, 240, 223,
+ 0, 223, 0, 229, 229, 244, 245, 230, 223, 223,
+
+ 232, 234, 223, 230, 223, 235, 241, 237, 242, 244,
+ 234, 240, 237, 242, 243, 240, 223, 245, 223, 246,
+ 247, 249, 244, 245, 249, 248, 246, 252, 251, 0,
+ 250, 253, 254, 242, 248, 242, 257, 0, 263, 248,
+ 242, 247, 251, 257, 255, 259, 246, 247, 249, 250,
+ 254, 252, 248, 253, 252, 251, 255, 250, 253, 254,
+ 258, 248, 256, 257, 261, 258, 260, 259, 265, 262,
+ 263, 255, 259, 256, 262, 260, 264, 264, 266, 267,
+ 268, 271, 270, 0, 265, 264, 267, 261, 269, 256,
+ 270, 261, 258, 260, 272, 265, 262, 273, 275, 280,
+
+ 279, 271, 268, 264, 264, 276, 267, 268, 271, 270,
+ 266, 274, 277, 269, 278, 269, 281, 282, 0, 274,
+ 276, 0, 280, 285, 283, 277, 272, 279, 283, 273,
+ 275, 280, 276, 293, 282, 290, 284, 286, 274, 277,
+ 278, 278, 282, 284, 282, 285, 287, 288, 281, 280,
+ 285, 283, 286, 289, 287, 291, 292, 290, 294, 291,
+ 289, 282, 290, 284, 286, 293, 288, 295, 297, 296,
+ 300, 0, 298, 287, 288, 299, 305, 301, 292, 300,
+ 289, 0, 291, 292, 298, 302, 303, 306, 299, 295,
+ 294, 296, 307, 322, 295, 301, 296, 300, 302, 298,
+
+ 297, 304, 299, 304, 301, 303, 308, 311, 305, 309,
+ 314, 306, 302, 303, 306, 312, 311, 307, 313, 307,
+ 317, 314, 316, 324, 315, 322, 323, 326, 304, 325,
+ 318, 0, 308, 308, 311, 309, 309, 314, 315, 323,
+ 319, 312, 312, 317, 313, 313, 316, 317, 318, 316,
+ 315, 315, 320, 323, 325, 324, 325, 318, 319, 326,
+ 320, 327, 330, 328, 329, 315, 332, 319, 331, 334,
+ 0, 333, 0, 332, 0, 334, 336, 337, 327, 320,
+ 333, 335, 0, 0, 327, 342, 329, 339, 327, 328,
+ 328, 329, 331, 332, 330, 335, 334, 338, 333, 340,
+
+ 331, 337, 336, 336, 337, 327, 338, 340, 335, 341,
+ 339, 342, 342, 343, 339, 344, 345, 347, 341, 331,
+ 346, 0, 343, 349, 338, 351, 340, 348, 352, 359,
+ 356, 353, 344, 0, 359, 346, 341, 352, 349, 344,
+ 343, 0, 344, 351, 356, 355, 376, 346, 345, 347,
+ 349, 348, 351, 353, 348, 352, 0, 356, 353, 344,
+ 350, 359, 357, 358, 358, 350, 362, 0, 350, 355,
+ 361, 0, 355, 350, 350, 350, 350, 357, 376, 0,
+ 0, 0, 0, 350, 364, 369, 365, 350, 358, 357,
+ 358, 358, 350, 362, 361, 350, 364, 361, 365, 370,
+
+ 350, 350, 350, 350, 354, 367, 354, 363, 354, 368,
+ 363, 364, 369, 365, 366, 366, 0, 363, 354, 354,
+ 354, 370, 354, 367, 366, 371, 370, 368, 354, 372,
+ 0, 354, 367, 354, 363, 354, 368, 363, 373, 375,
+ 373, 366, 366, 377, 381, 354, 354, 354, 374, 354,
+ 379, 371, 371, 0, 378, 372, 372, 379, 377, 380,
+ 374, 375, 378, 0, 0, 373, 375, 382, 385, 382,
+ 377, 380, 384, 0, 386, 374, 381, 379, 382, 384,
+ 387, 378, 388, 0, 0, 382, 380, 389, 388, 389,
+ 385, 391, 396, 382, 382, 385, 382, 390, 395, 384,
+
+ 393, 0, 387, 0, 388, 382, 386, 387, 394, 388,
+ 390, 389, 382, 392, 389, 388, 389, 397, 393, 396,
+ 402, 400, 0, 391, 390, 401, 392, 393, 400, 392,
+ 395, 392, 402, 403, 394, 394, 414, 392, 404, 397,
+ 392, 407, 414, 401, 397, 403, 410, 402, 400, 401,
+ 406, 404, 401, 392, 407, 412, 392, 409, 392, 398,
+ 403, 398, 0, 414, 410, 404, 406, 398, 407, 409,
+ 401, 398, 415, 410, 406, 422, 398, 406, 411, 398,
+ 415, 419, 422, 411, 409, 398, 398, 412, 398, 416,
+ 413, 475, 418, 406, 398, 0, 417, 413, 398, 415,
+
+ 418, 416, 422, 398, 421, 421, 398, 399, 425, 399,
+ 411, 413, 420, 419, 417, 423, 416, 413, 475, 418,
+ 428, 420, 399, 417, 413, 399, 425, 399, 423, 399,
+ 425, 421, 428, 399, 399, 425, 399, 426, 427, 420,
+ 432, 424, 423, 0, 426, 427, 0, 428, 431, 399,
+ 424, 435, 399, 425, 399, 0, 399, 408, 408, 429,
+ 431, 430, 0, 433, 426, 427, 435, 408, 408, 408,
+ 408, 408, 432, 424, 408, 431, 438, 424, 435, 437,
+ 434, 429, 408, 430, 408, 408, 429, 434, 430, 433,
+ 433, 436, 437, 441, 408, 408, 408, 408, 408, 440,
+
+ 436, 408, 439, 0, 439, 449, 437, 434, 438, 443,
+ 440, 442, 442, 0, 444, 441, 443, 445, 436, 446,
+ 441, 444, 447, 448, 0, 458, 440, 449, 445, 439,
+ 446, 0, 449, 450, 450, 447, 443, 453, 458, 451,
+ 442, 444, 452, 455, 445, 454, 446, 461, 448, 447,
+ 448, 450, 458, 454, 463, 455, 456, 452, 450, 457,
+ 450, 450, 451, 453, 453, 452, 451, 456, 457, 452,
+ 455, 462, 454, 459, 459, 465, 463, 466, 450, 461,
+ 464, 463, 0, 456, 452, 459, 457, 459, 0, 462,
+ 467, 0, 459, 465, 470, 468, 467, 0, 462, 473,
+
+ 459, 459, 465, 464, 0, 474, 469, 464, 471, 466,
+ 0, 480, 459, 472, 459, 460, 468, 467, 470, 474,
+ 472, 470, 468, 460, 460, 473, 473, 460, 460, 469,
+ 471, 460, 474, 469, 477, 471, 476, 460, 478, 482,
+ 472, 479, 460, 480, 476, 483, 0, 481, 485, 486,
+ 460, 460, 478, 484, 460, 460, 477, 483, 460, 484,
+ 505, 477, 482, 476, 488, 478, 482, 479, 479, 481,
+ 485, 486, 483, 487, 481, 485, 486, 489, 490, 488,
+ 484, 487, 491, 492, 489, 0, 493, 490, 494, 495,
+ 496, 488, 505, 499, 494, 497, 0, 491, 0, 487,
+
+ 487, 493, 500, 0, 489, 490, 498, 492, 487, 491,
+ 492, 495, 496, 493, 502, 494, 495, 496, 497, 499,
+ 499, 498, 497, 503, 500, 501, 0, 506, 503, 500,
+ 508, 501, 509, 498, 515, 514, 508, 510, 511, 512,
+ 502, 502, 514, 510, 520, 512, 513, 522, 519, 515,
+ 503, 509, 501, 506, 506, 519, 511, 508, 517, 509,
+ 517, 515, 514, 518, 510, 511, 512, 517, 513, 521,
+ 525, 524, 518, 513, 596, 519, 520, 523, 526, 522,
+ 523, 527, 521, 596, 533, 517, 529, 517, 523, 524,
+ 518, 531, 528, 530, 527, 528, 521, 532, 524, 535,
+
+ 526, 596, 525, 531, 523, 526, 530, 523, 527, 538,
+ 529, 528, 536, 529, 534, 532, 533, 0, 531, 528,
+ 530, 534, 528, 535, 532, 537, 535, 539, 540, 542,
+ 541, 538, 539, 544, 540, 536, 538, 543, 537, 542,
+ 546, 534, 547, 545, 536, 544, 553, 548, 0, 554,
+ 547, 546, 537, 541, 539, 540, 542, 541, 553, 543,
+ 544, 548, 536, 0, 543, 545, 0, 546, 0, 547,
+ 545, 551, 554, 553, 548, 549, 554, 552, 551, 555,
+ 549, 556, 549, 552, 557, 0, 0, 555, 549, 558,
+ 549, 0, 559, 549, 549, 557, 559, 0, 551, 0,
+
+ 549, 549, 549, 556, 552, 0, 555, 549, 556, 549,
+ 560, 557, 558, 561, 559, 549, 558, 549, 565, 559,
+ 549, 549, 560, 559, 563, 562, 567, 549, 562, 564,
+ 565, 569, 566, 561, 0, 561, 562, 560, 569, 564,
+ 561, 570, 563, 566, 568, 565, 572, 571, 568, 571,
+ 567, 563, 562, 567, 576, 562, 577, 573, 569, 566,
+ 561, 564, 574, 575, 577, 578, 564, 570, 570, 573,
+ 578, 568, 572, 572, 571, 575, 579, 574, 580, 581,
+ 576, 576, 582, 577, 573, 585, 583, 581, 0, 574,
+ 575, 587, 578, 586, 582, 589, 580, 593, 579, 588,
+
+ 585, 590, 594, 579, 0, 580, 581, 583, 603, 582,
+ 593, 586, 585, 583, 587, 592, 590, 591, 587, 595,
+ 586, 0, 588, 592, 593, 597, 588, 589, 590, 591,
+ 599, 595, 600, 598, 594, 600, 602, 601, 604, 605,
+ 603, 606, 592, 607, 591, 608, 595, 598, 597, 609,
+ 618, 612, 597, 604, 610, 599, 601, 599, 607, 600,
+ 598, 611, 609, 602, 601, 604, 610, 613, 615, 608,
+ 607, 605, 608, 606, 612, 614, 609, 618, 612, 615,
+ 619, 610, 614, 611, 616, 614, 617, 621, 611, 616,
+ 622, 613, 624, 614, 613, 615, 623, 0, 625, 626,
+
+ 617, 629, 614, 625, 627, 628, 0, 619, 626, 614,
+ 627, 630, 614, 617, 631, 632, 616, 622, 638, 621,
+ 628, 633, 631, 623, 624, 629, 626, 634, 629, 636,
+ 625, 627, 628, 630, 632, 635, 637, 636, 630, 635,
+ 639, 631, 632, 640, 641, 633, 642, 639, 633, 634,
+ 638, 643, 646, 641, 634, 644, 636, 645, 646, 637,
+ 0, 647, 635, 637, 643, 649, 640, 639, 642, 645,
+ 640, 641, 648, 642, 651, 652, 649, 653, 643, 646,
+ 648, 644, 644, 647, 645, 655, 650, 657, 647, 656,
+ 653, 0, 649, 650, 655, 659, 657, 652, 660, 648,
+
+ 654, 665, 652, 0, 653, 654, 651, 658, 654, 654,
+ 661, 666, 655, 650, 657, 656, 656, 659, 658, 662,
+ 660, 664, 659, 661, 654, 660, 667, 654, 0, 666,
+ 670, 662, 654, 665, 658, 654, 654, 661, 666, 668,
+ 671, 669, 674, 672, 673, 664, 662, 0, 664, 669,
+ 667, 674, 670, 667, 675, 673, 677, 670, 676, 679,
+ 683, 668, 668, 0, 671, 672, 668, 671, 669, 674,
+ 672, 673, 676, 678, 675, 680, 681, 682, 677, 685,
+ 678, 675, 683, 677, 681, 676, 679, 683, 668, 682,
+ 684, 687, 685, 680, 686, 688, 684, 689, 690, 691,
+
+ 678, 693, 680, 681, 682, 686, 685, 692, 692, 687,
+ 688, 694, 693, 701, 697, 695, 703, 684, 687, 690,
+ 704, 686, 688, 691, 696, 690, 691, 697, 693, 689,
+ 698, 699, 700, 696, 702, 694, 692, 695, 694, 714,
+ 700, 697, 695, 698, 704, 701, 706, 704, 703, 707,
+ 705, 696, 705, 699, 710, 709, 702, 698, 699, 700,
+ 707, 702, 708, 717, 712, 711, 710, 708, 706, 709,
+ 0, 714, 715, 706, 719, 716, 707, 705, 712, 718,
+ 715, 710, 709, 711, 723, 717, 718, 720, 721, 0,
+ 717, 712, 711, 716, 708, 713, 0, 713, 724, 715,
+
+ 719, 719, 716, 722, 713, 0, 718, 720, 721, 727,
+ 725, 713, 713, 724, 720, 721, 723, 796, 722, 713,
+ 725, 726, 713, 729, 713, 724, 726, 722, 732, 731,
+ 722, 713, 725, 730, 732, 727, 727, 725, 713, 713,
+ 728, 730, 728, 733, 796, 722, 739, 725, 729, 734,
+ 729, 736, 733, 726, 731, 732, 731, 735, 734, 736,
+ 730, 737, 738, 740, 744, 741, 735, 728, 737, 739,
+ 733, 742, 744, 739, 747, 746, 734, 741, 736, 0,
+ 743, 740, 0, 742, 735, 786, 745, 746, 737, 743,
+ 740, 744, 741, 748, 738, 745, 749, 750, 742, 752,
+
+ 748, 0, 746, 751, 754, 752, 747, 743, 753, 749,
+ 745, 751, 750, 745, 756, 0, 753, 786, 0, 755,
+ 748, 761, 745, 749, 750, 756, 752, 754, 755, 757,
+ 751, 754, 759, 758, 758, 753, 760, 762, 757, 763,
+ 759, 756, 758, 761, 760, 764, 755, 766, 761, 765,
+ 762, 767, 0, 769, 0, 766, 757, 768, 770, 759,
+ 758, 758, 765, 760, 762, 763, 763, 767, 764, 770,
+ 768, 771, 764, 772, 766, 769, 765, 773, 767, 771,
+ 769, 774, 775, 776, 768, 770, 776, 772, 781, 777,
+ 778, 0, 779, 780, 782, 0, 783, 773, 771, 803,
+
+ 772, 779, 775, 774, 773, 787, 781, 782, 774, 775,
+ 776, 777, 778, 780, 783, 781, 777, 778, 784, 779,
+ 780, 782, 785, 783, 788, 0, 790, 787, 791, 789,
+ 792, 803, 787, 0, 793, 802, 784, 785, 795, 790,
+ 0, 794, 792, 802, 795, 784, 791, 806, 788, 785,
+ 799, 788, 789, 790, 794, 791, 789, 792, 793, 797,
+ 800, 793, 802, 804, 798, 795, 805, 797, 794, 798,
+ 806, 804, 799, 805, 806, 809, 807, 799, 800, 808,
+ 810, 808, 811, 814, 809, 797, 797, 800, 812, 813,
+ 804, 807, 814, 805, 797, 815, 798, 815, 816, 0,
+
+ 827, 819, 809, 807, 0, 816, 808, 812, 823, 813,
+ 814, 0, 810, 819, 811, 812, 813, 0, 823, 0,
+ 826, 827, 815, 831, 0, 816, 817, 827, 819, 817,
+ 0, 830, 829, 817, 832, 823, 817, 829, 826, 833,
+ 0, 831, 834, 817, 817, 832, 817, 826, 835, 836,
+ 831, 817, 830, 817, 838, 837, 817, 840, 830, 829,
+ 817, 832, 833, 817, 837, 836, 833, 838, 834, 834,
+ 817, 817, 839, 817, 835, 835, 836, 842, 845, 839,
+ 843, 838, 837, 0, 842, 844, 846, 845, 849, 840,
+ 0, 844, 847, 0, 0, 847, 0, 0, 848, 839,
+
+ 841, 841, 843, 841, 842, 845, 841, 843, 850, 846,
+ 849, 841, 844, 846, 848, 849, 850, 841, 841, 847,
+ 841, 848, 852, 856, 851, 848, 841, 841, 841, 853,
+ 841, 853, 855, 841, 852, 850, 854, 855, 841, 857,
+ 858, 848, 860, 856, 841, 841, 851, 841, 859, 852,
+ 856, 851, 858, 862, 861, 864, 853, 863, 865, 866,
+ 854, 0, 0, 854, 855, 857, 857, 858, 860, 860,
+ 859, 868, 0, 872, 866, 859, 861, 862, 873, 863,
+ 862, 861, 864, 865, 863, 865, 866, 867, 869, 870,
+ 874, 871, 872, 876, 868, 867, 870, 869, 868, 871,
+
+ 872, 875, 874, 877, 873, 873, 876, 879, 875, 881,
+ 878, 882, 883, 886, 867, 869, 870, 874, 871, 878,
+ 876, 880, 879, 887, 888, 892, 880, 884, 875, 877,
+ 877, 896, 884, 882, 879, 886, 889, 878, 882, 883,
+ 886, 881, 890, 893, 894, 889, 891, 895, 880, 888,
+ 890, 888, 896, 891, 898, 887, 897, 892, 896, 884,
+ 899, 901, 903, 889, 0, 893, 905, 904, 900, 890,
+ 893, 895, 909, 891, 895, 897, 894, 900, 913, 912,
+ 901, 898, 902, 897, 903, 907, 905, 899, 901, 903,
+ 904, 902, 906, 905, 904, 900, 907, 908, 910, 909,
+
+ 915, 906, 911, 0, 914, 908, 912, 957, 915, 902,
+ 913, 918, 907, 914, 917, 920, 910, 919, 919, 906,
+ 918, 911, 921, 922, 908, 910, 922, 915, 923, 911,
+ 924, 914, 917, 920, 921, 925, 926, 927, 918, 957,
+ 923, 917, 920, 928, 919, 929, 0, 929, 930, 921,
+ 922, 931, 924, 925, 933, 923, 928, 924, 934, 927,
+ 926, 936, 925, 926, 927, 931, 930, 933, 932, 936,
+ 928, 935, 929, 932, 937, 930, 938, 939, 931, 938,
+ 942, 933, 940, 935, 934, 934, 939, 943, 936, 944,
+ 940, 945, 937, 946, 0, 944, 0, 947, 935, 946,
+
+ 932, 937, 0, 938, 939, 942, 940, 942, 948, 940,
+ 954, 952, 0, 945, 943, 948, 944, 940, 945, 947,
+ 946, 949, 950, 951, 947, 955, 958, 950, 949, 952,
+ 951, 956, 953, 954, 955, 948, 953, 954, 952, 956,
+ 959, 963, 964, 960, 958, 967, 0, 962, 949, 950,
+ 951, 966, 955, 958, 960, 959, 961, 968, 956, 953,
+ 962, 964, 963, 965, 961, 968, 972, 959, 963, 964,
+ 960, 970, 967, 966, 962, 969, 965, 978, 966, 971,
+ 973, 976, 969, 961, 968, 972, 971, 973, 976, 970,
+ 965, 974, 975, 972, 977, 979, 974, 980, 970, 981,
+
+ 975, 977, 969, 982, 984, 983, 971, 973, 976, 978,
+ 980, 985, 983, 992, 986, 987, 982, 989, 974, 975,
+ 988, 977, 991, 987, 980, 993, 994, 979, 988, 995,
+ 982, 981, 983, 997, 990, 988, 984, 986, 995, 989,
+ 990, 986, 987, 985, 989, 992, 996, 988, 991, 991,
+ 994, 998, 999, 994, 1000, 988, 995, 993, 998, 0,
+ 996, 990, 1001, 1000, 1002, 997, 1004, 1006, 1005, 1003,
+ 1008, 1004, 0, 996, 1007, 1008, 1001, 0, 998, 999,
+ 1005, 1000, 1003, 1011, 1003, 1009, 1002, 1010, 0, 1001,
+ 1006, 1002, 1009, 1003, 1006, 1005, 1003, 1008, 1004, 1010,
+
+ 1007, 1007, 1016, 1014, 1015, 1011, 1014, 1012, 1018, 1003,
+ 1011, 1003, 1009, 1016, 1010, 1012, 1019, 1015, 1020, 0,
+ 1022, 1050, 1018, 1019, 1020, 0, 1016, 0, 1024, 1016,
+ 1014, 1015, 0, 1026, 1012, 1018, 1023, 0, 1025, 1027,
+ 1016, 1027, 1022, 1019, 0, 1020, 1021, 1022, 1021, 1029,
+ 1025, 1024, 1021, 1050, 1021, 1024, 1029, 1028, 1028, 1021,
+ 1026, 1031, 1023, 1023, 1021, 1025, 1027, 1032, 0, 1033,
+ 1021, 1030, 1034, 1021, 1031, 1021, 1029, 1034, 0, 1021,
+ 1028, 1021, 1033, 1030, 1028, 1028, 1021, 1035, 1031, 1032,
+ 1036, 1021, 1043, 1040, 1032, 1037, 1033, 1038, 1030, 1041,
+
+ 1042, 0, 1039, 1036, 1034, 1035, 1039, 1037, 1040, 1038,
+ 1045, 0, 1046, 1042, 1035, 1048, 1039, 1036, 1037, 1043,
+ 1040, 1041, 1037, 1045, 1038, 1044, 1041, 1042, 1039, 1039,
+ 1046, 1044, 1047, 1039, 1037, 1049, 1048, 1045, 1051, 1046,
+ 1052, 1054, 1048, 1039, 1055, 1056, 0, 1057, 0, 1055,
+ 1059, 1061, 1044, 1056, 1047, 0, 1057, 1049, 0, 1047,
+ 1063, 0, 1049, 1060, 1061, 1059, 0, 1052, 1062, 1064,
+ 1051, 1055, 1056, 1054, 1057, 1058, 1066, 1059, 1061, 1065,
+ 1058, 1067, 1058, 1062, 1068, 1060, 1063, 1063, 1058, 1066,
+ 1060, 1064, 1067, 1058, 1058, 1062, 1064, 1068, 1065, 1071,
+
+ 1058, 1058, 1058, 1066, 1069, 1070, 1065, 1058, 1067, 1058,
+ 1071, 1068, 1069, 1070, 1072, 1058, 1073, 1076, 1074, 0,
+ 1058, 1058, 1083, 1079, 1080, 1075, 1071, 1058, 1076, 1081,
+ 1077, 1069, 1070, 1074, 1075, 1084, 1081, 0, 1073, 1077,
+ 1078, 1086, 1088, 1073, 1076, 1074, 1072, 1080, 1089, 1078,
+ 1079, 1080, 1075, 1085, 1083, 1087, 1081, 1077, 1090, 1084,
+ 1092, 1085, 1084, 1086, 1095, 1093, 1090, 1078, 1086, 1087,
+ 1089, 1096, 1097, 1094, 1088, 1089, 1102, 1096, 1092, 1099,
+ 1085, 1098, 1087, 1093, 1094, 1090, 1100, 1092, 1103, 1098,
+ 1097, 1101, 1093, 1100, 1104, 1103, 1095, 1109, 1096, 1097,
+
+ 1094, 1099, 1102, 1102, 1101, 1105, 1099, 1106, 1098, 1104,
+ 1107, 1113, 1108, 1100, 1115, 1103, 1111, 1118, 1101, 1114,
+ 1117, 1104, 1108, 1105, 1113, 1106, 1114, 1111, 1116, 1109,
+ 1116, 1107, 1105, 1131, 1106, 1120, 1119, 1107, 1113, 1108,
+ 1115, 1115, 1117, 1111, 1119, 1121, 1114, 1117, 1120, 1118,
+ 1129, 1123, 1122, 1124, 1121, 1116, 1132, 1130, 1133, 1127,
+ 1128, 1138, 1120, 1119, 1122, 1131, 1138, 0, 1129, 1176,
+ 0, 1200, 1121, 1123, 0, 1124, 1133, 1129, 1123, 1122,
+ 1124, 1127, 1128, 1130, 1130, 1133, 1127, 1128, 1132, 1134,
+ 1135, 1137, 1143, 1138, 1140, 1141, 1176, 1140, 1200, 1142,
+
+ 1150, 1134, 1137, 1144, 1135, 1143, 1145, 1141, 1146, 1150,
+ 1144, 1147, 1147, 0, 1149, 1146, 1134, 1135, 1137, 1143,
+ 1140, 1140, 1141, 1142, 1140, 1147, 1142, 1150, 1145, 1148,
+ 1144, 1151, 1152, 1145, 1149, 1146, 1153, 1160, 1147, 1147,
+ 1148, 1149, 1154, 1155, 1152, 1151, 0, 1158, 0, 1154,
+ 1156, 1157, 1161, 1166, 0, 1162, 1148, 1169, 1151, 1152,
+ 1158, 1162, 1156, 1160, 1160, 1163, 1164, 1167, 1153, 1154,
+ 1165, 1166, 1169, 1157, 1158, 1155, 1161, 1156, 1157, 1161,
+ 1166, 1165, 1162, 1168, 1169, 1171, 1173, 1163, 1164, 1167,
+ 1172, 1177, 1163, 1164, 1167, 1175, 1174, 1165, 1179, 1178,
+
+ 1186, 1172, 1174, 1180, 1184, 1168, 1171, 1173, 1178, 1177,
+ 1168, 1181, 1171, 1173, 1183, 1187, 1182, 1172, 1177, 1185,
+ 1181, 1183, 1179, 1174, 1182, 1179, 1178, 1175, 1184, 1180,
+ 1180, 1184, 1186, 1185, 1188, 1189, 1190, 1191, 1181, 1193,
+ 0, 1183, 1198, 1182, 0, 1192, 1185, 1187, 1195, 1197,
+ 1196, 1199, 0, 0, 0, 0, 1197, 1189, 1190, 1196,
+ 0, 1201, 1189, 1190, 1202, 1203, 1188, 1192, 1208, 1191,
+ 1195, 1193, 1192, 1199, 1198, 1195, 1197, 1196, 1199, 1201,
+ 1204, 1206, 1202, 1213, 1208, 1205, 1207, 1203, 1201, 1204,
+ 1210, 1202, 1203, 1205, 1209, 1208, 1211, 1214, 1212, 1210,
+
+ 1216, 1217, 0, 0, 0, 1206, 1212, 1204, 1206, 0,
+ 1207, 1211, 1205, 1207, 1215, 1213, 1209, 1210, 1219, 1220,
+ 1224, 1209, 1216, 1211, 1218, 1212, 1215, 1216, 1217, 1214,
+ 1221, 1219, 1218, 1223, 1220, 1225, 1228, 1229, 1224, 1221,
+ 1230, 1215, 1223, 1225, 1228, 1219, 1220, 1224, 1226, 1231,
+ 1226, 1218, 1232, 1236, 1234, 1229, 1233, 1221, 1237, 1240,
+ 1223, 1234, 1225, 1228, 1229, 1239, 1236, 1230, 1231, 1238,
+ 1237, 1242, 1244, 1245, 1232, 1226, 1231, 1240, 1233, 1232,
+ 1236, 1234, 1241, 1233, 1238, 1237, 1240, 1239, 1243, 1246,
+ 1247, 1249, 1239, 1252, 1241, 1243, 1238, 1250, 1242, 1248,
+
+ 0, 1251, 1247, 1256, 1244, 1245, 1252, 1254, 1246, 1241,
+ 1248, 1256, 1253, 1249, 1257, 1243, 1246, 1247, 1249, 1255,
+ 1252, 1259, 1250, 1251, 1250, 1253, 1248, 1258, 1251, 1254,
+ 1256, 1255, 1260, 1259, 1254, 1262, 1263, 1264, 1257, 1253,
+ 1260, 1257, 1266, 1265, 1267, 1268, 1255, 1258, 1259, 1263,
+ 1269, 1266, 0, 1274, 1258, 1272, 1267, 1269, 1273, 1260,
+ 1264, 1265, 1262, 1263, 1264, 1270, 1268, 1275, 1276, 1266,
+ 1265, 1267, 1268, 1278, 1270, 1274, 1270, 1269, 1272, 1270,
+ 1274, 1279, 1272, 1277, 1273, 1273, 1278, 1270, 1276, 1282,
+ 1280, 1284, 1270, 1281, 1275, 1276, 1285, 1277, 1280, 1286,
+
+ 1278, 1270, 1281, 1270, 1285, 1279, 1270, 1282, 1279, 1287,
+ 1277, 1288, 1289, 1284, 1286, 1290, 1282, 1280, 1284, 1291,
+ 1281, 1293, 1294, 1285, 1298, 1289, 1286, 1291, 1295, 1296,
+ 1297, 1290, 1302, 1288, 0, 1299, 1296, 1308, 1288, 1289,
+ 1302, 1287, 1290, 1308, 1294, 1305, 1291, 1298, 1293, 1294,
+ 1295, 1298, 1297, 1299, 1300, 1295, 1296, 1297, 1301, 1302,
+ 1303, 1304, 1299, 1306, 1308, 1305, 1300, 1307, 1309, 1303,
+ 1301, 1310, 1305, 1304, 1311, 1307, 1313, 1309, 1306, 0,
+ 0, 1300, 0, 0, 1303, 1301, 1311, 1303, 1304, 1312,
+ 1306, 1316, 1310, 1323, 1307, 1309, 1303, 1314, 1310, 1315,
+
+ 1312, 1311, 1317, 1318, 1314, 1312, 1315, 1319, 1313, 1316,
+ 1324, 1318, 1320, 1321, 1317, 1321, 1312, 1324, 1316, 1322,
+ 1320, 1326, 1319, 1327, 1314, 1323, 1315, 1312, 1328, 1317,
+ 1318, 1322, 1329, 1331, 1319, 1327, 1330, 1324, 1337, 1320,
+ 1321, 1328, 1332, 1330, 1331, 1336, 1322, 1333, 1335, 1334,
+ 1327, 1329, 1337, 1326, 1334, 1328, 1335, 1338, 1336, 1329,
+ 1331, 1340, 1333, 1330, 1332, 1337, 1343, 1346, 1341, 1332,
+ 1348, 0, 1336, 1342, 1333, 1335, 0, 0, 1344, 1345,
+ 0, 1334, 1341, 1338, 1338, 1339, 1340, 0, 1340, 1339,
+ 1346, 1342, 1339, 1339, 1346, 1341, 1347, 1339, 1343, 1349,
+
+ 1342, 1345, 1348, 1339, 1344, 1344, 1345, 1339, 1354, 1350,
+ 1354, 1339, 1339, 1351, 1347, 1358, 1339, 1353, 1359, 1339,
+ 1339, 1349, 1352, 1347, 1339, 1353, 1349, 1360, 1352, 1366,
+ 1339, 1350, 1354, 1356, 1339, 1354, 1350, 1354, 1355, 1351,
+ 1351, 1357, 1356, 1353, 1353, 1355, 1361, 1358, 1362, 1352,
+ 1359, 1360, 1353, 1364, 1360, 1362, 1357, 1363, 1365, 1368,
+ 1356, 1366, 1367, 1370, 1361, 1355, 1364, 1365, 1357, 1374,
+ 1369, 1373, 0, 1361, 1371, 1362, 0, 1375, 1384, 1363,
+ 1364, 1385, 1374, 1367, 1363, 1365, 1370, 1379, 1371, 1367,
+ 1370, 1368, 1369, 1373, 1376, 1376, 1374, 1369, 1373, 1377,
+
+ 1380, 1371, 1372, 1375, 1375, 1384, 0, 1372, 1385, 1372,
+ 1379, 1372, 1380, 1372, 1379, 1377, 1382, 1381, 1387, 1383,
+ 1372, 1389, 1388, 1376, 1381, 1382, 1377, 1380, 1386, 1372,
+ 1392, 0, 1387, 1386, 1372, 1388, 1372, 1383, 1372, 1389,
+ 1372, 1390, 1391, 1382, 1381, 1387, 1383, 1391, 1389, 1388,
+ 1393, 1400, 1392, 1394, 1395, 1398, 1396, 1392, 1399, 1390,
+ 1386, 1397, 1395, 1393, 1396, 0, 1400, 1401, 1390, 1391,
+ 1403, 1394, 1405, 1406, 1397, 0, 1402, 1393, 1400, 1409,
+ 1394, 1395, 1404, 1396, 1399, 1399, 1401, 1398, 1397, 1402,
+ 1405, 1410, 1403, 1406, 1401, 1404, 1407, 1403, 1411, 1405,
+
+ 1406, 1409, 1408, 1402, 1408, 1407, 1409, 1412, 1413, 1404,
+ 1411, 1414, 0, 1416, 1418, 1419, 1420, 1417, 1410, 1421,
+ 1422, 1428, 1418, 1407, 1423, 1411, 1421, 1424, 1433, 1408,
+ 1413, 0, 0, 1419, 1412, 1413, 1414, 1416, 1414, 1417,
+ 1416, 1418, 1419, 1420, 1417, 1431, 1421, 1422, 1428, 1424,
+ 1423, 1423, 1425, 1426, 1424, 1427, 1429, 1430, 1425, 1426,
+ 1433, 1427, 1440, 1429, 1432, 1434, 1437, 1430, 1435, 1431,
+ 1439, 1432, 1431, 1436, 1440, 1437, 1441, 1442, 0, 1425,
+ 1426, 1447, 1427, 1429, 1430, 1444, 1435, 1434, 1443, 1440,
+ 1441, 1432, 1434, 1437, 1439, 1435, 1446, 1439, 1436, 1442,
+
+ 1436, 1443, 1445, 1441, 1442, 1447, 1448, 1444, 1447, 1449,
+ 1450, 1451, 1444, 1452, 0, 1443, 1454, 1456, 1446, 1453,
+ 1451, 1445, 1457, 1446, 1460, 1458, 1459, 0, 1448, 1445,
+ 1454, 1464, 1450, 1448, 1452, 1449, 1449, 1450, 1451, 1453,
+ 1452, 1461, 1462, 1454, 1463, 1468, 1453, 1458, 1459, 1456,
+ 1462, 1474, 1458, 1459, 1457, 1465, 1460, 1466, 1464, 1461,
+ 1463, 1469, 1465, 1470, 1466, 1471, 1472, 1468, 1461, 1462,
+ 1469, 1463, 1468, 1472, 1473, 1475, 1476, 1471, 1473, 1477,
+ 1470, 1479, 1465, 1474, 1466, 1480, 0, 1483, 1469, 1482,
+ 1470, 1480, 1471, 1472, 0, 1477, 1481, 1476, 1480, 1485,
+
+ 0, 1473, 1481, 1476, 1486, 0, 1477, 1475, 1484, 1481,
+ 1488, 1482, 1480, 1479, 1485, 1484, 1482, 1486, 1480, 1483,
+ 1489, 1487, 1490, 1481, 1490, 1491, 1485, 1489, 1492, 1481,
+ 1487, 1486, 1493, 1494, 1491, 1484, 1488, 1488, 1495, 1496,
+ 1499, 1493, 1495, 1498, 1500, 1502, 1503, 1489, 1487, 1490,
+ 1492, 1498, 1491, 1499, 1502, 1492, 1504, 1501, 1500, 1493,
+ 1494, 1496, 1501, 1505, 1503, 1495, 1496, 1499, 1506, 1509,
+ 1498, 1500, 1502, 1503, 1507, 1504, 1505, 1507, 1508, 1511,
+ 1506, 1508, 1510, 1504, 1513, 0, 1507, 1509, 1514, 1501,
+ 1505, 1515, 1511, 1517, 1516, 1506, 1509, 1521, 1517, 1514,
+
+ 1508, 1507, 0, 1518, 1507, 1508, 1511, 1510, 1508, 1510,
+ 1516, 1518, 1519, 1519, 1515, 1514, 1513, 1520, 1515, 1521,
+ 1522, 1516, 1524, 1523, 1521, 1517, 1520, 1525, 1527, 1526,
+ 1518, 1524, 1530, 1529, 1525, 1527, 1532, 1536, 1533, 1519,
+ 0, 1530, 1522, 1531, 1520, 1523, 1529, 1522, 1534, 1524,
+ 1523, 1526, 1531, 1537, 1525, 1527, 1526, 1534, 1535, 1530,
+ 1529, 1533, 1532, 1532, 1539, 1533, 1535, 1538, 1537, 1536,
+ 1531, 1540, 1539, 1543, 1541, 1534, 1542, 1544, 1538, 1548,
+ 1537, 1543, 1545, 1546, 1540, 1535, 1541, 1547, 1542, 1549,
+ 1551, 1539, 1548, 1552, 1538, 1556, 1547, 1557, 1540, 1544,
+
+ 1543, 1541, 1545, 1542, 1544, 1546, 1548, 1550, 1551, 1545,
+ 1546, 1549, 1553, 1550, 1547, 1554, 1549, 1551, 1555, 1552,
+ 1552, 1556, 1556, 1558, 1553, 1555, 1560, 1559, 0, 1557,
+ 1561, 1564, 1563, 1554, 1550, 1562, 1566, 1564, 1565, 1553,
+ 1559, 1567, 1554, 1563, 1568, 1555, 0, 0, 1569, 0,
+ 0, 1570, 1560, 1560, 1559, 1558, 1562, 1561, 1564, 1563,
+ 1565, 1572, 1562, 1573, 1574, 1565, 1576, 1579, 1566, 1583,
+ 1570, 1575, 1570, 1567, 1569, 1569, 1568, 1570, 1570, 1577,
+ 1575, 1576, 1574, 1578, 0, 1580, 1573, 1579, 1572, 1581,
+ 1573, 1574, 1577, 1576, 1579, 1578, 1581, 1570, 1575, 1570,
+
+ 1582, 1583, 1584, 1587, 1585, 1586, 1577, 1589, 1587, 1588,
+ 1578, 1580, 1580, 1586, 1588, 1590, 1581, 1585, 1591, 1582,
+ 1592, 1594, 1590, 1600, 1584, 1593, 0, 1582, 1592, 1584,
+ 1589, 1585, 1586, 1593, 1589, 1587, 1595, 1602, 1596, 1594,
+ 1601, 1588, 1590, 1597, 1591, 1591, 1596, 1592, 1594, 1598,
+ 1599, 1597, 1593, 1604, 1607, 1600, 1598, 1603, 1595, 1599,
+ 1604, 1605, 1601, 1595, 1609, 1596, 1603, 1601, 1610, 1602,
+ 1597, 1606, 1606, 1605, 1608, 1611, 1598, 1599, 1612, 1613,
+ 1604, 1614, 1608, 1611, 1603, 1609, 1607, 1613, 1605, 1614,
+ 1620, 1609, 1619, 0, 1621, 1615, 1612, 1617, 1606, 1616,
+
+ 1610, 1608, 1611, 1615, 1619, 1612, 1613, 1616, 1614, 1618,
+ 1617, 1625, 1622, 1624, 1626, 1618, 1620, 1620, 1621, 1619,
+ 1622, 1621, 1615, 1623, 1617, 1627, 1616, 1631, 1624, 1629,
+ 1628, 1623, 1630, 1639, 1632, 0, 1618, 1637, 1625, 1622,
+ 1624, 1626, 1639, 1629, 1630, 1631, 1640, 1627, 1632, 1647,
+ 1623, 1635, 1627, 1628, 1631, 1635, 1629, 1628, 1638, 1630,
+ 1639, 1632, 1641, 1637, 1637, 1642, 1645, 1643, 1635, 1646,
+ 1640, 1650, 1644, 1640, 1643, 1648, 1635, 1642, 1635, 1651,
+ 1638, 1647, 1635, 1644, 1641, 1638, 1649, 1648, 1652, 1641,
+ 1656, 1646, 1642, 1645, 1643, 1635, 1646, 1653, 1654, 1644,
+
+ 1649, 1651, 1648, 1650, 1658, 1654, 1651, 1655, 1656, 0,
+ 1659, 1652, 1657, 1649, 1661, 1652, 1655, 1656, 1663, 1657,
+ 1653, 1664, 1665, 1661, 1653, 1654, 1666, 1664, 1667, 1670,
+ 1672, 1668, 1673, 0, 1655, 1674, 1658, 1659, 1668, 1657,
+ 1675, 1661, 0, 0, 1665, 1678, 1674, 1681, 1664, 1665,
+ 1663, 1675, 1666, 1666, 1672, 1676, 1670, 1672, 1668, 1673,
+ 1667, 1680, 1674, 1683, 1679, 1681, 1676, 1675, 1680, 1678,
+ 1679, 1682, 1678, 1684, 1681, 1685, 1686, 1687, 1682, 1688,
+ 1689, 1685, 1676, 1690, 1686, 1684, 1692, 1691, 1680, 1683,
+ 1683, 1679, 1688, 1696, 1695, 1692, 1693, 0, 1682, 1687,
+
+ 1684, 1695, 1685, 1686, 1687, 1691, 1688, 1698, 1693, 1690,
+ 1690, 1697, 1689, 1692, 1691, 1694, 1698, 1694, 1699, 1696,
+ 1696, 1695, 1701, 1693, 1697, 1700, 1703, 1702, 0, 1704,
+ 1705, 1706, 1707, 1703, 1698, 1705, 1709, 1700, 1697, 1706,
+ 1699, 1708, 1694, 1710, 1709, 1699, 1712, 1714, 1707, 1701,
+ 1702, 0, 1700, 1703, 1702, 1704, 1704, 1705, 1706, 1707,
+ 1716, 1713, 1715, 1709, 1708, 1710, 1713, 1717, 1708, 0,
+ 1710, 1714, 1718, 1712, 1714, 1719, 1715, 1721, 1717, 1724,
+ 1723, 1718, 1716, 1720, 1720, 1726, 1725, 1716, 1719, 1715,
+ 1721, 1720, 1726, 1713, 1717, 1722, 1727, 1722, 1723, 1718,
+
+ 1729, 1731, 1719, 1732, 1721, 1724, 1724, 1723, 1725, 1728,
+ 1720, 1720, 1726, 1725, 1735, 1733, 1728, 1730, 1727, 1734,
+ 1737, 1732, 1722, 1727, 1729, 1730, 1734, 1729, 1731, 1736,
+ 1732, 1738, 1739, 1740, 1742, 1743, 1728, 1733, 1738, 1735,
+ 1744, 1735, 1733, 1746, 1730, 1745, 1734, 1742, 1744, 0,
+ 1747, 1736, 1737, 1745, 1749, 1740, 1736, 1751, 1738, 1752,
+ 1740, 1742, 1743, 1750, 1739, 1746, 1750, 1744, 1755, 1753,
+ 1746, 1747, 1745, 1756, 0, 1757, 1749, 1747, 1754, 1758,
+ 1755, 1749, 1753, 1751, 1751, 1752, 1752, 1754, 1758, 1759,
+ 1750, 1760, 1763, 1762, 0, 1755, 1753, 1756, 1760, 1764,
+
+ 1756, 1757, 1757, 1765, 1759, 1754, 1758, 1761, 1762, 1770,
+ 1761, 1767, 1769, 1768, 1769, 1771, 1759, 1776, 1760, 1765,
+ 1762, 1764, 1761, 1773, 1763, 1772, 1764, 1765, 1772, 1767,
+ 1765, 1761, 1774, 1770, 1761, 1768, 1770, 1761, 1767, 1769,
+ 1768, 1775, 1771, 1776, 1776, 1777, 1765, 1778, 1779, 1761,
+ 1781, 1780, 1772, 1782, 1785, 1773, 1786, 1784, 1787, 1781,
+ 1783, 1782, 1789, 1775, 1774, 1780, 1792, 1783, 1775, 1788,
+ 1779, 1777, 1777, 1791, 1794, 1779, 1793, 1781, 1780, 1778,
+ 1782, 1784, 0, 1794, 1784, 1790, 1785, 1783, 1786, 1790,
+ 1787, 1788, 1795, 1792, 1789, 1791, 1788, 1796, 1793, 1795,
+
+ 1791, 1794, 1797, 1793, 1800, 1798, 1803, 1799, 1801, 1796,
+ 1802, 1797, 1790, 1798, 1799, 1803, 1804, 1800, 1804, 1795,
+ 1807, 1801, 1805, 1802, 1796, 1806, 1808, 1810, 1807, 1797,
+ 1812, 1800, 1798, 1803, 1799, 1801, 1811, 1802, 1813, 0,
+ 1822, 1814, 1810, 1804, 1812, 1805, 1808, 1807, 1814, 1805,
+ 1806, 1811, 1806, 1808, 1810, 1815, 1817, 1812, 1816, 1820,
+ 1818, 0, 1819, 1811, 1823, 1816, 1815, 1822, 1814, 1817,
+ 1813, 1823, 1824, 0, 1826, 1825, 1829, 1820, 1818, 1829,
+ 1827, 0, 1815, 1817, 1818, 1816, 1820, 1818, 1819, 1819,
+ 1825, 1823, 1827, 1828, 1824, 1830, 1831, 1832, 1833, 1824,
+
+ 1826, 1826, 1825, 1829, 1830, 1818, 1828, 1827, 1832, 1834,
+ 1833, 0, 1835, 1842, 1831, 1835, 1836, 1843, 1844, 1840,
+ 1828, 1832, 1830, 1831, 1832, 1833, 1838, 1836, 1840, 1834,
+ 1835, 1838, 1841, 1845, 1841, 1832, 1834, 1842, 1838, 1835,
+ 1842, 1846, 1835, 1836, 1843, 1844, 1840, 1847, 1845, 1848,
+ 1846, 1849, 1850, 1838, 1851, 1852, 1855, 1853, 1838, 1841,
+ 1845, 1848, 1851, 1854, 1856, 1857, 1850, 1853, 1846, 1863,
+ 1856, 1847, 1863, 1865, 1847, 1860, 1848, 1852, 1849, 1850,
+ 1855, 1851, 1852, 1855, 1853, 1854, 1858, 1857, 1859, 1861,
+ 1854, 1856, 1857, 1860, 1858, 1866, 1863, 1861, 1869, 1859,
+
+ 1862, 1864, 1860, 1862, 1867, 1865, 1873, 1868, 1870, 1872,
+ 1871, 1873, 1869, 1858, 1868, 1859, 1861, 1870, 1862, 1864,
+ 1872, 1874, 1866, 1871, 1867, 1869, 1875, 1862, 1864, 1880,
+ 1862, 1867, 1903, 1881, 1868, 1870, 1872, 1871, 1873, 1882,
+ 1878, 1875, 1878, 1874, 1883, 1879, 0, 1884, 1874, 1885,
+ 1882, 1884, 0, 1875, 1879, 1880, 1880, 1881, 1888, 1903,
+ 1881, 1886, 1883, 1885, 1886, 1889, 1882, 1878, 1887, 0,
+ 1890, 1883, 1879, 1884, 1884, 1885, 1885, 1891, 1884, 1886,
+ 1901, 1887, 1888, 1892, 1893, 1888, 1891, 1889, 1886, 1892,
+ 1885, 1886, 1889, 1893, 1894, 1887, 1890, 1890, 1898, 1894,
+
+ 1896, 1899, 1897, 1898, 1891, 1900, 1902, 1904, 1905, 1906,
+ 1892, 1893, 1901, 1896, 1897, 1902, 1907, 1908, 1900, 0,
+ 1913, 0, 1906, 1899, 1910, 1898, 1894, 1896, 1899, 1897,
+ 1905, 1910, 1900, 1902, 1911, 1905, 1906, 1912, 1908, 1904,
+ 1914, 1911, 1925, 1916, 1908, 0, 1918, 1915, 1907, 1920,
+ 1912, 1910, 1913, 1915, 1914, 1921, 1926, 1920, 1922, 1923,
+ 1925, 1911, 1924, 1921, 1912, 1918, 1922, 1914, 1929, 1925,
+ 1926, 1915, 1927, 1918, 1915, 1916, 1920, 1928, 1923, 1930,
+ 1915, 1929, 1921, 1926, 1924, 1922, 1923, 1931, 1932, 1924,
+ 1927, 1928, 1930, 1933, 1934, 1929, 1935, 1936, 0, 1927,
+
+ 1937, 1939, 1938, 1940, 1928, 1941, 1930, 1937, 1931, 1939,
+ 1935, 1938, 1942, 1947, 1931, 1950, 0, 0, 1934, 1941,
+ 1932, 1934, 1944, 1935, 1936, 1933, 1943, 1937, 1939, 1938,
+ 1940, 1943, 1941, 1944, 1945, 1931, 1949, 1950, 1948, 1951,
+ 1947, 0, 1950, 1945, 1942, 1948, 1951, 1952, 1953, 1944,
+ 1954, 1955, 1961, 1943, 1960, 1955, 1957, 1959, 0, 1949,
+ 1964, 1945, 1968, 1949, 0, 1948, 1951, 1957, 1954, 1952,
+ 1953, 1962, 1960, 1959, 1952, 1953, 1961, 1954, 1955, 1961,
+ 1957, 1960, 1965, 1957, 1959, 1963, 1962, 1964, 1966, 1968,
+ 1965, 1967, 1969, 1970, 1957, 1972, 1971, 1963, 1962, 1967,
+
+ 1976, 1973, 1974, 1966, 1979, 1978, 1970, 1976, 1975, 1965,
+ 1972, 1979, 1963, 1978, 1969, 1966, 1971, 1974, 1967, 1969,
+ 1970, 1973, 1972, 1971, 1975, 1980, 1981, 1976, 1973, 1974,
+ 0, 1979, 1978, 1982, 1983, 1975, 1984, 1986, 1985, 1987,
+ 0, 1981, 1982, 1990, 1986, 1989, 1991, 1993, 0, 1994,
+ 1992, 0, 0, 1981, 1995, 1983, 1997, 1980, 1991, 1996,
+ 1982, 1983, 1985, 1984, 1986, 1985, 1987, 1989, 1992, 1995,
+ 0, 1998, 1989, 1991, 2002, 1990, 1994, 1992, 1998, 1993,
+ 1997, 1995, 1999, 1997, 1996, 2000, 1996, 1999, 2001, 2003,
+ 2004, 2005, 2006, 0, 2000, 0, 2002, 2001, 1998, 2007,
+
+ 2008, 2002, 2013, 2010, 2006, 2014, 2005, 2009, 2004, 1999,
+ 2010, 2003, 2000, 2012, 2013, 2001, 2003, 2004, 2005, 2006,
+ 2009, 2007, 2008, 2015, 2011, 2009, 2007, 2008, 0, 2013,
+ 2010, 2011, 2014, 2016, 2009, 2012, 2019, 2018, 2022, 2016,
+ 2012, 2020, 2021, 2026, 2019, 2022, 2011, 2009, 2018, 2020,
+ 2023, 2011, 2025, 2021, 2024, 2015, 2024, 2027, 2011, 2028,
+ 2016, 2029, 2034, 2019, 2018, 2022, 2028, 2024, 2020, 2021,
+ 2026, 2030, 2035, 2036, 2031, 2023, 2032, 2023, 2025, 2025,
+ 2031, 2024, 2032, 2024, 2027, 2033, 2028, 2037, 2029, 2034,
+ 2039, 2033, 2041, 2040, 2044, 2035, 2042, 2030, 2030, 2035,
+
+ 2042, 2031, 2040, 2032, 2045, 2036, 2045, 2043, 2046, 2047,
+ 2048, 2037, 2033, 0, 2037, 2050, 2044, 2048, 2049, 2053,
+ 2040, 2044, 2039, 2042, 2041, 2043, 2051, 2052, 2054, 0,
+ 2055, 2045, 2046, 2052, 2043, 2046, 2047, 2048, 2051, 2056,
+ 2049, 2053, 2050, 2057, 2059, 2049, 2053, 2062, 0, 0,
+ 2054, 2059, 0, 2051, 2052, 2054, 2055, 2055, 2058, 2058,
+ 2058, 2056, 2061, 2060, 2065, 2058, 2056, 2063, 2069, 2061,
+ 2064, 2059, 2060, 2058, 2063, 2057, 2066, 2064, 2068, 2062,
+ 2071, 2069, 2074, 2068, 2065, 2058, 2058, 2058, 2070, 2061,
+ 2060, 2065, 2058, 2072, 2063, 2069, 2073, 2064, 2066, 2075,
+
+ 2070, 2080, 0, 2066, 2076, 2071, 2077, 2071, 2073, 2072,
+ 2068, 2076, 2079, 2078, 2074, 2070, 2082, 2075, 2079, 2077,
+ 2072, 2078, 2083, 2073, 2081, 2081, 2075, 2084, 2080, 2083,
+ 2085, 2076, 2084, 2077, 2086, 2087, 2091, 2088, 2094, 2079,
+ 2078, 2093, 2082, 2082, 2088, 2092, 2097, 2092, 2096, 2083,
+ 2098, 2081, 2097, 0, 2084, 0, 2085, 2085, 2103, 2093,
+ 2101, 2086, 2087, 2091, 2088, 2094, 2096, 2102, 2093, 2100,
+ 2099, 2101, 2092, 2097, 2105, 2096, 2099, 2100, 2104, 2106,
+ 2102, 2110, 2098, 2109, 2104, 2103, 2105, 2101, 2114, 2107,
+ 2108, 2108, 2111, 2111, 2102, 2118, 2100, 2099, 2116, 2106,
+
+ 2112, 2105, 2115, 2119, 2123, 2104, 2106, 2107, 2110, 2109,
+ 2109, 2112, 2120, 2124, 2117, 2118, 2107, 2108, 2122, 2111,
+ 2114, 2117, 2118, 2131, 2115, 2125, 2122, 2112, 2126, 2115,
+ 2116, 2127, 0, 2130, 2138, 2119, 2123, 2120, 2131, 2120,
+ 2124, 2117, 2128, 2127, 2132, 2122, 2126, 2125, 2129, 2128,
+ 2131, 2135, 2125, 2133, 2137, 2126, 2129, 2130, 2127, 2136,
+ 2130, 2137, 2133, 2134, 2134, 2141, 2138, 2140, 2132, 2128,
+ 2139, 2132, 2141, 2143, 2146, 2129, 2142, 2135, 2135, 2146,
+ 2133, 2137, 2136, 2147, 2145, 2139, 2136, 2148, 2142, 2143,
+ 2134, 2145, 2141, 2155, 2150, 2149, 2143, 2139, 2149, 2140,
+
+ 2143, 2146, 2150, 2142, 2153, 2147, 2151, 2154, 2156, 2157,
+ 2147, 2145, 2153, 2158, 2148, 2160, 2143, 2162, 2151, 2155,
+ 2155, 2150, 2149, 2159, 0, 2166, 0, 2157, 0, 2156,
+ 2154, 2153, 2161, 2151, 2154, 2156, 2157, 2161, 2160, 2163,
+ 2158, 2159, 2160, 2164, 2162, 2163, 2165, 2166, 2161, 2170,
+ 2159, 2167, 2166, 2168, 2165, 2169, 2164, 2172, 2167, 2161,
+ 2168, 2173, 2169, 2171, 2161, 2174, 2163, 2175, 2177, 2172,
+ 2164, 2176, 2171, 2165, 0, 2179, 2183, 2185, 2167, 2174,
+ 2168, 2170, 2169, 2173, 2172, 2187, 2182, 2189, 2173, 2191,
+ 2171, 2177, 2174, 2179, 2175, 2177, 2180, 2176, 2176, 2181,
+
+ 2186, 2180, 2179, 2183, 2185, 2186, 2181, 2192, 2182, 2190,
+ 2190, 2191, 2180, 2182, 2193, 2195, 2191, 2187, 2196, 2189,
+ 2197, 2200, 2192, 2180, 2198, 2199, 2181, 2199, 2180, 2202,
+ 2195, 2203, 2186, 2201, 2192, 2197, 2190, 2204, 2201, 2205,
+ 2206, 2196, 2195, 2203, 2215, 2196, 2193, 2197, 2206, 2207,
+ 2198, 2198, 2199, 2200, 2209, 2208, 2207, 2211, 2203, 2204,
+ 2201, 2202, 2212, 2213, 2204, 2221, 2205, 2206, 2216, 2209,
+ 2212, 2215, 2211, 2217, 2218, 2220, 2207, 2208, 2219, 2222,
+ 2223, 2209, 2208, 2224, 2211, 2213, 2226, 2223, 0, 2212,
+ 2213, 2222, 2216, 2225, 2228, 2216, 2227, 2221, 0, 2217,
+
+ 2217, 2218, 2220, 2230, 2219, 2219, 2222, 2223, 2226, 2233,
+ 2241, 2231, 2228, 2226, 2225, 2224, 2231, 2227, 2234, 2236,
+ 2225, 2228, 2235, 2227, 2237, 2230, 2242, 2239, 2235, 2240,
+ 2230, 2246, 2241, 2233, 2236, 0, 2233, 2241, 2244, 2243,
+ 2245, 2234, 2239, 2231, 2240, 2234, 2236, 2247, 2252, 2235,
+ 2237, 2237, 2248, 2242, 2239, 2246, 2240, 2243, 2246, 2248,
+ 2244, 2250, 2245, 2249, 2251, 2244, 2243, 2245, 2255, 2253,
+ 2250, 2254, 2251, 0, 2247, 2256, 2257, 2258, 2262, 2248,
+ 2252, 2249, 2259, 2263, 2256, 2266, 2258, 2262, 2250, 2264,
+ 2249, 2251, 2253, 2254, 2257, 2259, 2253, 2261, 2254, 2265,
+
+ 2255, 2263, 2256, 2257, 2258, 2262, 2265, 2264, 2261, 2259,
+ 2263, 2266, 2266, 2267, 2268, 2269, 2264, 2270, 2271, 2274,
+ 0, 2269, 0, 2261, 2261, 2276, 2265, 2277, 2283, 2268,
+ 2285, 2267, 2271, 0, 0, 2261, 2278, 2279, 2277, 2270,
+ 2267, 2268, 2269, 2281, 2270, 2271, 2274, 2278, 2279, 2276,
+ 2286, 2284, 2276, 2282, 2277, 2281, 2285, 2285, 2287, 2289,
+ 2283, 2284, 2288, 2278, 2279, 2290, 2282, 2293, 2289, 2291,
+ 2281, 2287, 2294, 2298, 2297, 2286, 2301, 2286, 2284, 0,
+ 2282, 2301, 2300, 2288, 2299, 2287, 2289, 2296, 2291, 2288,
+ 2303, 2296, 2290, 2302, 2293, 2297, 2291, 2299, 2294, 2294,
+
+ 2302, 2297, 2300, 2301, 2304, 2298, 2306, 2305, 2307, 2300,
+ 2308, 2299, 2304, 2305, 2296, 0, 2303, 2303, 2310, 2310,
+ 2302, 2306, 2308, 2307, 2311, 2309, 2312, 2313, 0, 2317,
+ 2304, 2304, 2313, 2306, 2305, 2307, 2317, 2308, 2312, 2304,
+ 2309, 2320, 2311, 2314, 0, 2310, 2318, 2314, 2319, 2326,
+ 2318, 2311, 2309, 2312, 2315, 2315, 2317, 2321, 2315, 2313,
+ 2322, 2324, 2323, 2319, 2325, 2327, 2321, 2322, 2320, 0,
+ 2314, 2315, 2327, 2318, 2329, 2319, 2326, 2330, 2332, 2315,
+ 0, 2315, 2315, 2324, 2321, 2315, 2323, 2322, 2324, 2323,
+ 2325, 2325, 2327, 2333, 2331, 2341, 2329, 2336, 2315, 2338,
+
+ 2332, 2329, 2330, 2331, 2330, 2332, 2342, 2339, 2338, 2343,
+ 2341, 2344, 2345, 2333, 2346, 2336, 2349, 2343, 2351, 2345,
+ 2333, 2331, 2341, 2344, 2336, 2339, 2338, 2350, 2347, 2352,
+ 2352, 2342, 0, 2342, 2339, 2347, 2343, 2353, 2344, 2345,
+ 2350, 2349, 2354, 2349, 2356, 2351, 2346, 2361, 2357, 2358,
+ 2360, 2359, 0, 0, 2350, 2347, 2352, 2360, 2358, 2353,
+ 2359, 2362, 0, 2371, 2353, 2364, 2356, 2354, 2363, 2354,
+ 2357, 2356, 2366, 2376, 2369, 2357, 2358, 2360, 2359, 2361,
+ 2364, 2365, 2363, 2362, 2372, 2368, 2365, 2369, 2362, 2370,
+ 2371, 2366, 2364, 2368, 2374, 2363, 2375, 2377, 2373, 2366,
+
+ 2379, 2369, 2378, 2375, 2370, 2376, 2374, 2380, 2381, 2382,
+ 2372, 2372, 2368, 2365, 2373, 2384, 2370, 2381, 2383, 2377,
+ 2386, 2374, 2387, 2375, 2377, 2373, 2383, 2378, 2385, 2378,
+ 2389, 2390, 2379, 2388, 2448, 2381, 2392, 2383, 0, 2380,
+ 2390, 2382, 2384, 2385, 2394, 2383, 2386, 2386, 2387, 2387,
+ 2395, 2388, 2389, 2383, 2398, 2385, 2395, 2389, 2390, 2392,
+ 2388, 2393, 2396, 2392, 2393, 2397, 2448, 2396, 2399, 2394,
+ 2401, 2394, 2398, 0, 2402, 2408, 2403, 2395, 2404, 2393,
+ 2397, 2398, 2406, 2399, 2401, 2409, 0, 2407, 2393, 2402,
+ 0, 2393, 2397, 2408, 2396, 2399, 2406, 2401, 2403, 2407,
+
+ 2404, 2402, 2408, 2403, 2410, 2404, 2407, 2411, 2412, 2406,
+ 2413, 2415, 2409, 2410, 2407, 2416, 2411, 2412, 2414, 2417,
+ 2414, 2413, 2421, 0, 2415, 2419, 2407, 2416, 2420, 2421,
+ 2424, 2410, 2422, 0, 2411, 2412, 2423, 2413, 2415, 0,
+ 2419, 2417, 2416, 2420, 2425, 2414, 2417, 2428, 2424, 2421,
+ 2432, 2430, 2419, 2425, 2422, 2420, 2436, 2424, 2423, 2422,
+ 2428, 2431, 2432, 2423, 2433, 2431, 2435, 2434, 2428, 2434,
+ 0, 2425, 2430, 2433, 2428, 2438, 2439, 2432, 2430, 2437,
+ 2444, 2440, 2441, 2436, 2435, 2439, 2443, 2428, 2431, 2440,
+ 2442, 2433, 2444, 2435, 2434, 2451, 2449, 2437, 2452, 2462,
+
+ 2443, 2449, 2438, 2439, 2445, 2441, 2437, 2444, 2440, 2441,
+ 2447, 2445, 2442, 2443, 2450, 2453, 2455, 2442, 2447, 2450,
+ 2460, 2456, 2458, 2449, 2460, 2461, 2462, 2451, 2456, 2458,
+ 2452, 2445, 2465, 2464, 2461, 2455, 2463, 2447, 2466, 2453,
+ 2467, 2471, 2453, 2455, 2468, 2469, 2450, 2460, 2456, 2458,
+ 2463, 2464, 2461, 2468, 2475, 2467, 2472, 2474, 2476, 2465,
+ 2464, 2463, 2463, 2463, 2466, 2466, 2469, 2467, 2472, 2473,
+ 2477, 2468, 2469, 2471, 2478, 2480, 2473, 2463, 2482, 2474,
+ 2475, 2475, 2481, 2472, 2474, 2476, 2483, 2487, 2463, 2481,
+ 2486, 2487, 2477, 2483, 2489, 2488, 2473, 2477, 2480, 0,
+
+ 0, 2482, 2480, 2489, 2490, 2482, 2478, 2488, 2485, 2481,
+ 2485, 2491, 2486, 2483, 2487, 2494, 2492, 2486, 2493, 2495,
+ 2491, 2489, 2488, 2496, 2495, 2493, 2490, 2492, 2497, 2498,
+ 2499, 2490, 2501, 2501, 2508, 2485, 2504, 2494, 2491, 2500,
+ 2502, 2498, 2494, 2492, 2504, 2493, 2495, 2503, 2500, 2502,
+ 2496, 2497, 2499, 2505, 2506, 2497, 2498, 2499, 2510, 2501,
+ 2507, 2508, 2503, 2504, 2511, 2512, 2500, 2502, 2506, 2507,
+ 2513, 0, 2511, 2512, 2503, 2505, 2516, 2510, 2513, 2514,
+ 2505, 2506, 2517, 2514, 2516, 2510, 2515, 2507, 2517, 2515,
+ 2518, 2511, 2512, 2519, 2520, 2522, 2521, 2513, 2524, 2519,
+
+ 0, 2526, 0, 2516, 2529, 2518, 2514, 2531, 2527, 2517,
+ 2524, 2528, 2530, 2515, 2521, 2526, 2534, 2518, 2532, 2530,
+ 2519, 2527, 2533, 2521, 2536, 2524, 2520, 2522, 2526, 2529,
+ 2534, 2529, 2528, 2535, 2531, 2527, 2535, 2536, 2528, 2530,
+ 2532, 2537, 2539, 2534, 2538, 2532, 2533, 2540, 2541, 2533,
+ 2542, 2536, 2543, 2544, 2547, 2537, 2545, 0, 2548, 2545,
+ 2535, 2549, 2542, 2550, 2543, 2552, 2553, 2544, 2537, 2539,
+ 2538, 2538, 2540, 2549, 2540, 2541, 2554, 2542, 2556, 2543,
+ 2544, 2547, 2545, 2545, 2548, 2548, 2545, 2560, 2549, 2550,
+ 2550, 2551, 2552, 2553, 2551, 2557, 2559, 2558, 2554, 2562,
+
+ 2556, 2560, 2557, 2554, 2558, 2556, 2563, 2564, 2565, 2551,
+ 2566, 2559, 2567, 2568, 2560, 2564, 2569, 2570, 2551, 2566,
+ 2571, 2551, 2557, 2559, 2558, 2568, 2562, 2573, 2572, 2574,
+ 0, 2575, 2576, 2563, 2564, 2565, 2574, 2566, 2569, 2567,
+ 2568, 2572, 2576, 2569, 2570, 2573, 2577, 2571, 2578, 2581,
+ 2582, 2584, 2579, 2587, 2573, 2572, 2574, 2575, 2575, 2576,
+ 2579, 2578, 2583, 2585, 2586, 0, 2598, 2589, 2588, 2590,
+ 2583, 2581, 2585, 2577, 2587, 2578, 2581, 2582, 2584, 2579,
+ 2587, 2593, 2589, 0, 2597, 0, 2586, 2592, 2595, 2583,
+ 2585, 2586, 2588, 2589, 2589, 2588, 2590, 2591, 2598, 2592,
+
+ 2595, 2601, 2596, 2602, 2603, 2591, 2593, 2602, 2593, 2589,
+ 2596, 2597, 2600, 2601, 2592, 2595, 2603, 2604, 2605, 2600,
+ 2607, 2609, 2614, 2610, 2591, 2606, 2611, 2607, 2601, 2596,
+ 2602, 2603, 0, 2606, 2608, 2615, 0, 2612, 2611, 2600,
+ 2604, 2608, 2615, 2609, 2604, 2605, 2610, 2607, 2609, 2614,
+ 2610, 2612, 2606, 2611, 2616, 2617, 2618, 2619, 2620, 2621,
+ 2621, 2608, 2615, 2612, 2612, 2618, 2619, 2622, 2617, 2623,
+ 2620, 2679, 2624, 2629, 2616, 2627, 0, 2628, 2612, 2630,
+ 0, 2616, 2617, 2618, 2619, 2620, 2621, 2623, 2625, 2631,
+ 0, 0, 2628, 2622, 2622, 2629, 2623, 2624, 2679, 2624,
+
+ 2629, 2630, 2635, 2625, 2628, 2625, 2630, 2627, 2632, 2633,
+ 2632, 2631, 2625, 2634, 2642, 2625, 2631, 2636, 2643, 2634,
+ 2635, 2637, 2637, 2633, 2639, 2640, 2642, 2641, 2644, 2635,
+ 2625, 2645, 2625, 2647, 2648, 2632, 2633, 2645, 0, 2636,
+ 2634, 2642, 2649, 2646, 2636, 2654, 2639, 2640, 2637, 2641,
+ 2643, 2639, 2640, 2651, 2641, 2646, 2648, 2650, 2645, 2650,
+ 2644, 2648, 2652, 2654, 2649, 2647, 2653, 2651, 2659, 2649,
+ 2646, 0, 2654, 2653, 2655, 2658, 2656, 2657, 2660, 0,
+ 2651, 2666, 2661, 2668, 2650, 2667, 2652, 0, 2658, 2652,
+ 2663, 2665, 2655, 2653, 2656, 2657, 0, 2663, 2665, 2666,
+
+ 2659, 2655, 2658, 2656, 2657, 2661, 2669, 2670, 2666, 2661,
+ 2660, 2667, 2667, 2671, 2669, 2668, 2673, 2663, 2665, 2672,
+ 0, 0, 2674, 2670, 2675, 2677, 2675, 2681, 2678, 0,
+ 2682, 2675, 2669, 2669, 2670, 2680, 2677, 2672, 2671, 2678,
+ 2671, 2669, 2673, 2673, 2674, 2681, 2672, 2680, 2682, 2674,
+ 2683, 2675, 2677, 2675, 2681, 2678, 2684, 2682, 2686, 2687,
+ 2688, 2689, 2680, 0, 2693, 2691, 2694, 2695, 2692, 2683,
+ 2687, 2693, 2688, 2686, 2696, 2697, 2689, 2683, 2684, 2698,
+ 2704, 2699, 2695, 2684, 2694, 2686, 2687, 2688, 2689, 2691,
+ 2692, 2693, 2691, 2694, 2695, 2692, 2701, 2702, 2703, 2705,
+
+ 2706, 2696, 2697, 2707, 0, 0, 2698, 2699, 2699, 2708,
+ 0, 2709, 2704, 2710, 0, 2711, 2712, 2715, 2706, 2714,
+ 2703, 2702, 2708, 2701, 2702, 2703, 2713, 2706, 2710, 2712,
+ 2707, 2705, 2717, 2719, 2713, 2716, 2708, 2709, 2709, 2720,
+ 2710, 2711, 2711, 2712, 2721, 2714, 2714, 2722, 2716, 2715,
+ 2723, 2726, 2724, 2713, 2717, 2725, 2719, 2727, 2726, 2717,
+ 2719, 2728, 2716, 2720, 2731, 2739, 2720, 2729, 2732, 2722,
+ 2724, 2721, 2723, 2725, 2722, 2732, 2733, 2723, 2726, 2724,
+ 2727, 2729, 2725, 2733, 2727, 2734, 2731, 2735, 2728, 2737,
+ 2736, 2731, 2734, 2738, 2729, 2732, 2737, 2739, 2740, 2742,
+
+ 2735, 2741, 2744, 2733, 2743, 0, 2754, 2749, 2751, 2755,
+ 2745, 2744, 2734, 2736, 2735, 2738, 2737, 2736, 2745, 2740,
+ 2738, 2742, 2747, 2751, 2746, 2740, 2742, 2741, 2741, 2744,
+ 2743, 2743, 2746, 2748, 2749, 2751, 2752, 2745, 2754, 2748,
+ 2753, 2755, 2756, 2757, 2747, 2761, 2759, 2752, 2763, 2747,
+ 0, 2746, 2762, 2764, 0, 2765, 2775, 0, 2761, 2767,
+ 2748, 2756, 2753, 2752, 2759, 2762, 2768, 2753, 2757, 2756,
+ 2757, 2769, 2761, 2759, 2763, 2763, 2771, 2764, 2768, 2762,
+ 2764, 2765, 2765, 2767, 2770, 2770, 2767, 2774, 2775, 2776,
+ 2777, 2778, 0, 2768, 2782, 2769, 2784, 2779, 2769, 2786,
+
+ 2790, 0, 2771, 2771, 2776, 2784, 2791, 2791, 2792, 2778,
+ 2774, 2770, 2786, 2798, 2774, 2800, 2776, 2777, 2778, 2779,
+ 2787, 2782, 2790, 2784, 2779, 0, 2786, 2790, 2793, 2796,
+ 2794, 2787, 2797, 2791, 2792, 2792, 2794, 2793, 2802, 2803,
+ 2798, 2804, 2800, 0, 2813, 2806, 2803, 2787, 2811, 2805,
+ 2806, 2796, 2807, 2809, 2797, 2793, 2796, 2794, 2810, 2797,
+ 2805, 2809, 2812, 2811, 2822, 2816, 2803, 2804, 2804, 2817,
+ 2802, 2813, 2806, 2815, 2807, 2811, 2805, 2812, 2818, 2807,
+ 2809, 2820, 2810, 2816, 2815, 2810, 2819, 2823, 2824, 2812,
+ 2817, 2822, 2816, 2820, 2825, 2819, 2817, 2826, 2832, 2827,
+
+ 2815, 2828, 2828, 2829, 0, 2823, 2824, 2827, 2820, 2828,
+ 2818, 2831, 2829, 2819, 2823, 2824, 2835, 2833, 2825, 2836,
+ 2837, 2825, 2826, 2834, 2826, 2832, 2827, 2838, 2828, 2828,
+ 2829, 2842, 2834, 2836, 2835, 2839, 2840, 2831, 2831, 2833,
+ 2841, 2846, 2837, 2835, 2833, 0, 2836, 2837, 2839, 2840,
+ 2834, 2845, 2838, 2842, 2838, 2841, 2848, 2843, 2842, 2844,
+ 2847, 2849, 2839, 2840, 2843, 2850, 2844, 2841, 2846, 2852,
+ 2851, 2853, 2847, 2845, 2855, 0, 2856, 2854, 2845, 2857,
+ 2853, 0, 2859, 2848, 2843, 2851, 2844, 2847, 2849, 2859,
+ 0, 2864, 2850, 2858, 2852, 2860, 2852, 2851, 2853, 2854,
+
+ 2855, 2855, 2856, 2856, 2854, 2857, 2857, 2861, 2858, 2859,
+ 2860, 2862, 2863, 2865, 2861, 2866, 2867, 2862, 2864, 2868,
+ 2858, 2865, 2860, 2863, 2869, 2871, 2870, 2874, 0, 2872,
+ 2873, 0, 2877, 2879, 2861, 2868, 0, 2873, 2862, 2863,
+ 2865, 2870, 2866, 2867, 2872, 2871, 2868, 0, 2875, 2874,
+ 2878, 2869, 2871, 2870, 2874, 2875, 2872, 2873, 2876, 2877,
+ 2879, 2880, 2880, 2881, 2882, 2876, 2883, 2884, 2878, 2883,
+ 2881, 2885, 2886, 0, 2887, 2875, 2890, 2878, 2882, 2887,
+ 2884, 2888, 2889, 2892, 2893, 2876, 2891, 2886, 2880, 2885,
+ 2881, 2882, 2899, 2883, 2884, 2892, 2893, 2889, 2885, 2886,
+
+ 2898, 2887, 2890, 2890, 2891, 2895, 2888, 2896, 2888, 2889,
+ 2892, 2893, 2896, 2891, 2895, 2897, 2901, 2900, 2902, 2899,
+ 2897, 2900, 2898, 2905, 2903, 2904, 2906, 2898, 2908, 0,
+ 2912, 2902, 2895, 2907, 2896, 2914, 0, 0, 0, 0,
+ 2901, 2934, 2897, 2901, 2900, 2902, 2903, 2904, 2907, 2915,
+ 2905, 2903, 2904, 2906, 2908, 2908, 2912, 2912, 2915, 2916,
+ 2907, 2914, 2914, 2917, 2925, 2918, 2920, 2922, 2934, 2921,
+ 2935, 2917, 2922, 2920, 2923, 2916, 2915, 2918, 2921, 2927,
+ 2924, 2923, 2925, 2935, 2931, 0, 2916, 2924, 2926, 2933,
+ 2917, 2925, 2918, 2920, 2922, 2926, 2921, 2935, 2928, 2929,
+
+ 2930, 2923, 2937, 2938, 2927, 2928, 2927, 2924, 2929, 2930,
+ 2931, 2931, 2933, 2936, 2940, 2926, 2933, 2941, 2936, 2942,
+ 2937, 0, 2943, 2945, 2944, 2928, 2929, 2930, 2942, 2937,
+ 2938, 2943, 2940, 2944, 2951, 2946, 2947, 2954, 2953, 2948,
+ 2936, 2940, 2949, 2945, 2941, 2947, 2942, 2946, 2948, 2943,
+ 2945, 2944, 2950, 2949, 2952, 2955, 2960, 2951, 2953, 2957,
+ 2950, 2951, 2946, 2947, 2954, 2953, 2948, 2956, 2957, 2949,
+ 2958, 2961, 2962, 0, 2956, 2963, 2964, 2952, 2965, 2950,
+ 2966, 2952, 2955, 2960, 2963, 2964, 2957, 2967, 2966, 2968,
+ 2965, 2958, 2969, 2973, 2956, 0, 2974, 2958, 2961, 2970,
+
+ 2967, 2971, 2963, 2964, 2962, 2965, 2970, 2966, 2971, 2973,
+ 2972, 2968, 2974, 2976, 2967, 2975, 2968, 2972, 2977, 2969,
+ 2973, 2978, 2975, 2974, 2979, 2980, 2970, 2983, 2971, 2985,
+ 2982, 2986, 0, 2989, 2988, 2976, 2990, 2972, 2982, 2986,
+ 2976, 2988, 2975, 2977, 2987, 2977, 2991, 2985, 2978, 2979,
+ 2992, 2979, 2980, 2991, 2983, 2989, 2985, 2982, 2986, 2987,
+ 2989, 2988, 2993, 2990, 2999, 3000, 2994, 2998, 2997, 2993,
+ 3001, 2987, 2992, 2991, 2994, 2997, 2998, 2992, 3002, 3003,
+ 3004, 3006, 3001, 3012, 0, 3018, 3005, 3002, 2999, 2993,
+ 3008, 2999, 3000, 2994, 2998, 2997, 3004, 3001, 3005, 3009,
+
+ 3010, 3011, 3008, 0, 3006, 3002, 3003, 3004, 3006, 3013,
+ 3012, 3009, 3018, 3005, 3020, 3015, 3016, 3008, 3019, 3017,
+ 3021, 3010, 3020, 3013, 3011, 3019, 3009, 3010, 3011, 3015,
+ 3016, 3017, 3023, 3022, 3025, 3026, 3013, 3028, 3029, 3021,
+ 3022, 3020, 3015, 3016, 3027, 3019, 3017, 3021, 3030, 3025,
+ 3031, 3032, 3033, 3026, 3035, 3034, 3030, 3037, 0, 3023,
+ 3022, 3025, 3026, 3028, 3028, 3029, 3034, 3027, 3039, 3035,
+ 3033, 3027, 3043, 3032, 3039, 3030, 3036, 3031, 3032, 3033,
+ 3045, 3035, 3034, 3036, 3037, 3045, 3044, 3046, 3047, 3053,
+ 3050, 3048, 3049, 3051, 3052, 3039, 3057, 3055, 3043, 3043,
+
+ 0, 0, 3047, 3036, 3044, 3048, 3049, 3045, 3050, 3055,
+ 3060, 3051, 3052, 3044, 3046, 3047, 3053, 3050, 3048, 3049,
+ 3051, 3052, 3054, 3057, 3055, 3062, 3063, 3065, 3064, 3054,
+ 3066, 3070, 3060, 3067, 3072, 0, 0, 3060, 3066, 3063,
+ 3068, 3073, 3075, 3070, 3076, 0, 3065, 3062, 3077, 3054,
+ 3064, 3067, 3062, 3063, 3065, 3064, 3072, 3066, 3070, 3068,
+ 3067, 3072, 3074, 3073, 3078, 3079, 3081, 3068, 3073, 3075,
+ 3077, 3076, 3080, 3083, 3074, 3077, 3078, 3082, 3086, 3084,
+ 3080, 3085, 0, 0, 3094, 3087, 0, 3079, 3084, 3074,
+ 3085, 3078, 3079, 3081, 3088, 3083, 3089, 3082, 3091, 3080,
+
+ 3083, 3092, 3095, 3099, 3082, 3093, 3084, 3087, 3085, 3089,
+ 3086, 3094, 3087, 3092, 3098, 3100, 3088, 3099, 3103, 3101,
+ 3105, 3088, 3104, 3089, 3091, 3091, 3102, 3093, 3092, 3095,
+ 3099, 3102, 3093, 3105, 3106, 3108, 3098, 3107, 3110, 3114,
+ 3103, 3098, 3100, 3101, 3104, 3103, 3101, 3105, 3109, 3104,
+ 3112, 3111, 3115, 3113, 3116, 0, 3110, 3108, 3102, 3113,
+ 3107, 3118, 3108, 3111, 3107, 3110, 3106, 3117, 3121, 3112,
+ 3109, 3114, 3120, 3122, 3124, 3109, 3116, 3112, 3111, 3130,
+ 3113, 3116, 3117, 3126, 3115, 3127, 3128, 3129, 3118, 3124,
+ 3121, 3131, 3120, 3130, 3117, 3121, 3129, 3122, 3132, 3120,
+
+ 3122, 3124, 3133, 3134, 3135, 3126, 3130, 3127, 3128, 3131,
+ 3126, 3136, 3127, 3128, 3129, 3137, 3132, 3140, 3131, 3141,
+ 3142, 3134, 3149, 0, 0, 3132, 3140, 3135, 3133, 3133,
+ 3134, 3135, 3145, 3150, 3153, 0, 3154, 3137, 3146, 3147,
+ 3145, 3142, 3137, 3136, 3140, 3146, 3147, 3142, 3148, 3149,
+ 3151, 3141, 3153, 3150, 3154, 3155, 3148, 3156, 3151, 3145,
+ 3150, 3153, 3157, 3154, 3158, 3146, 3147, 3159, 3167, 3156,
+ 3160, 3162, 3164, 3166, 3169, 3148, 3158, 3151, 3160, 3164,
+ 3157, 3155, 3155, 3162, 3156, 3168, 3170, 3168, 3175, 3157,
+ 3174, 3158, 3178, 3172, 3159, 3167, 3166, 3160, 3162, 3164,
+
+ 3166, 3172, 3173, 3177, 3176, 3177, 3169, 3180, 3183, 3184,
+ 3181, 3173, 3168, 0, 3178, 3175, 3185, 3186, 3170, 3178,
+ 3172, 3188, 3174, 3176, 3181, 3180, 3186, 3191, 3187, 3173,
+ 3177, 3176, 3196, 3184, 3180, 3189, 3184, 3181, 3192, 3185,
+ 3183, 3187, 3193, 3185, 3186, 3198, 3197, 3189, 3188, 3194,
+ 3197, 3199, 3201, 3191, 3191, 3187, 0, 3202, 3194, 3196,
+ 3192, 3203, 3189, 3204, 3193, 3192, 3206, 3208, 3214, 3193,
+ 3209, 3210, 3198, 3197, 3208, 3214, 3194, 3211, 3199, 3201,
+ 3202, 3204, 3211, 3203, 3202, 3212, 3210, 3217, 3203, 3215,
+ 3204, 3219, 3209, 3206, 3208, 3214, 3215, 3209, 3210, 3216,
+
+ 3212, 3220, 3221, 3222, 3226, 3223, 3216, 3224, 3227, 3211,
+ 3230, 3232, 3212, 3217, 3217, 3229, 3215, 3227, 3219, 3223,
+ 3231, 3224, 3229, 3234, 3233, 3235, 3216, 3222, 3220, 3221,
+ 3222, 3226, 3223, 3238, 3224, 3227, 3233, 3230, 3232, 3235,
+ 3236, 3237, 3229, 3239, 3245, 3244, 3231, 3231, 3240, 3236,
+ 3234, 3233, 3235, 3243, 3237, 3246, 3248, 3250, 3243, 3249,
+ 3252, 3248, 3253, 3249, 3250, 3238, 3251, 3236, 3237, 3244,
+ 3239, 3240, 3244, 3251, 3254, 3240, 3245, 3246, 3255, 0,
+ 3257, 3252, 3246, 3361, 3250, 3243, 3249, 3252, 3248, 3256,
+ 3258, 3256, 3261, 3251, 3253, 3264, 3262, 3265, 3267, 0,
+
+ 3267, 3269, 3268, 3257, 0, 0, 3254, 3257, 3273, 0,
+ 3255, 3271, 3276, 0, 3264, 3361, 3256, 3258, 3262, 3261,
+ 0, 3265, 3264, 3262, 3265, 3267, 3268, 3269, 3269, 3268,
+ 3270, 3270, 3272, 3271, 3275, 3273, 3274, 3277, 3271, 3276,
+ 3270, 3272, 3279, 3274, 3278, 3280, 3281, 3275, 3286, 3283,
+ 3277, 3284, 3278, 3280, 3283, 3279, 3284, 3270, 3270, 3272,
+ 3287, 3275, 3285, 3274, 3277, 3281, 3288, 3296, 3278, 3279,
+ 3285, 3278, 3280, 3281, 3289, 3286, 3290, 0, 3291, 3278,
+ 3292, 3283, 0, 3284, 3293, 3296, 3287, 3287, 3294, 3285,
+ 3297, 3292, 3288, 3288, 3296, 3294, 3295, 3295, 3299, 3298,
+
+ 3289, 3289, 3290, 3290, 3291, 3291, 3293, 3292, 3300, 3301,
+ 3297, 3293, 3298, 3307, 3302, 3294, 3300, 3297, 3308, 3309,
+ 3299, 3303, 3304, 3295, 3311, 3299, 3298, 3305, 3303, 3304,
+ 3310, 3301, 3302, 3313, 3305, 3300, 3301, 3312, 3314, 3316,
+ 3307, 3302, 3310, 3309, 3318, 3308, 3309, 3314, 3303, 3304,
+ 3317, 3311, 3319, 3321, 3305, 3313, 3324, 3310, 3312, 0,
+ 3313, 3329, 3330, 3322, 3312, 3314, 3316, 3323, 3325, 3326,
+ 3317, 3318, 0, 3328, 3319, 3331, 3333, 3317, 0, 3319,
+ 3321, 3322, 3328, 3324, 3333, 3323, 3325, 3326, 3329, 3330,
+ 3322, 3332, 3334, 3335, 3323, 3325, 3326, 3336, 3331, 3339,
+
+ 3328, 3337, 3331, 3333, 3336, 3335, 3337, 3340, 3334, 3332,
+ 3341, 3342, 3343, 3339, 3349, 3345, 3350, 3351, 3332, 3334,
+ 3335, 3353, 3341, 3342, 3336, 3340, 3339, 3345, 3358, 3355,
+ 3351, 3355, 3354, 3337, 3340, 3343, 3349, 3341, 3342, 3343,
+ 3356, 3349, 3345, 3350, 3351, 3354, 3359, 3360, 3353, 3356,
+ 3366, 3362, 3366, 3367, 3368, 3358, 3355, 3370, 3371, 3354,
+ 3377, 3373, 3375, 0, 3370, 3360, 3362, 3356, 3375, 3378,
+ 0, 3379, 3368, 3359, 3360, 3367, 3373, 3366, 3362, 3383,
+ 3367, 3368, 3377, 3380, 3370, 3382, 3385, 3377, 3373, 3375,
+ 3371, 3378, 3383, 3390, 3386, 3391, 3378, 3379, 3379, 3392,
+
+ 3393, 3380, 3385, 3387, 0, 0, 3383, 3382, 3386, 0,
+ 3380, 3388, 3382, 3385, 3388, 3396, 3387, 3394, 3393, 3404,
+ 3390, 3386, 3391, 3396, 3394, 3395, 3392, 3393, 3397, 3398,
+ 3387, 3401, 3395, 3406, 0, 3402, 3397, 3388, 3388, 3403,
+ 3405, 3388, 3396, 3408, 3394, 3409, 3404, 3407, 3406, 3405,
+ 3410, 3398, 3395, 3407, 3409, 3397, 3398, 3402, 3413, 3416,
+ 3406, 3403, 3402, 3401, 3415, 3408, 3403, 3405, 3417, 3412,
+ 3408, 3412, 3409, 3418, 3407, 3419, 3420, 3421, 3425, 3427,
+ 3470, 3416, 3410, 3419, 3428, 3413, 3416, 3415, 3420, 3421,
+ 3417, 3415, 3430, 3427, 3423, 3417, 3412, 3434, 3428, 3418,
+
+ 3418, 3423, 3419, 3420, 3421, 3425, 3427, 3431, 3429, 3432,
+ 3433, 3428, 3470, 3437, 3440, 3430, 3434, 3435, 3433, 3430,
+ 3432, 3423, 3429, 3436, 3434, 3431, 3438, 3443, 3437, 3439,
+ 3436, 3444, 3440, 3438, 3431, 3429, 3432, 3433, 3441, 3435,
+ 3437, 3440, 3442, 3442, 3435, 3451, 3448, 3441, 3449, 3445,
+ 3436, 3448, 3452, 3438, 3443, 3439, 3439, 3445, 3444, 3453,
+ 3457, 3449, 3455, 3459, 3467, 3441, 3451, 3472, 3455, 3442,
+ 3460, 3462, 3451, 3463, 3459, 3449, 3445, 3464, 3448, 3452,
+ 3473, 3460, 3475, 3469, 3463, 3468, 3453, 3457, 3473, 3455,
+ 3459, 3467, 3468, 3462, 3472, 3483, 3481, 3460, 3462, 3464,
+
+ 3463, 3469, 3471, 3476, 3464, 3477, 3471, 3473, 3475, 3475,
+ 3469, 3477, 3468, 3478, 3479, 3480, 3476, 3486, 3485, 3478,
+ 3492, 3487, 3479, 3481, 3480, 3485, 3490, 3483, 3493, 3471,
+ 3476, 3490, 3477, 3491, 3491, 3496, 3497, 3495, 3494, 3498,
+ 3478, 3479, 3480, 3487, 3495, 3485, 3502, 3492, 3487, 3486,
+ 3494, 3499, 3497, 3490, 3496, 3493, 3500, 3498, 3499, 3501,
+ 3491, 3502, 3496, 3497, 3495, 3494, 3498, 3501, 3503, 3504,
+ 3505, 3506, 3507, 3502, 0, 3503, 3508, 3509, 3499, 3510,
+ 0, 3496, 3515, 3516, 3507, 3517, 3501, 3514, 3500, 3515,
+ 3516, 3518, 3505, 3519, 3520, 3503, 3504, 3505, 3506, 3507,
+
+ 3508, 3509, 3514, 3508, 3509, 3510, 3510, 3517, 3521, 3515,
+ 3516, 3524, 3517, 3528, 3514, 3522, 3525, 3526, 3520, 3527,
+ 3519, 3520, 3530, 3518, 3522, 3529, 3529, 3527, 3533, 3534,
+ 3536, 3534, 3532, 3524, 3535, 3529, 3539, 3533, 3524, 3526,
+ 3521, 3541, 3522, 3525, 3526, 3528, 3527, 3532, 3535, 3530,
+ 3537, 3538, 3529, 3529, 3539, 3533, 3534, 3536, 3537, 3532,
+ 3542, 3535, 3538, 3539, 3543, 0, 3544, 3545, 3541, 3547,
+ 3546, 3548, 3549, 3555, 3552, 3551, 3553, 3537, 3538, 3559,
+ 3545, 3551, 3550, 3554, 3554, 3556, 3562, 3542, 3544, 3563,
+ 3553, 3543, 3546, 3544, 3545, 0, 3547, 3546, 3548, 3549,
+
+ 3550, 3552, 3551, 3553, 3560, 3555, 3559, 3556, 3572, 3550,
+ 3554, 3566, 3556, 3562, 3574, 3560, 3563, 3568, 3569, 3566,
+ 3570, 3571, 3568, 3569, 3575, 3575, 3571, 3577, 3570, 3576,
+ 3581, 3560, 3579, 3588, 3572, 3572, 3582, 3576, 3566, 3579,
+ 3577, 3574, 3580, 3582, 3568, 3569, 3583, 3570, 3571, 3584,
+ 3590, 3575, 3585, 3583, 3577, 3587, 3576, 3581, 3590, 3579,
+ 3580, 3589, 3591, 3582, 3587, 3588, 3595, 3596, 3589, 3580,
+ 3592, 3598, 3595, 3583, 3599, 3585, 3584, 3590, 3600, 3585,
+ 3601, 3603, 3587, 3604, 3591, 0, 3609, 3602, 3589, 3591,
+ 0, 3600, 3592, 3595, 3596, 3605, 3599, 3592, 3598, 3607,
+
+ 3603, 3599, 3602, 3610, 3611, 3600, 3607, 3613, 3603, 3609,
+ 3604, 3611, 3601, 3609, 3602, 3616, 3612, 3605, 3614, 3617,
+ 3615, 0, 3605, 3612, 3616, 3610, 3607, 3625, 3620, 3613,
+ 3610, 3611, 3619, 3614, 3613, 3615, 3620, 3621, 3625, 3628,
+ 3617, 3622, 3616, 3612, 3621, 3614, 3617, 3615, 3622, 3624,
+ 3627, 3619, 3626, 3626, 3625, 3620, 3627, 3632, 3624, 3619,
+ 3630, 3628, 3626, 3631, 3621, 3635, 3628, 3637, 3622, 3633,
+ 3631, 3636, 3635, 3641, 3642, 3650, 3624, 3627, 3653, 3626,
+ 3626, 3637, 3630, 3643, 3658, 3647, 3648, 3630, 0, 3632,
+ 3631, 3633, 3635, 3651, 3637, 3636, 3633, 3647, 3636, 3652,
+
+ 3641, 3642, 3650, 3661, 3655, 3653, 3643, 3652, 3648, 3663,
+ 3643, 3658, 3647, 3648, 3667, 3651, 3655, 3659, 3659, 0,
+ 3651, 3660, 3660, 3662, 3662, 0, 3652, 3665, 3668, 3666,
+ 3661, 3655, 3663, 3671, 3672, 3669, 3663, 3668, 3674, 0,
+ 3675, 3667, 3679, 0, 3676, 0, 3659, 3666, 3669, 3665,
+ 3660, 3676, 3662, 3678, 3665, 3668, 3666, 3677, 3685, 3680,
+ 3671, 3672, 3669, 3681, 3677, 3674, 3675, 3675, 3680, 3679,
+ 3681, 3676, 3684, 3686, 3684, 3678, 3687, 3688, 3685, 3690,
+ 3678, 3693, 3691, 3692, 3677, 3685, 3680, 3695, 3690, 3688,
+ 3681, 3696, 3697, 3694, 3687, 3698, 3686, 3699, 3704, 3684,
+
+ 3686, 3701, 3699, 3687, 3688, 3692, 3690, 3691, 3693, 3691,
+ 3692, 3694, 3708, 3695, 3695, 3700, 3703, 0, 3696, 3697,
+ 3694, 3703, 3698, 3701, 3699, 3706, 3702, 3700, 3701, 3702,
+ 3704, 3705, 3707, 3705, 3708, 3709, 3711, 3706, 3707, 3708,
+ 3712, 3710, 3700, 3713, 3702, 0, 3714, 3715, 3703, 3710,
+ 0, 3720, 3706, 3702, 3716, 3717, 3702, 3709, 3705, 3707,
+ 3722, 3724, 3709, 3711, 3713, 3725, 3716, 3721, 3710, 3729,
+ 3713, 3730, 3712, 3714, 3715, 3727, 3731, 3717, 3720, 3732,
+ 3721, 3716, 3717, 3725, 3727, 3734, 3735, 3722, 3724, 3736,
+ 3737, 3740, 3725, 3741, 3721, 3745, 3729, 3746, 3730, 3738,
+
+ 3738, 3748, 3727, 3731, 3747, 3751, 3732, 3753, 3748, 3740,
+ 0, 3750, 3734, 3735, 0, 3746, 3736, 3737, 3740, 3747,
+ 3741, 3752, 3745, 3750, 3746, 3754, 3738, 3755, 3748, 3752,
+ 3756, 3747, 3751, 3757, 3753, 3758, 3759, 3754, 3750, 3761,
+ 3762, 3755, 3766, 0, 3767, 3756, 3768, 3774, 3752, 3770,
+ 3758, 3761, 3754, 3767, 3755, 3769, 3769, 3756, 0, 3757,
+ 3757, 3773, 3758, 3759, 3766, 3771, 3761, 3762, 3775, 3766,
+ 3768, 3767, 3776, 3768, 3771, 3770, 3770, 0, 3777, 3774,
+ 3778, 3775, 3769, 3781, 3782, 3773, 3777, 3779, 3773, 3778,
+ 3785, 3786, 3771, 3788, 3776, 3775, 3791, 3791, 3779, 3776,
+
+ 3801, 3792, 3782, 3786, 3781, 3777, 3802, 3778, 3792, 3806,
+ 3781, 3782, 3805, 3785, 3779, 3807, 3808, 3785, 3786, 3788,
+ 3788, 3810, 3801, 3791, 3814, 3812, 3805, 3801, 3792, 3812,
+ 3802, 3813, 3816, 3802, 3815, 3820, 3806, 3818, 3822, 3805,
+ 0, 3815, 3807, 3808, 3816, 3824, 3823, 3814, 3810, 3813,
+ 3818, 3814, 3812, 3821, 3822, 3826, 0, 3821, 3813, 3816,
+ 3829, 3815, 3825, 3827, 3818, 3822, 3833, 3820, 3823, 3829,
+ 3824, 3828, 3824, 3823, 3825, 3830, 3831, 3827, 3831, 3828,
+ 3821, 3826, 3826, 3832, 3833, 3834, 3830, 3829, 3836, 3825,
+ 3827, 3835, 3837, 3833, 3836, 3832, 3839, 3840, 3828, 3838,
+
+ 3834, 3841, 3830, 3831, 3839, 3842, 3849, 3837, 3841, 3847,
+ 3832, 3850, 3834, 3835, 3852, 3836, 3851, 3853, 3835, 3837,
+ 3854, 3838, 3847, 3839, 3840, 3855, 3838, 3842, 3841, 3850,
+ 3848, 3856, 3842, 3849, 3857, 3859, 3847, 3848, 3850, 3853,
+ 3851, 3852, 3857, 3851, 3853, 3860, 3854, 3854, 3858, 3861,
+ 3864, 3862, 3855, 3862, 3863, 3858, 3865, 3848, 3856, 3859,
+ 3868, 3857, 3859, 3867, 3866, 3870, 3863, 3860, 3871, 3865,
+ 3869, 3861, 3860, 3872, 3874, 3858, 3861, 3869, 3862, 3866,
+ 3876, 3863, 3864, 3865, 3875, 3867, 3877, 3868, 3876, 3883,
+ 3867, 3866, 3870, 3879, 3880, 3871, 3875, 3869, 3883, 3882,
+
+ 3872, 3874, 3882, 3886, 3888, 3879, 3887, 3876, 3890, 3889,
+ 3880, 3875, 3891, 3877, 3892, 3893, 3883, 3889, 3896, 0,
+ 3879, 3880, 3898, 3888, 3895, 3906, 3882, 3892, 3903, 3893,
+ 3886, 3888, 3887, 3887, 3903, 3894, 3889, 3907, 3906, 3908,
+ 3890, 3892, 3893, 3894, 3891, 3896, 3895, 3904, 3909, 3898,
+ 3908, 3895, 3906, 3911, 3904, 3903, 3912, 3913, 3914, 3915,
+ 3911, 3916, 3894, 0, 3907, 3913, 3908, 3917, 3918, 3916,
+ 3919, 3909, 3914, 3915, 3904, 3909, 3927, 3929, 3912, 3928,
+ 3911, 3926, 0, 3912, 3913, 3914, 3915, 3923, 3916, 3917,
+ 3918, 3922, 3924, 3931, 3917, 3918, 3923, 3919, 3922, 3926,
+
+ 3924, 3928, 3930, 3927, 3932, 3933, 3928, 3935, 3926, 3929,
+ 3937, 3938, 0, 3934, 3923, 3931, 3939, 0, 3922, 3924,
+ 3931, 3934, 3942, 0, 3947, 3940, 3932, 3933, 3930, 3930,
+ 3944, 3932, 3933, 3938, 3940, 0, 3943, 3937, 3938, 3935,
+ 3934, 3951, 3953, 3939, 3943, 3942, 3945, 3946, 3949, 3942,
+ 3944, 3948, 3940, 3954, 3945, 3946, 3947, 3944, 3955, 3948,
+ 3956, 3955, 3949, 3943, 3953, 3960, 0, 3951, 3951, 3953,
+ 3959, 3957, 3961, 3945, 3946, 3949, 3955, 3966, 3948, 3957,
+ 3954, 3958, 3956, 3963, 3959, 3955, 3962, 3956, 3955, 3958,
+ 3968, 3960, 3960, 3967, 3961, 3965, 3965, 3959, 3957, 3961,
+
+ 3962, 3967, 3969, 3966, 3966, 3970, 3963, 3972, 3958, 3973,
+ 3963, 3971, 3974, 3962, 3977, 3972, 3968, 3968, 3975, 3976,
+ 3967, 0, 3965, 3978, 3985, 0, 0, 3970, 3969, 3969,
+ 3981, 3971, 3970, 3979, 3972, 0, 3973, 3988, 3971, 3974,
+ 3975, 3977, 0, 3978, 3976, 3975, 3976, 3980, 3982, 3989,
+ 3978, 3985, 3981, 3979, 3986, 3980, 3982, 3981, 3990, 3988,
+ 3979, 3991, 3986, 3992, 3988, 3994, 3990, 3997, 3998, 3991,
+ 3995, 3989, 3996, 4001, 3980, 3982, 3989, 4002, 3995, 4005,
+ 3996, 3986, 3999, 4003, 0, 3990, 4008, 4011, 3991, 3992,
+ 3992, 4012, 3994, 3997, 3997, 3998, 0, 3995, 0, 3996,
+
+ 4001, 4005, 3999, 4003, 4002, 0, 4005, 4009, 4008, 3999,
+ 4003, 4010, 0, 4008, 4011, 4009, 0, 0, 4012, 4010,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 4009, 0, 0, 0, 4010, 4016,
+ 4016, 4016, 4016, 4016, 4016, 4016, 4017, 4017, 4017, 4017,
+ 4017, 4017, 4017, 4018, 4018, 4018, 4018, 4018, 4018, 4018,
+ 4019, 4019, 4019, 4019, 4019, 4019, 4019, 4020, 4020, 4020,
+ 4020, 4020, 4020, 4020, 4021, 4021, 4021, 4021, 4021, 4021,
+ 4021, 4022, 4022, 4022, 4022, 4022, 4022, 4022, 4024, 4024,
+ 0, 4024, 4024, 4024, 4024, 4025, 4025, 0, 0, 0,
+
+ 4025, 4025, 4026, 4026, 0, 0, 4026, 0, 4026, 4027,
+ 0, 0, 0, 0, 0, 4027, 4028, 4028, 0, 0,
+ 0, 4028, 4028, 4029, 0, 0, 0, 0, 0, 4029,
+ 4030, 4030, 0, 4030, 4030, 4030, 4030, 4031, 0, 0,
+ 0, 0, 0, 4031, 4032, 4032, 0, 0, 0, 4032,
+ 4032, 4033, 4033, 0, 4033, 4033, 4033, 4033, 4015, 4015,
+ 4015, 4015, 4015, 4015, 4015, 4015, 4015, 4015, 4015, 4015,
+ 4015, 4015, 4015, 4015, 4015, 4015, 4015, 4015, 4015, 4015,
+ 4015, 4015, 4015, 4015, 4015, 4015, 4015, 4015, 4015, 4015,
+ 4015, 4015, 4015, 4015, 4015, 4015, 4015, 4015, 4015, 4015,
+
+ 4015, 4015, 4015, 4015, 4015, 4015, 4015, 4015, 4015, 4015,
+ 4015, 4015, 4015, 4015, 4015, 4015, 4015, 4015, 4015, 4015,
+ 4015, 4015, 4015, 4015, 4015
} ;
static yy_state_type yy_last_accepting_state;
@@ -4400,7 +4495,7 @@ static void config_end_include(void)
}
#endif
-#line 4401 "<stdout>"
+#line 4496 "<stdout>"
#define YY_NO_INPUT 1
#line 191 "util/configlexer.lex"
#ifndef YY_NO_UNPUT
@@ -4409,9 +4504,9 @@ static void config_end_include(void)
#ifndef YY_NO_INPUT
#define YY_NO_INPUT 1
#endif
-#line 4410 "<stdout>"
+#line 4505 "<stdout>"
-#line 4412 "<stdout>"
+#line 4507 "<stdout>"
#define INITIAL 0
#define quotedstring 1
@@ -4635,7 +4730,7 @@ YY_DECL
{
#line 211 "util/configlexer.lex"
-#line 4636 "<stdout>"
+#line 4731 "<stdout>"
while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */
{
@@ -4668,13 +4763,13 @@ yy_match:
while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
{
yy_current_state = (int) yy_def[yy_current_state];
- if ( yy_current_state >= 3921 )
+ if ( yy_current_state >= 4016 )
yy_c = yy_meta[yy_c];
}
yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
++yy_cp;
}
- while ( yy_base[yy_current_state] != 11178 );
+ while ( yy_base[yy_current_state] != 11459 );
yy_find_action:
yy_act = yy_accept[yy_current_state];
@@ -4989,1589 +5084,1634 @@ YY_RULE_SETUP
case 58:
YY_RULE_SETUP
#line 272 "util/configlexer.lex"
-{ YDVAR(1, VAR_USE_SYSTEMD) }
+{ YDVAR(1, VAR_QUIC_PORT) }
YY_BREAK
case 59:
YY_RULE_SETUP
#line 273 "util/configlexer.lex"
-{ YDVAR(1, VAR_DO_DAEMONIZE) }
+{ YDVAR(1, VAR_QUIC_SIZE) }
YY_BREAK
case 60:
YY_RULE_SETUP
#line 274 "util/configlexer.lex"
-{ YDVAR(1, VAR_INTERFACE) }
+{ YDVAR(1, VAR_USE_SYSTEMD) }
YY_BREAK
case 61:
YY_RULE_SETUP
#line 275 "util/configlexer.lex"
-{ YDVAR(1, VAR_INTERFACE) }
+{ YDVAR(1, VAR_DO_DAEMONIZE) }
YY_BREAK
case 62:
YY_RULE_SETUP
#line 276 "util/configlexer.lex"
-{ YDVAR(1, VAR_OUTGOING_INTERFACE) }
+{ YDVAR(1, VAR_INTERFACE) }
YY_BREAK
case 63:
YY_RULE_SETUP
#line 277 "util/configlexer.lex"
-{ YDVAR(1, VAR_INTERFACE_AUTOMATIC) }
+{ YDVAR(1, VAR_INTERFACE) }
YY_BREAK
case 64:
YY_RULE_SETUP
#line 278 "util/configlexer.lex"
-{ YDVAR(1, VAR_INTERFACE_AUTOMATIC_PORTS) }
+{ YDVAR(1, VAR_OUTGOING_INTERFACE) }
YY_BREAK
case 65:
YY_RULE_SETUP
#line 279 "util/configlexer.lex"
-{ YDVAR(1, VAR_SO_RCVBUF) }
+{ YDVAR(1, VAR_INTERFACE_AUTOMATIC) }
YY_BREAK
case 66:
YY_RULE_SETUP
#line 280 "util/configlexer.lex"
-{ YDVAR(1, VAR_SO_SNDBUF) }
+{ YDVAR(1, VAR_INTERFACE_AUTOMATIC_PORTS) }
YY_BREAK
case 67:
YY_RULE_SETUP
#line 281 "util/configlexer.lex"
-{ YDVAR(1, VAR_SO_REUSEPORT) }
+{ YDVAR(1, VAR_SO_RCVBUF) }
YY_BREAK
case 68:
YY_RULE_SETUP
#line 282 "util/configlexer.lex"
-{ YDVAR(1, VAR_IP_TRANSPARENT) }
+{ YDVAR(1, VAR_SO_SNDBUF) }
YY_BREAK
case 69:
YY_RULE_SETUP
#line 283 "util/configlexer.lex"
-{ YDVAR(1, VAR_IP_FREEBIND) }
+{ YDVAR(1, VAR_SO_REUSEPORT) }
YY_BREAK
case 70:
YY_RULE_SETUP
#line 284 "util/configlexer.lex"
-{ YDVAR(1, VAR_IP_DSCP) }
+{ YDVAR(1, VAR_IP_TRANSPARENT) }
YY_BREAK
case 71:
YY_RULE_SETUP
#line 285 "util/configlexer.lex"
-{ YDVAR(1, VAR_CHROOT) }
+{ YDVAR(1, VAR_IP_FREEBIND) }
YY_BREAK
case 72:
YY_RULE_SETUP
#line 286 "util/configlexer.lex"
-{ YDVAR(1, VAR_USERNAME) }
+{ YDVAR(1, VAR_IP_DSCP) }
YY_BREAK
case 73:
YY_RULE_SETUP
#line 287 "util/configlexer.lex"
-{ YDVAR(1, VAR_DIRECTORY) }
+{ YDVAR(1, VAR_CHROOT) }
YY_BREAK
case 74:
YY_RULE_SETUP
#line 288 "util/configlexer.lex"
-{ YDVAR(1, VAR_LOGFILE) }
+{ YDVAR(1, VAR_USERNAME) }
YY_BREAK
case 75:
YY_RULE_SETUP
#line 289 "util/configlexer.lex"
-{ YDVAR(1, VAR_PIDFILE) }
+{ YDVAR(1, VAR_DIRECTORY) }
YY_BREAK
case 76:
YY_RULE_SETUP
#line 290 "util/configlexer.lex"
-{ YDVAR(1, VAR_ROOT_HINTS) }
+{ YDVAR(1, VAR_LOGFILE) }
YY_BREAK
case 77:
YY_RULE_SETUP
#line 291 "util/configlexer.lex"
-{ YDVAR(1, VAR_STREAM_WAIT_SIZE) }
+{ YDVAR(1, VAR_PIDFILE) }
YY_BREAK
case 78:
YY_RULE_SETUP
#line 292 "util/configlexer.lex"
-{ YDVAR(1, VAR_EDNS_BUFFER_SIZE) }
+{ YDVAR(1, VAR_ROOT_HINTS) }
YY_BREAK
case 79:
YY_RULE_SETUP
#line 293 "util/configlexer.lex"
-{ YDVAR(1, VAR_MSG_BUFFER_SIZE) }
+{ YDVAR(1, VAR_STREAM_WAIT_SIZE) }
YY_BREAK
case 80:
YY_RULE_SETUP
#line 294 "util/configlexer.lex"
-{ YDVAR(1, VAR_MSG_CACHE_SIZE) }
+{ YDVAR(1, VAR_EDNS_BUFFER_SIZE) }
YY_BREAK
case 81:
YY_RULE_SETUP
#line 295 "util/configlexer.lex"
-{ YDVAR(1, VAR_MSG_CACHE_SLABS) }
+{ YDVAR(1, VAR_MSG_BUFFER_SIZE) }
YY_BREAK
case 82:
YY_RULE_SETUP
#line 296 "util/configlexer.lex"
-{ YDVAR(1, VAR_RRSET_CACHE_SIZE) }
+{ YDVAR(1, VAR_MSG_CACHE_SIZE) }
YY_BREAK
case 83:
YY_RULE_SETUP
#line 297 "util/configlexer.lex"
-{ YDVAR(1, VAR_RRSET_CACHE_SLABS) }
+{ YDVAR(1, VAR_MSG_CACHE_SLABS) }
YY_BREAK
case 84:
YY_RULE_SETUP
#line 298 "util/configlexer.lex"
-{ YDVAR(1, VAR_CACHE_MAX_TTL) }
+{ YDVAR(1, VAR_RRSET_CACHE_SIZE) }
YY_BREAK
case 85:
YY_RULE_SETUP
#line 299 "util/configlexer.lex"
-{ YDVAR(1, VAR_CACHE_MAX_NEGATIVE_TTL) }
+{ YDVAR(1, VAR_RRSET_CACHE_SLABS) }
YY_BREAK
case 86:
YY_RULE_SETUP
#line 300 "util/configlexer.lex"
-{ YDVAR(1, VAR_CACHE_MIN_NEGATIVE_TTL) }
+{ YDVAR(1, VAR_CACHE_MAX_TTL) }
YY_BREAK
case 87:
YY_RULE_SETUP
#line 301 "util/configlexer.lex"
-{ YDVAR(1, VAR_CACHE_MIN_TTL) }
+{ YDVAR(1, VAR_CACHE_MAX_NEGATIVE_TTL) }
YY_BREAK
case 88:
YY_RULE_SETUP
#line 302 "util/configlexer.lex"
-{ YDVAR(1, VAR_INFRA_HOST_TTL) }
+{ YDVAR(1, VAR_CACHE_MIN_NEGATIVE_TTL) }
YY_BREAK
case 89:
YY_RULE_SETUP
#line 303 "util/configlexer.lex"
-{ YDVAR(1, VAR_INFRA_LAME_TTL) }
+{ YDVAR(1, VAR_CACHE_MIN_TTL) }
YY_BREAK
case 90:
YY_RULE_SETUP
#line 304 "util/configlexer.lex"
-{ YDVAR(1, VAR_INFRA_CACHE_SLABS) }
+{ YDVAR(1, VAR_INFRA_HOST_TTL) }
YY_BREAK
case 91:
YY_RULE_SETUP
#line 305 "util/configlexer.lex"
-{ YDVAR(1, VAR_INFRA_CACHE_NUMHOSTS) }
+{ YDVAR(1, VAR_INFRA_LAME_TTL) }
YY_BREAK
case 92:
YY_RULE_SETUP
#line 306 "util/configlexer.lex"
-{ YDVAR(1, VAR_INFRA_CACHE_LAME_SIZE) }
+{ YDVAR(1, VAR_INFRA_CACHE_SLABS) }
YY_BREAK
case 93:
YY_RULE_SETUP
#line 307 "util/configlexer.lex"
-{ YDVAR(1, VAR_INFRA_CACHE_MIN_RTT) }
+{ YDVAR(1, VAR_INFRA_CACHE_NUMHOSTS) }
YY_BREAK
case 94:
YY_RULE_SETUP
#line 308 "util/configlexer.lex"
-{ YDVAR(1, VAR_INFRA_CACHE_MAX_RTT) }
+{ YDVAR(1, VAR_INFRA_CACHE_LAME_SIZE) }
YY_BREAK
case 95:
YY_RULE_SETUP
#line 309 "util/configlexer.lex"
-{ YDVAR(1, VAR_INFRA_KEEP_PROBING) }
+{ YDVAR(1, VAR_INFRA_CACHE_MIN_RTT) }
YY_BREAK
case 96:
YY_RULE_SETUP
#line 310 "util/configlexer.lex"
-{ YDVAR(1, VAR_NUM_QUERIES_PER_THREAD) }
+{ YDVAR(1, VAR_INFRA_CACHE_MAX_RTT) }
YY_BREAK
case 97:
YY_RULE_SETUP
#line 311 "util/configlexer.lex"
-{ YDVAR(1, VAR_JOSTLE_TIMEOUT) }
+{ YDVAR(1, VAR_INFRA_KEEP_PROBING) }
YY_BREAK
case 98:
YY_RULE_SETUP
#line 312 "util/configlexer.lex"
-{ YDVAR(1, VAR_DELAY_CLOSE) }
+{ YDVAR(1, VAR_NUM_QUERIES_PER_THREAD) }
YY_BREAK
case 99:
YY_RULE_SETUP
#line 313 "util/configlexer.lex"
-{ YDVAR(1, VAR_UDP_CONNECT) }
+{ YDVAR(1, VAR_JOSTLE_TIMEOUT) }
YY_BREAK
case 100:
YY_RULE_SETUP
#line 314 "util/configlexer.lex"
-{ YDVAR(1, VAR_TARGET_FETCH_POLICY) }
+{ YDVAR(1, VAR_DELAY_CLOSE) }
YY_BREAK
case 101:
YY_RULE_SETUP
#line 315 "util/configlexer.lex"
-{ YDVAR(1, VAR_HARDEN_SHORT_BUFSIZE) }
+{ YDVAR(1, VAR_UDP_CONNECT) }
YY_BREAK
case 102:
YY_RULE_SETUP
#line 316 "util/configlexer.lex"
-{ YDVAR(1, VAR_HARDEN_LARGE_QUERIES) }
+{ YDVAR(1, VAR_TARGET_FETCH_POLICY) }
YY_BREAK
case 103:
YY_RULE_SETUP
#line 317 "util/configlexer.lex"
-{ YDVAR(1, VAR_HARDEN_GLUE) }
+{ YDVAR(1, VAR_HARDEN_SHORT_BUFSIZE) }
YY_BREAK
case 104:
YY_RULE_SETUP
#line 318 "util/configlexer.lex"
-{ YDVAR(1, VAR_HARDEN_DNSSEC_STRIPPED) }
+{ YDVAR(1, VAR_HARDEN_LARGE_QUERIES) }
YY_BREAK
case 105:
YY_RULE_SETUP
#line 319 "util/configlexer.lex"
-{ YDVAR(1, VAR_HARDEN_BELOW_NXDOMAIN) }
+{ YDVAR(1, VAR_HARDEN_GLUE) }
YY_BREAK
case 106:
YY_RULE_SETUP
#line 320 "util/configlexer.lex"
-{ YDVAR(1, VAR_HARDEN_REFERRAL_PATH) }
+{ YDVAR(1, VAR_HARDEN_UNVERIFIED_GLUE) }
YY_BREAK
case 107:
YY_RULE_SETUP
#line 321 "util/configlexer.lex"
-{ YDVAR(1, VAR_HARDEN_ALGO_DOWNGRADE) }
+{ YDVAR(1, VAR_HARDEN_DNSSEC_STRIPPED) }
YY_BREAK
case 108:
YY_RULE_SETUP
#line 322 "util/configlexer.lex"
-{ YDVAR(1, VAR_HARDEN_UNKNOWN_ADDITIONAL) }
+{ YDVAR(1, VAR_HARDEN_BELOW_NXDOMAIN) }
YY_BREAK
case 109:
YY_RULE_SETUP
#line 323 "util/configlexer.lex"
-{ YDVAR(1, VAR_USE_CAPS_FOR_ID) }
+{ YDVAR(1, VAR_HARDEN_REFERRAL_PATH) }
YY_BREAK
case 110:
YY_RULE_SETUP
#line 324 "util/configlexer.lex"
-{ YDVAR(1, VAR_CAPS_WHITELIST) }
+{ YDVAR(1, VAR_HARDEN_ALGO_DOWNGRADE) }
YY_BREAK
case 111:
YY_RULE_SETUP
#line 325 "util/configlexer.lex"
-{ YDVAR(1, VAR_CAPS_WHITELIST) }
+{ YDVAR(1, VAR_HARDEN_UNKNOWN_ADDITIONAL) }
YY_BREAK
case 112:
YY_RULE_SETUP
#line 326 "util/configlexer.lex"
-{ YDVAR(1, VAR_UNWANTED_REPLY_THRESHOLD) }
+{ YDVAR(1, VAR_USE_CAPS_FOR_ID) }
YY_BREAK
case 113:
YY_RULE_SETUP
#line 327 "util/configlexer.lex"
-{ YDVAR(1, VAR_PRIVATE_ADDRESS) }
+{ YDVAR(1, VAR_CAPS_WHITELIST) }
YY_BREAK
case 114:
YY_RULE_SETUP
#line 328 "util/configlexer.lex"
-{ YDVAR(1, VAR_PRIVATE_DOMAIN) }
+{ YDVAR(1, VAR_CAPS_WHITELIST) }
YY_BREAK
case 115:
YY_RULE_SETUP
#line 329 "util/configlexer.lex"
-{ YDVAR(1, VAR_PREFETCH_KEY) }
+{ YDVAR(1, VAR_UNWANTED_REPLY_THRESHOLD) }
YY_BREAK
case 116:
YY_RULE_SETUP
#line 330 "util/configlexer.lex"
-{ YDVAR(1, VAR_PREFETCH) }
+{ YDVAR(1, VAR_PRIVATE_ADDRESS) }
YY_BREAK
case 117:
YY_RULE_SETUP
#line 331 "util/configlexer.lex"
-{ YDVAR(1, VAR_DENY_ANY) }
+{ YDVAR(1, VAR_PRIVATE_DOMAIN) }
YY_BREAK
case 118:
YY_RULE_SETUP
#line 332 "util/configlexer.lex"
-{ YDVAR(0, VAR_STUB_ZONE) }
+{ YDVAR(1, VAR_PREFETCH_KEY) }
YY_BREAK
case 119:
YY_RULE_SETUP
#line 333 "util/configlexer.lex"
-{ YDVAR(1, VAR_NAME) }
+{ YDVAR(1, VAR_PREFETCH) }
YY_BREAK
case 120:
YY_RULE_SETUP
#line 334 "util/configlexer.lex"
-{ YDVAR(1, VAR_STUB_ADDR) }
+{ YDVAR(1, VAR_DENY_ANY) }
YY_BREAK
case 121:
YY_RULE_SETUP
#line 335 "util/configlexer.lex"
-{ YDVAR(1, VAR_STUB_HOST) }
+{ YDVAR(0, VAR_STUB_ZONE) }
YY_BREAK
case 122:
YY_RULE_SETUP
#line 336 "util/configlexer.lex"
-{ YDVAR(1, VAR_STUB_PRIME) }
+{ YDVAR(1, VAR_NAME) }
YY_BREAK
case 123:
YY_RULE_SETUP
#line 337 "util/configlexer.lex"
-{ YDVAR(1, VAR_STUB_FIRST) }
+{ YDVAR(1, VAR_STUB_ADDR) }
YY_BREAK
case 124:
YY_RULE_SETUP
#line 338 "util/configlexer.lex"
-{ YDVAR(1, VAR_STUB_NO_CACHE) }
+{ YDVAR(1, VAR_STUB_HOST) }
YY_BREAK
case 125:
YY_RULE_SETUP
#line 339 "util/configlexer.lex"
-{ YDVAR(1, VAR_STUB_SSL_UPSTREAM) }
+{ YDVAR(1, VAR_STUB_PRIME) }
YY_BREAK
case 126:
YY_RULE_SETUP
#line 340 "util/configlexer.lex"
-{ YDVAR(1, VAR_STUB_SSL_UPSTREAM) }
+{ YDVAR(1, VAR_STUB_FIRST) }
YY_BREAK
case 127:
YY_RULE_SETUP
#line 341 "util/configlexer.lex"
-{ YDVAR(1, VAR_STUB_TCP_UPSTREAM) }
+{ YDVAR(1, VAR_STUB_NO_CACHE) }
YY_BREAK
case 128:
YY_RULE_SETUP
#line 342 "util/configlexer.lex"
-{ YDVAR(0, VAR_FORWARD_ZONE) }
+{ YDVAR(1, VAR_STUB_SSL_UPSTREAM) }
YY_BREAK
case 129:
YY_RULE_SETUP
#line 343 "util/configlexer.lex"
-{ YDVAR(1, VAR_FORWARD_ADDR) }
+{ YDVAR(1, VAR_STUB_SSL_UPSTREAM) }
YY_BREAK
case 130:
YY_RULE_SETUP
#line 344 "util/configlexer.lex"
-{ YDVAR(1, VAR_FORWARD_HOST) }
+{ YDVAR(1, VAR_STUB_TCP_UPSTREAM) }
YY_BREAK
case 131:
YY_RULE_SETUP
#line 345 "util/configlexer.lex"
-{ YDVAR(1, VAR_FORWARD_FIRST) }
+{ YDVAR(0, VAR_FORWARD_ZONE) }
YY_BREAK
case 132:
YY_RULE_SETUP
#line 346 "util/configlexer.lex"
-{ YDVAR(1, VAR_FORWARD_NO_CACHE) }
+{ YDVAR(1, VAR_FORWARD_ADDR) }
YY_BREAK
case 133:
YY_RULE_SETUP
#line 347 "util/configlexer.lex"
-{ YDVAR(1, VAR_FORWARD_SSL_UPSTREAM) }
+{ YDVAR(1, VAR_FORWARD_HOST) }
YY_BREAK
case 134:
YY_RULE_SETUP
#line 348 "util/configlexer.lex"
-{ YDVAR(1, VAR_FORWARD_SSL_UPSTREAM) }
+{ YDVAR(1, VAR_FORWARD_FIRST) }
YY_BREAK
case 135:
YY_RULE_SETUP
#line 349 "util/configlexer.lex"
-{ YDVAR(1, VAR_FORWARD_TCP_UPSTREAM) }
+{ YDVAR(1, VAR_FORWARD_NO_CACHE) }
YY_BREAK
case 136:
YY_RULE_SETUP
#line 350 "util/configlexer.lex"
-{ YDVAR(0, VAR_AUTH_ZONE) }
+{ YDVAR(1, VAR_FORWARD_SSL_UPSTREAM) }
YY_BREAK
case 137:
YY_RULE_SETUP
#line 351 "util/configlexer.lex"
-{ YDVAR(0, VAR_RPZ) }
+{ YDVAR(1, VAR_FORWARD_SSL_UPSTREAM) }
YY_BREAK
case 138:
YY_RULE_SETUP
#line 352 "util/configlexer.lex"
-{ YDVAR(1, VAR_TAGS) }
+{ YDVAR(1, VAR_FORWARD_TCP_UPSTREAM) }
YY_BREAK
case 139:
YY_RULE_SETUP
#line 353 "util/configlexer.lex"
-{ YDVAR(1, VAR_RPZ_ACTION_OVERRIDE) }
+{ YDVAR(0, VAR_AUTH_ZONE) }
YY_BREAK
case 140:
YY_RULE_SETUP
#line 354 "util/configlexer.lex"
-{ YDVAR(1, VAR_RPZ_CNAME_OVERRIDE) }
+{ YDVAR(0, VAR_RPZ) }
YY_BREAK
case 141:
YY_RULE_SETUP
#line 355 "util/configlexer.lex"
-{ YDVAR(1, VAR_RPZ_LOG) }
+{ YDVAR(1, VAR_TAGS) }
YY_BREAK
case 142:
YY_RULE_SETUP
#line 356 "util/configlexer.lex"
-{ YDVAR(1, VAR_RPZ_LOG_NAME) }
+{ YDVAR(1, VAR_RPZ_ACTION_OVERRIDE) }
YY_BREAK
case 143:
YY_RULE_SETUP
#line 357 "util/configlexer.lex"
-{ YDVAR(1, VAR_RPZ_SIGNAL_NXDOMAIN_RA) }
+{ YDVAR(1, VAR_RPZ_CNAME_OVERRIDE) }
YY_BREAK
case 144:
YY_RULE_SETUP
#line 358 "util/configlexer.lex"
-{ YDVAR(1, VAR_ZONEFILE) }
+{ YDVAR(1, VAR_RPZ_LOG) }
YY_BREAK
case 145:
YY_RULE_SETUP
#line 359 "util/configlexer.lex"
-{ YDVAR(1, VAR_MASTER) }
+{ YDVAR(1, VAR_RPZ_LOG_NAME) }
YY_BREAK
case 146:
YY_RULE_SETUP
#line 360 "util/configlexer.lex"
-{ YDVAR(1, VAR_MASTER) }
+{ YDVAR(1, VAR_RPZ_SIGNAL_NXDOMAIN_RA) }
YY_BREAK
case 147:
YY_RULE_SETUP
#line 361 "util/configlexer.lex"
-{ YDVAR(1, VAR_URL) }
+{ YDVAR(1, VAR_ZONEFILE) }
YY_BREAK
case 148:
YY_RULE_SETUP
#line 362 "util/configlexer.lex"
-{ YDVAR(1, VAR_ALLOW_NOTIFY) }
+{ YDVAR(1, VAR_MASTER) }
YY_BREAK
case 149:
YY_RULE_SETUP
#line 363 "util/configlexer.lex"
-{ YDVAR(1, VAR_FOR_DOWNSTREAM) }
+{ YDVAR(1, VAR_MASTER) }
YY_BREAK
case 150:
YY_RULE_SETUP
#line 364 "util/configlexer.lex"
-{ YDVAR(1, VAR_FOR_UPSTREAM) }
+{ YDVAR(1, VAR_URL) }
YY_BREAK
case 151:
YY_RULE_SETUP
#line 365 "util/configlexer.lex"
-{ YDVAR(1, VAR_FALLBACK_ENABLED) }
+{ YDVAR(1, VAR_ALLOW_NOTIFY) }
YY_BREAK
case 152:
YY_RULE_SETUP
#line 366 "util/configlexer.lex"
-{ YDVAR(0, VAR_VIEW) }
+{ YDVAR(1, VAR_FOR_DOWNSTREAM) }
YY_BREAK
case 153:
YY_RULE_SETUP
#line 367 "util/configlexer.lex"
-{ YDVAR(1, VAR_VIEW_FIRST) }
+{ YDVAR(1, VAR_FOR_UPSTREAM) }
YY_BREAK
case 154:
YY_RULE_SETUP
#line 368 "util/configlexer.lex"
-{ YDVAR(1, VAR_DO_NOT_QUERY_ADDRESS) }
+{ YDVAR(1, VAR_FALLBACK_ENABLED) }
YY_BREAK
case 155:
YY_RULE_SETUP
#line 369 "util/configlexer.lex"
-{ YDVAR(1, VAR_DO_NOT_QUERY_LOCALHOST) }
+{ YDVAR(0, VAR_VIEW) }
YY_BREAK
case 156:
YY_RULE_SETUP
#line 370 "util/configlexer.lex"
-{ YDVAR(2, VAR_ACCESS_CONTROL) }
+{ YDVAR(1, VAR_VIEW_FIRST) }
YY_BREAK
case 157:
YY_RULE_SETUP
#line 371 "util/configlexer.lex"
-{ YDVAR(2, VAR_INTERFACE_ACTION) }
+{ YDVAR(1, VAR_DO_NOT_QUERY_ADDRESS) }
YY_BREAK
case 158:
YY_RULE_SETUP
#line 372 "util/configlexer.lex"
-{ YDVAR(1, VAR_SEND_CLIENT_SUBNET) }
+{ YDVAR(1, VAR_DO_NOT_QUERY_LOCALHOST) }
YY_BREAK
case 159:
YY_RULE_SETUP
#line 373 "util/configlexer.lex"
-{ YDVAR(1, VAR_CLIENT_SUBNET_ZONE) }
+{ YDVAR(2, VAR_ACCESS_CONTROL) }
YY_BREAK
case 160:
YY_RULE_SETUP
#line 374 "util/configlexer.lex"
-{ YDVAR(1, VAR_CLIENT_SUBNET_ALWAYS_FORWARD) }
+{ YDVAR(2, VAR_INTERFACE_ACTION) }
YY_BREAK
case 161:
YY_RULE_SETUP
#line 375 "util/configlexer.lex"
-{ YDVAR(1, VAR_CLIENT_SUBNET_OPCODE) }
+{ YDVAR(1, VAR_SEND_CLIENT_SUBNET) }
YY_BREAK
case 162:
YY_RULE_SETUP
#line 376 "util/configlexer.lex"
-{ YDVAR(1, VAR_MAX_CLIENT_SUBNET_IPV4) }
+{ YDVAR(1, VAR_CLIENT_SUBNET_ZONE) }
YY_BREAK
case 163:
YY_RULE_SETUP
#line 377 "util/configlexer.lex"
-{ YDVAR(1, VAR_MAX_CLIENT_SUBNET_IPV6) }
+{ YDVAR(1, VAR_CLIENT_SUBNET_ALWAYS_FORWARD) }
YY_BREAK
case 164:
YY_RULE_SETUP
#line 378 "util/configlexer.lex"
-{ YDVAR(1, VAR_MIN_CLIENT_SUBNET_IPV4) }
+{ YDVAR(1, VAR_CLIENT_SUBNET_OPCODE) }
YY_BREAK
case 165:
YY_RULE_SETUP
#line 379 "util/configlexer.lex"
-{ YDVAR(1, VAR_MIN_CLIENT_SUBNET_IPV6) }
+{ YDVAR(1, VAR_MAX_CLIENT_SUBNET_IPV4) }
YY_BREAK
case 166:
YY_RULE_SETUP
#line 380 "util/configlexer.lex"
-{ YDVAR(1, VAR_MAX_ECS_TREE_SIZE_IPV4) }
+{ YDVAR(1, VAR_MAX_CLIENT_SUBNET_IPV6) }
YY_BREAK
case 167:
YY_RULE_SETUP
#line 381 "util/configlexer.lex"
-{ YDVAR(1, VAR_MAX_ECS_TREE_SIZE_IPV6) }
+{ YDVAR(1, VAR_MIN_CLIENT_SUBNET_IPV4) }
YY_BREAK
case 168:
YY_RULE_SETUP
#line 382 "util/configlexer.lex"
-{ YDVAR(1, VAR_HIDE_IDENTITY) }
+{ YDVAR(1, VAR_MIN_CLIENT_SUBNET_IPV6) }
YY_BREAK
case 169:
YY_RULE_SETUP
#line 383 "util/configlexer.lex"
-{ YDVAR(1, VAR_HIDE_VERSION) }
+{ YDVAR(1, VAR_MAX_ECS_TREE_SIZE_IPV4) }
YY_BREAK
case 170:
YY_RULE_SETUP
#line 384 "util/configlexer.lex"
-{ YDVAR(1, VAR_HIDE_TRUSTANCHOR) }
+{ YDVAR(1, VAR_MAX_ECS_TREE_SIZE_IPV6) }
YY_BREAK
case 171:
YY_RULE_SETUP
#line 385 "util/configlexer.lex"
-{ YDVAR(1, VAR_HIDE_HTTP_USER_AGENT) }
+{ YDVAR(1, VAR_HIDE_IDENTITY) }
YY_BREAK
case 172:
YY_RULE_SETUP
#line 386 "util/configlexer.lex"
-{ YDVAR(1, VAR_IDENTITY) }
+{ YDVAR(1, VAR_HIDE_VERSION) }
YY_BREAK
case 173:
YY_RULE_SETUP
#line 387 "util/configlexer.lex"
-{ YDVAR(1, VAR_VERSION) }
+{ YDVAR(1, VAR_HIDE_TRUSTANCHOR) }
YY_BREAK
case 174:
YY_RULE_SETUP
#line 388 "util/configlexer.lex"
-{ YDVAR(1, VAR_HTTP_USER_AGENT) }
+{ YDVAR(1, VAR_HIDE_HTTP_USER_AGENT) }
YY_BREAK
case 175:
YY_RULE_SETUP
#line 389 "util/configlexer.lex"
-{ YDVAR(1, VAR_MODULE_CONF) }
+{ YDVAR(1, VAR_IDENTITY) }
YY_BREAK
case 176:
YY_RULE_SETUP
#line 390 "util/configlexer.lex"
-{ YDVAR(1, VAR_DLV_ANCHOR) }
+{ YDVAR(1, VAR_VERSION) }
YY_BREAK
case 177:
YY_RULE_SETUP
#line 391 "util/configlexer.lex"
-{ YDVAR(1, VAR_DLV_ANCHOR_FILE) }
+{ YDVAR(1, VAR_HTTP_USER_AGENT) }
YY_BREAK
case 178:
YY_RULE_SETUP
#line 392 "util/configlexer.lex"
-{ YDVAR(1, VAR_TRUST_ANCHOR_FILE) }
+{ YDVAR(1, VAR_MODULE_CONF) }
YY_BREAK
case 179:
YY_RULE_SETUP
#line 393 "util/configlexer.lex"
-{ YDVAR(1, VAR_AUTO_TRUST_ANCHOR_FILE) }
+{ YDVAR(1, VAR_DLV_ANCHOR) }
YY_BREAK
case 180:
YY_RULE_SETUP
#line 394 "util/configlexer.lex"
-{ YDVAR(1, VAR_TRUSTED_KEYS_FILE) }
+{ YDVAR(1, VAR_DLV_ANCHOR_FILE) }
YY_BREAK
case 181:
YY_RULE_SETUP
#line 395 "util/configlexer.lex"
-{ YDVAR(1, VAR_TRUST_ANCHOR) }
+{ YDVAR(1, VAR_TRUST_ANCHOR_FILE) }
YY_BREAK
case 182:
YY_RULE_SETUP
#line 396 "util/configlexer.lex"
-{ YDVAR(1, VAR_TRUST_ANCHOR_SIGNALING) }
+{ YDVAR(1, VAR_AUTO_TRUST_ANCHOR_FILE) }
YY_BREAK
case 183:
YY_RULE_SETUP
#line 397 "util/configlexer.lex"
-{ YDVAR(1, VAR_ROOT_KEY_SENTINEL) }
+{ YDVAR(1, VAR_TRUSTED_KEYS_FILE) }
YY_BREAK
case 184:
YY_RULE_SETUP
#line 398 "util/configlexer.lex"
-{ YDVAR(1, VAR_VAL_OVERRIDE_DATE) }
+{ YDVAR(1, VAR_TRUST_ANCHOR) }
YY_BREAK
case 185:
YY_RULE_SETUP
#line 399 "util/configlexer.lex"
-{ YDVAR(1, VAR_VAL_SIG_SKEW_MIN) }
+{ YDVAR(1, VAR_TRUST_ANCHOR_SIGNALING) }
YY_BREAK
case 186:
YY_RULE_SETUP
#line 400 "util/configlexer.lex"
-{ YDVAR(1, VAR_VAL_SIG_SKEW_MAX) }
+{ YDVAR(1, VAR_ROOT_KEY_SENTINEL) }
YY_BREAK
case 187:
YY_RULE_SETUP
#line 401 "util/configlexer.lex"
-{ YDVAR(1, VAR_VAL_MAX_RESTART) }
+{ YDVAR(1, VAR_VAL_OVERRIDE_DATE) }
YY_BREAK
case 188:
YY_RULE_SETUP
#line 402 "util/configlexer.lex"
-{ YDVAR(1, VAR_BOGUS_TTL) }
+{ YDVAR(1, VAR_VAL_SIG_SKEW_MIN) }
YY_BREAK
case 189:
YY_RULE_SETUP
#line 403 "util/configlexer.lex"
-{ YDVAR(1, VAR_VAL_CLEAN_ADDITIONAL) }
+{ YDVAR(1, VAR_VAL_SIG_SKEW_MAX) }
YY_BREAK
case 190:
YY_RULE_SETUP
#line 404 "util/configlexer.lex"
-{ YDVAR(1, VAR_VAL_PERMISSIVE_MODE) }
+{ YDVAR(1, VAR_VAL_MAX_RESTART) }
YY_BREAK
case 191:
YY_RULE_SETUP
#line 405 "util/configlexer.lex"
-{ YDVAR(1, VAR_AGGRESSIVE_NSEC) }
+{ YDVAR(1, VAR_BOGUS_TTL) }
YY_BREAK
case 192:
YY_RULE_SETUP
#line 406 "util/configlexer.lex"
-{ YDVAR(1, VAR_IGNORE_CD_FLAG) }
+{ YDVAR(1, VAR_VAL_CLEAN_ADDITIONAL) }
YY_BREAK
case 193:
YY_RULE_SETUP
#line 407 "util/configlexer.lex"
-{ YDVAR(1, VAR_DISABLE_EDNS_DO) }
+{ YDVAR(1, VAR_VAL_PERMISSIVE_MODE) }
YY_BREAK
case 194:
YY_RULE_SETUP
#line 408 "util/configlexer.lex"
-{ YDVAR(1, VAR_SERVE_EXPIRED) }
+{ YDVAR(1, VAR_AGGRESSIVE_NSEC) }
YY_BREAK
case 195:
YY_RULE_SETUP
#line 409 "util/configlexer.lex"
-{ YDVAR(1, VAR_SERVE_EXPIRED_TTL) }
+{ YDVAR(1, VAR_IGNORE_CD_FLAG) }
YY_BREAK
case 196:
YY_RULE_SETUP
#line 410 "util/configlexer.lex"
-{ YDVAR(1, VAR_SERVE_EXPIRED_TTL_RESET) }
+{ YDVAR(1, VAR_DISABLE_EDNS_DO) }
YY_BREAK
case 197:
YY_RULE_SETUP
#line 411 "util/configlexer.lex"
-{ YDVAR(1, VAR_SERVE_EXPIRED_REPLY_TTL) }
+{ YDVAR(1, VAR_SERVE_EXPIRED) }
YY_BREAK
case 198:
YY_RULE_SETUP
#line 412 "util/configlexer.lex"
-{ YDVAR(1, VAR_SERVE_EXPIRED_CLIENT_TIMEOUT) }
+{ YDVAR(1, VAR_SERVE_EXPIRED_TTL) }
YY_BREAK
case 199:
YY_RULE_SETUP
#line 413 "util/configlexer.lex"
-{ YDVAR(1, VAR_EDE_SERVE_EXPIRED) }
+{ YDVAR(1, VAR_SERVE_EXPIRED_TTL_RESET) }
YY_BREAK
case 200:
YY_RULE_SETUP
#line 414 "util/configlexer.lex"
-{ YDVAR(1, VAR_SERVE_ORIGINAL_TTL) }
+{ YDVAR(1, VAR_SERVE_EXPIRED_REPLY_TTL) }
YY_BREAK
case 201:
YY_RULE_SETUP
#line 415 "util/configlexer.lex"
-{ YDVAR(1, VAR_FAKE_DSA) }
+{ YDVAR(1, VAR_SERVE_EXPIRED_CLIENT_TIMEOUT) }
YY_BREAK
case 202:
YY_RULE_SETUP
#line 416 "util/configlexer.lex"
-{ YDVAR(1, VAR_FAKE_SHA1) }
+{ YDVAR(1, VAR_EDE_SERVE_EXPIRED) }
YY_BREAK
case 203:
YY_RULE_SETUP
#line 417 "util/configlexer.lex"
-{ YDVAR(1, VAR_VAL_LOG_LEVEL) }
+{ YDVAR(1, VAR_SERVE_ORIGINAL_TTL) }
YY_BREAK
case 204:
YY_RULE_SETUP
#line 418 "util/configlexer.lex"
-{ YDVAR(1, VAR_KEY_CACHE_SIZE) }
+{ YDVAR(1, VAR_FAKE_DSA) }
YY_BREAK
case 205:
YY_RULE_SETUP
#line 419 "util/configlexer.lex"
-{ YDVAR(1, VAR_KEY_CACHE_SLABS) }
+{ YDVAR(1, VAR_FAKE_SHA1) }
YY_BREAK
case 206:
YY_RULE_SETUP
#line 420 "util/configlexer.lex"
-{ YDVAR(1, VAR_NEG_CACHE_SIZE) }
+{ YDVAR(1, VAR_VAL_LOG_LEVEL) }
YY_BREAK
case 207:
YY_RULE_SETUP
#line 421 "util/configlexer.lex"
-{
- YDVAR(1, VAR_VAL_NSEC3_KEYSIZE_ITERATIONS) }
+{ YDVAR(1, VAR_KEY_CACHE_SIZE) }
YY_BREAK
case 208:
YY_RULE_SETUP
-#line 423 "util/configlexer.lex"
-{ YDVAR(1, VAR_ZONEMD_PERMISSIVE_MODE) }
+#line 422 "util/configlexer.lex"
+{ YDVAR(1, VAR_KEY_CACHE_SLABS) }
YY_BREAK
case 209:
YY_RULE_SETUP
-#line 424 "util/configlexer.lex"
-{ YDVAR(1, VAR_ZONEMD_CHECK) }
+#line 423 "util/configlexer.lex"
+{ YDVAR(1, VAR_NEG_CACHE_SIZE) }
YY_BREAK
case 210:
YY_RULE_SETUP
-#line 425 "util/configlexer.lex"
-{ YDVAR(1, VAR_ZONEMD_REJECT_ABSENCE) }
+#line 424 "util/configlexer.lex"
+{
+ YDVAR(1, VAR_VAL_NSEC3_KEYSIZE_ITERATIONS) }
YY_BREAK
case 211:
YY_RULE_SETUP
#line 426 "util/configlexer.lex"
-{ YDVAR(1, VAR_ADD_HOLDDOWN) }
+{ YDVAR(1, VAR_ZONEMD_PERMISSIVE_MODE) }
YY_BREAK
case 212:
YY_RULE_SETUP
#line 427 "util/configlexer.lex"
-{ YDVAR(1, VAR_DEL_HOLDDOWN) }
+{ YDVAR(1, VAR_ZONEMD_CHECK) }
YY_BREAK
case 213:
YY_RULE_SETUP
#line 428 "util/configlexer.lex"
-{ YDVAR(1, VAR_KEEP_MISSING) }
+{ YDVAR(1, VAR_ZONEMD_REJECT_ABSENCE) }
YY_BREAK
case 214:
YY_RULE_SETUP
#line 429 "util/configlexer.lex"
-{ YDVAR(1, VAR_PERMIT_SMALL_HOLDDOWN) }
+{ YDVAR(1, VAR_ADD_HOLDDOWN) }
YY_BREAK
case 215:
YY_RULE_SETUP
#line 430 "util/configlexer.lex"
-{ YDVAR(1, VAR_USE_SYSLOG) }
+{ YDVAR(1, VAR_DEL_HOLDDOWN) }
YY_BREAK
case 216:
YY_RULE_SETUP
#line 431 "util/configlexer.lex"
-{ YDVAR(1, VAR_LOG_IDENTITY) }
+{ YDVAR(1, VAR_KEEP_MISSING) }
YY_BREAK
case 217:
YY_RULE_SETUP
#line 432 "util/configlexer.lex"
-{ YDVAR(1, VAR_LOG_TIME_ASCII) }
+{ YDVAR(1, VAR_PERMIT_SMALL_HOLDDOWN) }
YY_BREAK
case 218:
YY_RULE_SETUP
#line 433 "util/configlexer.lex"
-{ YDVAR(1, VAR_LOG_QUERIES) }
+{ YDVAR(1, VAR_USE_SYSLOG) }
YY_BREAK
case 219:
YY_RULE_SETUP
#line 434 "util/configlexer.lex"
-{ YDVAR(1, VAR_LOG_REPLIES) }
+{ YDVAR(1, VAR_LOG_IDENTITY) }
YY_BREAK
case 220:
YY_RULE_SETUP
#line 435 "util/configlexer.lex"
-{ YDVAR(1, VAR_LOG_TAG_QUERYREPLY) }
+{ YDVAR(1, VAR_LOG_TIME_ASCII) }
YY_BREAK
case 221:
YY_RULE_SETUP
#line 436 "util/configlexer.lex"
-{ YDVAR(1, VAR_LOG_LOCAL_ACTIONS) }
+{ YDVAR(1, VAR_LOG_TIME_ISO) }
YY_BREAK
case 222:
YY_RULE_SETUP
#line 437 "util/configlexer.lex"
-{ YDVAR(1, VAR_LOG_SERVFAIL) }
+{ YDVAR(1, VAR_LOG_QUERIES) }
YY_BREAK
case 223:
YY_RULE_SETUP
#line 438 "util/configlexer.lex"
-{ YDVAR(1, VAR_LOG_DESTADDR) }
+{ YDVAR(1, VAR_LOG_REPLIES) }
YY_BREAK
case 224:
YY_RULE_SETUP
#line 439 "util/configlexer.lex"
-{ YDVAR(2, VAR_LOCAL_ZONE) }
+{ YDVAR(1, VAR_LOG_TAG_QUERYREPLY) }
YY_BREAK
case 225:
YY_RULE_SETUP
#line 440 "util/configlexer.lex"
-{ YDVAR(1, VAR_LOCAL_DATA) }
+{ YDVAR(1, VAR_LOG_LOCAL_ACTIONS) }
YY_BREAK
case 226:
YY_RULE_SETUP
#line 441 "util/configlexer.lex"
-{ YDVAR(1, VAR_LOCAL_DATA_PTR) }
+{ YDVAR(1, VAR_LOG_SERVFAIL) }
YY_BREAK
case 227:
YY_RULE_SETUP
#line 442 "util/configlexer.lex"
-{ YDVAR(1, VAR_UNBLOCK_LAN_ZONES) }
+{ YDVAR(1, VAR_LOG_DESTADDR) }
YY_BREAK
case 228:
YY_RULE_SETUP
#line 443 "util/configlexer.lex"
-{ YDVAR(1, VAR_INSECURE_LAN_ZONES) }
+{ YDVAR(2, VAR_LOCAL_ZONE) }
YY_BREAK
case 229:
YY_RULE_SETUP
#line 444 "util/configlexer.lex"
-{ YDVAR(1, VAR_STATISTICS_INTERVAL) }
+{ YDVAR(1, VAR_LOCAL_DATA) }
YY_BREAK
case 230:
YY_RULE_SETUP
#line 445 "util/configlexer.lex"
-{ YDVAR(1, VAR_STATISTICS_CUMULATIVE) }
+{ YDVAR(1, VAR_LOCAL_DATA_PTR) }
YY_BREAK
case 231:
YY_RULE_SETUP
#line 446 "util/configlexer.lex"
-{ YDVAR(1, VAR_EXTENDED_STATISTICS) }
+{ YDVAR(1, VAR_UNBLOCK_LAN_ZONES) }
YY_BREAK
case 232:
YY_RULE_SETUP
#line 447 "util/configlexer.lex"
-{ YDVAR(1, VAR_STATISTICS_INHIBIT_ZERO) }
+{ YDVAR(1, VAR_INSECURE_LAN_ZONES) }
YY_BREAK
case 233:
YY_RULE_SETUP
#line 448 "util/configlexer.lex"
-{ YDVAR(1, VAR_SHM_ENABLE) }
+{ YDVAR(1, VAR_STATISTICS_INTERVAL) }
YY_BREAK
case 234:
YY_RULE_SETUP
#line 449 "util/configlexer.lex"
-{ YDVAR(1, VAR_SHM_KEY) }
+{ YDVAR(1, VAR_STATISTICS_CUMULATIVE) }
YY_BREAK
case 235:
YY_RULE_SETUP
#line 450 "util/configlexer.lex"
-{ YDVAR(0, VAR_REMOTE_CONTROL) }
+{ YDVAR(1, VAR_EXTENDED_STATISTICS) }
YY_BREAK
case 236:
YY_RULE_SETUP
#line 451 "util/configlexer.lex"
-{ YDVAR(1, VAR_CONTROL_ENABLE) }
+{ YDVAR(1, VAR_STATISTICS_INHIBIT_ZERO) }
YY_BREAK
case 237:
YY_RULE_SETUP
#line 452 "util/configlexer.lex"
-{ YDVAR(1, VAR_CONTROL_INTERFACE) }
+{ YDVAR(1, VAR_SHM_ENABLE) }
YY_BREAK
case 238:
YY_RULE_SETUP
#line 453 "util/configlexer.lex"
-{ YDVAR(1, VAR_CONTROL_PORT) }
+{ YDVAR(1, VAR_SHM_KEY) }
YY_BREAK
case 239:
YY_RULE_SETUP
#line 454 "util/configlexer.lex"
-{ YDVAR(1, VAR_CONTROL_USE_CERT) }
+{ YDVAR(0, VAR_REMOTE_CONTROL) }
YY_BREAK
case 240:
YY_RULE_SETUP
#line 455 "util/configlexer.lex"
-{ YDVAR(1, VAR_SERVER_KEY_FILE) }
+{ YDVAR(1, VAR_CONTROL_ENABLE) }
YY_BREAK
case 241:
YY_RULE_SETUP
#line 456 "util/configlexer.lex"
-{ YDVAR(1, VAR_SERVER_CERT_FILE) }
+{ YDVAR(1, VAR_CONTROL_INTERFACE) }
YY_BREAK
case 242:
YY_RULE_SETUP
#line 457 "util/configlexer.lex"
-{ YDVAR(1, VAR_CONTROL_KEY_FILE) }
+{ YDVAR(1, VAR_CONTROL_PORT) }
YY_BREAK
case 243:
YY_RULE_SETUP
#line 458 "util/configlexer.lex"
-{ YDVAR(1, VAR_CONTROL_CERT_FILE) }
+{ YDVAR(1, VAR_CONTROL_USE_CERT) }
YY_BREAK
case 244:
YY_RULE_SETUP
#line 459 "util/configlexer.lex"
-{ YDVAR(1, VAR_PYTHON_SCRIPT) }
+{ YDVAR(1, VAR_SERVER_KEY_FILE) }
YY_BREAK
case 245:
YY_RULE_SETUP
#line 460 "util/configlexer.lex"
-{ YDVAR(0, VAR_PYTHON) }
+{ YDVAR(1, VAR_SERVER_CERT_FILE) }
YY_BREAK
case 246:
YY_RULE_SETUP
#line 461 "util/configlexer.lex"
-{ YDVAR(1, VAR_DYNLIB_FILE) }
+{ YDVAR(1, VAR_CONTROL_KEY_FILE) }
YY_BREAK
case 247:
YY_RULE_SETUP
#line 462 "util/configlexer.lex"
-{ YDVAR(0, VAR_DYNLIB) }
+{ YDVAR(1, VAR_CONTROL_CERT_FILE) }
YY_BREAK
case 248:
YY_RULE_SETUP
#line 463 "util/configlexer.lex"
-{ YDVAR(1, VAR_DOMAIN_INSECURE) }
+{ YDVAR(1, VAR_PYTHON_SCRIPT) }
YY_BREAK
case 249:
YY_RULE_SETUP
#line 464 "util/configlexer.lex"
-{ YDVAR(1, VAR_MINIMAL_RESPONSES) }
+{ YDVAR(0, VAR_PYTHON) }
YY_BREAK
case 250:
YY_RULE_SETUP
#line 465 "util/configlexer.lex"
-{ YDVAR(1, VAR_RRSET_ROUNDROBIN) }
+{ YDVAR(1, VAR_DYNLIB_FILE) }
YY_BREAK
case 251:
YY_RULE_SETUP
#line 466 "util/configlexer.lex"
-{ YDVAR(1, VAR_UNKNOWN_SERVER_TIME_LIMIT) }
+{ YDVAR(0, VAR_DYNLIB) }
YY_BREAK
case 252:
YY_RULE_SETUP
#line 467 "util/configlexer.lex"
-{ YDVAR(1, VAR_DISCARD_TIMEOUT) }
+{ YDVAR(1, VAR_DOMAIN_INSECURE) }
YY_BREAK
case 253:
YY_RULE_SETUP
#line 468 "util/configlexer.lex"
-{ YDVAR(1, VAR_WAIT_LIMIT) }
+{ YDVAR(1, VAR_MINIMAL_RESPONSES) }
YY_BREAK
case 254:
YY_RULE_SETUP
#line 469 "util/configlexer.lex"
-{ YDVAR(1, VAR_WAIT_LIMIT_COOKIE) }
+{ YDVAR(1, VAR_RRSET_ROUNDROBIN) }
YY_BREAK
case 255:
YY_RULE_SETUP
#line 470 "util/configlexer.lex"
-{ YDVAR(1, VAR_WAIT_LIMIT_NETBLOCK) }
+{ YDVAR(1, VAR_UNKNOWN_SERVER_TIME_LIMIT) }
YY_BREAK
case 256:
YY_RULE_SETUP
#line 471 "util/configlexer.lex"
-{ YDVAR(1, VAR_WAIT_LIMIT_COOKIE_NETBLOCK) }
+{ YDVAR(1, VAR_DISCARD_TIMEOUT) }
YY_BREAK
case 257:
YY_RULE_SETUP
#line 472 "util/configlexer.lex"
-{ YDVAR(1, VAR_MAX_UDP_SIZE) }
+{ YDVAR(1, VAR_WAIT_LIMIT) }
YY_BREAK
case 258:
YY_RULE_SETUP
#line 473 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNS64_PREFIX) }
+{ YDVAR(1, VAR_WAIT_LIMIT_COOKIE) }
YY_BREAK
case 259:
YY_RULE_SETUP
#line 474 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNS64_SYNTHALL) }
+{ YDVAR(1, VAR_WAIT_LIMIT_NETBLOCK) }
YY_BREAK
case 260:
YY_RULE_SETUP
#line 475 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNS64_IGNORE_AAAA) }
+{ YDVAR(1, VAR_WAIT_LIMIT_COOKIE_NETBLOCK) }
YY_BREAK
case 261:
YY_RULE_SETUP
#line 476 "util/configlexer.lex"
-{ YDVAR(1, VAR_NAT64_PREFIX) }
+{ YDVAR(1, VAR_MAX_UDP_SIZE) }
YY_BREAK
case 262:
YY_RULE_SETUP
#line 477 "util/configlexer.lex"
-{ YDVAR(1, VAR_DEFINE_TAG) }
+{ YDVAR(1, VAR_DNS64_PREFIX) }
YY_BREAK
case 263:
YY_RULE_SETUP
#line 478 "util/configlexer.lex"
-{ YDVAR(2, VAR_LOCAL_ZONE_TAG) }
+{ YDVAR(1, VAR_DNS64_SYNTHALL) }
YY_BREAK
case 264:
YY_RULE_SETUP
#line 479 "util/configlexer.lex"
-{ YDVAR(2, VAR_ACCESS_CONTROL_TAG) }
+{ YDVAR(1, VAR_DNS64_IGNORE_AAAA) }
YY_BREAK
case 265:
YY_RULE_SETUP
#line 480 "util/configlexer.lex"
-{ YDVAR(3, VAR_ACCESS_CONTROL_TAG_ACTION) }
+{ YDVAR(1, VAR_NAT64_PREFIX) }
YY_BREAK
case 266:
YY_RULE_SETUP
#line 481 "util/configlexer.lex"
-{ YDVAR(3, VAR_ACCESS_CONTROL_TAG_DATA) }
+{ YDVAR(1, VAR_DEFINE_TAG) }
YY_BREAK
case 267:
YY_RULE_SETUP
#line 482 "util/configlexer.lex"
-{ YDVAR(2, VAR_ACCESS_CONTROL_VIEW) }
+{ YDVAR(2, VAR_LOCAL_ZONE_TAG) }
YY_BREAK
case 268:
YY_RULE_SETUP
#line 483 "util/configlexer.lex"
-{ YDVAR(2, VAR_INTERFACE_TAG) }
+{ YDVAR(2, VAR_ACCESS_CONTROL_TAG) }
YY_BREAK
case 269:
YY_RULE_SETUP
#line 484 "util/configlexer.lex"
-{ YDVAR(3, VAR_INTERFACE_TAG_ACTION) }
+{ YDVAR(3, VAR_ACCESS_CONTROL_TAG_ACTION) }
YY_BREAK
case 270:
YY_RULE_SETUP
#line 485 "util/configlexer.lex"
-{ YDVAR(3, VAR_INTERFACE_TAG_DATA) }
+{ YDVAR(3, VAR_ACCESS_CONTROL_TAG_DATA) }
YY_BREAK
case 271:
YY_RULE_SETUP
#line 486 "util/configlexer.lex"
-{ YDVAR(2, VAR_INTERFACE_VIEW) }
+{ YDVAR(2, VAR_ACCESS_CONTROL_VIEW) }
YY_BREAK
case 272:
YY_RULE_SETUP
#line 487 "util/configlexer.lex"
-{ YDVAR(3, VAR_LOCAL_ZONE_OVERRIDE) }
+{ YDVAR(2, VAR_INTERFACE_TAG) }
YY_BREAK
case 273:
YY_RULE_SETUP
#line 488 "util/configlexer.lex"
-{ YDVAR(0, VAR_DNSTAP) }
+{ YDVAR(3, VAR_INTERFACE_TAG_ACTION) }
YY_BREAK
case 274:
YY_RULE_SETUP
#line 489 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSTAP_ENABLE) }
+{ YDVAR(3, VAR_INTERFACE_TAG_DATA) }
YY_BREAK
case 275:
YY_RULE_SETUP
#line 490 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSTAP_BIDIRECTIONAL) }
+{ YDVAR(2, VAR_INTERFACE_VIEW) }
YY_BREAK
case 276:
YY_RULE_SETUP
#line 491 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSTAP_SOCKET_PATH) }
+{ YDVAR(3, VAR_LOCAL_ZONE_OVERRIDE) }
YY_BREAK
case 277:
YY_RULE_SETUP
#line 492 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSTAP_IP) }
+{ YDVAR(0, VAR_DNSTAP) }
YY_BREAK
case 278:
YY_RULE_SETUP
#line 493 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSTAP_TLS) }
+{ YDVAR(1, VAR_DNSTAP_ENABLE) }
YY_BREAK
case 279:
YY_RULE_SETUP
#line 494 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSTAP_TLS_SERVER_NAME) }
+{ YDVAR(1, VAR_DNSTAP_BIDIRECTIONAL) }
YY_BREAK
case 280:
YY_RULE_SETUP
#line 495 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSTAP_TLS_CERT_BUNDLE) }
+{ YDVAR(1, VAR_DNSTAP_SOCKET_PATH) }
YY_BREAK
case 281:
YY_RULE_SETUP
#line 496 "util/configlexer.lex"
-{
- YDVAR(1, VAR_DNSTAP_TLS_CLIENT_KEY_FILE) }
+{ YDVAR(1, VAR_DNSTAP_IP) }
YY_BREAK
case 282:
YY_RULE_SETUP
-#line 498 "util/configlexer.lex"
-{
- YDVAR(1, VAR_DNSTAP_TLS_CLIENT_CERT_FILE) }
+#line 497 "util/configlexer.lex"
+{ YDVAR(1, VAR_DNSTAP_TLS) }
YY_BREAK
case 283:
YY_RULE_SETUP
-#line 500 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSTAP_SEND_IDENTITY) }
+#line 498 "util/configlexer.lex"
+{ YDVAR(1, VAR_DNSTAP_TLS_SERVER_NAME) }
YY_BREAK
case 284:
YY_RULE_SETUP
-#line 501 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSTAP_SEND_VERSION) }
+#line 499 "util/configlexer.lex"
+{ YDVAR(1, VAR_DNSTAP_TLS_CERT_BUNDLE) }
YY_BREAK
case 285:
YY_RULE_SETUP
-#line 502 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSTAP_IDENTITY) }
+#line 500 "util/configlexer.lex"
+{
+ YDVAR(1, VAR_DNSTAP_TLS_CLIENT_KEY_FILE) }
YY_BREAK
case 286:
YY_RULE_SETUP
-#line 503 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSTAP_VERSION) }
+#line 502 "util/configlexer.lex"
+{
+ YDVAR(1, VAR_DNSTAP_TLS_CLIENT_CERT_FILE) }
YY_BREAK
case 287:
YY_RULE_SETUP
#line 504 "util/configlexer.lex"
-{
- YDVAR(1, VAR_DNSTAP_LOG_RESOLVER_QUERY_MESSAGES) }
+{ YDVAR(1, VAR_DNSTAP_SEND_IDENTITY) }
YY_BREAK
case 288:
YY_RULE_SETUP
-#line 506 "util/configlexer.lex"
-{
- YDVAR(1, VAR_DNSTAP_LOG_RESOLVER_RESPONSE_MESSAGES) }
+#line 505 "util/configlexer.lex"
+{ YDVAR(1, VAR_DNSTAP_SEND_VERSION) }
YY_BREAK
case 289:
YY_RULE_SETUP
-#line 508 "util/configlexer.lex"
-{
- YDVAR(1, VAR_DNSTAP_LOG_CLIENT_QUERY_MESSAGES) }
+#line 506 "util/configlexer.lex"
+{ YDVAR(1, VAR_DNSTAP_IDENTITY) }
YY_BREAK
case 290:
YY_RULE_SETUP
-#line 510 "util/configlexer.lex"
-{
- YDVAR(1, VAR_DNSTAP_LOG_CLIENT_RESPONSE_MESSAGES) }
+#line 507 "util/configlexer.lex"
+{ YDVAR(1, VAR_DNSTAP_VERSION) }
YY_BREAK
case 291:
YY_RULE_SETUP
-#line 512 "util/configlexer.lex"
+#line 508 "util/configlexer.lex"
{
- YDVAR(1, VAR_DNSTAP_LOG_FORWARDER_QUERY_MESSAGES) }
+ YDVAR(1, VAR_DNSTAP_LOG_RESOLVER_QUERY_MESSAGES) }
YY_BREAK
case 292:
YY_RULE_SETUP
-#line 514 "util/configlexer.lex"
+#line 510 "util/configlexer.lex"
{
- YDVAR(1, VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES) }
+ YDVAR(1, VAR_DNSTAP_LOG_RESOLVER_RESPONSE_MESSAGES) }
YY_BREAK
case 293:
YY_RULE_SETUP
-#line 516 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSTAP_SAMPLE_RATE) }
+#line 512 "util/configlexer.lex"
+{
+ YDVAR(1, VAR_DNSTAP_LOG_CLIENT_QUERY_MESSAGES) }
YY_BREAK
case 294:
YY_RULE_SETUP
-#line 517 "util/configlexer.lex"
-{ YDVAR(1, VAR_DISABLE_DNSSEC_LAME_CHECK) }
+#line 514 "util/configlexer.lex"
+{
+ YDVAR(1, VAR_DNSTAP_LOG_CLIENT_RESPONSE_MESSAGES) }
YY_BREAK
case 295:
YY_RULE_SETUP
-#line 518 "util/configlexer.lex"
-{ YDVAR(1, VAR_IP_RATELIMIT) }
+#line 516 "util/configlexer.lex"
+{
+ YDVAR(1, VAR_DNSTAP_LOG_FORWARDER_QUERY_MESSAGES) }
YY_BREAK
case 296:
YY_RULE_SETUP
-#line 519 "util/configlexer.lex"
-{ YDVAR(1, VAR_IP_RATELIMIT_COOKIE) }
+#line 518 "util/configlexer.lex"
+{
+ YDVAR(1, VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES) }
YY_BREAK
case 297:
YY_RULE_SETUP
#line 520 "util/configlexer.lex"
-{ YDVAR(1, VAR_RATELIMIT) }
+{ YDVAR(1, VAR_DNSTAP_SAMPLE_RATE) }
YY_BREAK
case 298:
YY_RULE_SETUP
#line 521 "util/configlexer.lex"
-{ YDVAR(1, VAR_IP_RATELIMIT_SLABS) }
+{ YDVAR(1, VAR_DISABLE_DNSSEC_LAME_CHECK) }
YY_BREAK
case 299:
YY_RULE_SETUP
#line 522 "util/configlexer.lex"
-{ YDVAR(1, VAR_RATELIMIT_SLABS) }
+{ YDVAR(1, VAR_IP_RATELIMIT) }
YY_BREAK
case 300:
YY_RULE_SETUP
#line 523 "util/configlexer.lex"
-{ YDVAR(1, VAR_IP_RATELIMIT_SIZE) }
+{ YDVAR(1, VAR_IP_RATELIMIT_COOKIE) }
YY_BREAK
case 301:
YY_RULE_SETUP
#line 524 "util/configlexer.lex"
-{ YDVAR(1, VAR_RATELIMIT_SIZE) }
+{ YDVAR(1, VAR_RATELIMIT) }
YY_BREAK
case 302:
YY_RULE_SETUP
#line 525 "util/configlexer.lex"
-{ YDVAR(2, VAR_RATELIMIT_FOR_DOMAIN) }
+{ YDVAR(1, VAR_IP_RATELIMIT_SLABS) }
YY_BREAK
case 303:
YY_RULE_SETUP
#line 526 "util/configlexer.lex"
-{ YDVAR(2, VAR_RATELIMIT_BELOW_DOMAIN) }
+{ YDVAR(1, VAR_RATELIMIT_SLABS) }
YY_BREAK
case 304:
YY_RULE_SETUP
#line 527 "util/configlexer.lex"
-{ YDVAR(1, VAR_IP_RATELIMIT_FACTOR) }
+{ YDVAR(1, VAR_IP_RATELIMIT_SIZE) }
YY_BREAK
case 305:
YY_RULE_SETUP
#line 528 "util/configlexer.lex"
-{ YDVAR(1, VAR_RATELIMIT_FACTOR) }
+{ YDVAR(1, VAR_RATELIMIT_SIZE) }
YY_BREAK
case 306:
YY_RULE_SETUP
#line 529 "util/configlexer.lex"
-{ YDVAR(1, VAR_IP_RATELIMIT_BACKOFF) }
+{ YDVAR(2, VAR_RATELIMIT_FOR_DOMAIN) }
YY_BREAK
case 307:
YY_RULE_SETUP
#line 530 "util/configlexer.lex"
-{ YDVAR(1, VAR_RATELIMIT_BACKOFF) }
+{ YDVAR(2, VAR_RATELIMIT_BELOW_DOMAIN) }
YY_BREAK
case 308:
YY_RULE_SETUP
#line 531 "util/configlexer.lex"
-{ YDVAR(1, VAR_OUTBOUND_MSG_RETRY) }
+{ YDVAR(1, VAR_IP_RATELIMIT_FACTOR) }
YY_BREAK
case 309:
YY_RULE_SETUP
#line 532 "util/configlexer.lex"
-{ YDVAR(1, VAR_MAX_SENT_COUNT) }
+{ YDVAR(1, VAR_RATELIMIT_FACTOR) }
YY_BREAK
case 310:
YY_RULE_SETUP
#line 533 "util/configlexer.lex"
-{ YDVAR(1, VAR_MAX_QUERY_RESTARTS) }
+{ YDVAR(1, VAR_IP_RATELIMIT_BACKOFF) }
YY_BREAK
case 311:
YY_RULE_SETUP
#line 534 "util/configlexer.lex"
-{ YDVAR(1, VAR_LOW_RTT) }
+{ YDVAR(1, VAR_RATELIMIT_BACKOFF) }
YY_BREAK
case 312:
YY_RULE_SETUP
#line 535 "util/configlexer.lex"
-{ YDVAR(1, VAR_FAST_SERVER_NUM) }
+{ YDVAR(1, VAR_OUTBOUND_MSG_RETRY) }
YY_BREAK
case 313:
YY_RULE_SETUP
#line 536 "util/configlexer.lex"
-{ YDVAR(1, VAR_FAST_SERVER_PERMIL) }
+{ YDVAR(1, VAR_MAX_SENT_COUNT) }
YY_BREAK
case 314:
YY_RULE_SETUP
#line 537 "util/configlexer.lex"
-{ YDVAR(1, VAR_FAST_SERVER_PERMIL) }
+{ YDVAR(1, VAR_MAX_QUERY_RESTARTS) }
YY_BREAK
case 315:
YY_RULE_SETUP
#line 538 "util/configlexer.lex"
-{ YDVAR(1, VAR_FAST_SERVER_PERMIL) }
+{ YDVAR(1, VAR_LOW_RTT) }
YY_BREAK
case 316:
YY_RULE_SETUP
#line 539 "util/configlexer.lex"
-{ YDVAR(2, VAR_RESPONSE_IP_TAG) }
+{ YDVAR(1, VAR_FAST_SERVER_NUM) }
YY_BREAK
case 317:
YY_RULE_SETUP
#line 540 "util/configlexer.lex"
-{ YDVAR(2, VAR_RESPONSE_IP) }
+{ YDVAR(1, VAR_FAST_SERVER_PERMIL) }
YY_BREAK
case 318:
YY_RULE_SETUP
#line 541 "util/configlexer.lex"
-{ YDVAR(2, VAR_RESPONSE_IP_DATA) }
+{ YDVAR(1, VAR_FAST_SERVER_PERMIL) }
YY_BREAK
case 319:
YY_RULE_SETUP
#line 542 "util/configlexer.lex"
-{ YDVAR(0, VAR_DNSCRYPT) }
+{ YDVAR(1, VAR_FAST_SERVER_PERMIL) }
YY_BREAK
case 320:
YY_RULE_SETUP
#line 543 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSCRYPT_ENABLE) }
+{ YDVAR(2, VAR_RESPONSE_IP_TAG) }
YY_BREAK
case 321:
YY_RULE_SETUP
#line 544 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSCRYPT_PORT) }
+{ YDVAR(2, VAR_RESPONSE_IP) }
YY_BREAK
case 322:
YY_RULE_SETUP
#line 545 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSCRYPT_PROVIDER) }
+{ YDVAR(2, VAR_RESPONSE_IP_DATA) }
YY_BREAK
case 323:
YY_RULE_SETUP
#line 546 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSCRYPT_SECRET_KEY) }
+{ YDVAR(0, VAR_DNSCRYPT) }
YY_BREAK
case 324:
YY_RULE_SETUP
#line 547 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSCRYPT_PROVIDER_CERT) }
+{ YDVAR(1, VAR_DNSCRYPT_ENABLE) }
YY_BREAK
case 325:
YY_RULE_SETUP
#line 548 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSCRYPT_PROVIDER_CERT_ROTATED) }
+{ YDVAR(1, VAR_DNSCRYPT_PORT) }
YY_BREAK
case 326:
YY_RULE_SETUP
#line 549 "util/configlexer.lex"
-{
- YDVAR(1, VAR_DNSCRYPT_SHARED_SECRET_CACHE_SIZE) }
+{ YDVAR(1, VAR_DNSCRYPT_PROVIDER) }
YY_BREAK
case 327:
YY_RULE_SETUP
-#line 551 "util/configlexer.lex"
-{
- YDVAR(1, VAR_DNSCRYPT_SHARED_SECRET_CACHE_SLABS) }
+#line 550 "util/configlexer.lex"
+{ YDVAR(1, VAR_DNSCRYPT_SECRET_KEY) }
YY_BREAK
case 328:
YY_RULE_SETUP
-#line 553 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSCRYPT_NONCE_CACHE_SIZE) }
+#line 551 "util/configlexer.lex"
+{ YDVAR(1, VAR_DNSCRYPT_PROVIDER_CERT) }
YY_BREAK
case 329:
YY_RULE_SETUP
-#line 554 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSCRYPT_NONCE_CACHE_SLABS) }
+#line 552 "util/configlexer.lex"
+{ YDVAR(1, VAR_DNSCRYPT_PROVIDER_CERT_ROTATED) }
YY_BREAK
case 330:
YY_RULE_SETUP
-#line 555 "util/configlexer.lex"
-{ YDVAR(1, VAR_PAD_RESPONSES) }
+#line 553 "util/configlexer.lex"
+{
+ YDVAR(1, VAR_DNSCRYPT_SHARED_SECRET_CACHE_SIZE) }
YY_BREAK
case 331:
YY_RULE_SETUP
-#line 556 "util/configlexer.lex"
-{ YDVAR(1, VAR_PAD_RESPONSES_BLOCK_SIZE) }
+#line 555 "util/configlexer.lex"
+{
+ YDVAR(1, VAR_DNSCRYPT_SHARED_SECRET_CACHE_SLABS) }
YY_BREAK
case 332:
YY_RULE_SETUP
#line 557 "util/configlexer.lex"
-{ YDVAR(1, VAR_PAD_QUERIES) }
+{ YDVAR(1, VAR_DNSCRYPT_NONCE_CACHE_SIZE) }
YY_BREAK
case 333:
YY_RULE_SETUP
#line 558 "util/configlexer.lex"
-{ YDVAR(1, VAR_PAD_QUERIES_BLOCK_SIZE) }
+{ YDVAR(1, VAR_DNSCRYPT_NONCE_CACHE_SLABS) }
YY_BREAK
case 334:
YY_RULE_SETUP
#line 559 "util/configlexer.lex"
-{ YDVAR(1, VAR_IPSECMOD_ENABLED) }
+{ YDVAR(1, VAR_PAD_RESPONSES) }
YY_BREAK
case 335:
YY_RULE_SETUP
#line 560 "util/configlexer.lex"
-{ YDVAR(1, VAR_IPSECMOD_IGNORE_BOGUS) }
+{ YDVAR(1, VAR_PAD_RESPONSES_BLOCK_SIZE) }
YY_BREAK
case 336:
YY_RULE_SETUP
#line 561 "util/configlexer.lex"
-{ YDVAR(1, VAR_IPSECMOD_HOOK) }
+{ YDVAR(1, VAR_PAD_QUERIES) }
YY_BREAK
case 337:
YY_RULE_SETUP
#line 562 "util/configlexer.lex"
-{ YDVAR(1, VAR_IPSECMOD_MAX_TTL) }
+{ YDVAR(1, VAR_PAD_QUERIES_BLOCK_SIZE) }
YY_BREAK
case 338:
YY_RULE_SETUP
#line 563 "util/configlexer.lex"
-{ YDVAR(1, VAR_IPSECMOD_WHITELIST) }
+{ YDVAR(1, VAR_IPSECMOD_ENABLED) }
YY_BREAK
case 339:
YY_RULE_SETUP
#line 564 "util/configlexer.lex"
-{ YDVAR(1, VAR_IPSECMOD_WHITELIST) }
+{ YDVAR(1, VAR_IPSECMOD_IGNORE_BOGUS) }
YY_BREAK
case 340:
YY_RULE_SETUP
#line 565 "util/configlexer.lex"
-{ YDVAR(1, VAR_IPSECMOD_STRICT) }
+{ YDVAR(1, VAR_IPSECMOD_HOOK) }
YY_BREAK
case 341:
YY_RULE_SETUP
#line 566 "util/configlexer.lex"
-{ YDVAR(0, VAR_CACHEDB) }
+{ YDVAR(1, VAR_IPSECMOD_MAX_TTL) }
YY_BREAK
case 342:
YY_RULE_SETUP
#line 567 "util/configlexer.lex"
-{ YDVAR(1, VAR_CACHEDB_BACKEND) }
+{ YDVAR(1, VAR_IPSECMOD_WHITELIST) }
YY_BREAK
case 343:
YY_RULE_SETUP
#line 568 "util/configlexer.lex"
-{ YDVAR(1, VAR_CACHEDB_SECRETSEED) }
+{ YDVAR(1, VAR_IPSECMOD_WHITELIST) }
YY_BREAK
case 344:
YY_RULE_SETUP
#line 569 "util/configlexer.lex"
-{ YDVAR(1, VAR_CACHEDB_NO_STORE) }
+{ YDVAR(1, VAR_IPSECMOD_STRICT) }
YY_BREAK
case 345:
YY_RULE_SETUP
#line 570 "util/configlexer.lex"
-{ YDVAR(1, VAR_CACHEDB_CHECK_WHEN_SERVE_EXPIRED) }
+{ YDVAR(0, VAR_CACHEDB) }
YY_BREAK
case 346:
YY_RULE_SETUP
#line 571 "util/configlexer.lex"
-{ YDVAR(1, VAR_CACHEDB_REDISHOST) }
+{ YDVAR(1, VAR_CACHEDB_BACKEND) }
YY_BREAK
case 347:
YY_RULE_SETUP
#line 572 "util/configlexer.lex"
-{ YDVAR(1, VAR_CACHEDB_REDISPORT) }
+{ YDVAR(1, VAR_CACHEDB_SECRETSEED) }
YY_BREAK
case 348:
YY_RULE_SETUP
#line 573 "util/configlexer.lex"
-{ YDVAR(1, VAR_CACHEDB_REDISPATH) }
+{ YDVAR(1, VAR_CACHEDB_NO_STORE) }
YY_BREAK
case 349:
YY_RULE_SETUP
#line 574 "util/configlexer.lex"
-{ YDVAR(1, VAR_CACHEDB_REDISPASSWORD) }
+{ YDVAR(1, VAR_CACHEDB_CHECK_WHEN_SERVE_EXPIRED) }
YY_BREAK
case 350:
YY_RULE_SETUP
#line 575 "util/configlexer.lex"
-{ YDVAR(1, VAR_CACHEDB_REDISTIMEOUT) }
+{ YDVAR(1, VAR_CACHEDB_REDISHOST) }
YY_BREAK
case 351:
YY_RULE_SETUP
#line 576 "util/configlexer.lex"
-{ YDVAR(1, VAR_CACHEDB_REDISEXPIRERECORDS) }
+{ YDVAR(1, VAR_CACHEDB_REDISPORT) }
YY_BREAK
case 352:
YY_RULE_SETUP
#line 577 "util/configlexer.lex"
-{ YDVAR(1, VAR_CACHEDB_REDISLOGICALDB) }
+{ YDVAR(1, VAR_CACHEDB_REDISPATH) }
YY_BREAK
case 353:
YY_RULE_SETUP
#line 578 "util/configlexer.lex"
-{ YDVAR(0, VAR_IPSET) }
+{ YDVAR(1, VAR_CACHEDB_REDISPASSWORD) }
YY_BREAK
case 354:
YY_RULE_SETUP
#line 579 "util/configlexer.lex"
-{ YDVAR(1, VAR_IPSET_NAME_V4) }
+{ YDVAR(1, VAR_CACHEDB_REDISTIMEOUT) }
YY_BREAK
case 355:
YY_RULE_SETUP
#line 580 "util/configlexer.lex"
-{ YDVAR(1, VAR_IPSET_NAME_V6) }
+{ YDVAR(1, VAR_CACHEDB_REDISCOMMANDTIMEOUT) }
YY_BREAK
case 356:
YY_RULE_SETUP
#line 581 "util/configlexer.lex"
-{ YDVAR(1, VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM) }
+{ YDVAR(1, VAR_CACHEDB_REDISCONNECTTIMEOUT) }
YY_BREAK
case 357:
YY_RULE_SETUP
#line 582 "util/configlexer.lex"
-{ YDVAR(2, VAR_TCP_CONNECTION_LIMIT) }
+{ YDVAR(1, VAR_CACHEDB_REDISEXPIRERECORDS) }
YY_BREAK
case 358:
YY_RULE_SETUP
#line 583 "util/configlexer.lex"
-{ YDVAR(1, VAR_ANSWER_COOKIE ) }
+{ YDVAR(1, VAR_CACHEDB_REDISLOGICALDB) }
YY_BREAK
case 359:
YY_RULE_SETUP
#line 584 "util/configlexer.lex"
-{ YDVAR(1, VAR_COOKIE_SECRET) }
+{ YDVAR(0, VAR_IPSET) }
YY_BREAK
case 360:
YY_RULE_SETUP
#line 585 "util/configlexer.lex"
-{ YDVAR(1, VAR_COOKIE_SECRET_FILE) }
+{ YDVAR(1, VAR_IPSET_NAME_V4) }
YY_BREAK
case 361:
YY_RULE_SETUP
#line 586 "util/configlexer.lex"
-{ YDVAR(2, VAR_EDNS_CLIENT_STRING) }
+{ YDVAR(1, VAR_IPSET_NAME_V6) }
YY_BREAK
case 362:
YY_RULE_SETUP
#line 587 "util/configlexer.lex"
-{ YDVAR(1, VAR_EDNS_CLIENT_STRING_OPCODE) }
+{ YDVAR(1, VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM) }
YY_BREAK
case 363:
YY_RULE_SETUP
#line 588 "util/configlexer.lex"
-{ YDVAR(1, VAR_NSID ) }
+{ YDVAR(2, VAR_TCP_CONNECTION_LIMIT) }
YY_BREAK
case 364:
YY_RULE_SETUP
#line 589 "util/configlexer.lex"
-{ YDVAR(1, VAR_EDE ) }
+{ YDVAR(1, VAR_ANSWER_COOKIE ) }
YY_BREAK
case 365:
YY_RULE_SETUP
#line 590 "util/configlexer.lex"
-{ YDVAR(1, VAR_PROXY_PROTOCOL_PORT) }
+{ YDVAR(1, VAR_COOKIE_SECRET) }
YY_BREAK
case 366:
-/* rule 366 can match eol */
YY_RULE_SETUP
#line 591 "util/configlexer.lex"
-{ LEXOUT(("NL\n")); cfg_parser->line++; }
+{ YDVAR(1, VAR_COOKIE_SECRET_FILE) }
YY_BREAK
-/* Quoted strings. Strip leading and ending quotes */
case 367:
YY_RULE_SETUP
+#line 592 "util/configlexer.lex"
+{ YDVAR(2, VAR_EDNS_CLIENT_STRING) }
+ YY_BREAK
+case 368:
+YY_RULE_SETUP
+#line 593 "util/configlexer.lex"
+{ YDVAR(1, VAR_EDNS_CLIENT_STRING_OPCODE) }
+ YY_BREAK
+case 369:
+YY_RULE_SETUP
#line 594 "util/configlexer.lex"
+{ YDVAR(1, VAR_NSID ) }
+ YY_BREAK
+case 370:
+YY_RULE_SETUP
+#line 595 "util/configlexer.lex"
+{ YDVAR(1, VAR_EDE ) }
+ YY_BREAK
+case 371:
+YY_RULE_SETUP
+#line 596 "util/configlexer.lex"
+{ YDVAR(1, VAR_PROXY_PROTOCOL_PORT) }
+ YY_BREAK
+case 372:
+YY_RULE_SETUP
+#line 597 "util/configlexer.lex"
+{ YDVAR(1, VAR_ITER_SCRUB_NS) }
+ YY_BREAK
+case 373:
+YY_RULE_SETUP
+#line 598 "util/configlexer.lex"
+{ YDVAR(1, VAR_ITER_SCRUB_CNAME) }
+ YY_BREAK
+case 374:
+YY_RULE_SETUP
+#line 599 "util/configlexer.lex"
+{ YDVAR(1, VAR_MAX_GLOBAL_QUOTA) }
+ YY_BREAK
+case 375:
+/* rule 375 can match eol */
+YY_RULE_SETUP
+#line 600 "util/configlexer.lex"
+{ LEXOUT(("NL\n")); cfg_parser->line++; }
+ YY_BREAK
+/* Quoted strings. Strip leading and ending quotes */
+case 376:
+YY_RULE_SETUP
+#line 603 "util/configlexer.lex"
{ BEGIN(quotedstring); LEXOUT(("QS ")); }
YY_BREAK
case YY_STATE_EOF(quotedstring):
-#line 595 "util/configlexer.lex"
+#line 604 "util/configlexer.lex"
{
yyerror("EOF inside quoted string");
if(--num_args == 0) { BEGIN(INITIAL); }
else { BEGIN(val); }
}
YY_BREAK
-case 368:
+case 377:
YY_RULE_SETUP
-#line 600 "util/configlexer.lex"
+#line 609 "util/configlexer.lex"
{ LEXOUT(("STR(%s) ", yytext)); yymore(); }
YY_BREAK
-case 369:
-/* rule 369 can match eol */
+case 378:
+/* rule 378 can match eol */
YY_RULE_SETUP
-#line 601 "util/configlexer.lex"
+#line 610 "util/configlexer.lex"
{ yyerror("newline inside quoted string, no end \"");
cfg_parser->line++; BEGIN(INITIAL); }
YY_BREAK
-case 370:
+case 379:
YY_RULE_SETUP
-#line 603 "util/configlexer.lex"
+#line 612 "util/configlexer.lex"
{
LEXOUT(("QE "));
if(--num_args == 0) { BEGIN(INITIAL); }
@@ -6584,34 +6724,34 @@ YY_RULE_SETUP
}
YY_BREAK
/* Single Quoted strings. Strip leading and ending quotes */
-case 371:
+case 380:
YY_RULE_SETUP
-#line 615 "util/configlexer.lex"
+#line 624 "util/configlexer.lex"
{ BEGIN(singlequotedstr); LEXOUT(("SQS ")); }
YY_BREAK
case YY_STATE_EOF(singlequotedstr):
-#line 616 "util/configlexer.lex"
+#line 625 "util/configlexer.lex"
{
yyerror("EOF inside quoted string");
if(--num_args == 0) { BEGIN(INITIAL); }
else { BEGIN(val); }
}
YY_BREAK
-case 372:
+case 381:
YY_RULE_SETUP
-#line 621 "util/configlexer.lex"
+#line 630 "util/configlexer.lex"
{ LEXOUT(("STR(%s) ", yytext)); yymore(); }
YY_BREAK
-case 373:
-/* rule 373 can match eol */
+case 382:
+/* rule 382 can match eol */
YY_RULE_SETUP
-#line 622 "util/configlexer.lex"
+#line 631 "util/configlexer.lex"
{ yyerror("newline inside quoted string, no end '");
cfg_parser->line++; BEGIN(INITIAL); }
YY_BREAK
-case 374:
+case 383:
YY_RULE_SETUP
-#line 624 "util/configlexer.lex"
+#line 633 "util/configlexer.lex"
{
LEXOUT(("SQE "));
if(--num_args == 0) { BEGIN(INITIAL); }
@@ -6624,38 +6764,38 @@ YY_RULE_SETUP
}
YY_BREAK
/* include: directive */
-case 375:
+case 384:
YY_RULE_SETUP
-#line 636 "util/configlexer.lex"
+#line 645 "util/configlexer.lex"
{
LEXOUT(("v(%s) ", yytext)); inc_prev = YYSTATE; BEGIN(include); }
YY_BREAK
case YY_STATE_EOF(include):
-#line 638 "util/configlexer.lex"
+#line 647 "util/configlexer.lex"
{
yyerror("EOF inside include directive");
BEGIN(inc_prev);
}
YY_BREAK
-case 376:
+case 385:
YY_RULE_SETUP
-#line 642 "util/configlexer.lex"
+#line 651 "util/configlexer.lex"
{ LEXOUT(("ISP ")); /* ignore */ }
YY_BREAK
-case 377:
-/* rule 377 can match eol */
+case 386:
+/* rule 386 can match eol */
YY_RULE_SETUP
-#line 643 "util/configlexer.lex"
+#line 652 "util/configlexer.lex"
{ LEXOUT(("NL\n")); cfg_parser->line++;}
YY_BREAK
-case 378:
+case 387:
YY_RULE_SETUP
-#line 644 "util/configlexer.lex"
+#line 653 "util/configlexer.lex"
{ LEXOUT(("IQS ")); BEGIN(include_quoted); }
YY_BREAK
-case 379:
+case 388:
YY_RULE_SETUP
-#line 645 "util/configlexer.lex"
+#line 654 "util/configlexer.lex"
{
LEXOUT(("Iunquotedstr(%s) ", yytext));
config_start_include_glob(yytext, 0);
@@ -6663,27 +6803,27 @@ YY_RULE_SETUP
}
YY_BREAK
case YY_STATE_EOF(include_quoted):
-#line 650 "util/configlexer.lex"
+#line 659 "util/configlexer.lex"
{
yyerror("EOF inside quoted string");
BEGIN(inc_prev);
}
YY_BREAK
-case 380:
+case 389:
YY_RULE_SETUP
-#line 654 "util/configlexer.lex"
+#line 663 "util/configlexer.lex"
{ LEXOUT(("ISTR(%s) ", yytext)); yymore(); }
YY_BREAK
-case 381:
-/* rule 381 can match eol */
+case 390:
+/* rule 390 can match eol */
YY_RULE_SETUP
-#line 655 "util/configlexer.lex"
+#line 664 "util/configlexer.lex"
{ yyerror("newline before \" in include name");
cfg_parser->line++; BEGIN(inc_prev); }
YY_BREAK
-case 382:
+case 391:
YY_RULE_SETUP
-#line 657 "util/configlexer.lex"
+#line 666 "util/configlexer.lex"
{
LEXOUT(("IQE "));
yytext[yyleng - 1] = '\0';
@@ -6693,7 +6833,7 @@ YY_RULE_SETUP
YY_BREAK
case YY_STATE_EOF(INITIAL):
case YY_STATE_EOF(val):
-#line 663 "util/configlexer.lex"
+#line 672 "util/configlexer.lex"
{
LEXOUT(("LEXEOF "));
yy_set_bol(1); /* Set beginning of line, so "^" rules match. */
@@ -6708,39 +6848,39 @@ case YY_STATE_EOF(val):
}
YY_BREAK
/* include-toplevel: directive */
-case 383:
+case 392:
YY_RULE_SETUP
-#line 677 "util/configlexer.lex"
+#line 686 "util/configlexer.lex"
{
LEXOUT(("v(%s) ", yytext)); inc_prev = YYSTATE; BEGIN(include_toplevel);
}
YY_BREAK
case YY_STATE_EOF(include_toplevel):
-#line 680 "util/configlexer.lex"
+#line 689 "util/configlexer.lex"
{
yyerror("EOF inside include_toplevel directive");
BEGIN(inc_prev);
}
YY_BREAK
-case 384:
+case 393:
YY_RULE_SETUP
-#line 684 "util/configlexer.lex"
+#line 693 "util/configlexer.lex"
{ LEXOUT(("ITSP ")); /* ignore */ }
YY_BREAK
-case 385:
-/* rule 385 can match eol */
+case 394:
+/* rule 394 can match eol */
YY_RULE_SETUP
-#line 685 "util/configlexer.lex"
+#line 694 "util/configlexer.lex"
{ LEXOUT(("NL\n")); cfg_parser->line++; }
YY_BREAK
-case 386:
+case 395:
YY_RULE_SETUP
-#line 686 "util/configlexer.lex"
+#line 695 "util/configlexer.lex"
{ LEXOUT(("ITQS ")); BEGIN(include_toplevel_quoted); }
YY_BREAK
-case 387:
+case 396:
YY_RULE_SETUP
-#line 687 "util/configlexer.lex"
+#line 696 "util/configlexer.lex"
{
LEXOUT(("ITunquotedstr(%s) ", yytext));
config_start_include_glob(yytext, 1);
@@ -6749,29 +6889,29 @@ YY_RULE_SETUP
}
YY_BREAK
case YY_STATE_EOF(include_toplevel_quoted):
-#line 693 "util/configlexer.lex"
+#line 702 "util/configlexer.lex"
{
yyerror("EOF inside quoted string");
BEGIN(inc_prev);
}
YY_BREAK
-case 388:
+case 397:
YY_RULE_SETUP
-#line 697 "util/configlexer.lex"
+#line 706 "util/configlexer.lex"
{ LEXOUT(("ITSTR(%s) ", yytext)); yymore(); }
YY_BREAK
-case 389:
-/* rule 389 can match eol */
+case 398:
+/* rule 398 can match eol */
YY_RULE_SETUP
-#line 698 "util/configlexer.lex"
+#line 707 "util/configlexer.lex"
{
yyerror("newline before \" in include name");
cfg_parser->line++; BEGIN(inc_prev);
}
YY_BREAK
-case 390:
+case 399:
YY_RULE_SETUP
-#line 702 "util/configlexer.lex"
+#line 711 "util/configlexer.lex"
{
LEXOUT(("ITQE "));
yytext[yyleng - 1] = '\0';
@@ -6780,33 +6920,33 @@ YY_RULE_SETUP
return (VAR_FORCE_TOPLEVEL);
}
YY_BREAK
-case 391:
+case 400:
YY_RULE_SETUP
-#line 710 "util/configlexer.lex"
+#line 719 "util/configlexer.lex"
{ LEXOUT(("unquotedstr(%s) ", yytext));
if(--num_args == 0) { BEGIN(INITIAL); }
yylval.str = strdup(yytext); return STRING_ARG; }
YY_BREAK
-case 392:
+case 401:
YY_RULE_SETUP
-#line 714 "util/configlexer.lex"
+#line 723 "util/configlexer.lex"
{
ub_c_error_msg("unknown keyword '%s'", yytext);
}
YY_BREAK
-case 393:
+case 402:
YY_RULE_SETUP
-#line 718 "util/configlexer.lex"
+#line 727 "util/configlexer.lex"
{
ub_c_error_msg("stray '%s'", yytext);
}
YY_BREAK
-case 394:
+case 403:
YY_RULE_SETUP
-#line 722 "util/configlexer.lex"
+#line 731 "util/configlexer.lex"
ECHO;
YY_BREAK
-#line 6807 "<stdout>"
+#line 6947 "<stdout>"
case YY_END_OF_BUFFER:
{
@@ -7101,7 +7241,7 @@ static int yy_get_next_buffer (void)
while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
{
yy_current_state = (int) yy_def[yy_current_state];
- if ( yy_current_state >= 3921 )
+ if ( yy_current_state >= 4016 )
yy_c = yy_meta[yy_c];
}
yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
@@ -7129,11 +7269,11 @@ static int yy_get_next_buffer (void)
while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
{
yy_current_state = (int) yy_def[yy_current_state];
- if ( yy_current_state >= 3921 )
+ if ( yy_current_state >= 4016 )
yy_c = yy_meta[yy_c];
}
yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
- yy_is_jam = (yy_current_state == 3920);
+ yy_is_jam = (yy_current_state == 4015);
return yy_is_jam ? 0 : yy_current_state;
}
@@ -7772,6 +7912,6 @@ void yyfree (void * ptr )
#define YYTABLES_NAME "yytables"
-#line 722 "util/configlexer.lex"
+#line 731 "util/configlexer.lex"
diff --git a/util/configlexer.lex b/util/configlexer.lex
index cd506209229a..4c0416f734df 100644
--- a/util/configlexer.lex
+++ b/util/configlexer.lex
@@ -269,6 +269,8 @@ http-query-buffer-size{COLON} { YDVAR(1, VAR_HTTP_QUERY_BUFFER_SIZE) }
http-response-buffer-size{COLON} { YDVAR(1, VAR_HTTP_RESPONSE_BUFFER_SIZE) }
http-nodelay{COLON} { YDVAR(1, VAR_HTTP_NODELAY) }
http-notls-downstream{COLON} { YDVAR(1, VAR_HTTP_NOTLS_DOWNSTREAM) }
+quic-port{COLON} { YDVAR(1, VAR_QUIC_PORT) }
+quic-size{COLON} { YDVAR(1, VAR_QUIC_SIZE) }
use-systemd{COLON} { YDVAR(1, VAR_USE_SYSTEMD) }
do-daemonize{COLON} { YDVAR(1, VAR_DO_DAEMONIZE) }
interface{COLON} { YDVAR(1, VAR_INTERFACE) }
@@ -315,6 +317,7 @@ target-fetch-policy{COLON} { YDVAR(1, VAR_TARGET_FETCH_POLICY) }
harden-short-bufsize{COLON} { YDVAR(1, VAR_HARDEN_SHORT_BUFSIZE) }
harden-large-queries{COLON} { YDVAR(1, VAR_HARDEN_LARGE_QUERIES) }
harden-glue{COLON} { YDVAR(1, VAR_HARDEN_GLUE) }
+harden-unverified-glue{COLON} { YDVAR(1, VAR_HARDEN_UNVERIFIED_GLUE) }
harden-dnssec-stripped{COLON} { YDVAR(1, VAR_HARDEN_DNSSEC_STRIPPED) }
harden-below-nxdomain{COLON} { YDVAR(1, VAR_HARDEN_BELOW_NXDOMAIN) }
harden-referral-path{COLON} { YDVAR(1, VAR_HARDEN_REFERRAL_PATH) }
@@ -430,6 +433,7 @@ permit-small-holddown{COLON} { YDVAR(1, VAR_PERMIT_SMALL_HOLDDOWN) }
use-syslog{COLON} { YDVAR(1, VAR_USE_SYSLOG) }
log-identity{COLON} { YDVAR(1, VAR_LOG_IDENTITY) }
log-time-ascii{COLON} { YDVAR(1, VAR_LOG_TIME_ASCII) }
+log-time-iso{COLON} { YDVAR(1, VAR_LOG_TIME_ISO) }
log-queries{COLON} { YDVAR(1, VAR_LOG_QUERIES) }
log-replies{COLON} { YDVAR(1, VAR_LOG_REPLIES) }
log-tag-queryreply{COLON} { YDVAR(1, VAR_LOG_TAG_QUERYREPLY) }
@@ -513,7 +517,7 @@ dnstap-log-forwarder-query-messages{COLON} {
YDVAR(1, VAR_DNSTAP_LOG_FORWARDER_QUERY_MESSAGES) }
dnstap-log-forwarder-response-messages{COLON} {
YDVAR(1, VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES) }
-dnstap-sample-rate { YDVAR(1, VAR_DNSTAP_SAMPLE_RATE) }
+dnstap-sample-rate{COLON} { YDVAR(1, VAR_DNSTAP_SAMPLE_RATE) }
disable-dnssec-lame-check{COLON} { YDVAR(1, VAR_DISABLE_DNSSEC_LAME_CHECK) }
ip-ratelimit{COLON} { YDVAR(1, VAR_IP_RATELIMIT) }
ip-ratelimit-cookie{COLON} { YDVAR(1, VAR_IP_RATELIMIT_COOKIE) }
@@ -573,6 +577,8 @@ redis-server-port{COLON} { YDVAR(1, VAR_CACHEDB_REDISPORT) }
redis-server-path{COLON} { YDVAR(1, VAR_CACHEDB_REDISPATH) }
redis-server-password{COLON} { YDVAR(1, VAR_CACHEDB_REDISPASSWORD) }
redis-timeout{COLON} { YDVAR(1, VAR_CACHEDB_REDISTIMEOUT) }
+redis-command-timeout{COLON} { YDVAR(1, VAR_CACHEDB_REDISCOMMANDTIMEOUT) }
+redis-connect-timeout{COLON} { YDVAR(1, VAR_CACHEDB_REDISCONNECTTIMEOUT) }
redis-expire-records{COLON} { YDVAR(1, VAR_CACHEDB_REDISEXPIRERECORDS) }
redis-logical-db{COLON} { YDVAR(1, VAR_CACHEDB_REDISLOGICALDB) }
ipset{COLON} { YDVAR(0, VAR_IPSET) }
@@ -588,6 +594,9 @@ edns-client-string-opcode{COLON} { YDVAR(1, VAR_EDNS_CLIENT_STRING_OPCODE) }
nsid{COLON} { YDVAR(1, VAR_NSID ) }
ede{COLON} { YDVAR(1, VAR_EDE ) }
proxy-protocol-port{COLON} { YDVAR(1, VAR_PROXY_PROTOCOL_PORT) }
+iter-scrub-ns{COLON} { YDVAR(1, VAR_ITER_SCRUB_NS) }
+iter-scrub-cname{COLON} { YDVAR(1, VAR_ITER_SCRUB_CNAME) }
+max-global-quota{COLON} { YDVAR(1, VAR_MAX_GLOBAL_QUOTA) }
<INITIAL,val>{NEWLINE} { LEXOUT(("NL\n")); cfg_parser->line++; }
/* Quoted strings. Strip leading and ending quotes */
diff --git a/util/configparser.c b/util/configparser.c
index 0223902489cc..62a6775e55de 100644
--- a/util/configparser.c
+++ b/util/configparser.c
@@ -1,4 +1,4 @@
-/* A Bison parser, made by GNU Bison 3.8.2. */
+/* A Bison parser, made by GNU Bison 3.7.6. */
/* Bison implementation for Yacc-like parsers in C
@@ -46,10 +46,10 @@
USER NAME SPACE" below. */
/* Identify Bison output, and Bison version. */
-#define YYBISON 30802
+#define YYBISON 30706
/* Bison version string. */
-#define YYBISON_VERSION "3.8.2"
+#define YYBISON_VERSION "3.7.6"
/* Skeleton name. */
#define YYSKELETON_NAME "yacc.c"
@@ -417,458 +417,479 @@ enum yysymbol_kind_t
YYSYMBOL_VAR_CACHEDB_REDISPATH = 288, /* VAR_CACHEDB_REDISPATH */
YYSYMBOL_VAR_CACHEDB_REDISPASSWORD = 289, /* VAR_CACHEDB_REDISPASSWORD */
YYSYMBOL_VAR_CACHEDB_REDISLOGICALDB = 290, /* VAR_CACHEDB_REDISLOGICALDB */
- YYSYMBOL_VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM = 291, /* VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM */
- YYSYMBOL_VAR_FOR_UPSTREAM = 292, /* VAR_FOR_UPSTREAM */
- YYSYMBOL_VAR_AUTH_ZONE = 293, /* VAR_AUTH_ZONE */
- YYSYMBOL_VAR_ZONEFILE = 294, /* VAR_ZONEFILE */
- YYSYMBOL_VAR_MASTER = 295, /* VAR_MASTER */
- YYSYMBOL_VAR_URL = 296, /* VAR_URL */
- YYSYMBOL_VAR_FOR_DOWNSTREAM = 297, /* VAR_FOR_DOWNSTREAM */
- YYSYMBOL_VAR_FALLBACK_ENABLED = 298, /* VAR_FALLBACK_ENABLED */
- YYSYMBOL_VAR_TLS_ADDITIONAL_PORT = 299, /* VAR_TLS_ADDITIONAL_PORT */
- YYSYMBOL_VAR_LOW_RTT = 300, /* VAR_LOW_RTT */
- YYSYMBOL_VAR_LOW_RTT_PERMIL = 301, /* VAR_LOW_RTT_PERMIL */
- YYSYMBOL_VAR_FAST_SERVER_PERMIL = 302, /* VAR_FAST_SERVER_PERMIL */
- YYSYMBOL_VAR_FAST_SERVER_NUM = 303, /* VAR_FAST_SERVER_NUM */
- YYSYMBOL_VAR_ALLOW_NOTIFY = 304, /* VAR_ALLOW_NOTIFY */
- YYSYMBOL_VAR_TLS_WIN_CERT = 305, /* VAR_TLS_WIN_CERT */
- YYSYMBOL_VAR_TCP_CONNECTION_LIMIT = 306, /* VAR_TCP_CONNECTION_LIMIT */
- YYSYMBOL_VAR_ANSWER_COOKIE = 307, /* VAR_ANSWER_COOKIE */
- YYSYMBOL_VAR_COOKIE_SECRET = 308, /* VAR_COOKIE_SECRET */
- YYSYMBOL_VAR_IP_RATELIMIT_COOKIE = 309, /* VAR_IP_RATELIMIT_COOKIE */
- YYSYMBOL_VAR_FORWARD_NO_CACHE = 310, /* VAR_FORWARD_NO_CACHE */
- YYSYMBOL_VAR_STUB_NO_CACHE = 311, /* VAR_STUB_NO_CACHE */
- YYSYMBOL_VAR_LOG_SERVFAIL = 312, /* VAR_LOG_SERVFAIL */
- YYSYMBOL_VAR_DENY_ANY = 313, /* VAR_DENY_ANY */
- YYSYMBOL_VAR_UNKNOWN_SERVER_TIME_LIMIT = 314, /* VAR_UNKNOWN_SERVER_TIME_LIMIT */
- YYSYMBOL_VAR_LOG_TAG_QUERYREPLY = 315, /* VAR_LOG_TAG_QUERYREPLY */
- YYSYMBOL_VAR_DISCARD_TIMEOUT = 316, /* VAR_DISCARD_TIMEOUT */
- YYSYMBOL_VAR_WAIT_LIMIT = 317, /* VAR_WAIT_LIMIT */
- YYSYMBOL_VAR_WAIT_LIMIT_COOKIE = 318, /* VAR_WAIT_LIMIT_COOKIE */
- YYSYMBOL_VAR_WAIT_LIMIT_NETBLOCK = 319, /* VAR_WAIT_LIMIT_NETBLOCK */
- YYSYMBOL_VAR_WAIT_LIMIT_COOKIE_NETBLOCK = 320, /* VAR_WAIT_LIMIT_COOKIE_NETBLOCK */
- YYSYMBOL_VAR_STREAM_WAIT_SIZE = 321, /* VAR_STREAM_WAIT_SIZE */
- YYSYMBOL_VAR_TLS_CIPHERS = 322, /* VAR_TLS_CIPHERS */
- YYSYMBOL_VAR_TLS_CIPHERSUITES = 323, /* VAR_TLS_CIPHERSUITES */
- YYSYMBOL_VAR_TLS_USE_SNI = 324, /* VAR_TLS_USE_SNI */
- YYSYMBOL_VAR_IPSET = 325, /* VAR_IPSET */
- YYSYMBOL_VAR_IPSET_NAME_V4 = 326, /* VAR_IPSET_NAME_V4 */
- YYSYMBOL_VAR_IPSET_NAME_V6 = 327, /* VAR_IPSET_NAME_V6 */
- YYSYMBOL_VAR_TLS_SESSION_TICKET_KEYS = 328, /* VAR_TLS_SESSION_TICKET_KEYS */
- YYSYMBOL_VAR_RPZ = 329, /* VAR_RPZ */
- YYSYMBOL_VAR_TAGS = 330, /* VAR_TAGS */
- YYSYMBOL_VAR_RPZ_ACTION_OVERRIDE = 331, /* VAR_RPZ_ACTION_OVERRIDE */
- YYSYMBOL_VAR_RPZ_CNAME_OVERRIDE = 332, /* VAR_RPZ_CNAME_OVERRIDE */
- YYSYMBOL_VAR_RPZ_LOG = 333, /* VAR_RPZ_LOG */
- YYSYMBOL_VAR_RPZ_LOG_NAME = 334, /* VAR_RPZ_LOG_NAME */
- YYSYMBOL_VAR_DYNLIB = 335, /* VAR_DYNLIB */
- YYSYMBOL_VAR_DYNLIB_FILE = 336, /* VAR_DYNLIB_FILE */
- YYSYMBOL_VAR_EDNS_CLIENT_STRING = 337, /* VAR_EDNS_CLIENT_STRING */
- YYSYMBOL_VAR_EDNS_CLIENT_STRING_OPCODE = 338, /* VAR_EDNS_CLIENT_STRING_OPCODE */
- YYSYMBOL_VAR_NSID = 339, /* VAR_NSID */
- YYSYMBOL_VAR_ZONEMD_PERMISSIVE_MODE = 340, /* VAR_ZONEMD_PERMISSIVE_MODE */
- YYSYMBOL_VAR_ZONEMD_CHECK = 341, /* VAR_ZONEMD_CHECK */
- YYSYMBOL_VAR_ZONEMD_REJECT_ABSENCE = 342, /* VAR_ZONEMD_REJECT_ABSENCE */
- YYSYMBOL_VAR_RPZ_SIGNAL_NXDOMAIN_RA = 343, /* VAR_RPZ_SIGNAL_NXDOMAIN_RA */
- YYSYMBOL_VAR_INTERFACE_AUTOMATIC_PORTS = 344, /* VAR_INTERFACE_AUTOMATIC_PORTS */
- YYSYMBOL_VAR_EDE = 345, /* VAR_EDE */
- YYSYMBOL_VAR_INTERFACE_ACTION = 346, /* VAR_INTERFACE_ACTION */
- YYSYMBOL_VAR_INTERFACE_VIEW = 347, /* VAR_INTERFACE_VIEW */
- YYSYMBOL_VAR_INTERFACE_TAG = 348, /* VAR_INTERFACE_TAG */
- YYSYMBOL_VAR_INTERFACE_TAG_ACTION = 349, /* VAR_INTERFACE_TAG_ACTION */
- YYSYMBOL_VAR_INTERFACE_TAG_DATA = 350, /* VAR_INTERFACE_TAG_DATA */
- YYSYMBOL_VAR_PROXY_PROTOCOL_PORT = 351, /* VAR_PROXY_PROTOCOL_PORT */
- YYSYMBOL_VAR_STATISTICS_INHIBIT_ZERO = 352, /* VAR_STATISTICS_INHIBIT_ZERO */
- YYSYMBOL_VAR_HARDEN_UNKNOWN_ADDITIONAL = 353, /* VAR_HARDEN_UNKNOWN_ADDITIONAL */
- YYSYMBOL_VAR_DISABLE_EDNS_DO = 354, /* VAR_DISABLE_EDNS_DO */
- YYSYMBOL_VAR_CACHEDB_NO_STORE = 355, /* VAR_CACHEDB_NO_STORE */
- YYSYMBOL_VAR_LOG_DESTADDR = 356, /* VAR_LOG_DESTADDR */
- YYSYMBOL_VAR_CACHEDB_CHECK_WHEN_SERVE_EXPIRED = 357, /* VAR_CACHEDB_CHECK_WHEN_SERVE_EXPIRED */
- YYSYMBOL_VAR_COOKIE_SECRET_FILE = 358, /* VAR_COOKIE_SECRET_FILE */
- YYSYMBOL_YYACCEPT = 359, /* $accept */
- YYSYMBOL_toplevelvars = 360, /* toplevelvars */
- YYSYMBOL_toplevelvar = 361, /* toplevelvar */
- YYSYMBOL_force_toplevel = 362, /* force_toplevel */
- YYSYMBOL_serverstart = 363, /* serverstart */
- YYSYMBOL_contents_server = 364, /* contents_server */
- YYSYMBOL_content_server = 365, /* content_server */
- YYSYMBOL_stubstart = 366, /* stubstart */
- YYSYMBOL_contents_stub = 367, /* contents_stub */
- YYSYMBOL_content_stub = 368, /* content_stub */
- YYSYMBOL_forwardstart = 369, /* forwardstart */
- YYSYMBOL_contents_forward = 370, /* contents_forward */
- YYSYMBOL_content_forward = 371, /* content_forward */
- YYSYMBOL_viewstart = 372, /* viewstart */
- YYSYMBOL_contents_view = 373, /* contents_view */
- YYSYMBOL_content_view = 374, /* content_view */
- YYSYMBOL_authstart = 375, /* authstart */
- YYSYMBOL_contents_auth = 376, /* contents_auth */
- YYSYMBOL_content_auth = 377, /* content_auth */
- YYSYMBOL_rpz_tag = 378, /* rpz_tag */
- YYSYMBOL_rpz_action_override = 379, /* rpz_action_override */
- YYSYMBOL_rpz_cname_override = 380, /* rpz_cname_override */
- YYSYMBOL_rpz_log = 381, /* rpz_log */
- YYSYMBOL_rpz_log_name = 382, /* rpz_log_name */
- YYSYMBOL_rpz_signal_nxdomain_ra = 383, /* rpz_signal_nxdomain_ra */
- YYSYMBOL_rpzstart = 384, /* rpzstart */
- YYSYMBOL_contents_rpz = 385, /* contents_rpz */
- YYSYMBOL_content_rpz = 386, /* content_rpz */
- YYSYMBOL_server_num_threads = 387, /* server_num_threads */
- YYSYMBOL_server_verbosity = 388, /* server_verbosity */
- YYSYMBOL_server_statistics_interval = 389, /* server_statistics_interval */
- YYSYMBOL_server_statistics_cumulative = 390, /* server_statistics_cumulative */
- YYSYMBOL_server_extended_statistics = 391, /* server_extended_statistics */
- YYSYMBOL_server_statistics_inhibit_zero = 392, /* server_statistics_inhibit_zero */
- YYSYMBOL_server_shm_enable = 393, /* server_shm_enable */
- YYSYMBOL_server_shm_key = 394, /* server_shm_key */
- YYSYMBOL_server_port = 395, /* server_port */
- YYSYMBOL_server_send_client_subnet = 396, /* server_send_client_subnet */
- YYSYMBOL_server_client_subnet_zone = 397, /* server_client_subnet_zone */
- YYSYMBOL_server_client_subnet_always_forward = 398, /* server_client_subnet_always_forward */
- YYSYMBOL_server_client_subnet_opcode = 399, /* server_client_subnet_opcode */
- YYSYMBOL_server_max_client_subnet_ipv4 = 400, /* server_max_client_subnet_ipv4 */
- YYSYMBOL_server_max_client_subnet_ipv6 = 401, /* server_max_client_subnet_ipv6 */
- YYSYMBOL_server_min_client_subnet_ipv4 = 402, /* server_min_client_subnet_ipv4 */
- YYSYMBOL_server_min_client_subnet_ipv6 = 403, /* server_min_client_subnet_ipv6 */
- YYSYMBOL_server_max_ecs_tree_size_ipv4 = 404, /* server_max_ecs_tree_size_ipv4 */
- YYSYMBOL_server_max_ecs_tree_size_ipv6 = 405, /* server_max_ecs_tree_size_ipv6 */
- YYSYMBOL_server_interface = 406, /* server_interface */
- YYSYMBOL_server_outgoing_interface = 407, /* server_outgoing_interface */
- YYSYMBOL_server_outgoing_range = 408, /* server_outgoing_range */
- YYSYMBOL_server_outgoing_port_permit = 409, /* server_outgoing_port_permit */
- YYSYMBOL_server_outgoing_port_avoid = 410, /* server_outgoing_port_avoid */
- YYSYMBOL_server_outgoing_num_tcp = 411, /* server_outgoing_num_tcp */
- YYSYMBOL_server_incoming_num_tcp = 412, /* server_incoming_num_tcp */
- YYSYMBOL_server_interface_automatic = 413, /* server_interface_automatic */
- YYSYMBOL_server_interface_automatic_ports = 414, /* server_interface_automatic_ports */
- YYSYMBOL_server_do_ip4 = 415, /* server_do_ip4 */
- YYSYMBOL_server_do_ip6 = 416, /* server_do_ip6 */
- YYSYMBOL_server_do_nat64 = 417, /* server_do_nat64 */
- YYSYMBOL_server_do_udp = 418, /* server_do_udp */
- YYSYMBOL_server_do_tcp = 419, /* server_do_tcp */
- YYSYMBOL_server_prefer_ip4 = 420, /* server_prefer_ip4 */
- YYSYMBOL_server_prefer_ip6 = 421, /* server_prefer_ip6 */
- YYSYMBOL_server_tcp_mss = 422, /* server_tcp_mss */
- YYSYMBOL_server_outgoing_tcp_mss = 423, /* server_outgoing_tcp_mss */
- YYSYMBOL_server_tcp_idle_timeout = 424, /* server_tcp_idle_timeout */
- YYSYMBOL_server_max_reuse_tcp_queries = 425, /* server_max_reuse_tcp_queries */
- YYSYMBOL_server_tcp_reuse_timeout = 426, /* server_tcp_reuse_timeout */
- YYSYMBOL_server_tcp_auth_query_timeout = 427, /* server_tcp_auth_query_timeout */
- YYSYMBOL_server_tcp_keepalive = 428, /* server_tcp_keepalive */
- YYSYMBOL_server_tcp_keepalive_timeout = 429, /* server_tcp_keepalive_timeout */
- YYSYMBOL_server_sock_queue_timeout = 430, /* server_sock_queue_timeout */
- YYSYMBOL_server_tcp_upstream = 431, /* server_tcp_upstream */
- YYSYMBOL_server_udp_upstream_without_downstream = 432, /* server_udp_upstream_without_downstream */
- YYSYMBOL_server_ssl_upstream = 433, /* server_ssl_upstream */
- YYSYMBOL_server_ssl_service_key = 434, /* server_ssl_service_key */
- YYSYMBOL_server_ssl_service_pem = 435, /* server_ssl_service_pem */
- YYSYMBOL_server_ssl_port = 436, /* server_ssl_port */
- YYSYMBOL_server_tls_cert_bundle = 437, /* server_tls_cert_bundle */
- YYSYMBOL_server_tls_win_cert = 438, /* server_tls_win_cert */
- YYSYMBOL_server_tls_additional_port = 439, /* server_tls_additional_port */
- YYSYMBOL_server_tls_ciphers = 440, /* server_tls_ciphers */
- YYSYMBOL_server_tls_ciphersuites = 441, /* server_tls_ciphersuites */
- YYSYMBOL_server_tls_session_ticket_keys = 442, /* server_tls_session_ticket_keys */
- YYSYMBOL_server_tls_use_sni = 443, /* server_tls_use_sni */
- YYSYMBOL_server_https_port = 444, /* server_https_port */
- YYSYMBOL_server_http_endpoint = 445, /* server_http_endpoint */
- YYSYMBOL_server_http_max_streams = 446, /* server_http_max_streams */
- YYSYMBOL_server_http_query_buffer_size = 447, /* server_http_query_buffer_size */
- YYSYMBOL_server_http_response_buffer_size = 448, /* server_http_response_buffer_size */
- YYSYMBOL_server_http_nodelay = 449, /* server_http_nodelay */
- YYSYMBOL_server_http_notls_downstream = 450, /* server_http_notls_downstream */
- YYSYMBOL_server_use_systemd = 451, /* server_use_systemd */
- YYSYMBOL_server_do_daemonize = 452, /* server_do_daemonize */
- YYSYMBOL_server_use_syslog = 453, /* server_use_syslog */
- YYSYMBOL_server_log_time_ascii = 454, /* server_log_time_ascii */
- YYSYMBOL_server_log_queries = 455, /* server_log_queries */
- YYSYMBOL_server_log_replies = 456, /* server_log_replies */
- YYSYMBOL_server_log_tag_queryreply = 457, /* server_log_tag_queryreply */
- YYSYMBOL_server_log_servfail = 458, /* server_log_servfail */
- YYSYMBOL_server_log_destaddr = 459, /* server_log_destaddr */
- YYSYMBOL_server_log_local_actions = 460, /* server_log_local_actions */
- YYSYMBOL_server_chroot = 461, /* server_chroot */
- YYSYMBOL_server_username = 462, /* server_username */
- YYSYMBOL_server_directory = 463, /* server_directory */
- YYSYMBOL_server_logfile = 464, /* server_logfile */
- YYSYMBOL_server_pidfile = 465, /* server_pidfile */
- YYSYMBOL_server_root_hints = 466, /* server_root_hints */
- YYSYMBOL_server_dlv_anchor_file = 467, /* server_dlv_anchor_file */
- YYSYMBOL_server_dlv_anchor = 468, /* server_dlv_anchor */
- YYSYMBOL_server_auto_trust_anchor_file = 469, /* server_auto_trust_anchor_file */
- YYSYMBOL_server_trust_anchor_file = 470, /* server_trust_anchor_file */
- YYSYMBOL_server_trusted_keys_file = 471, /* server_trusted_keys_file */
- YYSYMBOL_server_trust_anchor = 472, /* server_trust_anchor */
- YYSYMBOL_server_trust_anchor_signaling = 473, /* server_trust_anchor_signaling */
- YYSYMBOL_server_root_key_sentinel = 474, /* server_root_key_sentinel */
- YYSYMBOL_server_domain_insecure = 475, /* server_domain_insecure */
- YYSYMBOL_server_hide_identity = 476, /* server_hide_identity */
- YYSYMBOL_server_hide_version = 477, /* server_hide_version */
- YYSYMBOL_server_hide_trustanchor = 478, /* server_hide_trustanchor */
- YYSYMBOL_server_hide_http_user_agent = 479, /* server_hide_http_user_agent */
- YYSYMBOL_server_identity = 480, /* server_identity */
- YYSYMBOL_server_version = 481, /* server_version */
- YYSYMBOL_server_http_user_agent = 482, /* server_http_user_agent */
- YYSYMBOL_server_nsid = 483, /* server_nsid */
- YYSYMBOL_server_so_rcvbuf = 484, /* server_so_rcvbuf */
- YYSYMBOL_server_so_sndbuf = 485, /* server_so_sndbuf */
- YYSYMBOL_server_so_reuseport = 486, /* server_so_reuseport */
- YYSYMBOL_server_ip_transparent = 487, /* server_ip_transparent */
- YYSYMBOL_server_ip_freebind = 488, /* server_ip_freebind */
- YYSYMBOL_server_ip_dscp = 489, /* server_ip_dscp */
- YYSYMBOL_server_stream_wait_size = 490, /* server_stream_wait_size */
- YYSYMBOL_server_edns_buffer_size = 491, /* server_edns_buffer_size */
- YYSYMBOL_server_msg_buffer_size = 492, /* server_msg_buffer_size */
- YYSYMBOL_server_msg_cache_size = 493, /* server_msg_cache_size */
- YYSYMBOL_server_msg_cache_slabs = 494, /* server_msg_cache_slabs */
- YYSYMBOL_server_num_queries_per_thread = 495, /* server_num_queries_per_thread */
- YYSYMBOL_server_jostle_timeout = 496, /* server_jostle_timeout */
- YYSYMBOL_server_delay_close = 497, /* server_delay_close */
- YYSYMBOL_server_udp_connect = 498, /* server_udp_connect */
- YYSYMBOL_server_unblock_lan_zones = 499, /* server_unblock_lan_zones */
- YYSYMBOL_server_insecure_lan_zones = 500, /* server_insecure_lan_zones */
- YYSYMBOL_server_rrset_cache_size = 501, /* server_rrset_cache_size */
- YYSYMBOL_server_rrset_cache_slabs = 502, /* server_rrset_cache_slabs */
- YYSYMBOL_server_infra_host_ttl = 503, /* server_infra_host_ttl */
- YYSYMBOL_server_infra_lame_ttl = 504, /* server_infra_lame_ttl */
- YYSYMBOL_server_infra_cache_numhosts = 505, /* server_infra_cache_numhosts */
- YYSYMBOL_server_infra_cache_lame_size = 506, /* server_infra_cache_lame_size */
- YYSYMBOL_server_infra_cache_slabs = 507, /* server_infra_cache_slabs */
- YYSYMBOL_server_infra_cache_min_rtt = 508, /* server_infra_cache_min_rtt */
- YYSYMBOL_server_infra_cache_max_rtt = 509, /* server_infra_cache_max_rtt */
- YYSYMBOL_server_infra_keep_probing = 510, /* server_infra_keep_probing */
- YYSYMBOL_server_target_fetch_policy = 511, /* server_target_fetch_policy */
- YYSYMBOL_server_harden_short_bufsize = 512, /* server_harden_short_bufsize */
- YYSYMBOL_server_harden_large_queries = 513, /* server_harden_large_queries */
- YYSYMBOL_server_harden_glue = 514, /* server_harden_glue */
- YYSYMBOL_server_harden_dnssec_stripped = 515, /* server_harden_dnssec_stripped */
- YYSYMBOL_server_harden_below_nxdomain = 516, /* server_harden_below_nxdomain */
- YYSYMBOL_server_harden_referral_path = 517, /* server_harden_referral_path */
- YYSYMBOL_server_harden_algo_downgrade = 518, /* server_harden_algo_downgrade */
- YYSYMBOL_server_harden_unknown_additional = 519, /* server_harden_unknown_additional */
- YYSYMBOL_server_use_caps_for_id = 520, /* server_use_caps_for_id */
- YYSYMBOL_server_caps_whitelist = 521, /* server_caps_whitelist */
- YYSYMBOL_server_private_address = 522, /* server_private_address */
- YYSYMBOL_server_private_domain = 523, /* server_private_domain */
- YYSYMBOL_server_prefetch = 524, /* server_prefetch */
- YYSYMBOL_server_prefetch_key = 525, /* server_prefetch_key */
- YYSYMBOL_server_deny_any = 526, /* server_deny_any */
- YYSYMBOL_server_unwanted_reply_threshold = 527, /* server_unwanted_reply_threshold */
- YYSYMBOL_server_do_not_query_address = 528, /* server_do_not_query_address */
- YYSYMBOL_server_do_not_query_localhost = 529, /* server_do_not_query_localhost */
- YYSYMBOL_server_access_control = 530, /* server_access_control */
- YYSYMBOL_server_interface_action = 531, /* server_interface_action */
- YYSYMBOL_server_module_conf = 532, /* server_module_conf */
- YYSYMBOL_server_val_override_date = 533, /* server_val_override_date */
- YYSYMBOL_server_val_sig_skew_min = 534, /* server_val_sig_skew_min */
- YYSYMBOL_server_val_sig_skew_max = 535, /* server_val_sig_skew_max */
- YYSYMBOL_server_val_max_restart = 536, /* server_val_max_restart */
- YYSYMBOL_server_cache_max_ttl = 537, /* server_cache_max_ttl */
- YYSYMBOL_server_cache_max_negative_ttl = 538, /* server_cache_max_negative_ttl */
- YYSYMBOL_server_cache_min_negative_ttl = 539, /* server_cache_min_negative_ttl */
- YYSYMBOL_server_cache_min_ttl = 540, /* server_cache_min_ttl */
- YYSYMBOL_server_bogus_ttl = 541, /* server_bogus_ttl */
- YYSYMBOL_server_val_clean_additional = 542, /* server_val_clean_additional */
- YYSYMBOL_server_val_permissive_mode = 543, /* server_val_permissive_mode */
- YYSYMBOL_server_aggressive_nsec = 544, /* server_aggressive_nsec */
- YYSYMBOL_server_ignore_cd_flag = 545, /* server_ignore_cd_flag */
- YYSYMBOL_server_disable_edns_do = 546, /* server_disable_edns_do */
- YYSYMBOL_server_serve_expired = 547, /* server_serve_expired */
- YYSYMBOL_server_serve_expired_ttl = 548, /* server_serve_expired_ttl */
- YYSYMBOL_server_serve_expired_ttl_reset = 549, /* server_serve_expired_ttl_reset */
- YYSYMBOL_server_serve_expired_reply_ttl = 550, /* server_serve_expired_reply_ttl */
- YYSYMBOL_server_serve_expired_client_timeout = 551, /* server_serve_expired_client_timeout */
- YYSYMBOL_server_ede_serve_expired = 552, /* server_ede_serve_expired */
- YYSYMBOL_server_serve_original_ttl = 553, /* server_serve_original_ttl */
- YYSYMBOL_server_fake_dsa = 554, /* server_fake_dsa */
- YYSYMBOL_server_fake_sha1 = 555, /* server_fake_sha1 */
- YYSYMBOL_server_val_log_level = 556, /* server_val_log_level */
- YYSYMBOL_server_val_nsec3_keysize_iterations = 557, /* server_val_nsec3_keysize_iterations */
- YYSYMBOL_server_zonemd_permissive_mode = 558, /* server_zonemd_permissive_mode */
- YYSYMBOL_server_add_holddown = 559, /* server_add_holddown */
- YYSYMBOL_server_del_holddown = 560, /* server_del_holddown */
- YYSYMBOL_server_keep_missing = 561, /* server_keep_missing */
- YYSYMBOL_server_permit_small_holddown = 562, /* server_permit_small_holddown */
- YYSYMBOL_server_key_cache_size = 563, /* server_key_cache_size */
- YYSYMBOL_server_key_cache_slabs = 564, /* server_key_cache_slabs */
- YYSYMBOL_server_neg_cache_size = 565, /* server_neg_cache_size */
- YYSYMBOL_server_local_zone = 566, /* server_local_zone */
- YYSYMBOL_server_local_data = 567, /* server_local_data */
- YYSYMBOL_server_local_data_ptr = 568, /* server_local_data_ptr */
- YYSYMBOL_server_minimal_responses = 569, /* server_minimal_responses */
- YYSYMBOL_server_rrset_roundrobin = 570, /* server_rrset_roundrobin */
- YYSYMBOL_server_unknown_server_time_limit = 571, /* server_unknown_server_time_limit */
- YYSYMBOL_server_discard_timeout = 572, /* server_discard_timeout */
- YYSYMBOL_server_wait_limit = 573, /* server_wait_limit */
- YYSYMBOL_server_wait_limit_cookie = 574, /* server_wait_limit_cookie */
- YYSYMBOL_server_wait_limit_netblock = 575, /* server_wait_limit_netblock */
- YYSYMBOL_server_wait_limit_cookie_netblock = 576, /* server_wait_limit_cookie_netblock */
- YYSYMBOL_server_max_udp_size = 577, /* server_max_udp_size */
- YYSYMBOL_server_dns64_prefix = 578, /* server_dns64_prefix */
- YYSYMBOL_server_dns64_synthall = 579, /* server_dns64_synthall */
- YYSYMBOL_server_dns64_ignore_aaaa = 580, /* server_dns64_ignore_aaaa */
- YYSYMBOL_server_nat64_prefix = 581, /* server_nat64_prefix */
- YYSYMBOL_server_define_tag = 582, /* server_define_tag */
- YYSYMBOL_server_local_zone_tag = 583, /* server_local_zone_tag */
- YYSYMBOL_server_access_control_tag = 584, /* server_access_control_tag */
- YYSYMBOL_server_access_control_tag_action = 585, /* server_access_control_tag_action */
- YYSYMBOL_server_access_control_tag_data = 586, /* server_access_control_tag_data */
- YYSYMBOL_server_local_zone_override = 587, /* server_local_zone_override */
- YYSYMBOL_server_access_control_view = 588, /* server_access_control_view */
- YYSYMBOL_server_interface_tag = 589, /* server_interface_tag */
- YYSYMBOL_server_interface_tag_action = 590, /* server_interface_tag_action */
- YYSYMBOL_server_interface_tag_data = 591, /* server_interface_tag_data */
- YYSYMBOL_server_interface_view = 592, /* server_interface_view */
- YYSYMBOL_server_response_ip_tag = 593, /* server_response_ip_tag */
- YYSYMBOL_server_ip_ratelimit = 594, /* server_ip_ratelimit */
- YYSYMBOL_server_ip_ratelimit_cookie = 595, /* server_ip_ratelimit_cookie */
- YYSYMBOL_server_ratelimit = 596, /* server_ratelimit */
- YYSYMBOL_server_ip_ratelimit_size = 597, /* server_ip_ratelimit_size */
- YYSYMBOL_server_ratelimit_size = 598, /* server_ratelimit_size */
- YYSYMBOL_server_ip_ratelimit_slabs = 599, /* server_ip_ratelimit_slabs */
- YYSYMBOL_server_ratelimit_slabs = 600, /* server_ratelimit_slabs */
- YYSYMBOL_server_ratelimit_for_domain = 601, /* server_ratelimit_for_domain */
- YYSYMBOL_server_ratelimit_below_domain = 602, /* server_ratelimit_below_domain */
- YYSYMBOL_server_ip_ratelimit_factor = 603, /* server_ip_ratelimit_factor */
- YYSYMBOL_server_ratelimit_factor = 604, /* server_ratelimit_factor */
- YYSYMBOL_server_ip_ratelimit_backoff = 605, /* server_ip_ratelimit_backoff */
- YYSYMBOL_server_ratelimit_backoff = 606, /* server_ratelimit_backoff */
- YYSYMBOL_server_outbound_msg_retry = 607, /* server_outbound_msg_retry */
- YYSYMBOL_server_max_sent_count = 608, /* server_max_sent_count */
- YYSYMBOL_server_max_query_restarts = 609, /* server_max_query_restarts */
- YYSYMBOL_server_low_rtt = 610, /* server_low_rtt */
- YYSYMBOL_server_fast_server_num = 611, /* server_fast_server_num */
- YYSYMBOL_server_fast_server_permil = 612, /* server_fast_server_permil */
- YYSYMBOL_server_qname_minimisation = 613, /* server_qname_minimisation */
- YYSYMBOL_server_qname_minimisation_strict = 614, /* server_qname_minimisation_strict */
- YYSYMBOL_server_pad_responses = 615, /* server_pad_responses */
- YYSYMBOL_server_pad_responses_block_size = 616, /* server_pad_responses_block_size */
- YYSYMBOL_server_pad_queries = 617, /* server_pad_queries */
- YYSYMBOL_server_pad_queries_block_size = 618, /* server_pad_queries_block_size */
- YYSYMBOL_server_ipsecmod_enabled = 619, /* server_ipsecmod_enabled */
- YYSYMBOL_server_ipsecmod_ignore_bogus = 620, /* server_ipsecmod_ignore_bogus */
- YYSYMBOL_server_ipsecmod_hook = 621, /* server_ipsecmod_hook */
- YYSYMBOL_server_ipsecmod_max_ttl = 622, /* server_ipsecmod_max_ttl */
- YYSYMBOL_server_ipsecmod_whitelist = 623, /* server_ipsecmod_whitelist */
- YYSYMBOL_server_ipsecmod_strict = 624, /* server_ipsecmod_strict */
- YYSYMBOL_server_edns_client_string = 625, /* server_edns_client_string */
- YYSYMBOL_server_edns_client_string_opcode = 626, /* server_edns_client_string_opcode */
- YYSYMBOL_server_ede = 627, /* server_ede */
- YYSYMBOL_server_proxy_protocol_port = 628, /* server_proxy_protocol_port */
- YYSYMBOL_stub_name = 629, /* stub_name */
- YYSYMBOL_stub_host = 630, /* stub_host */
- YYSYMBOL_stub_addr = 631, /* stub_addr */
- YYSYMBOL_stub_first = 632, /* stub_first */
- YYSYMBOL_stub_no_cache = 633, /* stub_no_cache */
- YYSYMBOL_stub_ssl_upstream = 634, /* stub_ssl_upstream */
- YYSYMBOL_stub_tcp_upstream = 635, /* stub_tcp_upstream */
- YYSYMBOL_stub_prime = 636, /* stub_prime */
- YYSYMBOL_forward_name = 637, /* forward_name */
- YYSYMBOL_forward_host = 638, /* forward_host */
- YYSYMBOL_forward_addr = 639, /* forward_addr */
- YYSYMBOL_forward_first = 640, /* forward_first */
- YYSYMBOL_forward_no_cache = 641, /* forward_no_cache */
- YYSYMBOL_forward_ssl_upstream = 642, /* forward_ssl_upstream */
- YYSYMBOL_forward_tcp_upstream = 643, /* forward_tcp_upstream */
- YYSYMBOL_auth_name = 644, /* auth_name */
- YYSYMBOL_auth_zonefile = 645, /* auth_zonefile */
- YYSYMBOL_auth_master = 646, /* auth_master */
- YYSYMBOL_auth_url = 647, /* auth_url */
- YYSYMBOL_auth_allow_notify = 648, /* auth_allow_notify */
- YYSYMBOL_auth_zonemd_check = 649, /* auth_zonemd_check */
- YYSYMBOL_auth_zonemd_reject_absence = 650, /* auth_zonemd_reject_absence */
- YYSYMBOL_auth_for_downstream = 651, /* auth_for_downstream */
- YYSYMBOL_auth_for_upstream = 652, /* auth_for_upstream */
- YYSYMBOL_auth_fallback_enabled = 653, /* auth_fallback_enabled */
- YYSYMBOL_view_name = 654, /* view_name */
- YYSYMBOL_view_local_zone = 655, /* view_local_zone */
- YYSYMBOL_view_response_ip = 656, /* view_response_ip */
- YYSYMBOL_view_response_ip_data = 657, /* view_response_ip_data */
- YYSYMBOL_view_local_data = 658, /* view_local_data */
- YYSYMBOL_view_local_data_ptr = 659, /* view_local_data_ptr */
- YYSYMBOL_view_first = 660, /* view_first */
- YYSYMBOL_rcstart = 661, /* rcstart */
- YYSYMBOL_contents_rc = 662, /* contents_rc */
- YYSYMBOL_content_rc = 663, /* content_rc */
- YYSYMBOL_rc_control_enable = 664, /* rc_control_enable */
- YYSYMBOL_rc_control_port = 665, /* rc_control_port */
- YYSYMBOL_rc_control_interface = 666, /* rc_control_interface */
- YYSYMBOL_rc_control_use_cert = 667, /* rc_control_use_cert */
- YYSYMBOL_rc_server_key_file = 668, /* rc_server_key_file */
- YYSYMBOL_rc_server_cert_file = 669, /* rc_server_cert_file */
- YYSYMBOL_rc_control_key_file = 670, /* rc_control_key_file */
- YYSYMBOL_rc_control_cert_file = 671, /* rc_control_cert_file */
- YYSYMBOL_dtstart = 672, /* dtstart */
- YYSYMBOL_contents_dt = 673, /* contents_dt */
- YYSYMBOL_content_dt = 674, /* content_dt */
- YYSYMBOL_dt_dnstap_enable = 675, /* dt_dnstap_enable */
- YYSYMBOL_dt_dnstap_bidirectional = 676, /* dt_dnstap_bidirectional */
- YYSYMBOL_dt_dnstap_socket_path = 677, /* dt_dnstap_socket_path */
- YYSYMBOL_dt_dnstap_ip = 678, /* dt_dnstap_ip */
- YYSYMBOL_dt_dnstap_tls = 679, /* dt_dnstap_tls */
- YYSYMBOL_dt_dnstap_tls_server_name = 680, /* dt_dnstap_tls_server_name */
- YYSYMBOL_dt_dnstap_tls_cert_bundle = 681, /* dt_dnstap_tls_cert_bundle */
- YYSYMBOL_dt_dnstap_tls_client_key_file = 682, /* dt_dnstap_tls_client_key_file */
- YYSYMBOL_dt_dnstap_tls_client_cert_file = 683, /* dt_dnstap_tls_client_cert_file */
- YYSYMBOL_dt_dnstap_send_identity = 684, /* dt_dnstap_send_identity */
- YYSYMBOL_dt_dnstap_send_version = 685, /* dt_dnstap_send_version */
- YYSYMBOL_dt_dnstap_identity = 686, /* dt_dnstap_identity */
- YYSYMBOL_dt_dnstap_version = 687, /* dt_dnstap_version */
- YYSYMBOL_dt_dnstap_log_resolver_query_messages = 688, /* dt_dnstap_log_resolver_query_messages */
- YYSYMBOL_dt_dnstap_log_resolver_response_messages = 689, /* dt_dnstap_log_resolver_response_messages */
- YYSYMBOL_dt_dnstap_log_client_query_messages = 690, /* dt_dnstap_log_client_query_messages */
- YYSYMBOL_dt_dnstap_log_client_response_messages = 691, /* dt_dnstap_log_client_response_messages */
- YYSYMBOL_dt_dnstap_log_forwarder_query_messages = 692, /* dt_dnstap_log_forwarder_query_messages */
- YYSYMBOL_dt_dnstap_log_forwarder_response_messages = 693, /* dt_dnstap_log_forwarder_response_messages */
- YYSYMBOL_dt_dnstap_sample_rate = 694, /* dt_dnstap_sample_rate */
- YYSYMBOL_pythonstart = 695, /* pythonstart */
- YYSYMBOL_contents_py = 696, /* contents_py */
- YYSYMBOL_content_py = 697, /* content_py */
- YYSYMBOL_py_script = 698, /* py_script */
- YYSYMBOL_dynlibstart = 699, /* dynlibstart */
- YYSYMBOL_contents_dl = 700, /* contents_dl */
- YYSYMBOL_content_dl = 701, /* content_dl */
- YYSYMBOL_dl_file = 702, /* dl_file */
- YYSYMBOL_server_disable_dnssec_lame_check = 703, /* server_disable_dnssec_lame_check */
- YYSYMBOL_server_log_identity = 704, /* server_log_identity */
- YYSYMBOL_server_response_ip = 705, /* server_response_ip */
- YYSYMBOL_server_response_ip_data = 706, /* server_response_ip_data */
- YYSYMBOL_dnscstart = 707, /* dnscstart */
- YYSYMBOL_contents_dnsc = 708, /* contents_dnsc */
- YYSYMBOL_content_dnsc = 709, /* content_dnsc */
- YYSYMBOL_dnsc_dnscrypt_enable = 710, /* dnsc_dnscrypt_enable */
- YYSYMBOL_dnsc_dnscrypt_port = 711, /* dnsc_dnscrypt_port */
- YYSYMBOL_dnsc_dnscrypt_provider = 712, /* dnsc_dnscrypt_provider */
- YYSYMBOL_dnsc_dnscrypt_provider_cert = 713, /* dnsc_dnscrypt_provider_cert */
- YYSYMBOL_dnsc_dnscrypt_provider_cert_rotated = 714, /* dnsc_dnscrypt_provider_cert_rotated */
- YYSYMBOL_dnsc_dnscrypt_secret_key = 715, /* dnsc_dnscrypt_secret_key */
- YYSYMBOL_dnsc_dnscrypt_shared_secret_cache_size = 716, /* dnsc_dnscrypt_shared_secret_cache_size */
- YYSYMBOL_dnsc_dnscrypt_shared_secret_cache_slabs = 717, /* dnsc_dnscrypt_shared_secret_cache_slabs */
- YYSYMBOL_dnsc_dnscrypt_nonce_cache_size = 718, /* dnsc_dnscrypt_nonce_cache_size */
- YYSYMBOL_dnsc_dnscrypt_nonce_cache_slabs = 719, /* dnsc_dnscrypt_nonce_cache_slabs */
- YYSYMBOL_cachedbstart = 720, /* cachedbstart */
- YYSYMBOL_contents_cachedb = 721, /* contents_cachedb */
- YYSYMBOL_content_cachedb = 722, /* content_cachedb */
- YYSYMBOL_cachedb_backend_name = 723, /* cachedb_backend_name */
- YYSYMBOL_cachedb_secret_seed = 724, /* cachedb_secret_seed */
- YYSYMBOL_cachedb_no_store = 725, /* cachedb_no_store */
- YYSYMBOL_cachedb_check_when_serve_expired = 726, /* cachedb_check_when_serve_expired */
- YYSYMBOL_redis_server_host = 727, /* redis_server_host */
- YYSYMBOL_redis_server_port = 728, /* redis_server_port */
- YYSYMBOL_redis_server_path = 729, /* redis_server_path */
- YYSYMBOL_redis_server_password = 730, /* redis_server_password */
- YYSYMBOL_redis_timeout = 731, /* redis_timeout */
- YYSYMBOL_redis_expire_records = 732, /* redis_expire_records */
- YYSYMBOL_redis_logical_db = 733, /* redis_logical_db */
- YYSYMBOL_server_tcp_connection_limit = 734, /* server_tcp_connection_limit */
- YYSYMBOL_server_answer_cookie = 735, /* server_answer_cookie */
- YYSYMBOL_server_cookie_secret = 736, /* server_cookie_secret */
- YYSYMBOL_server_cookie_secret_file = 737, /* server_cookie_secret_file */
- YYSYMBOL_ipsetstart = 738, /* ipsetstart */
- YYSYMBOL_contents_ipset = 739, /* contents_ipset */
- YYSYMBOL_content_ipset = 740, /* content_ipset */
- YYSYMBOL_ipset_name_v4 = 741, /* ipset_name_v4 */
- YYSYMBOL_ipset_name_v6 = 742 /* ipset_name_v6 */
+ YYSYMBOL_VAR_CACHEDB_REDISCOMMANDTIMEOUT = 291, /* VAR_CACHEDB_REDISCOMMANDTIMEOUT */
+ YYSYMBOL_VAR_CACHEDB_REDISCONNECTTIMEOUT = 292, /* VAR_CACHEDB_REDISCONNECTTIMEOUT */
+ YYSYMBOL_VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM = 293, /* VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM */
+ YYSYMBOL_VAR_FOR_UPSTREAM = 294, /* VAR_FOR_UPSTREAM */
+ YYSYMBOL_VAR_AUTH_ZONE = 295, /* VAR_AUTH_ZONE */
+ YYSYMBOL_VAR_ZONEFILE = 296, /* VAR_ZONEFILE */
+ YYSYMBOL_VAR_MASTER = 297, /* VAR_MASTER */
+ YYSYMBOL_VAR_URL = 298, /* VAR_URL */
+ YYSYMBOL_VAR_FOR_DOWNSTREAM = 299, /* VAR_FOR_DOWNSTREAM */
+ YYSYMBOL_VAR_FALLBACK_ENABLED = 300, /* VAR_FALLBACK_ENABLED */
+ YYSYMBOL_VAR_TLS_ADDITIONAL_PORT = 301, /* VAR_TLS_ADDITIONAL_PORT */
+ YYSYMBOL_VAR_LOW_RTT = 302, /* VAR_LOW_RTT */
+ YYSYMBOL_VAR_LOW_RTT_PERMIL = 303, /* VAR_LOW_RTT_PERMIL */
+ YYSYMBOL_VAR_FAST_SERVER_PERMIL = 304, /* VAR_FAST_SERVER_PERMIL */
+ YYSYMBOL_VAR_FAST_SERVER_NUM = 305, /* VAR_FAST_SERVER_NUM */
+ YYSYMBOL_VAR_ALLOW_NOTIFY = 306, /* VAR_ALLOW_NOTIFY */
+ YYSYMBOL_VAR_TLS_WIN_CERT = 307, /* VAR_TLS_WIN_CERT */
+ YYSYMBOL_VAR_TCP_CONNECTION_LIMIT = 308, /* VAR_TCP_CONNECTION_LIMIT */
+ YYSYMBOL_VAR_ANSWER_COOKIE = 309, /* VAR_ANSWER_COOKIE */
+ YYSYMBOL_VAR_COOKIE_SECRET = 310, /* VAR_COOKIE_SECRET */
+ YYSYMBOL_VAR_IP_RATELIMIT_COOKIE = 311, /* VAR_IP_RATELIMIT_COOKIE */
+ YYSYMBOL_VAR_FORWARD_NO_CACHE = 312, /* VAR_FORWARD_NO_CACHE */
+ YYSYMBOL_VAR_STUB_NO_CACHE = 313, /* VAR_STUB_NO_CACHE */
+ YYSYMBOL_VAR_LOG_SERVFAIL = 314, /* VAR_LOG_SERVFAIL */
+ YYSYMBOL_VAR_DENY_ANY = 315, /* VAR_DENY_ANY */
+ YYSYMBOL_VAR_UNKNOWN_SERVER_TIME_LIMIT = 316, /* VAR_UNKNOWN_SERVER_TIME_LIMIT */
+ YYSYMBOL_VAR_LOG_TAG_QUERYREPLY = 317, /* VAR_LOG_TAG_QUERYREPLY */
+ YYSYMBOL_VAR_DISCARD_TIMEOUT = 318, /* VAR_DISCARD_TIMEOUT */
+ YYSYMBOL_VAR_WAIT_LIMIT = 319, /* VAR_WAIT_LIMIT */
+ YYSYMBOL_VAR_WAIT_LIMIT_COOKIE = 320, /* VAR_WAIT_LIMIT_COOKIE */
+ YYSYMBOL_VAR_WAIT_LIMIT_NETBLOCK = 321, /* VAR_WAIT_LIMIT_NETBLOCK */
+ YYSYMBOL_VAR_WAIT_LIMIT_COOKIE_NETBLOCK = 322, /* VAR_WAIT_LIMIT_COOKIE_NETBLOCK */
+ YYSYMBOL_VAR_STREAM_WAIT_SIZE = 323, /* VAR_STREAM_WAIT_SIZE */
+ YYSYMBOL_VAR_TLS_CIPHERS = 324, /* VAR_TLS_CIPHERS */
+ YYSYMBOL_VAR_TLS_CIPHERSUITES = 325, /* VAR_TLS_CIPHERSUITES */
+ YYSYMBOL_VAR_TLS_USE_SNI = 326, /* VAR_TLS_USE_SNI */
+ YYSYMBOL_VAR_IPSET = 327, /* VAR_IPSET */
+ YYSYMBOL_VAR_IPSET_NAME_V4 = 328, /* VAR_IPSET_NAME_V4 */
+ YYSYMBOL_VAR_IPSET_NAME_V6 = 329, /* VAR_IPSET_NAME_V6 */
+ YYSYMBOL_VAR_TLS_SESSION_TICKET_KEYS = 330, /* VAR_TLS_SESSION_TICKET_KEYS */
+ YYSYMBOL_VAR_RPZ = 331, /* VAR_RPZ */
+ YYSYMBOL_VAR_TAGS = 332, /* VAR_TAGS */
+ YYSYMBOL_VAR_RPZ_ACTION_OVERRIDE = 333, /* VAR_RPZ_ACTION_OVERRIDE */
+ YYSYMBOL_VAR_RPZ_CNAME_OVERRIDE = 334, /* VAR_RPZ_CNAME_OVERRIDE */
+ YYSYMBOL_VAR_RPZ_LOG = 335, /* VAR_RPZ_LOG */
+ YYSYMBOL_VAR_RPZ_LOG_NAME = 336, /* VAR_RPZ_LOG_NAME */
+ YYSYMBOL_VAR_DYNLIB = 337, /* VAR_DYNLIB */
+ YYSYMBOL_VAR_DYNLIB_FILE = 338, /* VAR_DYNLIB_FILE */
+ YYSYMBOL_VAR_EDNS_CLIENT_STRING = 339, /* VAR_EDNS_CLIENT_STRING */
+ YYSYMBOL_VAR_EDNS_CLIENT_STRING_OPCODE = 340, /* VAR_EDNS_CLIENT_STRING_OPCODE */
+ YYSYMBOL_VAR_NSID = 341, /* VAR_NSID */
+ YYSYMBOL_VAR_ZONEMD_PERMISSIVE_MODE = 342, /* VAR_ZONEMD_PERMISSIVE_MODE */
+ YYSYMBOL_VAR_ZONEMD_CHECK = 343, /* VAR_ZONEMD_CHECK */
+ YYSYMBOL_VAR_ZONEMD_REJECT_ABSENCE = 344, /* VAR_ZONEMD_REJECT_ABSENCE */
+ YYSYMBOL_VAR_RPZ_SIGNAL_NXDOMAIN_RA = 345, /* VAR_RPZ_SIGNAL_NXDOMAIN_RA */
+ YYSYMBOL_VAR_INTERFACE_AUTOMATIC_PORTS = 346, /* VAR_INTERFACE_AUTOMATIC_PORTS */
+ YYSYMBOL_VAR_EDE = 347, /* VAR_EDE */
+ YYSYMBOL_VAR_INTERFACE_ACTION = 348, /* VAR_INTERFACE_ACTION */
+ YYSYMBOL_VAR_INTERFACE_VIEW = 349, /* VAR_INTERFACE_VIEW */
+ YYSYMBOL_VAR_INTERFACE_TAG = 350, /* VAR_INTERFACE_TAG */
+ YYSYMBOL_VAR_INTERFACE_TAG_ACTION = 351, /* VAR_INTERFACE_TAG_ACTION */
+ YYSYMBOL_VAR_INTERFACE_TAG_DATA = 352, /* VAR_INTERFACE_TAG_DATA */
+ YYSYMBOL_VAR_QUIC_PORT = 353, /* VAR_QUIC_PORT */
+ YYSYMBOL_VAR_QUIC_SIZE = 354, /* VAR_QUIC_SIZE */
+ YYSYMBOL_VAR_PROXY_PROTOCOL_PORT = 355, /* VAR_PROXY_PROTOCOL_PORT */
+ YYSYMBOL_VAR_STATISTICS_INHIBIT_ZERO = 356, /* VAR_STATISTICS_INHIBIT_ZERO */
+ YYSYMBOL_VAR_HARDEN_UNKNOWN_ADDITIONAL = 357, /* VAR_HARDEN_UNKNOWN_ADDITIONAL */
+ YYSYMBOL_VAR_DISABLE_EDNS_DO = 358, /* VAR_DISABLE_EDNS_DO */
+ YYSYMBOL_VAR_CACHEDB_NO_STORE = 359, /* VAR_CACHEDB_NO_STORE */
+ YYSYMBOL_VAR_LOG_DESTADDR = 360, /* VAR_LOG_DESTADDR */
+ YYSYMBOL_VAR_CACHEDB_CHECK_WHEN_SERVE_EXPIRED = 361, /* VAR_CACHEDB_CHECK_WHEN_SERVE_EXPIRED */
+ YYSYMBOL_VAR_COOKIE_SECRET_FILE = 362, /* VAR_COOKIE_SECRET_FILE */
+ YYSYMBOL_VAR_ITER_SCRUB_NS = 363, /* VAR_ITER_SCRUB_NS */
+ YYSYMBOL_VAR_ITER_SCRUB_CNAME = 364, /* VAR_ITER_SCRUB_CNAME */
+ YYSYMBOL_VAR_MAX_GLOBAL_QUOTA = 365, /* VAR_MAX_GLOBAL_QUOTA */
+ YYSYMBOL_VAR_HARDEN_UNVERIFIED_GLUE = 366, /* VAR_HARDEN_UNVERIFIED_GLUE */
+ YYSYMBOL_VAR_LOG_TIME_ISO = 367, /* VAR_LOG_TIME_ISO */
+ YYSYMBOL_YYACCEPT = 368, /* $accept */
+ YYSYMBOL_toplevelvars = 369, /* toplevelvars */
+ YYSYMBOL_toplevelvar = 370, /* toplevelvar */
+ YYSYMBOL_force_toplevel = 371, /* force_toplevel */
+ YYSYMBOL_serverstart = 372, /* serverstart */
+ YYSYMBOL_contents_server = 373, /* contents_server */
+ YYSYMBOL_content_server = 374, /* content_server */
+ YYSYMBOL_stub_clause = 375, /* stub_clause */
+ YYSYMBOL_stubstart = 376, /* stubstart */
+ YYSYMBOL_contents_stub = 377, /* contents_stub */
+ YYSYMBOL_content_stub = 378, /* content_stub */
+ YYSYMBOL_forward_clause = 379, /* forward_clause */
+ YYSYMBOL_forwardstart = 380, /* forwardstart */
+ YYSYMBOL_contents_forward = 381, /* contents_forward */
+ YYSYMBOL_content_forward = 382, /* content_forward */
+ YYSYMBOL_view_clause = 383, /* view_clause */
+ YYSYMBOL_viewstart = 384, /* viewstart */
+ YYSYMBOL_contents_view = 385, /* contents_view */
+ YYSYMBOL_content_view = 386, /* content_view */
+ YYSYMBOL_authstart = 387, /* authstart */
+ YYSYMBOL_contents_auth = 388, /* contents_auth */
+ YYSYMBOL_content_auth = 389, /* content_auth */
+ YYSYMBOL_rpz_tag = 390, /* rpz_tag */
+ YYSYMBOL_rpz_action_override = 391, /* rpz_action_override */
+ YYSYMBOL_rpz_cname_override = 392, /* rpz_cname_override */
+ YYSYMBOL_rpz_log = 393, /* rpz_log */
+ YYSYMBOL_rpz_log_name = 394, /* rpz_log_name */
+ YYSYMBOL_rpz_signal_nxdomain_ra = 395, /* rpz_signal_nxdomain_ra */
+ YYSYMBOL_rpzstart = 396, /* rpzstart */
+ YYSYMBOL_contents_rpz = 397, /* contents_rpz */
+ YYSYMBOL_content_rpz = 398, /* content_rpz */
+ YYSYMBOL_server_num_threads = 399, /* server_num_threads */
+ YYSYMBOL_server_verbosity = 400, /* server_verbosity */
+ YYSYMBOL_server_statistics_interval = 401, /* server_statistics_interval */
+ YYSYMBOL_server_statistics_cumulative = 402, /* server_statistics_cumulative */
+ YYSYMBOL_server_extended_statistics = 403, /* server_extended_statistics */
+ YYSYMBOL_server_statistics_inhibit_zero = 404, /* server_statistics_inhibit_zero */
+ YYSYMBOL_server_shm_enable = 405, /* server_shm_enable */
+ YYSYMBOL_server_shm_key = 406, /* server_shm_key */
+ YYSYMBOL_server_port = 407, /* server_port */
+ YYSYMBOL_server_send_client_subnet = 408, /* server_send_client_subnet */
+ YYSYMBOL_server_client_subnet_zone = 409, /* server_client_subnet_zone */
+ YYSYMBOL_server_client_subnet_always_forward = 410, /* server_client_subnet_always_forward */
+ YYSYMBOL_server_client_subnet_opcode = 411, /* server_client_subnet_opcode */
+ YYSYMBOL_server_max_client_subnet_ipv4 = 412, /* server_max_client_subnet_ipv4 */
+ YYSYMBOL_server_max_client_subnet_ipv6 = 413, /* server_max_client_subnet_ipv6 */
+ YYSYMBOL_server_min_client_subnet_ipv4 = 414, /* server_min_client_subnet_ipv4 */
+ YYSYMBOL_server_min_client_subnet_ipv6 = 415, /* server_min_client_subnet_ipv6 */
+ YYSYMBOL_server_max_ecs_tree_size_ipv4 = 416, /* server_max_ecs_tree_size_ipv4 */
+ YYSYMBOL_server_max_ecs_tree_size_ipv6 = 417, /* server_max_ecs_tree_size_ipv6 */
+ YYSYMBOL_server_interface = 418, /* server_interface */
+ YYSYMBOL_server_outgoing_interface = 419, /* server_outgoing_interface */
+ YYSYMBOL_server_outgoing_range = 420, /* server_outgoing_range */
+ YYSYMBOL_server_outgoing_port_permit = 421, /* server_outgoing_port_permit */
+ YYSYMBOL_server_outgoing_port_avoid = 422, /* server_outgoing_port_avoid */
+ YYSYMBOL_server_outgoing_num_tcp = 423, /* server_outgoing_num_tcp */
+ YYSYMBOL_server_incoming_num_tcp = 424, /* server_incoming_num_tcp */
+ YYSYMBOL_server_interface_automatic = 425, /* server_interface_automatic */
+ YYSYMBOL_server_interface_automatic_ports = 426, /* server_interface_automatic_ports */
+ YYSYMBOL_server_do_ip4 = 427, /* server_do_ip4 */
+ YYSYMBOL_server_do_ip6 = 428, /* server_do_ip6 */
+ YYSYMBOL_server_do_nat64 = 429, /* server_do_nat64 */
+ YYSYMBOL_server_do_udp = 430, /* server_do_udp */
+ YYSYMBOL_server_do_tcp = 431, /* server_do_tcp */
+ YYSYMBOL_server_prefer_ip4 = 432, /* server_prefer_ip4 */
+ YYSYMBOL_server_prefer_ip6 = 433, /* server_prefer_ip6 */
+ YYSYMBOL_server_tcp_mss = 434, /* server_tcp_mss */
+ YYSYMBOL_server_outgoing_tcp_mss = 435, /* server_outgoing_tcp_mss */
+ YYSYMBOL_server_tcp_idle_timeout = 436, /* server_tcp_idle_timeout */
+ YYSYMBOL_server_max_reuse_tcp_queries = 437, /* server_max_reuse_tcp_queries */
+ YYSYMBOL_server_tcp_reuse_timeout = 438, /* server_tcp_reuse_timeout */
+ YYSYMBOL_server_tcp_auth_query_timeout = 439, /* server_tcp_auth_query_timeout */
+ YYSYMBOL_server_tcp_keepalive = 440, /* server_tcp_keepalive */
+ YYSYMBOL_server_tcp_keepalive_timeout = 441, /* server_tcp_keepalive_timeout */
+ YYSYMBOL_server_sock_queue_timeout = 442, /* server_sock_queue_timeout */
+ YYSYMBOL_server_tcp_upstream = 443, /* server_tcp_upstream */
+ YYSYMBOL_server_udp_upstream_without_downstream = 444, /* server_udp_upstream_without_downstream */
+ YYSYMBOL_server_ssl_upstream = 445, /* server_ssl_upstream */
+ YYSYMBOL_server_ssl_service_key = 446, /* server_ssl_service_key */
+ YYSYMBOL_server_ssl_service_pem = 447, /* server_ssl_service_pem */
+ YYSYMBOL_server_ssl_port = 448, /* server_ssl_port */
+ YYSYMBOL_server_tls_cert_bundle = 449, /* server_tls_cert_bundle */
+ YYSYMBOL_server_tls_win_cert = 450, /* server_tls_win_cert */
+ YYSYMBOL_server_tls_additional_port = 451, /* server_tls_additional_port */
+ YYSYMBOL_server_tls_ciphers = 452, /* server_tls_ciphers */
+ YYSYMBOL_server_tls_ciphersuites = 453, /* server_tls_ciphersuites */
+ YYSYMBOL_server_tls_session_ticket_keys = 454, /* server_tls_session_ticket_keys */
+ YYSYMBOL_server_tls_use_sni = 455, /* server_tls_use_sni */
+ YYSYMBOL_server_https_port = 456, /* server_https_port */
+ YYSYMBOL_server_http_endpoint = 457, /* server_http_endpoint */
+ YYSYMBOL_server_http_max_streams = 458, /* server_http_max_streams */
+ YYSYMBOL_server_http_query_buffer_size = 459, /* server_http_query_buffer_size */
+ YYSYMBOL_server_http_response_buffer_size = 460, /* server_http_response_buffer_size */
+ YYSYMBOL_server_http_nodelay = 461, /* server_http_nodelay */
+ YYSYMBOL_server_http_notls_downstream = 462, /* server_http_notls_downstream */
+ YYSYMBOL_server_quic_port = 463, /* server_quic_port */
+ YYSYMBOL_server_quic_size = 464, /* server_quic_size */
+ YYSYMBOL_server_use_systemd = 465, /* server_use_systemd */
+ YYSYMBOL_server_do_daemonize = 466, /* server_do_daemonize */
+ YYSYMBOL_server_use_syslog = 467, /* server_use_syslog */
+ YYSYMBOL_server_log_time_ascii = 468, /* server_log_time_ascii */
+ YYSYMBOL_server_log_time_iso = 469, /* server_log_time_iso */
+ YYSYMBOL_server_log_queries = 470, /* server_log_queries */
+ YYSYMBOL_server_log_replies = 471, /* server_log_replies */
+ YYSYMBOL_server_log_tag_queryreply = 472, /* server_log_tag_queryreply */
+ YYSYMBOL_server_log_servfail = 473, /* server_log_servfail */
+ YYSYMBOL_server_log_destaddr = 474, /* server_log_destaddr */
+ YYSYMBOL_server_log_local_actions = 475, /* server_log_local_actions */
+ YYSYMBOL_server_chroot = 476, /* server_chroot */
+ YYSYMBOL_server_username = 477, /* server_username */
+ YYSYMBOL_server_directory = 478, /* server_directory */
+ YYSYMBOL_server_logfile = 479, /* server_logfile */
+ YYSYMBOL_server_pidfile = 480, /* server_pidfile */
+ YYSYMBOL_server_root_hints = 481, /* server_root_hints */
+ YYSYMBOL_server_dlv_anchor_file = 482, /* server_dlv_anchor_file */
+ YYSYMBOL_server_dlv_anchor = 483, /* server_dlv_anchor */
+ YYSYMBOL_server_auto_trust_anchor_file = 484, /* server_auto_trust_anchor_file */
+ YYSYMBOL_server_trust_anchor_file = 485, /* server_trust_anchor_file */
+ YYSYMBOL_server_trusted_keys_file = 486, /* server_trusted_keys_file */
+ YYSYMBOL_server_trust_anchor = 487, /* server_trust_anchor */
+ YYSYMBOL_server_trust_anchor_signaling = 488, /* server_trust_anchor_signaling */
+ YYSYMBOL_server_root_key_sentinel = 489, /* server_root_key_sentinel */
+ YYSYMBOL_server_domain_insecure = 490, /* server_domain_insecure */
+ YYSYMBOL_server_hide_identity = 491, /* server_hide_identity */
+ YYSYMBOL_server_hide_version = 492, /* server_hide_version */
+ YYSYMBOL_server_hide_trustanchor = 493, /* server_hide_trustanchor */
+ YYSYMBOL_server_hide_http_user_agent = 494, /* server_hide_http_user_agent */
+ YYSYMBOL_server_identity = 495, /* server_identity */
+ YYSYMBOL_server_version = 496, /* server_version */
+ YYSYMBOL_server_http_user_agent = 497, /* server_http_user_agent */
+ YYSYMBOL_server_nsid = 498, /* server_nsid */
+ YYSYMBOL_server_so_rcvbuf = 499, /* server_so_rcvbuf */
+ YYSYMBOL_server_so_sndbuf = 500, /* server_so_sndbuf */
+ YYSYMBOL_server_so_reuseport = 501, /* server_so_reuseport */
+ YYSYMBOL_server_ip_transparent = 502, /* server_ip_transparent */
+ YYSYMBOL_server_ip_freebind = 503, /* server_ip_freebind */
+ YYSYMBOL_server_ip_dscp = 504, /* server_ip_dscp */
+ YYSYMBOL_server_stream_wait_size = 505, /* server_stream_wait_size */
+ YYSYMBOL_server_edns_buffer_size = 506, /* server_edns_buffer_size */
+ YYSYMBOL_server_msg_buffer_size = 507, /* server_msg_buffer_size */
+ YYSYMBOL_server_msg_cache_size = 508, /* server_msg_cache_size */
+ YYSYMBOL_server_msg_cache_slabs = 509, /* server_msg_cache_slabs */
+ YYSYMBOL_server_num_queries_per_thread = 510, /* server_num_queries_per_thread */
+ YYSYMBOL_server_jostle_timeout = 511, /* server_jostle_timeout */
+ YYSYMBOL_server_delay_close = 512, /* server_delay_close */
+ YYSYMBOL_server_udp_connect = 513, /* server_udp_connect */
+ YYSYMBOL_server_unblock_lan_zones = 514, /* server_unblock_lan_zones */
+ YYSYMBOL_server_insecure_lan_zones = 515, /* server_insecure_lan_zones */
+ YYSYMBOL_server_rrset_cache_size = 516, /* server_rrset_cache_size */
+ YYSYMBOL_server_rrset_cache_slabs = 517, /* server_rrset_cache_slabs */
+ YYSYMBOL_server_infra_host_ttl = 518, /* server_infra_host_ttl */
+ YYSYMBOL_server_infra_lame_ttl = 519, /* server_infra_lame_ttl */
+ YYSYMBOL_server_infra_cache_numhosts = 520, /* server_infra_cache_numhosts */
+ YYSYMBOL_server_infra_cache_lame_size = 521, /* server_infra_cache_lame_size */
+ YYSYMBOL_server_infra_cache_slabs = 522, /* server_infra_cache_slabs */
+ YYSYMBOL_server_infra_cache_min_rtt = 523, /* server_infra_cache_min_rtt */
+ YYSYMBOL_server_infra_cache_max_rtt = 524, /* server_infra_cache_max_rtt */
+ YYSYMBOL_server_infra_keep_probing = 525, /* server_infra_keep_probing */
+ YYSYMBOL_server_target_fetch_policy = 526, /* server_target_fetch_policy */
+ YYSYMBOL_server_harden_short_bufsize = 527, /* server_harden_short_bufsize */
+ YYSYMBOL_server_harden_large_queries = 528, /* server_harden_large_queries */
+ YYSYMBOL_server_harden_glue = 529, /* server_harden_glue */
+ YYSYMBOL_server_harden_unverified_glue = 530, /* server_harden_unverified_glue */
+ YYSYMBOL_server_harden_dnssec_stripped = 531, /* server_harden_dnssec_stripped */
+ YYSYMBOL_server_harden_below_nxdomain = 532, /* server_harden_below_nxdomain */
+ YYSYMBOL_server_harden_referral_path = 533, /* server_harden_referral_path */
+ YYSYMBOL_server_harden_algo_downgrade = 534, /* server_harden_algo_downgrade */
+ YYSYMBOL_server_harden_unknown_additional = 535, /* server_harden_unknown_additional */
+ YYSYMBOL_server_use_caps_for_id = 536, /* server_use_caps_for_id */
+ YYSYMBOL_server_caps_whitelist = 537, /* server_caps_whitelist */
+ YYSYMBOL_server_private_address = 538, /* server_private_address */
+ YYSYMBOL_server_private_domain = 539, /* server_private_domain */
+ YYSYMBOL_server_prefetch = 540, /* server_prefetch */
+ YYSYMBOL_server_prefetch_key = 541, /* server_prefetch_key */
+ YYSYMBOL_server_deny_any = 542, /* server_deny_any */
+ YYSYMBOL_server_unwanted_reply_threshold = 543, /* server_unwanted_reply_threshold */
+ YYSYMBOL_server_do_not_query_address = 544, /* server_do_not_query_address */
+ YYSYMBOL_server_do_not_query_localhost = 545, /* server_do_not_query_localhost */
+ YYSYMBOL_server_access_control = 546, /* server_access_control */
+ YYSYMBOL_server_interface_action = 547, /* server_interface_action */
+ YYSYMBOL_server_module_conf = 548, /* server_module_conf */
+ YYSYMBOL_server_val_override_date = 549, /* server_val_override_date */
+ YYSYMBOL_server_val_sig_skew_min = 550, /* server_val_sig_skew_min */
+ YYSYMBOL_server_val_sig_skew_max = 551, /* server_val_sig_skew_max */
+ YYSYMBOL_server_val_max_restart = 552, /* server_val_max_restart */
+ YYSYMBOL_server_cache_max_ttl = 553, /* server_cache_max_ttl */
+ YYSYMBOL_server_cache_max_negative_ttl = 554, /* server_cache_max_negative_ttl */
+ YYSYMBOL_server_cache_min_negative_ttl = 555, /* server_cache_min_negative_ttl */
+ YYSYMBOL_server_cache_min_ttl = 556, /* server_cache_min_ttl */
+ YYSYMBOL_server_bogus_ttl = 557, /* server_bogus_ttl */
+ YYSYMBOL_server_val_clean_additional = 558, /* server_val_clean_additional */
+ YYSYMBOL_server_val_permissive_mode = 559, /* server_val_permissive_mode */
+ YYSYMBOL_server_aggressive_nsec = 560, /* server_aggressive_nsec */
+ YYSYMBOL_server_ignore_cd_flag = 561, /* server_ignore_cd_flag */
+ YYSYMBOL_server_disable_edns_do = 562, /* server_disable_edns_do */
+ YYSYMBOL_server_serve_expired = 563, /* server_serve_expired */
+ YYSYMBOL_server_serve_expired_ttl = 564, /* server_serve_expired_ttl */
+ YYSYMBOL_server_serve_expired_ttl_reset = 565, /* server_serve_expired_ttl_reset */
+ YYSYMBOL_server_serve_expired_reply_ttl = 566, /* server_serve_expired_reply_ttl */
+ YYSYMBOL_server_serve_expired_client_timeout = 567, /* server_serve_expired_client_timeout */
+ YYSYMBOL_server_ede_serve_expired = 568, /* server_ede_serve_expired */
+ YYSYMBOL_server_serve_original_ttl = 569, /* server_serve_original_ttl */
+ YYSYMBOL_server_fake_dsa = 570, /* server_fake_dsa */
+ YYSYMBOL_server_fake_sha1 = 571, /* server_fake_sha1 */
+ YYSYMBOL_server_val_log_level = 572, /* server_val_log_level */
+ YYSYMBOL_server_val_nsec3_keysize_iterations = 573, /* server_val_nsec3_keysize_iterations */
+ YYSYMBOL_server_zonemd_permissive_mode = 574, /* server_zonemd_permissive_mode */
+ YYSYMBOL_server_add_holddown = 575, /* server_add_holddown */
+ YYSYMBOL_server_del_holddown = 576, /* server_del_holddown */
+ YYSYMBOL_server_keep_missing = 577, /* server_keep_missing */
+ YYSYMBOL_server_permit_small_holddown = 578, /* server_permit_small_holddown */
+ YYSYMBOL_server_key_cache_size = 579, /* server_key_cache_size */
+ YYSYMBOL_server_key_cache_slabs = 580, /* server_key_cache_slabs */
+ YYSYMBOL_server_neg_cache_size = 581, /* server_neg_cache_size */
+ YYSYMBOL_server_local_zone = 582, /* server_local_zone */
+ YYSYMBOL_server_local_data = 583, /* server_local_data */
+ YYSYMBOL_server_local_data_ptr = 584, /* server_local_data_ptr */
+ YYSYMBOL_server_minimal_responses = 585, /* server_minimal_responses */
+ YYSYMBOL_server_rrset_roundrobin = 586, /* server_rrset_roundrobin */
+ YYSYMBOL_server_unknown_server_time_limit = 587, /* server_unknown_server_time_limit */
+ YYSYMBOL_server_discard_timeout = 588, /* server_discard_timeout */
+ YYSYMBOL_server_wait_limit = 589, /* server_wait_limit */
+ YYSYMBOL_server_wait_limit_cookie = 590, /* server_wait_limit_cookie */
+ YYSYMBOL_server_wait_limit_netblock = 591, /* server_wait_limit_netblock */
+ YYSYMBOL_server_wait_limit_cookie_netblock = 592, /* server_wait_limit_cookie_netblock */
+ YYSYMBOL_server_max_udp_size = 593, /* server_max_udp_size */
+ YYSYMBOL_server_dns64_prefix = 594, /* server_dns64_prefix */
+ YYSYMBOL_server_dns64_synthall = 595, /* server_dns64_synthall */
+ YYSYMBOL_server_dns64_ignore_aaaa = 596, /* server_dns64_ignore_aaaa */
+ YYSYMBOL_server_nat64_prefix = 597, /* server_nat64_prefix */
+ YYSYMBOL_server_define_tag = 598, /* server_define_tag */
+ YYSYMBOL_server_local_zone_tag = 599, /* server_local_zone_tag */
+ YYSYMBOL_server_access_control_tag = 600, /* server_access_control_tag */
+ YYSYMBOL_server_access_control_tag_action = 601, /* server_access_control_tag_action */
+ YYSYMBOL_server_access_control_tag_data = 602, /* server_access_control_tag_data */
+ YYSYMBOL_server_local_zone_override = 603, /* server_local_zone_override */
+ YYSYMBOL_server_access_control_view = 604, /* server_access_control_view */
+ YYSYMBOL_server_interface_tag = 605, /* server_interface_tag */
+ YYSYMBOL_server_interface_tag_action = 606, /* server_interface_tag_action */
+ YYSYMBOL_server_interface_tag_data = 607, /* server_interface_tag_data */
+ YYSYMBOL_server_interface_view = 608, /* server_interface_view */
+ YYSYMBOL_server_response_ip_tag = 609, /* server_response_ip_tag */
+ YYSYMBOL_server_ip_ratelimit = 610, /* server_ip_ratelimit */
+ YYSYMBOL_server_ip_ratelimit_cookie = 611, /* server_ip_ratelimit_cookie */
+ YYSYMBOL_server_ratelimit = 612, /* server_ratelimit */
+ YYSYMBOL_server_ip_ratelimit_size = 613, /* server_ip_ratelimit_size */
+ YYSYMBOL_server_ratelimit_size = 614, /* server_ratelimit_size */
+ YYSYMBOL_server_ip_ratelimit_slabs = 615, /* server_ip_ratelimit_slabs */
+ YYSYMBOL_server_ratelimit_slabs = 616, /* server_ratelimit_slabs */
+ YYSYMBOL_server_ratelimit_for_domain = 617, /* server_ratelimit_for_domain */
+ YYSYMBOL_server_ratelimit_below_domain = 618, /* server_ratelimit_below_domain */
+ YYSYMBOL_server_ip_ratelimit_factor = 619, /* server_ip_ratelimit_factor */
+ YYSYMBOL_server_ratelimit_factor = 620, /* server_ratelimit_factor */
+ YYSYMBOL_server_ip_ratelimit_backoff = 621, /* server_ip_ratelimit_backoff */
+ YYSYMBOL_server_ratelimit_backoff = 622, /* server_ratelimit_backoff */
+ YYSYMBOL_server_outbound_msg_retry = 623, /* server_outbound_msg_retry */
+ YYSYMBOL_server_max_sent_count = 624, /* server_max_sent_count */
+ YYSYMBOL_server_max_query_restarts = 625, /* server_max_query_restarts */
+ YYSYMBOL_server_low_rtt = 626, /* server_low_rtt */
+ YYSYMBOL_server_fast_server_num = 627, /* server_fast_server_num */
+ YYSYMBOL_server_fast_server_permil = 628, /* server_fast_server_permil */
+ YYSYMBOL_server_qname_minimisation = 629, /* server_qname_minimisation */
+ YYSYMBOL_server_qname_minimisation_strict = 630, /* server_qname_minimisation_strict */
+ YYSYMBOL_server_pad_responses = 631, /* server_pad_responses */
+ YYSYMBOL_server_pad_responses_block_size = 632, /* server_pad_responses_block_size */
+ YYSYMBOL_server_pad_queries = 633, /* server_pad_queries */
+ YYSYMBOL_server_pad_queries_block_size = 634, /* server_pad_queries_block_size */
+ YYSYMBOL_server_ipsecmod_enabled = 635, /* server_ipsecmod_enabled */
+ YYSYMBOL_server_ipsecmod_ignore_bogus = 636, /* server_ipsecmod_ignore_bogus */
+ YYSYMBOL_server_ipsecmod_hook = 637, /* server_ipsecmod_hook */
+ YYSYMBOL_server_ipsecmod_max_ttl = 638, /* server_ipsecmod_max_ttl */
+ YYSYMBOL_server_ipsecmod_whitelist = 639, /* server_ipsecmod_whitelist */
+ YYSYMBOL_server_ipsecmod_strict = 640, /* server_ipsecmod_strict */
+ YYSYMBOL_server_edns_client_string = 641, /* server_edns_client_string */
+ YYSYMBOL_server_edns_client_string_opcode = 642, /* server_edns_client_string_opcode */
+ YYSYMBOL_server_ede = 643, /* server_ede */
+ YYSYMBOL_server_proxy_protocol_port = 644, /* server_proxy_protocol_port */
+ YYSYMBOL_stub_name = 645, /* stub_name */
+ YYSYMBOL_stub_host = 646, /* stub_host */
+ YYSYMBOL_stub_addr = 647, /* stub_addr */
+ YYSYMBOL_stub_first = 648, /* stub_first */
+ YYSYMBOL_stub_no_cache = 649, /* stub_no_cache */
+ YYSYMBOL_stub_ssl_upstream = 650, /* stub_ssl_upstream */
+ YYSYMBOL_stub_tcp_upstream = 651, /* stub_tcp_upstream */
+ YYSYMBOL_stub_prime = 652, /* stub_prime */
+ YYSYMBOL_forward_name = 653, /* forward_name */
+ YYSYMBOL_forward_host = 654, /* forward_host */
+ YYSYMBOL_forward_addr = 655, /* forward_addr */
+ YYSYMBOL_forward_first = 656, /* forward_first */
+ YYSYMBOL_forward_no_cache = 657, /* forward_no_cache */
+ YYSYMBOL_forward_ssl_upstream = 658, /* forward_ssl_upstream */
+ YYSYMBOL_forward_tcp_upstream = 659, /* forward_tcp_upstream */
+ YYSYMBOL_auth_name = 660, /* auth_name */
+ YYSYMBOL_auth_zonefile = 661, /* auth_zonefile */
+ YYSYMBOL_auth_master = 662, /* auth_master */
+ YYSYMBOL_auth_url = 663, /* auth_url */
+ YYSYMBOL_auth_allow_notify = 664, /* auth_allow_notify */
+ YYSYMBOL_auth_zonemd_check = 665, /* auth_zonemd_check */
+ YYSYMBOL_auth_zonemd_reject_absence = 666, /* auth_zonemd_reject_absence */
+ YYSYMBOL_auth_for_downstream = 667, /* auth_for_downstream */
+ YYSYMBOL_auth_for_upstream = 668, /* auth_for_upstream */
+ YYSYMBOL_auth_fallback_enabled = 669, /* auth_fallback_enabled */
+ YYSYMBOL_view_name = 670, /* view_name */
+ YYSYMBOL_view_local_zone = 671, /* view_local_zone */
+ YYSYMBOL_view_response_ip = 672, /* view_response_ip */
+ YYSYMBOL_view_response_ip_data = 673, /* view_response_ip_data */
+ YYSYMBOL_view_local_data = 674, /* view_local_data */
+ YYSYMBOL_view_local_data_ptr = 675, /* view_local_data_ptr */
+ YYSYMBOL_view_first = 676, /* view_first */
+ YYSYMBOL_rcstart = 677, /* rcstart */
+ YYSYMBOL_contents_rc = 678, /* contents_rc */
+ YYSYMBOL_content_rc = 679, /* content_rc */
+ YYSYMBOL_rc_control_enable = 680, /* rc_control_enable */
+ YYSYMBOL_rc_control_port = 681, /* rc_control_port */
+ YYSYMBOL_rc_control_interface = 682, /* rc_control_interface */
+ YYSYMBOL_rc_control_use_cert = 683, /* rc_control_use_cert */
+ YYSYMBOL_rc_server_key_file = 684, /* rc_server_key_file */
+ YYSYMBOL_rc_server_cert_file = 685, /* rc_server_cert_file */
+ YYSYMBOL_rc_control_key_file = 686, /* rc_control_key_file */
+ YYSYMBOL_rc_control_cert_file = 687, /* rc_control_cert_file */
+ YYSYMBOL_dtstart = 688, /* dtstart */
+ YYSYMBOL_contents_dt = 689, /* contents_dt */
+ YYSYMBOL_content_dt = 690, /* content_dt */
+ YYSYMBOL_dt_dnstap_enable = 691, /* dt_dnstap_enable */
+ YYSYMBOL_dt_dnstap_bidirectional = 692, /* dt_dnstap_bidirectional */
+ YYSYMBOL_dt_dnstap_socket_path = 693, /* dt_dnstap_socket_path */
+ YYSYMBOL_dt_dnstap_ip = 694, /* dt_dnstap_ip */
+ YYSYMBOL_dt_dnstap_tls = 695, /* dt_dnstap_tls */
+ YYSYMBOL_dt_dnstap_tls_server_name = 696, /* dt_dnstap_tls_server_name */
+ YYSYMBOL_dt_dnstap_tls_cert_bundle = 697, /* dt_dnstap_tls_cert_bundle */
+ YYSYMBOL_dt_dnstap_tls_client_key_file = 698, /* dt_dnstap_tls_client_key_file */
+ YYSYMBOL_dt_dnstap_tls_client_cert_file = 699, /* dt_dnstap_tls_client_cert_file */
+ YYSYMBOL_dt_dnstap_send_identity = 700, /* dt_dnstap_send_identity */
+ YYSYMBOL_dt_dnstap_send_version = 701, /* dt_dnstap_send_version */
+ YYSYMBOL_dt_dnstap_identity = 702, /* dt_dnstap_identity */
+ YYSYMBOL_dt_dnstap_version = 703, /* dt_dnstap_version */
+ YYSYMBOL_dt_dnstap_log_resolver_query_messages = 704, /* dt_dnstap_log_resolver_query_messages */
+ YYSYMBOL_dt_dnstap_log_resolver_response_messages = 705, /* dt_dnstap_log_resolver_response_messages */
+ YYSYMBOL_dt_dnstap_log_client_query_messages = 706, /* dt_dnstap_log_client_query_messages */
+ YYSYMBOL_dt_dnstap_log_client_response_messages = 707, /* dt_dnstap_log_client_response_messages */
+ YYSYMBOL_dt_dnstap_log_forwarder_query_messages = 708, /* dt_dnstap_log_forwarder_query_messages */
+ YYSYMBOL_dt_dnstap_log_forwarder_response_messages = 709, /* dt_dnstap_log_forwarder_response_messages */
+ YYSYMBOL_dt_dnstap_sample_rate = 710, /* dt_dnstap_sample_rate */
+ YYSYMBOL_pythonstart = 711, /* pythonstart */
+ YYSYMBOL_contents_py = 712, /* contents_py */
+ YYSYMBOL_content_py = 713, /* content_py */
+ YYSYMBOL_py_script = 714, /* py_script */
+ YYSYMBOL_dynlibstart = 715, /* dynlibstart */
+ YYSYMBOL_contents_dl = 716, /* contents_dl */
+ YYSYMBOL_content_dl = 717, /* content_dl */
+ YYSYMBOL_dl_file = 718, /* dl_file */
+ YYSYMBOL_server_disable_dnssec_lame_check = 719, /* server_disable_dnssec_lame_check */
+ YYSYMBOL_server_log_identity = 720, /* server_log_identity */
+ YYSYMBOL_server_response_ip = 721, /* server_response_ip */
+ YYSYMBOL_server_response_ip_data = 722, /* server_response_ip_data */
+ YYSYMBOL_dnscstart = 723, /* dnscstart */
+ YYSYMBOL_contents_dnsc = 724, /* contents_dnsc */
+ YYSYMBOL_content_dnsc = 725, /* content_dnsc */
+ YYSYMBOL_dnsc_dnscrypt_enable = 726, /* dnsc_dnscrypt_enable */
+ YYSYMBOL_dnsc_dnscrypt_port = 727, /* dnsc_dnscrypt_port */
+ YYSYMBOL_dnsc_dnscrypt_provider = 728, /* dnsc_dnscrypt_provider */
+ YYSYMBOL_dnsc_dnscrypt_provider_cert = 729, /* dnsc_dnscrypt_provider_cert */
+ YYSYMBOL_dnsc_dnscrypt_provider_cert_rotated = 730, /* dnsc_dnscrypt_provider_cert_rotated */
+ YYSYMBOL_dnsc_dnscrypt_secret_key = 731, /* dnsc_dnscrypt_secret_key */
+ YYSYMBOL_dnsc_dnscrypt_shared_secret_cache_size = 732, /* dnsc_dnscrypt_shared_secret_cache_size */
+ YYSYMBOL_dnsc_dnscrypt_shared_secret_cache_slabs = 733, /* dnsc_dnscrypt_shared_secret_cache_slabs */
+ YYSYMBOL_dnsc_dnscrypt_nonce_cache_size = 734, /* dnsc_dnscrypt_nonce_cache_size */
+ YYSYMBOL_dnsc_dnscrypt_nonce_cache_slabs = 735, /* dnsc_dnscrypt_nonce_cache_slabs */
+ YYSYMBOL_cachedbstart = 736, /* cachedbstart */
+ YYSYMBOL_contents_cachedb = 737, /* contents_cachedb */
+ YYSYMBOL_content_cachedb = 738, /* content_cachedb */
+ YYSYMBOL_cachedb_backend_name = 739, /* cachedb_backend_name */
+ YYSYMBOL_cachedb_secret_seed = 740, /* cachedb_secret_seed */
+ YYSYMBOL_cachedb_no_store = 741, /* cachedb_no_store */
+ YYSYMBOL_cachedb_check_when_serve_expired = 742, /* cachedb_check_when_serve_expired */
+ YYSYMBOL_redis_server_host = 743, /* redis_server_host */
+ YYSYMBOL_redis_server_port = 744, /* redis_server_port */
+ YYSYMBOL_redis_server_path = 745, /* redis_server_path */
+ YYSYMBOL_redis_server_password = 746, /* redis_server_password */
+ YYSYMBOL_redis_timeout = 747, /* redis_timeout */
+ YYSYMBOL_redis_command_timeout = 748, /* redis_command_timeout */
+ YYSYMBOL_redis_connect_timeout = 749, /* redis_connect_timeout */
+ YYSYMBOL_redis_expire_records = 750, /* redis_expire_records */
+ YYSYMBOL_redis_logical_db = 751, /* redis_logical_db */
+ YYSYMBOL_server_tcp_connection_limit = 752, /* server_tcp_connection_limit */
+ YYSYMBOL_server_answer_cookie = 753, /* server_answer_cookie */
+ YYSYMBOL_server_cookie_secret = 754, /* server_cookie_secret */
+ YYSYMBOL_server_cookie_secret_file = 755, /* server_cookie_secret_file */
+ YYSYMBOL_server_iter_scrub_ns = 756, /* server_iter_scrub_ns */
+ YYSYMBOL_server_iter_scrub_cname = 757, /* server_iter_scrub_cname */
+ YYSYMBOL_server_max_global_quota = 758, /* server_max_global_quota */
+ YYSYMBOL_ipsetstart = 759, /* ipsetstart */
+ YYSYMBOL_contents_ipset = 760, /* contents_ipset */
+ YYSYMBOL_content_ipset = 761, /* content_ipset */
+ YYSYMBOL_ipset_name_v4 = 762, /* ipset_name_v4 */
+ YYSYMBOL_ipset_name_v6 = 763 /* ipset_name_v6 */
};
typedef enum yysymbol_kind_t yysymbol_kind_t;
@@ -1026,18 +1047,12 @@ typedef int yy_state_fast_t;
# define YY_USE(E) /* empty */
#endif
+#if defined __GNUC__ && ! defined __ICC && 407 <= __GNUC__ * 100 + __GNUC_MINOR__
/* Suppress an incorrect diagnostic about yylval being uninitialized. */
-#if defined __GNUC__ && ! defined __ICC && 406 <= __GNUC__ * 100 + __GNUC_MINOR__
-# if __GNUC__ * 100 + __GNUC_MINOR__ < 407
-# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \
- _Pragma ("GCC diagnostic push") \
- _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"")
-# else
-# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \
+# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \
_Pragma ("GCC diagnostic push") \
_Pragma ("GCC diagnostic ignored \"-Wuninitialized\"") \
_Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"")
-# endif
# define YY_IGNORE_MAYBE_UNINITIALIZED_END \
_Pragma ("GCC diagnostic pop")
#else
@@ -1196,19 +1211,19 @@ union yyalloc
/* YYFINAL -- State number of the termination state. */
#define YYFINAL 2
/* YYLAST -- Last index in YYTABLE. */
-#define YYLAST 815
+#define YYLAST 786
/* YYNTOKENS -- Number of terminals. */
-#define YYNTOKENS 359
+#define YYNTOKENS 368
/* YYNNTS -- Number of nonterminals. */
-#define YYNNTS 384
+#define YYNNTS 396
/* YYNRULES -- Number of rules. */
-#define YYNRULES 745
+#define YYNRULES 766
/* YYNSTATES -- Number of states. */
-#define YYNSTATES 1120
+#define YYNSTATES 1147
/* YYMAXUTOK -- Last valid token kind. */
-#define YYMAXUTOK 613
+#define YYMAXUTOK 622
/* YYTRANSLATE(TOKEN-NUM) -- Symbol number corresponding to TOKEN-NUM
@@ -1283,88 +1298,91 @@ static const yytype_int16 yytranslate[] =
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
+ 355, 356, 357, 358, 359, 360, 361, 362, 363, 364,
+ 365, 366, 367
};
#if YYDEBUG
-/* YYRLINE[YYN] -- Source line where rule number YYN was defined. */
+ /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */
static const yytype_int16 yyrline[] =
{
- 0, 211, 211, 211, 212, 212, 213, 213, 214, 214,
- 214, 215, 215, 216, 216, 217, 217, 218, 220, 227,
- 233, 234, 235, 235, 235, 236, 236, 237, 237, 237,
- 238, 238, 238, 239, 239, 239, 240, 240, 241, 242,
- 242, 242, 243, 243, 243, 244, 244, 245, 245, 246,
- 246, 247, 247, 248, 248, 249, 249, 250, 250, 251,
- 251, 252, 252, 252, 253, 253, 254, 254, 254, 255,
- 255, 255, 256, 256, 257, 257, 258, 258, 259, 259,
- 260, 260, 260, 261, 261, 262, 262, 263, 263, 263,
- 264, 264, 265, 265, 266, 266, 267, 267, 267, 268,
- 268, 269, 269, 270, 270, 271, 271, 272, 272, 273,
- 273, 274, 274, 275, 275, 276, 276, 276, 277, 277,
- 277, 278, 278, 278, 279, 279, 279, 279, 280, 281,
- 281, 281, 282, 282, 282, 283, 283, 284, 284, 285,
- 285, 285, 286, 286, 286, 287, 287, 288, 288, 288,
- 289, 290, 290, 290, 291, 291, 291, 292, 292, 293,
- 293, 294, 294, 295, 296, 296, 297, 297, 298, 298,
- 299, 299, 300, 300, 301, 301, 302, 302, 303, 303,
- 304, 304, 305, 305, 306, 307, 307, 308, 308, 308,
- 309, 309, 310, 310, 311, 311, 312, 312, 312, 313,
- 313, 314, 315, 315, 316, 316, 317, 318, 318, 319,
- 319, 320, 320, 320, 321, 321, 322, 322, 322, 323,
- 323, 323, 324, 324, 325, 326, 326, 327, 327, 328,
- 328, 329, 329, 330, 330, 330, 331, 331, 331, 332,
- 332, 332, 333, 333, 334, 334, 334, 335, 335, 336,
- 336, 337, 337, 338, 338, 338, 339, 339, 340, 340,
- 341, 341, 342, 342, 343, 343, 344, 344, 345, 345,
- 346, 346, 348, 362, 364, 370, 370, 370, 370, 370,
- 371, 371, 371, 373, 387, 389, 395, 395, 395, 395,
- 396, 396, 396, 398, 412, 414, 420, 420, 420, 420,
- 421, 421, 421, 423, 444, 445, 446, 446, 446, 446,
- 447, 447, 447, 448, 448, 448, 451, 470, 487, 495,
- 505, 512, 522, 541, 542, 543, 543, 543, 543, 543,
- 544, 544, 544, 545, 545, 545, 545, 547, 556, 565,
- 576, 585, 594, 603, 612, 623, 632, 644, 658, 673,
- 684, 701, 718, 735, 752, 767, 782, 795, 810, 819,
- 828, 837, 846, 855, 864, 871, 880, 889, 898, 907,
- 916, 925, 934, 943, 952, 965, 976, 987, 998, 1007,
- 1020, 1033, 1042, 1051, 1060, 1067, 1074, 1083, 1090, 1099,
- 1107, 1114, 1121, 1129, 1138, 1146, 1162, 1170, 1178, 1186,
- 1194, 1202, 1211, 1220, 1234, 1243, 1252, 1261, 1270, 1279,
- 1288, 1297, 1304, 1311, 1337, 1345, 1352, 1359, 1366, 1373,
- 1381, 1389, 1397, 1404, 1415, 1426, 1433, 1442, 1451, 1460,
- 1469, 1476, 1483, 1490, 1506, 1514, 1522, 1532, 1542, 1552,
- 1566, 1574, 1587, 1598, 1606, 1619, 1628, 1637, 1646, 1655,
- 1665, 1675, 1683, 1696, 1705, 1713, 1722, 1730, 1743, 1752,
- 1761, 1771, 1778, 1788, 1798, 1808, 1818, 1828, 1838, 1848,
- 1858, 1868, 1875, 1882, 1889, 1898, 1907, 1916, 1925, 1932,
- 1942, 1950, 1959, 1966, 1984, 1997, 2010, 2023, 2032, 2041,
- 2050, 2059, 2068, 2078, 2088, 2099, 2108, 2117, 2126, 2135,
- 2144, 2153, 2162, 2171, 2180, 2193, 2206, 2215, 2222, 2231,
- 2240, 2249, 2258, 2268, 2276, 2289, 2297, 2353, 2360, 2375,
- 2385, 2395, 2402, 2409, 2416, 2423, 2438, 2453, 2460, 2467,
- 2476, 2484, 2491, 2505, 2526, 2547, 2559, 2571, 2583, 2592,
- 2613, 2625, 2637, 2646, 2667, 2676, 2685, 2694, 2702, 2710,
- 2723, 2736, 2751, 2766, 2775, 2784, 2794, 2804, 2813, 2822,
- 2831, 2837, 2846, 2855, 2865, 2875, 2885, 2894, 2904, 2913,
- 2926, 2939, 2951, 2965, 2977, 2991, 3000, 3011, 3020, 3027,
- 3037, 3044, 3051, 3060, 3069, 3079, 3089, 3099, 3109, 3116,
- 3123, 3132, 3141, 3151, 3161, 3171, 3178, 3185, 3192, 3200,
- 3210, 3220, 3230, 3240, 3250, 3260, 3316, 3326, 3334, 3342,
- 3357, 3366, 3372, 3373, 3374, 3374, 3374, 3375, 3375, 3375,
- 3376, 3376, 3378, 3388, 3397, 3404, 3411, 3418, 3425, 3432,
- 3439, 3445, 3446, 3447, 3447, 3447, 3448, 3448, 3448, 3449,
- 3450, 3450, 3451, 3451, 3452, 3452, 3453, 3454, 3455, 3456,
- 3457, 3458, 3459, 3461, 3470, 3480, 3487, 3494, 3503, 3510,
- 3517, 3524, 3531, 3540, 3549, 3556, 3563, 3573, 3583, 3593,
- 3603, 3613, 3623, 3634, 3640, 3641, 3642, 3644, 3651, 3657,
- 3658, 3659, 3661, 3668, 3678, 3685, 3694, 3702, 3708, 3709,
- 3711, 3711, 3711, 3712, 3712, 3713, 3714, 3715, 3716, 3717,
- 3719, 3728, 3737, 3744, 3753, 3760, 3769, 3777, 3790, 3798,
- 3811, 3817, 3818, 3819, 3819, 3820, 3820, 3820, 3821, 3821,
- 3821, 3822, 3822, 3822, 3824, 3836, 3848, 3861, 3874, 3886,
- 3901, 3913, 3925, 3938, 3951, 3966, 3977, 3986, 4002, 4009,
- 4015, 4016, 4017, 4017, 4019, 4034
+ 0, 214, 214, 214, 215, 215, 216, 216, 217, 217,
+ 217, 218, 218, 219, 219, 220, 220, 221, 223, 230,
+ 236, 237, 238, 238, 238, 239, 239, 240, 240, 240,
+ 241, 241, 241, 242, 242, 242, 243, 243, 244, 245,
+ 245, 245, 246, 246, 246, 247, 247, 248, 248, 249,
+ 249, 250, 250, 251, 251, 252, 252, 253, 253, 254,
+ 254, 255, 255, 255, 256, 256, 257, 257, 257, 258,
+ 258, 258, 259, 259, 260, 260, 261, 261, 262, 262,
+ 263, 263, 263, 264, 264, 265, 265, 266, 266, 266,
+ 267, 267, 268, 268, 269, 269, 270, 270, 270, 271,
+ 271, 272, 272, 273, 273, 274, 274, 275, 275, 276,
+ 276, 277, 277, 278, 278, 279, 279, 279, 280, 280,
+ 280, 281, 281, 281, 282, 282, 282, 282, 283, 284,
+ 284, 284, 285, 285, 285, 286, 286, 287, 287, 288,
+ 288, 288, 289, 289, 289, 290, 290, 291, 291, 291,
+ 292, 293, 293, 293, 294, 294, 294, 295, 295, 296,
+ 296, 297, 297, 298, 299, 299, 300, 300, 301, 301,
+ 302, 302, 303, 303, 304, 304, 305, 305, 306, 306,
+ 307, 307, 308, 308, 309, 310, 310, 311, 311, 311,
+ 312, 312, 313, 313, 314, 314, 315, 315, 315, 316,
+ 316, 317, 318, 318, 319, 319, 320, 321, 321, 322,
+ 322, 323, 323, 323, 324, 324, 325, 325, 325, 326,
+ 326, 326, 327, 327, 328, 329, 329, 330, 330, 331,
+ 331, 332, 332, 333, 333, 333, 334, 334, 334, 335,
+ 335, 335, 336, 336, 337, 337, 337, 338, 338, 339,
+ 339, 340, 340, 341, 341, 341, 342, 342, 343, 343,
+ 344, 344, 345, 345, 346, 346, 347, 347, 348, 348,
+ 349, 349, 350, 350, 351, 351, 351, 352, 352, 354,
+ 362, 376, 377, 378, 378, 378, 378, 378, 379, 379,
+ 379, 381, 389, 403, 404, 405, 405, 405, 405, 406,
+ 406, 406, 408, 416, 430, 431, 432, 432, 432, 432,
+ 433, 433, 433, 435, 456, 457, 458, 458, 458, 458,
+ 459, 459, 459, 460, 460, 460, 463, 482, 499, 507,
+ 517, 524, 534, 553, 554, 555, 555, 555, 555, 555,
+ 556, 556, 556, 557, 557, 557, 557, 559, 568, 577,
+ 588, 597, 606, 615, 624, 635, 644, 656, 670, 685,
+ 696, 713, 730, 747, 764, 779, 794, 807, 822, 831,
+ 840, 849, 858, 867, 876, 883, 892, 901, 910, 919,
+ 928, 937, 946, 955, 964, 977, 988, 999, 1010, 1019,
+ 1032, 1045, 1054, 1063, 1072, 1079, 1086, 1095, 1102, 1111,
+ 1119, 1126, 1133, 1141, 1150, 1158, 1174, 1182, 1190, 1198,
+ 1206, 1214, 1227, 1234, 1243, 1252, 1266, 1275, 1284, 1293,
+ 1302, 1311, 1320, 1329, 1338, 1345, 1352, 1378, 1386, 1393,
+ 1400, 1407, 1414, 1422, 1430, 1438, 1445, 1456, 1467, 1474,
+ 1483, 1492, 1501, 1510, 1517, 1524, 1531, 1547, 1555, 1563,
+ 1573, 1583, 1593, 1607, 1615, 1628, 1639, 1647, 1660, 1669,
+ 1678, 1687, 1696, 1706, 1716, 1724, 1737, 1746, 1754, 1763,
+ 1771, 1784, 1793, 1802, 1812, 1819, 1829, 1839, 1849, 1859,
+ 1869, 1879, 1889, 1899, 1909, 1919, 1926, 1933, 1940, 1949,
+ 1958, 1967, 1976, 1983, 1993, 2001, 2010, 2017, 2035, 2048,
+ 2061, 2074, 2083, 2092, 2101, 2110, 2119, 2129, 2139, 2150,
+ 2159, 2168, 2177, 2186, 2195, 2204, 2213, 2222, 2231, 2244,
+ 2257, 2266, 2273, 2282, 2291, 2300, 2309, 2319, 2327, 2340,
+ 2348, 2404, 2411, 2426, 2436, 2446, 2453, 2460, 2467, 2474,
+ 2489, 2504, 2511, 2518, 2527, 2535, 2542, 2556, 2577, 2598,
+ 2610, 2622, 2634, 2643, 2664, 2676, 2688, 2697, 2718, 2727,
+ 2736, 2745, 2753, 2761, 2774, 2787, 2802, 2817, 2826, 2835,
+ 2845, 2855, 2864, 2873, 2882, 2888, 2897, 2906, 2916, 2926,
+ 2936, 2945, 2955, 2964, 2977, 2990, 3002, 3016, 3028, 3042,
+ 3051, 3062, 3071, 3078, 3088, 3095, 3102, 3111, 3120, 3130,
+ 3140, 3150, 3160, 3167, 3174, 3183, 3192, 3202, 3212, 3222,
+ 3229, 3236, 3243, 3251, 3261, 3271, 3281, 3291, 3301, 3311,
+ 3367, 3377, 3385, 3393, 3408, 3417, 3423, 3424, 3425, 3425,
+ 3425, 3426, 3426, 3426, 3427, 3427, 3429, 3439, 3448, 3455,
+ 3462, 3469, 3476, 3483, 3490, 3496, 3497, 3498, 3498, 3498,
+ 3499, 3499, 3499, 3500, 3501, 3501, 3502, 3502, 3503, 3503,
+ 3504, 3505, 3506, 3507, 3508, 3509, 3510, 3512, 3521, 3531,
+ 3538, 3545, 3554, 3561, 3568, 3575, 3582, 3591, 3600, 3607,
+ 3614, 3624, 3634, 3644, 3654, 3664, 3674, 3685, 3691, 3692,
+ 3693, 3695, 3702, 3708, 3709, 3710, 3712, 3719, 3729, 3736,
+ 3745, 3753, 3759, 3760, 3762, 3762, 3762, 3763, 3763, 3764,
+ 3765, 3766, 3767, 3768, 3770, 3779, 3788, 3795, 3804, 3811,
+ 3820, 3828, 3841, 3849, 3862, 3868, 3869, 3870, 3870, 3871,
+ 3871, 3871, 3872, 3872, 3872, 3873, 3873, 3873, 3874, 3874,
+ 3876, 3888, 3900, 3913, 3926, 3938, 3953, 3965, 3977, 3990,
+ 4003, 4016, 4029, 4044, 4055, 4064, 4080, 4087, 4096, 4105,
+ 4114, 4120, 4121, 4122, 4122, 4124, 4139
};
#endif
@@ -1494,6 +1512,7 @@ static const char *const yytname[] =
"VAR_CACHEDB_REDISPORT", "VAR_CACHEDB_REDISTIMEOUT",
"VAR_CACHEDB_REDISEXPIRERECORDS", "VAR_CACHEDB_REDISPATH",
"VAR_CACHEDB_REDISPASSWORD", "VAR_CACHEDB_REDISLOGICALDB",
+ "VAR_CACHEDB_REDISCOMMANDTIMEOUT", "VAR_CACHEDB_REDISCONNECTTIMEOUT",
"VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM", "VAR_FOR_UPSTREAM",
"VAR_AUTH_ZONE", "VAR_ZONEFILE", "VAR_MASTER", "VAR_URL",
"VAR_FOR_DOWNSTREAM", "VAR_FALLBACK_ENABLED", "VAR_TLS_ADDITIONAL_PORT",
@@ -1515,21 +1534,25 @@ static const char *const yytname[] =
"VAR_ZONEMD_REJECT_ABSENCE", "VAR_RPZ_SIGNAL_NXDOMAIN_RA",
"VAR_INTERFACE_AUTOMATIC_PORTS", "VAR_EDE", "VAR_INTERFACE_ACTION",
"VAR_INTERFACE_VIEW", "VAR_INTERFACE_TAG", "VAR_INTERFACE_TAG_ACTION",
- "VAR_INTERFACE_TAG_DATA", "VAR_PROXY_PROTOCOL_PORT",
- "VAR_STATISTICS_INHIBIT_ZERO", "VAR_HARDEN_UNKNOWN_ADDITIONAL",
- "VAR_DISABLE_EDNS_DO", "VAR_CACHEDB_NO_STORE", "VAR_LOG_DESTADDR",
+ "VAR_INTERFACE_TAG_DATA", "VAR_QUIC_PORT", "VAR_QUIC_SIZE",
+ "VAR_PROXY_PROTOCOL_PORT", "VAR_STATISTICS_INHIBIT_ZERO",
+ "VAR_HARDEN_UNKNOWN_ADDITIONAL", "VAR_DISABLE_EDNS_DO",
+ "VAR_CACHEDB_NO_STORE", "VAR_LOG_DESTADDR",
"VAR_CACHEDB_CHECK_WHEN_SERVE_EXPIRED", "VAR_COOKIE_SECRET_FILE",
- "$accept", "toplevelvars", "toplevelvar", "force_toplevel",
- "serverstart", "contents_server", "content_server", "stubstart",
- "contents_stub", "content_stub", "forwardstart", "contents_forward",
- "content_forward", "viewstart", "contents_view", "content_view",
- "authstart", "contents_auth", "content_auth", "rpz_tag",
- "rpz_action_override", "rpz_cname_override", "rpz_log", "rpz_log_name",
- "rpz_signal_nxdomain_ra", "rpzstart", "contents_rpz", "content_rpz",
- "server_num_threads", "server_verbosity", "server_statistics_interval",
- "server_statistics_cumulative", "server_extended_statistics",
- "server_statistics_inhibit_zero", "server_shm_enable", "server_shm_key",
- "server_port", "server_send_client_subnet", "server_client_subnet_zone",
+ "VAR_ITER_SCRUB_NS", "VAR_ITER_SCRUB_CNAME", "VAR_MAX_GLOBAL_QUOTA",
+ "VAR_HARDEN_UNVERIFIED_GLUE", "VAR_LOG_TIME_ISO", "$accept",
+ "toplevelvars", "toplevelvar", "force_toplevel", "serverstart",
+ "contents_server", "content_server", "stub_clause", "stubstart",
+ "contents_stub", "content_stub", "forward_clause", "forwardstart",
+ "contents_forward", "content_forward", "view_clause", "viewstart",
+ "contents_view", "content_view", "authstart", "contents_auth",
+ "content_auth", "rpz_tag", "rpz_action_override", "rpz_cname_override",
+ "rpz_log", "rpz_log_name", "rpz_signal_nxdomain_ra", "rpzstart",
+ "contents_rpz", "content_rpz", "server_num_threads", "server_verbosity",
+ "server_statistics_interval", "server_statistics_cumulative",
+ "server_extended_statistics", "server_statistics_inhibit_zero",
+ "server_shm_enable", "server_shm_key", "server_port",
+ "server_send_client_subnet", "server_client_subnet_zone",
"server_client_subnet_always_forward", "server_client_subnet_opcode",
"server_max_client_subnet_ipv4", "server_max_client_subnet_ipv6",
"server_min_client_subnet_ipv4", "server_min_client_subnet_ipv6",
@@ -1553,8 +1576,9 @@ static const char *const yytname[] =
"server_https_port", "server_http_endpoint", "server_http_max_streams",
"server_http_query_buffer_size", "server_http_response_buffer_size",
"server_http_nodelay", "server_http_notls_downstream",
- "server_use_systemd", "server_do_daemonize", "server_use_syslog",
- "server_log_time_ascii", "server_log_queries", "server_log_replies",
+ "server_quic_port", "server_quic_size", "server_use_systemd",
+ "server_do_daemonize", "server_use_syslog", "server_log_time_ascii",
+ "server_log_time_iso", "server_log_queries", "server_log_replies",
"server_log_tag_queryreply", "server_log_servfail",
"server_log_destaddr", "server_log_local_actions", "server_chroot",
"server_username", "server_directory", "server_logfile",
@@ -1579,15 +1603,15 @@ static const char *const yytname[] =
"server_infra_cache_min_rtt", "server_infra_cache_max_rtt",
"server_infra_keep_probing", "server_target_fetch_policy",
"server_harden_short_bufsize", "server_harden_large_queries",
- "server_harden_glue", "server_harden_dnssec_stripped",
- "server_harden_below_nxdomain", "server_harden_referral_path",
- "server_harden_algo_downgrade", "server_harden_unknown_additional",
- "server_use_caps_for_id", "server_caps_whitelist",
- "server_private_address", "server_private_domain", "server_prefetch",
- "server_prefetch_key", "server_deny_any",
- "server_unwanted_reply_threshold", "server_do_not_query_address",
- "server_do_not_query_localhost", "server_access_control",
- "server_interface_action", "server_module_conf",
+ "server_harden_glue", "server_harden_unverified_glue",
+ "server_harden_dnssec_stripped", "server_harden_below_nxdomain",
+ "server_harden_referral_path", "server_harden_algo_downgrade",
+ "server_harden_unknown_additional", "server_use_caps_for_id",
+ "server_caps_whitelist", "server_private_address",
+ "server_private_domain", "server_prefetch", "server_prefetch_key",
+ "server_deny_any", "server_unwanted_reply_threshold",
+ "server_do_not_query_address", "server_do_not_query_localhost",
+ "server_access_control", "server_interface_action", "server_module_conf",
"server_val_override_date", "server_val_sig_skew_min",
"server_val_sig_skew_max", "server_val_max_restart",
"server_cache_max_ttl", "server_cache_max_negative_ttl",
@@ -1672,10 +1696,13 @@ static const char *const yytname[] =
"cachedb_backend_name", "cachedb_secret_seed", "cachedb_no_store",
"cachedb_check_when_serve_expired", "redis_server_host",
"redis_server_port", "redis_server_path", "redis_server_password",
- "redis_timeout", "redis_expire_records", "redis_logical_db",
+ "redis_timeout", "redis_command_timeout", "redis_connect_timeout",
+ "redis_expire_records", "redis_logical_db",
"server_tcp_connection_limit", "server_answer_cookie",
- "server_cookie_secret", "server_cookie_secret_file", "ipsetstart",
- "contents_ipset", "content_ipset", "ipset_name_v4", "ipset_name_v6", YY_NULLPTR
+ "server_cookie_secret", "server_cookie_secret_file",
+ "server_iter_scrub_ns", "server_iter_scrub_cname",
+ "server_max_global_quota", "ipsetstart", "contents_ipset",
+ "content_ipset", "ipset_name_v4", "ipset_name_v6", YY_NULLPTR
};
static const char *
@@ -1685,7 +1712,52 @@ yysymbol_name (yysymbol_kind_t yysymbol)
}
#endif
-#define YYPACT_NINF (-293)
+#ifdef YYPRINT
+/* YYTOKNUM[NUM] -- (External) token number corresponding to the
+ (internal) symbol number NUM (which must be that of a token). */
+static const yytype_int16 yytoknum[] =
+{
+ 0, 256, 257, 258, 259, 260, 261, 262, 263, 264,
+ 265, 266, 267, 268, 269, 270, 271, 272, 273, 274,
+ 275, 276, 277, 278, 279, 280, 281, 282, 283, 284,
+ 285, 286, 287, 288, 289, 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,
+ 505, 506, 507, 508, 509, 510, 511, 512, 513, 514,
+ 515, 516, 517, 518, 519, 520, 521, 522, 523, 524,
+ 525, 526, 527, 528, 529, 530, 531, 532, 533, 534,
+ 535, 536, 537, 538, 539, 540, 541, 542, 543, 544,
+ 545, 546, 547, 548, 549, 550, 551, 552, 553, 554,
+ 555, 556, 557, 558, 559, 560, 561, 562, 563, 564,
+ 565, 566, 567, 568, 569, 570, 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, 598, 599, 600, 601, 602, 603, 604,
+ 605, 606, 607, 608, 609, 610, 611, 612, 613, 614,
+ 615, 616, 617, 618, 619, 620, 621, 622
+};
+#endif
+
+#define YYPACT_NINF (-302)
#define yypact_value_is_default(Yyn) \
((Yyn) == YYPACT_NINF)
@@ -1695,139 +1767,138 @@ yysymbol_name (yysymbol_kind_t yysymbol)
#define yytable_value_is_error(Yyn) \
0
-/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
- STATE-NUM. */
+ /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
+ STATE-NUM. */
static const yytype_int16 yypact[] =
{
- -293, 268, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- 201, 226, 237, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -13, 26, 27, 31, 32, 33, 83, 89,
- 94, -293, 201, -293, -293, -293, -293, -293, -293, -293,
- -293, 121, 122, 123, 125, 126, 134, 160, -293, 226,
- -293, -293, -293, -293, -293, -293, -293, 161, 162, 163,
- 164, 165, 166, 167, -293, 237, -293, -293, -293, -293,
- -293, -293, -293, 112, 56, -14, 282, 61, -157, -101,
- 135, -292, 215, 217, 239, 242, 243, 244, 245, 246,
- 247, 259, 260, 261, 262, 264, 265, 266, 267, 273,
- 275, 278, 281, 287, 288, 302, 304, 307, 308, 309,
- 313, 318, 319, 320, 332, 334, 338, 344, 345, 346,
- 347, 349, 351, 352, 353, 354, 355, 357, 358, 359,
- 361, 363, 364, 366, 367, 368, 369, 370, 371, 372,
- 373, 375, 381, 382, 383, 384, 385, 386, 387, 388,
- 390, 391, 392, 393, 395, 401, 402, 403, 404, 405,
- 416, 417, 418, 419, 420, 423, 424, 425, 426, 427,
- 428, 429, 431, 432, 433, 434, 435, 436, 437, 438,
- 439, 440, 441, 442, 465, 466, 468, 469, 470, 471,
- 472, 473, 474, 475, 476, 477, 478, 479, 481, 483,
- 484, 485, 486, 487, 488, 489, 490, 491, 492, 493,
- 494, 495, 497, 498, 499, 500, 501, 503, 504, 505,
+ -302, 270, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -13, 309, 221, 236, 97,
+ 84, 148, -14, -81, -301, 182, 122, -294, 31, 32,
+ 33, 75, 76, 77, 78, 79, 80, 81, 82, 83,
+ 89, 93, 94, 123, 125, 126, 169, 215, 217, 245,
+ 246, 247, 259, 261, 262, 263, 264, 265, 268, 269,
+ 274, 275, 276, 277, 280, 283, 289, 290, 304, 305,
+ 306, 311, 312, 313, 315, 320, 321, 322, 338, 345,
+ 347, 350, 351, 352, 353, 354, 356, 359, 361, 362,
+ 363, 364, 365, 366, 367, 368, 369, 374, 375, 377,
+ 378, 379, 382, 388, 389, 390, 391, 392, 405, 412,
+ 413, 414, 415, 416, 417, 418, 422, 423, 424, 425,
+ 426, 427, 428, 429, 443, 445, 446, 448, 449, 450,
+ 451, 452, 453, 454, 455, 457, 458, 459, 460, 461,
+ 462, 463, 464, 465, 467, 468, 469, 470, 472, 474,
+ 475, 476, 477, 478, 479, 480, 481, 482, 483, 484,
+ 485, 486, 487, 488, 489, 490, 491, 492, 493, 494,
+ 495, 496, 497, 499, 500, 501, 502, 503, 504, 505,
506, 507, 508, 509, 510, 511, 512, 513, 514, 515,
- 516, 517, 519, 520, 521, 522, 523, 524, 525, 527,
+ 516, 517, 518, 519, 521, 522, 524, 525, 526, 527,
528, 529, 530, 531, 532, 533, 534, 535, 536, 537,
- 538, 540, 541, 542, 543, 544, 545, 546, 547, 548,
- 549, 550, 552, 553, 554, 555, 556, 557, 558, 559,
+ 538, 539, 540, 542, 543, 544, 545, 546, 547, 548,
+ 549, 550, 551, 552, 553, 554, 556, 557, 558, 559,
560, 561, 562, 563, 564, 565, 566, 567, 568, 569,
570, 571, 572, 573, 574, 575, 576, 577, 578, 579,
- 580, 581, 582, 584, 585, 586, 588, 589, 590, 591,
- 592, 594, 595, 596, 597, 598, 599, 600, 601, 602,
- 603, 604, 605, 606, 607, 608, 609, 610, 611, 612,
- 613, 614, 615, 616, 617, 618, 619, 620, 621, 622,
- 623, 624, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, 625, -293, -293, 626, 627, -293, -293, 628, 629,
- 630, 631, 632, 633, 634, 635, 636, 637, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, 638,
- 639, 640, 641, 642, 643, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, 644, 645,
- 646, 647, 648, 649, 650, 651, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, 652, 653, 654, 655, 656,
- 657, 658, 659, 660, 661, 662, 663, 664, 665, 666,
- 667, 668, 669, 670, 671, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, 672, -293, -293, 673,
- -293, -293, 674, 675, 676, 677, 678, 679, 680, 681,
- 682, 683, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, 684, 685, 686, 687, 688, 689, 690,
- 691, 692, 693, 694, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, 695, 696, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, 697, 698, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, 699, 700, 701, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, 702, 703, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, 704, 705, 706, 707, 708,
- 709, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, 710, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, 711, 712, -293,
- -293, -293, -293, -293, 713, -293, -293, -293, -293, -293,
- 714, 715, 716, 717, 718, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, 719, 720, 721, -293, -293, -293, -293, -293,
- -293, -293, -293, 722, 723, -293, -293, -293, -293, -293
+ 580, 581, 582, 583, 584, 585, 586, 588, 589, 590,
+ 592, 593, 594, 595, 596, 598, 599, 600, 601, 602,
+ 603, 604, 605, 606, 607, 608, 609, 610, 611, 613,
+ 614, 615, 616, 617, 618, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, 619, 620, 621, 622, 623, 624, 625,
+ 626, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ 627, 628, 629, 630, 631, 632, 633, -302, -302, -302,
+ -302, -302, -302, -302, -302, 634, 635, 636, 637, 638,
+ 639, 640, -302, -302, -302, -302, -302, -302, -302, -302,
+ 641, 642, 643, 644, 645, 646, 647, 648, 649, 650,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, 651, 652, 653, 654, 655, 656, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ 657, 658, 659, 660, 661, 662, 663, 664, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, 665, 666, 667,
+ 668, 669, 670, 671, 672, 673, 674, 675, 676, 677,
+ 678, 679, 680, 681, 682, 683, 684, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, 685, -302,
+ -302, 686, -302, -302, 687, 688, 689, 690, 691, 692,
+ 693, 694, 695, 696, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, 697, 698, 699, 700, 701,
+ 702, 703, 704, 705, 706, 707, 708, 709, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, 710, 711, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, 712,
+ 713, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, 714, 715, 716, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, 717, 718, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, 719, 720, 721, 722, 723, 724, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, 725, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, 726, 727, -302, -302, -302, -302, -302,
+ 728, -302, -302, -302, -302, -302, 729, 730, 731, 732,
+ 733, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ 734, -302, -302, 735, 736, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, 737, 738, 739, -302,
+ -302, -302, -302, -302, -302, -302, -302, 740, 741, -302,
+ -302, -302, -302, -302, -302, -302, -302
};
-/* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
- Performed when YYTABLE does not specify something else to do. Zero
- means the default is an error. */
+ /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
+ Performed when YYTABLE does not specify something else to do. Zero
+ means the default is an error. */
static const yytype_int16 yydefact[] =
{
- 2, 0, 1, 18, 19, 272, 283, 611, 673, 630,
- 293, 687, 710, 303, 739, 322, 678, 3, 17, 21,
- 274, 285, 295, 305, 324, 613, 632, 675, 680, 689,
- 712, 741, 4, 0, 0, 0, 0, 0, 0, 0,
- 0, 5, 274, 275, 276, 277, 279, 280, 281, 282,
- 278, 0, 0, 0, 0, 0, 0, 0, 6, 285,
- 286, 287, 288, 289, 290, 291, 292, 0, 0, 0,
- 0, 0, 0, 0, 10, 295, 296, 297, 300, 301,
- 298, 302, 299, 14, 15, 8, 9, 7, 16, 11,
- 12, 13, 0, 0, 0, 0, 0, 0, 0, 0,
+ 2, 0, 1, 18, 19, 280, 292, 625, 687, 644,
+ 303, 701, 724, 313, 760, 332, 692, 3, 17, 21,
+ 5, 282, 6, 294, 10, 305, 315, 334, 627, 646,
+ 689, 694, 703, 726, 762, 4, 279, 291, 302, 14,
+ 15, 8, 9, 7, 16, 11, 12, 13, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -1852,136 +1923,148 @@ static const yytype_int16 yydefact[] =
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 20, 22, 23, 90, 93, 102, 267, 219,
- 220, 24, 172, 173, 174, 175, 176, 177, 178, 179,
- 180, 181, 39, 81, 25, 94, 95, 50, 74, 89,
- 264, 26, 27, 28, 31, 32, 29, 30, 33, 34,
- 35, 261, 262, 263, 36, 37, 38, 126, 231, 127,
- 129, 130, 131, 233, 238, 234, 250, 251, 252, 256,
- 132, 133, 134, 135, 136, 137, 138, 215, 91, 80,
- 106, 124, 125, 243, 240, 270, 128, 40, 41, 42,
- 43, 44, 82, 96, 97, 113, 68, 78, 69, 223,
- 224, 107, 60, 61, 222, 64, 62, 63, 65, 259,
- 117, 121, 142, 154, 187, 157, 249, 118, 75, 45,
- 46, 47, 104, 143, 144, 145, 146, 48, 49, 51,
- 52, 54, 55, 53, 151, 152, 158, 56, 57, 58,
- 66, 85, 122, 99, 153, 268, 92, 182, 100, 101,
- 119, 120, 241, 105, 59, 83, 86, 196, 67, 70,
- 108, 109, 110, 84, 183, 184, 111, 71, 72, 73,
- 232, 123, 269, 206, 207, 208, 209, 210, 211, 212,
- 213, 221, 112, 79, 260, 114, 115, 116, 185, 76,
- 77, 98, 87, 88, 103, 139, 140, 242, 244, 245,
- 246, 247, 248, 141, 147, 148, 149, 150, 188, 189,
- 191, 193, 194, 192, 195, 198, 199, 200, 197, 216,
- 155, 255, 156, 161, 162, 159, 160, 163, 164, 166,
- 165, 168, 167, 169, 170, 171, 235, 237, 236, 186,
- 201, 202, 203, 204, 205, 225, 227, 226, 228, 229,
- 230, 257, 258, 265, 266, 190, 214, 217, 218, 239,
- 253, 254, 271, 579, 580, 581, 586, 584, 585, 582,
- 583, 273, 587, 588, 589, 590, 592, 593, 591, 284,
- 604, 0, 608, 609, 0, 0, 610, 294, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 304, 306,
- 307, 308, 309, 313, 314, 315, 310, 311, 312, 0,
- 0, 0, 0, 0, 0, 327, 331, 332, 333, 334,
- 335, 323, 325, 326, 328, 329, 330, 336, 0, 0,
- 0, 0, 0, 0, 0, 0, 612, 614, 616, 615,
- 621, 617, 618, 619, 620, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 20, 22, 23, 90, 93,
+ 102, 269, 219, 220, 24, 172, 173, 174, 175, 176,
+ 177, 178, 179, 180, 181, 39, 81, 25, 94, 95,
+ 50, 74, 89, 266, 26, 27, 28, 31, 32, 29,
+ 30, 33, 34, 35, 261, 262, 263, 36, 37, 38,
+ 126, 231, 127, 129, 130, 131, 233, 238, 234, 250,
+ 251, 252, 256, 132, 133, 134, 135, 136, 137, 138,
+ 264, 265, 215, 91, 80, 106, 278, 124, 125, 243,
+ 240, 272, 128, 40, 41, 42, 43, 44, 82, 96,
+ 97, 113, 68, 78, 69, 223, 224, 107, 60, 61,
+ 222, 64, 62, 63, 65, 259, 117, 121, 142, 154,
+ 187, 157, 249, 118, 75, 45, 46, 47, 104, 143,
+ 144, 145, 146, 48, 49, 51, 52, 54, 55, 53,
+ 151, 152, 158, 56, 57, 58, 66, 277, 85, 122,
+ 99, 153, 270, 92, 182, 100, 101, 119, 120, 241,
+ 105, 59, 83, 86, 196, 67, 70, 108, 109, 110,
+ 84, 183, 184, 111, 71, 72, 73, 232, 123, 271,
+ 206, 207, 208, 209, 210, 211, 212, 213, 221, 112,
+ 79, 260, 114, 115, 116, 185, 76, 77, 98, 87,
+ 88, 103, 139, 140, 242, 244, 245, 246, 247, 248,
+ 141, 147, 148, 149, 150, 188, 189, 191, 193, 194,
+ 192, 195, 198, 199, 200, 197, 216, 155, 255, 156,
+ 161, 162, 159, 160, 163, 164, 166, 165, 168, 167,
+ 169, 170, 171, 235, 237, 236, 186, 201, 202, 203,
+ 204, 205, 225, 227, 226, 228, 229, 230, 257, 258,
+ 267, 268, 190, 214, 217, 218, 239, 253, 254, 273,
+ 274, 275, 276, 0, 0, 0, 0, 0, 0, 0,
+ 0, 281, 283, 284, 285, 287, 288, 289, 290, 286,
+ 0, 0, 0, 0, 0, 0, 0, 293, 295, 296,
+ 297, 298, 299, 300, 301, 0, 0, 0, 0, 0,
+ 0, 0, 304, 306, 307, 310, 311, 308, 312, 309,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 631, 633, 635, 634, 636,
- 637, 638, 639, 640, 641, 642, 643, 644, 645, 646,
- 647, 648, 649, 650, 651, 652, 0, 674, 676, 0,
- 679, 681, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 688, 690, 691, 692, 694, 695, 693, 696,
- 697, 698, 699, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 711, 713, 714, 721, 723, 715,
- 716, 719, 720, 717, 718, 722, 0, 0, 740, 742,
- 743, 338, 337, 345, 358, 356, 370, 365, 366, 367,
- 371, 368, 369, 372, 373, 374, 378, 379, 380, 411,
- 412, 413, 414, 415, 443, 444, 445, 451, 452, 361,
- 453, 454, 457, 455, 456, 461, 462, 463, 478, 426,
- 427, 430, 431, 464, 482, 420, 422, 483, 491, 492,
- 493, 362, 442, 513, 514, 421, 507, 403, 357, 416,
- 479, 487, 465, 0, 0, 517, 363, 339, 402, 470,
- 340, 359, 360, 417, 418, 515, 467, 472, 473, 376,
- 375, 341, 518, 446, 477, 404, 425, 484, 485, 486,
- 490, 506, 419, 511, 509, 510, 434, 441, 474, 475,
- 435, 436, 466, 495, 405, 406, 410, 381, 383, 377,
- 384, 385, 386, 387, 394, 395, 396, 397, 398, 399,
- 400, 519, 520, 527, 447, 448, 449, 450, 458, 459,
- 460, 528, 529, 530, 531, 0, 0, 0, 468, 437,
- 439, 683, 544, 549, 547, 546, 550, 548, 557, 558,
- 559, 0, 0, 553, 554, 555, 556, 346, 347, 348,
- 349, 350, 351, 352, 353, 354, 355, 471, 488, 512,
- 489, 563, 564, 438, 532, 0, 0, 0, 0, 0,
- 0, 497, 498, 499, 500, 501, 502, 503, 504, 505,
- 684, 428, 429, 432, 423, 494, 401, 343, 344, 424,
- 565, 566, 567, 568, 569, 571, 570, 572, 573, 574,
- 382, 389, 560, 562, 561, 388, 0, 736, 737, 545,
- 408, 476, 521, 407, 522, 523, 524, 0, 0, 440,
- 390, 391, 393, 392, 0, 576, 433, 508, 364, 577,
- 0, 0, 0, 0, 0, 578, 342, 469, 496, 409,
- 738, 605, 606, 607, 594, 602, 595, 596, 597, 601,
- 603, 598, 599, 600, 316, 317, 318, 319, 320, 321,
- 622, 624, 623, 626, 627, 628, 629, 625, 653, 655,
- 656, 657, 658, 659, 660, 661, 662, 663, 654, 664,
- 665, 666, 667, 668, 669, 670, 671, 672, 677, 682,
- 700, 701, 702, 705, 703, 704, 706, 707, 708, 709,
- 724, 725, 728, 729, 732, 733, 730, 731, 734, 726,
- 727, 744, 745, 480, 516, 543, 685, 686, 551, 552,
- 533, 534, 0, 0, 0, 538, 735, 525, 526, 575,
- 481, 542, 539, 0, 0, 537, 535, 536, 540, 541
+ 314, 316, 317, 318, 319, 323, 324, 325, 320, 321,
+ 322, 0, 0, 0, 0, 0, 0, 337, 341, 342,
+ 343, 344, 345, 333, 335, 336, 338, 339, 340, 346,
+ 0, 0, 0, 0, 0, 0, 0, 0, 626, 628,
+ 630, 629, 635, 631, 632, 633, 634, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 645, 647, 649,
+ 648, 650, 651, 652, 653, 654, 655, 656, 657, 658,
+ 659, 660, 661, 662, 663, 664, 665, 666, 0, 688,
+ 690, 0, 693, 695, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 702, 704, 705, 706, 708, 709,
+ 707, 710, 711, 712, 713, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 725, 727,
+ 728, 735, 737, 729, 730, 733, 734, 731, 738, 739,
+ 732, 736, 0, 0, 761, 763, 764, 348, 347, 355,
+ 368, 366, 380, 375, 376, 377, 381, 378, 379, 382,
+ 383, 384, 388, 389, 390, 424, 425, 426, 427, 428,
+ 456, 457, 458, 464, 465, 371, 466, 467, 470, 468,
+ 469, 474, 475, 476, 492, 439, 440, 443, 444, 477,
+ 496, 433, 435, 497, 505, 506, 507, 372, 455, 527,
+ 528, 434, 521, 415, 367, 429, 493, 501, 479, 0,
+ 0, 531, 373, 349, 414, 484, 350, 369, 370, 430,
+ 431, 529, 481, 486, 487, 386, 385, 351, 532, 459,
+ 491, 416, 438, 498, 499, 500, 504, 520, 432, 525,
+ 523, 524, 447, 454, 488, 489, 448, 449, 480, 509,
+ 418, 419, 423, 391, 393, 387, 394, 395, 396, 397,
+ 404, 405, 406, 407, 408, 409, 410, 533, 534, 541,
+ 460, 461, 462, 463, 471, 472, 473, 542, 543, 544,
+ 545, 0, 0, 0, 482, 450, 452, 697, 558, 563,
+ 561, 560, 564, 562, 571, 572, 573, 0, 0, 567,
+ 568, 569, 570, 356, 357, 358, 359, 360, 361, 362,
+ 363, 364, 365, 485, 502, 526, 503, 577, 578, 451,
+ 546, 0, 0, 0, 0, 0, 0, 511, 512, 513,
+ 514, 515, 516, 517, 518, 519, 698, 441, 442, 445,
+ 436, 508, 413, 353, 354, 437, 579, 580, 581, 582,
+ 583, 585, 584, 586, 587, 588, 392, 399, 574, 576,
+ 575, 398, 0, 754, 755, 559, 421, 490, 535, 420,
+ 536, 537, 538, 0, 0, 453, 400, 401, 403, 402,
+ 0, 590, 446, 522, 374, 591, 0, 0, 0, 0,
+ 0, 411, 412, 592, 352, 483, 510, 422, 756, 757,
+ 758, 759, 478, 417, 593, 594, 595, 600, 598, 599,
+ 596, 597, 601, 602, 603, 604, 606, 607, 605, 618,
+ 0, 622, 623, 0, 0, 624, 608, 616, 609, 610,
+ 611, 615, 617, 612, 613, 614, 326, 327, 328, 329,
+ 330, 331, 636, 638, 637, 640, 641, 642, 643, 639,
+ 667, 669, 670, 671, 672, 673, 674, 675, 676, 677,
+ 668, 678, 679, 680, 681, 682, 683, 684, 685, 686,
+ 691, 696, 714, 715, 716, 719, 717, 718, 720, 721,
+ 722, 723, 740, 741, 744, 745, 748, 751, 746, 747,
+ 752, 749, 750, 742, 743, 765, 766, 494, 530, 557,
+ 699, 700, 565, 566, 547, 548, 0, 0, 0, 552,
+ 753, 539, 540, 589, 495, 556, 553, 0, 0, 619,
+ 620, 621, 551, 549, 550, 554, 555
};
-/* YYPGOTO[NTERM-NUM]. */
+ /* YYPGOTO[NTERM-NUM]. */
static const yytype_int16 yypgoto[] =
{
- -293, -293, -293, -293, -293, -293, -293, -293, 205, -293,
- -293, 724, -293, -293, 725, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, 726, 727, 728, 729, 730,
- -293, -293, 731, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293, -293, -293, -293, -293, -293, -293,
- -293, -293, -293, -293
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, 92, 742, 743, 744, 745, -302, -302, 746,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302, -302, -302, -302, -302,
+ -302, -302, -302, -302, -302, -302
};
-/* YYDEFGOTO[NTERM-NUM]. */
+ /* YYDEFGOTO[NTERM-NUM]. */
static const yytype_int16 yydefgoto[] =
{
- 0, 1, 17, 18, 19, 32, 342, 20, 41, 42,
- 21, 58, 59, 22, 74, 75, 23, 83, 628, 645,
- 646, 647, 648, 649, 650, 24, 84, 651, 343, 344,
+ 0, 1, 17, 18, 19, 35, 305, 20, 21, 36,
+ 571, 22, 23, 37, 587, 24, 25, 38, 602, 26,
+ 39, 620, 637, 638, 639, 640, 641, 642, 27, 40,
+ 643, 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,
@@ -2002,111 +2085,105 @@ static const yytype_int16 yydefgoto[] =
515, 516, 517, 518, 519, 520, 521, 522, 523, 524,
525, 526, 527, 528, 529, 530, 531, 532, 533, 534,
535, 536, 537, 538, 539, 540, 541, 542, 543, 544,
- 545, 546, 547, 548, 549, 550, 551, 552, 553, 554,
- 555, 556, 557, 558, 559, 560, 561, 562, 563, 564,
- 565, 566, 567, 568, 569, 570, 571, 572, 573, 574,
- 575, 576, 577, 578, 579, 580, 581, 582, 583, 584,
- 43, 44, 45, 46, 47, 48, 49, 50, 60, 61,
- 62, 63, 64, 65, 66, 629, 630, 631, 632, 633,
- 634, 635, 636, 637, 638, 76, 77, 78, 79, 80,
- 81, 82, 25, 85, 666, 667, 668, 669, 670, 671,
- 672, 673, 674, 26, 86, 695, 696, 697, 698, 699,
- 700, 701, 702, 703, 704, 705, 706, 707, 708, 709,
- 710, 711, 712, 713, 714, 715, 27, 87, 717, 718,
- 28, 88, 720, 721, 585, 586, 587, 588, 29, 89,
- 732, 733, 734, 735, 736, 737, 738, 739, 740, 741,
- 742, 30, 90, 754, 755, 756, 757, 758, 759, 760,
- 761, 762, 763, 764, 765, 589, 590, 591, 592, 31,
- 91, 768, 769, 770
+ 545, 546, 547, 548, 549, 550, 551, 572, 573, 574,
+ 575, 576, 577, 578, 579, 588, 589, 590, 591, 592,
+ 593, 594, 621, 622, 623, 624, 625, 626, 627, 628,
+ 629, 630, 603, 604, 605, 606, 607, 608, 609, 28,
+ 41, 658, 659, 660, 661, 662, 663, 664, 665, 666,
+ 29, 42, 687, 688, 689, 690, 691, 692, 693, 694,
+ 695, 696, 697, 698, 699, 700, 701, 702, 703, 704,
+ 705, 706, 707, 30, 43, 709, 710, 31, 44, 712,
+ 713, 552, 553, 554, 555, 32, 45, 724, 725, 726,
+ 727, 728, 729, 730, 731, 732, 733, 734, 33, 46,
+ 748, 749, 750, 751, 752, 753, 754, 755, 756, 757,
+ 758, 759, 760, 761, 556, 557, 558, 559, 560, 561,
+ 562, 34, 47, 764, 765, 766
};
-/* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If
- positive, shift that token. If negative, reduce the rule whose
- number is the opposite. If YYTABLE_NINF, syntax error. */
+ /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If
+ positive, shift that token. If negative, reduce the rule whose
+ number is the opposite. If YYTABLE_NINF, syntax error. */
static const yytype_int16 yytable[] =
{
- 92, 93, 94, 95, 96, 97, 98, 99, 100, 101,
- 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
- 112, 113, 114, 115, 116, 117, 118, 119, 120, 121,
- 122, 123, 124, 125, 766, 767, 593, 594, 126, 127,
- 128, 595, 596, 597, 129, 130, 131, 132, 133, 134,
- 135, 136, 137, 138, 139, 140, 141, 142, 143, 144,
- 145, 146, 147, 148, 149, 150, 151, 152, 153, 154,
- 155, 156, 157, 158, 159, 160, 161, 162, 163, 164,
- 165, 166, 167, 168, 169, 658, 659, 660, 661, 662,
- 663, 664, 665, 598, 170, 171, 172, 173, 174, 599,
- 175, 176, 177, 618, 600, 178, 179, 180, 181, 182,
- 183, 184, 185, 186, 187, 188, 189, 190, 191, 192,
- 193, 194, 195, 196, 197, 198, 199, 200, 201, 202,
- 203, 602, 603, 604, 204, 605, 606, 205, 206, 207,
- 208, 209, 210, 211, 607, 212, 213, 214, 215, 216,
- 217, 218, 219, 220, 221, 222, 223, 224, 225, 618,
- 722, 723, 724, 725, 726, 727, 728, 729, 730, 731,
- 608, 610, 611, 612, 613, 614, 615, 616, 716, 719,
- 226, 227, 228, 229, 230, 231, 232, 233, 234, 235,
- 236, 237, 238, 239, 240, 241, 242, 243, 244, 245,
- 246, 247, 248, 249, 250, 251, 252, 253, 254, 255,
- 256, 257, 258, 259, 260, 261, 262, 263, 264, 265,
- 266, 267, 268, 269, 270, 771, 271, 772, 272, 273,
- 274, 275, 276, 277, 278, 279, 280, 281, 282, 283,
- 284, 285, 286, 287, 288, 289, 290, 601, 33, 773,
- 34, 35, 774, 775, 776, 777, 778, 779, 291, 292,
- 293, 294, 295, 296, 297, 298, 299, 300, 2, 780,
- 781, 782, 783, 51, 784, 785, 786, 787, 301, 3,
- 4, 52, 53, 788, 67, 789, 302, 303, 790, 304,
- 305, 791, 306, 307, 308, 309, 310, 792, 793, 311,
- 312, 313, 314, 315, 316, 317, 318, 319, 320, 321,
- 322, 323, 794, 36, 795, 324, 5, 796, 797, 798,
- 68, 69, 6, 799, 325, 326, 327, 328, 800, 801,
- 802, 329, 330, 331, 332, 333, 334, 335, 336, 337,
- 338, 339, 803, 340, 804, 341, 37, 70, 805, 38,
- 620, 621, 622, 623, 806, 807, 808, 809, 39, 810,
- 625, 811, 812, 813, 814, 815, 7, 816, 817, 818,
- 54, 819, 55, 820, 821, 56, 822, 823, 824, 825,
- 826, 827, 828, 829, 8, 830, 639, 640, 641, 642,
- 643, 831, 832, 833, 834, 835, 836, 837, 838, 644,
- 839, 840, 841, 842, 619, 843, 620, 621, 622, 623,
- 624, 844, 845, 846, 847, 848, 625, 743, 744, 745,
- 746, 747, 748, 749, 750, 751, 849, 850, 851, 852,
- 853, 71, 72, 854, 855, 856, 857, 858, 859, 860,
- 9, 861, 862, 863, 864, 865, 866, 867, 868, 869,
- 870, 871, 872, 626, 627, 675, 676, 677, 678, 679,
- 680, 681, 682, 683, 684, 685, 686, 687, 688, 689,
- 690, 691, 692, 693, 694, 873, 874, 73, 875, 876,
- 877, 878, 879, 880, 881, 882, 883, 884, 885, 886,
- 752, 887, 753, 888, 889, 890, 891, 892, 893, 894,
- 895, 896, 897, 898, 899, 900, 10, 901, 902, 903,
- 904, 905, 40, 906, 907, 908, 909, 910, 911, 912,
- 913, 914, 915, 916, 917, 918, 919, 920, 11, 921,
- 922, 923, 924, 925, 926, 927, 57, 928, 929, 930,
- 931, 932, 933, 934, 935, 936, 937, 938, 939, 12,
- 940, 941, 942, 943, 944, 945, 946, 947, 948, 949,
- 950, 13, 951, 952, 953, 954, 955, 956, 957, 958,
- 959, 960, 961, 962, 963, 964, 965, 966, 967, 968,
+ 48, 49, 50, 51, 52, 53, 54, 55, 56, 57,
+ 58, 59, 60, 61, 62, 63, 64, 65, 66, 67,
+ 68, 69, 70, 71, 72, 73, 74, 75, 76, 77,
+ 78, 79, 80, 81, 762, 763, 708, 711, 82, 83,
+ 84, 767, 768, 769, 85, 86, 87, 88, 89, 90,
+ 91, 92, 93, 94, 95, 96, 97, 98, 99, 100,
+ 101, 102, 103, 104, 105, 106, 107, 108, 109, 110,
+ 111, 112, 113, 114, 115, 116, 117, 118, 119, 120,
+ 121, 122, 123, 124, 125, 770, 771, 772, 773, 774,
+ 775, 776, 777, 778, 126, 127, 128, 129, 130, 779,
+ 131, 132, 133, 780, 781, 134, 135, 136, 137, 138,
+ 139, 140, 141, 142, 143, 144, 145, 146, 147, 148,
+ 149, 150, 151, 152, 153, 154, 155, 156, 157, 158,
+ 159, 610, 644, 782, 160, 783, 784, 161, 162, 163,
+ 164, 165, 166, 167, 610, 168, 169, 170, 171, 172,
+ 173, 174, 175, 176, 177, 178, 179, 180, 181, 667,
+ 668, 669, 670, 671, 672, 673, 674, 675, 676, 677,
+ 678, 679, 680, 681, 682, 683, 684, 685, 686, 785,
+ 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,
+ 192, 193, 194, 195, 196, 197, 198, 199, 200, 201,
+ 202, 203, 204, 205, 206, 207, 208, 209, 210, 211,
+ 212, 213, 214, 215, 216, 217, 218, 219, 220, 221,
+ 222, 223, 224, 225, 226, 786, 227, 787, 228, 229,
+ 230, 231, 232, 233, 234, 235, 236, 237, 238, 239,
+ 240, 241, 242, 243, 244, 245, 246, 650, 651, 652,
+ 653, 654, 655, 656, 657, 788, 789, 790, 247, 248,
+ 249, 250, 251, 252, 253, 254, 255, 256, 580, 791,
+ 2, 792, 793, 794, 795, 796, 581, 582, 797, 798,
+ 257, 3, 4, 595, 799, 800, 801, 802, 258, 259,
+ 803, 260, 261, 804, 262, 263, 264, 265, 266, 805,
+ 806, 267, 268, 269, 270, 271, 272, 273, 274, 275,
+ 276, 277, 278, 279, 807, 808, 809, 280, 5, 596,
+ 597, 810, 811, 812, 6, 813, 281, 282, 283, 284,
+ 814, 815, 816, 285, 286, 287, 288, 289, 290, 291,
+ 292, 293, 294, 295, 296, 297, 598, 298, 817, 299,
+ 300, 301, 302, 303, 304, 818, 563, 819, 564, 565,
+ 820, 821, 822, 823, 824, 583, 825, 584, 7, 826,
+ 585, 827, 828, 829, 830, 831, 832, 833, 834, 835,
+ 612, 613, 614, 615, 836, 837, 8, 838, 839, 840,
+ 617, 611, 841, 612, 613, 614, 615, 616, 842, 843,
+ 844, 845, 846, 617, 735, 736, 737, 738, 739, 740,
+ 741, 742, 743, 744, 745, 847, 631, 632, 633, 634,
+ 635, 566, 848, 849, 850, 851, 852, 853, 854, 636,
+ 599, 600, 855, 856, 857, 858, 859, 860, 861, 862,
+ 618, 619, 9, 714, 715, 716, 717, 718, 719, 720,
+ 721, 722, 723, 863, 567, 864, 865, 568, 866, 867,
+ 868, 869, 870, 871, 872, 873, 569, 874, 875, 876,
+ 877, 878, 879, 880, 881, 882, 601, 883, 884, 885,
+ 886, 746, 887, 747, 888, 889, 890, 891, 892, 893,
+ 894, 895, 896, 897, 898, 899, 900, 901, 902, 903,
+ 904, 905, 906, 907, 908, 909, 910, 911, 10, 912,
+ 913, 914, 915, 916, 917, 918, 919, 920, 921, 922,
+ 923, 924, 925, 926, 927, 928, 929, 930, 931, 932,
+ 11, 933, 934, 586, 935, 936, 937, 938, 939, 940,
+ 941, 942, 943, 944, 945, 946, 947, 948, 949, 950,
+ 951, 12, 952, 953, 954, 955, 956, 957, 958, 959,
+ 960, 961, 962, 963, 964, 13, 965, 966, 967, 968,
969, 970, 971, 972, 973, 974, 975, 976, 977, 978,
- 979, 980, 981, 14, 982, 983, 984, 15, 985, 986,
- 987, 988, 989, 16, 990, 991, 992, 993, 994, 995,
- 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005,
+ 979, 980, 981, 982, 983, 984, 985, 986, 987, 988,
+ 989, 990, 991, 992, 993, 994, 995, 14, 996, 997,
+ 998, 15, 999, 1000, 1001, 1002, 1003, 16, 1004, 1005,
1006, 1007, 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015,
- 1016, 1017, 1018, 1019, 1020, 1021, 1022, 1023, 1024, 1025,
- 1026, 1027, 1028, 1029, 1030, 1031, 1032, 1033, 1034, 1035,
- 1036, 1037, 1038, 1039, 1040, 1041, 1042, 1043, 1044, 1045,
- 1046, 1047, 1048, 1049, 1050, 1051, 1052, 1053, 1054, 1055,
- 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1065,
- 1066, 1067, 1068, 1069, 1070, 1071, 1072, 1073, 1074, 1075,
- 1076, 1077, 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085,
- 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095,
- 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, 1104, 1105,
- 1106, 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1114, 1115,
- 1116, 1117, 1118, 1119, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1016, 1017, 570, 1018, 1019, 1020, 1021, 1022, 1023, 1024,
+ 1025, 1026, 1027, 1028, 1029, 1030, 1031, 1032, 1033, 1034,
+ 1035, 1036, 1037, 1038, 1039, 1040, 1041, 1042, 1043, 1044,
+ 1045, 1046, 1047, 1048, 1049, 1050, 1051, 1052, 1053, 1054,
+ 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064,
+ 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 1073, 1074,
+ 1075, 1076, 1077, 1078, 1079, 1080, 1081, 1082, 1083, 1084,
+ 1085, 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094,
+ 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, 1104,
+ 1105, 1106, 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1114,
+ 1115, 1116, 1117, 1118, 1119, 1120, 1121, 1122, 1123, 1124,
+ 1125, 1126, 1127, 1128, 1129, 1130, 1131, 1132, 1133, 1134,
+ 1135, 1136, 1137, 1138, 1139, 1140, 1141, 1142, 1143, 1144,
+ 1145, 1146, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 609, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 617, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 652, 653, 654, 655, 656, 657
+ 0, 0, 645, 646, 647, 648, 649
};
static const yytype_int16 yycheck[] =
@@ -2114,67 +2191,66 @@ static const yytype_int16 yycheck[] =
13, 14, 15, 16, 17, 18, 19, 20, 21, 22,
23, 24, 25, 26, 27, 28, 29, 30, 31, 32,
33, 34, 35, 36, 37, 38, 39, 40, 41, 42,
- 43, 44, 45, 46, 326, 327, 10, 10, 51, 52,
+ 43, 44, 45, 46, 328, 329, 117, 338, 51, 52,
53, 10, 10, 10, 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, 84, 85, 86, 87, 88, 89, 90, 91, 92,
- 93, 94, 95, 96, 97, 99, 100, 101, 102, 103,
- 104, 105, 106, 10, 107, 108, 109, 110, 111, 10,
- 113, 114, 115, 47, 10, 118, 119, 120, 121, 122,
+ 93, 94, 95, 96, 97, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 107, 108, 109, 110, 111, 10,
+ 113, 114, 115, 10, 10, 118, 119, 120, 121, 122,
123, 124, 125, 126, 127, 128, 129, 130, 131, 132,
133, 134, 135, 136, 137, 138, 139, 140, 141, 142,
- 143, 10, 10, 10, 147, 10, 10, 150, 151, 152,
- 153, 154, 155, 156, 10, 158, 159, 160, 161, 162,
- 163, 164, 165, 166, 167, 168, 169, 170, 171, 47,
- 261, 262, 263, 264, 265, 266, 267, 268, 269, 270,
- 10, 10, 10, 10, 10, 10, 10, 10, 117, 336,
+ 143, 47, 40, 10, 147, 10, 10, 150, 151, 152,
+ 153, 154, 155, 156, 47, 158, 159, 160, 161, 162,
+ 163, 164, 165, 166, 167, 168, 169, 170, 171, 173,
+ 174, 175, 176, 177, 178, 179, 180, 181, 182, 183,
+ 184, 185, 186, 187, 188, 189, 190, 191, 192, 10,
193, 194, 195, 196, 197, 198, 199, 200, 201, 202,
203, 204, 205, 206, 207, 208, 209, 210, 211, 212,
213, 214, 215, 216, 217, 218, 219, 220, 221, 222,
223, 224, 225, 226, 227, 228, 229, 230, 231, 232,
233, 234, 235, 236, 237, 10, 239, 10, 241, 242,
243, 244, 245, 246, 247, 248, 249, 250, 251, 252,
- 253, 254, 255, 256, 257, 258, 259, 42, 47, 10,
- 49, 50, 10, 10, 10, 10, 10, 10, 271, 272,
- 273, 274, 275, 276, 277, 278, 279, 280, 0, 10,
- 10, 10, 10, 47, 10, 10, 10, 10, 291, 11,
- 12, 55, 56, 10, 47, 10, 299, 300, 10, 302,
- 303, 10, 305, 306, 307, 308, 309, 10, 10, 312,
- 313, 314, 315, 316, 317, 318, 319, 320, 321, 322,
- 323, 324, 10, 112, 10, 328, 48, 10, 10, 10,
- 83, 84, 54, 10, 337, 338, 339, 340, 10, 10,
- 10, 344, 345, 346, 347, 348, 349, 350, 351, 352,
- 353, 354, 10, 356, 10, 358, 145, 110, 10, 148,
- 294, 295, 296, 297, 10, 10, 10, 10, 157, 10,
- 304, 10, 10, 10, 10, 10, 98, 10, 10, 10,
- 144, 10, 146, 10, 10, 149, 10, 10, 10, 10,
- 10, 10, 10, 10, 116, 10, 330, 331, 332, 333,
- 334, 10, 10, 10, 10, 10, 10, 10, 10, 343,
- 10, 10, 10, 10, 292, 10, 294, 295, 296, 297,
- 298, 10, 10, 10, 10, 10, 304, 282, 283, 284,
- 285, 286, 287, 288, 289, 290, 10, 10, 10, 10,
- 10, 194, 195, 10, 10, 10, 10, 10, 10, 10,
- 172, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 341, 342, 173, 174, 175, 176, 177,
- 178, 179, 180, 181, 182, 183, 184, 185, 186, 187,
- 188, 189, 190, 191, 192, 10, 10, 240, 10, 10,
+ 253, 254, 255, 256, 257, 258, 259, 99, 100, 101,
+ 102, 103, 104, 105, 106, 10, 10, 10, 271, 272,
+ 273, 274, 275, 276, 277, 278, 279, 280, 47, 10,
+ 0, 10, 10, 10, 10, 10, 55, 56, 10, 10,
+ 293, 11, 12, 47, 10, 10, 10, 10, 301, 302,
+ 10, 304, 305, 10, 307, 308, 309, 310, 311, 10,
+ 10, 314, 315, 316, 317, 318, 319, 320, 321, 322,
+ 323, 324, 325, 326, 10, 10, 10, 330, 48, 83,
+ 84, 10, 10, 10, 54, 10, 339, 340, 341, 342,
+ 10, 10, 10, 346, 347, 348, 349, 350, 351, 352,
+ 353, 354, 355, 356, 357, 358, 110, 360, 10, 362,
+ 363, 364, 365, 366, 367, 10, 47, 10, 49, 50,
+ 10, 10, 10, 10, 10, 144, 10, 146, 98, 10,
+ 149, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 296, 297, 298, 299, 10, 10, 116, 10, 10, 10,
+ 306, 294, 10, 296, 297, 298, 299, 300, 10, 10,
+ 10, 10, 10, 306, 282, 283, 284, 285, 286, 287,
+ 288, 289, 290, 291, 292, 10, 332, 333, 334, 335,
+ 336, 112, 10, 10, 10, 10, 10, 10, 10, 345,
+ 194, 195, 10, 10, 10, 10, 10, 10, 10, 10,
+ 343, 344, 172, 261, 262, 263, 264, 265, 266, 267,
+ 268, 269, 270, 10, 145, 10, 10, 148, 10, 10,
+ 10, 10, 10, 10, 10, 10, 157, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 240, 10, 10, 10,
+ 10, 359, 10, 361, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 355, 10, 357, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 238, 10, 10, 10,
- 10, 10, 311, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 260, 10,
- 10, 10, 10, 10, 10, 10, 310, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 281,
+ 10, 10, 10, 10, 10, 10, 10, 10, 238, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 293, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 260, 10, 10, 312, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 325, 10, 10, 10, 329, 10, 10,
- 10, 10, 10, 335, 10, 10, 10, 10, 10, 10,
+ 10, 281, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 295, 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, 327, 10, 10,
+ 10, 331, 10, 10, 10, 10, 10, 337, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 313, 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,
@@ -2184,99 +2260,97 @@ 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, 10, 10, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 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, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, 59, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- 75, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- 84, 84, 84, 84, 84, 84
+ -1, -1, 40, 40, 40, 40, 40
};
-/* YYSTOS[STATE-NUM] -- The symbol kind of the accessing symbol of
- state STATE-NUM. */
+ /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
+ symbol of state STATE-NUM. */
static const yytype_int16 yystos[] =
{
- 0, 360, 0, 11, 12, 48, 54, 98, 116, 172,
- 238, 260, 281, 293, 325, 329, 335, 361, 362, 363,
- 366, 369, 372, 375, 384, 661, 672, 695, 699, 707,
- 720, 738, 364, 47, 49, 50, 112, 145, 148, 157,
- 311, 367, 368, 629, 630, 631, 632, 633, 634, 635,
- 636, 47, 55, 56, 144, 146, 149, 310, 370, 371,
- 637, 638, 639, 640, 641, 642, 643, 47, 83, 84,
- 110, 194, 195, 240, 373, 374, 654, 655, 656, 657,
- 658, 659, 660, 376, 385, 662, 673, 696, 700, 708,
- 721, 739, 13, 14, 15, 16, 17, 18, 19, 20,
- 21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
- 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
- 41, 42, 43, 44, 45, 46, 51, 52, 53, 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, 84, 85, 86, 87,
- 88, 89, 90, 91, 92, 93, 94, 95, 96, 97,
- 107, 108, 109, 110, 111, 113, 114, 115, 118, 119,
- 120, 121, 122, 123, 124, 125, 126, 127, 128, 129,
- 130, 131, 132, 133, 134, 135, 136, 137, 138, 139,
- 140, 141, 142, 143, 147, 150, 151, 152, 153, 154,
- 155, 156, 158, 159, 160, 161, 162, 163, 164, 165,
- 166, 167, 168, 169, 170, 171, 193, 194, 195, 196,
- 197, 198, 199, 200, 201, 202, 203, 204, 205, 206,
- 207, 208, 209, 210, 211, 212, 213, 214, 215, 216,
- 217, 218, 219, 220, 221, 222, 223, 224, 225, 226,
- 227, 228, 229, 230, 231, 232, 233, 234, 235, 236,
- 237, 239, 241, 242, 243, 244, 245, 246, 247, 248,
- 249, 250, 251, 252, 253, 254, 255, 256, 257, 258,
- 259, 271, 272, 273, 274, 275, 276, 277, 278, 279,
- 280, 291, 299, 300, 302, 303, 305, 306, 307, 308,
- 309, 312, 313, 314, 315, 316, 317, 318, 319, 320,
- 321, 322, 323, 324, 328, 337, 338, 339, 340, 344,
- 345, 346, 347, 348, 349, 350, 351, 352, 353, 354,
- 356, 358, 365, 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, 505, 506, 507, 508, 509, 510, 511, 512, 513,
- 514, 515, 516, 517, 518, 519, 520, 521, 522, 523,
- 524, 525, 526, 527, 528, 529, 530, 531, 532, 533,
- 534, 535, 536, 537, 538, 539, 540, 541, 542, 543,
- 544, 545, 546, 547, 548, 549, 550, 551, 552, 553,
- 554, 555, 556, 557, 558, 559, 560, 561, 562, 563,
- 564, 565, 566, 567, 568, 569, 570, 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, 598, 599, 600, 601, 602, 603,
- 604, 605, 606, 607, 608, 609, 610, 611, 612, 613,
- 614, 615, 616, 617, 618, 619, 620, 621, 622, 623,
- 624, 625, 626, 627, 628, 703, 704, 705, 706, 734,
- 735, 736, 737, 10, 10, 10, 10, 10, 10, 10,
- 10, 367, 10, 10, 10, 10, 10, 10, 10, 370,
- 10, 10, 10, 10, 10, 10, 10, 373, 47, 292,
- 294, 295, 296, 297, 298, 304, 341, 342, 377, 644,
- 645, 646, 647, 648, 649, 650, 651, 652, 653, 330,
- 331, 332, 333, 334, 343, 378, 379, 380, 381, 382,
- 383, 386, 644, 645, 646, 647, 648, 651, 99, 100,
- 101, 102, 103, 104, 105, 106, 663, 664, 665, 666,
- 667, 668, 669, 670, 671, 173, 174, 175, 176, 177,
- 178, 179, 180, 181, 182, 183, 184, 185, 186, 187,
- 188, 189, 190, 191, 192, 674, 675, 676, 677, 678,
- 679, 680, 681, 682, 683, 684, 685, 686, 687, 688,
- 689, 690, 691, 692, 693, 694, 117, 697, 698, 336,
- 701, 702, 261, 262, 263, 264, 265, 266, 267, 268,
- 269, 270, 709, 710, 711, 712, 713, 714, 715, 716,
- 717, 718, 719, 282, 283, 284, 285, 286, 287, 288,
- 289, 290, 355, 357, 722, 723, 724, 725, 726, 727,
- 728, 729, 730, 731, 732, 733, 326, 327, 740, 741,
- 742, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 0, 369, 0, 11, 12, 48, 54, 98, 116, 172,
+ 238, 260, 281, 295, 327, 331, 337, 370, 371, 372,
+ 375, 376, 379, 380, 383, 384, 387, 396, 677, 688,
+ 711, 715, 723, 736, 759, 373, 377, 381, 385, 388,
+ 397, 678, 689, 712, 716, 724, 737, 760, 13, 14,
+ 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
+ 25, 26, 27, 28, 29, 30, 31, 32, 33, 34,
+ 35, 36, 37, 38, 39, 40, 41, 42, 43, 44,
+ 45, 46, 51, 52, 53, 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, 84, 85, 86, 87, 88, 89, 90, 91,
+ 92, 93, 94, 95, 96, 97, 107, 108, 109, 110,
+ 111, 113, 114, 115, 118, 119, 120, 121, 122, 123,
+ 124, 125, 126, 127, 128, 129, 130, 131, 132, 133,
+ 134, 135, 136, 137, 138, 139, 140, 141, 142, 143,
+ 147, 150, 151, 152, 153, 154, 155, 156, 158, 159,
+ 160, 161, 162, 163, 164, 165, 166, 167, 168, 169,
+ 170, 171, 193, 194, 195, 196, 197, 198, 199, 200,
+ 201, 202, 203, 204, 205, 206, 207, 208, 209, 210,
+ 211, 212, 213, 214, 215, 216, 217, 218, 219, 220,
+ 221, 222, 223, 224, 225, 226, 227, 228, 229, 230,
+ 231, 232, 233, 234, 235, 236, 237, 239, 241, 242,
+ 243, 244, 245, 246, 247, 248, 249, 250, 251, 252,
+ 253, 254, 255, 256, 257, 258, 259, 271, 272, 273,
+ 274, 275, 276, 277, 278, 279, 280, 293, 301, 302,
+ 304, 305, 307, 308, 309, 310, 311, 314, 315, 316,
+ 317, 318, 319, 320, 321, 322, 323, 324, 325, 326,
+ 330, 339, 340, 341, 342, 346, 347, 348, 349, 350,
+ 351, 352, 353, 354, 355, 356, 357, 358, 360, 362,
+ 363, 364, 365, 366, 367, 374, 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, 505, 506, 507, 508, 509, 510, 511, 512,
+ 513, 514, 515, 516, 517, 518, 519, 520, 521, 522,
+ 523, 524, 525, 526, 527, 528, 529, 530, 531, 532,
+ 533, 534, 535, 536, 537, 538, 539, 540, 541, 542,
+ 543, 544, 545, 546, 547, 548, 549, 550, 551, 552,
+ 553, 554, 555, 556, 557, 558, 559, 560, 561, 562,
+ 563, 564, 565, 566, 567, 568, 569, 570, 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, 598, 599, 600, 601, 602,
+ 603, 604, 605, 606, 607, 608, 609, 610, 611, 612,
+ 613, 614, 615, 616, 617, 618, 619, 620, 621, 622,
+ 623, 624, 625, 626, 627, 628, 629, 630, 631, 632,
+ 633, 634, 635, 636, 637, 638, 639, 640, 641, 642,
+ 643, 644, 719, 720, 721, 722, 752, 753, 754, 755,
+ 756, 757, 758, 47, 49, 50, 112, 145, 148, 157,
+ 313, 378, 645, 646, 647, 648, 649, 650, 651, 652,
+ 47, 55, 56, 144, 146, 149, 312, 382, 653, 654,
+ 655, 656, 657, 658, 659, 47, 83, 84, 110, 194,
+ 195, 240, 386, 670, 671, 672, 673, 674, 675, 676,
+ 47, 294, 296, 297, 298, 299, 300, 306, 343, 344,
+ 389, 660, 661, 662, 663, 664, 665, 666, 667, 668,
+ 669, 332, 333, 334, 335, 336, 345, 390, 391, 392,
+ 393, 394, 395, 398, 660, 661, 662, 663, 664, 667,
+ 99, 100, 101, 102, 103, 104, 105, 106, 679, 680,
+ 681, 682, 683, 684, 685, 686, 687, 173, 174, 175,
+ 176, 177, 178, 179, 180, 181, 182, 183, 184, 185,
+ 186, 187, 188, 189, 190, 191, 192, 690, 691, 692,
+ 693, 694, 695, 696, 697, 698, 699, 700, 701, 702,
+ 703, 704, 705, 706, 707, 708, 709, 710, 117, 713,
+ 714, 338, 717, 718, 261, 262, 263, 264, 265, 266,
+ 267, 268, 269, 270, 725, 726, 727, 728, 729, 730,
+ 731, 732, 733, 734, 735, 282, 283, 284, 285, 286,
+ 287, 288, 289, 290, 291, 292, 359, 361, 738, 739,
+ 740, 741, 742, 743, 744, 745, 746, 747, 748, 749,
+ 750, 751, 328, 329, 761, 762, 763, 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, 10, 10, 10, 10,
@@ -2310,94 +2384,99 @@ static const yytype_int16 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, 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, 10
};
-/* YYR1[RULE-NUM] -- Symbol kind of the left-hand side of rule RULE-NUM. */
+ /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
static const yytype_int16 yyr1[] =
{
- 0, 359, 360, 360, 361, 361, 361, 361, 361, 361,
- 361, 361, 361, 361, 361, 361, 361, 361, 362, 363,
- 364, 364, 365, 365, 365, 365, 365, 365, 365, 365,
- 365, 365, 365, 365, 365, 365, 365, 365, 365, 365,
- 365, 365, 365, 365, 365, 365, 365, 365, 365, 365,
- 365, 365, 365, 365, 365, 365, 365, 365, 365, 365,
- 365, 365, 365, 365, 365, 365, 365, 365, 365, 365,
- 365, 365, 365, 365, 365, 365, 365, 365, 365, 365,
- 365, 365, 365, 365, 365, 365, 365, 365, 365, 365,
- 365, 365, 365, 365, 365, 365, 365, 365, 365, 365,
- 365, 365, 365, 365, 365, 365, 365, 365, 365, 365,
- 365, 365, 365, 365, 365, 365, 365, 365, 365, 365,
- 365, 365, 365, 365, 365, 365, 365, 365, 365, 365,
- 365, 365, 365, 365, 365, 365, 365, 365, 365, 365,
- 365, 365, 365, 365, 365, 365, 365, 365, 365, 365,
- 365, 365, 365, 365, 365, 365, 365, 365, 365, 365,
- 365, 365, 365, 365, 365, 365, 365, 365, 365, 365,
- 365, 365, 365, 365, 365, 365, 365, 365, 365, 365,
- 365, 365, 365, 365, 365, 365, 365, 365, 365, 365,
- 365, 365, 365, 365, 365, 365, 365, 365, 365, 365,
- 365, 365, 365, 365, 365, 365, 365, 365, 365, 365,
- 365, 365, 365, 365, 365, 365, 365, 365, 365, 365,
- 365, 365, 365, 365, 365, 365, 365, 365, 365, 365,
- 365, 365, 365, 365, 365, 365, 365, 365, 365, 365,
- 365, 365, 365, 365, 365, 365, 365, 365, 365, 365,
- 365, 365, 365, 365, 365, 365, 365, 365, 365, 365,
- 365, 365, 365, 365, 365, 365, 365, 365, 365, 365,
- 365, 365, 366, 367, 367, 368, 368, 368, 368, 368,
- 368, 368, 368, 369, 370, 370, 371, 371, 371, 371,
- 371, 371, 371, 372, 373, 373, 374, 374, 374, 374,
- 374, 374, 374, 375, 376, 376, 377, 377, 377, 377,
- 377, 377, 377, 377, 377, 377, 378, 379, 380, 381,
- 382, 383, 384, 385, 385, 386, 386, 386, 386, 386,
- 386, 386, 386, 386, 386, 386, 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, 505, 506, 507, 508, 509,
- 510, 511, 512, 513, 514, 515, 516, 517, 518, 519,
- 520, 521, 522, 523, 524, 525, 526, 527, 528, 529,
- 530, 531, 532, 533, 534, 535, 536, 537, 538, 539,
- 540, 541, 542, 543, 544, 545, 546, 547, 548, 549,
- 550, 551, 552, 553, 554, 555, 556, 557, 558, 559,
- 560, 561, 562, 563, 564, 565, 566, 567, 568, 569,
- 570, 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, 598, 599,
- 600, 601, 602, 603, 604, 605, 606, 607, 608, 609,
- 610, 611, 612, 613, 614, 615, 616, 617, 618, 619,
- 620, 621, 622, 623, 624, 625, 626, 627, 628, 629,
- 630, 631, 632, 633, 634, 635, 636, 637, 638, 639,
- 640, 641, 642, 643, 644, 645, 646, 647, 648, 649,
- 650, 651, 652, 653, 654, 655, 656, 657, 658, 659,
- 660, 661, 662, 662, 663, 663, 663, 663, 663, 663,
- 663, 663, 664, 665, 666, 667, 668, 669, 670, 671,
- 672, 673, 673, 674, 674, 674, 674, 674, 674, 674,
- 674, 674, 674, 674, 674, 674, 674, 674, 674, 674,
- 674, 674, 674, 675, 676, 677, 678, 679, 680, 681,
- 682, 683, 684, 685, 686, 687, 688, 689, 690, 691,
- 692, 693, 694, 695, 696, 696, 697, 698, 699, 700,
- 700, 701, 702, 703, 704, 705, 706, 707, 708, 708,
- 709, 709, 709, 709, 709, 709, 709, 709, 709, 709,
- 710, 711, 712, 713, 714, 715, 716, 717, 718, 719,
- 720, 721, 721, 722, 722, 722, 722, 722, 722, 722,
- 722, 722, 722, 722, 723, 724, 725, 726, 727, 728,
- 729, 730, 731, 732, 733, 734, 735, 736, 737, 738,
- 739, 739, 740, 740, 741, 742
+ 0, 368, 369, 369, 370, 370, 370, 370, 370, 370,
+ 370, 370, 370, 370, 370, 370, 370, 370, 371, 372,
+ 373, 373, 374, 374, 374, 374, 374, 374, 374, 374,
+ 374, 374, 374, 374, 374, 374, 374, 374, 374, 374,
+ 374, 374, 374, 374, 374, 374, 374, 374, 374, 374,
+ 374, 374, 374, 374, 374, 374, 374, 374, 374, 374,
+ 374, 374, 374, 374, 374, 374, 374, 374, 374, 374,
+ 374, 374, 374, 374, 374, 374, 374, 374, 374, 374,
+ 374, 374, 374, 374, 374, 374, 374, 374, 374, 374,
+ 374, 374, 374, 374, 374, 374, 374, 374, 374, 374,
+ 374, 374, 374, 374, 374, 374, 374, 374, 374, 374,
+ 374, 374, 374, 374, 374, 374, 374, 374, 374, 374,
+ 374, 374, 374, 374, 374, 374, 374, 374, 374, 374,
+ 374, 374, 374, 374, 374, 374, 374, 374, 374, 374,
+ 374, 374, 374, 374, 374, 374, 374, 374, 374, 374,
+ 374, 374, 374, 374, 374, 374, 374, 374, 374, 374,
+ 374, 374, 374, 374, 374, 374, 374, 374, 374, 374,
+ 374, 374, 374, 374, 374, 374, 374, 374, 374, 374,
+ 374, 374, 374, 374, 374, 374, 374, 374, 374, 374,
+ 374, 374, 374, 374, 374, 374, 374, 374, 374, 374,
+ 374, 374, 374, 374, 374, 374, 374, 374, 374, 374,
+ 374, 374, 374, 374, 374, 374, 374, 374, 374, 374,
+ 374, 374, 374, 374, 374, 374, 374, 374, 374, 374,
+ 374, 374, 374, 374, 374, 374, 374, 374, 374, 374,
+ 374, 374, 374, 374, 374, 374, 374, 374, 374, 374,
+ 374, 374, 374, 374, 374, 374, 374, 374, 374, 374,
+ 374, 374, 374, 374, 374, 374, 374, 374, 374, 374,
+ 374, 374, 374, 374, 374, 374, 374, 374, 374, 375,
+ 376, 377, 377, 378, 378, 378, 378, 378, 378, 378,
+ 378, 379, 380, 381, 381, 382, 382, 382, 382, 382,
+ 382, 382, 383, 384, 385, 385, 386, 386, 386, 386,
+ 386, 386, 386, 387, 388, 388, 389, 389, 389, 389,
+ 389, 389, 389, 389, 389, 389, 390, 391, 392, 393,
+ 394, 395, 396, 397, 397, 398, 398, 398, 398, 398,
+ 398, 398, 398, 398, 398, 398, 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, 505, 506, 507, 508, 509, 510, 511,
+ 512, 513, 514, 515, 516, 517, 518, 519, 520, 521,
+ 522, 523, 524, 525, 526, 527, 528, 529, 530, 531,
+ 532, 533, 534, 535, 536, 537, 538, 539, 540, 541,
+ 542, 543, 544, 545, 546, 547, 548, 549, 550, 551,
+ 552, 553, 554, 555, 556, 557, 558, 559, 560, 561,
+ 562, 563, 564, 565, 566, 567, 568, 569, 570, 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, 598, 599, 600, 601,
+ 602, 603, 604, 605, 606, 607, 608, 609, 610, 611,
+ 612, 613, 614, 615, 616, 617, 618, 619, 620, 621,
+ 622, 623, 624, 625, 626, 627, 628, 629, 630, 631,
+ 632, 633, 634, 635, 636, 637, 638, 639, 640, 641,
+ 642, 643, 644, 645, 646, 647, 648, 649, 650, 651,
+ 652, 653, 654, 655, 656, 657, 658, 659, 660, 661,
+ 662, 663, 664, 665, 666, 667, 668, 669, 670, 671,
+ 672, 673, 674, 675, 676, 677, 678, 678, 679, 679,
+ 679, 679, 679, 679, 679, 679, 680, 681, 682, 683,
+ 684, 685, 686, 687, 688, 689, 689, 690, 690, 690,
+ 690, 690, 690, 690, 690, 690, 690, 690, 690, 690,
+ 690, 690, 690, 690, 690, 690, 690, 691, 692, 693,
+ 694, 695, 696, 697, 698, 699, 700, 701, 702, 703,
+ 704, 705, 706, 707, 708, 709, 710, 711, 712, 712,
+ 713, 714, 715, 716, 716, 717, 718, 719, 720, 721,
+ 722, 723, 724, 724, 725, 725, 725, 725, 725, 725,
+ 725, 725, 725, 725, 726, 727, 728, 729, 730, 731,
+ 732, 733, 734, 735, 736, 737, 737, 738, 738, 738,
+ 738, 738, 738, 738, 738, 738, 738, 738, 738, 738,
+ 739, 740, 741, 742, 743, 744, 745, 746, 747, 748,
+ 749, 750, 751, 752, 753, 754, 755, 756, 757, 758,
+ 759, 760, 760, 761, 761, 762, 763
};
-/* YYR2[RULE-NUM] -- Number of symbols on the right-hand side of rule RULE-NUM. */
+ /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */
static const yytype_int8 yyr2[] =
{
- 0, 2, 0, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 1, 1, 1,
+ 0, 2, 0, 2, 2, 1, 1, 2, 2, 2,
+ 1, 2, 2, 2, 2, 2, 2, 1, 1, 1,
2, 0, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
@@ -2423,9 +2502,10 @@ static const yytype_int8 yyr2[] =
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 2, 0, 1, 1, 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, 1, 1, 1, 1, 1, 2,
+ 1, 2, 0, 1, 1, 1, 1, 1, 1, 1,
+ 1, 2, 1, 2, 0, 1, 1, 1, 1, 1,
+ 1, 1, 2, 1, 2, 0, 1, 1, 1, 1,
1, 1, 1, 1, 2, 0, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 2, 2, 2, 2,
2, 2, 1, 2, 0, 1, 1, 1, 1, 1,
@@ -2444,33 +2524,34 @@ static const yytype_int8 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,
- 3, 3, 2, 2, 2, 2, 2, 2, 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, 3, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 3, 2, 2, 2, 2, 2, 2, 2, 2, 3,
+ 3, 2, 2, 2, 2, 2, 2, 3, 3, 4,
+ 4, 4, 3, 3, 4, 4, 3, 3, 2, 2,
2, 2, 2, 2, 2, 3, 3, 2, 2, 2,
- 2, 2, 2, 3, 3, 4, 4, 4, 3, 3,
- 4, 4, 3, 3, 2, 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, 3, 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, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 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,
+ 2, 2, 2, 2, 2, 2, 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, 1,
- 1, 1, 1, 2, 2, 2, 2, 2, 2, 2,
+ 1, 1, 1, 1, 1, 1, 1, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 1, 2, 0, 1, 2, 1, 2,
- 0, 1, 2, 2, 2, 3, 3, 1, 2, 0,
+ 2, 2, 2, 2, 2, 2, 2, 1, 2, 0,
+ 1, 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, 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, 1, 1,
- 1, 1, 1, 1, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 3, 2, 2, 2, 1,
- 2, 0, 1, 1, 2, 2
+ 2, 2, 2, 3, 2, 2, 2, 2, 2, 2,
+ 1, 2, 0, 1, 1, 2, 2
};
@@ -2482,7 +2563,6 @@ enum { YYENOMEM = -2 };
#define YYACCEPT goto yyacceptlab
#define YYABORT goto yyabortlab
#define YYERROR goto yyerrorlab
-#define YYNOMEM goto yyexhaustedlab
#define YYRECOVERING() (!!yyerrstatus)
@@ -2523,7 +2603,10 @@ do { \
YYFPRINTF Args; \
} while (0)
-
+/* This macro is provided for backward compatibility. */
+# ifndef YY_LOCATION_PRINT
+# define YY_LOCATION_PRINT(File, Loc) ((void) 0)
+# endif
# define YY_SYMBOL_PRINT(Title, Kind, Value, Location) \
@@ -2550,6 +2633,10 @@ yy_symbol_value_print (FILE *yyo,
YY_USE (yyoutput);
if (!yyvaluep)
return;
+# ifdef YYPRINT
+ if (yykind < YYNTOKENS)
+ YYPRINT (yyo, yytoknum[yykind], *yyvaluep);
+# endif
YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
YY_USE (yykind);
YY_IGNORE_MAYBE_UNINITIALIZED_END
@@ -2734,7 +2821,6 @@ yyparse (void)
YYDPRINTF ((stderr, "Starting parse\n"));
yychar = YYEMPTY; /* Cause a token to be read. */
-
goto yysetstate;
@@ -2760,7 +2846,7 @@ yysetstate:
if (yyss + yystacksize - 1 <= yyssp)
#if !defined yyoverflow && !defined YYSTACK_RELOCATE
- YYNOMEM;
+ goto yyexhaustedlab;
#else
{
/* Get the current used size of the three stacks, in elements. */
@@ -2788,7 +2874,7 @@ yysetstate:
# else /* defined YYSTACK_RELOCATE */
/* Extend the stack our own way. */
if (YYMAXDEPTH <= yystacksize)
- YYNOMEM;
+ goto yyexhaustedlab;
yystacksize *= 2;
if (YYMAXDEPTH < yystacksize)
yystacksize = YYMAXDEPTH;
@@ -2799,7 +2885,7 @@ yysetstate:
YY_CAST (union yyalloc *,
YYSTACK_ALLOC (YY_CAST (YYSIZE_T, YYSTACK_BYTES (yystacksize))));
if (! yyptr)
- YYNOMEM;
+ goto yyexhaustedlab;
YYSTACK_RELOCATE (yyss_alloc, yyss);
YYSTACK_RELOCATE (yyvs_alloc, yyvs);
# undef YYSTACK_RELOCATE
@@ -2821,7 +2907,6 @@ yysetstate:
}
#endif /* !defined yyoverflow && !defined YYSTACK_RELOCATE */
-
if (yystate == YYFINAL)
YYACCEPT;
@@ -2934,25 +3019,36 @@ yyreduce:
switch (yyn)
{
case 18: /* force_toplevel: VAR_FORCE_TOPLEVEL */
-#line 221 "util/configparser.y"
+#line 224 "util/configparser.y"
{
OUTYY(("\nP(force-toplevel)\n"));
cfg_parser->started_toplevel = 0;
}
-#line 2943 "util/configparser.c"
+#line 3028 "util/configparser.c"
break;
case 19: /* serverstart: VAR_SERVER */
-#line 228 "util/configparser.y"
+#line 231 "util/configparser.y"
{
OUTYY(("\nP(server:)\n"));
cfg_parser->started_toplevel = 1;
}
-#line 2952 "util/configparser.c"
+#line 3037 "util/configparser.c"
+ break;
+
+ case 279: /* stub_clause: stubstart contents_stub */
+#line 355 "util/configparser.y"
+ {
+ /* stub end */
+ if(cfg_parser->cfg->stubs &&
+ !cfg_parser->cfg->stubs->name)
+ yyerror("stub-zone without name");
+ }
+#line 3048 "util/configparser.c"
break;
- case 272: /* stubstart: VAR_STUB_ZONE */
-#line 349 "util/configparser.y"
+ case 280: /* stubstart: VAR_STUB_ZONE */
+#line 363 "util/configparser.y"
{
struct config_stub* s;
OUTYY(("\nP(stub_zone:)\n"));
@@ -2965,22 +3061,22 @@ yyreduce:
yyerror("out of memory");
}
}
-#line 2969 "util/configparser.c"
+#line 3065 "util/configparser.c"
break;
- case 274: /* contents_stub: %empty */
-#line 364 "util/configparser.y"
+ case 291: /* forward_clause: forwardstart contents_forward */
+#line 382 "util/configparser.y"
{
- /* stub end */
- if(cfg_parser->cfg->stubs &&
- !cfg_parser->cfg->stubs->name)
- yyerror("stub-zone without name");
+ /* forward end */
+ if(cfg_parser->cfg->forwards &&
+ !cfg_parser->cfg->forwards->name)
+ yyerror("forward-zone without name");
}
-#line 2980 "util/configparser.c"
+#line 3076 "util/configparser.c"
break;
- case 283: /* forwardstart: VAR_FORWARD_ZONE */
-#line 374 "util/configparser.y"
+ case 292: /* forwardstart: VAR_FORWARD_ZONE */
+#line 390 "util/configparser.y"
{
struct config_stub* s;
OUTYY(("\nP(forward_zone:)\n"));
@@ -2993,22 +3089,22 @@ yyreduce:
yyerror("out of memory");
}
}
-#line 2997 "util/configparser.c"
+#line 3093 "util/configparser.c"
break;
- case 285: /* contents_forward: %empty */
-#line 389 "util/configparser.y"
+ case 302: /* view_clause: viewstart contents_view */
+#line 409 "util/configparser.y"
{
- /* forward end */
- if(cfg_parser->cfg->forwards &&
- !cfg_parser->cfg->forwards->name)
- yyerror("forward-zone without name");
+ /* view end */
+ if(cfg_parser->cfg->views &&
+ !cfg_parser->cfg->views->name)
+ yyerror("view without name");
}
-#line 3008 "util/configparser.c"
+#line 3104 "util/configparser.c"
break;
- case 293: /* viewstart: VAR_VIEW */
-#line 399 "util/configparser.y"
+ case 303: /* viewstart: VAR_VIEW */
+#line 417 "util/configparser.y"
{
struct config_view* s;
OUTYY(("\nP(view:)\n"));
@@ -3021,22 +3117,11 @@ yyreduce:
yyerror("out of memory");
}
}
-#line 3025 "util/configparser.c"
+#line 3121 "util/configparser.c"
break;
- case 295: /* contents_view: %empty */
-#line 414 "util/configparser.y"
- {
- /* view end */
- if(cfg_parser->cfg->views &&
- !cfg_parser->cfg->views->name)
- yyerror("view without name");
- }
-#line 3036 "util/configparser.c"
- break;
-
- case 303: /* authstart: VAR_AUTH_ZONE */
-#line 424 "util/configparser.y"
+ case 313: /* authstart: VAR_AUTH_ZONE */
+#line 436 "util/configparser.y"
{
struct config_auth* s;
OUTYY(("\nP(auth_zone:)\n"));
@@ -3056,11 +3141,11 @@ yyreduce:
yyerror("out of memory");
}
}
-#line 3060 "util/configparser.c"
+#line 3145 "util/configparser.c"
break;
- case 316: /* rpz_tag: VAR_TAGS STRING_ARG */
-#line 452 "util/configparser.y"
+ case 326: /* rpz_tag: VAR_TAGS STRING_ARG */
+#line 464 "util/configparser.y"
{
uint8_t* bitlist;
size_t len = 0;
@@ -3077,11 +3162,11 @@ yyreduce:
}
}
-#line 3081 "util/configparser.c"
+#line 3166 "util/configparser.c"
break;
- case 317: /* rpz_action_override: VAR_RPZ_ACTION_OVERRIDE STRING_ARG */
-#line 471 "util/configparser.y"
+ case 327: /* rpz_action_override: VAR_RPZ_ACTION_OVERRIDE STRING_ARG */
+#line 483 "util/configparser.y"
{
OUTYY(("P(rpz_action_override:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "nxdomain")!=0 && strcmp((yyvsp[0].str), "nodata")!=0 &&
@@ -3096,21 +3181,21 @@ yyreduce:
cfg_parser->cfg->auths->rpz_action_override = (yyvsp[0].str);
}
}
-#line 3100 "util/configparser.c"
+#line 3185 "util/configparser.c"
break;
- case 318: /* rpz_cname_override: VAR_RPZ_CNAME_OVERRIDE STRING_ARG */
-#line 488 "util/configparser.y"
+ case 328: /* rpz_cname_override: VAR_RPZ_CNAME_OVERRIDE STRING_ARG */
+#line 500 "util/configparser.y"
{
OUTYY(("P(rpz_cname_override:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->auths->rpz_cname);
cfg_parser->cfg->auths->rpz_cname = (yyvsp[0].str);
}
-#line 3110 "util/configparser.c"
+#line 3195 "util/configparser.c"
break;
- case 319: /* rpz_log: VAR_RPZ_LOG STRING_ARG */
-#line 496 "util/configparser.y"
+ case 329: /* rpz_log: VAR_RPZ_LOG STRING_ARG */
+#line 508 "util/configparser.y"
{
OUTYY(("P(rpz_log:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3118,21 +3203,21 @@ yyreduce:
else cfg_parser->cfg->auths->rpz_log = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3122 "util/configparser.c"
+#line 3207 "util/configparser.c"
break;
- case 320: /* rpz_log_name: VAR_RPZ_LOG_NAME STRING_ARG */
-#line 506 "util/configparser.y"
+ case 330: /* rpz_log_name: VAR_RPZ_LOG_NAME STRING_ARG */
+#line 518 "util/configparser.y"
{
OUTYY(("P(rpz_log_name:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->auths->rpz_log_name);
cfg_parser->cfg->auths->rpz_log_name = (yyvsp[0].str);
}
-#line 3132 "util/configparser.c"
+#line 3217 "util/configparser.c"
break;
- case 321: /* rpz_signal_nxdomain_ra: VAR_RPZ_SIGNAL_NXDOMAIN_RA STRING_ARG */
-#line 513 "util/configparser.y"
+ case 331: /* rpz_signal_nxdomain_ra: VAR_RPZ_SIGNAL_NXDOMAIN_RA STRING_ARG */
+#line 525 "util/configparser.y"
{
OUTYY(("P(rpz_signal_nxdomain_ra:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3140,11 +3225,11 @@ yyreduce:
else cfg_parser->cfg->auths->rpz_signal_nxdomain_ra = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3144 "util/configparser.c"
+#line 3229 "util/configparser.c"
break;
- case 322: /* rpzstart: VAR_RPZ */
-#line 523 "util/configparser.y"
+ case 332: /* rpzstart: VAR_RPZ */
+#line 535 "util/configparser.y"
{
struct config_auth* s;
OUTYY(("\nP(rpz:)\n"));
@@ -3162,11 +3247,11 @@ yyreduce:
yyerror("out of memory");
}
}
-#line 3166 "util/configparser.c"
+#line 3251 "util/configparser.c"
break;
- case 337: /* server_num_threads: VAR_NUM_THREADS STRING_ARG */
-#line 548 "util/configparser.y"
+ case 347: /* server_num_threads: VAR_NUM_THREADS STRING_ARG */
+#line 560 "util/configparser.y"
{
OUTYY(("P(server_num_threads:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -3174,11 +3259,11 @@ yyreduce:
else cfg_parser->cfg->num_threads = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 3178 "util/configparser.c"
+#line 3263 "util/configparser.c"
break;
- case 338: /* server_verbosity: VAR_VERBOSITY STRING_ARG */
-#line 557 "util/configparser.y"
+ case 348: /* server_verbosity: VAR_VERBOSITY STRING_ARG */
+#line 569 "util/configparser.y"
{
OUTYY(("P(server_verbosity:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -3186,11 +3271,11 @@ yyreduce:
else cfg_parser->cfg->verbosity = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 3190 "util/configparser.c"
+#line 3275 "util/configparser.c"
break;
- case 339: /* server_statistics_interval: VAR_STATISTICS_INTERVAL STRING_ARG */
-#line 566 "util/configparser.y"
+ case 349: /* server_statistics_interval: VAR_STATISTICS_INTERVAL STRING_ARG */
+#line 578 "util/configparser.y"
{
OUTYY(("P(server_statistics_interval:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "") == 0 || strcmp((yyvsp[0].str), "0") == 0)
@@ -3200,11 +3285,11 @@ yyreduce:
else cfg_parser->cfg->stat_interval = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 3204 "util/configparser.c"
+#line 3289 "util/configparser.c"
break;
- case 340: /* server_statistics_cumulative: VAR_STATISTICS_CUMULATIVE STRING_ARG */
-#line 577 "util/configparser.y"
+ case 350: /* server_statistics_cumulative: VAR_STATISTICS_CUMULATIVE STRING_ARG */
+#line 589 "util/configparser.y"
{
OUTYY(("P(server_statistics_cumulative:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3212,11 +3297,11 @@ yyreduce:
else cfg_parser->cfg->stat_cumulative = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3216 "util/configparser.c"
+#line 3301 "util/configparser.c"
break;
- case 341: /* server_extended_statistics: VAR_EXTENDED_STATISTICS STRING_ARG */
-#line 586 "util/configparser.y"
+ case 351: /* server_extended_statistics: VAR_EXTENDED_STATISTICS STRING_ARG */
+#line 598 "util/configparser.y"
{
OUTYY(("P(server_extended_statistics:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3224,11 +3309,11 @@ yyreduce:
else cfg_parser->cfg->stat_extended = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3228 "util/configparser.c"
+#line 3313 "util/configparser.c"
break;
- case 342: /* server_statistics_inhibit_zero: VAR_STATISTICS_INHIBIT_ZERO STRING_ARG */
-#line 595 "util/configparser.y"
+ case 352: /* server_statistics_inhibit_zero: VAR_STATISTICS_INHIBIT_ZERO STRING_ARG */
+#line 607 "util/configparser.y"
{
OUTYY(("P(server_statistics_inhibit_zero:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3236,11 +3321,11 @@ yyreduce:
else cfg_parser->cfg->stat_inhibit_zero = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3240 "util/configparser.c"
+#line 3325 "util/configparser.c"
break;
- case 343: /* server_shm_enable: VAR_SHM_ENABLE STRING_ARG */
-#line 604 "util/configparser.y"
+ case 353: /* server_shm_enable: VAR_SHM_ENABLE STRING_ARG */
+#line 616 "util/configparser.y"
{
OUTYY(("P(server_shm_enable:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3248,11 +3333,11 @@ yyreduce:
else cfg_parser->cfg->shm_enable = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3252 "util/configparser.c"
+#line 3337 "util/configparser.c"
break;
- case 344: /* server_shm_key: VAR_SHM_KEY STRING_ARG */
-#line 613 "util/configparser.y"
+ case 354: /* server_shm_key: VAR_SHM_KEY STRING_ARG */
+#line 625 "util/configparser.y"
{
OUTYY(("P(server_shm_key:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "") == 0 || strcmp((yyvsp[0].str), "0") == 0)
@@ -3262,11 +3347,11 @@ yyreduce:
else cfg_parser->cfg->shm_key = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 3266 "util/configparser.c"
+#line 3351 "util/configparser.c"
break;
- case 345: /* server_port: VAR_PORT STRING_ARG */
-#line 624 "util/configparser.y"
+ case 355: /* server_port: VAR_PORT STRING_ARG */
+#line 636 "util/configparser.y"
{
OUTYY(("P(server_port:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0)
@@ -3274,11 +3359,11 @@ yyreduce:
else cfg_parser->cfg->port = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 3278 "util/configparser.c"
+#line 3363 "util/configparser.c"
break;
- case 346: /* server_send_client_subnet: VAR_SEND_CLIENT_SUBNET STRING_ARG */
-#line 633 "util/configparser.y"
+ case 356: /* server_send_client_subnet: VAR_SEND_CLIENT_SUBNET STRING_ARG */
+#line 645 "util/configparser.y"
{
#ifdef CLIENT_SUBNET
OUTYY(("P(server_send_client_subnet:%s)\n", (yyvsp[0].str)));
@@ -3289,11 +3374,11 @@ yyreduce:
free((yyvsp[0].str));
#endif
}
-#line 3293 "util/configparser.c"
+#line 3378 "util/configparser.c"
break;
- case 347: /* server_client_subnet_zone: VAR_CLIENT_SUBNET_ZONE STRING_ARG */
-#line 645 "util/configparser.y"
+ case 357: /* server_client_subnet_zone: VAR_CLIENT_SUBNET_ZONE STRING_ARG */
+#line 657 "util/configparser.y"
{
#ifdef CLIENT_SUBNET
OUTYY(("P(server_client_subnet_zone:%s)\n", (yyvsp[0].str)));
@@ -3305,11 +3390,11 @@ yyreduce:
free((yyvsp[0].str));
#endif
}
-#line 3309 "util/configparser.c"
+#line 3394 "util/configparser.c"
break;
- case 348: /* server_client_subnet_always_forward: VAR_CLIENT_SUBNET_ALWAYS_FORWARD STRING_ARG */
-#line 659 "util/configparser.y"
+ case 358: /* server_client_subnet_always_forward: VAR_CLIENT_SUBNET_ALWAYS_FORWARD STRING_ARG */
+#line 671 "util/configparser.y"
{
#ifdef CLIENT_SUBNET
OUTYY(("P(server_client_subnet_always_forward:%s)\n", (yyvsp[0].str)));
@@ -3323,11 +3408,11 @@ yyreduce:
#endif
free((yyvsp[0].str));
}
-#line 3327 "util/configparser.c"
+#line 3412 "util/configparser.c"
break;
- case 349: /* server_client_subnet_opcode: VAR_CLIENT_SUBNET_OPCODE STRING_ARG */
-#line 674 "util/configparser.y"
+ case 359: /* server_client_subnet_opcode: VAR_CLIENT_SUBNET_OPCODE STRING_ARG */
+#line 686 "util/configparser.y"
{
#ifdef CLIENT_SUBNET
OUTYY(("P(client_subnet_opcode:%s)\n", (yyvsp[0].str)));
@@ -3337,11 +3422,11 @@ yyreduce:
#endif
free((yyvsp[0].str));
}
-#line 3341 "util/configparser.c"
+#line 3426 "util/configparser.c"
break;
- case 350: /* server_max_client_subnet_ipv4: VAR_MAX_CLIENT_SUBNET_IPV4 STRING_ARG */
-#line 685 "util/configparser.y"
+ case 360: /* server_max_client_subnet_ipv4: VAR_MAX_CLIENT_SUBNET_IPV4 STRING_ARG */
+#line 697 "util/configparser.y"
{
#ifdef CLIENT_SUBNET
OUTYY(("P(max_client_subnet_ipv4:%s)\n", (yyvsp[0].str)));
@@ -3357,11 +3442,11 @@ yyreduce:
#endif
free((yyvsp[0].str));
}
-#line 3361 "util/configparser.c"
+#line 3446 "util/configparser.c"
break;
- case 351: /* server_max_client_subnet_ipv6: VAR_MAX_CLIENT_SUBNET_IPV6 STRING_ARG */
-#line 702 "util/configparser.y"
+ case 361: /* server_max_client_subnet_ipv6: VAR_MAX_CLIENT_SUBNET_IPV6 STRING_ARG */
+#line 714 "util/configparser.y"
{
#ifdef CLIENT_SUBNET
OUTYY(("P(max_client_subnet_ipv6:%s)\n", (yyvsp[0].str)));
@@ -3377,11 +3462,11 @@ yyreduce:
#endif
free((yyvsp[0].str));
}
-#line 3381 "util/configparser.c"
+#line 3466 "util/configparser.c"
break;
- case 352: /* server_min_client_subnet_ipv4: VAR_MIN_CLIENT_SUBNET_IPV4 STRING_ARG */
-#line 719 "util/configparser.y"
+ case 362: /* server_min_client_subnet_ipv4: VAR_MIN_CLIENT_SUBNET_IPV4 STRING_ARG */
+#line 731 "util/configparser.y"
{
#ifdef CLIENT_SUBNET
OUTYY(("P(min_client_subnet_ipv4:%s)\n", (yyvsp[0].str)));
@@ -3397,11 +3482,11 @@ yyreduce:
#endif
free((yyvsp[0].str));
}
-#line 3401 "util/configparser.c"
+#line 3486 "util/configparser.c"
break;
- case 353: /* server_min_client_subnet_ipv6: VAR_MIN_CLIENT_SUBNET_IPV6 STRING_ARG */
-#line 736 "util/configparser.y"
+ case 363: /* server_min_client_subnet_ipv6: VAR_MIN_CLIENT_SUBNET_IPV6 STRING_ARG */
+#line 748 "util/configparser.y"
{
#ifdef CLIENT_SUBNET
OUTYY(("P(min_client_subnet_ipv6:%s)\n", (yyvsp[0].str)));
@@ -3417,11 +3502,11 @@ yyreduce:
#endif
free((yyvsp[0].str));
}
-#line 3421 "util/configparser.c"
+#line 3506 "util/configparser.c"
break;
- case 354: /* server_max_ecs_tree_size_ipv4: VAR_MAX_ECS_TREE_SIZE_IPV4 STRING_ARG */
-#line 753 "util/configparser.y"
+ case 364: /* server_max_ecs_tree_size_ipv4: VAR_MAX_ECS_TREE_SIZE_IPV4 STRING_ARG */
+#line 765 "util/configparser.y"
{
#ifdef CLIENT_SUBNET
OUTYY(("P(max_ecs_tree_size_ipv4:%s)\n", (yyvsp[0].str)));
@@ -3435,11 +3520,11 @@ yyreduce:
#endif
free((yyvsp[0].str));
}
-#line 3439 "util/configparser.c"
+#line 3524 "util/configparser.c"
break;
- case 355: /* server_max_ecs_tree_size_ipv6: VAR_MAX_ECS_TREE_SIZE_IPV6 STRING_ARG */
-#line 768 "util/configparser.y"
+ case 365: /* server_max_ecs_tree_size_ipv6: VAR_MAX_ECS_TREE_SIZE_IPV6 STRING_ARG */
+#line 780 "util/configparser.y"
{
#ifdef CLIENT_SUBNET
OUTYY(("P(max_ecs_tree_size_ipv6:%s)\n", (yyvsp[0].str)));
@@ -3453,11 +3538,11 @@ yyreduce:
#endif
free((yyvsp[0].str));
}
-#line 3457 "util/configparser.c"
+#line 3542 "util/configparser.c"
break;
- case 356: /* server_interface: VAR_INTERFACE STRING_ARG */
-#line 783 "util/configparser.y"
+ case 366: /* server_interface: VAR_INTERFACE STRING_ARG */
+#line 795 "util/configparser.y"
{
OUTYY(("P(server_interface:%s)\n", (yyvsp[0].str)));
if(cfg_parser->cfg->num_ifs == 0)
@@ -3469,11 +3554,11 @@ yyreduce:
else
cfg_parser->cfg->ifs[cfg_parser->cfg->num_ifs++] = (yyvsp[0].str);
}
-#line 3473 "util/configparser.c"
+#line 3558 "util/configparser.c"
break;
- case 357: /* server_outgoing_interface: VAR_OUTGOING_INTERFACE STRING_ARG */
-#line 796 "util/configparser.y"
+ case 367: /* server_outgoing_interface: VAR_OUTGOING_INTERFACE STRING_ARG */
+#line 808 "util/configparser.y"
{
OUTYY(("P(server_outgoing_interface:%s)\n", (yyvsp[0].str)));
if(cfg_parser->cfg->num_out_ifs == 0)
@@ -3487,11 +3572,11 @@ yyreduce:
cfg_parser->cfg->out_ifs[
cfg_parser->cfg->num_out_ifs++] = (yyvsp[0].str);
}
-#line 3491 "util/configparser.c"
+#line 3576 "util/configparser.c"
break;
- case 358: /* server_outgoing_range: VAR_OUTGOING_RANGE STRING_ARG */
-#line 811 "util/configparser.y"
+ case 368: /* server_outgoing_range: VAR_OUTGOING_RANGE STRING_ARG */
+#line 823 "util/configparser.y"
{
OUTYY(("P(server_outgoing_range:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0)
@@ -3499,11 +3584,11 @@ yyreduce:
else cfg_parser->cfg->outgoing_num_ports = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 3503 "util/configparser.c"
+#line 3588 "util/configparser.c"
break;
- case 359: /* server_outgoing_port_permit: VAR_OUTGOING_PORT_PERMIT STRING_ARG */
-#line 820 "util/configparser.y"
+ case 369: /* server_outgoing_port_permit: VAR_OUTGOING_PORT_PERMIT STRING_ARG */
+#line 832 "util/configparser.y"
{
OUTYY(("P(server_outgoing_port_permit:%s)\n", (yyvsp[0].str)));
if(!cfg_mark_ports((yyvsp[0].str), 1,
@@ -3511,11 +3596,11 @@ yyreduce:
yyerror("port number or range (\"low-high\") expected");
free((yyvsp[0].str));
}
-#line 3515 "util/configparser.c"
+#line 3600 "util/configparser.c"
break;
- case 360: /* server_outgoing_port_avoid: VAR_OUTGOING_PORT_AVOID STRING_ARG */
-#line 829 "util/configparser.y"
+ case 370: /* server_outgoing_port_avoid: VAR_OUTGOING_PORT_AVOID STRING_ARG */
+#line 841 "util/configparser.y"
{
OUTYY(("P(server_outgoing_port_avoid:%s)\n", (yyvsp[0].str)));
if(!cfg_mark_ports((yyvsp[0].str), 0,
@@ -3523,11 +3608,11 @@ yyreduce:
yyerror("port number or range (\"low-high\") expected");
free((yyvsp[0].str));
}
-#line 3527 "util/configparser.c"
+#line 3612 "util/configparser.c"
break;
- case 361: /* server_outgoing_num_tcp: VAR_OUTGOING_NUM_TCP STRING_ARG */
-#line 838 "util/configparser.y"
+ case 371: /* server_outgoing_num_tcp: VAR_OUTGOING_NUM_TCP STRING_ARG */
+#line 850 "util/configparser.y"
{
OUTYY(("P(server_outgoing_num_tcp:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -3535,11 +3620,11 @@ yyreduce:
else cfg_parser->cfg->outgoing_num_tcp = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 3539 "util/configparser.c"
+#line 3624 "util/configparser.c"
break;
- case 362: /* server_incoming_num_tcp: VAR_INCOMING_NUM_TCP STRING_ARG */
-#line 847 "util/configparser.y"
+ case 372: /* server_incoming_num_tcp: VAR_INCOMING_NUM_TCP STRING_ARG */
+#line 859 "util/configparser.y"
{
OUTYY(("P(server_incoming_num_tcp:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -3547,11 +3632,11 @@ yyreduce:
else cfg_parser->cfg->incoming_num_tcp = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 3551 "util/configparser.c"
+#line 3636 "util/configparser.c"
break;
- case 363: /* server_interface_automatic: VAR_INTERFACE_AUTOMATIC STRING_ARG */
-#line 856 "util/configparser.y"
+ case 373: /* server_interface_automatic: VAR_INTERFACE_AUTOMATIC STRING_ARG */
+#line 868 "util/configparser.y"
{
OUTYY(("P(server_interface_automatic:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3559,21 +3644,21 @@ yyreduce:
else cfg_parser->cfg->if_automatic = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3563 "util/configparser.c"
+#line 3648 "util/configparser.c"
break;
- case 364: /* server_interface_automatic_ports: VAR_INTERFACE_AUTOMATIC_PORTS STRING_ARG */
-#line 865 "util/configparser.y"
+ case 374: /* server_interface_automatic_ports: VAR_INTERFACE_AUTOMATIC_PORTS STRING_ARG */
+#line 877 "util/configparser.y"
{
OUTYY(("P(server_interface_automatic_ports:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->if_automatic_ports);
cfg_parser->cfg->if_automatic_ports = (yyvsp[0].str);
}
-#line 3573 "util/configparser.c"
+#line 3658 "util/configparser.c"
break;
- case 365: /* server_do_ip4: VAR_DO_IP4 STRING_ARG */
-#line 872 "util/configparser.y"
+ case 375: /* server_do_ip4: VAR_DO_IP4 STRING_ARG */
+#line 884 "util/configparser.y"
{
OUTYY(("P(server_do_ip4:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3581,11 +3666,11 @@ yyreduce:
else cfg_parser->cfg->do_ip4 = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3585 "util/configparser.c"
+#line 3670 "util/configparser.c"
break;
- case 366: /* server_do_ip6: VAR_DO_IP6 STRING_ARG */
-#line 881 "util/configparser.y"
+ case 376: /* server_do_ip6: VAR_DO_IP6 STRING_ARG */
+#line 893 "util/configparser.y"
{
OUTYY(("P(server_do_ip6:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3593,11 +3678,11 @@ yyreduce:
else cfg_parser->cfg->do_ip6 = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3597 "util/configparser.c"
+#line 3682 "util/configparser.c"
break;
- case 367: /* server_do_nat64: VAR_DO_NAT64 STRING_ARG */
-#line 890 "util/configparser.y"
+ case 377: /* server_do_nat64: VAR_DO_NAT64 STRING_ARG */
+#line 902 "util/configparser.y"
{
OUTYY(("P(server_do_nat64:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3605,11 +3690,11 @@ yyreduce:
else cfg_parser->cfg->do_nat64 = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3609 "util/configparser.c"
+#line 3694 "util/configparser.c"
break;
- case 368: /* server_do_udp: VAR_DO_UDP STRING_ARG */
-#line 899 "util/configparser.y"
+ case 378: /* server_do_udp: VAR_DO_UDP STRING_ARG */
+#line 911 "util/configparser.y"
{
OUTYY(("P(server_do_udp:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3617,11 +3702,11 @@ yyreduce:
else cfg_parser->cfg->do_udp = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3621 "util/configparser.c"
+#line 3706 "util/configparser.c"
break;
- case 369: /* server_do_tcp: VAR_DO_TCP STRING_ARG */
-#line 908 "util/configparser.y"
+ case 379: /* server_do_tcp: VAR_DO_TCP STRING_ARG */
+#line 920 "util/configparser.y"
{
OUTYY(("P(server_do_tcp:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3629,11 +3714,11 @@ yyreduce:
else cfg_parser->cfg->do_tcp = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3633 "util/configparser.c"
+#line 3718 "util/configparser.c"
break;
- case 370: /* server_prefer_ip4: VAR_PREFER_IP4 STRING_ARG */
-#line 917 "util/configparser.y"
+ case 380: /* server_prefer_ip4: VAR_PREFER_IP4 STRING_ARG */
+#line 929 "util/configparser.y"
{
OUTYY(("P(server_prefer_ip4:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3641,11 +3726,11 @@ yyreduce:
else cfg_parser->cfg->prefer_ip4 = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3645 "util/configparser.c"
+#line 3730 "util/configparser.c"
break;
- case 371: /* server_prefer_ip6: VAR_PREFER_IP6 STRING_ARG */
-#line 926 "util/configparser.y"
+ case 381: /* server_prefer_ip6: VAR_PREFER_IP6 STRING_ARG */
+#line 938 "util/configparser.y"
{
OUTYY(("P(server_prefer_ip6:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3653,11 +3738,11 @@ yyreduce:
else cfg_parser->cfg->prefer_ip6 = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3657 "util/configparser.c"
+#line 3742 "util/configparser.c"
break;
- case 372: /* server_tcp_mss: VAR_TCP_MSS STRING_ARG */
-#line 935 "util/configparser.y"
+ case 382: /* server_tcp_mss: VAR_TCP_MSS STRING_ARG */
+#line 947 "util/configparser.y"
{
OUTYY(("P(server_tcp_mss:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -3665,11 +3750,11 @@ yyreduce:
else cfg_parser->cfg->tcp_mss = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 3669 "util/configparser.c"
+#line 3754 "util/configparser.c"
break;
- case 373: /* server_outgoing_tcp_mss: VAR_OUTGOING_TCP_MSS STRING_ARG */
-#line 944 "util/configparser.y"
+ case 383: /* server_outgoing_tcp_mss: VAR_OUTGOING_TCP_MSS STRING_ARG */
+#line 956 "util/configparser.y"
{
OUTYY(("P(server_outgoing_tcp_mss:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -3677,11 +3762,11 @@ yyreduce:
else cfg_parser->cfg->outgoing_tcp_mss = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 3681 "util/configparser.c"
+#line 3766 "util/configparser.c"
break;
- case 374: /* server_tcp_idle_timeout: VAR_TCP_IDLE_TIMEOUT STRING_ARG */
-#line 953 "util/configparser.y"
+ case 384: /* server_tcp_idle_timeout: VAR_TCP_IDLE_TIMEOUT STRING_ARG */
+#line 965 "util/configparser.y"
{
OUTYY(("P(server_tcp_idle_timeout:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -3693,11 +3778,11 @@ yyreduce:
else cfg_parser->cfg->tcp_idle_timeout = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 3697 "util/configparser.c"
+#line 3782 "util/configparser.c"
break;
- case 375: /* server_max_reuse_tcp_queries: VAR_MAX_REUSE_TCP_QUERIES STRING_ARG */
-#line 966 "util/configparser.y"
+ case 385: /* server_max_reuse_tcp_queries: VAR_MAX_REUSE_TCP_QUERIES STRING_ARG */
+#line 978 "util/configparser.y"
{
OUTYY(("P(server_max_reuse_tcp_queries:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -3707,11 +3792,11 @@ yyreduce:
else cfg_parser->cfg->max_reuse_tcp_queries = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 3711 "util/configparser.c"
+#line 3796 "util/configparser.c"
break;
- case 376: /* server_tcp_reuse_timeout: VAR_TCP_REUSE_TIMEOUT STRING_ARG */
-#line 977 "util/configparser.y"
+ case 386: /* server_tcp_reuse_timeout: VAR_TCP_REUSE_TIMEOUT STRING_ARG */
+#line 989 "util/configparser.y"
{
OUTYY(("P(server_tcp_reuse_timeout:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -3721,11 +3806,11 @@ yyreduce:
else cfg_parser->cfg->tcp_reuse_timeout = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 3725 "util/configparser.c"
+#line 3810 "util/configparser.c"
break;
- case 377: /* server_tcp_auth_query_timeout: VAR_TCP_AUTH_QUERY_TIMEOUT STRING_ARG */
-#line 988 "util/configparser.y"
+ case 387: /* server_tcp_auth_query_timeout: VAR_TCP_AUTH_QUERY_TIMEOUT STRING_ARG */
+#line 1000 "util/configparser.y"
{
OUTYY(("P(server_tcp_auth_query_timeout:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -3735,11 +3820,11 @@ yyreduce:
else cfg_parser->cfg->tcp_auth_query_timeout = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 3739 "util/configparser.c"
+#line 3824 "util/configparser.c"
break;
- case 378: /* server_tcp_keepalive: VAR_EDNS_TCP_KEEPALIVE STRING_ARG */
-#line 999 "util/configparser.y"
+ case 388: /* server_tcp_keepalive: VAR_EDNS_TCP_KEEPALIVE STRING_ARG */
+#line 1011 "util/configparser.y"
{
OUTYY(("P(server_tcp_keepalive:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3747,11 +3832,11 @@ yyreduce:
else cfg_parser->cfg->do_tcp_keepalive = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3751 "util/configparser.c"
+#line 3836 "util/configparser.c"
break;
- case 379: /* server_tcp_keepalive_timeout: VAR_EDNS_TCP_KEEPALIVE_TIMEOUT STRING_ARG */
-#line 1008 "util/configparser.y"
+ case 389: /* server_tcp_keepalive_timeout: VAR_EDNS_TCP_KEEPALIVE_TIMEOUT STRING_ARG */
+#line 1020 "util/configparser.y"
{
OUTYY(("P(server_tcp_keepalive_timeout:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -3763,11 +3848,11 @@ yyreduce:
else cfg_parser->cfg->tcp_keepalive_timeout = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 3767 "util/configparser.c"
+#line 3852 "util/configparser.c"
break;
- case 380: /* server_sock_queue_timeout: VAR_SOCK_QUEUE_TIMEOUT STRING_ARG */
-#line 1021 "util/configparser.y"
+ case 390: /* server_sock_queue_timeout: VAR_SOCK_QUEUE_TIMEOUT STRING_ARG */
+#line 1033 "util/configparser.y"
{
OUTYY(("P(server_sock_queue_timeout:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -3779,11 +3864,11 @@ yyreduce:
else cfg_parser->cfg->sock_queue_timeout = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 3783 "util/configparser.c"
+#line 3868 "util/configparser.c"
break;
- case 381: /* server_tcp_upstream: VAR_TCP_UPSTREAM STRING_ARG */
-#line 1034 "util/configparser.y"
+ case 391: /* server_tcp_upstream: VAR_TCP_UPSTREAM STRING_ARG */
+#line 1046 "util/configparser.y"
{
OUTYY(("P(server_tcp_upstream:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3791,11 +3876,11 @@ yyreduce:
else cfg_parser->cfg->tcp_upstream = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3795 "util/configparser.c"
+#line 3880 "util/configparser.c"
break;
- case 382: /* server_udp_upstream_without_downstream: VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM STRING_ARG */
-#line 1043 "util/configparser.y"
+ case 392: /* server_udp_upstream_without_downstream: VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM STRING_ARG */
+#line 1055 "util/configparser.y"
{
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)
@@ -3803,11 +3888,11 @@ yyreduce:
else cfg_parser->cfg->udp_upstream_without_downstream = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3807 "util/configparser.c"
+#line 3892 "util/configparser.c"
break;
- case 383: /* server_ssl_upstream: VAR_SSL_UPSTREAM STRING_ARG */
-#line 1052 "util/configparser.y"
+ case 393: /* server_ssl_upstream: VAR_SSL_UPSTREAM STRING_ARG */
+#line 1064 "util/configparser.y"
{
OUTYY(("P(server_ssl_upstream:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3815,31 +3900,31 @@ yyreduce:
else cfg_parser->cfg->ssl_upstream = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3819 "util/configparser.c"
+#line 3904 "util/configparser.c"
break;
- case 384: /* server_ssl_service_key: VAR_SSL_SERVICE_KEY STRING_ARG */
-#line 1061 "util/configparser.y"
+ case 394: /* server_ssl_service_key: VAR_SSL_SERVICE_KEY STRING_ARG */
+#line 1073 "util/configparser.y"
{
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 3829 "util/configparser.c"
+#line 3914 "util/configparser.c"
break;
- case 385: /* server_ssl_service_pem: VAR_SSL_SERVICE_PEM STRING_ARG */
-#line 1068 "util/configparser.y"
+ case 395: /* server_ssl_service_pem: VAR_SSL_SERVICE_PEM STRING_ARG */
+#line 1080 "util/configparser.y"
{
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 3839 "util/configparser.c"
+#line 3924 "util/configparser.c"
break;
- case 386: /* server_ssl_port: VAR_SSL_PORT STRING_ARG */
-#line 1075 "util/configparser.y"
+ case 396: /* server_ssl_port: VAR_SSL_PORT STRING_ARG */
+#line 1087 "util/configparser.y"
{
OUTYY(("P(server_ssl_port:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0)
@@ -3847,21 +3932,21 @@ yyreduce:
else cfg_parser->cfg->ssl_port = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 3851 "util/configparser.c"
+#line 3936 "util/configparser.c"
break;
- case 387: /* server_tls_cert_bundle: VAR_TLS_CERT_BUNDLE STRING_ARG */
-#line 1084 "util/configparser.y"
+ case 397: /* server_tls_cert_bundle: VAR_TLS_CERT_BUNDLE STRING_ARG */
+#line 1096 "util/configparser.y"
{
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 3861 "util/configparser.c"
+#line 3946 "util/configparser.c"
break;
- case 388: /* server_tls_win_cert: VAR_TLS_WIN_CERT STRING_ARG */
-#line 1091 "util/configparser.y"
+ case 398: /* server_tls_win_cert: VAR_TLS_WIN_CERT STRING_ARG */
+#line 1103 "util/configparser.y"
{
OUTYY(("P(server_tls_win_cert:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3869,53 +3954,53 @@ yyreduce:
else cfg_parser->cfg->tls_win_cert = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3873 "util/configparser.c"
+#line 3958 "util/configparser.c"
break;
- case 389: /* server_tls_additional_port: VAR_TLS_ADDITIONAL_PORT STRING_ARG */
-#line 1100 "util/configparser.y"
+ case 399: /* server_tls_additional_port: VAR_TLS_ADDITIONAL_PORT STRING_ARG */
+#line 1112 "util/configparser.y"
{
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 3884 "util/configparser.c"
+#line 3969 "util/configparser.c"
break;
- case 390: /* server_tls_ciphers: VAR_TLS_CIPHERS STRING_ARG */
-#line 1108 "util/configparser.y"
+ case 400: /* server_tls_ciphers: VAR_TLS_CIPHERS STRING_ARG */
+#line 1120 "util/configparser.y"
{
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 3894 "util/configparser.c"
+#line 3979 "util/configparser.c"
break;
- case 391: /* server_tls_ciphersuites: VAR_TLS_CIPHERSUITES STRING_ARG */
-#line 1115 "util/configparser.y"
+ case 401: /* server_tls_ciphersuites: VAR_TLS_CIPHERSUITES STRING_ARG */
+#line 1127 "util/configparser.y"
{
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 3904 "util/configparser.c"
+#line 3989 "util/configparser.c"
break;
- case 392: /* server_tls_session_ticket_keys: VAR_TLS_SESSION_TICKET_KEYS STRING_ARG */
-#line 1122 "util/configparser.y"
+ case 402: /* server_tls_session_ticket_keys: VAR_TLS_SESSION_TICKET_KEYS STRING_ARG */
+#line 1134 "util/configparser.y"
{
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 3915 "util/configparser.c"
+#line 4000 "util/configparser.c"
break;
- case 393: /* server_tls_use_sni: VAR_TLS_USE_SNI STRING_ARG */
-#line 1130 "util/configparser.y"
+ case 403: /* server_tls_use_sni: VAR_TLS_USE_SNI STRING_ARG */
+#line 1142 "util/configparser.y"
{
OUTYY(("P(server_tls_use_sni:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3923,11 +4008,11 @@ yyreduce:
else cfg_parser->cfg->tls_use_sni = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3927 "util/configparser.c"
+#line 4012 "util/configparser.c"
break;
- case 394: /* server_https_port: VAR_HTTPS_PORT STRING_ARG */
-#line 1139 "util/configparser.y"
+ case 404: /* server_https_port: VAR_HTTPS_PORT STRING_ARG */
+#line 1151 "util/configparser.y"
{
OUTYY(("P(server_https_port:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0)
@@ -3935,11 +4020,11 @@ yyreduce:
else cfg_parser->cfg->https_port = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 3939 "util/configparser.c"
+#line 4024 "util/configparser.c"
break;
- case 395: /* server_http_endpoint: VAR_HTTP_ENDPOINT STRING_ARG */
-#line 1147 "util/configparser.y"
+ case 405: /* server_http_endpoint: VAR_HTTP_ENDPOINT STRING_ARG */
+#line 1159 "util/configparser.y"
{
OUTYY(("P(server_http_endpoint:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->http_endpoint);
@@ -3955,11 +4040,11 @@ yyreduce:
cfg_parser->cfg->http_endpoint = (yyvsp[0].str);
}
}
-#line 3959 "util/configparser.c"
+#line 4044 "util/configparser.c"
break;
- case 396: /* server_http_max_streams: VAR_HTTP_MAX_STREAMS STRING_ARG */
-#line 1163 "util/configparser.y"
+ case 406: /* server_http_max_streams: VAR_HTTP_MAX_STREAMS STRING_ARG */
+#line 1175 "util/configparser.y"
{
OUTYY(("P(server_http_max_streams:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -3967,11 +4052,11 @@ yyreduce:
else cfg_parser->cfg->http_max_streams = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 3971 "util/configparser.c"
+#line 4056 "util/configparser.c"
break;
- case 397: /* server_http_query_buffer_size: VAR_HTTP_QUERY_BUFFER_SIZE STRING_ARG */
-#line 1171 "util/configparser.y"
+ case 407: /* server_http_query_buffer_size: VAR_HTTP_QUERY_BUFFER_SIZE STRING_ARG */
+#line 1183 "util/configparser.y"
{
OUTYY(("P(server_http_query_buffer_size:%s)\n", (yyvsp[0].str)));
if(!cfg_parse_memsize((yyvsp[0].str),
@@ -3979,11 +4064,11 @@ yyreduce:
yyerror("memory size expected");
free((yyvsp[0].str));
}
-#line 3983 "util/configparser.c"
+#line 4068 "util/configparser.c"
break;
- case 398: /* server_http_response_buffer_size: VAR_HTTP_RESPONSE_BUFFER_SIZE STRING_ARG */
-#line 1179 "util/configparser.y"
+ case 408: /* server_http_response_buffer_size: VAR_HTTP_RESPONSE_BUFFER_SIZE STRING_ARG */
+#line 1191 "util/configparser.y"
{
OUTYY(("P(server_http_response_buffer_size:%s)\n", (yyvsp[0].str)));
if(!cfg_parse_memsize((yyvsp[0].str),
@@ -3991,11 +4076,11 @@ yyreduce:
yyerror("memory size expected");
free((yyvsp[0].str));
}
-#line 3995 "util/configparser.c"
+#line 4080 "util/configparser.c"
break;
- case 399: /* server_http_nodelay: VAR_HTTP_NODELAY STRING_ARG */
-#line 1187 "util/configparser.y"
+ case 409: /* server_http_nodelay: VAR_HTTP_NODELAY STRING_ARG */
+#line 1199 "util/configparser.y"
{
OUTYY(("P(server_http_nodelay:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4003,11 +4088,11 @@ yyreduce:
else cfg_parser->cfg->http_nodelay = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4007 "util/configparser.c"
+#line 4092 "util/configparser.c"
break;
- case 400: /* server_http_notls_downstream: VAR_HTTP_NOTLS_DOWNSTREAM STRING_ARG */
-#line 1195 "util/configparser.y"
+ case 410: /* server_http_notls_downstream: VAR_HTTP_NOTLS_DOWNSTREAM STRING_ARG */
+#line 1207 "util/configparser.y"
{
OUTYY(("P(server_http_notls_downstream:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4015,11 +4100,39 @@ yyreduce:
else cfg_parser->cfg->http_notls_downstream = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4019 "util/configparser.c"
+#line 4104 "util/configparser.c"
break;
- case 401: /* server_use_systemd: VAR_USE_SYSTEMD STRING_ARG */
-#line 1203 "util/configparser.y"
+ case 411: /* server_quic_port: VAR_QUIC_PORT STRING_ARG */
+#line 1215 "util/configparser.y"
+ {
+ OUTYY(("P(server_quic_port:%s)\n", (yyvsp[0].str)));
+#ifndef HAVE_NGTCP2
+ log_warn("%s:%d: Unbound is not compiled with "
+ "ngtcp2. This is required to use DNS "
+ "over QUIC.", cfg_parser->filename, cfg_parser->line);
+#endif
+ if(atoi((yyvsp[0].str)) == 0)
+ yyerror("port number expected");
+ else cfg_parser->cfg->quic_port = atoi((yyvsp[0].str));
+ free((yyvsp[0].str));
+ }
+#line 4121 "util/configparser.c"
+ break;
+
+ case 412: /* server_quic_size: VAR_QUIC_SIZE STRING_ARG */
+#line 1228 "util/configparser.y"
+ {
+ OUTYY(("P(server_quic_size:%s)\n", (yyvsp[0].str)));
+ if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->quic_size))
+ yyerror("memory size expected");
+ free((yyvsp[0].str));
+ }
+#line 4132 "util/configparser.c"
+ break;
+
+ case 413: /* server_use_systemd: VAR_USE_SYSTEMD STRING_ARG */
+#line 1235 "util/configparser.y"
{
OUTYY(("P(server_use_systemd:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4027,11 +4140,11 @@ yyreduce:
else cfg_parser->cfg->use_systemd = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4031 "util/configparser.c"
+#line 4144 "util/configparser.c"
break;
- case 402: /* server_do_daemonize: VAR_DO_DAEMONIZE STRING_ARG */
-#line 1212 "util/configparser.y"
+ case 414: /* server_do_daemonize: VAR_DO_DAEMONIZE STRING_ARG */
+#line 1244 "util/configparser.y"
{
OUTYY(("P(server_do_daemonize:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4039,11 +4152,11 @@ yyreduce:
else cfg_parser->cfg->do_daemonize = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4043 "util/configparser.c"
+#line 4156 "util/configparser.c"
break;
- case 403: /* server_use_syslog: VAR_USE_SYSLOG STRING_ARG */
-#line 1221 "util/configparser.y"
+ case 415: /* server_use_syslog: VAR_USE_SYSLOG STRING_ARG */
+#line 1253 "util/configparser.y"
{
OUTYY(("P(server_use_syslog:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4056,11 +4169,11 @@ yyreduce:
#endif
free((yyvsp[0].str));
}
-#line 4060 "util/configparser.c"
+#line 4173 "util/configparser.c"
break;
- case 404: /* server_log_time_ascii: VAR_LOG_TIME_ASCII STRING_ARG */
-#line 1235 "util/configparser.y"
+ case 416: /* server_log_time_ascii: VAR_LOG_TIME_ASCII STRING_ARG */
+#line 1267 "util/configparser.y"
{
OUTYY(("P(server_log_time_ascii:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4068,11 +4181,23 @@ yyreduce:
else cfg_parser->cfg->log_time_ascii = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4072 "util/configparser.c"
+#line 4185 "util/configparser.c"
break;
- case 405: /* server_log_queries: VAR_LOG_QUERIES STRING_ARG */
-#line 1244 "util/configparser.y"
+ case 417: /* server_log_time_iso: VAR_LOG_TIME_ISO STRING_ARG */
+#line 1276 "util/configparser.y"
+ {
+ OUTYY(("P(server_log_time_iso:%s)\n", (yyvsp[0].str)));
+ if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
+ yyerror("expected yes or no.");
+ else cfg_parser->cfg->log_time_iso = (strcmp((yyvsp[0].str), "yes")==0);
+ free((yyvsp[0].str));
+ }
+#line 4197 "util/configparser.c"
+ break;
+
+ case 418: /* server_log_queries: VAR_LOG_QUERIES STRING_ARG */
+#line 1285 "util/configparser.y"
{
OUTYY(("P(server_log_queries:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4080,11 +4205,11 @@ yyreduce:
else cfg_parser->cfg->log_queries = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4084 "util/configparser.c"
+#line 4209 "util/configparser.c"
break;
- case 406: /* server_log_replies: VAR_LOG_REPLIES STRING_ARG */
-#line 1253 "util/configparser.y"
+ case 419: /* server_log_replies: VAR_LOG_REPLIES STRING_ARG */
+#line 1294 "util/configparser.y"
{
OUTYY(("P(server_log_replies:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4092,11 +4217,11 @@ yyreduce:
else cfg_parser->cfg->log_replies = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4096 "util/configparser.c"
+#line 4221 "util/configparser.c"
break;
- case 407: /* server_log_tag_queryreply: VAR_LOG_TAG_QUERYREPLY STRING_ARG */
-#line 1262 "util/configparser.y"
+ case 420: /* server_log_tag_queryreply: VAR_LOG_TAG_QUERYREPLY STRING_ARG */
+#line 1303 "util/configparser.y"
{
OUTYY(("P(server_log_tag_queryreply:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4104,11 +4229,11 @@ yyreduce:
else cfg_parser->cfg->log_tag_queryreply = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4108 "util/configparser.c"
+#line 4233 "util/configparser.c"
break;
- case 408: /* server_log_servfail: VAR_LOG_SERVFAIL STRING_ARG */
-#line 1271 "util/configparser.y"
+ case 421: /* server_log_servfail: VAR_LOG_SERVFAIL STRING_ARG */
+#line 1312 "util/configparser.y"
{
OUTYY(("P(server_log_servfail:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4116,11 +4241,11 @@ yyreduce:
else cfg_parser->cfg->log_servfail = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4120 "util/configparser.c"
+#line 4245 "util/configparser.c"
break;
- case 409: /* server_log_destaddr: VAR_LOG_DESTADDR STRING_ARG */
-#line 1280 "util/configparser.y"
+ case 422: /* server_log_destaddr: VAR_LOG_DESTADDR STRING_ARG */
+#line 1321 "util/configparser.y"
{
OUTYY(("P(server_log_destaddr:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4128,11 +4253,11 @@ yyreduce:
else cfg_parser->cfg->log_destaddr = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4132 "util/configparser.c"
+#line 4257 "util/configparser.c"
break;
- case 410: /* server_log_local_actions: VAR_LOG_LOCAL_ACTIONS STRING_ARG */
-#line 1289 "util/configparser.y"
+ case 423: /* server_log_local_actions: VAR_LOG_LOCAL_ACTIONS STRING_ARG */
+#line 1330 "util/configparser.y"
{
OUTYY(("P(server_log_local_actions:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4140,31 +4265,31 @@ yyreduce:
else cfg_parser->cfg->log_local_actions = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4144 "util/configparser.c"
+#line 4269 "util/configparser.c"
break;
- case 411: /* server_chroot: VAR_CHROOT STRING_ARG */
-#line 1298 "util/configparser.y"
+ case 424: /* server_chroot: VAR_CHROOT STRING_ARG */
+#line 1339 "util/configparser.y"
{
OUTYY(("P(server_chroot:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->chrootdir);
cfg_parser->cfg->chrootdir = (yyvsp[0].str);
}
-#line 4154 "util/configparser.c"
+#line 4279 "util/configparser.c"
break;
- case 412: /* server_username: VAR_USERNAME STRING_ARG */
-#line 1305 "util/configparser.y"
+ case 425: /* server_username: VAR_USERNAME STRING_ARG */
+#line 1346 "util/configparser.y"
{
OUTYY(("P(server_username:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->username);
cfg_parser->cfg->username = (yyvsp[0].str);
}
-#line 4164 "util/configparser.c"
+#line 4289 "util/configparser.c"
break;
- case 413: /* server_directory: VAR_DIRECTORY STRING_ARG */
-#line 1312 "util/configparser.y"
+ case 426: /* server_directory: VAR_DIRECTORY STRING_ARG */
+#line 1353 "util/configparser.y"
{
OUTYY(("P(server_directory:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->directory);
@@ -4189,105 +4314,105 @@ yyreduce:
}
}
}
-#line 4193 "util/configparser.c"
+#line 4318 "util/configparser.c"
break;
- case 414: /* server_logfile: VAR_LOGFILE STRING_ARG */
-#line 1338 "util/configparser.y"
+ case 427: /* server_logfile: VAR_LOGFILE STRING_ARG */
+#line 1379 "util/configparser.y"
{
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 4204 "util/configparser.c"
+#line 4329 "util/configparser.c"
break;
- case 415: /* server_pidfile: VAR_PIDFILE STRING_ARG */
-#line 1346 "util/configparser.y"
+ case 428: /* server_pidfile: VAR_PIDFILE STRING_ARG */
+#line 1387 "util/configparser.y"
{
OUTYY(("P(server_pidfile:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->pidfile);
cfg_parser->cfg->pidfile = (yyvsp[0].str);
}
-#line 4214 "util/configparser.c"
+#line 4339 "util/configparser.c"
break;
- case 416: /* server_root_hints: VAR_ROOT_HINTS STRING_ARG */
-#line 1353 "util/configparser.y"
+ case 429: /* server_root_hints: VAR_ROOT_HINTS STRING_ARG */
+#line 1394 "util/configparser.y"
{
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 4224 "util/configparser.c"
+#line 4349 "util/configparser.c"
break;
- case 417: /* server_dlv_anchor_file: VAR_DLV_ANCHOR_FILE STRING_ARG */
-#line 1360 "util/configparser.y"
+ case 430: /* server_dlv_anchor_file: VAR_DLV_ANCHOR_FILE STRING_ARG */
+#line 1401 "util/configparser.y"
{
OUTYY(("P(server_dlv_anchor_file:%s)\n", (yyvsp[0].str)));
log_warn("option dlv-anchor-file ignored: DLV is decommissioned");
free((yyvsp[0].str));
}
-#line 4234 "util/configparser.c"
+#line 4359 "util/configparser.c"
break;
- case 418: /* server_dlv_anchor: VAR_DLV_ANCHOR STRING_ARG */
-#line 1367 "util/configparser.y"
+ case 431: /* server_dlv_anchor: VAR_DLV_ANCHOR STRING_ARG */
+#line 1408 "util/configparser.y"
{
OUTYY(("P(server_dlv_anchor:%s)\n", (yyvsp[0].str)));
log_warn("option dlv-anchor ignored: DLV is decommissioned");
free((yyvsp[0].str));
}
-#line 4244 "util/configparser.c"
+#line 4369 "util/configparser.c"
break;
- case 419: /* server_auto_trust_anchor_file: VAR_AUTO_TRUST_ANCHOR_FILE STRING_ARG */
-#line 1374 "util/configparser.y"
+ case 432: /* server_auto_trust_anchor_file: VAR_AUTO_TRUST_ANCHOR_FILE STRING_ARG */
+#line 1415 "util/configparser.y"
{
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 4255 "util/configparser.c"
+#line 4380 "util/configparser.c"
break;
- case 420: /* server_trust_anchor_file: VAR_TRUST_ANCHOR_FILE STRING_ARG */
-#line 1382 "util/configparser.y"
+ case 433: /* server_trust_anchor_file: VAR_TRUST_ANCHOR_FILE STRING_ARG */
+#line 1423 "util/configparser.y"
{
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 4266 "util/configparser.c"
+#line 4391 "util/configparser.c"
break;
- case 421: /* server_trusted_keys_file: VAR_TRUSTED_KEYS_FILE STRING_ARG */
-#line 1390 "util/configparser.y"
+ case 434: /* server_trusted_keys_file: VAR_TRUSTED_KEYS_FILE STRING_ARG */
+#line 1431 "util/configparser.y"
{
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 4277 "util/configparser.c"
+#line 4402 "util/configparser.c"
break;
- case 422: /* server_trust_anchor: VAR_TRUST_ANCHOR STRING_ARG */
-#line 1398 "util/configparser.y"
+ case 435: /* server_trust_anchor: VAR_TRUST_ANCHOR STRING_ARG */
+#line 1439 "util/configparser.y"
{
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 4287 "util/configparser.c"
+#line 4412 "util/configparser.c"
break;
- case 423: /* server_trust_anchor_signaling: VAR_TRUST_ANCHOR_SIGNALING STRING_ARG */
-#line 1405 "util/configparser.y"
+ case 436: /* server_trust_anchor_signaling: VAR_TRUST_ANCHOR_SIGNALING STRING_ARG */
+#line 1446 "util/configparser.y"
{
OUTYY(("P(server_trust_anchor_signaling:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4297,11 +4422,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4301 "util/configparser.c"
+#line 4426 "util/configparser.c"
break;
- case 424: /* server_root_key_sentinel: VAR_ROOT_KEY_SENTINEL STRING_ARG */
-#line 1416 "util/configparser.y"
+ case 437: /* server_root_key_sentinel: VAR_ROOT_KEY_SENTINEL STRING_ARG */
+#line 1457 "util/configparser.y"
{
OUTYY(("P(server_root_key_sentinel:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4311,21 +4436,21 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4315 "util/configparser.c"
+#line 4440 "util/configparser.c"
break;
- case 425: /* server_domain_insecure: VAR_DOMAIN_INSECURE STRING_ARG */
-#line 1427 "util/configparser.y"
+ case 438: /* server_domain_insecure: VAR_DOMAIN_INSECURE STRING_ARG */
+#line 1468 "util/configparser.y"
{
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 4325 "util/configparser.c"
+#line 4450 "util/configparser.c"
break;
- case 426: /* server_hide_identity: VAR_HIDE_IDENTITY STRING_ARG */
-#line 1434 "util/configparser.y"
+ case 439: /* server_hide_identity: VAR_HIDE_IDENTITY STRING_ARG */
+#line 1475 "util/configparser.y"
{
OUTYY(("P(server_hide_identity:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4333,11 +4458,11 @@ yyreduce:
else cfg_parser->cfg->hide_identity = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4337 "util/configparser.c"
+#line 4462 "util/configparser.c"
break;
- case 427: /* server_hide_version: VAR_HIDE_VERSION STRING_ARG */
-#line 1443 "util/configparser.y"
+ case 440: /* server_hide_version: VAR_HIDE_VERSION STRING_ARG */
+#line 1484 "util/configparser.y"
{
OUTYY(("P(server_hide_version:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4345,11 +4470,11 @@ yyreduce:
else cfg_parser->cfg->hide_version = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4349 "util/configparser.c"
+#line 4474 "util/configparser.c"
break;
- case 428: /* server_hide_trustanchor: VAR_HIDE_TRUSTANCHOR STRING_ARG */
-#line 1452 "util/configparser.y"
+ case 441: /* server_hide_trustanchor: VAR_HIDE_TRUSTANCHOR STRING_ARG */
+#line 1493 "util/configparser.y"
{
OUTYY(("P(server_hide_trustanchor:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4357,11 +4482,11 @@ yyreduce:
else cfg_parser->cfg->hide_trustanchor = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4361 "util/configparser.c"
+#line 4486 "util/configparser.c"
break;
- case 429: /* server_hide_http_user_agent: VAR_HIDE_HTTP_USER_AGENT STRING_ARG */
-#line 1461 "util/configparser.y"
+ case 442: /* server_hide_http_user_agent: VAR_HIDE_HTTP_USER_AGENT STRING_ARG */
+#line 1502 "util/configparser.y"
{
OUTYY(("P(server_hide_user_agent:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4369,41 +4494,41 @@ yyreduce:
else cfg_parser->cfg->hide_http_user_agent = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4373 "util/configparser.c"
+#line 4498 "util/configparser.c"
break;
- case 430: /* server_identity: VAR_IDENTITY STRING_ARG */
-#line 1470 "util/configparser.y"
+ case 443: /* server_identity: VAR_IDENTITY STRING_ARG */
+#line 1511 "util/configparser.y"
{
OUTYY(("P(server_identity:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->identity);
cfg_parser->cfg->identity = (yyvsp[0].str);
}
-#line 4383 "util/configparser.c"
+#line 4508 "util/configparser.c"
break;
- case 431: /* server_version: VAR_VERSION STRING_ARG */
-#line 1477 "util/configparser.y"
+ case 444: /* server_version: VAR_VERSION STRING_ARG */
+#line 1518 "util/configparser.y"
{
OUTYY(("P(server_version:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->version);
cfg_parser->cfg->version = (yyvsp[0].str);
}
-#line 4393 "util/configparser.c"
+#line 4518 "util/configparser.c"
break;
- case 432: /* server_http_user_agent: VAR_HTTP_USER_AGENT STRING_ARG */
-#line 1484 "util/configparser.y"
+ case 445: /* server_http_user_agent: VAR_HTTP_USER_AGENT STRING_ARG */
+#line 1525 "util/configparser.y"
{
OUTYY(("P(server_http_user_agent:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->http_user_agent);
cfg_parser->cfg->http_user_agent = (yyvsp[0].str);
}
-#line 4403 "util/configparser.c"
+#line 4528 "util/configparser.c"
break;
- case 433: /* server_nsid: VAR_NSID STRING_ARG */
-#line 1491 "util/configparser.y"
+ case 446: /* server_nsid: VAR_NSID STRING_ARG */
+#line 1532 "util/configparser.y"
{
OUTYY(("P(server_nsid:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->nsid_cfg_str);
@@ -4418,33 +4543,33 @@ yyreduce:
yyerror("the NSID must be either a hex string or an "
"ascii character string prepended with ascii_.");
}
-#line 4422 "util/configparser.c"
+#line 4547 "util/configparser.c"
break;
- case 434: /* server_so_rcvbuf: VAR_SO_RCVBUF STRING_ARG */
-#line 1507 "util/configparser.y"
+ case 447: /* server_so_rcvbuf: VAR_SO_RCVBUF STRING_ARG */
+#line 1548 "util/configparser.y"
{
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 4433 "util/configparser.c"
+#line 4558 "util/configparser.c"
break;
- case 435: /* server_so_sndbuf: VAR_SO_SNDBUF STRING_ARG */
-#line 1515 "util/configparser.y"
+ case 448: /* server_so_sndbuf: VAR_SO_SNDBUF STRING_ARG */
+#line 1556 "util/configparser.y"
{
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 4444 "util/configparser.c"
+#line 4569 "util/configparser.c"
break;
- case 436: /* server_so_reuseport: VAR_SO_REUSEPORT STRING_ARG */
-#line 1523 "util/configparser.y"
+ case 449: /* server_so_reuseport: VAR_SO_REUSEPORT STRING_ARG */
+#line 1564 "util/configparser.y"
{
OUTYY(("P(server_so_reuseport:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4453,11 +4578,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4457 "util/configparser.c"
+#line 4582 "util/configparser.c"
break;
- case 437: /* server_ip_transparent: VAR_IP_TRANSPARENT STRING_ARG */
-#line 1533 "util/configparser.y"
+ case 450: /* server_ip_transparent: VAR_IP_TRANSPARENT STRING_ARG */
+#line 1574 "util/configparser.y"
{
OUTYY(("P(server_ip_transparent:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4466,11 +4591,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4470 "util/configparser.c"
+#line 4595 "util/configparser.c"
break;
- case 438: /* server_ip_freebind: VAR_IP_FREEBIND STRING_ARG */
-#line 1543 "util/configparser.y"
+ case 451: /* server_ip_freebind: VAR_IP_FREEBIND STRING_ARG */
+#line 1584 "util/configparser.y"
{
OUTYY(("P(server_ip_freebind:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4479,11 +4604,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4483 "util/configparser.c"
+#line 4608 "util/configparser.c"
break;
- case 439: /* server_ip_dscp: VAR_IP_DSCP STRING_ARG */
-#line 1553 "util/configparser.y"
+ case 452: /* server_ip_dscp: VAR_IP_DSCP STRING_ARG */
+#line 1594 "util/configparser.y"
{
OUTYY(("P(server_ip_dscp:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -4496,22 +4621,22 @@ yyreduce:
cfg_parser->cfg->ip_dscp = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 4500 "util/configparser.c"
+#line 4625 "util/configparser.c"
break;
- case 440: /* server_stream_wait_size: VAR_STREAM_WAIT_SIZE STRING_ARG */
-#line 1567 "util/configparser.y"
+ case 453: /* server_stream_wait_size: VAR_STREAM_WAIT_SIZE STRING_ARG */
+#line 1608 "util/configparser.y"
{
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 4511 "util/configparser.c"
+#line 4636 "util/configparser.c"
break;
- case 441: /* server_edns_buffer_size: VAR_EDNS_BUFFER_SIZE STRING_ARG */
-#line 1575 "util/configparser.y"
+ case 454: /* server_edns_buffer_size: VAR_EDNS_BUFFER_SIZE STRING_ARG */
+#line 1616 "util/configparser.y"
{
OUTYY(("P(server_edns_buffer_size:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0)
@@ -4523,11 +4648,11 @@ yyreduce:
else cfg_parser->cfg->edns_buffer_size = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 4527 "util/configparser.c"
+#line 4652 "util/configparser.c"
break;
- case 442: /* server_msg_buffer_size: VAR_MSG_BUFFER_SIZE STRING_ARG */
-#line 1588 "util/configparser.y"
+ case 455: /* server_msg_buffer_size: VAR_MSG_BUFFER_SIZE STRING_ARG */
+#line 1629 "util/configparser.y"
{
OUTYY(("P(server_msg_buffer_size:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0)
@@ -4537,22 +4662,22 @@ yyreduce:
else cfg_parser->cfg->msg_buffer_size = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 4541 "util/configparser.c"
+#line 4666 "util/configparser.c"
break;
- case 443: /* server_msg_cache_size: VAR_MSG_CACHE_SIZE STRING_ARG */
-#line 1599 "util/configparser.y"
+ case 456: /* server_msg_cache_size: VAR_MSG_CACHE_SIZE STRING_ARG */
+#line 1640 "util/configparser.y"
{
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 4552 "util/configparser.c"
+#line 4677 "util/configparser.c"
break;
- case 444: /* server_msg_cache_slabs: VAR_MSG_CACHE_SLABS STRING_ARG */
-#line 1607 "util/configparser.y"
+ case 457: /* server_msg_cache_slabs: VAR_MSG_CACHE_SLABS STRING_ARG */
+#line 1648 "util/configparser.y"
{
OUTYY(("P(server_msg_cache_slabs:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0) {
@@ -4564,11 +4689,11 @@ yyreduce:
}
free((yyvsp[0].str));
}
-#line 4568 "util/configparser.c"
+#line 4693 "util/configparser.c"
break;
- case 445: /* server_num_queries_per_thread: VAR_NUM_QUERIES_PER_THREAD STRING_ARG */
-#line 1620 "util/configparser.y"
+ case 458: /* server_num_queries_per_thread: VAR_NUM_QUERIES_PER_THREAD STRING_ARG */
+#line 1661 "util/configparser.y"
{
OUTYY(("P(server_num_queries_per_thread:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0)
@@ -4576,11 +4701,11 @@ yyreduce:
else cfg_parser->cfg->num_queries_per_thread = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 4580 "util/configparser.c"
+#line 4705 "util/configparser.c"
break;
- case 446: /* server_jostle_timeout: VAR_JOSTLE_TIMEOUT STRING_ARG */
-#line 1629 "util/configparser.y"
+ case 459: /* server_jostle_timeout: VAR_JOSTLE_TIMEOUT STRING_ARG */
+#line 1670 "util/configparser.y"
{
OUTYY(("P(server_jostle_timeout:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -4588,11 +4713,11 @@ yyreduce:
else cfg_parser->cfg->jostle_time = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 4592 "util/configparser.c"
+#line 4717 "util/configparser.c"
break;
- case 447: /* server_delay_close: VAR_DELAY_CLOSE STRING_ARG */
-#line 1638 "util/configparser.y"
+ case 460: /* server_delay_close: VAR_DELAY_CLOSE STRING_ARG */
+#line 1679 "util/configparser.y"
{
OUTYY(("P(server_delay_close:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -4600,11 +4725,11 @@ yyreduce:
else cfg_parser->cfg->delay_close = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 4604 "util/configparser.c"
+#line 4729 "util/configparser.c"
break;
- case 448: /* server_udp_connect: VAR_UDP_CONNECT STRING_ARG */
-#line 1647 "util/configparser.y"
+ case 461: /* server_udp_connect: VAR_UDP_CONNECT STRING_ARG */
+#line 1688 "util/configparser.y"
{
OUTYY(("P(server_udp_connect:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4612,11 +4737,11 @@ yyreduce:
else cfg_parser->cfg->udp_connect = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4616 "util/configparser.c"
+#line 4741 "util/configparser.c"
break;
- case 449: /* server_unblock_lan_zones: VAR_UNBLOCK_LAN_ZONES STRING_ARG */
-#line 1656 "util/configparser.y"
+ case 462: /* server_unblock_lan_zones: VAR_UNBLOCK_LAN_ZONES STRING_ARG */
+#line 1697 "util/configparser.y"
{
OUTYY(("P(server_unblock_lan_zones:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4625,11 +4750,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4629 "util/configparser.c"
+#line 4754 "util/configparser.c"
break;
- case 450: /* server_insecure_lan_zones: VAR_INSECURE_LAN_ZONES STRING_ARG */
-#line 1666 "util/configparser.y"
+ case 463: /* server_insecure_lan_zones: VAR_INSECURE_LAN_ZONES STRING_ARG */
+#line 1707 "util/configparser.y"
{
OUTYY(("P(server_insecure_lan_zones:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4638,22 +4763,22 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4642 "util/configparser.c"
+#line 4767 "util/configparser.c"
break;
- case 451: /* server_rrset_cache_size: VAR_RRSET_CACHE_SIZE STRING_ARG */
-#line 1676 "util/configparser.y"
+ case 464: /* server_rrset_cache_size: VAR_RRSET_CACHE_SIZE STRING_ARG */
+#line 1717 "util/configparser.y"
{
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 4653 "util/configparser.c"
+#line 4778 "util/configparser.c"
break;
- case 452: /* server_rrset_cache_slabs: VAR_RRSET_CACHE_SLABS STRING_ARG */
-#line 1684 "util/configparser.y"
+ case 465: /* server_rrset_cache_slabs: VAR_RRSET_CACHE_SLABS STRING_ARG */
+#line 1725 "util/configparser.y"
{
OUTYY(("P(server_rrset_cache_slabs:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0) {
@@ -4665,11 +4790,11 @@ yyreduce:
}
free((yyvsp[0].str));
}
-#line 4669 "util/configparser.c"
+#line 4794 "util/configparser.c"
break;
- case 453: /* server_infra_host_ttl: VAR_INFRA_HOST_TTL STRING_ARG */
-#line 1697 "util/configparser.y"
+ case 466: /* server_infra_host_ttl: VAR_INFRA_HOST_TTL STRING_ARG */
+#line 1738 "util/configparser.y"
{
OUTYY(("P(server_infra_host_ttl:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -4677,22 +4802,22 @@ yyreduce:
else cfg_parser->cfg->host_ttl = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 4681 "util/configparser.c"
+#line 4806 "util/configparser.c"
break;
- case 454: /* server_infra_lame_ttl: VAR_INFRA_LAME_TTL STRING_ARG */
-#line 1706 "util/configparser.y"
+ case 467: /* server_infra_lame_ttl: VAR_INFRA_LAME_TTL STRING_ARG */
+#line 1747 "util/configparser.y"
{
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 4692 "util/configparser.c"
+#line 4817 "util/configparser.c"
break;
- case 455: /* server_infra_cache_numhosts: VAR_INFRA_CACHE_NUMHOSTS STRING_ARG */
-#line 1714 "util/configparser.y"
+ case 468: /* server_infra_cache_numhosts: VAR_INFRA_CACHE_NUMHOSTS STRING_ARG */
+#line 1755 "util/configparser.y"
{
OUTYY(("P(server_infra_cache_numhosts:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0)
@@ -4700,22 +4825,22 @@ yyreduce:
else cfg_parser->cfg->infra_cache_numhosts = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 4704 "util/configparser.c"
+#line 4829 "util/configparser.c"
break;
- case 456: /* server_infra_cache_lame_size: VAR_INFRA_CACHE_LAME_SIZE STRING_ARG */
-#line 1723 "util/configparser.y"
+ case 469: /* server_infra_cache_lame_size: VAR_INFRA_CACHE_LAME_SIZE STRING_ARG */
+#line 1764 "util/configparser.y"
{
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 4715 "util/configparser.c"
+#line 4840 "util/configparser.c"
break;
- case 457: /* server_infra_cache_slabs: VAR_INFRA_CACHE_SLABS STRING_ARG */
-#line 1731 "util/configparser.y"
+ case 470: /* server_infra_cache_slabs: VAR_INFRA_CACHE_SLABS STRING_ARG */
+#line 1772 "util/configparser.y"
{
OUTYY(("P(server_infra_cache_slabs:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0) {
@@ -4727,11 +4852,11 @@ yyreduce:
}
free((yyvsp[0].str));
}
-#line 4731 "util/configparser.c"
+#line 4856 "util/configparser.c"
break;
- case 458: /* server_infra_cache_min_rtt: VAR_INFRA_CACHE_MIN_RTT STRING_ARG */
-#line 1744 "util/configparser.y"
+ case 471: /* server_infra_cache_min_rtt: VAR_INFRA_CACHE_MIN_RTT STRING_ARG */
+#line 1785 "util/configparser.y"
{
OUTYY(("P(server_infra_cache_min_rtt:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -4739,11 +4864,11 @@ yyreduce:
else cfg_parser->cfg->infra_cache_min_rtt = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 4743 "util/configparser.c"
+#line 4868 "util/configparser.c"
break;
- case 459: /* server_infra_cache_max_rtt: VAR_INFRA_CACHE_MAX_RTT STRING_ARG */
-#line 1753 "util/configparser.y"
+ case 472: /* server_infra_cache_max_rtt: VAR_INFRA_CACHE_MAX_RTT STRING_ARG */
+#line 1794 "util/configparser.y"
{
OUTYY(("P(server_infra_cache_max_rtt:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -4751,11 +4876,11 @@ yyreduce:
else cfg_parser->cfg->infra_cache_max_rtt = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 4755 "util/configparser.c"
+#line 4880 "util/configparser.c"
break;
- case 460: /* server_infra_keep_probing: VAR_INFRA_KEEP_PROBING STRING_ARG */
-#line 1762 "util/configparser.y"
+ case 473: /* server_infra_keep_probing: VAR_INFRA_KEEP_PROBING STRING_ARG */
+#line 1803 "util/configparser.y"
{
OUTYY(("P(server_infra_keep_probing:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4764,21 +4889,21 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4768 "util/configparser.c"
+#line 4893 "util/configparser.c"
break;
- case 461: /* server_target_fetch_policy: VAR_TARGET_FETCH_POLICY STRING_ARG */
-#line 1772 "util/configparser.y"
+ case 474: /* server_target_fetch_policy: VAR_TARGET_FETCH_POLICY STRING_ARG */
+#line 1813 "util/configparser.y"
{
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 4778 "util/configparser.c"
+#line 4903 "util/configparser.c"
break;
- case 462: /* server_harden_short_bufsize: VAR_HARDEN_SHORT_BUFSIZE STRING_ARG */
-#line 1779 "util/configparser.y"
+ case 475: /* server_harden_short_bufsize: VAR_HARDEN_SHORT_BUFSIZE STRING_ARG */
+#line 1820 "util/configparser.y"
{
OUTYY(("P(server_harden_short_bufsize:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4787,11 +4912,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4791 "util/configparser.c"
+#line 4916 "util/configparser.c"
break;
- case 463: /* server_harden_large_queries: VAR_HARDEN_LARGE_QUERIES STRING_ARG */
-#line 1789 "util/configparser.y"
+ case 476: /* server_harden_large_queries: VAR_HARDEN_LARGE_QUERIES STRING_ARG */
+#line 1830 "util/configparser.y"
{
OUTYY(("P(server_harden_large_queries:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4800,11 +4925,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4804 "util/configparser.c"
+#line 4929 "util/configparser.c"
break;
- case 464: /* server_harden_glue: VAR_HARDEN_GLUE STRING_ARG */
-#line 1799 "util/configparser.y"
+ case 477: /* server_harden_glue: VAR_HARDEN_GLUE STRING_ARG */
+#line 1840 "util/configparser.y"
{
OUTYY(("P(server_harden_glue:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4813,11 +4938,24 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4817 "util/configparser.c"
+#line 4942 "util/configparser.c"
+ break;
+
+ case 478: /* server_harden_unverified_glue: VAR_HARDEN_UNVERIFIED_GLUE STRING_ARG */
+#line 1850 "util/configparser.y"
+ {
+ OUTYY(("P(server_harden_unverified_glue:%s)\n", (yyvsp[0].str)));
+ if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
+ yyerror("expected yes or no.");
+ else cfg_parser->cfg->harden_unverified_glue =
+ (strcmp((yyvsp[0].str), "yes")==0);
+ free((yyvsp[0].str));
+ }
+#line 4955 "util/configparser.c"
break;
- case 465: /* server_harden_dnssec_stripped: VAR_HARDEN_DNSSEC_STRIPPED STRING_ARG */
-#line 1809 "util/configparser.y"
+ case 479: /* server_harden_dnssec_stripped: VAR_HARDEN_DNSSEC_STRIPPED STRING_ARG */
+#line 1860 "util/configparser.y"
{
OUTYY(("P(server_harden_dnssec_stripped:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4826,11 +4964,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4830 "util/configparser.c"
+#line 4968 "util/configparser.c"
break;
- case 466: /* server_harden_below_nxdomain: VAR_HARDEN_BELOW_NXDOMAIN STRING_ARG */
-#line 1819 "util/configparser.y"
+ case 480: /* server_harden_below_nxdomain: VAR_HARDEN_BELOW_NXDOMAIN STRING_ARG */
+#line 1870 "util/configparser.y"
{
OUTYY(("P(server_harden_below_nxdomain:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4839,11 +4977,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4843 "util/configparser.c"
+#line 4981 "util/configparser.c"
break;
- case 467: /* server_harden_referral_path: VAR_HARDEN_REFERRAL_PATH STRING_ARG */
-#line 1829 "util/configparser.y"
+ case 481: /* server_harden_referral_path: VAR_HARDEN_REFERRAL_PATH STRING_ARG */
+#line 1880 "util/configparser.y"
{
OUTYY(("P(server_harden_referral_path:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4852,11 +4990,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4856 "util/configparser.c"
+#line 4994 "util/configparser.c"
break;
- case 468: /* server_harden_algo_downgrade: VAR_HARDEN_ALGO_DOWNGRADE STRING_ARG */
-#line 1839 "util/configparser.y"
+ case 482: /* server_harden_algo_downgrade: VAR_HARDEN_ALGO_DOWNGRADE STRING_ARG */
+#line 1890 "util/configparser.y"
{
OUTYY(("P(server_harden_algo_downgrade:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4865,11 +5003,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4869 "util/configparser.c"
+#line 5007 "util/configparser.c"
break;
- case 469: /* server_harden_unknown_additional: VAR_HARDEN_UNKNOWN_ADDITIONAL STRING_ARG */
-#line 1849 "util/configparser.y"
+ case 483: /* server_harden_unknown_additional: VAR_HARDEN_UNKNOWN_ADDITIONAL STRING_ARG */
+#line 1900 "util/configparser.y"
{
OUTYY(("P(server_harden_unknown_additional:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4878,11 +5016,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4882 "util/configparser.c"
+#line 5020 "util/configparser.c"
break;
- case 470: /* server_use_caps_for_id: VAR_USE_CAPS_FOR_ID STRING_ARG */
-#line 1859 "util/configparser.y"
+ case 484: /* server_use_caps_for_id: VAR_USE_CAPS_FOR_ID STRING_ARG */
+#line 1910 "util/configparser.y"
{
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)
@@ -4891,41 +5029,41 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4895 "util/configparser.c"
+#line 5033 "util/configparser.c"
break;
- case 471: /* server_caps_whitelist: VAR_CAPS_WHITELIST STRING_ARG */
-#line 1869 "util/configparser.y"
+ case 485: /* server_caps_whitelist: VAR_CAPS_WHITELIST STRING_ARG */
+#line 1920 "util/configparser.y"
{
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 4905 "util/configparser.c"
+#line 5043 "util/configparser.c"
break;
- case 472: /* server_private_address: VAR_PRIVATE_ADDRESS STRING_ARG */
-#line 1876 "util/configparser.y"
+ case 486: /* server_private_address: VAR_PRIVATE_ADDRESS STRING_ARG */
+#line 1927 "util/configparser.y"
{
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 4915 "util/configparser.c"
+#line 5053 "util/configparser.c"
break;
- case 473: /* server_private_domain: VAR_PRIVATE_DOMAIN STRING_ARG */
-#line 1883 "util/configparser.y"
+ case 487: /* server_private_domain: VAR_PRIVATE_DOMAIN STRING_ARG */
+#line 1934 "util/configparser.y"
{
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 4925 "util/configparser.c"
+#line 5063 "util/configparser.c"
break;
- case 474: /* server_prefetch: VAR_PREFETCH STRING_ARG */
-#line 1890 "util/configparser.y"
+ case 488: /* server_prefetch: VAR_PREFETCH STRING_ARG */
+#line 1941 "util/configparser.y"
{
OUTYY(("P(server_prefetch:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4933,11 +5071,11 @@ yyreduce:
else cfg_parser->cfg->prefetch = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4937 "util/configparser.c"
+#line 5075 "util/configparser.c"
break;
- case 475: /* server_prefetch_key: VAR_PREFETCH_KEY STRING_ARG */
-#line 1899 "util/configparser.y"
+ case 489: /* server_prefetch_key: VAR_PREFETCH_KEY STRING_ARG */
+#line 1950 "util/configparser.y"
{
OUTYY(("P(server_prefetch_key:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4945,11 +5083,11 @@ yyreduce:
else cfg_parser->cfg->prefetch_key = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4949 "util/configparser.c"
+#line 5087 "util/configparser.c"
break;
- case 476: /* server_deny_any: VAR_DENY_ANY STRING_ARG */
-#line 1908 "util/configparser.y"
+ case 490: /* server_deny_any: VAR_DENY_ANY STRING_ARG */
+#line 1959 "util/configparser.y"
{
OUTYY(("P(server_deny_any:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4957,11 +5095,11 @@ yyreduce:
else cfg_parser->cfg->deny_any = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4961 "util/configparser.c"
+#line 5099 "util/configparser.c"
break;
- case 477: /* server_unwanted_reply_threshold: VAR_UNWANTED_REPLY_THRESHOLD STRING_ARG */
-#line 1917 "util/configparser.y"
+ case 491: /* server_unwanted_reply_threshold: VAR_UNWANTED_REPLY_THRESHOLD STRING_ARG */
+#line 1968 "util/configparser.y"
{
OUTYY(("P(server_unwanted_reply_threshold:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -4969,21 +5107,21 @@ yyreduce:
else cfg_parser->cfg->unwanted_threshold = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 4973 "util/configparser.c"
+#line 5111 "util/configparser.c"
break;
- case 478: /* server_do_not_query_address: VAR_DO_NOT_QUERY_ADDRESS STRING_ARG */
-#line 1926 "util/configparser.y"
+ case 492: /* server_do_not_query_address: VAR_DO_NOT_QUERY_ADDRESS STRING_ARG */
+#line 1977 "util/configparser.y"
{
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 4983 "util/configparser.c"
+#line 5121 "util/configparser.c"
break;
- case 479: /* server_do_not_query_localhost: VAR_DO_NOT_QUERY_LOCALHOST STRING_ARG */
-#line 1933 "util/configparser.y"
+ case 493: /* server_do_not_query_localhost: VAR_DO_NOT_QUERY_LOCALHOST STRING_ARG */
+#line 1984 "util/configparser.y"
{
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)
@@ -4992,22 +5130,22 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4996 "util/configparser.c"
+#line 5134 "util/configparser.c"
break;
- case 480: /* server_access_control: VAR_ACCESS_CONTROL STRING_ARG STRING_ARG */
-#line 1943 "util/configparser.y"
+ case 494: /* server_access_control: VAR_ACCESS_CONTROL STRING_ARG STRING_ARG */
+#line 1994 "util/configparser.y"
{
OUTYY(("P(server_access_control:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str)));
validate_acl_action((yyvsp[0].str));
if(!cfg_str2list_insert(&cfg_parser->cfg->acls, (yyvsp[-1].str), (yyvsp[0].str)))
fatal_exit("out of memory adding acl");
}
-#line 5007 "util/configparser.c"
+#line 5145 "util/configparser.c"
break;
- case 481: /* server_interface_action: VAR_INTERFACE_ACTION STRING_ARG STRING_ARG */
-#line 1951 "util/configparser.y"
+ case 495: /* server_interface_action: VAR_INTERFACE_ACTION STRING_ARG STRING_ARG */
+#line 2002 "util/configparser.y"
{
OUTYY(("P(server_interface_action:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str)));
validate_acl_action((yyvsp[0].str));
@@ -5015,21 +5153,21 @@ yyreduce:
&cfg_parser->cfg->interface_actions, (yyvsp[-1].str), (yyvsp[0].str)))
fatal_exit("out of memory adding acl");
}
-#line 5019 "util/configparser.c"
+#line 5157 "util/configparser.c"
break;
- case 482: /* server_module_conf: VAR_MODULE_CONF STRING_ARG */
-#line 1960 "util/configparser.y"
+ case 496: /* server_module_conf: VAR_MODULE_CONF STRING_ARG */
+#line 2011 "util/configparser.y"
{
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 5029 "util/configparser.c"
+#line 5167 "util/configparser.c"
break;
- case 483: /* server_val_override_date: VAR_VAL_OVERRIDE_DATE STRING_ARG */
-#line 1967 "util/configparser.y"
+ case 497: /* server_val_override_date: VAR_VAL_OVERRIDE_DATE STRING_ARG */
+#line 2018 "util/configparser.y"
{
OUTYY(("P(server_val_override_date:%s)\n", (yyvsp[0].str)));
if(*(yyvsp[0].str) == '\0' || strcmp((yyvsp[0].str), "0") == 0) {
@@ -5046,11 +5184,11 @@ yyreduce:
}
free((yyvsp[0].str));
}
-#line 5050 "util/configparser.c"
+#line 5188 "util/configparser.c"
break;
- case 484: /* server_val_sig_skew_min: VAR_VAL_SIG_SKEW_MIN STRING_ARG */
-#line 1985 "util/configparser.y"
+ case 498: /* server_val_sig_skew_min: VAR_VAL_SIG_SKEW_MIN STRING_ARG */
+#line 2036 "util/configparser.y"
{
OUTYY(("P(server_val_sig_skew_min:%s)\n", (yyvsp[0].str)));
if(*(yyvsp[0].str) == '\0' || strcmp((yyvsp[0].str), "0") == 0) {
@@ -5062,11 +5200,11 @@ yyreduce:
}
free((yyvsp[0].str));
}
-#line 5066 "util/configparser.c"
+#line 5204 "util/configparser.c"
break;
- case 485: /* server_val_sig_skew_max: VAR_VAL_SIG_SKEW_MAX STRING_ARG */
-#line 1998 "util/configparser.y"
+ case 499: /* server_val_sig_skew_max: VAR_VAL_SIG_SKEW_MAX STRING_ARG */
+#line 2049 "util/configparser.y"
{
OUTYY(("P(server_val_sig_skew_max:%s)\n", (yyvsp[0].str)));
if(*(yyvsp[0].str) == '\0' || strcmp((yyvsp[0].str), "0") == 0) {
@@ -5078,11 +5216,11 @@ yyreduce:
}
free((yyvsp[0].str));
}
-#line 5082 "util/configparser.c"
+#line 5220 "util/configparser.c"
break;
- case 486: /* server_val_max_restart: VAR_VAL_MAX_RESTART STRING_ARG */
-#line 2011 "util/configparser.y"
+ case 500: /* server_val_max_restart: VAR_VAL_MAX_RESTART STRING_ARG */
+#line 2062 "util/configparser.y"
{
OUTYY(("P(server_val_max_restart:%s)\n", (yyvsp[0].str)));
if(*(yyvsp[0].str) == '\0' || strcmp((yyvsp[0].str), "0") == 0) {
@@ -5094,11 +5232,11 @@ yyreduce:
}
free((yyvsp[0].str));
}
-#line 5098 "util/configparser.c"
+#line 5236 "util/configparser.c"
break;
- case 487: /* server_cache_max_ttl: VAR_CACHE_MAX_TTL STRING_ARG */
-#line 2024 "util/configparser.y"
+ case 501: /* server_cache_max_ttl: VAR_CACHE_MAX_TTL STRING_ARG */
+#line 2075 "util/configparser.y"
{
OUTYY(("P(server_cache_max_ttl:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -5106,11 +5244,11 @@ yyreduce:
else cfg_parser->cfg->max_ttl = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 5110 "util/configparser.c"
+#line 5248 "util/configparser.c"
break;
- case 488: /* server_cache_max_negative_ttl: VAR_CACHE_MAX_NEGATIVE_TTL STRING_ARG */
-#line 2033 "util/configparser.y"
+ case 502: /* server_cache_max_negative_ttl: VAR_CACHE_MAX_NEGATIVE_TTL STRING_ARG */
+#line 2084 "util/configparser.y"
{
OUTYY(("P(server_cache_max_negative_ttl:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -5118,11 +5256,11 @@ yyreduce:
else cfg_parser->cfg->max_negative_ttl = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 5122 "util/configparser.c"
+#line 5260 "util/configparser.c"
break;
- case 489: /* server_cache_min_negative_ttl: VAR_CACHE_MIN_NEGATIVE_TTL STRING_ARG */
-#line 2042 "util/configparser.y"
+ case 503: /* server_cache_min_negative_ttl: VAR_CACHE_MIN_NEGATIVE_TTL STRING_ARG */
+#line 2093 "util/configparser.y"
{
OUTYY(("P(server_cache_min_negative_ttl:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -5130,11 +5268,11 @@ yyreduce:
else cfg_parser->cfg->min_negative_ttl = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 5134 "util/configparser.c"
+#line 5272 "util/configparser.c"
break;
- case 490: /* server_cache_min_ttl: VAR_CACHE_MIN_TTL STRING_ARG */
-#line 2051 "util/configparser.y"
+ case 504: /* server_cache_min_ttl: VAR_CACHE_MIN_TTL STRING_ARG */
+#line 2102 "util/configparser.y"
{
OUTYY(("P(server_cache_min_ttl:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -5142,11 +5280,11 @@ yyreduce:
else cfg_parser->cfg->min_ttl = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 5146 "util/configparser.c"
+#line 5284 "util/configparser.c"
break;
- case 491: /* server_bogus_ttl: VAR_BOGUS_TTL STRING_ARG */
-#line 2060 "util/configparser.y"
+ case 505: /* server_bogus_ttl: VAR_BOGUS_TTL STRING_ARG */
+#line 2111 "util/configparser.y"
{
OUTYY(("P(server_bogus_ttl:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -5154,11 +5292,11 @@ yyreduce:
else cfg_parser->cfg->bogus_ttl = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 5158 "util/configparser.c"
+#line 5296 "util/configparser.c"
break;
- case 492: /* server_val_clean_additional: VAR_VAL_CLEAN_ADDITIONAL STRING_ARG */
-#line 2069 "util/configparser.y"
+ case 506: /* server_val_clean_additional: VAR_VAL_CLEAN_ADDITIONAL STRING_ARG */
+#line 2120 "util/configparser.y"
{
OUTYY(("P(server_val_clean_additional:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5167,11 +5305,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 5171 "util/configparser.c"
+#line 5309 "util/configparser.c"
break;
- case 493: /* server_val_permissive_mode: VAR_VAL_PERMISSIVE_MODE STRING_ARG */
-#line 2079 "util/configparser.y"
+ case 507: /* server_val_permissive_mode: VAR_VAL_PERMISSIVE_MODE STRING_ARG */
+#line 2130 "util/configparser.y"
{
OUTYY(("P(server_val_permissive_mode:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5180,11 +5318,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 5184 "util/configparser.c"
+#line 5322 "util/configparser.c"
break;
- case 494: /* server_aggressive_nsec: VAR_AGGRESSIVE_NSEC STRING_ARG */
-#line 2089 "util/configparser.y"
+ case 508: /* server_aggressive_nsec: VAR_AGGRESSIVE_NSEC STRING_ARG */
+#line 2140 "util/configparser.y"
{
OUTYY(("P(server_aggressive_nsec:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5194,11 +5332,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 5198 "util/configparser.c"
+#line 5336 "util/configparser.c"
break;
- case 495: /* server_ignore_cd_flag: VAR_IGNORE_CD_FLAG STRING_ARG */
-#line 2100 "util/configparser.y"
+ case 509: /* server_ignore_cd_flag: VAR_IGNORE_CD_FLAG STRING_ARG */
+#line 2151 "util/configparser.y"
{
OUTYY(("P(server_ignore_cd_flag:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5206,11 +5344,11 @@ yyreduce:
else cfg_parser->cfg->ignore_cd = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 5210 "util/configparser.c"
+#line 5348 "util/configparser.c"
break;
- case 496: /* server_disable_edns_do: VAR_DISABLE_EDNS_DO STRING_ARG */
-#line 2109 "util/configparser.y"
+ case 510: /* server_disable_edns_do: VAR_DISABLE_EDNS_DO STRING_ARG */
+#line 2160 "util/configparser.y"
{
OUTYY(("P(server_disable_edns_do:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5218,11 +5356,11 @@ yyreduce:
else cfg_parser->cfg->disable_edns_do = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 5222 "util/configparser.c"
+#line 5360 "util/configparser.c"
break;
- case 497: /* server_serve_expired: VAR_SERVE_EXPIRED STRING_ARG */
-#line 2118 "util/configparser.y"
+ case 511: /* server_serve_expired: VAR_SERVE_EXPIRED STRING_ARG */
+#line 2169 "util/configparser.y"
{
OUTYY(("P(server_serve_expired:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5230,11 +5368,11 @@ yyreduce:
else cfg_parser->cfg->serve_expired = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 5234 "util/configparser.c"
+#line 5372 "util/configparser.c"
break;
- case 498: /* server_serve_expired_ttl: VAR_SERVE_EXPIRED_TTL STRING_ARG */
-#line 2127 "util/configparser.y"
+ case 512: /* server_serve_expired_ttl: VAR_SERVE_EXPIRED_TTL STRING_ARG */
+#line 2178 "util/configparser.y"
{
OUTYY(("P(server_serve_expired_ttl:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -5242,11 +5380,11 @@ yyreduce:
else cfg_parser->cfg->serve_expired_ttl = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 5246 "util/configparser.c"
+#line 5384 "util/configparser.c"
break;
- case 499: /* server_serve_expired_ttl_reset: VAR_SERVE_EXPIRED_TTL_RESET STRING_ARG */
-#line 2136 "util/configparser.y"
+ case 513: /* server_serve_expired_ttl_reset: VAR_SERVE_EXPIRED_TTL_RESET STRING_ARG */
+#line 2187 "util/configparser.y"
{
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)
@@ -5254,11 +5392,11 @@ yyreduce:
else cfg_parser->cfg->serve_expired_ttl_reset = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 5258 "util/configparser.c"
+#line 5396 "util/configparser.c"
break;
- case 500: /* server_serve_expired_reply_ttl: VAR_SERVE_EXPIRED_REPLY_TTL STRING_ARG */
-#line 2145 "util/configparser.y"
+ case 514: /* server_serve_expired_reply_ttl: VAR_SERVE_EXPIRED_REPLY_TTL STRING_ARG */
+#line 2196 "util/configparser.y"
{
OUTYY(("P(server_serve_expired_reply_ttl:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -5266,11 +5404,11 @@ yyreduce:
else cfg_parser->cfg->serve_expired_reply_ttl = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 5270 "util/configparser.c"
+#line 5408 "util/configparser.c"
break;
- case 501: /* server_serve_expired_client_timeout: VAR_SERVE_EXPIRED_CLIENT_TIMEOUT STRING_ARG */
-#line 2154 "util/configparser.y"
+ case 515: /* server_serve_expired_client_timeout: VAR_SERVE_EXPIRED_CLIENT_TIMEOUT STRING_ARG */
+#line 2205 "util/configparser.y"
{
OUTYY(("P(server_serve_expired_client_timeout:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -5278,11 +5416,11 @@ yyreduce:
else cfg_parser->cfg->serve_expired_client_timeout = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 5282 "util/configparser.c"
+#line 5420 "util/configparser.c"
break;
- case 502: /* server_ede_serve_expired: VAR_EDE_SERVE_EXPIRED STRING_ARG */
-#line 2163 "util/configparser.y"
+ case 516: /* server_ede_serve_expired: VAR_EDE_SERVE_EXPIRED STRING_ARG */
+#line 2214 "util/configparser.y"
{
OUTYY(("P(server_ede_serve_expired:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5290,11 +5428,11 @@ yyreduce:
else cfg_parser->cfg->ede_serve_expired = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 5294 "util/configparser.c"
+#line 5432 "util/configparser.c"
break;
- case 503: /* server_serve_original_ttl: VAR_SERVE_ORIGINAL_TTL STRING_ARG */
-#line 2172 "util/configparser.y"
+ case 517: /* server_serve_original_ttl: VAR_SERVE_ORIGINAL_TTL STRING_ARG */
+#line 2223 "util/configparser.y"
{
OUTYY(("P(server_serve_original_ttl:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5302,11 +5440,11 @@ yyreduce:
else cfg_parser->cfg->serve_original_ttl = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 5306 "util/configparser.c"
+#line 5444 "util/configparser.c"
break;
- case 504: /* server_fake_dsa: VAR_FAKE_DSA STRING_ARG */
-#line 2181 "util/configparser.y"
+ case 518: /* server_fake_dsa: VAR_FAKE_DSA STRING_ARG */
+#line 2232 "util/configparser.y"
{
OUTYY(("P(server_fake_dsa:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5318,11 +5456,11 @@ yyreduce:
#endif
free((yyvsp[0].str));
}
-#line 5322 "util/configparser.c"
+#line 5460 "util/configparser.c"
break;
- case 505: /* server_fake_sha1: VAR_FAKE_SHA1 STRING_ARG */
-#line 2194 "util/configparser.y"
+ case 519: /* server_fake_sha1: VAR_FAKE_SHA1 STRING_ARG */
+#line 2245 "util/configparser.y"
{
OUTYY(("P(server_fake_sha1:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5334,11 +5472,11 @@ yyreduce:
#endif
free((yyvsp[0].str));
}
-#line 5338 "util/configparser.c"
+#line 5476 "util/configparser.c"
break;
- case 506: /* server_val_log_level: VAR_VAL_LOG_LEVEL STRING_ARG */
-#line 2207 "util/configparser.y"
+ case 520: /* server_val_log_level: VAR_VAL_LOG_LEVEL STRING_ARG */
+#line 2258 "util/configparser.y"
{
OUTYY(("P(server_val_log_level:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -5346,21 +5484,21 @@ yyreduce:
else cfg_parser->cfg->val_log_level = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 5350 "util/configparser.c"
+#line 5488 "util/configparser.c"
break;
- case 507: /* server_val_nsec3_keysize_iterations: VAR_VAL_NSEC3_KEYSIZE_ITERATIONS STRING_ARG */
-#line 2216 "util/configparser.y"
+ case 521: /* server_val_nsec3_keysize_iterations: VAR_VAL_NSEC3_KEYSIZE_ITERATIONS STRING_ARG */
+#line 2267 "util/configparser.y"
{
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 5360 "util/configparser.c"
+#line 5498 "util/configparser.c"
break;
- case 508: /* server_zonemd_permissive_mode: VAR_ZONEMD_PERMISSIVE_MODE STRING_ARG */
-#line 2223 "util/configparser.y"
+ case 522: /* server_zonemd_permissive_mode: VAR_ZONEMD_PERMISSIVE_MODE STRING_ARG */
+#line 2274 "util/configparser.y"
{
OUTYY(("P(server_zonemd_permissive_mode:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5368,11 +5506,11 @@ yyreduce:
else cfg_parser->cfg->zonemd_permissive_mode = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 5372 "util/configparser.c"
+#line 5510 "util/configparser.c"
break;
- case 509: /* server_add_holddown: VAR_ADD_HOLDDOWN STRING_ARG */
-#line 2232 "util/configparser.y"
+ case 523: /* server_add_holddown: VAR_ADD_HOLDDOWN STRING_ARG */
+#line 2283 "util/configparser.y"
{
OUTYY(("P(server_add_holddown:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -5380,11 +5518,11 @@ yyreduce:
else cfg_parser->cfg->add_holddown = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 5384 "util/configparser.c"
+#line 5522 "util/configparser.c"
break;
- case 510: /* server_del_holddown: VAR_DEL_HOLDDOWN STRING_ARG */
-#line 2241 "util/configparser.y"
+ case 524: /* server_del_holddown: VAR_DEL_HOLDDOWN STRING_ARG */
+#line 2292 "util/configparser.y"
{
OUTYY(("P(server_del_holddown:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -5392,11 +5530,11 @@ yyreduce:
else cfg_parser->cfg->del_holddown = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 5396 "util/configparser.c"
+#line 5534 "util/configparser.c"
break;
- case 511: /* server_keep_missing: VAR_KEEP_MISSING STRING_ARG */
-#line 2250 "util/configparser.y"
+ case 525: /* server_keep_missing: VAR_KEEP_MISSING STRING_ARG */
+#line 2301 "util/configparser.y"
{
OUTYY(("P(server_keep_missing:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -5404,11 +5542,11 @@ yyreduce:
else cfg_parser->cfg->keep_missing = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 5408 "util/configparser.c"
+#line 5546 "util/configparser.c"
break;
- case 512: /* server_permit_small_holddown: VAR_PERMIT_SMALL_HOLDDOWN STRING_ARG */
-#line 2259 "util/configparser.y"
+ case 526: /* server_permit_small_holddown: VAR_PERMIT_SMALL_HOLDDOWN STRING_ARG */
+#line 2310 "util/configparser.y"
{
OUTYY(("P(server_permit_small_holddown:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5417,22 +5555,22 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 5421 "util/configparser.c"
+#line 5559 "util/configparser.c"
break;
- case 513: /* server_key_cache_size: VAR_KEY_CACHE_SIZE STRING_ARG */
-#line 2269 "util/configparser.y"
+ case 527: /* server_key_cache_size: VAR_KEY_CACHE_SIZE STRING_ARG */
+#line 2320 "util/configparser.y"
{
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 5432 "util/configparser.c"
+#line 5570 "util/configparser.c"
break;
- case 514: /* server_key_cache_slabs: VAR_KEY_CACHE_SLABS STRING_ARG */
-#line 2277 "util/configparser.y"
+ case 528: /* server_key_cache_slabs: VAR_KEY_CACHE_SLABS STRING_ARG */
+#line 2328 "util/configparser.y"
{
OUTYY(("P(server_key_cache_slabs:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0) {
@@ -5444,22 +5582,22 @@ yyreduce:
}
free((yyvsp[0].str));
}
-#line 5448 "util/configparser.c"
+#line 5586 "util/configparser.c"
break;
- case 515: /* server_neg_cache_size: VAR_NEG_CACHE_SIZE STRING_ARG */
-#line 2290 "util/configparser.y"
+ case 529: /* server_neg_cache_size: VAR_NEG_CACHE_SIZE STRING_ARG */
+#line 2341 "util/configparser.y"
{
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 5459 "util/configparser.c"
+#line 5597 "util/configparser.c"
break;
- case 516: /* server_local_zone: VAR_LOCAL_ZONE STRING_ARG STRING_ARG */
-#line 2298 "util/configparser.y"
+ case 530: /* server_local_zone: VAR_LOCAL_ZONE STRING_ARG STRING_ARG */
+#line 2349 "util/configparser.y"
{
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 &&
@@ -5514,21 +5652,21 @@ yyreduce:
fatal_exit("out of memory adding local-zone");
}
}
-#line 5518 "util/configparser.c"
+#line 5656 "util/configparser.c"
break;
- case 517: /* server_local_data: VAR_LOCAL_DATA STRING_ARG */
-#line 2354 "util/configparser.y"
+ case 531: /* server_local_data: VAR_LOCAL_DATA STRING_ARG */
+#line 2405 "util/configparser.y"
{
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 5528 "util/configparser.c"
+#line 5666 "util/configparser.c"
break;
- case 518: /* server_local_data_ptr: VAR_LOCAL_DATA_PTR STRING_ARG */
-#line 2361 "util/configparser.y"
+ case 532: /* server_local_data_ptr: VAR_LOCAL_DATA_PTR STRING_ARG */
+#line 2412 "util/configparser.y"
{
char* ptr;
OUTYY(("P(server_local_data_ptr:%s)\n", (yyvsp[0].str)));
@@ -5542,11 +5680,11 @@ yyreduce:
yyerror("local-data-ptr could not be reversed");
}
}
-#line 5546 "util/configparser.c"
+#line 5684 "util/configparser.c"
break;
- case 519: /* server_minimal_responses: VAR_MINIMAL_RESPONSES STRING_ARG */
-#line 2376 "util/configparser.y"
+ case 533: /* server_minimal_responses: VAR_MINIMAL_RESPONSES STRING_ARG */
+#line 2427 "util/configparser.y"
{
OUTYY(("P(server_minimal_responses:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5555,11 +5693,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 5559 "util/configparser.c"
+#line 5697 "util/configparser.c"
break;
- case 520: /* server_rrset_roundrobin: VAR_RRSET_ROUNDROBIN STRING_ARG */
-#line 2386 "util/configparser.y"
+ case 534: /* server_rrset_roundrobin: VAR_RRSET_ROUNDROBIN STRING_ARG */
+#line 2437 "util/configparser.y"
{
OUTYY(("P(server_rrset_roundrobin:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5568,51 +5706,51 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 5572 "util/configparser.c"
+#line 5710 "util/configparser.c"
break;
- case 521: /* server_unknown_server_time_limit: VAR_UNKNOWN_SERVER_TIME_LIMIT STRING_ARG */
-#line 2396 "util/configparser.y"
+ case 535: /* server_unknown_server_time_limit: VAR_UNKNOWN_SERVER_TIME_LIMIT STRING_ARG */
+#line 2447 "util/configparser.y"
{
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 5582 "util/configparser.c"
+#line 5720 "util/configparser.c"
break;
- case 522: /* server_discard_timeout: VAR_DISCARD_TIMEOUT STRING_ARG */
-#line 2403 "util/configparser.y"
+ case 536: /* server_discard_timeout: VAR_DISCARD_TIMEOUT STRING_ARG */
+#line 2454 "util/configparser.y"
{
OUTYY(("P(server_discard_timeout:%s)\n", (yyvsp[0].str)));
cfg_parser->cfg->discard_timeout = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 5592 "util/configparser.c"
+#line 5730 "util/configparser.c"
break;
- case 523: /* server_wait_limit: VAR_WAIT_LIMIT STRING_ARG */
-#line 2410 "util/configparser.y"
+ case 537: /* server_wait_limit: VAR_WAIT_LIMIT STRING_ARG */
+#line 2461 "util/configparser.y"
{
OUTYY(("P(server_wait_limit:%s)\n", (yyvsp[0].str)));
cfg_parser->cfg->wait_limit = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 5602 "util/configparser.c"
+#line 5740 "util/configparser.c"
break;
- case 524: /* server_wait_limit_cookie: VAR_WAIT_LIMIT_COOKIE STRING_ARG */
-#line 2417 "util/configparser.y"
+ case 538: /* server_wait_limit_cookie: VAR_WAIT_LIMIT_COOKIE STRING_ARG */
+#line 2468 "util/configparser.y"
{
OUTYY(("P(server_wait_limit_cookie:%s)\n", (yyvsp[0].str)));
cfg_parser->cfg->wait_limit_cookie = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 5612 "util/configparser.c"
+#line 5750 "util/configparser.c"
break;
- case 525: /* server_wait_limit_netblock: VAR_WAIT_LIMIT_NETBLOCK STRING_ARG STRING_ARG */
-#line 2424 "util/configparser.y"
+ case 539: /* server_wait_limit_netblock: VAR_WAIT_LIMIT_NETBLOCK STRING_ARG STRING_ARG */
+#line 2475 "util/configparser.y"
{
OUTYY(("P(server_wait_limit_netblock:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) {
@@ -5626,11 +5764,11 @@ yyreduce:
"wait-limit-netblock");
}
}
-#line 5630 "util/configparser.c"
+#line 5768 "util/configparser.c"
break;
- case 526: /* server_wait_limit_cookie_netblock: VAR_WAIT_LIMIT_COOKIE_NETBLOCK STRING_ARG STRING_ARG */
-#line 2439 "util/configparser.y"
+ case 540: /* server_wait_limit_cookie_netblock: VAR_WAIT_LIMIT_COOKIE_NETBLOCK STRING_ARG STRING_ARG */
+#line 2490 "util/configparser.y"
{
OUTYY(("P(server_wait_limit_cookie_netblock:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) {
@@ -5644,31 +5782,31 @@ yyreduce:
"wait-limit-cookie-netblock");
}
}
-#line 5648 "util/configparser.c"
+#line 5786 "util/configparser.c"
break;
- case 527: /* server_max_udp_size: VAR_MAX_UDP_SIZE STRING_ARG */
-#line 2454 "util/configparser.y"
+ case 541: /* server_max_udp_size: VAR_MAX_UDP_SIZE STRING_ARG */
+#line 2505 "util/configparser.y"
{
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 5658 "util/configparser.c"
+#line 5796 "util/configparser.c"
break;
- case 528: /* server_dns64_prefix: VAR_DNS64_PREFIX STRING_ARG */
-#line 2461 "util/configparser.y"
+ case 542: /* server_dns64_prefix: VAR_DNS64_PREFIX STRING_ARG */
+#line 2512 "util/configparser.y"
{
OUTYY(("P(dns64_prefix:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->dns64_prefix);
cfg_parser->cfg->dns64_prefix = (yyvsp[0].str);
}
-#line 5668 "util/configparser.c"
+#line 5806 "util/configparser.c"
break;
- case 529: /* server_dns64_synthall: VAR_DNS64_SYNTHALL STRING_ARG */
-#line 2468 "util/configparser.y"
+ case 543: /* server_dns64_synthall: VAR_DNS64_SYNTHALL STRING_ARG */
+#line 2519 "util/configparser.y"
{
OUTYY(("P(server_dns64_synthall:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5676,32 +5814,32 @@ yyreduce:
else cfg_parser->cfg->dns64_synthall = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 5680 "util/configparser.c"
+#line 5818 "util/configparser.c"
break;
- case 530: /* server_dns64_ignore_aaaa: VAR_DNS64_IGNORE_AAAA STRING_ARG */
-#line 2477 "util/configparser.y"
+ case 544: /* server_dns64_ignore_aaaa: VAR_DNS64_IGNORE_AAAA STRING_ARG */
+#line 2528 "util/configparser.y"
{
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 5691 "util/configparser.c"
+#line 5829 "util/configparser.c"
break;
- case 531: /* server_nat64_prefix: VAR_NAT64_PREFIX STRING_ARG */
-#line 2485 "util/configparser.y"
+ case 545: /* server_nat64_prefix: VAR_NAT64_PREFIX STRING_ARG */
+#line 2536 "util/configparser.y"
{
OUTYY(("P(nat64_prefix:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->nat64_prefix);
cfg_parser->cfg->nat64_prefix = (yyvsp[0].str);
}
-#line 5701 "util/configparser.c"
+#line 5839 "util/configparser.c"
break;
- case 532: /* server_define_tag: VAR_DEFINE_TAG STRING_ARG */
-#line 2492 "util/configparser.y"
+ case 546: /* server_define_tag: VAR_DEFINE_TAG STRING_ARG */
+#line 2543 "util/configparser.y"
{
char* p, *s = (yyvsp[0].str);
OUTYY(("P(server_define_tag:%s)\n", (yyvsp[0].str)));
@@ -5714,11 +5852,11 @@ yyreduce:
}
free((yyvsp[0].str));
}
-#line 5718 "util/configparser.c"
+#line 5856 "util/configparser.c"
break;
- case 533: /* server_local_zone_tag: VAR_LOCAL_ZONE_TAG STRING_ARG STRING_ARG */
-#line 2506 "util/configparser.y"
+ case 547: /* server_local_zone_tag: VAR_LOCAL_ZONE_TAG STRING_ARG STRING_ARG */
+#line 2557 "util/configparser.y"
{
size_t len = 0;
uint8_t* bitlist = config_parse_taglist(cfg_parser->cfg, (yyvsp[0].str),
@@ -5738,11 +5876,11 @@ yyreduce:
}
}
}
-#line 5742 "util/configparser.c"
+#line 5880 "util/configparser.c"
break;
- case 534: /* server_access_control_tag: VAR_ACCESS_CONTROL_TAG STRING_ARG STRING_ARG */
-#line 2527 "util/configparser.y"
+ case 548: /* server_access_control_tag: VAR_ACCESS_CONTROL_TAG STRING_ARG STRING_ARG */
+#line 2578 "util/configparser.y"
{
size_t len = 0;
uint8_t* bitlist = config_parse_taglist(cfg_parser->cfg, (yyvsp[0].str),
@@ -5762,11 +5900,11 @@ yyreduce:
}
}
}
-#line 5766 "util/configparser.c"
+#line 5904 "util/configparser.c"
break;
- case 535: /* server_access_control_tag_action: VAR_ACCESS_CONTROL_TAG_ACTION STRING_ARG STRING_ARG STRING_ARG */
-#line 2548 "util/configparser.y"
+ case 549: /* server_access_control_tag_action: VAR_ACCESS_CONTROL_TAG_ACTION STRING_ARG STRING_ARG STRING_ARG */
+#line 2599 "util/configparser.y"
{
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,
@@ -5777,11 +5915,11 @@ yyreduce:
free((yyvsp[0].str));
}
}
-#line 5781 "util/configparser.c"
+#line 5919 "util/configparser.c"
break;
- case 536: /* server_access_control_tag_data: VAR_ACCESS_CONTROL_TAG_DATA STRING_ARG STRING_ARG STRING_ARG */
-#line 2560 "util/configparser.y"
+ case 550: /* server_access_control_tag_data: VAR_ACCESS_CONTROL_TAG_DATA STRING_ARG STRING_ARG STRING_ARG */
+#line 2611 "util/configparser.y"
{
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,
@@ -5792,11 +5930,11 @@ yyreduce:
free((yyvsp[0].str));
}
}
-#line 5796 "util/configparser.c"
+#line 5934 "util/configparser.c"
break;
- case 537: /* server_local_zone_override: VAR_LOCAL_ZONE_OVERRIDE STRING_ARG STRING_ARG STRING_ARG */
-#line 2572 "util/configparser.y"
+ case 551: /* server_local_zone_override: VAR_LOCAL_ZONE_OVERRIDE STRING_ARG STRING_ARG STRING_ARG */
+#line 2623 "util/configparser.y"
{
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,
@@ -5807,11 +5945,11 @@ yyreduce:
free((yyvsp[0].str));
}
}
-#line 5811 "util/configparser.c"
+#line 5949 "util/configparser.c"
break;
- case 538: /* server_access_control_view: VAR_ACCESS_CONTROL_VIEW STRING_ARG STRING_ARG */
-#line 2584 "util/configparser.y"
+ case 552: /* server_access_control_view: VAR_ACCESS_CONTROL_VIEW STRING_ARG STRING_ARG */
+#line 2635 "util/configparser.y"
{
OUTYY(("P(server_access_control_view:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str)));
if(!cfg_str2list_insert(&cfg_parser->cfg->acl_view,
@@ -5819,11 +5957,11 @@ yyreduce:
yyerror("out of memory");
}
}
-#line 5823 "util/configparser.c"
+#line 5961 "util/configparser.c"
break;
- case 539: /* server_interface_tag: VAR_INTERFACE_TAG STRING_ARG STRING_ARG */
-#line 2593 "util/configparser.y"
+ case 553: /* server_interface_tag: VAR_INTERFACE_TAG STRING_ARG STRING_ARG */
+#line 2644 "util/configparser.y"
{
size_t len = 0;
uint8_t* bitlist = config_parse_taglist(cfg_parser->cfg, (yyvsp[0].str),
@@ -5843,11 +5981,11 @@ yyreduce:
}
}
}
-#line 5847 "util/configparser.c"
+#line 5985 "util/configparser.c"
break;
- case 540: /* server_interface_tag_action: VAR_INTERFACE_TAG_ACTION STRING_ARG STRING_ARG STRING_ARG */
-#line 2614 "util/configparser.y"
+ case 554: /* server_interface_tag_action: VAR_INTERFACE_TAG_ACTION STRING_ARG STRING_ARG STRING_ARG */
+#line 2665 "util/configparser.y"
{
OUTYY(("P(server_interface_tag_action:%s %s %s)\n", (yyvsp[-2].str), (yyvsp[-1].str), (yyvsp[0].str)));
if(!cfg_str3list_insert(&cfg_parser->cfg->interface_tag_actions,
@@ -5858,11 +5996,11 @@ yyreduce:
free((yyvsp[0].str));
}
}
-#line 5862 "util/configparser.c"
+#line 6000 "util/configparser.c"
break;
- case 541: /* server_interface_tag_data: VAR_INTERFACE_TAG_DATA STRING_ARG STRING_ARG STRING_ARG */
-#line 2626 "util/configparser.y"
+ case 555: /* server_interface_tag_data: VAR_INTERFACE_TAG_DATA STRING_ARG STRING_ARG STRING_ARG */
+#line 2677 "util/configparser.y"
{
OUTYY(("P(server_interface_tag_data:%s %s %s)\n", (yyvsp[-2].str), (yyvsp[-1].str), (yyvsp[0].str)));
if(!cfg_str3list_insert(&cfg_parser->cfg->interface_tag_datas,
@@ -5873,11 +6011,11 @@ yyreduce:
free((yyvsp[0].str));
}
}
-#line 5877 "util/configparser.c"
+#line 6015 "util/configparser.c"
break;
- case 542: /* server_interface_view: VAR_INTERFACE_VIEW STRING_ARG STRING_ARG */
-#line 2638 "util/configparser.y"
+ case 556: /* server_interface_view: VAR_INTERFACE_VIEW STRING_ARG STRING_ARG */
+#line 2689 "util/configparser.y"
{
OUTYY(("P(server_interface_view:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str)));
if(!cfg_str2list_insert(&cfg_parser->cfg->interface_view,
@@ -5885,11 +6023,11 @@ yyreduce:
yyerror("out of memory");
}
}
-#line 5889 "util/configparser.c"
+#line 6027 "util/configparser.c"
break;
- case 543: /* server_response_ip_tag: VAR_RESPONSE_IP_TAG STRING_ARG STRING_ARG */
-#line 2647 "util/configparser.y"
+ case 557: /* server_response_ip_tag: VAR_RESPONSE_IP_TAG STRING_ARG STRING_ARG */
+#line 2698 "util/configparser.y"
{
size_t len = 0;
uint8_t* bitlist = config_parse_taglist(cfg_parser->cfg, (yyvsp[0].str),
@@ -5909,11 +6047,11 @@ yyreduce:
}
}
}
-#line 5913 "util/configparser.c"
+#line 6051 "util/configparser.c"
break;
- case 544: /* server_ip_ratelimit: VAR_IP_RATELIMIT STRING_ARG */
-#line 2668 "util/configparser.y"
+ case 558: /* server_ip_ratelimit: VAR_IP_RATELIMIT STRING_ARG */
+#line 2719 "util/configparser.y"
{
OUTYY(("P(server_ip_ratelimit:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -5921,11 +6059,11 @@ yyreduce:
else cfg_parser->cfg->ip_ratelimit = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 5925 "util/configparser.c"
+#line 6063 "util/configparser.c"
break;
- case 545: /* server_ip_ratelimit_cookie: VAR_IP_RATELIMIT_COOKIE STRING_ARG */
-#line 2677 "util/configparser.y"
+ case 559: /* server_ip_ratelimit_cookie: VAR_IP_RATELIMIT_COOKIE STRING_ARG */
+#line 2728 "util/configparser.y"
{
OUTYY(("P(server_ip_ratelimit_cookie:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -5933,11 +6071,11 @@ yyreduce:
else cfg_parser->cfg->ip_ratelimit_cookie = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 5937 "util/configparser.c"
+#line 6075 "util/configparser.c"
break;
- case 546: /* server_ratelimit: VAR_RATELIMIT STRING_ARG */
-#line 2686 "util/configparser.y"
+ case 560: /* server_ratelimit: VAR_RATELIMIT STRING_ARG */
+#line 2737 "util/configparser.y"
{
OUTYY(("P(server_ratelimit:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -5945,33 +6083,33 @@ yyreduce:
else cfg_parser->cfg->ratelimit = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 5949 "util/configparser.c"
+#line 6087 "util/configparser.c"
break;
- case 547: /* server_ip_ratelimit_size: VAR_IP_RATELIMIT_SIZE STRING_ARG */
-#line 2695 "util/configparser.y"
+ case 561: /* server_ip_ratelimit_size: VAR_IP_RATELIMIT_SIZE STRING_ARG */
+#line 2746 "util/configparser.y"
{
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 5960 "util/configparser.c"
+#line 6098 "util/configparser.c"
break;
- case 548: /* server_ratelimit_size: VAR_RATELIMIT_SIZE STRING_ARG */
-#line 2703 "util/configparser.y"
+ case 562: /* server_ratelimit_size: VAR_RATELIMIT_SIZE STRING_ARG */
+#line 2754 "util/configparser.y"
{
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 5971 "util/configparser.c"
+#line 6109 "util/configparser.c"
break;
- case 549: /* server_ip_ratelimit_slabs: VAR_IP_RATELIMIT_SLABS STRING_ARG */
-#line 2711 "util/configparser.y"
+ case 563: /* server_ip_ratelimit_slabs: VAR_IP_RATELIMIT_SLABS STRING_ARG */
+#line 2762 "util/configparser.y"
{
OUTYY(("P(server_ip_ratelimit_slabs:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0) {
@@ -5983,11 +6121,11 @@ yyreduce:
}
free((yyvsp[0].str));
}
-#line 5987 "util/configparser.c"
+#line 6125 "util/configparser.c"
break;
- case 550: /* server_ratelimit_slabs: VAR_RATELIMIT_SLABS STRING_ARG */
-#line 2724 "util/configparser.y"
+ case 564: /* server_ratelimit_slabs: VAR_RATELIMIT_SLABS STRING_ARG */
+#line 2775 "util/configparser.y"
{
OUTYY(("P(server_ratelimit_slabs:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0) {
@@ -5999,11 +6137,11 @@ yyreduce:
}
free((yyvsp[0].str));
}
-#line 6003 "util/configparser.c"
+#line 6141 "util/configparser.c"
break;
- case 551: /* server_ratelimit_for_domain: VAR_RATELIMIT_FOR_DOMAIN STRING_ARG STRING_ARG */
-#line 2737 "util/configparser.y"
+ case 565: /* server_ratelimit_for_domain: VAR_RATELIMIT_FOR_DOMAIN STRING_ARG STRING_ARG */
+#line 2788 "util/configparser.y"
{
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) {
@@ -6017,11 +6155,11 @@ yyreduce:
"ratelimit-for-domain");
}
}
-#line 6021 "util/configparser.c"
+#line 6159 "util/configparser.c"
break;
- case 552: /* server_ratelimit_below_domain: VAR_RATELIMIT_BELOW_DOMAIN STRING_ARG STRING_ARG */
-#line 2752 "util/configparser.y"
+ case 566: /* server_ratelimit_below_domain: VAR_RATELIMIT_BELOW_DOMAIN STRING_ARG STRING_ARG */
+#line 2803 "util/configparser.y"
{
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) {
@@ -6035,11 +6173,11 @@ yyreduce:
"ratelimit-below-domain");
}
}
-#line 6039 "util/configparser.c"
+#line 6177 "util/configparser.c"
break;
- case 553: /* server_ip_ratelimit_factor: VAR_IP_RATELIMIT_FACTOR STRING_ARG */
-#line 2767 "util/configparser.y"
+ case 567: /* server_ip_ratelimit_factor: VAR_IP_RATELIMIT_FACTOR STRING_ARG */
+#line 2818 "util/configparser.y"
{
OUTYY(("P(server_ip_ratelimit_factor:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -6047,11 +6185,11 @@ yyreduce:
else cfg_parser->cfg->ip_ratelimit_factor = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 6051 "util/configparser.c"
+#line 6189 "util/configparser.c"
break;
- case 554: /* server_ratelimit_factor: VAR_RATELIMIT_FACTOR STRING_ARG */
-#line 2776 "util/configparser.y"
+ case 568: /* server_ratelimit_factor: VAR_RATELIMIT_FACTOR STRING_ARG */
+#line 2827 "util/configparser.y"
{
OUTYY(("P(server_ratelimit_factor:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -6059,11 +6197,11 @@ yyreduce:
else cfg_parser->cfg->ratelimit_factor = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 6063 "util/configparser.c"
+#line 6201 "util/configparser.c"
break;
- case 555: /* server_ip_ratelimit_backoff: VAR_IP_RATELIMIT_BACKOFF STRING_ARG */
-#line 2785 "util/configparser.y"
+ case 569: /* server_ip_ratelimit_backoff: VAR_IP_RATELIMIT_BACKOFF STRING_ARG */
+#line 2836 "util/configparser.y"
{
OUTYY(("P(server_ip_ratelimit_backoff:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -6072,11 +6210,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 6076 "util/configparser.c"
+#line 6214 "util/configparser.c"
break;
- case 556: /* server_ratelimit_backoff: VAR_RATELIMIT_BACKOFF STRING_ARG */
-#line 2795 "util/configparser.y"
+ case 570: /* server_ratelimit_backoff: VAR_RATELIMIT_BACKOFF STRING_ARG */
+#line 2846 "util/configparser.y"
{
OUTYY(("P(server_ratelimit_backoff:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -6085,11 +6223,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 6089 "util/configparser.c"
+#line 6227 "util/configparser.c"
break;
- case 557: /* server_outbound_msg_retry: VAR_OUTBOUND_MSG_RETRY STRING_ARG */
-#line 2805 "util/configparser.y"
+ case 571: /* server_outbound_msg_retry: VAR_OUTBOUND_MSG_RETRY STRING_ARG */
+#line 2856 "util/configparser.y"
{
OUTYY(("P(server_outbound_msg_retry:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -6097,11 +6235,11 @@ yyreduce:
else cfg_parser->cfg->outbound_msg_retry = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 6101 "util/configparser.c"
+#line 6239 "util/configparser.c"
break;
- case 558: /* server_max_sent_count: VAR_MAX_SENT_COUNT STRING_ARG */
-#line 2814 "util/configparser.y"
+ case 572: /* server_max_sent_count: VAR_MAX_SENT_COUNT STRING_ARG */
+#line 2865 "util/configparser.y"
{
OUTYY(("P(server_max_sent_count:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -6109,11 +6247,11 @@ yyreduce:
else cfg_parser->cfg->max_sent_count = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 6113 "util/configparser.c"
+#line 6251 "util/configparser.c"
break;
- case 559: /* server_max_query_restarts: VAR_MAX_QUERY_RESTARTS STRING_ARG */
-#line 2823 "util/configparser.y"
+ case 573: /* server_max_query_restarts: VAR_MAX_QUERY_RESTARTS STRING_ARG */
+#line 2874 "util/configparser.y"
{
OUTYY(("P(server_max_query_restarts:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -6121,20 +6259,20 @@ yyreduce:
else cfg_parser->cfg->max_query_restarts = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 6125 "util/configparser.c"
+#line 6263 "util/configparser.c"
break;
- case 560: /* server_low_rtt: VAR_LOW_RTT STRING_ARG */
-#line 2832 "util/configparser.y"
+ case 574: /* server_low_rtt: VAR_LOW_RTT STRING_ARG */
+#line 2883 "util/configparser.y"
{
OUTYY(("P(low-rtt option is deprecated, use fast-server-num instead)\n"));
free((yyvsp[0].str));
}
-#line 6134 "util/configparser.c"
+#line 6272 "util/configparser.c"
break;
- case 561: /* server_fast_server_num: VAR_FAST_SERVER_NUM STRING_ARG */
-#line 2838 "util/configparser.y"
+ case 575: /* server_fast_server_num: VAR_FAST_SERVER_NUM STRING_ARG */
+#line 2889 "util/configparser.y"
{
OUTYY(("P(server_fast_server_num:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) <= 0)
@@ -6142,11 +6280,11 @@ yyreduce:
else cfg_parser->cfg->fast_server_num = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 6146 "util/configparser.c"
+#line 6284 "util/configparser.c"
break;
- case 562: /* server_fast_server_permil: VAR_FAST_SERVER_PERMIL STRING_ARG */
-#line 2847 "util/configparser.y"
+ case 576: /* server_fast_server_permil: VAR_FAST_SERVER_PERMIL STRING_ARG */
+#line 2898 "util/configparser.y"
{
OUTYY(("P(server_fast_server_permil:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -6154,11 +6292,11 @@ yyreduce:
else cfg_parser->cfg->fast_server_permil = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 6158 "util/configparser.c"
+#line 6296 "util/configparser.c"
break;
- case 563: /* server_qname_minimisation: VAR_QNAME_MINIMISATION STRING_ARG */
-#line 2856 "util/configparser.y"
+ case 577: /* server_qname_minimisation: VAR_QNAME_MINIMISATION STRING_ARG */
+#line 2907 "util/configparser.y"
{
OUTYY(("P(server_qname_minimisation:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -6167,11 +6305,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 6171 "util/configparser.c"
+#line 6309 "util/configparser.c"
break;
- case 564: /* server_qname_minimisation_strict: VAR_QNAME_MINIMISATION_STRICT STRING_ARG */
-#line 2866 "util/configparser.y"
+ case 578: /* server_qname_minimisation_strict: VAR_QNAME_MINIMISATION_STRICT STRING_ARG */
+#line 2917 "util/configparser.y"
{
OUTYY(("P(server_qname_minimisation_strict:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -6180,11 +6318,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 6184 "util/configparser.c"
+#line 6322 "util/configparser.c"
break;
- case 565: /* server_pad_responses: VAR_PAD_RESPONSES STRING_ARG */
-#line 2876 "util/configparser.y"
+ case 579: /* server_pad_responses: VAR_PAD_RESPONSES STRING_ARG */
+#line 2927 "util/configparser.y"
{
OUTYY(("P(server_pad_responses:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -6193,11 +6331,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 6197 "util/configparser.c"
+#line 6335 "util/configparser.c"
break;
- case 566: /* server_pad_responses_block_size: VAR_PAD_RESPONSES_BLOCK_SIZE STRING_ARG */
-#line 2886 "util/configparser.y"
+ case 580: /* server_pad_responses_block_size: VAR_PAD_RESPONSES_BLOCK_SIZE STRING_ARG */
+#line 2937 "util/configparser.y"
{
OUTYY(("P(server_pad_responses_block_size:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0)
@@ -6205,11 +6343,11 @@ yyreduce:
else cfg_parser->cfg->pad_responses_block_size = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 6209 "util/configparser.c"
+#line 6347 "util/configparser.c"
break;
- case 567: /* server_pad_queries: VAR_PAD_QUERIES STRING_ARG */
-#line 2895 "util/configparser.y"
+ case 581: /* server_pad_queries: VAR_PAD_QUERIES STRING_ARG */
+#line 2946 "util/configparser.y"
{
OUTYY(("P(server_pad_queries:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -6218,11 +6356,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 6222 "util/configparser.c"
+#line 6360 "util/configparser.c"
break;
- case 568: /* server_pad_queries_block_size: VAR_PAD_QUERIES_BLOCK_SIZE STRING_ARG */
-#line 2905 "util/configparser.y"
+ case 582: /* server_pad_queries_block_size: VAR_PAD_QUERIES_BLOCK_SIZE STRING_ARG */
+#line 2956 "util/configparser.y"
{
OUTYY(("P(server_pad_queries_block_size:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0)
@@ -6230,11 +6368,11 @@ yyreduce:
else cfg_parser->cfg->pad_queries_block_size = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 6234 "util/configparser.c"
+#line 6372 "util/configparser.c"
break;
- case 569: /* server_ipsecmod_enabled: VAR_IPSECMOD_ENABLED STRING_ARG */
-#line 2914 "util/configparser.y"
+ case 583: /* server_ipsecmod_enabled: VAR_IPSECMOD_ENABLED STRING_ARG */
+#line 2965 "util/configparser.y"
{
#ifdef USE_IPSECMOD
OUTYY(("P(server_ipsecmod_enabled:%s)\n", (yyvsp[0].str)));
@@ -6246,11 +6384,11 @@ yyreduce:
#endif
free((yyvsp[0].str));
}
-#line 6250 "util/configparser.c"
+#line 6388 "util/configparser.c"
break;
- case 570: /* server_ipsecmod_ignore_bogus: VAR_IPSECMOD_IGNORE_BOGUS STRING_ARG */
-#line 2927 "util/configparser.y"
+ case 584: /* server_ipsecmod_ignore_bogus: VAR_IPSECMOD_IGNORE_BOGUS STRING_ARG */
+#line 2978 "util/configparser.y"
{
#ifdef USE_IPSECMOD
OUTYY(("P(server_ipsecmod_ignore_bogus:%s)\n", (yyvsp[0].str)));
@@ -6262,11 +6400,11 @@ yyreduce:
#endif
free((yyvsp[0].str));
}
-#line 6266 "util/configparser.c"
+#line 6404 "util/configparser.c"
break;
- case 571: /* server_ipsecmod_hook: VAR_IPSECMOD_HOOK STRING_ARG */
-#line 2940 "util/configparser.y"
+ case 585: /* server_ipsecmod_hook: VAR_IPSECMOD_HOOK STRING_ARG */
+#line 2991 "util/configparser.y"
{
#ifdef USE_IPSECMOD
OUTYY(("P(server_ipsecmod_hook:%s)\n", (yyvsp[0].str)));
@@ -6277,11 +6415,11 @@ yyreduce:
free((yyvsp[0].str));
#endif
}
-#line 6281 "util/configparser.c"
+#line 6419 "util/configparser.c"
break;
- case 572: /* server_ipsecmod_max_ttl: VAR_IPSECMOD_MAX_TTL STRING_ARG */
-#line 2952 "util/configparser.y"
+ case 586: /* server_ipsecmod_max_ttl: VAR_IPSECMOD_MAX_TTL STRING_ARG */
+#line 3003 "util/configparser.y"
{
#ifdef USE_IPSECMOD
OUTYY(("P(server_ipsecmod_max_ttl:%s)\n", (yyvsp[0].str)));
@@ -6294,11 +6432,11 @@ yyreduce:
free((yyvsp[0].str));
#endif
}
-#line 6298 "util/configparser.c"
+#line 6436 "util/configparser.c"
break;
- case 573: /* server_ipsecmod_whitelist: VAR_IPSECMOD_WHITELIST STRING_ARG */
-#line 2966 "util/configparser.y"
+ case 587: /* server_ipsecmod_whitelist: VAR_IPSECMOD_WHITELIST STRING_ARG */
+#line 3017 "util/configparser.y"
{
#ifdef USE_IPSECMOD
OUTYY(("P(server_ipsecmod_whitelist:%s)\n", (yyvsp[0].str)));
@@ -6309,11 +6447,11 @@ yyreduce:
free((yyvsp[0].str));
#endif
}
-#line 6313 "util/configparser.c"
+#line 6451 "util/configparser.c"
break;
- case 574: /* server_ipsecmod_strict: VAR_IPSECMOD_STRICT STRING_ARG */
-#line 2978 "util/configparser.y"
+ case 588: /* server_ipsecmod_strict: VAR_IPSECMOD_STRICT STRING_ARG */
+#line 3029 "util/configparser.y"
{
#ifdef USE_IPSECMOD
OUTYY(("P(server_ipsecmod_strict:%s)\n", (yyvsp[0].str)));
@@ -6326,11 +6464,11 @@ yyreduce:
free((yyvsp[0].str));
#endif
}
-#line 6330 "util/configparser.c"
+#line 6468 "util/configparser.c"
break;
- case 575: /* server_edns_client_string: VAR_EDNS_CLIENT_STRING STRING_ARG STRING_ARG */
-#line 2992 "util/configparser.y"
+ case 589: /* server_edns_client_string: VAR_EDNS_CLIENT_STRING STRING_ARG STRING_ARG */
+#line 3043 "util/configparser.y"
{
OUTYY(("P(server_edns_client_string:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str)));
if(!cfg_str2list_insert(
@@ -6338,11 +6476,11 @@ yyreduce:
fatal_exit("out of memory adding "
"edns-client-string");
}
-#line 6342 "util/configparser.c"
+#line 6480 "util/configparser.c"
break;
- case 576: /* server_edns_client_string_opcode: VAR_EDNS_CLIENT_STRING_OPCODE STRING_ARG */
-#line 3001 "util/configparser.y"
+ case 590: /* server_edns_client_string_opcode: VAR_EDNS_CLIENT_STRING_OPCODE STRING_ARG */
+#line 3052 "util/configparser.y"
{
OUTYY(("P(edns_client_string_opcode:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -6352,11 +6490,11 @@ yyreduce:
else cfg_parser->cfg->edns_client_string_opcode = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 6356 "util/configparser.c"
+#line 6494 "util/configparser.c"
break;
- case 577: /* server_ede: VAR_EDE STRING_ARG */
-#line 3012 "util/configparser.y"
+ case 591: /* server_ede: VAR_EDE STRING_ARG */
+#line 3063 "util/configparser.y"
{
OUTYY(("P(server_ede:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -6364,21 +6502,21 @@ yyreduce:
else cfg_parser->cfg->ede = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 6368 "util/configparser.c"
+#line 6506 "util/configparser.c"
break;
- case 578: /* server_proxy_protocol_port: VAR_PROXY_PROTOCOL_PORT STRING_ARG */
-#line 3021 "util/configparser.y"
+ case 592: /* server_proxy_protocol_port: VAR_PROXY_PROTOCOL_PORT STRING_ARG */
+#line 3072 "util/configparser.y"
{
OUTYY(("P(server_proxy_protocol_port:%s)\n", (yyvsp[0].str)));
if(!cfg_strlist_insert(&cfg_parser->cfg->proxy_protocol_port, (yyvsp[0].str)))
yyerror("out of memory");
}
-#line 6378 "util/configparser.c"
+#line 6516 "util/configparser.c"
break;
- case 579: /* stub_name: VAR_NAME STRING_ARG */
-#line 3028 "util/configparser.y"
+ case 593: /* stub_name: VAR_NAME STRING_ARG */
+#line 3079 "util/configparser.y"
{
OUTYY(("P(name:%s)\n", (yyvsp[0].str)));
if(cfg_parser->cfg->stubs->name)
@@ -6387,31 +6525,31 @@ yyreduce:
free(cfg_parser->cfg->stubs->name);
cfg_parser->cfg->stubs->name = (yyvsp[0].str);
}
-#line 6391 "util/configparser.c"
+#line 6529 "util/configparser.c"
break;
- case 580: /* stub_host: VAR_STUB_HOST STRING_ARG */
-#line 3038 "util/configparser.y"
+ case 594: /* stub_host: VAR_STUB_HOST STRING_ARG */
+#line 3089 "util/configparser.y"
{
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 6401 "util/configparser.c"
+#line 6539 "util/configparser.c"
break;
- case 581: /* stub_addr: VAR_STUB_ADDR STRING_ARG */
-#line 3045 "util/configparser.y"
+ case 595: /* stub_addr: VAR_STUB_ADDR STRING_ARG */
+#line 3096 "util/configparser.y"
{
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 6411 "util/configparser.c"
+#line 6549 "util/configparser.c"
break;
- case 582: /* stub_first: VAR_STUB_FIRST STRING_ARG */
-#line 3052 "util/configparser.y"
+ case 596: /* stub_first: VAR_STUB_FIRST STRING_ARG */
+#line 3103 "util/configparser.y"
{
OUTYY(("P(stub-first:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -6419,11 +6557,11 @@ yyreduce:
else cfg_parser->cfg->stubs->isfirst=(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 6423 "util/configparser.c"
+#line 6561 "util/configparser.c"
break;
- case 583: /* stub_no_cache: VAR_STUB_NO_CACHE STRING_ARG */
-#line 3061 "util/configparser.y"
+ case 597: /* stub_no_cache: VAR_STUB_NO_CACHE STRING_ARG */
+#line 3112 "util/configparser.y"
{
OUTYY(("P(stub-no-cache:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -6431,11 +6569,11 @@ yyreduce:
else cfg_parser->cfg->stubs->no_cache=(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 6435 "util/configparser.c"
+#line 6573 "util/configparser.c"
break;
- case 584: /* stub_ssl_upstream: VAR_STUB_SSL_UPSTREAM STRING_ARG */
-#line 3070 "util/configparser.y"
+ case 598: /* stub_ssl_upstream: VAR_STUB_SSL_UPSTREAM STRING_ARG */
+#line 3121 "util/configparser.y"
{
OUTYY(("P(stub-ssl-upstream:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -6444,11 +6582,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 6448 "util/configparser.c"
+#line 6586 "util/configparser.c"
break;
- case 585: /* stub_tcp_upstream: VAR_STUB_TCP_UPSTREAM STRING_ARG */
-#line 3080 "util/configparser.y"
+ case 599: /* stub_tcp_upstream: VAR_STUB_TCP_UPSTREAM STRING_ARG */
+#line 3131 "util/configparser.y"
{
OUTYY(("P(stub-tcp-upstream:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -6457,11 +6595,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 6461 "util/configparser.c"
+#line 6599 "util/configparser.c"
break;
- case 586: /* stub_prime: VAR_STUB_PRIME STRING_ARG */
-#line 3090 "util/configparser.y"
+ case 600: /* stub_prime: VAR_STUB_PRIME STRING_ARG */
+#line 3141 "util/configparser.y"
{
OUTYY(("P(stub-prime:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -6470,11 +6608,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 6474 "util/configparser.c"
+#line 6612 "util/configparser.c"
break;
- case 587: /* forward_name: VAR_NAME STRING_ARG */
-#line 3100 "util/configparser.y"
+ case 601: /* forward_name: VAR_NAME STRING_ARG */
+#line 3151 "util/configparser.y"
{
OUTYY(("P(name:%s)\n", (yyvsp[0].str)));
if(cfg_parser->cfg->forwards->name)
@@ -6483,31 +6621,31 @@ yyreduce:
free(cfg_parser->cfg->forwards->name);
cfg_parser->cfg->forwards->name = (yyvsp[0].str);
}
-#line 6487 "util/configparser.c"
+#line 6625 "util/configparser.c"
break;
- case 588: /* forward_host: VAR_FORWARD_HOST STRING_ARG */
-#line 3110 "util/configparser.y"
+ case 602: /* forward_host: VAR_FORWARD_HOST STRING_ARG */
+#line 3161 "util/configparser.y"
{
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 6497 "util/configparser.c"
+#line 6635 "util/configparser.c"
break;
- case 589: /* forward_addr: VAR_FORWARD_ADDR STRING_ARG */
-#line 3117 "util/configparser.y"
+ case 603: /* forward_addr: VAR_FORWARD_ADDR STRING_ARG */
+#line 3168 "util/configparser.y"
{
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 6507 "util/configparser.c"
+#line 6645 "util/configparser.c"
break;
- case 590: /* forward_first: VAR_FORWARD_FIRST STRING_ARG */
-#line 3124 "util/configparser.y"
+ case 604: /* forward_first: VAR_FORWARD_FIRST STRING_ARG */
+#line 3175 "util/configparser.y"
{
OUTYY(("P(forward-first:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -6515,11 +6653,11 @@ yyreduce:
else cfg_parser->cfg->forwards->isfirst=(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 6519 "util/configparser.c"
+#line 6657 "util/configparser.c"
break;
- case 591: /* forward_no_cache: VAR_FORWARD_NO_CACHE STRING_ARG */
-#line 3133 "util/configparser.y"
+ case 605: /* forward_no_cache: VAR_FORWARD_NO_CACHE STRING_ARG */
+#line 3184 "util/configparser.y"
{
OUTYY(("P(forward-no-cache:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -6527,11 +6665,11 @@ yyreduce:
else cfg_parser->cfg->forwards->no_cache=(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 6531 "util/configparser.c"
+#line 6669 "util/configparser.c"
break;
- case 592: /* forward_ssl_upstream: VAR_FORWARD_SSL_UPSTREAM STRING_ARG */
-#line 3142 "util/configparser.y"
+ case 606: /* forward_ssl_upstream: VAR_FORWARD_SSL_UPSTREAM STRING_ARG */
+#line 3193 "util/configparser.y"
{
OUTYY(("P(forward-ssl-upstream:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -6540,11 +6678,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 6544 "util/configparser.c"
+#line 6682 "util/configparser.c"
break;
- case 593: /* forward_tcp_upstream: VAR_FORWARD_TCP_UPSTREAM STRING_ARG */
-#line 3152 "util/configparser.y"
+ case 607: /* forward_tcp_upstream: VAR_FORWARD_TCP_UPSTREAM STRING_ARG */
+#line 3203 "util/configparser.y"
{
OUTYY(("P(forward-tcp-upstream:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -6553,11 +6691,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 6557 "util/configparser.c"
+#line 6695 "util/configparser.c"
break;
- case 594: /* auth_name: VAR_NAME STRING_ARG */
-#line 3162 "util/configparser.y"
+ case 608: /* auth_name: VAR_NAME STRING_ARG */
+#line 3213 "util/configparser.y"
{
OUTYY(("P(name:%s)\n", (yyvsp[0].str)));
if(cfg_parser->cfg->auths->name)
@@ -6566,52 +6704,52 @@ yyreduce:
free(cfg_parser->cfg->auths->name);
cfg_parser->cfg->auths->name = (yyvsp[0].str);
}
-#line 6570 "util/configparser.c"
+#line 6708 "util/configparser.c"
break;
- case 595: /* auth_zonefile: VAR_ZONEFILE STRING_ARG */
-#line 3172 "util/configparser.y"
+ case 609: /* auth_zonefile: VAR_ZONEFILE STRING_ARG */
+#line 3223 "util/configparser.y"
{
OUTYY(("P(zonefile:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->auths->zonefile);
cfg_parser->cfg->auths->zonefile = (yyvsp[0].str);
}
-#line 6580 "util/configparser.c"
+#line 6718 "util/configparser.c"
break;
- case 596: /* auth_master: VAR_MASTER STRING_ARG */
-#line 3179 "util/configparser.y"
+ case 610: /* auth_master: VAR_MASTER STRING_ARG */
+#line 3230 "util/configparser.y"
{
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 6590 "util/configparser.c"
+#line 6728 "util/configparser.c"
break;
- case 597: /* auth_url: VAR_URL STRING_ARG */
-#line 3186 "util/configparser.y"
+ case 611: /* auth_url: VAR_URL STRING_ARG */
+#line 3237 "util/configparser.y"
{
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 6600 "util/configparser.c"
+#line 6738 "util/configparser.c"
break;
- case 598: /* auth_allow_notify: VAR_ALLOW_NOTIFY STRING_ARG */
-#line 3193 "util/configparser.y"
+ case 612: /* auth_allow_notify: VAR_ALLOW_NOTIFY STRING_ARG */
+#line 3244 "util/configparser.y"
{
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 6611 "util/configparser.c"
+#line 6749 "util/configparser.c"
break;
- case 599: /* auth_zonemd_check: VAR_ZONEMD_CHECK STRING_ARG */
-#line 3201 "util/configparser.y"
+ case 613: /* auth_zonemd_check: VAR_ZONEMD_CHECK STRING_ARG */
+#line 3252 "util/configparser.y"
{
OUTYY(("P(zonemd-check:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -6620,11 +6758,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 6624 "util/configparser.c"
+#line 6762 "util/configparser.c"
break;
- case 600: /* auth_zonemd_reject_absence: VAR_ZONEMD_REJECT_ABSENCE STRING_ARG */
-#line 3211 "util/configparser.y"
+ case 614: /* auth_zonemd_reject_absence: VAR_ZONEMD_REJECT_ABSENCE STRING_ARG */
+#line 3262 "util/configparser.y"
{
OUTYY(("P(zonemd-reject-absence:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -6633,11 +6771,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 6637 "util/configparser.c"
+#line 6775 "util/configparser.c"
break;
- case 601: /* auth_for_downstream: VAR_FOR_DOWNSTREAM STRING_ARG */
-#line 3221 "util/configparser.y"
+ case 615: /* auth_for_downstream: VAR_FOR_DOWNSTREAM STRING_ARG */
+#line 3272 "util/configparser.y"
{
OUTYY(("P(for-downstream:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -6646,11 +6784,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 6650 "util/configparser.c"
+#line 6788 "util/configparser.c"
break;
- case 602: /* auth_for_upstream: VAR_FOR_UPSTREAM STRING_ARG */
-#line 3231 "util/configparser.y"
+ case 616: /* auth_for_upstream: VAR_FOR_UPSTREAM STRING_ARG */
+#line 3282 "util/configparser.y"
{
OUTYY(("P(for-upstream:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -6659,11 +6797,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 6663 "util/configparser.c"
+#line 6801 "util/configparser.c"
break;
- case 603: /* auth_fallback_enabled: VAR_FALLBACK_ENABLED STRING_ARG */
-#line 3241 "util/configparser.y"
+ case 617: /* auth_fallback_enabled: VAR_FALLBACK_ENABLED STRING_ARG */
+#line 3292 "util/configparser.y"
{
OUTYY(("P(fallback-enabled:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -6672,11 +6810,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 6676 "util/configparser.c"
+#line 6814 "util/configparser.c"
break;
- case 604: /* view_name: VAR_NAME STRING_ARG */
-#line 3251 "util/configparser.y"
+ case 618: /* view_name: VAR_NAME STRING_ARG */
+#line 3302 "util/configparser.y"
{
OUTYY(("P(name:%s)\n", (yyvsp[0].str)));
if(cfg_parser->cfg->views->name)
@@ -6685,11 +6823,11 @@ yyreduce:
free(cfg_parser->cfg->views->name);
cfg_parser->cfg->views->name = (yyvsp[0].str);
}
-#line 6689 "util/configparser.c"
+#line 6827 "util/configparser.c"
break;
- case 605: /* view_local_zone: VAR_LOCAL_ZONE STRING_ARG STRING_ARG */
-#line 3261 "util/configparser.y"
+ case 619: /* view_local_zone: VAR_LOCAL_ZONE STRING_ARG STRING_ARG */
+#line 3312 "util/configparser.y"
{
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 &&
@@ -6744,11 +6882,11 @@ yyreduce:
fatal_exit("out of memory adding local-zone");
}
}
-#line 6748 "util/configparser.c"
+#line 6886 "util/configparser.c"
break;
- case 606: /* view_response_ip: VAR_RESPONSE_IP STRING_ARG STRING_ARG */
-#line 3317 "util/configparser.y"
+ case 620: /* view_response_ip: VAR_RESPONSE_IP STRING_ARG STRING_ARG */
+#line 3368 "util/configparser.y"
{
OUTYY(("P(view_response_ip:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str)));
validate_respip_action((yyvsp[0].str));
@@ -6757,33 +6895,33 @@ yyreduce:
fatal_exit("out of memory adding per-view "
"response-ip action");
}
-#line 6761 "util/configparser.c"
+#line 6899 "util/configparser.c"
break;
- case 607: /* view_response_ip_data: VAR_RESPONSE_IP_DATA STRING_ARG STRING_ARG */
-#line 3327 "util/configparser.y"
+ case 621: /* view_response_ip_data: VAR_RESPONSE_IP_DATA STRING_ARG STRING_ARG */
+#line 3378 "util/configparser.y"
{
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 6772 "util/configparser.c"
+#line 6910 "util/configparser.c"
break;
- case 608: /* view_local_data: VAR_LOCAL_DATA STRING_ARG */
-#line 3335 "util/configparser.y"
+ case 622: /* view_local_data: VAR_LOCAL_DATA STRING_ARG */
+#line 3386 "util/configparser.y"
{
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 6783 "util/configparser.c"
+#line 6921 "util/configparser.c"
break;
- case 609: /* view_local_data_ptr: VAR_LOCAL_DATA_PTR STRING_ARG */
-#line 3343 "util/configparser.y"
+ case 623: /* view_local_data_ptr: VAR_LOCAL_DATA_PTR STRING_ARG */
+#line 3394 "util/configparser.y"
{
char* ptr;
OUTYY(("P(view_local_data_ptr:%s)\n", (yyvsp[0].str)));
@@ -6797,11 +6935,11 @@ yyreduce:
yyerror("local-data-ptr could not be reversed");
}
}
-#line 6801 "util/configparser.c"
+#line 6939 "util/configparser.c"
break;
- case 610: /* view_first: VAR_VIEW_FIRST STRING_ARG */
-#line 3358 "util/configparser.y"
+ case 624: /* view_first: VAR_VIEW_FIRST STRING_ARG */
+#line 3409 "util/configparser.y"
{
OUTYY(("P(view-first:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -6809,20 +6947,20 @@ yyreduce:
else cfg_parser->cfg->views->isfirst=(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 6813 "util/configparser.c"
+#line 6951 "util/configparser.c"
break;
- case 611: /* rcstart: VAR_REMOTE_CONTROL */
-#line 3367 "util/configparser.y"
+ case 625: /* rcstart: VAR_REMOTE_CONTROL */
+#line 3418 "util/configparser.y"
{
OUTYY(("\nP(remote-control:)\n"));
cfg_parser->started_toplevel = 1;
}
-#line 6822 "util/configparser.c"
+#line 6960 "util/configparser.c"
break;
- case 622: /* rc_control_enable: VAR_CONTROL_ENABLE STRING_ARG */
-#line 3379 "util/configparser.y"
+ case 636: /* rc_control_enable: VAR_CONTROL_ENABLE STRING_ARG */
+#line 3430 "util/configparser.y"
{
OUTYY(("P(control_enable:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -6831,11 +6969,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 6835 "util/configparser.c"
+#line 6973 "util/configparser.c"
break;
- case 623: /* rc_control_port: VAR_CONTROL_PORT STRING_ARG */
-#line 3389 "util/configparser.y"
+ case 637: /* rc_control_port: VAR_CONTROL_PORT STRING_ARG */
+#line 3440 "util/configparser.y"
{
OUTYY(("P(control_port:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0)
@@ -6843,80 +6981,80 @@ yyreduce:
else cfg_parser->cfg->control_port = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 6847 "util/configparser.c"
+#line 6985 "util/configparser.c"
break;
- case 624: /* rc_control_interface: VAR_CONTROL_INTERFACE STRING_ARG */
-#line 3398 "util/configparser.y"
+ case 638: /* rc_control_interface: VAR_CONTROL_INTERFACE STRING_ARG */
+#line 3449 "util/configparser.y"
{
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 6857 "util/configparser.c"
+#line 6995 "util/configparser.c"
break;
- case 625: /* rc_control_use_cert: VAR_CONTROL_USE_CERT STRING_ARG */
-#line 3405 "util/configparser.y"
+ case 639: /* rc_control_use_cert: VAR_CONTROL_USE_CERT STRING_ARG */
+#line 3456 "util/configparser.y"
{
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 6867 "util/configparser.c"
+#line 7005 "util/configparser.c"
break;
- case 626: /* rc_server_key_file: VAR_SERVER_KEY_FILE STRING_ARG */
-#line 3412 "util/configparser.y"
+ case 640: /* rc_server_key_file: VAR_SERVER_KEY_FILE STRING_ARG */
+#line 3463 "util/configparser.y"
{
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 6877 "util/configparser.c"
+#line 7015 "util/configparser.c"
break;
- case 627: /* rc_server_cert_file: VAR_SERVER_CERT_FILE STRING_ARG */
-#line 3419 "util/configparser.y"
+ case 641: /* rc_server_cert_file: VAR_SERVER_CERT_FILE STRING_ARG */
+#line 3470 "util/configparser.y"
{
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 6887 "util/configparser.c"
+#line 7025 "util/configparser.c"
break;
- case 628: /* rc_control_key_file: VAR_CONTROL_KEY_FILE STRING_ARG */
-#line 3426 "util/configparser.y"
+ case 642: /* rc_control_key_file: VAR_CONTROL_KEY_FILE STRING_ARG */
+#line 3477 "util/configparser.y"
{
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 6897 "util/configparser.c"
+#line 7035 "util/configparser.c"
break;
- case 629: /* rc_control_cert_file: VAR_CONTROL_CERT_FILE STRING_ARG */
-#line 3433 "util/configparser.y"
+ case 643: /* rc_control_cert_file: VAR_CONTROL_CERT_FILE STRING_ARG */
+#line 3484 "util/configparser.y"
{
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 6907 "util/configparser.c"
+#line 7045 "util/configparser.c"
break;
- case 630: /* dtstart: VAR_DNSTAP */
-#line 3440 "util/configparser.y"
+ case 644: /* dtstart: VAR_DNSTAP */
+#line 3491 "util/configparser.y"
{
OUTYY(("\nP(dnstap:)\n"));
cfg_parser->started_toplevel = 1;
}
-#line 6916 "util/configparser.c"
+#line 7054 "util/configparser.c"
break;
- case 653: /* dt_dnstap_enable: VAR_DNSTAP_ENABLE STRING_ARG */
-#line 3462 "util/configparser.y"
+ case 667: /* dt_dnstap_enable: VAR_DNSTAP_ENABLE STRING_ARG */
+#line 3513 "util/configparser.y"
{
OUTYY(("P(dt_dnstap_enable:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -6924,11 +7062,11 @@ yyreduce:
else cfg_parser->cfg->dnstap = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 6928 "util/configparser.c"
+#line 7066 "util/configparser.c"
break;
- case 654: /* dt_dnstap_bidirectional: VAR_DNSTAP_BIDIRECTIONAL STRING_ARG */
-#line 3471 "util/configparser.y"
+ case 668: /* dt_dnstap_bidirectional: VAR_DNSTAP_BIDIRECTIONAL STRING_ARG */
+#line 3522 "util/configparser.y"
{
OUTYY(("P(dt_dnstap_bidirectional:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -6937,31 +7075,31 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 6941 "util/configparser.c"
+#line 7079 "util/configparser.c"
break;
- case 655: /* dt_dnstap_socket_path: VAR_DNSTAP_SOCKET_PATH STRING_ARG */
-#line 3481 "util/configparser.y"
+ case 669: /* dt_dnstap_socket_path: VAR_DNSTAP_SOCKET_PATH STRING_ARG */
+#line 3532 "util/configparser.y"
{
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 6951 "util/configparser.c"
+#line 7089 "util/configparser.c"
break;
- case 656: /* dt_dnstap_ip: VAR_DNSTAP_IP STRING_ARG */
-#line 3488 "util/configparser.y"
+ case 670: /* dt_dnstap_ip: VAR_DNSTAP_IP STRING_ARG */
+#line 3539 "util/configparser.y"
{
OUTYY(("P(dt_dnstap_ip:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->dnstap_ip);
cfg_parser->cfg->dnstap_ip = (yyvsp[0].str);
}
-#line 6961 "util/configparser.c"
+#line 7099 "util/configparser.c"
break;
- case 657: /* dt_dnstap_tls: VAR_DNSTAP_TLS STRING_ARG */
-#line 3495 "util/configparser.y"
+ case 671: /* dt_dnstap_tls: VAR_DNSTAP_TLS STRING_ARG */
+#line 3546 "util/configparser.y"
{
OUTYY(("P(dt_dnstap_tls:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -6969,51 +7107,51 @@ yyreduce:
else cfg_parser->cfg->dnstap_tls = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 6973 "util/configparser.c"
+#line 7111 "util/configparser.c"
break;
- case 658: /* dt_dnstap_tls_server_name: VAR_DNSTAP_TLS_SERVER_NAME STRING_ARG */
-#line 3504 "util/configparser.y"
+ case 672: /* dt_dnstap_tls_server_name: VAR_DNSTAP_TLS_SERVER_NAME STRING_ARG */
+#line 3555 "util/configparser.y"
{
OUTYY(("P(dt_dnstap_tls_server_name:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->dnstap_tls_server_name);
cfg_parser->cfg->dnstap_tls_server_name = (yyvsp[0].str);
}
-#line 6983 "util/configparser.c"
+#line 7121 "util/configparser.c"
break;
- case 659: /* dt_dnstap_tls_cert_bundle: VAR_DNSTAP_TLS_CERT_BUNDLE STRING_ARG */
-#line 3511 "util/configparser.y"
+ case 673: /* dt_dnstap_tls_cert_bundle: VAR_DNSTAP_TLS_CERT_BUNDLE STRING_ARG */
+#line 3562 "util/configparser.y"
{
OUTYY(("P(dt_dnstap_tls_cert_bundle:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->dnstap_tls_cert_bundle);
cfg_parser->cfg->dnstap_tls_cert_bundle = (yyvsp[0].str);
}
-#line 6993 "util/configparser.c"
+#line 7131 "util/configparser.c"
break;
- case 660: /* dt_dnstap_tls_client_key_file: VAR_DNSTAP_TLS_CLIENT_KEY_FILE STRING_ARG */
-#line 3518 "util/configparser.y"
+ case 674: /* dt_dnstap_tls_client_key_file: VAR_DNSTAP_TLS_CLIENT_KEY_FILE STRING_ARG */
+#line 3569 "util/configparser.y"
{
OUTYY(("P(dt_dnstap_tls_client_key_file:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->dnstap_tls_client_key_file);
cfg_parser->cfg->dnstap_tls_client_key_file = (yyvsp[0].str);
}
-#line 7003 "util/configparser.c"
+#line 7141 "util/configparser.c"
break;
- case 661: /* dt_dnstap_tls_client_cert_file: VAR_DNSTAP_TLS_CLIENT_CERT_FILE STRING_ARG */
-#line 3525 "util/configparser.y"
+ case 675: /* dt_dnstap_tls_client_cert_file: VAR_DNSTAP_TLS_CLIENT_CERT_FILE STRING_ARG */
+#line 3576 "util/configparser.y"
{
OUTYY(("P(dt_dnstap_tls_client_cert_file:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->dnstap_tls_client_cert_file);
cfg_parser->cfg->dnstap_tls_client_cert_file = (yyvsp[0].str);
}
-#line 7013 "util/configparser.c"
+#line 7151 "util/configparser.c"
break;
- case 662: /* dt_dnstap_send_identity: VAR_DNSTAP_SEND_IDENTITY STRING_ARG */
-#line 3532 "util/configparser.y"
+ case 676: /* dt_dnstap_send_identity: VAR_DNSTAP_SEND_IDENTITY STRING_ARG */
+#line 3583 "util/configparser.y"
{
OUTYY(("P(dt_dnstap_send_identity:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -7021,11 +7159,11 @@ yyreduce:
else cfg_parser->cfg->dnstap_send_identity = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 7025 "util/configparser.c"
+#line 7163 "util/configparser.c"
break;
- case 663: /* dt_dnstap_send_version: VAR_DNSTAP_SEND_VERSION STRING_ARG */
-#line 3541 "util/configparser.y"
+ case 677: /* dt_dnstap_send_version: VAR_DNSTAP_SEND_VERSION STRING_ARG */
+#line 3592 "util/configparser.y"
{
OUTYY(("P(dt_dnstap_send_version:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -7033,31 +7171,31 @@ yyreduce:
else cfg_parser->cfg->dnstap_send_version = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 7037 "util/configparser.c"
+#line 7175 "util/configparser.c"
break;
- case 664: /* dt_dnstap_identity: VAR_DNSTAP_IDENTITY STRING_ARG */
-#line 3550 "util/configparser.y"
+ case 678: /* dt_dnstap_identity: VAR_DNSTAP_IDENTITY STRING_ARG */
+#line 3601 "util/configparser.y"
{
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 7047 "util/configparser.c"
+#line 7185 "util/configparser.c"
break;
- case 665: /* dt_dnstap_version: VAR_DNSTAP_VERSION STRING_ARG */
-#line 3557 "util/configparser.y"
+ case 679: /* dt_dnstap_version: VAR_DNSTAP_VERSION STRING_ARG */
+#line 3608 "util/configparser.y"
{
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 7057 "util/configparser.c"
+#line 7195 "util/configparser.c"
break;
- case 666: /* dt_dnstap_log_resolver_query_messages: VAR_DNSTAP_LOG_RESOLVER_QUERY_MESSAGES STRING_ARG */
-#line 3564 "util/configparser.y"
+ case 680: /* dt_dnstap_log_resolver_query_messages: VAR_DNSTAP_LOG_RESOLVER_QUERY_MESSAGES STRING_ARG */
+#line 3615 "util/configparser.y"
{
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)
@@ -7066,11 +7204,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 7070 "util/configparser.c"
+#line 7208 "util/configparser.c"
break;
- case 667: /* dt_dnstap_log_resolver_response_messages: VAR_DNSTAP_LOG_RESOLVER_RESPONSE_MESSAGES STRING_ARG */
-#line 3574 "util/configparser.y"
+ case 681: /* dt_dnstap_log_resolver_response_messages: VAR_DNSTAP_LOG_RESOLVER_RESPONSE_MESSAGES STRING_ARG */
+#line 3625 "util/configparser.y"
{
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)
@@ -7079,11 +7217,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 7083 "util/configparser.c"
+#line 7221 "util/configparser.c"
break;
- case 668: /* dt_dnstap_log_client_query_messages: VAR_DNSTAP_LOG_CLIENT_QUERY_MESSAGES STRING_ARG */
-#line 3584 "util/configparser.y"
+ case 682: /* dt_dnstap_log_client_query_messages: VAR_DNSTAP_LOG_CLIENT_QUERY_MESSAGES STRING_ARG */
+#line 3635 "util/configparser.y"
{
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)
@@ -7092,11 +7230,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 7096 "util/configparser.c"
+#line 7234 "util/configparser.c"
break;
- case 669: /* dt_dnstap_log_client_response_messages: VAR_DNSTAP_LOG_CLIENT_RESPONSE_MESSAGES STRING_ARG */
-#line 3594 "util/configparser.y"
+ case 683: /* dt_dnstap_log_client_response_messages: VAR_DNSTAP_LOG_CLIENT_RESPONSE_MESSAGES STRING_ARG */
+#line 3645 "util/configparser.y"
{
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)
@@ -7105,11 +7243,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 7109 "util/configparser.c"
+#line 7247 "util/configparser.c"
break;
- case 670: /* dt_dnstap_log_forwarder_query_messages: VAR_DNSTAP_LOG_FORWARDER_QUERY_MESSAGES STRING_ARG */
-#line 3604 "util/configparser.y"
+ case 684: /* dt_dnstap_log_forwarder_query_messages: VAR_DNSTAP_LOG_FORWARDER_QUERY_MESSAGES STRING_ARG */
+#line 3655 "util/configparser.y"
{
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)
@@ -7118,11 +7256,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 7122 "util/configparser.c"
+#line 7260 "util/configparser.c"
break;
- case 671: /* dt_dnstap_log_forwarder_response_messages: VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES STRING_ARG */
-#line 3614 "util/configparser.y"
+ case 685: /* dt_dnstap_log_forwarder_response_messages: VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES STRING_ARG */
+#line 3665 "util/configparser.y"
{
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)
@@ -7131,11 +7269,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 7135 "util/configparser.c"
+#line 7273 "util/configparser.c"
break;
- case 672: /* dt_dnstap_sample_rate: VAR_DNSTAP_SAMPLE_RATE STRING_ARG */
-#line 3624 "util/configparser.y"
+ case 686: /* dt_dnstap_sample_rate: VAR_DNSTAP_SAMPLE_RATE STRING_ARG */
+#line 3675 "util/configparser.y"
{
OUTYY(("P(dt_dnstap_sample_rate:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -7145,49 +7283,49 @@ yyreduce:
else cfg_parser->cfg->dnstap_sample_rate = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 7149 "util/configparser.c"
+#line 7287 "util/configparser.c"
break;
- case 673: /* pythonstart: VAR_PYTHON */
-#line 3635 "util/configparser.y"
+ case 687: /* pythonstart: VAR_PYTHON */
+#line 3686 "util/configparser.y"
{
OUTYY(("\nP(python:)\n"));
cfg_parser->started_toplevel = 1;
}
-#line 7158 "util/configparser.c"
+#line 7296 "util/configparser.c"
break;
- case 677: /* py_script: VAR_PYTHON_SCRIPT STRING_ARG */
-#line 3645 "util/configparser.y"
+ case 691: /* py_script: VAR_PYTHON_SCRIPT STRING_ARG */
+#line 3696 "util/configparser.y"
{
OUTYY(("P(python-script:%s)\n", (yyvsp[0].str)));
if(!cfg_strlist_append_ex(&cfg_parser->cfg->python_script, (yyvsp[0].str)))
yyerror("out of memory");
}
-#line 7168 "util/configparser.c"
+#line 7306 "util/configparser.c"
break;
- case 678: /* dynlibstart: VAR_DYNLIB */
-#line 3652 "util/configparser.y"
+ case 692: /* dynlibstart: VAR_DYNLIB */
+#line 3703 "util/configparser.y"
{
OUTYY(("\nP(dynlib:)\n"));
cfg_parser->started_toplevel = 1;
}
-#line 7177 "util/configparser.c"
+#line 7315 "util/configparser.c"
break;
- case 682: /* dl_file: VAR_DYNLIB_FILE STRING_ARG */
-#line 3662 "util/configparser.y"
+ case 696: /* dl_file: VAR_DYNLIB_FILE STRING_ARG */
+#line 3713 "util/configparser.y"
{
OUTYY(("P(dynlib-file:%s)\n", (yyvsp[0].str)));
if(!cfg_strlist_append_ex(&cfg_parser->cfg->dynlib_file, (yyvsp[0].str)))
yyerror("out of memory");
}
-#line 7187 "util/configparser.c"
+#line 7325 "util/configparser.c"
break;
- case 683: /* server_disable_dnssec_lame_check: VAR_DISABLE_DNSSEC_LAME_CHECK STRING_ARG */
-#line 3669 "util/configparser.y"
+ case 697: /* server_disable_dnssec_lame_check: VAR_DISABLE_DNSSEC_LAME_CHECK STRING_ARG */
+#line 3720 "util/configparser.y"
{
OUTYY(("P(disable_dnssec_lame_check:%s)\n", (yyvsp[0].str)));
if (strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -7196,21 +7334,21 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 7200 "util/configparser.c"
+#line 7338 "util/configparser.c"
break;
- case 684: /* server_log_identity: VAR_LOG_IDENTITY STRING_ARG */
-#line 3679 "util/configparser.y"
+ case 698: /* server_log_identity: VAR_LOG_IDENTITY STRING_ARG */
+#line 3730 "util/configparser.y"
{
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 7210 "util/configparser.c"
+#line 7348 "util/configparser.c"
break;
- case 685: /* server_response_ip: VAR_RESPONSE_IP STRING_ARG STRING_ARG */
-#line 3686 "util/configparser.y"
+ case 699: /* server_response_ip: VAR_RESPONSE_IP STRING_ARG STRING_ARG */
+#line 3737 "util/configparser.y"
{
OUTYY(("P(server_response_ip:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str)));
validate_respip_action((yyvsp[0].str));
@@ -7218,31 +7356,31 @@ yyreduce:
(yyvsp[-1].str), (yyvsp[0].str)))
fatal_exit("out of memory adding response-ip");
}
-#line 7222 "util/configparser.c"
+#line 7360 "util/configparser.c"
break;
- case 686: /* server_response_ip_data: VAR_RESPONSE_IP_DATA STRING_ARG STRING_ARG */
-#line 3695 "util/configparser.y"
+ case 700: /* server_response_ip_data: VAR_RESPONSE_IP_DATA STRING_ARG STRING_ARG */
+#line 3746 "util/configparser.y"
{
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 7233 "util/configparser.c"
+#line 7371 "util/configparser.c"
break;
- case 687: /* dnscstart: VAR_DNSCRYPT */
-#line 3703 "util/configparser.y"
+ case 701: /* dnscstart: VAR_DNSCRYPT */
+#line 3754 "util/configparser.y"
{
OUTYY(("\nP(dnscrypt:)\n"));
cfg_parser->started_toplevel = 1;
}
-#line 7242 "util/configparser.c"
+#line 7380 "util/configparser.c"
break;
- case 700: /* dnsc_dnscrypt_enable: VAR_DNSCRYPT_ENABLE STRING_ARG */
-#line 3720 "util/configparser.y"
+ case 714: /* dnsc_dnscrypt_enable: VAR_DNSCRYPT_ENABLE STRING_ARG */
+#line 3771 "util/configparser.y"
{
OUTYY(("P(dnsc_dnscrypt_enable:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -7250,11 +7388,11 @@ yyreduce:
else cfg_parser->cfg->dnscrypt = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 7254 "util/configparser.c"
+#line 7392 "util/configparser.c"
break;
- case 701: /* dnsc_dnscrypt_port: VAR_DNSCRYPT_PORT STRING_ARG */
-#line 3729 "util/configparser.y"
+ case 715: /* dnsc_dnscrypt_port: VAR_DNSCRYPT_PORT STRING_ARG */
+#line 3780 "util/configparser.y"
{
OUTYY(("P(dnsc_dnscrypt_port:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0)
@@ -7262,21 +7400,21 @@ yyreduce:
else cfg_parser->cfg->dnscrypt_port = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 7266 "util/configparser.c"
+#line 7404 "util/configparser.c"
break;
- case 702: /* dnsc_dnscrypt_provider: VAR_DNSCRYPT_PROVIDER STRING_ARG */
-#line 3738 "util/configparser.y"
+ case 716: /* dnsc_dnscrypt_provider: VAR_DNSCRYPT_PROVIDER STRING_ARG */
+#line 3789 "util/configparser.y"
{
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 7276 "util/configparser.c"
+#line 7414 "util/configparser.c"
break;
- case 703: /* dnsc_dnscrypt_provider_cert: VAR_DNSCRYPT_PROVIDER_CERT STRING_ARG */
-#line 3745 "util/configparser.y"
+ case 717: /* dnsc_dnscrypt_provider_cert: VAR_DNSCRYPT_PROVIDER_CERT STRING_ARG */
+#line 3796 "util/configparser.y"
{
OUTYY(("P(dnsc_dnscrypt_provider_cert:%s)\n", (yyvsp[0].str)));
if(cfg_strlist_find(cfg_parser->cfg->dnscrypt_provider_cert, (yyvsp[0].str)))
@@ -7284,21 +7422,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 7288 "util/configparser.c"
+#line 7426 "util/configparser.c"
break;
- case 704: /* dnsc_dnscrypt_provider_cert_rotated: VAR_DNSCRYPT_PROVIDER_CERT_ROTATED STRING_ARG */
-#line 3754 "util/configparser.y"
+ case 718: /* dnsc_dnscrypt_provider_cert_rotated: VAR_DNSCRYPT_PROVIDER_CERT_ROTATED STRING_ARG */
+#line 3805 "util/configparser.y"
{
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 7298 "util/configparser.c"
+#line 7436 "util/configparser.c"
break;
- case 705: /* dnsc_dnscrypt_secret_key: VAR_DNSCRYPT_SECRET_KEY STRING_ARG */
-#line 3761 "util/configparser.y"
+ case 719: /* dnsc_dnscrypt_secret_key: VAR_DNSCRYPT_SECRET_KEY STRING_ARG */
+#line 3812 "util/configparser.y"
{
OUTYY(("P(dnsc_dnscrypt_secret_key:%s)\n", (yyvsp[0].str)));
if(cfg_strlist_find(cfg_parser->cfg->dnscrypt_secret_key, (yyvsp[0].str)))
@@ -7306,22 +7444,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 7310 "util/configparser.c"
+#line 7448 "util/configparser.c"
break;
- case 706: /* dnsc_dnscrypt_shared_secret_cache_size: VAR_DNSCRYPT_SHARED_SECRET_CACHE_SIZE STRING_ARG */
-#line 3770 "util/configparser.y"
+ case 720: /* dnsc_dnscrypt_shared_secret_cache_size: VAR_DNSCRYPT_SHARED_SECRET_CACHE_SIZE STRING_ARG */
+#line 3821 "util/configparser.y"
{
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 7321 "util/configparser.c"
+#line 7459 "util/configparser.c"
break;
- case 707: /* dnsc_dnscrypt_shared_secret_cache_slabs: VAR_DNSCRYPT_SHARED_SECRET_CACHE_SLABS STRING_ARG */
-#line 3778 "util/configparser.y"
+ case 721: /* dnsc_dnscrypt_shared_secret_cache_slabs: VAR_DNSCRYPT_SHARED_SECRET_CACHE_SLABS STRING_ARG */
+#line 3829 "util/configparser.y"
{
OUTYY(("P(dnscrypt_shared_secret_cache_slabs:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0) {
@@ -7333,22 +7471,22 @@ yyreduce:
}
free((yyvsp[0].str));
}
-#line 7337 "util/configparser.c"
+#line 7475 "util/configparser.c"
break;
- case 708: /* dnsc_dnscrypt_nonce_cache_size: VAR_DNSCRYPT_NONCE_CACHE_SIZE STRING_ARG */
-#line 3791 "util/configparser.y"
+ case 722: /* dnsc_dnscrypt_nonce_cache_size: VAR_DNSCRYPT_NONCE_CACHE_SIZE STRING_ARG */
+#line 3842 "util/configparser.y"
{
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 7348 "util/configparser.c"
+#line 7486 "util/configparser.c"
break;
- case 709: /* dnsc_dnscrypt_nonce_cache_slabs: VAR_DNSCRYPT_NONCE_CACHE_SLABS STRING_ARG */
-#line 3799 "util/configparser.y"
+ case 723: /* dnsc_dnscrypt_nonce_cache_slabs: VAR_DNSCRYPT_NONCE_CACHE_SLABS STRING_ARG */
+#line 3850 "util/configparser.y"
{
OUTYY(("P(dnscrypt_nonce_cache_slabs:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0) {
@@ -7360,20 +7498,20 @@ yyreduce:
}
free((yyvsp[0].str));
}
-#line 7364 "util/configparser.c"
+#line 7502 "util/configparser.c"
break;
- case 710: /* cachedbstart: VAR_CACHEDB */
-#line 3812 "util/configparser.y"
+ case 724: /* cachedbstart: VAR_CACHEDB */
+#line 3863 "util/configparser.y"
{
OUTYY(("\nP(cachedb:)\n"));
cfg_parser->started_toplevel = 1;
}
-#line 7373 "util/configparser.c"
+#line 7511 "util/configparser.c"
break;
- case 724: /* cachedb_backend_name: VAR_CACHEDB_BACKEND STRING_ARG */
-#line 3825 "util/configparser.y"
+ case 740: /* cachedb_backend_name: VAR_CACHEDB_BACKEND STRING_ARG */
+#line 3877 "util/configparser.y"
{
#ifdef USE_CACHEDB
OUTYY(("P(backend:%s)\n", (yyvsp[0].str)));
@@ -7384,11 +7522,11 @@ yyreduce:
free((yyvsp[0].str));
#endif
}
-#line 7388 "util/configparser.c"
+#line 7526 "util/configparser.c"
break;
- case 725: /* cachedb_secret_seed: VAR_CACHEDB_SECRETSEED STRING_ARG */
-#line 3837 "util/configparser.y"
+ case 741: /* cachedb_secret_seed: VAR_CACHEDB_SECRETSEED STRING_ARG */
+#line 3889 "util/configparser.y"
{
#ifdef USE_CACHEDB
OUTYY(("P(secret-seed:%s)\n", (yyvsp[0].str)));
@@ -7399,11 +7537,11 @@ yyreduce:
free((yyvsp[0].str));
#endif
}
-#line 7403 "util/configparser.c"
+#line 7541 "util/configparser.c"
break;
- case 726: /* cachedb_no_store: VAR_CACHEDB_NO_STORE STRING_ARG */
-#line 3849 "util/configparser.y"
+ case 742: /* cachedb_no_store: VAR_CACHEDB_NO_STORE STRING_ARG */
+#line 3901 "util/configparser.y"
{
#ifdef USE_CACHEDB
OUTYY(("P(cachedb_no_store:%s)\n", (yyvsp[0].str)));
@@ -7415,11 +7553,11 @@ yyreduce:
#endif
free((yyvsp[0].str));
}
-#line 7419 "util/configparser.c"
+#line 7557 "util/configparser.c"
break;
- case 727: /* cachedb_check_when_serve_expired: VAR_CACHEDB_CHECK_WHEN_SERVE_EXPIRED STRING_ARG */
-#line 3862 "util/configparser.y"
+ case 743: /* cachedb_check_when_serve_expired: VAR_CACHEDB_CHECK_WHEN_SERVE_EXPIRED STRING_ARG */
+#line 3914 "util/configparser.y"
{
#ifdef USE_CACHEDB
OUTYY(("P(cachedb_check_when_serve_expired:%s)\n", (yyvsp[0].str)));
@@ -7431,11 +7569,11 @@ yyreduce:
#endif
free((yyvsp[0].str));
}
-#line 7435 "util/configparser.c"
+#line 7573 "util/configparser.c"
break;
- case 728: /* redis_server_host: VAR_CACHEDB_REDISHOST STRING_ARG */
-#line 3875 "util/configparser.y"
+ case 744: /* redis_server_host: VAR_CACHEDB_REDISHOST STRING_ARG */
+#line 3927 "util/configparser.y"
{
#if defined(USE_CACHEDB) && defined(USE_REDIS)
OUTYY(("P(redis_server_host:%s)\n", (yyvsp[0].str)));
@@ -7446,11 +7584,11 @@ yyreduce:
free((yyvsp[0].str));
#endif
}
-#line 7450 "util/configparser.c"
+#line 7588 "util/configparser.c"
break;
- case 729: /* redis_server_port: VAR_CACHEDB_REDISPORT STRING_ARG */
-#line 3887 "util/configparser.y"
+ case 745: /* redis_server_port: VAR_CACHEDB_REDISPORT STRING_ARG */
+#line 3939 "util/configparser.y"
{
#if defined(USE_CACHEDB) && defined(USE_REDIS)
int port;
@@ -7464,11 +7602,11 @@ yyreduce:
#endif
free((yyvsp[0].str));
}
-#line 7468 "util/configparser.c"
+#line 7606 "util/configparser.c"
break;
- case 730: /* redis_server_path: VAR_CACHEDB_REDISPATH STRING_ARG */
-#line 3902 "util/configparser.y"
+ case 746: /* redis_server_path: VAR_CACHEDB_REDISPATH STRING_ARG */
+#line 3954 "util/configparser.y"
{
#if defined(USE_CACHEDB) && defined(USE_REDIS)
OUTYY(("P(redis_server_path:%s)\n", (yyvsp[0].str)));
@@ -7479,11 +7617,11 @@ yyreduce:
free((yyvsp[0].str));
#endif
}
-#line 7483 "util/configparser.c"
+#line 7621 "util/configparser.c"
break;
- case 731: /* redis_server_password: VAR_CACHEDB_REDISPASSWORD STRING_ARG */
-#line 3914 "util/configparser.y"
+ case 747: /* redis_server_password: VAR_CACHEDB_REDISPASSWORD STRING_ARG */
+#line 3966 "util/configparser.y"
{
#if defined(USE_CACHEDB) && defined(USE_REDIS)
OUTYY(("P(redis_server_password:%s)\n", (yyvsp[0].str)));
@@ -7494,11 +7632,11 @@ yyreduce:
free((yyvsp[0].str));
#endif
}
-#line 7498 "util/configparser.c"
+#line 7636 "util/configparser.c"
break;
- case 732: /* redis_timeout: VAR_CACHEDB_REDISTIMEOUT STRING_ARG */
-#line 3926 "util/configparser.y"
+ case 748: /* redis_timeout: VAR_CACHEDB_REDISTIMEOUT STRING_ARG */
+#line 3978 "util/configparser.y"
{
#if defined(USE_CACHEDB) && defined(USE_REDIS)
OUTYY(("P(redis_timeout:%s)\n", (yyvsp[0].str)));
@@ -7510,11 +7648,43 @@ yyreduce:
#endif
free((yyvsp[0].str));
}
-#line 7514 "util/configparser.c"
+#line 7652 "util/configparser.c"
break;
- case 733: /* redis_expire_records: VAR_CACHEDB_REDISEXPIRERECORDS STRING_ARG */
-#line 3939 "util/configparser.y"
+ case 749: /* redis_command_timeout: VAR_CACHEDB_REDISCOMMANDTIMEOUT STRING_ARG */
+#line 3991 "util/configparser.y"
+ {
+ #if defined(USE_CACHEDB) && defined(USE_REDIS)
+ OUTYY(("P(redis_command_timeout:%s)\n", (yyvsp[0].str)));
+ if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
+ yyerror("redis command timeout value expected");
+ else cfg_parser->cfg->redis_command_timeout = atoi((yyvsp[0].str));
+ #else
+ OUTYY(("P(Compiled without cachedb or redis, ignoring)\n"));
+ #endif
+ free((yyvsp[0].str));
+ }
+#line 7668 "util/configparser.c"
+ break;
+
+ case 750: /* redis_connect_timeout: VAR_CACHEDB_REDISCONNECTTIMEOUT STRING_ARG */
+#line 4004 "util/configparser.y"
+ {
+ #if defined(USE_CACHEDB) && defined(USE_REDIS)
+ OUTYY(("P(redis_connect_timeout:%s)\n", (yyvsp[0].str)));
+ if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
+ yyerror("redis connect timeout value expected");
+ else cfg_parser->cfg->redis_connect_timeout = atoi((yyvsp[0].str));
+ #else
+ OUTYY(("P(Compiled without cachedb or redis, ignoring)\n"));
+ #endif
+ free((yyvsp[0].str));
+ }
+#line 7684 "util/configparser.c"
+ break;
+
+ case 751: /* redis_expire_records: VAR_CACHEDB_REDISEXPIRERECORDS STRING_ARG */
+#line 4017 "util/configparser.y"
{
#if defined(USE_CACHEDB) && defined(USE_REDIS)
OUTYY(("P(redis_expire_records:%s)\n", (yyvsp[0].str)));
@@ -7526,11 +7696,11 @@ yyreduce:
#endif
free((yyvsp[0].str));
}
-#line 7530 "util/configparser.c"
+#line 7700 "util/configparser.c"
break;
- case 734: /* redis_logical_db: VAR_CACHEDB_REDISLOGICALDB STRING_ARG */
-#line 3952 "util/configparser.y"
+ case 752: /* redis_logical_db: VAR_CACHEDB_REDISLOGICALDB STRING_ARG */
+#line 4030 "util/configparser.y"
{
#if defined(USE_CACHEDB) && defined(USE_REDIS)
int db;
@@ -7544,11 +7714,11 @@ yyreduce:
#endif
free((yyvsp[0].str));
}
-#line 7548 "util/configparser.c"
+#line 7718 "util/configparser.c"
break;
- case 735: /* server_tcp_connection_limit: VAR_TCP_CONNECTION_LIMIT STRING_ARG STRING_ARG */
-#line 3967 "util/configparser.y"
+ case 753: /* server_tcp_connection_limit: VAR_TCP_CONNECTION_LIMIT STRING_ARG STRING_ARG */
+#line 4045 "util/configparser.y"
{
OUTYY(("P(server_tcp_connection_limit:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str)));
if (atoi((yyvsp[0].str)) < 0)
@@ -7558,11 +7728,11 @@ yyreduce:
fatal_exit("out of memory adding tcp connection limit");
}
}
-#line 7562 "util/configparser.c"
+#line 7732 "util/configparser.c"
break;
- case 736: /* server_answer_cookie: VAR_ANSWER_COOKIE STRING_ARG */
-#line 3978 "util/configparser.y"
+ case 754: /* server_answer_cookie: VAR_ANSWER_COOKIE STRING_ARG */
+#line 4056 "util/configparser.y"
{
OUTYY(("P(server_answer_cookie:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -7570,11 +7740,11 @@ yyreduce:
else cfg_parser->cfg->do_answer_cookie = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 7574 "util/configparser.c"
+#line 7744 "util/configparser.c"
break;
- case 737: /* server_cookie_secret: VAR_COOKIE_SECRET STRING_ARG */
-#line 3987 "util/configparser.y"
+ case 755: /* server_cookie_secret: VAR_COOKIE_SECRET STRING_ARG */
+#line 4065 "util/configparser.y"
{
uint8_t secret[32];
size_t secret_len = sizeof(secret);
@@ -7589,30 +7759,66 @@ yyreduce:
}
free((yyvsp[0].str));
}
-#line 7593 "util/configparser.c"
+#line 7763 "util/configparser.c"
break;
- case 738: /* server_cookie_secret_file: VAR_COOKIE_SECRET_FILE STRING_ARG */
-#line 4003 "util/configparser.y"
+ case 756: /* server_cookie_secret_file: VAR_COOKIE_SECRET_FILE STRING_ARG */
+#line 4081 "util/configparser.y"
{
OUTYY(("P(cookie_secret_file:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->cookie_secret_file);
cfg_parser->cfg->cookie_secret_file = (yyvsp[0].str);
}
-#line 7603 "util/configparser.c"
+#line 7773 "util/configparser.c"
break;
- case 739: /* ipsetstart: VAR_IPSET */
-#line 4010 "util/configparser.y"
+ case 757: /* server_iter_scrub_ns: VAR_ITER_SCRUB_NS STRING_ARG */
+#line 4088 "util/configparser.y"
+ {
+ OUTYY(("P(server_iter_scrub_ns:%s)\n", (yyvsp[0].str)));
+ if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
+ yyerror("number expected");
+ else cfg_parser->cfg->iter_scrub_ns = atoi((yyvsp[0].str));
+ free((yyvsp[0].str));
+ }
+#line 7785 "util/configparser.c"
+ break;
+
+ case 758: /* server_iter_scrub_cname: VAR_ITER_SCRUB_CNAME STRING_ARG */
+#line 4097 "util/configparser.y"
+ {
+ OUTYY(("P(server_iter_scrub_cname:%s)\n", (yyvsp[0].str)));
+ if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
+ yyerror("number expected");
+ else cfg_parser->cfg->iter_scrub_cname = atoi((yyvsp[0].str));
+ free((yyvsp[0].str));
+ }
+#line 7797 "util/configparser.c"
+ break;
+
+ case 759: /* server_max_global_quota: VAR_MAX_GLOBAL_QUOTA STRING_ARG */
+#line 4106 "util/configparser.y"
+ {
+ OUTYY(("P(server_max_global_quota:%s)\n", (yyvsp[0].str)));
+ if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
+ yyerror("number expected");
+ else cfg_parser->cfg->max_global_quota = atoi((yyvsp[0].str));
+ free((yyvsp[0].str));
+ }
+#line 7809 "util/configparser.c"
+ break;
+
+ case 760: /* ipsetstart: VAR_IPSET */
+#line 4115 "util/configparser.y"
{
OUTYY(("\nP(ipset:)\n"));
cfg_parser->started_toplevel = 1;
}
-#line 7612 "util/configparser.c"
+#line 7818 "util/configparser.c"
break;
- case 744: /* ipset_name_v4: VAR_IPSET_NAME_V4 STRING_ARG */
-#line 4020 "util/configparser.y"
+ case 765: /* ipset_name_v4: VAR_IPSET_NAME_V4 STRING_ARG */
+#line 4125 "util/configparser.y"
{
#ifdef USE_IPSET
OUTYY(("P(name-v4:%s)\n", (yyvsp[0].str)));
@@ -7626,11 +7832,11 @@ yyreduce:
free((yyvsp[0].str));
#endif
}
-#line 7630 "util/configparser.c"
+#line 7836 "util/configparser.c"
break;
- case 745: /* ipset_name_v6: VAR_IPSET_NAME_V6 STRING_ARG */
-#line 4035 "util/configparser.y"
+ case 766: /* ipset_name_v6: VAR_IPSET_NAME_V6 STRING_ARG */
+#line 4140 "util/configparser.y"
{
#ifdef USE_IPSET
OUTYY(("P(name-v6:%s)\n", (yyvsp[0].str)));
@@ -7644,11 +7850,11 @@ yyreduce:
free((yyvsp[0].str));
#endif
}
-#line 7648 "util/configparser.c"
+#line 7854 "util/configparser.c"
break;
-#line 7652 "util/configparser.c"
+#line 7858 "util/configparser.c"
default: break;
}
@@ -7730,7 +7936,6 @@ yyerrorlab:
label yyerrorlab therefore never appears in user code. */
if (0)
YYERROR;
- ++yynerrs;
/* Do not reclaim the symbols of the rule whose action triggered
this YYERROR. */
@@ -7791,7 +7996,7 @@ yyerrlab1:
`-------------------------------------*/
yyacceptlab:
yyresult = 0;
- goto yyreturnlab;
+ goto yyreturn;
/*-----------------------------------.
@@ -7799,22 +8004,24 @@ yyacceptlab:
`-----------------------------------*/
yyabortlab:
yyresult = 1;
- goto yyreturnlab;
+ goto yyreturn;
-/*-----------------------------------------------------------.
-| yyexhaustedlab -- YYNOMEM (memory exhaustion) comes here. |
-`-----------------------------------------------------------*/
+#if !defined yyoverflow
+/*-------------------------------------------------.
+| yyexhaustedlab -- memory exhaustion comes here. |
+`-------------------------------------------------*/
yyexhaustedlab:
yyerror (YY_("memory exhausted"));
yyresult = 2;
- goto yyreturnlab;
+ goto yyreturn;
+#endif
-/*----------------------------------------------------------.
-| yyreturnlab -- parsing is finished, clean up and return. |
-`----------------------------------------------------------*/
-yyreturnlab:
+/*-------------------------------------------------------.
+| yyreturn -- parsing is finished, clean up and return. |
+`-------------------------------------------------------*/
+yyreturn:
if (yychar != YYEMPTY)
{
/* Make sure we have latest lookahead translation. See comments at
@@ -7841,7 +8048,7 @@ yyreturnlab:
return yyresult;
}
-#line 4049 "util/configparser.y"
+#line 4154 "util/configparser.y"
/* parse helper routines could be here */
diff --git a/util/configparser.h b/util/configparser.h
index 3d3b807ce71c..8aa58d9ea49b 100644
--- a/util/configparser.h
+++ b/util/configparser.h
@@ -1,4 +1,4 @@
-/* A Bison parser, made by GNU Bison 3.8.2. */
+/* A Bison parser, made by GNU Bison 3.7.6. */
/* Bison interface for Yacc-like parsers in C
@@ -342,74 +342,83 @@ extern int yydebug;
VAR_CACHEDB_REDISPATH = 543, /* VAR_CACHEDB_REDISPATH */
VAR_CACHEDB_REDISPASSWORD = 544, /* VAR_CACHEDB_REDISPASSWORD */
VAR_CACHEDB_REDISLOGICALDB = 545, /* VAR_CACHEDB_REDISLOGICALDB */
- VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM = 546, /* VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM */
- VAR_FOR_UPSTREAM = 547, /* VAR_FOR_UPSTREAM */
- VAR_AUTH_ZONE = 548, /* VAR_AUTH_ZONE */
- VAR_ZONEFILE = 549, /* VAR_ZONEFILE */
- VAR_MASTER = 550, /* VAR_MASTER */
- VAR_URL = 551, /* VAR_URL */
- VAR_FOR_DOWNSTREAM = 552, /* VAR_FOR_DOWNSTREAM */
- VAR_FALLBACK_ENABLED = 553, /* VAR_FALLBACK_ENABLED */
- VAR_TLS_ADDITIONAL_PORT = 554, /* VAR_TLS_ADDITIONAL_PORT */
- VAR_LOW_RTT = 555, /* VAR_LOW_RTT */
- VAR_LOW_RTT_PERMIL = 556, /* VAR_LOW_RTT_PERMIL */
- VAR_FAST_SERVER_PERMIL = 557, /* VAR_FAST_SERVER_PERMIL */
- VAR_FAST_SERVER_NUM = 558, /* VAR_FAST_SERVER_NUM */
- VAR_ALLOW_NOTIFY = 559, /* VAR_ALLOW_NOTIFY */
- VAR_TLS_WIN_CERT = 560, /* VAR_TLS_WIN_CERT */
- VAR_TCP_CONNECTION_LIMIT = 561, /* VAR_TCP_CONNECTION_LIMIT */
- VAR_ANSWER_COOKIE = 562, /* VAR_ANSWER_COOKIE */
- VAR_COOKIE_SECRET = 563, /* VAR_COOKIE_SECRET */
- VAR_IP_RATELIMIT_COOKIE = 564, /* VAR_IP_RATELIMIT_COOKIE */
- VAR_FORWARD_NO_CACHE = 565, /* VAR_FORWARD_NO_CACHE */
- VAR_STUB_NO_CACHE = 566, /* VAR_STUB_NO_CACHE */
- VAR_LOG_SERVFAIL = 567, /* VAR_LOG_SERVFAIL */
- VAR_DENY_ANY = 568, /* VAR_DENY_ANY */
- VAR_UNKNOWN_SERVER_TIME_LIMIT = 569, /* VAR_UNKNOWN_SERVER_TIME_LIMIT */
- VAR_LOG_TAG_QUERYREPLY = 570, /* VAR_LOG_TAG_QUERYREPLY */
- VAR_DISCARD_TIMEOUT = 571, /* VAR_DISCARD_TIMEOUT */
- VAR_WAIT_LIMIT = 572, /* VAR_WAIT_LIMIT */
- VAR_WAIT_LIMIT_COOKIE = 573, /* VAR_WAIT_LIMIT_COOKIE */
- VAR_WAIT_LIMIT_NETBLOCK = 574, /* VAR_WAIT_LIMIT_NETBLOCK */
- VAR_WAIT_LIMIT_COOKIE_NETBLOCK = 575, /* VAR_WAIT_LIMIT_COOKIE_NETBLOCK */
- VAR_STREAM_WAIT_SIZE = 576, /* VAR_STREAM_WAIT_SIZE */
- VAR_TLS_CIPHERS = 577, /* VAR_TLS_CIPHERS */
- VAR_TLS_CIPHERSUITES = 578, /* VAR_TLS_CIPHERSUITES */
- VAR_TLS_USE_SNI = 579, /* VAR_TLS_USE_SNI */
- VAR_IPSET = 580, /* VAR_IPSET */
- VAR_IPSET_NAME_V4 = 581, /* VAR_IPSET_NAME_V4 */
- VAR_IPSET_NAME_V6 = 582, /* VAR_IPSET_NAME_V6 */
- VAR_TLS_SESSION_TICKET_KEYS = 583, /* VAR_TLS_SESSION_TICKET_KEYS */
- VAR_RPZ = 584, /* VAR_RPZ */
- VAR_TAGS = 585, /* VAR_TAGS */
- VAR_RPZ_ACTION_OVERRIDE = 586, /* VAR_RPZ_ACTION_OVERRIDE */
- VAR_RPZ_CNAME_OVERRIDE = 587, /* VAR_RPZ_CNAME_OVERRIDE */
- VAR_RPZ_LOG = 588, /* VAR_RPZ_LOG */
- VAR_RPZ_LOG_NAME = 589, /* VAR_RPZ_LOG_NAME */
- VAR_DYNLIB = 590, /* VAR_DYNLIB */
- VAR_DYNLIB_FILE = 591, /* VAR_DYNLIB_FILE */
- VAR_EDNS_CLIENT_STRING = 592, /* VAR_EDNS_CLIENT_STRING */
- VAR_EDNS_CLIENT_STRING_OPCODE = 593, /* VAR_EDNS_CLIENT_STRING_OPCODE */
- VAR_NSID = 594, /* VAR_NSID */
- VAR_ZONEMD_PERMISSIVE_MODE = 595, /* VAR_ZONEMD_PERMISSIVE_MODE */
- VAR_ZONEMD_CHECK = 596, /* VAR_ZONEMD_CHECK */
- VAR_ZONEMD_REJECT_ABSENCE = 597, /* VAR_ZONEMD_REJECT_ABSENCE */
- VAR_RPZ_SIGNAL_NXDOMAIN_RA = 598, /* VAR_RPZ_SIGNAL_NXDOMAIN_RA */
- VAR_INTERFACE_AUTOMATIC_PORTS = 599, /* VAR_INTERFACE_AUTOMATIC_PORTS */
- VAR_EDE = 600, /* VAR_EDE */
- VAR_INTERFACE_ACTION = 601, /* VAR_INTERFACE_ACTION */
- VAR_INTERFACE_VIEW = 602, /* VAR_INTERFACE_VIEW */
- VAR_INTERFACE_TAG = 603, /* VAR_INTERFACE_TAG */
- VAR_INTERFACE_TAG_ACTION = 604, /* VAR_INTERFACE_TAG_ACTION */
- VAR_INTERFACE_TAG_DATA = 605, /* VAR_INTERFACE_TAG_DATA */
- VAR_PROXY_PROTOCOL_PORT = 606, /* VAR_PROXY_PROTOCOL_PORT */
- VAR_STATISTICS_INHIBIT_ZERO = 607, /* VAR_STATISTICS_INHIBIT_ZERO */
- VAR_HARDEN_UNKNOWN_ADDITIONAL = 608, /* VAR_HARDEN_UNKNOWN_ADDITIONAL */
- VAR_DISABLE_EDNS_DO = 609, /* VAR_DISABLE_EDNS_DO */
- VAR_CACHEDB_NO_STORE = 610, /* VAR_CACHEDB_NO_STORE */
- VAR_LOG_DESTADDR = 611, /* VAR_LOG_DESTADDR */
- VAR_CACHEDB_CHECK_WHEN_SERVE_EXPIRED = 612, /* VAR_CACHEDB_CHECK_WHEN_SERVE_EXPIRED */
- VAR_COOKIE_SECRET_FILE = 613 /* VAR_COOKIE_SECRET_FILE */
+ VAR_CACHEDB_REDISCOMMANDTIMEOUT = 546, /* VAR_CACHEDB_REDISCOMMANDTIMEOUT */
+ VAR_CACHEDB_REDISCONNECTTIMEOUT = 547, /* VAR_CACHEDB_REDISCONNECTTIMEOUT */
+ VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM = 548, /* VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM */
+ VAR_FOR_UPSTREAM = 549, /* VAR_FOR_UPSTREAM */
+ VAR_AUTH_ZONE = 550, /* VAR_AUTH_ZONE */
+ VAR_ZONEFILE = 551, /* VAR_ZONEFILE */
+ VAR_MASTER = 552, /* VAR_MASTER */
+ VAR_URL = 553, /* VAR_URL */
+ VAR_FOR_DOWNSTREAM = 554, /* VAR_FOR_DOWNSTREAM */
+ VAR_FALLBACK_ENABLED = 555, /* VAR_FALLBACK_ENABLED */
+ VAR_TLS_ADDITIONAL_PORT = 556, /* VAR_TLS_ADDITIONAL_PORT */
+ VAR_LOW_RTT = 557, /* VAR_LOW_RTT */
+ VAR_LOW_RTT_PERMIL = 558, /* VAR_LOW_RTT_PERMIL */
+ VAR_FAST_SERVER_PERMIL = 559, /* VAR_FAST_SERVER_PERMIL */
+ VAR_FAST_SERVER_NUM = 560, /* VAR_FAST_SERVER_NUM */
+ VAR_ALLOW_NOTIFY = 561, /* VAR_ALLOW_NOTIFY */
+ VAR_TLS_WIN_CERT = 562, /* VAR_TLS_WIN_CERT */
+ VAR_TCP_CONNECTION_LIMIT = 563, /* VAR_TCP_CONNECTION_LIMIT */
+ VAR_ANSWER_COOKIE = 564, /* VAR_ANSWER_COOKIE */
+ VAR_COOKIE_SECRET = 565, /* VAR_COOKIE_SECRET */
+ VAR_IP_RATELIMIT_COOKIE = 566, /* VAR_IP_RATELIMIT_COOKIE */
+ VAR_FORWARD_NO_CACHE = 567, /* VAR_FORWARD_NO_CACHE */
+ VAR_STUB_NO_CACHE = 568, /* VAR_STUB_NO_CACHE */
+ VAR_LOG_SERVFAIL = 569, /* VAR_LOG_SERVFAIL */
+ VAR_DENY_ANY = 570, /* VAR_DENY_ANY */
+ VAR_UNKNOWN_SERVER_TIME_LIMIT = 571, /* VAR_UNKNOWN_SERVER_TIME_LIMIT */
+ VAR_LOG_TAG_QUERYREPLY = 572, /* VAR_LOG_TAG_QUERYREPLY */
+ VAR_DISCARD_TIMEOUT = 573, /* VAR_DISCARD_TIMEOUT */
+ VAR_WAIT_LIMIT = 574, /* VAR_WAIT_LIMIT */
+ VAR_WAIT_LIMIT_COOKIE = 575, /* VAR_WAIT_LIMIT_COOKIE */
+ VAR_WAIT_LIMIT_NETBLOCK = 576, /* VAR_WAIT_LIMIT_NETBLOCK */
+ VAR_WAIT_LIMIT_COOKIE_NETBLOCK = 577, /* VAR_WAIT_LIMIT_COOKIE_NETBLOCK */
+ VAR_STREAM_WAIT_SIZE = 578, /* VAR_STREAM_WAIT_SIZE */
+ VAR_TLS_CIPHERS = 579, /* VAR_TLS_CIPHERS */
+ VAR_TLS_CIPHERSUITES = 580, /* VAR_TLS_CIPHERSUITES */
+ VAR_TLS_USE_SNI = 581, /* VAR_TLS_USE_SNI */
+ VAR_IPSET = 582, /* VAR_IPSET */
+ VAR_IPSET_NAME_V4 = 583, /* VAR_IPSET_NAME_V4 */
+ VAR_IPSET_NAME_V6 = 584, /* VAR_IPSET_NAME_V6 */
+ VAR_TLS_SESSION_TICKET_KEYS = 585, /* VAR_TLS_SESSION_TICKET_KEYS */
+ VAR_RPZ = 586, /* VAR_RPZ */
+ VAR_TAGS = 587, /* VAR_TAGS */
+ VAR_RPZ_ACTION_OVERRIDE = 588, /* VAR_RPZ_ACTION_OVERRIDE */
+ VAR_RPZ_CNAME_OVERRIDE = 589, /* VAR_RPZ_CNAME_OVERRIDE */
+ VAR_RPZ_LOG = 590, /* VAR_RPZ_LOG */
+ VAR_RPZ_LOG_NAME = 591, /* VAR_RPZ_LOG_NAME */
+ VAR_DYNLIB = 592, /* VAR_DYNLIB */
+ VAR_DYNLIB_FILE = 593, /* VAR_DYNLIB_FILE */
+ VAR_EDNS_CLIENT_STRING = 594, /* VAR_EDNS_CLIENT_STRING */
+ VAR_EDNS_CLIENT_STRING_OPCODE = 595, /* VAR_EDNS_CLIENT_STRING_OPCODE */
+ VAR_NSID = 596, /* VAR_NSID */
+ VAR_ZONEMD_PERMISSIVE_MODE = 597, /* VAR_ZONEMD_PERMISSIVE_MODE */
+ VAR_ZONEMD_CHECK = 598, /* VAR_ZONEMD_CHECK */
+ VAR_ZONEMD_REJECT_ABSENCE = 599, /* VAR_ZONEMD_REJECT_ABSENCE */
+ VAR_RPZ_SIGNAL_NXDOMAIN_RA = 600, /* VAR_RPZ_SIGNAL_NXDOMAIN_RA */
+ VAR_INTERFACE_AUTOMATIC_PORTS = 601, /* VAR_INTERFACE_AUTOMATIC_PORTS */
+ VAR_EDE = 602, /* VAR_EDE */
+ VAR_INTERFACE_ACTION = 603, /* VAR_INTERFACE_ACTION */
+ VAR_INTERFACE_VIEW = 604, /* VAR_INTERFACE_VIEW */
+ VAR_INTERFACE_TAG = 605, /* VAR_INTERFACE_TAG */
+ VAR_INTERFACE_TAG_ACTION = 606, /* VAR_INTERFACE_TAG_ACTION */
+ VAR_INTERFACE_TAG_DATA = 607, /* VAR_INTERFACE_TAG_DATA */
+ VAR_QUIC_PORT = 608, /* VAR_QUIC_PORT */
+ VAR_QUIC_SIZE = 609, /* VAR_QUIC_SIZE */
+ VAR_PROXY_PROTOCOL_PORT = 610, /* VAR_PROXY_PROTOCOL_PORT */
+ VAR_STATISTICS_INHIBIT_ZERO = 611, /* VAR_STATISTICS_INHIBIT_ZERO */
+ VAR_HARDEN_UNKNOWN_ADDITIONAL = 612, /* VAR_HARDEN_UNKNOWN_ADDITIONAL */
+ VAR_DISABLE_EDNS_DO = 613, /* VAR_DISABLE_EDNS_DO */
+ VAR_CACHEDB_NO_STORE = 614, /* VAR_CACHEDB_NO_STORE */
+ VAR_LOG_DESTADDR = 615, /* VAR_LOG_DESTADDR */
+ VAR_CACHEDB_CHECK_WHEN_SERVE_EXPIRED = 616, /* VAR_CACHEDB_CHECK_WHEN_SERVE_EXPIRED */
+ VAR_COOKIE_SECRET_FILE = 617, /* VAR_COOKIE_SECRET_FILE */
+ VAR_ITER_SCRUB_NS = 618, /* VAR_ITER_SCRUB_NS */
+ VAR_ITER_SCRUB_CNAME = 619, /* VAR_ITER_SCRUB_CNAME */
+ VAR_MAX_GLOBAL_QUOTA = 620, /* VAR_MAX_GLOBAL_QUOTA */
+ VAR_HARDEN_UNVERIFIED_GLUE = 621, /* VAR_HARDEN_UNVERIFIED_GLUE */
+ VAR_LOG_TIME_ISO = 622 /* VAR_LOG_TIME_ISO */
};
typedef enum yytokentype yytoken_kind_t;
#endif
@@ -706,74 +715,83 @@ extern int yydebug;
#define VAR_CACHEDB_REDISPATH 543
#define VAR_CACHEDB_REDISPASSWORD 544
#define VAR_CACHEDB_REDISLOGICALDB 545
-#define VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM 546
-#define VAR_FOR_UPSTREAM 547
-#define VAR_AUTH_ZONE 548
-#define VAR_ZONEFILE 549
-#define VAR_MASTER 550
-#define VAR_URL 551
-#define VAR_FOR_DOWNSTREAM 552
-#define VAR_FALLBACK_ENABLED 553
-#define VAR_TLS_ADDITIONAL_PORT 554
-#define VAR_LOW_RTT 555
-#define VAR_LOW_RTT_PERMIL 556
-#define VAR_FAST_SERVER_PERMIL 557
-#define VAR_FAST_SERVER_NUM 558
-#define VAR_ALLOW_NOTIFY 559
-#define VAR_TLS_WIN_CERT 560
-#define VAR_TCP_CONNECTION_LIMIT 561
-#define VAR_ANSWER_COOKIE 562
-#define VAR_COOKIE_SECRET 563
-#define VAR_IP_RATELIMIT_COOKIE 564
-#define VAR_FORWARD_NO_CACHE 565
-#define VAR_STUB_NO_CACHE 566
-#define VAR_LOG_SERVFAIL 567
-#define VAR_DENY_ANY 568
-#define VAR_UNKNOWN_SERVER_TIME_LIMIT 569
-#define VAR_LOG_TAG_QUERYREPLY 570
-#define VAR_DISCARD_TIMEOUT 571
-#define VAR_WAIT_LIMIT 572
-#define VAR_WAIT_LIMIT_COOKIE 573
-#define VAR_WAIT_LIMIT_NETBLOCK 574
-#define VAR_WAIT_LIMIT_COOKIE_NETBLOCK 575
-#define VAR_STREAM_WAIT_SIZE 576
-#define VAR_TLS_CIPHERS 577
-#define VAR_TLS_CIPHERSUITES 578
-#define VAR_TLS_USE_SNI 579
-#define VAR_IPSET 580
-#define VAR_IPSET_NAME_V4 581
-#define VAR_IPSET_NAME_V6 582
-#define VAR_TLS_SESSION_TICKET_KEYS 583
-#define VAR_RPZ 584
-#define VAR_TAGS 585
-#define VAR_RPZ_ACTION_OVERRIDE 586
-#define VAR_RPZ_CNAME_OVERRIDE 587
-#define VAR_RPZ_LOG 588
-#define VAR_RPZ_LOG_NAME 589
-#define VAR_DYNLIB 590
-#define VAR_DYNLIB_FILE 591
-#define VAR_EDNS_CLIENT_STRING 592
-#define VAR_EDNS_CLIENT_STRING_OPCODE 593
-#define VAR_NSID 594
-#define VAR_ZONEMD_PERMISSIVE_MODE 595
-#define VAR_ZONEMD_CHECK 596
-#define VAR_ZONEMD_REJECT_ABSENCE 597
-#define VAR_RPZ_SIGNAL_NXDOMAIN_RA 598
-#define VAR_INTERFACE_AUTOMATIC_PORTS 599
-#define VAR_EDE 600
-#define VAR_INTERFACE_ACTION 601
-#define VAR_INTERFACE_VIEW 602
-#define VAR_INTERFACE_TAG 603
-#define VAR_INTERFACE_TAG_ACTION 604
-#define VAR_INTERFACE_TAG_DATA 605
-#define VAR_PROXY_PROTOCOL_PORT 606
-#define VAR_STATISTICS_INHIBIT_ZERO 607
-#define VAR_HARDEN_UNKNOWN_ADDITIONAL 608
-#define VAR_DISABLE_EDNS_DO 609
-#define VAR_CACHEDB_NO_STORE 610
-#define VAR_LOG_DESTADDR 611
-#define VAR_CACHEDB_CHECK_WHEN_SERVE_EXPIRED 612
-#define VAR_COOKIE_SECRET_FILE 613
+#define VAR_CACHEDB_REDISCOMMANDTIMEOUT 546
+#define VAR_CACHEDB_REDISCONNECTTIMEOUT 547
+#define VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM 548
+#define VAR_FOR_UPSTREAM 549
+#define VAR_AUTH_ZONE 550
+#define VAR_ZONEFILE 551
+#define VAR_MASTER 552
+#define VAR_URL 553
+#define VAR_FOR_DOWNSTREAM 554
+#define VAR_FALLBACK_ENABLED 555
+#define VAR_TLS_ADDITIONAL_PORT 556
+#define VAR_LOW_RTT 557
+#define VAR_LOW_RTT_PERMIL 558
+#define VAR_FAST_SERVER_PERMIL 559
+#define VAR_FAST_SERVER_NUM 560
+#define VAR_ALLOW_NOTIFY 561
+#define VAR_TLS_WIN_CERT 562
+#define VAR_TCP_CONNECTION_LIMIT 563
+#define VAR_ANSWER_COOKIE 564
+#define VAR_COOKIE_SECRET 565
+#define VAR_IP_RATELIMIT_COOKIE 566
+#define VAR_FORWARD_NO_CACHE 567
+#define VAR_STUB_NO_CACHE 568
+#define VAR_LOG_SERVFAIL 569
+#define VAR_DENY_ANY 570
+#define VAR_UNKNOWN_SERVER_TIME_LIMIT 571
+#define VAR_LOG_TAG_QUERYREPLY 572
+#define VAR_DISCARD_TIMEOUT 573
+#define VAR_WAIT_LIMIT 574
+#define VAR_WAIT_LIMIT_COOKIE 575
+#define VAR_WAIT_LIMIT_NETBLOCK 576
+#define VAR_WAIT_LIMIT_COOKIE_NETBLOCK 577
+#define VAR_STREAM_WAIT_SIZE 578
+#define VAR_TLS_CIPHERS 579
+#define VAR_TLS_CIPHERSUITES 580
+#define VAR_TLS_USE_SNI 581
+#define VAR_IPSET 582
+#define VAR_IPSET_NAME_V4 583
+#define VAR_IPSET_NAME_V6 584
+#define VAR_TLS_SESSION_TICKET_KEYS 585
+#define VAR_RPZ 586
+#define VAR_TAGS 587
+#define VAR_RPZ_ACTION_OVERRIDE 588
+#define VAR_RPZ_CNAME_OVERRIDE 589
+#define VAR_RPZ_LOG 590
+#define VAR_RPZ_LOG_NAME 591
+#define VAR_DYNLIB 592
+#define VAR_DYNLIB_FILE 593
+#define VAR_EDNS_CLIENT_STRING 594
+#define VAR_EDNS_CLIENT_STRING_OPCODE 595
+#define VAR_NSID 596
+#define VAR_ZONEMD_PERMISSIVE_MODE 597
+#define VAR_ZONEMD_CHECK 598
+#define VAR_ZONEMD_REJECT_ABSENCE 599
+#define VAR_RPZ_SIGNAL_NXDOMAIN_RA 600
+#define VAR_INTERFACE_AUTOMATIC_PORTS 601
+#define VAR_EDE 602
+#define VAR_INTERFACE_ACTION 603
+#define VAR_INTERFACE_VIEW 604
+#define VAR_INTERFACE_TAG 605
+#define VAR_INTERFACE_TAG_ACTION 606
+#define VAR_INTERFACE_TAG_DATA 607
+#define VAR_QUIC_PORT 608
+#define VAR_QUIC_SIZE 609
+#define VAR_PROXY_PROTOCOL_PORT 610
+#define VAR_STATISTICS_INHIBIT_ZERO 611
+#define VAR_HARDEN_UNKNOWN_ADDITIONAL 612
+#define VAR_DISABLE_EDNS_DO 613
+#define VAR_CACHEDB_NO_STORE 614
+#define VAR_LOG_DESTADDR 615
+#define VAR_CACHEDB_CHECK_WHEN_SERVE_EXPIRED 616
+#define VAR_COOKIE_SECRET_FILE 617
+#define VAR_ITER_SCRUB_NS 618
+#define VAR_ITER_SCRUB_CNAME 619
+#define VAR_MAX_GLOBAL_QUOTA 620
+#define VAR_HARDEN_UNVERIFIED_GLUE 621
+#define VAR_LOG_TIME_ISO 622
/* Value type. */
#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
@@ -783,7 +801,7 @@ union YYSTYPE
char* str;
-#line 787 "util/configparser.h"
+#line 805 "util/configparser.h"
};
typedef union YYSTYPE YYSTYPE;
@@ -794,8 +812,6 @@ typedef union YYSTYPE YYSTYPE;
extern YYSTYPE yylval;
-
int yyparse (void);
-
#endif /* !YY_YY_UTIL_CONFIGPARSER_H_INCLUDED */
diff --git a/util/configparser.y b/util/configparser.y
index b650b810918b..c10a5f475d32 100644
--- a/util/configparser.y
+++ b/util/configparser.y
@@ -182,6 +182,7 @@ extern struct config_parser_state* cfg_parser;
%token VAR_CACHEDB_REDISHOST VAR_CACHEDB_REDISPORT VAR_CACHEDB_REDISTIMEOUT
%token VAR_CACHEDB_REDISEXPIRERECORDS VAR_CACHEDB_REDISPATH VAR_CACHEDB_REDISPASSWORD
%token VAR_CACHEDB_REDISLOGICALDB
+%token VAR_CACHEDB_REDISCOMMANDTIMEOUT VAR_CACHEDB_REDISCONNECTTIMEOUT
%token VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM VAR_FOR_UPSTREAM
%token VAR_AUTH_ZONE VAR_ZONEFILE VAR_MASTER VAR_URL VAR_FOR_DOWNSTREAM
%token VAR_FALLBACK_ENABLED VAR_TLS_ADDITIONAL_PORT VAR_LOW_RTT VAR_LOW_RTT_PERMIL
@@ -202,16 +203,18 @@ extern struct config_parser_state* cfg_parser;
%token VAR_RPZ_SIGNAL_NXDOMAIN_RA VAR_INTERFACE_AUTOMATIC_PORTS VAR_EDE
%token VAR_INTERFACE_ACTION VAR_INTERFACE_VIEW VAR_INTERFACE_TAG
%token VAR_INTERFACE_TAG_ACTION VAR_INTERFACE_TAG_DATA
+%token VAR_QUIC_PORT VAR_QUIC_SIZE
%token VAR_PROXY_PROTOCOL_PORT VAR_STATISTICS_INHIBIT_ZERO
%token VAR_HARDEN_UNKNOWN_ADDITIONAL VAR_DISABLE_EDNS_DO VAR_CACHEDB_NO_STORE
%token VAR_LOG_DESTADDR VAR_CACHEDB_CHECK_WHEN_SERVE_EXPIRED
-%token VAR_COOKIE_SECRET_FILE
+%token VAR_COOKIE_SECRET_FILE VAR_ITER_SCRUB_NS VAR_ITER_SCRUB_CNAME
+%token VAR_MAX_GLOBAL_QUOTA VAR_HARDEN_UNVERIFIED_GLUE VAR_LOG_TIME_ISO
%%
toplevelvars: /* empty */ | toplevelvars toplevelvar ;
-toplevelvar: serverstart contents_server | stubstart contents_stub |
- forwardstart contents_forward | pythonstart contents_py |
- rcstart contents_rc | dtstart contents_dt | viewstart contents_view |
+toplevelvar: serverstart contents_server | stub_clause |
+ forward_clause | pythonstart contents_py |
+ rcstart contents_rc | dtstart contents_dt | view_clause |
dnscstart contents_dnsc | cachedbstart contents_cachedb |
ipsetstart contents_ipset | authstart contents_auth |
rpzstart contents_rpz | dynlibstart contents_dl |
@@ -340,10 +343,21 @@ content_server: server_num_threads | server_verbosity | server_port |
server_edns_client_string_opcode | server_nsid |
server_zonemd_permissive_mode | server_max_reuse_tcp_queries |
server_tcp_reuse_timeout | server_tcp_auth_query_timeout |
+ server_quic_port | server_quic_size |
server_interface_automatic_ports | server_ede |
server_proxy_protocol_port | server_statistics_inhibit_zero |
server_harden_unknown_additional | server_disable_edns_do |
- server_log_destaddr | server_cookie_secret_file
+ server_log_destaddr | server_cookie_secret_file |
+ server_iter_scrub_ns | server_iter_scrub_cname | server_max_global_quota |
+ server_harden_unverified_glue | server_log_time_iso
+ ;
+stub_clause: stubstart contents_stub
+ {
+ /* stub end */
+ if(cfg_parser->cfg->stubs &&
+ !cfg_parser->cfg->stubs->name)
+ yyerror("stub-zone without name");
+ }
;
stubstart: VAR_STUB_ZONE
{
@@ -359,17 +373,19 @@ stubstart: VAR_STUB_ZONE
}
}
;
-contents_stub: content_stub contents_stub
- |
- {
- /* stub end */
- if(cfg_parser->cfg->stubs &&
- !cfg_parser->cfg->stubs->name)
- yyerror("stub-zone without name");
- };
+contents_stub: contents_stub content_stub
+ | ;
content_stub: stub_name | stub_host | stub_addr | stub_prime | stub_first |
stub_no_cache | stub_ssl_upstream | stub_tcp_upstream
;
+forward_clause: forwardstart contents_forward
+ {
+ /* forward end */
+ if(cfg_parser->cfg->forwards &&
+ !cfg_parser->cfg->forwards->name)
+ yyerror("forward-zone without name");
+ }
+ ;
forwardstart: VAR_FORWARD_ZONE
{
struct config_stub* s;
@@ -384,17 +400,19 @@ forwardstart: VAR_FORWARD_ZONE
}
}
;
-contents_forward: content_forward contents_forward
- |
- {
- /* forward end */
- if(cfg_parser->cfg->forwards &&
- !cfg_parser->cfg->forwards->name)
- yyerror("forward-zone without name");
- };
+contents_forward: contents_forward content_forward
+ | ;
content_forward: forward_name | forward_host | forward_addr | forward_first |
forward_no_cache | forward_ssl_upstream | forward_tcp_upstream
;
+view_clause: viewstart contents_view
+ {
+ /* view end */
+ if(cfg_parser->cfg->views &&
+ !cfg_parser->cfg->views->name)
+ yyerror("view without name");
+ }
+ ;
viewstart: VAR_VIEW
{
struct config_view* s;
@@ -409,14 +427,8 @@ viewstart: VAR_VIEW
}
}
;
-contents_view: content_view contents_view
- |
- {
- /* view end */
- if(cfg_parser->cfg->views &&
- !cfg_parser->cfg->views->name)
- yyerror("view without name");
- };
+contents_view: contents_view content_view
+ | ;
content_view: view_name | view_local_zone | view_local_data | view_first |
view_response_ip | view_response_ip_data | view_local_data_ptr
;
@@ -1199,6 +1211,26 @@ server_http_notls_downstream: VAR_HTTP_NOTLS_DOWNSTREAM STRING_ARG
else cfg_parser->cfg->http_notls_downstream = (strcmp($2, "yes")==0);
free($2);
};
+server_quic_port: VAR_QUIC_PORT STRING_ARG
+ {
+ OUTYY(("P(server_quic_port:%s)\n", $2));
+#ifndef HAVE_NGTCP2
+ log_warn("%s:%d: Unbound is not compiled with "
+ "ngtcp2. This is required to use DNS "
+ "over QUIC.", cfg_parser->filename, cfg_parser->line);
+#endif
+ if(atoi($2) == 0)
+ yyerror("port number expected");
+ else cfg_parser->cfg->quic_port = atoi($2);
+ free($2);
+ };
+server_quic_size: VAR_QUIC_SIZE STRING_ARG
+ {
+ OUTYY(("P(server_quic_size:%s)\n", $2));
+ if(!cfg_parse_memsize($2, &cfg_parser->cfg->quic_size))
+ yyerror("memory size expected");
+ free($2);
+ };
server_use_systemd: VAR_USE_SYSTEMD STRING_ARG
{
OUTYY(("P(server_use_systemd:%s)\n", $2));
@@ -1240,6 +1272,15 @@ server_log_time_ascii: VAR_LOG_TIME_ASCII STRING_ARG
free($2);
}
;
+server_log_time_iso: VAR_LOG_TIME_ISO STRING_ARG
+ {
+ OUTYY(("P(server_log_time_iso:%s)\n", $2));
+ if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
+ yyerror("expected yes or no.");
+ else cfg_parser->cfg->log_time_iso = (strcmp($2, "yes")==0);
+ free($2);
+ }
+ ;
server_log_queries: VAR_LOG_QUERIES STRING_ARG
{
OUTYY(("P(server_log_queries:%s)\n", $2));
@@ -1805,6 +1846,16 @@ server_harden_glue: VAR_HARDEN_GLUE STRING_ARG
free($2);
}
;
+server_harden_unverified_glue: VAR_HARDEN_UNVERIFIED_GLUE STRING_ARG
+ {
+ OUTYY(("P(server_harden_unverified_glue:%s)\n", $2));
+ if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
+ yyerror("expected yes or no.");
+ else cfg_parser->cfg->harden_unverified_glue =
+ (strcmp($2, "yes")==0);
+ free($2);
+ }
+ ;
server_harden_dnssec_stripped: VAR_HARDEN_DNSSEC_STRIPPED STRING_ARG
{
OUTYY(("P(server_harden_dnssec_stripped:%s)\n", $2));
@@ -3819,7 +3870,8 @@ contents_cachedb: contents_cachedb content_cachedb
content_cachedb: cachedb_backend_name | cachedb_secret_seed |
redis_server_host | redis_server_port | redis_timeout |
redis_expire_records | redis_server_path | redis_server_password |
- cachedb_no_store | redis_logical_db | cachedb_check_when_serve_expired
+ cachedb_no_store | redis_logical_db | cachedb_check_when_serve_expired |
+ redis_command_timeout | redis_connect_timeout
;
cachedb_backend_name: VAR_CACHEDB_BACKEND STRING_ARG
{
@@ -3935,6 +3987,32 @@ redis_timeout: VAR_CACHEDB_REDISTIMEOUT STRING_ARG
free($2);
}
;
+redis_command_timeout: VAR_CACHEDB_REDISCOMMANDTIMEOUT STRING_ARG
+ {
+ #if defined(USE_CACHEDB) && defined(USE_REDIS)
+ OUTYY(("P(redis_command_timeout:%s)\n", $2));
+ if(atoi($2) == 0 && strcmp($2, "0") != 0)
+ yyerror("redis command timeout value expected");
+ else cfg_parser->cfg->redis_command_timeout = atoi($2);
+ #else
+ OUTYY(("P(Compiled without cachedb or redis, ignoring)\n"));
+ #endif
+ free($2);
+ }
+ ;
+redis_connect_timeout: VAR_CACHEDB_REDISCONNECTTIMEOUT STRING_ARG
+ {
+ #if defined(USE_CACHEDB) && defined(USE_REDIS)
+ OUTYY(("P(redis_connect_timeout:%s)\n", $2));
+ if(atoi($2) == 0 && strcmp($2, "0") != 0)
+ yyerror("redis connect timeout value expected");
+ else cfg_parser->cfg->redis_connect_timeout = atoi($2);
+ #else
+ OUTYY(("P(Compiled without cachedb or redis, ignoring)\n"));
+ #endif
+ free($2);
+ }
+ ;
redis_expire_records: VAR_CACHEDB_REDISEXPIRERECORDS STRING_ARG
{
#if defined(USE_CACHEDB) && defined(USE_REDIS)
@@ -4006,6 +4084,33 @@ server_cookie_secret_file: VAR_COOKIE_SECRET_FILE STRING_ARG
cfg_parser->cfg->cookie_secret_file = $2;
}
;
+server_iter_scrub_ns: VAR_ITER_SCRUB_NS STRING_ARG
+ {
+ OUTYY(("P(server_iter_scrub_ns:%s)\n", $2));
+ if(atoi($2) == 0 && strcmp($2, "0") != 0)
+ yyerror("number expected");
+ else cfg_parser->cfg->iter_scrub_ns = atoi($2);
+ free($2);
+ }
+ ;
+server_iter_scrub_cname: VAR_ITER_SCRUB_CNAME STRING_ARG
+ {
+ OUTYY(("P(server_iter_scrub_cname:%s)\n", $2));
+ if(atoi($2) == 0 && strcmp($2, "0") != 0)
+ yyerror("number expected");
+ else cfg_parser->cfg->iter_scrub_cname = atoi($2);
+ free($2);
+ }
+ ;
+server_max_global_quota: VAR_MAX_GLOBAL_QUOTA STRING_ARG
+ {
+ OUTYY(("P(server_max_global_quota:%s)\n", $2));
+ if(atoi($2) == 0 && strcmp($2, "0") != 0)
+ yyerror("number expected");
+ else cfg_parser->cfg->max_global_quota = atoi($2);
+ free($2);
+ }
+ ;
ipsetstart: VAR_IPSET
{
OUTYY(("\nP(ipset:)\n"));
diff --git a/util/data/msgparse.h b/util/data/msgparse.h
index aebd48efac34..62f0d5aacd80 100644
--- a/util/data/msgparse.h
+++ b/util/data/msgparse.h
@@ -89,6 +89,8 @@ extern time_t MIN_NEG_TTL;
extern int SERVE_EXPIRED;
/** Time to serve records after expiration */
extern time_t SERVE_EXPIRED_TTL;
+/** Reset serve expired TTL after failed update attempt */
+extern time_t SERVE_EXPIRED_TTL_RESET;
/** TTL to use for expired records */
extern time_t SERVE_EXPIRED_REPLY_TTL;
/** Negative cache time (for entries without any RRs.) */
diff --git a/util/data/msgreply.c b/util/data/msgreply.c
index c9d7bbf3ad47..78e4fb1c323a 100644
--- a/util/data/msgreply.c
+++ b/util/data/msgreply.c
@@ -67,6 +67,8 @@ time_t MIN_NEG_TTL = 0;
int SERVE_EXPIRED = 0;
/** Time to serve records after expiration */
time_t SERVE_EXPIRED_TTL = 0;
+/** Reset serve expired TTL after failed update attempt */
+time_t SERVE_EXPIRED_TTL_RESET = 0;
/** TTL to use for expired records */
time_t SERVE_EXPIRED_REPLY_TTL = 30;
/** If we serve the original TTL or decrementing TTLs */
@@ -95,8 +97,9 @@ parse_create_qinfo(sldns_buffer* pkt, struct msg_parse* msg,
/** constructor for replyinfo */
struct reply_info*
construct_reply_info_base(struct regional* region, uint16_t flags, size_t qd,
- time_t ttl, time_t prettl, time_t expttl, size_t an, size_t ns,
- size_t ar, size_t total, enum sec_status sec, sldns_ede_code reason_bogus)
+ time_t ttl, time_t prettl, time_t expttl, time_t norecttl, size_t an,
+ size_t ns, size_t ar, size_t total, enum sec_status sec,
+ sldns_ede_code reason_bogus)
{
struct reply_info* rep;
/* rrset_count-1 because the first ref is part of the struct. */
@@ -114,6 +117,7 @@ construct_reply_info_base(struct regional* region, uint16_t flags, size_t qd,
rep->ttl = ttl;
rep->prefetch_ttl = prettl;
rep->serve_expired_ttl = expttl;
+ rep->serve_expired_norec_ttl = norecttl;
rep->an_numrrsets = an;
rep->ns_numrrsets = ns;
rep->ar_numrrsets = ar;
@@ -139,8 +143,8 @@ static int
parse_create_repinfo(struct msg_parse* msg, struct reply_info** rep,
struct regional* region)
{
- *rep = construct_reply_info_base(region, msg->flags, msg->qdcount, 0,
- 0, 0, msg->an_rrsets, msg->ns_rrsets, msg->ar_rrsets,
+ *rep = construct_reply_info_base(region, msg->flags, msg->qdcount, 0,
+ 0, 0, 0, msg->an_rrsets, msg->ns_rrsets, msg->ar_rrsets,
msg->rrset_count, sec_status_unchecked, LDNS_EDE_NONE);
if(!*rep)
return 0;
@@ -171,6 +175,32 @@ reply_info_alloc_rrset_keys(struct reply_info* rep, struct alloc_cache* alloc,
return 1;
}
+int
+reply_info_can_answer_expired(struct reply_info* rep, time_t timenow)
+{
+ log_assert(rep->ttl < timenow);
+ /* Really expired */
+ if(SERVE_EXPIRED_TTL && rep->serve_expired_ttl < timenow) return 0;
+ /* Ignore expired failure answers */
+ if(FLAGS_GET_RCODE(rep->flags) != LDNS_RCODE_NOERROR &&
+ FLAGS_GET_RCODE(rep->flags) != LDNS_RCODE_NXDOMAIN &&
+ FLAGS_GET_RCODE(rep->flags) != LDNS_RCODE_YXDOMAIN) return 0;
+ return 1;
+}
+
+int reply_info_could_use_expired(struct reply_info* rep, time_t timenow)
+{
+ log_assert(rep->ttl < timenow);
+ /* Really expired */
+ if(SERVE_EXPIRED_TTL && rep->serve_expired_ttl < timenow &&
+ !SERVE_EXPIRED_TTL_RESET) return 0;
+ /* Ignore expired failure answers */
+ if(FLAGS_GET_RCODE(rep->flags) != LDNS_RCODE_NOERROR &&
+ FLAGS_GET_RCODE(rep->flags) != LDNS_RCODE_NXDOMAIN &&
+ FLAGS_GET_RCODE(rep->flags) != LDNS_RCODE_YXDOMAIN) return 0;
+ return 1;
+}
+
struct reply_info *
make_new_reply_info(const struct reply_info* rep, struct regional* region,
size_t an_numrrsets, size_t copy_rrsets)
@@ -185,7 +215,8 @@ make_new_reply_info(const struct reply_info* rep, struct regional* region,
* so the total number of RRsets is an_numrrsets. */
new_rep = construct_reply_info_base(region, rep->flags,
rep->qdcount, rep->ttl, rep->prefetch_ttl,
- rep->serve_expired_ttl, an_numrrsets, 0, 0, an_numrrsets,
+ rep->serve_expired_ttl, rep->serve_expired_norec_ttl,
+ an_numrrsets, 0, 0, an_numrrsets,
sec_status_insecure, LDNS_EDE_NONE);
if(!new_rep)
return NULL;
@@ -486,6 +517,8 @@ parse_copy_decompress(sldns_buffer* pkt, struct msg_parse* msg,
}
rep->prefetch_ttl = PREFETCH_TTL_CALC(rep->ttl);
rep->serve_expired_ttl = rep->ttl + SERVE_EXPIRED_TTL;
+ /* rep->serve_expired_norec_ttl should stay at 0 */
+ log_assert(rep->serve_expired_norec_ttl == 0);
return 1;
}
@@ -568,6 +601,9 @@ reply_info_set_ttls(struct reply_info* rep, time_t timenow)
rep->ttl += timenow;
rep->prefetch_ttl += timenow;
rep->serve_expired_ttl += timenow;
+ /* Don't set rep->serve_expired_norec_ttl; this should only be set
+ * on cached records when encountering an error */
+ log_assert(rep->serve_expired_norec_ttl == 0);
for(i=0; i<rep->rrset_count; i++) {
struct packed_rrset_data* data = (struct packed_rrset_data*)
rep->ref[i].key->entry.data;
@@ -763,6 +799,7 @@ reply_info_copy(struct reply_info* rep, struct alloc_cache* alloc,
struct reply_info* cp;
cp = construct_reply_info_base(region, rep->flags, rep->qdcount,
rep->ttl, rep->prefetch_ttl, rep->serve_expired_ttl,
+ rep->serve_expired_norec_ttl,
rep->an_numrrsets, rep->ns_numrrsets, rep->ar_numrrsets,
rep->rrset_count, rep->security, rep->reason_bogus);
if(!cp)
diff --git a/util/data/msgreply.h b/util/data/msgreply.h
index 4b93b12c8f33..d1c2bfa4bdfc 100644
--- a/util/data/msgreply.h
+++ b/util/data/msgreply.h
@@ -145,7 +145,7 @@ struct reply_info {
/** 32 bit padding to pad struct member alignment to 64 bits. */
uint32_t padding;
- /**
+ /**
* TTL of the entire reply (for negative caching).
* only for use when there are 0 RRsets in this message.
* if there are RRsets, check those instead.
@@ -158,13 +158,25 @@ struct reply_info {
*/
time_t prefetch_ttl;
- /**
+ /**
* Reply TTL extended with serve expired TTL, to limit time to serve
* expired message.
*/
time_t serve_expired_ttl;
/**
+ * TTL for an expired entry to be used without attempting recursion
+ * since a previous recursion attempt failed to update the message.
+ * This is just an efficiency timer when serve-expired-client-timeout
+ * is configured. It will make Unbound immediately reply with the
+ * expired entry instead of trying resolution first.
+ * It is set on cached entries by modules that identified problems
+ * while resolving, e.g., failed upstreams from Iterator, or failed
+ * validation from Validator.
+ */
+ time_t serve_expired_norec_ttl;
+
+ /**
* The security status from DNSSEC validation of this message.
*/
enum sec_status security;
@@ -244,6 +256,7 @@ struct msgreply_entry {
* @param ttl: TTL of replyinfo
* @param prettl: prefetch ttl
* @param expttl: serve expired ttl
+ * @param norecttl: serve expired no recursion ttl
* @param an: an count
* @param ns: ns count
* @param ar: ar count
@@ -255,8 +268,8 @@ struct msgreply_entry {
*/
struct reply_info*
construct_reply_info_base(struct regional* region, uint16_t flags, size_t qd,
- time_t ttl, time_t prettl, time_t expttl, size_t an, size_t ns,
- size_t ar, size_t total, enum sec_status sec,
+ time_t ttl, time_t prettl, time_t expttl, time_t norecttl, size_t an,
+ size_t ns, size_t ar, size_t total, enum sec_status sec,
sldns_ede_code reason_bogus);
/**
@@ -399,6 +412,24 @@ struct reply_info* reply_info_copy(struct reply_info* rep,
int reply_info_alloc_rrset_keys(struct reply_info* rep,
struct alloc_cache* alloc, struct regional* region);
+/**
+ * Check if an *expired* (checked by the caller already) reply info can be used
+ * as an expired answer.
+ * @param rep: expired reply info to check.
+ * @param timenow: the current time.
+ * @return 1 if it can be used as an answer, 0 otherwise.
+ */
+int reply_info_can_answer_expired(struct reply_info* rep, time_t timenow);
+
+/**
+ * Check if an *expired* (checked by the caller already) reply info could be
+ * useful data to stay in the cache.
+ * @param rep: expired reply info to check.
+ * @param timenow: the current time.
+ * @return 1 if it is useful, 0 otherwise.
+ */
+int reply_info_could_use_expired(struct reply_info* rep, time_t timenow);
+
/*
* Create a new reply_info based on 'rep'. The new info is based on
* the passed 'rep', but ignores any rrsets except for the first 'an_numrrsets'
diff --git a/util/data/packed_rrset.h b/util/data/packed_rrset.h
index e1feb22bb7f6..776e8d0923cc 100644
--- a/util/data/packed_rrset.h
+++ b/util/data/packed_rrset.h
@@ -68,6 +68,8 @@ typedef uint64_t rrset_id_type;
* actual network. But messages with these records in it can be stored in
* the cache and retrieved for a reply. */
#define PACKED_RRSET_RPZ 0x8
+/** this rrset is A/AAAA and is an unverified glue record */
+#define PACKED_RRSET_UNVERIFIED_GLUE 0x10
/** number of rrs and rrsets for integer overflow protection. More than
* this is not really possible (64K packet has much less RRs and RRsets) in
@@ -96,6 +98,7 @@ struct packed_rrset_key {
* o PACKED_RRSET_SOA_NEG
* o PACKED_RRSET_FIXEDTTL (not supposed to be cached)
* o PACKED_RRSET_RPZ
+ * o PACKED_RRSET_UNVERIFIED_GLUE
*/
uint32_t flags;
/** the rrset type in network format */
diff --git a/util/fptr_wlist.c b/util/fptr_wlist.c
index 705dc1bbe3c4..e94ec5bbce85 100644
--- a/util/fptr_wlist.c
+++ b/util/fptr_wlist.c
@@ -47,6 +47,7 @@
#include "util/fptr_wlist.h"
#include "util/mini_event.h"
#include "services/outside_network.h"
+#include "services/listen_dnsport.h"
#include "services/mesh.h"
#include "services/localzone.h"
#include "services/authzone.h"
@@ -132,6 +133,9 @@ fptr_whitelist_comm_timer(void (*fptr)(void*))
else if(fptr == &worker_stat_timer_cb) return 1;
else if(fptr == &worker_probe_timer_cb) return 1;
else if(fptr == &validate_suspend_timer_cb) return 1;
+#ifdef HAVE_NGTCP2
+ else if(fptr == &doq_timer_cb) return 1;
+#endif
#ifdef UB_ON_WINDOWS
else if(fptr == &wsvc_cron_cb) return 1;
#endif
@@ -181,6 +185,9 @@ fptr_whitelist_event(void (*fptr)(int, short, void *))
else if(fptr == &tube_handle_signal) return 1;
else if(fptr == &comm_base_handle_slow_accept) return 1;
else if(fptr == &comm_point_http_handle_callback) return 1;
+#ifdef HAVE_NGTCP2
+ else if(fptr == &comm_point_doq_callback) return 1;
+#endif
#ifdef USE_DNSTAP
else if(fptr == &dtio_output_cb) return 1;
else if(fptr == &dtio_cmd_cb) return 1;
@@ -190,6 +197,10 @@ fptr_whitelist_event(void (*fptr)(int, short, void *))
else if(fptr == &dtio_tap_callback) return 1;
else if(fptr == &dtio_mainfdcallback) return 1;
#endif
+#ifdef HAVE_NGTCP2
+ else if(fptr == &doq_client_event_cb) return 1;
+ else if(fptr == &doq_client_timer_cb) return 1;
+#endif
#ifdef UB_ON_WINDOWS
else if(fptr == &worker_win_stop_cb) return 1;
#endif
@@ -248,6 +259,12 @@ fptr_whitelist_rbtree_cmp(int (*fptr) (const void *, const void *))
else if(fptr == &auth_zone_cmp) return 1;
else if(fptr == &auth_data_cmp) return 1;
else if(fptr == &auth_xfer_cmp) return 1;
+#ifdef HAVE_NGTCP2
+ else if(fptr == &doq_conn_cmp) return 1;
+ else if(fptr == &doq_conid_cmp) return 1;
+ else if(fptr == &doq_timer_cmp) return 1;
+ else if(fptr == &doq_stream_cmp) return 1;
+#endif
return 0;
}
diff --git a/util/locks.h b/util/locks.h
index d86ee4923f73..eb698cb759aa 100644
--- a/util/locks.h
+++ b/util/locks.h
@@ -88,6 +88,7 @@
#define lock_get_mem(lock) (0) /* nothing */
#define checklock_start() /* nop */
#define checklock_stop() /* nop */
+#define checklock_set_output_name(name) /* nop */
#ifdef HAVE_PTHREAD
#include <pthread.h>
diff --git a/util/log.c b/util/log.c
index a15ee920c0fb..a44758728b06 100644
--- a/util/log.c
+++ b/util/log.c
@@ -45,6 +45,7 @@
#ifdef HAVE_TIME_H
#include <time.h>
#endif
+#include <sys/time.h>
#ifdef HAVE_SYSLOG_H
# include <syslog.h>
#else
@@ -81,6 +82,8 @@ static int logging_to_syslog = 0;
#endif /* HAVE_SYSLOG_H */
/** print time in UTC or in secondsfrom1970 */
static int log_time_asc = 0;
+/** print time in iso format */
+static int log_time_iso = 0;
void
log_init(const char* filename, int use_syslog, const char* chrootdir)
@@ -205,6 +208,11 @@ void log_set_time_asc(int use_asc)
log_time_asc = use_asc;
}
+void log_set_time_iso(int use_iso)
+{
+ log_time_iso = use_iso;
+}
+
void* log_get_lock(void)
{
if(!key_created)
@@ -269,6 +277,34 @@ log_vmsg(int pri, const char* type,
lock_basic_unlock(&log_lock);
return;
}
+#if defined(HAVE_STRFTIME) && defined(HAVE_LOCALTIME_R)
+ if(log_time_iso && log_time_asc) {
+ char tzbuf[16];
+ struct timeval tv;
+ struct tm tm, *tm_p;
+ if(gettimeofday(&tv, NULL) < 0)
+ memset(&tv, 0, sizeof(tv));
+ now = (time_t)tv.tv_sec;
+ tm_p = localtime_r(&now, &tm);
+ strftime(tmbuf, sizeof(tmbuf), "%Y-%m-%dT%H:%M:%S", tm_p);
+ if(strftime(tzbuf, sizeof(tzbuf), "%z", tm_p) == 5) {
+ /* put ':' in "+hh:mm" */
+ tzbuf[5] = tzbuf[4];
+ tzbuf[4] = tzbuf[3];
+ tzbuf[3] = ':';
+ tzbuf[6] = 0;
+ }
+ fprintf(logfile, "%s.%3.3d%s %s[%d:%x] %s: %s\n",
+ tmbuf, (int)tv.tv_usec/1000, tzbuf,
+ ident, (int)getpid(), tid?*tid:0, type, message);
+#ifdef UB_ON_WINDOWS
+ /* line buffering does not work on windows */
+ fflush(logfile);
+#endif
+ lock_basic_unlock(&log_lock);
+ return;
+ }
+#endif /* HAVE_STRFTIME && HAVE_LOCALTIME_R */
now = (time_t)time(NULL);
#if defined(HAVE_STRFTIME) && defined(HAVE_LOCALTIME_R)
if(log_time_asc && strftime(tmbuf, sizeof(tmbuf), "%b %d %H:%M:%S",
diff --git a/util/log.h b/util/log.h
index 29a1ba38009f..e8b03c45ad50 100644
--- a/util/log.h
+++ b/util/log.h
@@ -138,6 +138,12 @@ void log_ident_set_or_default(const char* identity);
*/
void log_set_time_asc(int use_asc);
+/**
+ * Set if the time value is printed in ISO8601 format.
+ * @param use_iso: if true, ascii timestamps are formatted in iso format.
+ */
+void log_set_time_iso(int use_iso);
+
/** get log lock */
void* log_get_lock(void);
diff --git a/util/module.h b/util/module.h
index 5bdb622a2515..abad3c8dd114 100644
--- a/util/module.h
+++ b/util/module.h
@@ -319,13 +319,15 @@ typedef int inplace_cb_query_response_func_type(struct module_qstate* qstate,
/**
* Function called when looking for (expired) cached answers during the serve
* expired logic.
- * Called as func(qstate, lookup_qinfo)
+ * Called as func(qstate, lookup_qinfo, &is_expired)
* Where:
* qstate: the query state.
* lookup_qinfo: the qinfo to lookup for.
+ * is_expired: set if the cached answer is expired.
*/
typedef struct dns_msg* serve_expired_lookup_func_type(
- struct module_qstate* qstate, struct query_info* lookup_qinfo);
+ struct module_qstate* qstate, struct query_info* lookup_qinfo,
+ int* is_expired);
/**
* Module environment.
@@ -696,6 +698,8 @@ struct module_qstate {
/** Extended result of response-ip action processing, mainly
* for logging purposes. */
struct respip_action_info* respip_action_info;
+ /** if the query has been modified by rpz processing. */
+ int rpz_applied;
/** if the query is rpz passthru, no further rpz processing for it */
int rpz_passthru;
/* Flag tcp required. */
diff --git a/util/netevent.c b/util/netevent.c
index 9d5131da9656..b36f00f1a2aa 100644
--- a/util/netevent.c
+++ b/util/netevent.c
@@ -53,6 +53,7 @@
#include "dnstap/dnstap.h"
#include "dnscrypt/dnscrypt.h"
#include "services/listen_dnsport.h"
+#include "util/random.h"
#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif
@@ -72,9 +73,16 @@
#ifdef HAVE_OPENSSL_ERR_H
#include <openssl/err.h>
#endif
+
+#ifdef HAVE_NGTCP2
+#include <ngtcp2/ngtcp2.h>
+#include <ngtcp2/ngtcp2_crypto.h>
+#endif
+
#ifdef HAVE_LINUX_NET_TSTAMP_H
#include <linux/net_tstamp.h>
#endif
+
/* -------- Start of local definitions -------- */
/** if CMSG_ALIGN is not defined on this platform, a workaround */
#ifndef CMSG_ALIGN
@@ -1160,6 +1168,1774 @@ comm_point_udp_callback(int fd, short event, void* arg)
}
}
+#ifdef HAVE_NGTCP2
+void
+doq_pkt_addr_init(struct doq_pkt_addr* paddr)
+{
+ paddr->addrlen = (socklen_t)sizeof(paddr->addr);
+ paddr->localaddrlen = (socklen_t)sizeof(paddr->localaddr);
+ paddr->ifindex = 0;
+}
+
+/** set the ecn on the transmission */
+static void
+doq_set_ecn(int fd, int family, uint32_t ecn)
+{
+ unsigned int val = ecn;
+ if(family == AF_INET6) {
+ if(setsockopt(fd, IPPROTO_IPV6, IPV6_TCLASS, &val,
+ (socklen_t)sizeof(val)) == -1) {
+ log_err("setsockopt(.. IPV6_TCLASS ..): %s",
+ strerror(errno));
+ }
+ return;
+ }
+ if(setsockopt(fd, IPPROTO_IP, IP_TOS, &val,
+ (socklen_t)sizeof(val)) == -1) {
+ log_err("setsockopt(.. IP_TOS ..): %s",
+ strerror(errno));
+ }
+}
+
+/** set the local address in the control ancillary data */
+static void
+doq_set_localaddr_cmsg(struct msghdr* msg, size_t control_size,
+ struct doq_addr_storage* localaddr, socklen_t localaddrlen,
+ int ifindex)
+{
+#ifndef S_SPLINT_S
+ struct cmsghdr* cmsg;
+#endif /* S_SPLINT_S */
+#ifndef S_SPLINT_S
+ cmsg = CMSG_FIRSTHDR(msg);
+ if(localaddr->sockaddr.in.sin_family == AF_INET) {
+#ifdef IP_PKTINFO
+ struct sockaddr_in* sa = (struct sockaddr_in*)localaddr;
+ struct in_pktinfo v4info;
+ log_assert(localaddrlen >= sizeof(struct sockaddr_in));
+ msg->msg_controllen = CMSG_SPACE(sizeof(struct in_pktinfo));
+ memset(msg->msg_control, 0, msg->msg_controllen);
+ log_assert(msg->msg_controllen <= control_size);
+ cmsg->cmsg_level = IPPROTO_IP;
+ cmsg->cmsg_type = IP_PKTINFO;
+ memset(&v4info, 0, sizeof(v4info));
+# ifdef HAVE_STRUCT_IN_PKTINFO_IPI_SPEC_DST
+ memmove(&v4info.ipi_spec_dst, &sa->sin_addr,
+ sizeof(struct in_addr));
+# else
+ memmove(&v4info.ipi_addr, &sa->sin_addr,
+ sizeof(struct in_addr));
+# endif
+ v4info.ipi_ifindex = ifindex;
+ memmove(CMSG_DATA(cmsg), &v4info, sizeof(struct in_pktinfo));
+ cmsg->cmsg_len = CMSG_LEN(sizeof(struct in_pktinfo));
+#elif defined(IP_SENDSRCADDR)
+ struct sockaddr_in* sa= (struct sockaddr_in*)localaddr;
+ log_assert(localaddrlen >= sizeof(struct sockaddr_in));
+ msg->msg_controllen = CMSG_SPACE(sizeof(struct in_addr));
+ memset(msg->msg_control, 0, msg->msg_controllen);
+ log_assert(msg->msg_controllen <= control_size);
+ cmsg->cmsg_level = IPPROTO_IP;
+ cmsg->cmsg_type = IP_SENDSRCADDR;
+ memmove(CMSG_DATA(cmsg), &sa->sin_addr,
+ sizeof(struct in_addr));
+ cmsg->cmsg_len = CMSG_LEN(sizeof(struct in_addr));
+#endif
+ } else {
+ struct sockaddr_in6* sa6 = (struct sockaddr_in6*)localaddr;
+ struct in6_pktinfo v6info;
+ log_assert(localaddrlen >= sizeof(struct sockaddr_in6));
+ msg->msg_controllen = CMSG_SPACE(sizeof(struct in6_pktinfo));
+ memset(msg->msg_control, 0, msg->msg_controllen);
+ log_assert(msg->msg_controllen <= control_size);
+ cmsg->cmsg_level = IPPROTO_IPV6;
+ cmsg->cmsg_type = IPV6_PKTINFO;
+ memset(&v6info, 0, sizeof(v6info));
+ memmove(&v6info.ipi6_addr, &sa6->sin6_addr,
+ sizeof(struct in6_addr));
+ v6info.ipi6_ifindex = ifindex;
+ memmove(CMSG_DATA(cmsg), &v6info, sizeof(struct in6_pktinfo));
+ cmsg->cmsg_len = CMSG_LEN(sizeof(struct in6_pktinfo));
+ }
+#endif /* S_SPLINT_S */
+ /* Ignore unused variables, if no assertions are compiled. */
+ (void)localaddrlen;
+ (void)control_size;
+}
+
+/** write address and port into strings */
+static int
+doq_print_addr_port(struct doq_addr_storage* addr, socklen_t addrlen,
+ char* host, size_t hostlen, char* port, size_t portlen)
+{
+ if(addr->sockaddr.in.sin_family == AF_INET) {
+ struct sockaddr_in* sa = (struct sockaddr_in*)addr;
+ log_assert(addrlen >= sizeof(*sa));
+ if(inet_ntop(sa->sin_family, &sa->sin_addr, host,
+ (socklen_t)hostlen) == 0) {
+ log_hex("inet_ntop error: address", &sa->sin_addr,
+ sizeof(sa->sin_addr));
+ return 0;
+ }
+ snprintf(port, portlen, "%u", (unsigned)ntohs(sa->sin_port));
+ } else if(addr->sockaddr.in.sin_family == AF_INET6) {
+ struct sockaddr_in6* sa6 = (struct sockaddr_in6*)addr;
+ log_assert(addrlen >= sizeof(*sa6));
+ if(inet_ntop(sa6->sin6_family, &sa6->sin6_addr, host,
+ (socklen_t)hostlen) == 0) {
+ log_hex("inet_ntop error: address", &sa6->sin6_addr,
+ sizeof(sa6->sin6_addr));
+ return 0;
+ }
+ snprintf(port, portlen, "%u", (unsigned)ntohs(sa6->sin6_port));
+ }
+ return 1;
+}
+
+/** doq store the blocked packet when write has blocked */
+static void
+doq_store_blocked_pkt(struct comm_point* c, struct doq_pkt_addr* paddr,
+ uint32_t ecn)
+{
+ if(c->doq_socket->have_blocked_pkt)
+ return; /* should not happen that we write when there is
+ already a blocked write, but if so, drop it. */
+ if(sldns_buffer_limit(c->doq_socket->pkt_buf) >
+ sldns_buffer_capacity(c->doq_socket->blocked_pkt))
+ return; /* impossibly large, drop packet. impossible because
+ pkt_buf and blocked_pkt are the same size. */
+ c->doq_socket->have_blocked_pkt = 1;
+ c->doq_socket->blocked_pkt_pi.ecn = ecn;
+ memcpy(c->doq_socket->blocked_paddr, paddr,
+ sizeof(*c->doq_socket->blocked_paddr));
+ sldns_buffer_clear(c->doq_socket->blocked_pkt);
+ sldns_buffer_write(c->doq_socket->blocked_pkt,
+ sldns_buffer_begin(c->doq_socket->pkt_buf),
+ sldns_buffer_limit(c->doq_socket->pkt_buf));
+ sldns_buffer_flip(c->doq_socket->blocked_pkt);
+}
+
+void
+doq_send_pkt(struct comm_point* c, struct doq_pkt_addr* paddr, uint32_t ecn)
+{
+ struct msghdr msg;
+ struct iovec iov[1];
+ union {
+ struct cmsghdr hdr;
+ char buf[256];
+ } control;
+ ssize_t ret;
+ iov[0].iov_base = sldns_buffer_begin(c->doq_socket->pkt_buf);
+ iov[0].iov_len = sldns_buffer_limit(c->doq_socket->pkt_buf);
+ memset(&msg, 0, sizeof(msg));
+ msg.msg_name = (void*)&paddr->addr;
+ msg.msg_namelen = paddr->addrlen;
+ msg.msg_iov = iov;
+ msg.msg_iovlen = 1;
+ msg.msg_control = control.buf;
+#ifndef S_SPLINT_S
+ msg.msg_controllen = sizeof(control.buf);
+#endif /* S_SPLINT_S */
+ msg.msg_flags = 0;
+
+ doq_set_localaddr_cmsg(&msg, sizeof(control.buf), &paddr->localaddr,
+ paddr->localaddrlen, paddr->ifindex);
+ doq_set_ecn(c->fd, paddr->addr.sockaddr.in.sin_family, ecn);
+
+ for(;;) {
+ ret = sendmsg(c->fd, &msg, MSG_DONTWAIT);
+ if(ret == -1 && errno == EINTR)
+ continue;
+ break;
+ }
+ if(ret == -1) {
+#ifndef USE_WINSOCK
+ if(errno == EAGAIN ||
+# ifdef EWOULDBLOCK
+ errno == EWOULDBLOCK ||
+# endif
+ errno == ENOBUFS)
+#else
+ if(WSAGetLastError() == WSAEINPROGRESS ||
+ WSAGetLastError() == WSAENOBUFS ||
+ WSAGetLastError() == WSAEWOULDBLOCK)
+#endif
+ {
+ /* udp send has blocked */
+ doq_store_blocked_pkt(c, paddr, ecn);
+ return;
+ }
+ if(!udp_send_errno_needs_log((void*)&paddr->addr,
+ paddr->addrlen))
+ return;
+ if(verbosity >= VERB_OPS) {
+ char host[256], port[32];
+ if(doq_print_addr_port(&paddr->addr, paddr->addrlen,
+ host, sizeof(host), port, sizeof(port))) {
+ verbose(VERB_OPS, "doq sendmsg to %s %s "
+ "failed: %s", host, port,
+ strerror(errno));
+ } else {
+ verbose(VERB_OPS, "doq sendmsg failed: %s",
+ strerror(errno));
+ }
+ }
+ return;
+ } else if(ret != (ssize_t)sldns_buffer_limit(c->doq_socket->pkt_buf)) {
+ char host[256], port[32];
+ if(doq_print_addr_port(&paddr->addr, paddr->addrlen, host,
+ sizeof(host), port, sizeof(port))) {
+ log_err("doq sendmsg to %s %s failed: "
+ "sent %d in place of %d bytes",
+ host, port, (int)ret,
+ (int)sldns_buffer_limit(c->doq_socket->pkt_buf));
+ } else {
+ log_err("doq sendmsg failed: "
+ "sent %d in place of %d bytes",
+ (int)ret, (int)sldns_buffer_limit(c->doq_socket->pkt_buf));
+ }
+ return;
+ }
+}
+
+/** fetch port number */
+static int
+doq_sockaddr_get_port(struct doq_addr_storage* addr)
+{
+ if(addr->sockaddr.in.sin_family == AF_INET) {
+ struct sockaddr_in* sa = (struct sockaddr_in*)addr;
+ return ntohs(sa->sin_port);
+ } else if(addr->sockaddr.in.sin_family == AF_INET6) {
+ struct sockaddr_in6* sa6 = (struct sockaddr_in6*)addr;
+ return ntohs(sa6->sin6_port);
+ }
+ return 0;
+}
+
+/** get local address from ancillary data headers */
+static int
+doq_get_localaddr_cmsg(struct comm_point* c, struct doq_pkt_addr* paddr,
+ int* pkt_continue, struct msghdr* msg)
+{
+#ifndef S_SPLINT_S
+ struct cmsghdr* cmsg;
+#endif /* S_SPLINT_S */
+
+ memset(&paddr->localaddr, 0, sizeof(paddr->localaddr));
+#ifndef S_SPLINT_S
+ for(cmsg = CMSG_FIRSTHDR(msg); cmsg != NULL;
+ cmsg = CMSG_NXTHDR(msg, cmsg)) {
+ if( cmsg->cmsg_level == IPPROTO_IPV6 &&
+ cmsg->cmsg_type == IPV6_PKTINFO) {
+ struct in6_pktinfo* v6info =
+ (struct in6_pktinfo*)CMSG_DATA(cmsg);
+ struct sockaddr_in6* sa= (struct sockaddr_in6*)
+ &paddr->localaddr;
+ struct sockaddr_in6* rema = (struct sockaddr_in6*)
+ &paddr->addr;
+ if(rema->sin6_family != AF_INET6) {
+ log_err("doq cmsg family mismatch cmsg is ip6");
+ *pkt_continue = 1;
+ return 0;
+ }
+ sa->sin6_family = AF_INET6;
+ sa->sin6_port = htons(doq_sockaddr_get_port(
+ (void*)c->socket->addr));
+ paddr->ifindex = v6info->ipi6_ifindex;
+ memmove(&sa->sin6_addr, &v6info->ipi6_addr,
+ sizeof(struct in6_addr));
+ paddr->localaddrlen = sizeof(struct sockaddr_in6);
+ break;
+#ifdef IP_PKTINFO
+ } else if( cmsg->cmsg_level == IPPROTO_IP &&
+ cmsg->cmsg_type == IP_PKTINFO) {
+ struct in_pktinfo* v4info =
+ (struct in_pktinfo*)CMSG_DATA(cmsg);
+ struct sockaddr_in* sa= (struct sockaddr_in*)
+ &paddr->localaddr;
+ struct sockaddr_in* rema = (struct sockaddr_in*)
+ &paddr->addr;
+ if(rema->sin_family != AF_INET) {
+ log_err("doq cmsg family mismatch cmsg is ip4");
+ *pkt_continue = 1;
+ return 0;
+ }
+ sa->sin_family = AF_INET;
+ sa->sin_port = htons(doq_sockaddr_get_port(
+ (void*)c->socket->addr));
+ paddr->ifindex = v4info->ipi_ifindex;
+ memmove(&sa->sin_addr, &v4info->ipi_addr,
+ sizeof(struct in_addr));
+ paddr->localaddrlen = sizeof(struct sockaddr_in);
+ break;
+#elif defined(IP_RECVDSTADDR)
+ } else if( cmsg->cmsg_level == IPPROTO_IP &&
+ cmsg->cmsg_type == IP_RECVDSTADDR) {
+ struct sockaddr_in* sa= (struct sockaddr_in*)
+ &paddr->localaddr;
+ struct sockaddr_in* rema = (struct sockaddr_in*)
+ &paddr->addr;
+ if(rema->sin_family != AF_INET) {
+ log_err("doq cmsg family mismatch cmsg is ip4");
+ *pkt_continue = 1;
+ return 0;
+ }
+ sa->sin_family = AF_INET;
+ sa->sin_port = htons(doq_sockaddr_get_port(
+ (void*)c->socket->addr));
+ paddr->ifindex = 0;
+ memmove(&sa.sin_addr, CMSG_DATA(cmsg),
+ sizeof(struct in_addr));
+ paddr->localaddrlen = sizeof(struct sockaddr_in);
+ break;
+#endif /* IP_PKTINFO or IP_RECVDSTADDR */
+ }
+ }
+#endif /* S_SPLINT_S */
+
+return 1;
+}
+
+/** get packet ecn information */
+static uint32_t
+msghdr_get_ecn(struct msghdr* msg, int family)
+{
+#ifndef S_SPLINT_S
+ struct cmsghdr* cmsg;
+ if(family == AF_INET6) {
+ for(cmsg = CMSG_FIRSTHDR(msg); cmsg != NULL;
+ cmsg = CMSG_NXTHDR(msg, cmsg)) {
+ if(cmsg->cmsg_level == IPPROTO_IPV6 &&
+ cmsg->cmsg_type == IPV6_TCLASS &&
+ cmsg->cmsg_len != 0) {
+ uint8_t* ecn = (uint8_t*)CMSG_DATA(cmsg);
+ return *ecn;
+ }
+ }
+ return 0;
+ }
+ for(cmsg = CMSG_FIRSTHDR(msg); cmsg != NULL;
+ cmsg = CMSG_NXTHDR(msg, cmsg)) {
+ if(cmsg->cmsg_level == IPPROTO_IP &&
+ cmsg->cmsg_type == IP_TOS &&
+ cmsg->cmsg_len != 0) {
+ uint8_t* ecn = (uint8_t*)CMSG_DATA(cmsg);
+ return *ecn;
+ }
+ }
+#endif /* S_SPLINT_S */
+ return 0;
+}
+
+/** receive packet for DoQ on UDP. get ancillary data for addresses,
+ * return false if failed and the callback can stop receiving UDP packets
+ * if pkt_continue is false. */
+static int
+doq_recv(struct comm_point* c, struct doq_pkt_addr* paddr, int* pkt_continue,
+ struct ngtcp2_pkt_info* pi)
+{
+ struct msghdr msg;
+ struct iovec iov[1];
+ ssize_t rcv;
+ union {
+ struct cmsghdr hdr;
+ char buf[256];
+ } ancil;
+
+ msg.msg_name = &paddr->addr;
+ msg.msg_namelen = (socklen_t)sizeof(paddr->addr);
+ iov[0].iov_base = sldns_buffer_begin(c->doq_socket->pkt_buf);
+ iov[0].iov_len = sldns_buffer_remaining(c->doq_socket->pkt_buf);
+ msg.msg_iov = iov;
+ msg.msg_iovlen = 1;
+ msg.msg_control = ancil.buf;
+#ifndef S_SPLINT_S
+ msg.msg_controllen = sizeof(ancil.buf);
+#endif /* S_SPLINT_S */
+ msg.msg_flags = 0;
+
+ rcv = recvmsg(c->fd, &msg, MSG_DONTWAIT);
+ if(rcv == -1) {
+ if(errno != EAGAIN && errno != EINTR
+ && udp_recv_needs_log(errno)) {
+ log_err("recvmsg failed for doq: %s", strerror(errno));
+ }
+ *pkt_continue = 0;
+ return 0;
+ }
+
+ paddr->addrlen = msg.msg_namelen;
+ sldns_buffer_skip(c->doq_socket->pkt_buf, rcv);
+ sldns_buffer_flip(c->doq_socket->pkt_buf);
+ if(!doq_get_localaddr_cmsg(c, paddr, pkt_continue, &msg))
+ return 0;
+ pi->ecn = msghdr_get_ecn(&msg, paddr->addr.sockaddr.in.sin_family);
+ return 1;
+}
+
+/** send the version negotiation for doq. scid and dcid are flipped around
+ * to send back to the client. */
+static void
+doq_send_version_negotiation(struct comm_point* c, struct doq_pkt_addr* paddr,
+ const uint8_t* dcid, size_t dcidlen, const uint8_t* scid,
+ size_t scidlen)
+{
+ uint32_t versions[2];
+ size_t versions_len = 0;
+ ngtcp2_ssize ret;
+ uint8_t unused_random;
+
+ /* fill the array with supported versions */
+ versions[0] = NGTCP2_PROTO_VER_V1;
+ versions_len = 1;
+ unused_random = ub_random_max(c->doq_socket->rnd, 256);
+ sldns_buffer_clear(c->doq_socket->pkt_buf);
+ ret = ngtcp2_pkt_write_version_negotiation(
+ sldns_buffer_begin(c->doq_socket->pkt_buf),
+ sldns_buffer_capacity(c->doq_socket->pkt_buf), unused_random,
+ dcid, dcidlen, scid, scidlen, versions, versions_len);
+ if(ret < 0) {
+ log_err("ngtcp2_pkt_write_version_negotiation failed: %s",
+ ngtcp2_strerror(ret));
+ return;
+ }
+ sldns_buffer_set_position(c->doq_socket->pkt_buf, ret);
+ sldns_buffer_flip(c->doq_socket->pkt_buf);
+ doq_send_pkt(c, paddr, 0);
+}
+
+/** Find the doq_conn object by remote address and dcid */
+static struct doq_conn*
+doq_conn_find(struct doq_table* table, struct doq_addr_storage* addr,
+ socklen_t addrlen, struct doq_addr_storage* localaddr,
+ socklen_t localaddrlen, int ifindex, const uint8_t* dcid,
+ size_t dcidlen)
+{
+ struct rbnode_type* node;
+ struct doq_conn key;
+ memset(&key.node, 0, sizeof(key.node));
+ key.node.key = &key;
+ memmove(&key.key.paddr.addr, addr, addrlen);
+ key.key.paddr.addrlen = addrlen;
+ memmove(&key.key.paddr.localaddr, localaddr, localaddrlen);
+ key.key.paddr.localaddrlen = localaddrlen;
+ key.key.paddr.ifindex = ifindex;
+ key.key.dcid = (void*)dcid;
+ key.key.dcidlen = dcidlen;
+ node = rbtree_search(table->conn_tree, &key);
+ if(node)
+ return (struct doq_conn*)node->key;
+ return NULL;
+}
+
+/** find the doq_con by the connection id */
+static struct doq_conn*
+doq_conn_find_by_id(struct doq_table* table, const uint8_t* dcid,
+ size_t dcidlen)
+{
+ struct doq_conid* conid;
+ lock_rw_rdlock(&table->conid_lock);
+ conid = doq_conid_find(table, dcid, dcidlen);
+ if(conid) {
+ /* make a copy of the key */
+ struct doq_conn* conn;
+ struct doq_conn_key key = conid->key;
+ uint8_t cid[NGTCP2_MAX_CIDLEN];
+ log_assert(conid->key.dcidlen <= NGTCP2_MAX_CIDLEN);
+ memcpy(cid, conid->key.dcid, conid->key.dcidlen);
+ key.dcid = cid;
+ lock_rw_unlock(&table->conid_lock);
+
+ /* now that the conid lock is released, look up the conn */
+ lock_rw_rdlock(&table->lock);
+ conn = doq_conn_find(table, &key.paddr.addr,
+ key.paddr.addrlen, &key.paddr.localaddr,
+ key.paddr.localaddrlen, key.paddr.ifindex, key.dcid,
+ key.dcidlen);
+ if(!conn) {
+ /* The connection got deleted between the conid lookup
+ * and the connection lock grab, it no longer exists,
+ * so return null. */
+ lock_rw_unlock(&table->lock);
+ return NULL;
+ }
+ lock_basic_lock(&conn->lock);
+ if(conn->is_deleted) {
+ lock_rw_unlock(&table->lock);
+ lock_basic_unlock(&conn->lock);
+ return NULL;
+ }
+ lock_rw_unlock(&table->lock);
+ return conn;
+ }
+ lock_rw_unlock(&table->conid_lock);
+ return NULL;
+}
+
+/** Find the doq_conn, by addr or by connection id */
+static struct doq_conn*
+doq_conn_find_by_addr_or_cid(struct doq_table* table,
+ struct doq_pkt_addr* paddr, const uint8_t* dcid, size_t dcidlen)
+{
+ struct doq_conn* conn;
+ lock_rw_rdlock(&table->lock);
+ conn = doq_conn_find(table, &paddr->addr, paddr->addrlen,
+ &paddr->localaddr, paddr->localaddrlen, paddr->ifindex,
+ dcid, dcidlen);
+ if(conn && conn->is_deleted) {
+ conn = NULL;
+ }
+ if(conn) {
+ lock_basic_lock(&conn->lock);
+ lock_rw_unlock(&table->lock);
+ verbose(VERB_ALGO, "doq: found connection by address, dcid");
+ } else {
+ lock_rw_unlock(&table->lock);
+ conn = doq_conn_find_by_id(table, dcid, dcidlen);
+ if(conn) {
+ verbose(VERB_ALGO, "doq: found connection by dcid");
+ }
+ }
+ return conn;
+}
+
+/** decode doq packet header, false on handled or failure, true to continue
+ * to process the packet */
+static int
+doq_decode_pkt_header_negotiate(struct comm_point* c,
+ struct doq_pkt_addr* paddr, struct doq_conn** conn)
+{
+#ifdef HAVE_STRUCT_NGTCP2_VERSION_CID
+ struct ngtcp2_version_cid vc;
+#else
+ uint32_t version;
+ const uint8_t *dcid, *scid;
+ size_t dcidlen, scidlen;
+#endif
+ int rv;
+
+#ifdef HAVE_STRUCT_NGTCP2_VERSION_CID
+ rv = ngtcp2_pkt_decode_version_cid(&vc,
+ sldns_buffer_begin(c->doq_socket->pkt_buf),
+ sldns_buffer_limit(c->doq_socket->pkt_buf),
+ c->doq_socket->sv_scidlen);
+#else
+ rv = ngtcp2_pkt_decode_version_cid(&version, &dcid, &dcidlen,
+ &scid, &scidlen, sldns_buffer_begin(c->doq_socket->pkt_buf),
+ sldns_buffer_limit(c->doq_socket->pkt_buf), c->doq_socket->sv_scidlen);
+#endif
+ if(rv != 0) {
+ if(rv == NGTCP2_ERR_VERSION_NEGOTIATION) {
+ /* send the version negotiation */
+ doq_send_version_negotiation(c, paddr,
+#ifdef HAVE_STRUCT_NGTCP2_VERSION_CID
+ vc.scid, vc.scidlen, vc.dcid, vc.dcidlen
+#else
+ scid, scidlen, dcid, dcidlen
+#endif
+ );
+ return 0;
+ }
+ verbose(VERB_ALGO, "doq: could not decode version "
+ "and CID from QUIC packet header: %s",
+ ngtcp2_strerror(rv));
+ return 0;
+ }
+
+ if(verbosity >= VERB_ALGO) {
+ verbose(VERB_ALGO, "ngtcp2_pkt_decode_version_cid packet has "
+ "QUIC protocol version %u", (unsigned)
+#ifdef HAVE_STRUCT_NGTCP2_VERSION_CID
+ vc.
+#endif
+ version
+ );
+ log_hex("dcid",
+#ifdef HAVE_STRUCT_NGTCP2_VERSION_CID
+ (void*)vc.dcid, vc.dcidlen
+#else
+ (void*)dcid, dcidlen
+#endif
+ );
+ log_hex("scid",
+#ifdef HAVE_STRUCT_NGTCP2_VERSION_CID
+ (void*)vc.scid, vc.scidlen
+#else
+ (void*)scid, scidlen
+#endif
+ );
+ }
+ *conn = doq_conn_find_by_addr_or_cid(c->doq_socket->table, paddr,
+#ifdef HAVE_STRUCT_NGTCP2_VERSION_CID
+ vc.dcid, vc.dcidlen
+#else
+ dcid, dcidlen
+#endif
+ );
+ if(*conn)
+ (*conn)->doq_socket = c->doq_socket;
+ return 1;
+}
+
+/** fill cid structure with random data */
+static void doq_cid_randfill(struct ngtcp2_cid* cid, size_t datalen,
+ struct ub_randstate* rnd)
+{
+ uint8_t buf[32];
+ if(datalen > sizeof(buf))
+ datalen = sizeof(buf);
+ doq_fill_rand(rnd, buf, datalen);
+ ngtcp2_cid_init(cid, buf, datalen);
+}
+
+/** send retry packet for doq connection. */
+static void
+doq_send_retry(struct comm_point* c, struct doq_pkt_addr* paddr,
+ struct ngtcp2_pkt_hd* hd)
+{
+ char host[256], port[32];
+ struct ngtcp2_cid scid;
+ uint8_t token[NGTCP2_CRYPTO_MAX_RETRY_TOKENLEN];
+ ngtcp2_tstamp ts;
+ ngtcp2_ssize tokenlen, ret;
+
+ if(!doq_print_addr_port(&paddr->addr, paddr->addrlen, host,
+ sizeof(host), port, sizeof(port))) {
+ log_err("doq_send_retry failed");
+ return;
+ }
+ verbose(VERB_ALGO, "doq: sending retry packet to %s %s", host, port);
+
+ /* the server chosen source connection ID */
+ scid.datalen = c->doq_socket->sv_scidlen;
+ doq_cid_randfill(&scid, scid.datalen, c->doq_socket->rnd);
+
+ ts = doq_get_timestamp_nanosec();
+
+ tokenlen = ngtcp2_crypto_generate_retry_token(token,
+ c->doq_socket->static_secret, c->doq_socket->static_secret_len,
+ hd->version, (void*)&paddr->addr, paddr->addrlen, &scid,
+ &hd->dcid, ts);
+ if(tokenlen < 0) {
+ log_err("ngtcp2_crypto_generate_retry_token failed: %s",
+ ngtcp2_strerror(tokenlen));
+ return;
+ }
+
+ sldns_buffer_clear(c->doq_socket->pkt_buf);
+ ret = ngtcp2_crypto_write_retry(sldns_buffer_begin(c->doq_socket->pkt_buf),
+ sldns_buffer_capacity(c->doq_socket->pkt_buf), hd->version,
+ &hd->scid, &scid, &hd->dcid, token, tokenlen);
+ if(ret < 0) {
+ log_err("ngtcp2_crypto_write_retry failed: %s",
+ ngtcp2_strerror(ret));
+ return;
+ }
+ sldns_buffer_set_position(c->doq_socket->pkt_buf, ret);
+ sldns_buffer_flip(c->doq_socket->pkt_buf);
+ doq_send_pkt(c, paddr, 0);
+}
+
+/** doq send stateless connection close */
+static void
+doq_send_stateless_connection_close(struct comm_point* c,
+ struct doq_pkt_addr* paddr, struct ngtcp2_pkt_hd* hd,
+ uint64_t error_code)
+{
+ ngtcp2_ssize ret;
+ sldns_buffer_clear(c->doq_socket->pkt_buf);
+ ret = ngtcp2_crypto_write_connection_close(
+ sldns_buffer_begin(c->doq_socket->pkt_buf),
+ sldns_buffer_capacity(c->doq_socket->pkt_buf), hd->version, &hd->scid,
+ &hd->dcid, error_code, NULL, 0);
+ if(ret < 0) {
+ log_err("ngtcp2_crypto_write_connection_close failed: %s",
+ ngtcp2_strerror(ret));
+ return;
+ }
+ sldns_buffer_set_position(c->doq_socket->pkt_buf, ret);
+ sldns_buffer_flip(c->doq_socket->pkt_buf);
+ doq_send_pkt(c, paddr, 0);
+}
+
+/** doq verify retry token, false on failure */
+static int
+doq_verify_retry_token(struct comm_point* c, struct doq_pkt_addr* paddr,
+ struct ngtcp2_cid* ocid, struct ngtcp2_pkt_hd* hd)
+{
+ char host[256], port[32];
+ ngtcp2_tstamp ts;
+ if(!doq_print_addr_port(&paddr->addr, paddr->addrlen, host,
+ sizeof(host), port, sizeof(port))) {
+ log_err("doq_verify_retry_token failed");
+ return 0;
+ }
+ ts = doq_get_timestamp_nanosec();
+ verbose(VERB_ALGO, "doq: verifying retry token from %s %s", host,
+ port);
+ if(ngtcp2_crypto_verify_retry_token(ocid,
+#ifdef HAVE_STRUCT_NGTCP2_PKT_HD_TOKENLEN
+ hd->token, hd->tokenlen,
+#else
+ hd->token.base, hd->token.len,
+#endif
+ c->doq_socket->static_secret,
+ c->doq_socket->static_secret_len, hd->version,
+ (void*)&paddr->addr, paddr->addrlen, &hd->dcid,
+ 10*NGTCP2_SECONDS, ts) != 0) {
+ verbose(VERB_ALGO, "doq: could not verify retry token "
+ "from %s %s", host, port);
+ return 0;
+ }
+ verbose(VERB_ALGO, "doq: verified retry token from %s %s", host, port);
+ return 1;
+}
+
+/** doq verify token, false on failure */
+static int
+doq_verify_token(struct comm_point* c, struct doq_pkt_addr* paddr,
+ struct ngtcp2_pkt_hd* hd)
+{
+ char host[256], port[32];
+ ngtcp2_tstamp ts;
+ if(!doq_print_addr_port(&paddr->addr, paddr->addrlen, host,
+ sizeof(host), port, sizeof(port))) {
+ log_err("doq_verify_token failed");
+ return 0;
+ }
+ ts = doq_get_timestamp_nanosec();
+ verbose(VERB_ALGO, "doq: verifying token from %s %s", host, port);
+ if(ngtcp2_crypto_verify_regular_token(
+#ifdef HAVE_STRUCT_NGTCP2_PKT_HD_TOKENLEN
+ hd->token, hd->tokenlen,
+#else
+ hd->token.base, hd->token.len,
+#endif
+ c->doq_socket->static_secret, c->doq_socket->static_secret_len,
+ (void*)&paddr->addr, paddr->addrlen, 3600*NGTCP2_SECONDS,
+ ts) != 0) {
+ verbose(VERB_ALGO, "doq: could not verify token from %s %s",
+ host, port);
+ return 0;
+ }
+ verbose(VERB_ALGO, "doq: verified token from %s %s", host, port);
+ return 1;
+}
+
+/** delete and remove from the lookup tree the doq_conn connection */
+static void
+doq_delete_connection(struct comm_point* c, struct doq_conn* conn)
+{
+ struct doq_conn copy;
+ uint8_t cid[NGTCP2_MAX_CIDLEN];
+ rbnode_type* node;
+ if(!conn)
+ return;
+ /* Copy the key and set it deleted. */
+ conn->is_deleted = 1;
+ doq_conn_write_disable(conn);
+ copy.key = conn->key;
+ log_assert(conn->key.dcidlen <= NGTCP2_MAX_CIDLEN);
+ memcpy(cid, conn->key.dcid, conn->key.dcidlen);
+ copy.key.dcid = cid;
+ copy.node.key = &copy;
+ lock_basic_unlock(&conn->lock);
+
+ /* Now get the table lock to delete it from the tree */
+ lock_rw_wrlock(&c->doq_socket->table->lock);
+ node = rbtree_delete(c->doq_socket->table->conn_tree, copy.node.key);
+ if(node) {
+ conn = (struct doq_conn*)node->key;
+ lock_basic_lock(&conn->lock);
+ doq_conn_write_list_remove(c->doq_socket->table, conn);
+ if(conn->timer.timer_in_list) {
+ /* Remove timer from list first, because finding the
+ * rbnode element of the setlist of same timeouts
+ * needs tree lookup. Edit the tree structure after
+ * that lookup. */
+ doq_timer_list_remove(c->doq_socket->table,
+ &conn->timer);
+ }
+ if(conn->timer.timer_in_tree)
+ doq_timer_tree_remove(c->doq_socket->table,
+ &conn->timer);
+ }
+ lock_rw_unlock(&c->doq_socket->table->lock);
+ if(node) {
+ lock_basic_unlock(&conn->lock);
+ doq_table_quic_size_subtract(c->doq_socket->table,
+ sizeof(*conn)+conn->key.dcidlen);
+ doq_conn_delete(conn, c->doq_socket->table);
+ }
+}
+
+/** create and setup a new doq connection, to a new destination, or with
+ * a new dcid. It has a new set of streams. It is inserted in the lookup tree.
+ * Returns NULL on failure. */
+static struct doq_conn*
+doq_setup_new_conn(struct comm_point* c, struct doq_pkt_addr* paddr,
+ struct ngtcp2_pkt_hd* hd, struct ngtcp2_cid* ocid)
+{
+ struct doq_conn* conn;
+ if(!doq_table_quic_size_available(c->doq_socket->table,
+ c->doq_socket->cfg, sizeof(*conn)+hd->dcid.datalen
+ + sizeof(struct doq_stream)
+ + 100 /* estimated input query */
+ + 1200 /* estimated output query */)) {
+ verbose(VERB_ALGO, "doq: no mem available for new connection");
+ doq_send_stateless_connection_close(c, paddr, hd,
+ NGTCP2_CONNECTION_REFUSED);
+ return NULL;
+ }
+ conn = doq_conn_create(c, paddr, hd->dcid.data, hd->dcid.datalen,
+ hd->version);
+ if(!conn) {
+ log_err("doq: could not allocate doq_conn");
+ return NULL;
+ }
+ lock_rw_wrlock(&c->doq_socket->table->lock);
+ lock_basic_lock(&conn->lock);
+ if(!rbtree_insert(c->doq_socket->table->conn_tree, &conn->node)) {
+ lock_rw_unlock(&c->doq_socket->table->lock);
+ log_err("doq: duplicate connection");
+ /* conn has no entry in writelist, and no timer yet. */
+ lock_basic_unlock(&conn->lock);
+ doq_conn_delete(conn, c->doq_socket->table);
+ return NULL;
+ }
+ lock_rw_unlock(&c->doq_socket->table->lock);
+ doq_table_quic_size_add(c->doq_socket->table,
+ sizeof(*conn)+conn->key.dcidlen);
+ verbose(VERB_ALGO, "doq: created new connection");
+
+ /* the scid and dcid switch meaning from the accepted client
+ * connection to the server connection. The 'source' and 'destination'
+ * meaning is reversed. */
+ if(!doq_conn_setup(conn, hd->scid.data, hd->scid.datalen,
+ (ocid?ocid->data:NULL), (ocid?ocid->datalen:0),
+#ifdef HAVE_STRUCT_NGTCP2_PKT_HD_TOKENLEN
+ hd->token, hd->tokenlen
+#else
+ hd->token.base, hd->token.len
+#endif
+ )) {
+ log_err("doq: could not set up connection");
+ doq_delete_connection(c, conn);
+ return NULL;
+ }
+ return conn;
+}
+
+/** perform doq address validation */
+static int
+doq_address_validation(struct comm_point* c, struct doq_pkt_addr* paddr,
+ struct ngtcp2_pkt_hd* hd, struct ngtcp2_cid* ocid,
+ struct ngtcp2_cid** pocid)
+{
+#ifdef HAVE_STRUCT_NGTCP2_PKT_HD_TOKENLEN
+ const uint8_t* token = hd->token;
+ size_t tokenlen = hd->tokenlen;
+#else
+ const uint8_t* token = hd->token.base;
+ size_t tokenlen = hd->token.len;
+#endif
+ verbose(VERB_ALGO, "doq stateless address validation");
+
+ if(tokenlen == 0 || token == NULL) {
+ doq_send_retry(c, paddr, hd);
+ return 0;
+ }
+ if(token[0] != NGTCP2_CRYPTO_TOKEN_MAGIC_RETRY &&
+ hd->dcid.datalen < NGTCP2_MIN_INITIAL_DCIDLEN) {
+ doq_send_stateless_connection_close(c, paddr, hd,
+ NGTCP2_INVALID_TOKEN);
+ return 0;
+ }
+ if(token[0] == NGTCP2_CRYPTO_TOKEN_MAGIC_RETRY) {
+ if(!doq_verify_retry_token(c, paddr, ocid, hd)) {
+ doq_send_stateless_connection_close(c, paddr, hd,
+ NGTCP2_INVALID_TOKEN);
+ return 0;
+ }
+ *pocid = ocid;
+ } else if(token[0] == NGTCP2_CRYPTO_TOKEN_MAGIC_REGULAR) {
+ if(!doq_verify_token(c, paddr, hd)) {
+ doq_send_retry(c, paddr, hd);
+ return 0;
+ }
+#ifdef HAVE_STRUCT_NGTCP2_PKT_HD_TOKENLEN
+ hd->token = NULL;
+ hd->tokenlen = 0;
+#else
+ hd->token.base = NULL;
+ hd->token.len = 0;
+#endif
+ } else {
+ verbose(VERB_ALGO, "doq address validation: unrecognised "
+ "token in hd.token.base with magic byte 0x%2.2x",
+ (int)token[0]);
+ if(c->doq_socket->validate_addr) {
+ doq_send_retry(c, paddr, hd);
+ return 0;
+ }
+#ifdef HAVE_STRUCT_NGTCP2_PKT_HD_TOKENLEN
+ hd->token = NULL;
+ hd->tokenlen = 0;
+#else
+ hd->token.base = NULL;
+ hd->token.len = 0;
+#endif
+ }
+ return 1;
+}
+
+/** the doq accept, returns false if no further processing of content */
+static int
+doq_accept(struct comm_point* c, struct doq_pkt_addr* paddr,
+ struct doq_conn** conn, struct ngtcp2_pkt_info* pi)
+{
+ int rv;
+ struct ngtcp2_pkt_hd hd;
+ struct ngtcp2_cid ocid, *pocid=NULL;
+ int err_retry;
+ memset(&hd, 0, sizeof(hd));
+ rv = ngtcp2_accept(&hd, sldns_buffer_begin(c->doq_socket->pkt_buf),
+ sldns_buffer_limit(c->doq_socket->pkt_buf));
+ if(rv != 0) {
+ if(rv == NGTCP2_ERR_RETRY) {
+ doq_send_retry(c, paddr, &hd);
+ return 0;
+ }
+ log_err("doq: initial packet failed, ngtcp2_accept failed: %s",
+ ngtcp2_strerror(rv));
+ return 0;
+ }
+ if(c->doq_socket->validate_addr ||
+#ifdef HAVE_STRUCT_NGTCP2_PKT_HD_TOKENLEN
+ hd.tokenlen
+#else
+ hd.token.len
+#endif
+ ) {
+ if(!doq_address_validation(c, paddr, &hd, &ocid, &pocid))
+ return 0;
+ }
+ *conn = doq_setup_new_conn(c, paddr, &hd, pocid);
+ if(!*conn)
+ return 0;
+ (*conn)->doq_socket = c->doq_socket;
+ if(!doq_conn_recv(c, paddr, *conn, pi, &err_retry, NULL)) {
+ if(err_retry)
+ doq_send_retry(c, paddr, &hd);
+ doq_delete_connection(c, *conn);
+ *conn = NULL;
+ return 0;
+ }
+ return 1;
+}
+
+/** doq pickup a timer to wait for for the worker. If any timer exists. */
+static void
+doq_pickup_timer(struct comm_point* c)
+{
+ struct doq_timer* t;
+ struct timeval tv;
+ int have_time = 0;
+ memset(&tv, 0, sizeof(tv));
+
+ lock_rw_wrlock(&c->doq_socket->table->lock);
+ RBTREE_FOR(t, struct doq_timer*, c->doq_socket->table->timer_tree) {
+ if(t->worker_doq_socket == NULL ||
+ t->worker_doq_socket == c->doq_socket) {
+ /* pick up this element */
+ t->worker_doq_socket = c->doq_socket;
+ have_time = 1;
+ memcpy(&tv, &t->time, sizeof(tv));
+ break;
+ }
+ }
+ lock_rw_unlock(&c->doq_socket->table->lock);
+
+ if(have_time) {
+ struct timeval rel;
+ timeval_subtract(&rel, &tv, c->doq_socket->now_tv);
+ comm_timer_set(c->doq_socket->timer, &rel);
+ memcpy(&c->doq_socket->marked_time, &tv,
+ sizeof(c->doq_socket->marked_time));
+ verbose(VERB_ALGO, "doq pickup timer at %d.%6.6d in %d.%6.6d",
+ (int)tv.tv_sec, (int)tv.tv_usec, (int)rel.tv_sec,
+ (int)rel.tv_usec);
+ } else {
+ if(comm_timer_is_set(c->doq_socket->timer))
+ comm_timer_disable(c->doq_socket->timer);
+ memset(&c->doq_socket->marked_time, 0,
+ sizeof(c->doq_socket->marked_time));
+ verbose(VERB_ALGO, "doq timer disabled");
+ }
+}
+
+/** doq done with connection, release locks and setup timer and write */
+static void
+doq_done_setup_timer_and_write(struct comm_point* c, struct doq_conn* conn)
+{
+ struct doq_conn copy;
+ uint8_t cid[NGTCP2_MAX_CIDLEN];
+ rbnode_type* node;
+ struct timeval new_tv;
+ int write_change = 0, timer_change = 0;
+
+ /* No longer in callbacks, so the pointer to doq_socket is back
+ * to NULL. */
+ conn->doq_socket = NULL;
+
+ if(doq_conn_check_timer(conn, &new_tv))
+ timer_change = 1;
+ if( (conn->write_interest && !conn->on_write_list) ||
+ (!conn->write_interest && conn->on_write_list))
+ write_change = 1;
+
+ if(!timer_change && !write_change) {
+ /* Nothing to do. */
+ lock_basic_unlock(&conn->lock);
+ return;
+ }
+
+ /* The table lock is needed to change the write list and timer tree.
+ * So the connection lock is release and then the connection is
+ * looked up again. */
+ copy.key = conn->key;
+ log_assert(conn->key.dcidlen <= NGTCP2_MAX_CIDLEN);
+ memcpy(cid, conn->key.dcid, conn->key.dcidlen);
+ copy.key.dcid = cid;
+ copy.node.key = &copy;
+ lock_basic_unlock(&conn->lock);
+
+ lock_rw_wrlock(&c->doq_socket->table->lock);
+ node = rbtree_search(c->doq_socket->table->conn_tree, copy.node.key);
+ if(!node) {
+ lock_rw_unlock(&c->doq_socket->table->lock);
+ /* Must have been deleted in the mean time. */
+ return;
+ }
+ conn = (struct doq_conn*)node->key;
+ lock_basic_lock(&conn->lock);
+ if(conn->is_deleted) {
+ /* It is deleted now. */
+ lock_rw_unlock(&c->doq_socket->table->lock);
+ lock_basic_unlock(&conn->lock);
+ return;
+ }
+
+ if(write_change) {
+ /* Edit the write lists, we are holding the table.lock and can
+ * edit the list first,last and also prev,next and on_list
+ * elements in the doq_conn structures. */
+ doq_conn_set_write_list(c->doq_socket->table, conn);
+ }
+ if(timer_change) {
+ doq_timer_set(c->doq_socket->table, &conn->timer,
+ c->doq_socket, &new_tv);
+ }
+ lock_rw_unlock(&c->doq_socket->table->lock);
+ lock_basic_unlock(&conn->lock);
+}
+
+/** doq done with connection callbacks, release locks and setup write */
+static void
+doq_done_with_conn_cb(struct comm_point* c, struct doq_conn* conn)
+{
+ struct doq_conn copy;
+ uint8_t cid[NGTCP2_MAX_CIDLEN];
+ rbnode_type* node;
+
+ /* no longer in callbacks, so the pointer to doq_socket is back
+ * to NULL. */
+ conn->doq_socket = NULL;
+
+ if( (conn->write_interest && conn->on_write_list) ||
+ (!conn->write_interest && !conn->on_write_list)) {
+ /* The connection already has the required write list
+ * status. */
+ lock_basic_unlock(&conn->lock);
+ return;
+ }
+
+ /* To edit the write list of connections we have to hold the table
+ * lock, so we release the connection and then look it up again. */
+ copy.key = conn->key;
+ log_assert(conn->key.dcidlen <= NGTCP2_MAX_CIDLEN);
+ memcpy(cid, conn->key.dcid, conn->key.dcidlen);
+ copy.key.dcid = cid;
+ copy.node.key = &copy;
+ lock_basic_unlock(&conn->lock);
+
+ lock_rw_wrlock(&c->doq_socket->table->lock);
+ node = rbtree_search(c->doq_socket->table->conn_tree, copy.node.key);
+ if(!node) {
+ lock_rw_unlock(&c->doq_socket->table->lock);
+ /* must have been deleted in the mean time */
+ return;
+ }
+ conn = (struct doq_conn*)node->key;
+ lock_basic_lock(&conn->lock);
+ if(conn->is_deleted) {
+ /* it is deleted now. */
+ lock_rw_unlock(&c->doq_socket->table->lock);
+ lock_basic_unlock(&conn->lock);
+ return;
+ }
+
+ /* edit the write lists, we are holding the table.lock and can
+ * edit the list first,last and also prev,next and on_list elements
+ * in the doq_conn structures. */
+ doq_conn_set_write_list(c->doq_socket->table, conn);
+ lock_rw_unlock(&c->doq_socket->table->lock);
+ lock_basic_unlock(&conn->lock);
+}
+
+/** doq count the length of the write list */
+static size_t
+doq_write_list_length(struct comm_point* c)
+{
+ size_t count = 0;
+ struct doq_conn* conn;
+ lock_rw_rdlock(&c->doq_socket->table->lock);
+ conn = c->doq_socket->table->write_list_first;
+ while(conn) {
+ count++;
+ conn = conn->write_next;
+ }
+ lock_rw_unlock(&c->doq_socket->table->lock);
+ return count;
+}
+
+/** doq pop the first element from the write list to have write events */
+static struct doq_conn*
+doq_pop_write_conn(struct comm_point* c)
+{
+ struct doq_conn* conn;
+ lock_rw_wrlock(&c->doq_socket->table->lock);
+ conn = doq_table_pop_first(c->doq_socket->table);
+ while(conn && conn->is_deleted) {
+ lock_basic_unlock(&conn->lock);
+ conn = doq_table_pop_first(c->doq_socket->table);
+ }
+ lock_rw_unlock(&c->doq_socket->table->lock);
+ if(conn)
+ conn->doq_socket = c->doq_socket;
+ return conn;
+}
+
+/** doq the connection is done with write callbacks, release it. */
+static void
+doq_done_with_write_cb(struct comm_point* c, struct doq_conn* conn,
+ int delete_it)
+{
+ if(delete_it) {
+ doq_delete_connection(c, conn);
+ return;
+ }
+ doq_done_setup_timer_and_write(c, conn);
+}
+
+/** see if the doq socket wants to write packets */
+static int
+doq_socket_want_write(struct comm_point* c)
+{
+ int want_write = 0;
+ if(c->doq_socket->have_blocked_pkt)
+ return 1;
+ lock_rw_rdlock(&c->doq_socket->table->lock);
+ if(c->doq_socket->table->write_list_first)
+ want_write = 1;
+ lock_rw_unlock(&c->doq_socket->table->lock);
+ return want_write;
+}
+
+/** enable write event for the doq server socket fd */
+static void
+doq_socket_write_enable(struct comm_point* c)
+{
+ verbose(VERB_ALGO, "doq socket want write");
+ if(c->doq_socket->event_has_write)
+ return;
+ comm_point_listen_for_rw(c, 1, 1);
+ c->doq_socket->event_has_write = 1;
+}
+
+/** disable write event for the doq server socket fd */
+static void
+doq_socket_write_disable(struct comm_point* c)
+{
+ verbose(VERB_ALGO, "doq socket want no write");
+ if(!c->doq_socket->event_has_write)
+ return;
+ comm_point_listen_for_rw(c, 1, 0);
+ c->doq_socket->event_has_write = 0;
+}
+
+/** write blocked packet, if possible. returns false if failed, again. */
+static int
+doq_write_blocked_pkt(struct comm_point* c)
+{
+ struct doq_pkt_addr paddr;
+ if(!c->doq_socket->have_blocked_pkt)
+ return 1;
+ c->doq_socket->have_blocked_pkt = 0;
+ if(sldns_buffer_limit(c->doq_socket->blocked_pkt) >
+ sldns_buffer_remaining(c->doq_socket->pkt_buf))
+ return 1; /* impossibly large, drop it.
+ impossible since pkt_buf is same size as blocked_pkt buf. */
+ sldns_buffer_clear(c->doq_socket->pkt_buf);
+ sldns_buffer_write(c->doq_socket->pkt_buf,
+ sldns_buffer_begin(c->doq_socket->blocked_pkt),
+ sldns_buffer_limit(c->doq_socket->blocked_pkt));
+ sldns_buffer_flip(c->doq_socket->pkt_buf);
+ memcpy(&paddr, c->doq_socket->blocked_paddr, sizeof(paddr));
+ doq_send_pkt(c, &paddr, c->doq_socket->blocked_pkt_pi.ecn);
+ if(c->doq_socket->have_blocked_pkt)
+ return 0;
+ return 1;
+}
+
+/** doq find a timer that timeouted and return the conn, locked. */
+static struct doq_conn*
+doq_timer_timeout_conn(struct doq_server_socket* doq_socket)
+{
+ struct doq_conn* conn = NULL;
+ struct rbnode_type* node;
+ lock_rw_wrlock(&doq_socket->table->lock);
+ node = rbtree_first(doq_socket->table->timer_tree);
+ if(node && node != RBTREE_NULL) {
+ struct doq_timer* t = (struct doq_timer*)node;
+ conn = t->conn;
+
+ /* If now < timer then no further timeouts in tree. */
+ if(timeval_smaller(doq_socket->now_tv, &t->time)) {
+ lock_rw_unlock(&doq_socket->table->lock);
+ return NULL;
+ }
+
+ lock_basic_lock(&conn->lock);
+ conn->doq_socket = doq_socket;
+
+ /* Now that the timer is fired, remove it. */
+ doq_timer_unset(doq_socket->table, t);
+ lock_rw_unlock(&doq_socket->table->lock);
+ return conn;
+ }
+ lock_rw_unlock(&doq_socket->table->lock);
+ return NULL;
+}
+
+/** doq timer erase the marker that said which timer the worker uses. */
+static void
+doq_timer_erase_marker(struct doq_server_socket* doq_socket)
+{
+ struct doq_timer* t;
+ lock_rw_wrlock(&doq_socket->table->lock);
+ t = doq_timer_find_time(doq_socket->table, &doq_socket->marked_time);
+ if(t && t->worker_doq_socket == doq_socket)
+ t->worker_doq_socket = NULL;
+ lock_rw_unlock(&doq_socket->table->lock);
+ memset(&doq_socket->marked_time, 0, sizeof(doq_socket->marked_time));
+}
+
+void
+doq_timer_cb(void* arg)
+{
+ struct doq_server_socket* doq_socket = (struct doq_server_socket*)arg;
+ struct doq_conn* conn;
+ verbose(VERB_ALGO, "doq timer callback");
+
+ doq_timer_erase_marker(doq_socket);
+
+ while((conn = doq_timer_timeout_conn(doq_socket)) != NULL) {
+ if(conn->is_deleted ||
+#ifdef HAVE_NGTCP2_CONN_IN_CLOSING_PERIOD
+ ngtcp2_conn_in_closing_period(conn->conn) ||
+#else
+ ngtcp2_conn_is_in_closing_period(conn->conn) ||
+#endif
+#ifdef HAVE_NGTCP2_CONN_IN_DRAINING_PERIOD
+ ngtcp2_conn_in_draining_period(conn->conn)
+#else
+ ngtcp2_conn_is_in_draining_period(conn->conn)
+#endif
+ ) {
+ if(verbosity >= VERB_ALGO) {
+ char remotestr[256];
+ addr_to_str((void*)&conn->key.paddr.addr,
+ conn->key.paddr.addrlen, remotestr,
+ sizeof(remotestr));
+ verbose(VERB_ALGO, "doq conn %s is deleted "
+ "after timeout", remotestr);
+ }
+ doq_delete_connection(doq_socket->cp, conn);
+ continue;
+ }
+ if(!doq_conn_handle_timeout(conn))
+ doq_delete_connection(doq_socket->cp, conn);
+ else doq_done_setup_timer_and_write(doq_socket->cp, conn);
+ }
+
+ if(doq_socket_want_write(doq_socket->cp))
+ doq_socket_write_enable(doq_socket->cp);
+ else doq_socket_write_disable(doq_socket->cp);
+ doq_pickup_timer(doq_socket->cp);
+}
+
+void
+comm_point_doq_callback(int fd, short event, void* arg)
+{
+ struct comm_point* c;
+ struct doq_pkt_addr paddr;
+ int i, pkt_continue, err_drop;
+ struct doq_conn* conn;
+ struct ngtcp2_pkt_info pi;
+ size_t count, num_len;
+
+ c = (struct comm_point*)arg;
+ log_assert(c->type == comm_doq);
+
+ log_assert(c && c->doq_socket->pkt_buf && c->fd == fd);
+ ub_comm_base_now(c->ev->base);
+
+ /* see if there is a blocked packet, and send that if possible.
+ * do not attempt to read yet, even if possible, that would just
+ * push more answers in reply to those read packets onto the list
+ * of written replies. First attempt to clear the write content out.
+ * That keeps the memory usage from bloating up. */
+ if(c->doq_socket->have_blocked_pkt) {
+ if(!doq_write_blocked_pkt(c)) {
+ /* this write has also blocked, attempt to write
+ * later. Make sure the event listens to write
+ * events. */
+ if(!c->doq_socket->event_has_write)
+ doq_socket_write_enable(c);
+ doq_pickup_timer(c);
+ return;
+ }
+ }
+
+ /* see if there is write interest */
+ count = 0;
+ num_len = doq_write_list_length(c);
+ while((conn = doq_pop_write_conn(c)) != NULL) {
+ if(conn->is_deleted ||
+#ifdef HAVE_NGTCP2_CONN_IN_CLOSING_PERIOD
+ ngtcp2_conn_in_closing_period(conn->conn) ||
+#else
+ ngtcp2_conn_is_in_closing_period(conn->conn) ||
+#endif
+#ifdef HAVE_NGTCP2_CONN_IN_DRAINING_PERIOD
+ ngtcp2_conn_in_draining_period(conn->conn)
+#else
+ ngtcp2_conn_is_in_draining_period(conn->conn)
+#endif
+ ) {
+ conn->doq_socket = NULL;
+ lock_basic_unlock(&conn->lock);
+ if(c->doq_socket->have_blocked_pkt) {
+ if(!c->doq_socket->event_has_write)
+ doq_socket_write_enable(c);
+ doq_pickup_timer(c);
+ return;
+ }
+ if(++count > num_len*2)
+ break;
+ continue;
+ }
+ if(verbosity >= VERB_ALGO) {
+ char remotestr[256];
+ addr_to_str((void*)&conn->key.paddr.addr,
+ conn->key.paddr.addrlen, remotestr,
+ sizeof(remotestr));
+ verbose(VERB_ALGO, "doq write connection %s %d",
+ remotestr, doq_sockaddr_get_port(
+ &conn->key.paddr.addr));
+ }
+ if(doq_conn_write_streams(c, conn, &err_drop))
+ err_drop = 0;
+ doq_done_with_write_cb(c, conn, err_drop);
+ if(c->doq_socket->have_blocked_pkt) {
+ if(!c->doq_socket->event_has_write)
+ doq_socket_write_enable(c);
+ doq_pickup_timer(c);
+ return;
+ }
+ /* Stop overly long write lists that are created
+ * while we are processing. Do those next time there
+ * is a write callback. Stops long loops, and keeps
+ * fair for other events. */
+ if(++count > num_len*2)
+ break;
+ }
+
+ /* check for data to read */
+ if((event&UB_EV_READ)!=0)
+ for(i=0; i<NUM_UDP_PER_SELECT; i++) {
+ /* there may be a blocked write packet and if so, stop
+ * reading because the reply cannot get written. The
+ * blocked packet could be written during the conn_recv
+ * handling of replies, or for a connection close. */
+ if(c->doq_socket->have_blocked_pkt) {
+ if(!c->doq_socket->event_has_write)
+ doq_socket_write_enable(c);
+ doq_pickup_timer(c);
+ return;
+ }
+ sldns_buffer_clear(c->doq_socket->pkt_buf);
+ doq_pkt_addr_init(&paddr);
+ log_assert(fd != -1);
+ log_assert(sldns_buffer_remaining(c->doq_socket->pkt_buf) > 0);
+ if(!doq_recv(c, &paddr, &pkt_continue, &pi)) {
+ if(pkt_continue)
+ continue;
+ break;
+ }
+
+ /* handle incoming packet from remote addr to localaddr */
+ if(verbosity >= VERB_ALGO) {
+ char remotestr[256], localstr[256];
+ addr_to_str((void*)&paddr.addr, paddr.addrlen,
+ remotestr, sizeof(remotestr));
+ addr_to_str((void*)&paddr.localaddr,
+ paddr.localaddrlen, localstr,
+ sizeof(localstr));
+ log_info("incoming doq packet from %s port %d on "
+ "%s port %d ifindex %d",
+ remotestr, doq_sockaddr_get_port(&paddr.addr),
+ localstr,
+ doq_sockaddr_get_port(&paddr.localaddr),
+ paddr.ifindex);
+ log_info("doq_recv length %d ecn 0x%x",
+ (int)sldns_buffer_limit(c->doq_socket->pkt_buf),
+ (int)pi.ecn);
+ }
+
+ if(sldns_buffer_limit(c->doq_socket->pkt_buf) == 0)
+ continue;
+
+ conn = NULL;
+ if(!doq_decode_pkt_header_negotiate(c, &paddr, &conn))
+ continue;
+ if(!conn) {
+ if(!doq_accept(c, &paddr, &conn, &pi))
+ continue;
+ if(!doq_conn_write_streams(c, conn, NULL)) {
+ doq_delete_connection(c, conn);
+ continue;
+ }
+ doq_done_setup_timer_and_write(c, conn);
+ continue;
+ }
+ if(
+#ifdef HAVE_NGTCP2_CONN_IN_CLOSING_PERIOD
+ ngtcp2_conn_in_closing_period(conn->conn)
+#else
+ ngtcp2_conn_is_in_closing_period(conn->conn)
+#endif
+ ) {
+ if(!doq_conn_send_close(c, conn)) {
+ doq_delete_connection(c, conn);
+ } else {
+ doq_done_setup_timer_and_write(c, conn);
+ }
+ continue;
+ }
+ if(
+#ifdef HAVE_NGTCP2_CONN_IN_DRAINING_PERIOD
+ ngtcp2_conn_in_draining_period(conn->conn)
+#else
+ ngtcp2_conn_is_in_draining_period(conn->conn)
+#endif
+ ) {
+ doq_done_setup_timer_and_write(c, conn);
+ continue;
+ }
+ if(!doq_conn_recv(c, &paddr, conn, &pi, NULL, &err_drop)) {
+ /* The receive failed, and if it also failed to send
+ * a close, drop the connection. That means it is not
+ * in the closing period. */
+ if(err_drop) {
+ doq_delete_connection(c, conn);
+ } else {
+ doq_done_setup_timer_and_write(c, conn);
+ }
+ continue;
+ }
+ if(!doq_conn_write_streams(c, conn, &err_drop)) {
+ if(err_drop) {
+ doq_delete_connection(c, conn);
+ } else {
+ doq_done_setup_timer_and_write(c, conn);
+ }
+ continue;
+ }
+ doq_done_setup_timer_and_write(c, conn);
+ }
+
+ /* see if we want to have more write events */
+ verbose(VERB_ALGO, "doq check write enable");
+ if(doq_socket_want_write(c))
+ doq_socket_write_enable(c);
+ else doq_socket_write_disable(c);
+ doq_pickup_timer(c);
+}
+
+/** create new doq server socket structure */
+static struct doq_server_socket*
+doq_server_socket_create(struct doq_table* table, struct ub_randstate* rnd,
+ const char* ssl_service_key, const char* ssl_service_pem,
+ struct comm_point* c, struct comm_base* base, struct config_file* cfg)
+{
+ size_t doq_buffer_size = 4096; /* bytes buffer size, for one packet. */
+ struct doq_server_socket* doq_socket;
+ doq_socket = calloc(1, sizeof(*doq_socket));
+ if(!doq_socket) {
+ return NULL;
+ }
+ doq_socket->table = table;
+ doq_socket->rnd = rnd;
+ doq_socket->validate_addr = 1;
+ if(ssl_service_key == NULL || ssl_service_key[0]==0) {
+ log_err("doq server socket create: no tls-service-key");
+ free(doq_socket);
+ return NULL;
+ }
+ if(ssl_service_pem == NULL || ssl_service_pem[0]==0) {
+ log_err("doq server socket create: no tls-service-pem");
+ free(doq_socket);
+ return NULL;
+ }
+ doq_socket->ssl_service_key = strdup(ssl_service_key);
+ if(!doq_socket->ssl_service_key) {
+ free(doq_socket);
+ return NULL;
+ }
+ doq_socket->ssl_service_pem = strdup(ssl_service_pem);
+ if(!doq_socket->ssl_service_pem) {
+ free(doq_socket->ssl_service_key);
+ free(doq_socket);
+ return NULL;
+ }
+ doq_socket->ssl_verify_pem = NULL;
+ /* the doq_socket has its own copy of the static secret, as
+ * well as other config values, so that they do not need table.lock */
+ doq_socket->static_secret_len = table->static_secret_len;
+ doq_socket->static_secret = memdup(table->static_secret,
+ table->static_secret_len);
+ if(!doq_socket->static_secret) {
+ free(doq_socket->ssl_service_key);
+ free(doq_socket->ssl_service_pem);
+ free(doq_socket->ssl_verify_pem);
+ free(doq_socket);
+ return NULL;
+ }
+ if(!doq_socket_setup_ctx(doq_socket)) {
+ free(doq_socket->ssl_service_key);
+ free(doq_socket->ssl_service_pem);
+ free(doq_socket->ssl_verify_pem);
+ free(doq_socket->static_secret);
+ free(doq_socket);
+ return NULL;
+ }
+ doq_socket->idle_timeout = table->idle_timeout;
+ doq_socket->sv_scidlen = table->sv_scidlen;
+ doq_socket->cp = c;
+ doq_socket->pkt_buf = sldns_buffer_new(doq_buffer_size);
+ if(!doq_socket->pkt_buf) {
+ free(doq_socket->ssl_service_key);
+ free(doq_socket->ssl_service_pem);
+ free(doq_socket->ssl_verify_pem);
+ free(doq_socket->static_secret);
+ SSL_CTX_free(doq_socket->ctx);
+ free(doq_socket);
+ return NULL;
+ }
+ doq_socket->blocked_pkt = sldns_buffer_new(
+ sldns_buffer_capacity(doq_socket->pkt_buf));
+ if(!doq_socket->pkt_buf) {
+ free(doq_socket->ssl_service_key);
+ free(doq_socket->ssl_service_pem);
+ free(doq_socket->ssl_verify_pem);
+ free(doq_socket->static_secret);
+ SSL_CTX_free(doq_socket->ctx);
+ sldns_buffer_free(doq_socket->pkt_buf);
+ free(doq_socket);
+ return NULL;
+ }
+ doq_socket->blocked_paddr = calloc(1,
+ sizeof(*doq_socket->blocked_paddr));
+ if(!doq_socket->blocked_paddr) {
+ free(doq_socket->ssl_service_key);
+ free(doq_socket->ssl_service_pem);
+ free(doq_socket->ssl_verify_pem);
+ free(doq_socket->static_secret);
+ SSL_CTX_free(doq_socket->ctx);
+ sldns_buffer_free(doq_socket->pkt_buf);
+ sldns_buffer_free(doq_socket->blocked_pkt);
+ free(doq_socket);
+ return NULL;
+ }
+ doq_socket->timer = comm_timer_create(base, doq_timer_cb, doq_socket);
+ if(!doq_socket->timer) {
+ free(doq_socket->ssl_service_key);
+ free(doq_socket->ssl_service_pem);
+ free(doq_socket->ssl_verify_pem);
+ free(doq_socket->static_secret);
+ SSL_CTX_free(doq_socket->ctx);
+ sldns_buffer_free(doq_socket->pkt_buf);
+ sldns_buffer_free(doq_socket->blocked_pkt);
+ free(doq_socket->blocked_paddr);
+ free(doq_socket);
+ return NULL;
+ }
+ memset(&doq_socket->marked_time, 0, sizeof(doq_socket->marked_time));
+ comm_base_timept(base, &doq_socket->now_tt, &doq_socket->now_tv);
+ doq_socket->cfg = cfg;
+ return doq_socket;
+}
+
+/** delete doq server socket structure */
+static void
+doq_server_socket_delete(struct doq_server_socket* doq_socket)
+{
+ if(!doq_socket)
+ return;
+ free(doq_socket->static_secret);
+ SSL_CTX_free(doq_socket->ctx);
+#ifndef HAVE_NGTCP2_CRYPTO_QUICTLS_CONFIGURE_SERVER_CONTEXT
+ free(doq_socket->quic_method);
+#endif
+ free(doq_socket->ssl_service_key);
+ free(doq_socket->ssl_service_pem);
+ free(doq_socket->ssl_verify_pem);
+ sldns_buffer_free(doq_socket->pkt_buf);
+ sldns_buffer_free(doq_socket->blocked_pkt);
+ free(doq_socket->blocked_paddr);
+ comm_timer_delete(doq_socket->timer);
+ free(doq_socket);
+}
+
+/** find repinfo in the doq table */
+static struct doq_conn*
+doq_lookup_repinfo(struct doq_table* table, struct comm_reply* repinfo)
+{
+ struct doq_conn* conn;
+ struct doq_conn_key key;
+ doq_conn_key_from_repinfo(&key, repinfo);
+ lock_rw_rdlock(&table->lock);
+ conn = doq_conn_find(table, &key.paddr.addr,
+ key.paddr.addrlen, &key.paddr.localaddr,
+ key.paddr.localaddrlen, key.paddr.ifindex, key.dcid,
+ key.dcidlen);
+ if(conn) {
+ lock_basic_lock(&conn->lock);
+ lock_rw_unlock(&table->lock);
+ return conn;
+ }
+ lock_rw_unlock(&table->lock);
+ return NULL;
+}
+
+/** doq find connection and stream. From inside callbacks from worker. */
+static int
+doq_lookup_conn_stream(struct comm_reply* repinfo, struct comm_point* c,
+ struct doq_conn** conn, struct doq_stream** stream)
+{
+ if(c->doq_socket->current_conn) {
+ *conn = c->doq_socket->current_conn;
+ } else {
+ *conn = doq_lookup_repinfo(c->doq_socket->table, repinfo);
+ if((*conn) && (*conn)->is_deleted) {
+ lock_basic_unlock(&(*conn)->lock);
+ *conn = NULL;
+ }
+ if(*conn) {
+ (*conn)->doq_socket = c->doq_socket;
+ }
+ }
+ if(!*conn) {
+ *stream = NULL;
+ return 0;
+ }
+ *stream = doq_stream_find(*conn, repinfo->doq_streamid);
+ if(!*stream) {
+ if(!c->doq_socket->current_conn) {
+ /* Not inside callbacks, we have our own lock on conn.
+ * Release it. */
+ lock_basic_unlock(&(*conn)->lock);
+ }
+ return 0;
+ }
+ if((*stream)->is_closed) {
+ /* stream is closed, ignore reply or drop */
+ if(!c->doq_socket->current_conn) {
+ /* Not inside callbacks, we have our own lock on conn.
+ * Release it. */
+ lock_basic_unlock(&(*conn)->lock);
+ }
+ return 0;
+ }
+ return 1;
+}
+
+/** doq send a reply from a comm reply */
+static void
+doq_socket_send_reply(struct comm_reply* repinfo)
+{
+ struct doq_conn* conn;
+ struct doq_stream* stream;
+ log_assert(repinfo->c->type == comm_doq);
+ if(!doq_lookup_conn_stream(repinfo, repinfo->c, &conn, &stream)) {
+ verbose(VERB_ALGO, "doq: send_reply but %s is gone",
+ (conn?"stream":"connection"));
+ /* No stream, it may have been closed. */
+ /* Drop the reply, it cannot be sent. */
+ return;
+ }
+ if(!doq_stream_send_reply(conn, stream, repinfo->c->buffer))
+ doq_stream_close(conn, stream, 1);
+ if(!repinfo->c->doq_socket->current_conn) {
+ /* Not inside callbacks, we have our own lock on conn.
+ * Release it. */
+ doq_done_with_conn_cb(repinfo->c, conn);
+ /* since we sent a reply, or closed it, the assumption is
+ * that there is something to write, so enable write event.
+ * It waits until the write event happens to write the
+ * streams with answers, this allows some answers to be
+ * answered before the event loop reaches the doq fd, in
+ * repinfo->c->fd, and that collates answers. That would
+ * not happen if we write doq packets right now. */
+ doq_socket_write_enable(repinfo->c);
+ }
+}
+
+/** doq drop a reply from a comm reply */
+static void
+doq_socket_drop_reply(struct comm_reply* repinfo)
+{
+ struct doq_conn* conn;
+ struct doq_stream* stream;
+ log_assert(repinfo->c->type == comm_doq);
+ if(!doq_lookup_conn_stream(repinfo, repinfo->c, &conn, &stream)) {
+ verbose(VERB_ALGO, "doq: drop_reply but %s is gone",
+ (conn?"stream":"connection"));
+ /* The connection or stream is already gone. */
+ return;
+ }
+ doq_stream_close(conn, stream, 1);
+ if(!repinfo->c->doq_socket->current_conn) {
+ /* Not inside callbacks, we have our own lock on conn.
+ * Release it. */
+ doq_done_with_conn_cb(repinfo->c, conn);
+ doq_socket_write_enable(repinfo->c);
+ }
+}
+#endif /* HAVE_NGTCP2 */
+
int adjusted_tcp_timeout(struct comm_point* c)
{
if(c->tcp_timeout_msec < TCP_QUERY_TIMEOUT_MINIMUM)
@@ -4081,6 +5857,96 @@ comm_point_create_udp_ancil(struct comm_base *base, int fd,
}
#endif
+struct comm_point*
+comm_point_create_doq(struct comm_base *base, int fd, sldns_buffer* buffer,
+ comm_point_callback_type* callback, void* callback_arg,
+ struct unbound_socket* socket, struct doq_table* table,
+ struct ub_randstate* rnd, const char* ssl_service_key,
+ const char* ssl_service_pem, struct config_file* cfg)
+{
+#ifdef HAVE_NGTCP2
+ struct comm_point* c = (struct comm_point*)calloc(1,
+ sizeof(struct comm_point));
+ short evbits;
+ if(!c)
+ return NULL;
+ c->ev = (struct internal_event*)calloc(1,
+ sizeof(struct internal_event));
+ if(!c->ev) {
+ free(c);
+ return NULL;
+ }
+ c->ev->base = base;
+ c->fd = fd;
+ c->buffer = buffer;
+ c->timeout = NULL;
+ c->tcp_is_reading = 0;
+ c->tcp_byte_count = 0;
+ c->tcp_parent = NULL;
+ c->max_tcp_count = 0;
+ c->cur_tcp_count = 0;
+ c->tcp_handlers = NULL;
+ c->tcp_free = NULL;
+ c->type = comm_doq;
+ c->tcp_do_close = 0;
+ c->do_not_close = 0;
+ c->tcp_do_toggle_rw = 0;
+ c->tcp_check_nb_connect = 0;
+#ifdef USE_MSG_FASTOPEN
+ c->tcp_do_fastopen = 0;
+#endif
+#ifdef USE_DNSCRYPT
+ c->dnscrypt = 0;
+ c->dnscrypt_buffer = NULL;
+#endif
+#ifdef HAVE_NGTCP2
+ c->doq_socket = doq_server_socket_create(table, rnd, ssl_service_key,
+ ssl_service_pem, c, base, cfg);
+ if(!c->doq_socket) {
+ log_err("could not create doq comm_point");
+ comm_point_delete(c);
+ return NULL;
+ }
+#endif
+ c->inuse = 0;
+ c->callback = callback;
+ c->cb_arg = callback_arg;
+ c->socket = socket;
+ c->pp2_enabled = 0;
+ c->pp2_header_state = pp2_header_none;
+ evbits = UB_EV_READ | UB_EV_PERSIST;
+ /* ub_event stuff */
+ c->ev->ev = ub_event_new(base->eb->base, c->fd, evbits,
+ comm_point_doq_callback, c);
+ if(c->ev->ev == NULL) {
+ log_err("could not baseset udp event");
+ comm_point_delete(c);
+ return NULL;
+ }
+ if(fd!=-1 && ub_event_add(c->ev->ev, c->timeout) != 0 ) {
+ log_err("could not add udp event");
+ comm_point_delete(c);
+ return NULL;
+ }
+ c->event_added = 1;
+ return c;
+#else
+ /* no libngtcp2, so no QUIC support */
+ (void)base;
+ (void)buffer;
+ (void)callback;
+ (void)callback_arg;
+ (void)socket;
+ (void)rnd;
+ (void)table;
+ (void)ssl_service_key;
+ (void)ssl_service_pem;
+ (void)cfg;
+ sock_close(fd);
+ return NULL;
+#endif /* HAVE_NGTCP2 */
+}
+
static struct comm_point*
comm_point_create_tcp_handler(struct comm_base *base,
struct comm_point* parent, size_t bufsize,
@@ -4749,11 +6615,29 @@ comm_point_delete(struct comm_point* c)
http2_session_delete(c->h2_session);
}
}
+#ifdef HAVE_NGTCP2
+ if(c->doq_socket)
+ doq_server_socket_delete(c->doq_socket);
+#endif
ub_event_free(c->ev->ev);
free(c->ev);
free(c);
}
+#ifdef USE_DNSTAP
+static void
+send_reply_dnstap(struct dt_env* dtenv,
+ struct sockaddr* addr, socklen_t addrlen,
+ struct sockaddr_storage* client_addr, socklen_t client_addrlen,
+ enum comm_point_type type, void* ssl, sldns_buffer* buffer)
+{
+ log_addr(VERB_ALGO, "from local addr", (void*)addr, addrlen);
+ log_addr(VERB_ALGO, "response to client", client_addr, client_addrlen);
+ dt_msg_send_client_response(dtenv, client_addr,
+ (struct sockaddr_storage*)addr, type, ssl, buffer);
+}
+#endif
+
void
comm_point_send_reply(struct comm_reply *repinfo)
{
@@ -4778,24 +6662,44 @@ comm_point_send_reply(struct comm_reply *repinfo)
repinfo->remote_addrlen, 0);
#ifdef USE_DNSTAP
/*
- * sending src (client)/dst (local service) addresses over DNSTAP from udp callback
+ * sending src (client)/dst (local service) addresses over
+ * DNSTAP from udp callback
*/
if(repinfo->c->dtenv != NULL && repinfo->c->dtenv->log_client_response_messages) {
- log_addr(VERB_ALGO, "from local addr", (void*)repinfo->c->socket->addr, repinfo->c->socket->addrlen);
- log_addr(VERB_ALGO, "response to client", &repinfo->client_addr, repinfo->client_addrlen);
- dt_msg_send_client_response(repinfo->c->dtenv, &repinfo->client_addr, (void*)repinfo->c->socket->addr, repinfo->c->type, repinfo->c->ssl, repinfo->c->buffer);
+ send_reply_dnstap(repinfo->c->dtenv,
+ repinfo->c->socket->addr,
+ repinfo->c->socket->addrlen,
+ &repinfo->client_addr, repinfo->client_addrlen,
+ repinfo->c->type, repinfo->c->ssl,
+ repinfo->c->buffer);
}
#endif
} else {
#ifdef USE_DNSTAP
+ struct dt_env* dtenv =
+#ifdef HAVE_NGTCP2
+ repinfo->c->doq_socket
+ ?repinfo->c->dtenv:
+#endif
+ repinfo->c->tcp_parent->dtenv;
+ struct sldns_buffer* dtbuffer = repinfo->c->tcp_req_info
+ ?repinfo->c->tcp_req_info->spool_buffer
+ :repinfo->c->buffer;
+#ifdef USE_DNSCRYPT
+ if(repinfo->c->dnscrypt && repinfo->is_dnscrypted)
+ dtbuffer = repinfo->c->buffer;
+#endif
/*
- * sending src (client)/dst (local service) addresses over DNSTAP from TCP callback
+ * sending src (client)/dst (local service) addresses over
+ * DNSTAP from other callbacks
*/
- if(repinfo->c->tcp_parent->dtenv != NULL && repinfo->c->tcp_parent->dtenv->log_client_response_messages) {
- log_addr(VERB_ALGO, "from local addr", (void*)repinfo->c->socket->addr, repinfo->c->socket->addrlen);
- log_addr(VERB_ALGO, "response to client", &repinfo->client_addr, repinfo->client_addrlen);
- dt_msg_send_client_response(repinfo->c->tcp_parent->dtenv, &repinfo->client_addr, (void*)repinfo->c->socket->addr, repinfo->c->type, repinfo->c->ssl,
- ( repinfo->c->tcp_req_info? repinfo->c->tcp_req_info->spool_buffer: repinfo->c->buffer ));
+ if(dtenv != NULL && dtenv->log_client_response_messages) {
+ send_reply_dnstap(dtenv,
+ repinfo->c->socket->addr,
+ repinfo->c->socket->addrlen,
+ &repinfo->client_addr, repinfo->client_addrlen,
+ repinfo->c->type, repinfo->c->ssl,
+ dtbuffer);
}
#endif
if(repinfo->c->tcp_req_info) {
@@ -4811,6 +6715,10 @@ comm_point_send_reply(struct comm_reply *repinfo)
comm_point_start_listening(repinfo->c, -1,
adjusted_tcp_timeout(repinfo->c));
return;
+#ifdef HAVE_NGTCP2
+ } else if(repinfo->c->doq_socket) {
+ doq_socket_send_reply(repinfo);
+#endif
} else {
comm_point_start_listening(repinfo->c, -1,
adjusted_tcp_timeout(repinfo->c));
@@ -4838,6 +6746,11 @@ comm_point_drop_reply(struct comm_reply* repinfo)
}
reclaim_http_handler(repinfo->c);
return;
+#ifdef HAVE_NGTCP2
+ } else if(repinfo->c->type == comm_doq) {
+ doq_socket_drop_reply(repinfo);
+ return;
+#endif
}
reclaim_tcp_handler(repinfo->c);
}
diff --git a/util/netevent.h b/util/netevent.h
index 6f43ce56c8c9..acc4887b11e3 100644
--- a/util/netevent.h
+++ b/util/netevent.h
@@ -65,6 +65,9 @@
#ifdef HAVE_NGHTTP2_NGHTTP2_H
#include <nghttp2/nghttp2.h>
#endif
+#ifdef HAVE_NGTCP2
+#include <ngtcp2/ngtcp2.h>
+#endif
struct sldns_buffer;
struct comm_point;
@@ -72,6 +75,11 @@ struct comm_reply;
struct tcl_list;
struct ub_event_base;
struct unbound_socket;
+struct doq_server_socket;
+struct doq_table;
+struct doq_conn;
+struct config_file;
+struct ub_randstate;
struct mesh_state;
struct mesh_area;
@@ -105,6 +113,8 @@ typedef int comm_point_callback_type(struct comm_point*, void*, int,
#define NETEVENT_SLOW_ACCEPT_TIME 2000
/** timeout to slow down log print, so it does not spam the logs, in sec */
#define SLOW_LOG_TIME 10
+/** for doq, the maximum dcid length, in ngtcp2 it is 20. */
+#define DOQ_MAX_CIDLEN 24
/**
* A communication point dispatcher. Thread specific.
@@ -164,6 +174,19 @@ struct comm_reply {
struct sockaddr_storage client_addr;
/** the original address length */
socklen_t client_addrlen;
+#ifdef HAVE_NGTCP2
+ /** the doq ifindex, together with addr and localaddr in pktinfo,
+ * and dcid makes the doq_conn_key to find the connection */
+ int doq_ifindex;
+ /** the doq dcid, the connection id used to find the connection */
+ uint8_t doq_dcid[DOQ_MAX_CIDLEN];
+ /** the length of the doq dcid */
+ size_t doq_dcidlen;
+ /** the doq stream id where the query came in on */
+ int64_t doq_streamid;
+ /** port number for doq */
+ int doq_srcport;
+#endif /* HAVE_NGTCP2 */
};
/**
@@ -266,6 +289,11 @@ struct comm_point {
/** maximum number of HTTP/2 streams per connection. Send in HTTP/2
* SETTINGS frame. */
uint32_t http2_max_streams;
+ /* -------- DoQ ------- */
+#ifdef HAVE_NGTCP2
+ /** the doq server socket, with list of doq connections */
+ struct doq_server_socket* doq_socket;
+#endif
/* -------- dnstap ------- */
/** the dnstap environment */
@@ -281,6 +309,8 @@ struct comm_point {
comm_tcp,
/** HTTP handler socket */
comm_http,
+ /** DOQ handler socket */
+ comm_doq,
/** AF_UNIX socket - for internal commands. */
comm_local,
/** raw - not DNS format - for pipe readers and writers */
@@ -553,6 +583,30 @@ struct comm_point* comm_point_create_udp_ancil(struct comm_base* base,
comm_point_callback_type* callback, void* callback_arg, struct unbound_socket* socket);
/**
+ * Create an UDP comm point for DoQ. Calls malloc.
+ * setups the structure with the parameters you provide.
+ * @param base: in which base to alloc the commpoint.
+ * @param fd : file descriptor of open UDP socket.
+ * @param buffer: shared buffer by UDP sockets from this thread.
+ * @param callback: callback function pointer.
+ * @param callback_arg: will be passed to your callback function.
+ * @param socket: and opened socket properties will be passed to your callback function.
+ * @param table: the doq connection table for the host.
+ * @param rnd: random generator to use.
+ * @param ssl_service_key: the ssl service key file.
+ * @param ssl_service_pem: the ssl service pem file.
+ * @param cfg: config file struct.
+ * @return: returns the allocated communication point. NULL on error.
+ * Sets timeout to NULL. Turns off TCP options.
+ */
+struct comm_point* comm_point_create_doq(struct comm_base* base,
+ int fd, struct sldns_buffer* buffer,
+ comm_point_callback_type* callback, void* callback_arg,
+ struct unbound_socket* socket, struct doq_table* table,
+ struct ub_randstate* rnd, const char* ssl_service_key,
+ const char* ssl_service_pem, struct config_file* cfg);
+
+/**
* Create a TCP listener comm point. Calls malloc.
* Setups the structure with the parameters you provide.
* Also Creates TCP Handlers, pre allocated for you.
@@ -823,6 +877,16 @@ void comm_point_udp_ancil_callback(int fd, short event, void* arg);
/**
* This routine is published for checks and tests, and is only used internally.
+ * handle libevent callback for doq comm point.
+ * @param fd: file descriptor.
+ * @param event: event bits from libevent:
+ * EV_READ, EV_WRITE, EV_SIGNAL, EV_TIMEOUT.
+ * @param arg: the comm_point structure.
+ */
+void comm_point_doq_callback(int fd, short event, void* arg);
+
+/**
+ * This routine is published for checks and tests, and is only used internally.
* handle libevent callback for tcp accept comm point
* @param fd: file descriptor.
* @param event: event bits from libevent:
@@ -959,6 +1023,106 @@ void http2_stream_add_meshstate(struct http2_stream* h2_stream,
void http2_stream_remove_mesh_state(struct http2_stream* h2_stream);
/**
+ * DoQ socket address storage for IP4 or IP6 address. Smaller than
+ * the sockaddr_storage because not with af_unix pathnames.
+ */
+struct doq_addr_storage {
+ union {
+ struct sockaddr_in in;
+#ifdef AF_INET6
+ struct sockaddr_in6 in6;
+#endif
+ } sockaddr;
+};
+
+/**
+ * The DoQ server socket information, for DNS over QUIC.
+ */
+struct doq_server_socket {
+ /** the doq connection table */
+ struct doq_table* table;
+ /** random generator */
+ struct ub_randstate* rnd;
+ /** if address validation is enabled */
+ uint8_t validate_addr;
+ /** the ssl service key file */
+ char* ssl_service_key;
+ /** the ssl service pem file */
+ char* ssl_service_pem;
+ /** the ssl verify pem file */
+ char* ssl_verify_pem;
+ /** the server scid length */
+ int sv_scidlen;
+ /** the idle timeout in nanoseconds */
+ uint64_t idle_timeout;
+ /** the static secret for the server */
+ uint8_t* static_secret;
+ /** length of the static secret */
+ size_t static_secret_len;
+ /** ssl context, SSL_CTX* */
+ void* ctx;
+#ifndef HAVE_NGTCP2_CRYPTO_QUICTLS_CONFIGURE_SERVER_CONTEXT
+ /** quic method functions, SSL_QUIC_METHOD* */
+ void* quic_method;
+#endif
+ /** the comm point for this doq server socket */
+ struct comm_point* cp;
+ /** the buffer for packets, doq in and out */
+ struct sldns_buffer* pkt_buf;
+ /** the current doq connection when we are in callbacks to worker,
+ * so that we have the already locked structure at our disposal. */
+ struct doq_conn* current_conn;
+ /** if the callback event on the fd has write flags */
+ uint8_t event_has_write;
+ /** if there is a blocked packet in the blocked_pkt buffer */
+ int have_blocked_pkt;
+ /** store blocked packet, a packet that could not be send on the
+ * nonblocking socket. It has to be sent later, when the write on
+ * the udp socket unblocks. */
+ struct sldns_buffer* blocked_pkt;
+#ifdef HAVE_NGTCP2
+ /** the ecn info for the blocked packet, congestion information. */
+ struct ngtcp2_pkt_info blocked_pkt_pi;
+#endif
+ /** the packet destination for the blocked packet. */
+ struct doq_pkt_addr* blocked_paddr;
+ /** timer for this worker on this comm_point to wait on. */
+ struct comm_timer* timer;
+ /** the timer that is marked by the doq_socket as waited on. */
+ struct timeval marked_time;
+ /** the current time for use by time functions, time_t. */
+ time_t* now_tt;
+ /** the current time for use by time functions, timeval. */
+ struct timeval* now_tv;
+ /** config file for the worker. */
+ struct config_file* cfg;
+};
+
+/**
+ * DoQ packet address information. From pktinfo, stores local and remote
+ * address and ifindex, so the packet can be sent there.
+ */
+struct doq_pkt_addr {
+ /** the remote addr, and local addr */
+ struct doq_addr_storage addr, localaddr;
+ /** length of addr and length of localaddr */
+ socklen_t addrlen, localaddrlen;
+ /** interface index from pktinfo ancillary information */
+ int ifindex;
+};
+
+/** Initialize the pkt addr with lengths set to sizeof. That is ready for
+ * a call to recv. */
+void doq_pkt_addr_init(struct doq_pkt_addr* paddr);
+
+/** send doq packet over UDP. */
+void doq_send_pkt(struct comm_point* c, struct doq_pkt_addr* paddr,
+ uint32_t ecn);
+
+/** doq timer callback function. */
+void doq_timer_cb(void* arg);
+
+/**
* This routine is published for checks and tests, and is only used internally.
* handle libevent callback for timer comm.
* @param fd: file descriptor (always -1).
diff --git a/validator/val_neg.c b/validator/val_neg.c
index 52bc68387260..b5b678fdea68 100644
--- a/validator/val_neg.c
+++ b/validator/val_neg.c
@@ -823,7 +823,8 @@ void neg_insert_data(struct val_neg_cache* neg,
it <= neg->nsec3_max_iter &&
(h != zone->nsec3_hash || it != zone->nsec3_iter ||
slen != zone->nsec3_saltlen ||
- memcmp(zone->nsec3_salt, s, slen) != 0)) {
+ (slen != 0 && zone->nsec3_salt && s
+ && memcmp(zone->nsec3_salt, s, slen) != 0))) {
if(slen > 0) {
uint8_t* sa = memdup(s, slen);
@@ -1206,7 +1207,8 @@ neg_params_ok(struct val_neg_zone* zone, struct ub_packed_rrset_key* rrset)
return 0;
return (h == zone->nsec3_hash && it == zone->nsec3_iter &&
slen == zone->nsec3_saltlen &&
- memcmp(zone->nsec3_salt, s, slen) == 0);
+ (slen != 0 && zone->nsec3_salt && s
+ && memcmp(zone->nsec3_salt, s, slen) == 0));
}
/** get next closer for nsec3 proof */
diff --git a/validator/val_nsec3.c b/validator/val_nsec3.c
index e790e99825ea..998fcc4e38ee 100644
--- a/validator/val_nsec3.c
+++ b/validator/val_nsec3.c
@@ -565,7 +565,8 @@ nsec3_get_hashed(sldns_buffer* buf, uint8_t* nm, size_t nmlen, int algo,
sldns_buffer_clear(buf);
sldns_buffer_write(buf, nm, nmlen);
query_dname_tolower(sldns_buffer_begin(buf));
- sldns_buffer_write(buf, salt, saltlen);
+ if(saltlen != 0)
+ sldns_buffer_write(buf, salt, saltlen);
sldns_buffer_flip(buf);
hash_len = nsec3_hash_algo_size_supported(algo);
if(hash_len == 0) {
@@ -580,7 +581,8 @@ nsec3_get_hashed(sldns_buffer* buf, uint8_t* nm, size_t nmlen, int algo,
for(i=0; i<iter; i++) {
sldns_buffer_clear(buf);
sldns_buffer_write(buf, res, hash_len);
- sldns_buffer_write(buf, salt, saltlen);
+ if(saltlen != 0)
+ sldns_buffer_write(buf, salt, saltlen);
sldns_buffer_flip(buf);
if(!secalgo_nsec3_hash(algo,
(unsigned char*)sldns_buffer_begin(buf),
diff --git a/validator/validator.c b/validator/validator.c
index e6d19a2c9f06..857510b655e7 100644
--- a/validator/validator.c
+++ b/validator/validator.c
@@ -97,8 +97,8 @@ fill_nsec3_iter(struct val_env* ve, char* s, int c)
int i;
free(ve->nsec3_keysize);
free(ve->nsec3_maxiter);
- ve->nsec3_keysize = (size_t*)calloc(sizeof(size_t), (size_t)c);
- ve->nsec3_maxiter = (size_t*)calloc(sizeof(size_t), (size_t)c);
+ ve->nsec3_keysize = (size_t*)calloc((size_t)c, sizeof(size_t));
+ ve->nsec3_maxiter = (size_t*)calloc((size_t)c, sizeof(size_t));
if(!ve->nsec3_keysize || !ve->nsec3_maxiter) {
log_err("out of memory");
return 0;
@@ -2435,6 +2435,8 @@ processFinished(struct module_qstate* qstate, struct val_qstate* vq,
/* if the result is bogus - set message ttl to bogus ttl to avoid
* endless bogus revalidation */
if(vq->orig_msg->rep->security == sec_status_bogus) {
+ struct msgreply_entry* e;
+
/* see if we can try again to fetch data */
if(vq->restart_count < ve->max_restart) {
verbose(VERB_ALGO, "validation failed, "
@@ -2449,10 +2451,51 @@ processFinished(struct module_qstate* qstate, struct val_qstate* vq,
return 0;
}
+ if(qstate->env->cfg->serve_expired &&
+ (e=msg_cache_lookup(qstate->env, qstate->qinfo.qname,
+ qstate->qinfo.qname_len, qstate->qinfo.qtype,
+ qstate->qinfo.qclass, qstate->query_flags,
+ 0 /*now; allow expired*/,
+ 1 /*wr; we may update the data*/))) {
+ struct reply_info* rep = (struct reply_info*)e->entry.data;
+ if(rep && rep->security > sec_status_bogus &&
+ (!qstate->env->cfg->serve_expired_ttl ||
+ qstate->env->cfg->serve_expired_ttl_reset ||
+ *qstate->env->now <= rep->serve_expired_ttl)) {
+ verbose(VERB_ALGO, "validation failed but "
+ "previously cached valid response "
+ "exists; set serve-expired-norec-ttl "
+ "for response in cache");
+ rep->serve_expired_norec_ttl = NORR_TTL +
+ *qstate->env->now;
+ if(qstate->env->cfg->serve_expired_ttl_reset &&
+ *qstate->env->now + qstate->env->cfg->serve_expired_ttl
+ > rep->serve_expired_ttl) {
+ verbose(VERB_ALGO, "reset serve-expired-ttl for "
+ "valid response in cache");
+ rep->serve_expired_ttl = *qstate->env->now +
+ qstate->env->cfg->serve_expired_ttl;
+ }
+ /* Return an error response.
+ * If serve-expired-client-timeout is enabled,
+ * the client-timeout logic will try to find an
+ * (expired) answer in the cache as last
+ * resort. If it is not enabled, expired
+ * answers are already used before the mesh
+ * activation. */
+ qstate->return_rcode = LDNS_RCODE_SERVFAIL;
+ qstate->return_msg = NULL;
+ qstate->ext_state[id] = module_finished;
+ lock_rw_unlock(&e->entry.lock);
+ return 0;
+ }
+ lock_rw_unlock(&e->entry.lock);
+ }
+
vq->orig_msg->rep->ttl = ve->bogus_ttl;
vq->orig_msg->rep->prefetch_ttl =
PREFETCH_TTL_CALC(vq->orig_msg->rep->ttl);
- vq->orig_msg->rep->serve_expired_ttl =
+ vq->orig_msg->rep->serve_expired_ttl =
vq->orig_msg->rep->ttl + qstate->env->cfg->serve_expired_ttl;
if((qstate->env->cfg->val_log_level >= 1 ||
qstate->env->cfg->log_servfail) &&
@@ -2518,8 +2561,9 @@ processFinished(struct module_qstate* qstate, struct val_qstate* vq,
* to check if from parentNS */
if(!qstate->no_cache_store) {
if(!dns_cache_store(qstate->env, &vq->orig_msg->qinfo,
- vq->orig_msg->rep, 0, qstate->prefetch_leeway, 0, NULL,
- qstate->query_flags, qstate->qstarttime)) {
+ vq->orig_msg->rep, 0, qstate->prefetch_leeway,
+ 0, qstate->region, qstate->query_flags,
+ qstate->qstarttime)) {
log_err("out of memory caching validator results");
}
}
@@ -2527,7 +2571,7 @@ processFinished(struct module_qstate* qstate, struct val_qstate* vq,
/* for a referral, store the verified RRsets */
/* and this does not get prefetched, so no leeway */
if(!dns_cache_store(qstate->env, &vq->orig_msg->qinfo,
- vq->orig_msg->rep, 1, 0, 0, NULL,
+ vq->orig_msg->rep, 1, 0, 0, qstate->region,
qstate->query_flags, qstate->qstarttime)) {
log_err("out of memory caching validator results");
}
@@ -2617,6 +2661,14 @@ val_operate(struct module_qstate* qstate, enum module_ev event, int id,
qstate->ext_state[id] = module_finished;
return;
}
+ if(qstate->rpz_applied) {
+ verbose(VERB_ALGO, "rpz applied, mark it as insecure");
+ if(qstate->return_msg)
+ qstate->return_msg->rep->security =
+ sec_status_insecure;
+ qstate->ext_state[id] = module_finished;
+ return;
+ }
/* qclass ANY should have validation result from spawned
* queries. If we get here, it is bogus or an internal error */
if(qstate->qinfo.qclass == LDNS_RR_CLASS_ANY) {
@@ -3053,6 +3105,14 @@ process_ds_response(struct module_qstate* qstate, struct val_qstate* vq,
int ret;
*suspend = 0;
vq->empty_DS_name = NULL;
+ if(sub_qstate && sub_qstate->rpz_applied) {
+ verbose(VERB_ALGO, "rpz was applied to the DS lookup, "
+ "make it insecure");
+ vq->key_entry = NULL;
+ vq->state = VAL_FINISHED_STATE;
+ vq->chase_reply->security = sec_status_insecure;
+ return;
+ }
ret = ds_response_to_ke(qstate, vq, id, rcode, msg, qinfo, &dske,
sub_qstate);
if(ret != 0) {
@@ -3146,6 +3206,15 @@ process_dnskey_response(struct module_qstate* qstate, struct val_qstate* vq,
char* reason = NULL;
sldns_ede_code reason_bogus = LDNS_EDE_DNSSEC_BOGUS;
+ if(sub_qstate && sub_qstate->rpz_applied) {
+ verbose(VERB_ALGO, "rpz was applied to the DNSKEY lookup, "
+ "make it insecure");
+ vq->key_entry = NULL;
+ vq->state = VAL_FINISHED_STATE;
+ vq->chase_reply->security = sec_status_insecure;
+ return;
+ }
+
if(rcode == LDNS_RCODE_NOERROR)
dnskey = reply_find_answer_rrset(qinfo, msg->rep);
diff --git a/validator/validator.h b/validator/validator.h
index 72f44b16e382..c07f9d59d90d 100644
--- a/validator/validator.h
+++ b/validator/validator.h
@@ -159,7 +159,7 @@ struct val_qstate {
* The query restart count
*/
int restart_count;
- /** The blacklist saved for chainoftrust elements */
+ /** The blacklist saved for chain of trust elements */
struct sock_list* chain_blacklist;
/**