diff --git a/Makefile.in b/Makefile.in index 3189731ad..ef18d120a 100644 --- a/Makefile.in +++ b/Makefile.in @@ -128,9 +128,9 @@ util/config_file.c util/configlexer.c util/configparser.c \ util/shm_side/shm_main.c services/authzone.c \ util/fptr_wlist.c util/locks.c util/log.c util/mini_event.c util/module.c \ util/netevent.c util/net_help.c util/random.c util/rbtree.c util/regional.c \ -util/rtt.c util/edns.c util/storage/dnstree.c util/storage/lookup3.c \ +util/rtt.c util/siphash.c util/edns.c util/storage/dnstree.c util/storage/lookup3.c \ util/storage/lruhash.c util/storage/slabhash.c util/tcp_conn_limit.c \ -util/timehist.c util/tube.c \ +util/timehist.c util/tube.c util/proxy_protocol.c \ util/ub_event.c util/ub_event_pluggable.c util/winsock_event.c \ validator/autotrust.c validator/val_anchor.c validator/validator.c \ validator/val_kcache.c validator/val_kentry.c validator/val_neg.c \ @@ -145,10 +145,10 @@ as112.lo msgparse.lo msgreply.lo packed_rrset.lo iterator.lo iter_delegpt.lo \ iter_donotq.lo iter_fwd.lo iter_hints.lo iter_priv.lo iter_resptype.lo \ iter_scrub.lo iter_utils.lo localzone.lo mesh.lo modstack.lo view.lo \ outbound_list.lo alloc.lo config_file.lo configlexer.lo configparser.lo \ -fptr_wlist.lo edns.lo locks.lo log.lo mini_event.lo module.lo net_help.lo \ +fptr_wlist.lo siphash.lo edns.lo locks.lo log.lo mini_event.lo module.lo net_help.lo \ random.lo rbtree.lo regional.lo rtt.lo dnstree.lo lookup3.lo lruhash.lo \ slabhash.lo tcp_conn_limit.lo timehist.lo tube.lo winsock_event.lo \ -autotrust.lo val_anchor.lo rpz.lo \ +autotrust.lo val_anchor.lo rpz.lo proxy_protocol.lo \ validator.lo val_kcache.lo val_kentry.lo val_neg.lo val_nsec3.lo val_nsec.lo \ val_secalgo.lo val_sigcrypt.lo val_utils.lo dns64.lo $(CACHEDB_OBJ) authzone.lo \ $(SUBNET_OBJ) $(PYTHONMOD_OBJ) $(CHECKLOCK_OBJ) $(DNSTAP_OBJ) $(DNSCRYPT_OBJ) \ @@ -915,7 +915,8 @@ config_file.lo config_file.o: $(srcdir)/util/config_file.c config.h $(srcdir)/ut configlexer.lo configlexer.o: util/configlexer.c config.h $(srcdir)/util/configyyrename.h \ $(srcdir)/util/config_file.h util/configparser.h configparser.lo configparser.o: util/configparser.c config.h $(srcdir)/util/configyyrename.h \ - $(srcdir)/util/config_file.h $(srcdir)/util/net_help.h $(srcdir)/util/log.h + $(srcdir)/util/config_file.h $(srcdir)/util/net_help.h $(srcdir)/util/log.h $(srcdir)/sldns/str2wire.h \ + $(srcdir)/sldns/rrdef.h shm_main.lo shm_main.o: $(srcdir)/util/shm_side/shm_main.c config.h $(srcdir)/util/shm_side/shm_main.h \ $(srcdir)/libunbound/unbound.h $(srcdir)/daemon/daemon.h $(srcdir)/util/locks.h $(srcdir)/util/log.h \ $(srcdir)/util/alloc.h $(srcdir)/services/modstack.h \ @@ -984,6 +985,8 @@ netevent.lo netevent.o: $(srcdir)/util/netevent.c config.h $(srcdir)/util/neteve $(srcdir)/sldns/sbuffer.h $(srcdir)/util/config_file.h $(srcdir)/services/authzone.h $(srcdir)/daemon/stats.h \ $(srcdir)/util/timehist.h $(srcdir)/libunbound/unbound.h $(srcdir)/respip/respip.h $(srcdir)/sldns/str2wire.h \ $(srcdir)/dnstap/dnstap.h $(srcdir)/services/listen_dnsport.h +proxy_protocol.lo proxy_protocol.o: $(srcdir)/util/proxy_protocol.c config.h \ + $(srcdir)/util/proxy_protocol.h $(srcdir)/sldns/sbuffer.h net_help.lo net_help.o: $(srcdir)/util/net_help.c config.h $(srcdir)/util/net_help.h $(srcdir)/util/log.h \ $(srcdir)/util/data/dname.h $(srcdir)/util/storage/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/module.h \ $(srcdir)/util/data/msgreply.h $(srcdir)/util/data/packed_rrset.h $(srcdir)/util/data/msgparse.h \ @@ -1004,6 +1007,7 @@ rtt.lo rtt.o: $(srcdir)/util/rtt.c config.h $(srcdir)/util/rtt.h $(srcdir)/itera $(srcdir)/services/outbound_list.h $(srcdir)/util/data/msgreply.h $(srcdir)/util/storage/lruhash.h \ $(srcdir)/util/locks.h $(srcdir)/util/log.h $(srcdir)/util/data/packed_rrset.h $(srcdir)/util/module.h \ $(srcdir)/util/data/msgparse.h $(srcdir)/sldns/pkthdr.h $(srcdir)/sldns/rrdef.h +siphash.lo siphash.o: $(srcdir)/util/siphash.c edns.lo edns.o: $(srcdir)/util/edns.c config.h $(srcdir)/util/edns.h $(srcdir)/util/storage/dnstree.h \ $(srcdir)/util/rbtree.h $(srcdir)/util/config_file.h $(srcdir)/util/netevent.h $(srcdir)/dnscrypt/dnscrypt.h \ $(srcdir)/util/net_help.h $(srcdir)/util/log.h $(srcdir)/util/regional.h \ @@ -1512,7 +1516,7 @@ asynclook.lo asynclook.o: $(srcdir)/testcode/asynclook.c config.h $(srcdir)/libu $(srcdir)/services/modstack.h $(srcdir)/libunbound/unbound-event.h $(srcdir)/util/data/packed_rrset.h \ $(srcdir)/util/storage/lruhash.h $(srcdir)/sldns/rrdef.h streamtcp.lo streamtcp.o: $(srcdir)/testcode/streamtcp.c config.h $(srcdir)/util/locks.h $(srcdir)/util/log.h \ - $(srcdir)/util/net_help.h $(srcdir)/util/data/msgencode.h $(srcdir)/util/data/msgparse.h \ + $(srcdir)/util/net_help.h $(srcdir)/util/proxy_protocol.h $(srcdir)/util/data/msgencode.h $(srcdir)/util/data/msgparse.h \ $(srcdir)/util/storage/lruhash.h $(srcdir)/sldns/pkthdr.h $(srcdir)/sldns/rrdef.h $(srcdir)/util/data/msgreply.h \ $(srcdir)/util/data/packed_rrset.h $(srcdir)/util/data/dname.h $(srcdir)/sldns/sbuffer.h \ $(srcdir)/sldns/str2wire.h $(srcdir)/sldns/wire2str.h diff --git a/acx_nlnetlabs.m4 b/acx_nlnetlabs.m4 index 1574f97bf..cf436ec54 100644 --- a/acx_nlnetlabs.m4 +++ b/acx_nlnetlabs.m4 @@ -2,7 +2,8 @@ # Copyright 2009, Wouter Wijngaards, NLnet Labs. # BSD licensed. # -# Version 43 +# Version 44 +# 2022-09-01 fix checking if nonblocking sockets work on OpenBSD. # 2021-08-17 fix sed script in ssldir split handling. # 2021-08-17 fix for openssl to detect split version, with ssldir_include # and ssldir_lib output directories. @@ -963,6 +964,9 @@ AC_LANG_SOURCE([[ #ifdef HAVE_SYS_TYPES_H #include #endif +#ifdef HAVE_SYS_SELECT_H +#include +#endif #ifdef HAVE_SYS_SOCKET_H #include #endif diff --git a/cachedb/cachedb.c b/cachedb/cachedb.c index b07743d85..6f987fc03 100644 --- a/cachedb/cachedb.c +++ b/cachedb/cachedb.c @@ -390,6 +390,15 @@ prep_data(struct module_qstate* qstate, struct sldns_buffer* buf) if(!qstate->return_msg || !qstate->return_msg->rep) return 0; + /* do not store failures like SERVFAIL in the cachedb, this avoids + * overwriting expired, valid, content with broken content. */ + if(FLAGS_GET_RCODE(qstate->return_msg->rep->flags) != + LDNS_RCODE_NOERROR && + FLAGS_GET_RCODE(qstate->return_msg->rep->flags) != + LDNS_RCODE_NXDOMAIN && + FLAGS_GET_RCODE(qstate->return_msg->rep->flags) != + LDNS_RCODE_YXDOMAIN) + return 0; /* We don't store the reply if its TTL is 0 unless serve-expired is * enabled. Such a reply won't be reusable and simply be a waste for * the backend. It's also compatible with the default behavior of diff --git a/compat/arc4random.c b/compat/arc4random.c index b536d3143..486ab89c6 100644 --- a/compat/arc4random.c +++ b/compat/arc4random.c @@ -57,6 +57,8 @@ #define BLOCKSZ 64 #define RSBUFSZ (16*BLOCKSZ) +#define REKEY_BASE (1024*1024) /* NB. should be a power of 2 */ + /* Marked MAP_INHERIT_ZERO, so zero'd out in fork children. */ static struct { size_t rs_have; /* valid bytes at end of rs_buf */ @@ -179,6 +181,7 @@ static void _rs_stir(void) { u_char rnd[KEYSZ + IVSZ]; + uint32_t rekey_fuzz = 0; if (getentropy(rnd, sizeof rnd) == -1) { if(errno != ENOSYS || @@ -201,7 +204,10 @@ _rs_stir(void) rs->rs_have = 0; memset(rsx->rs_buf, 0, sizeof(rsx->rs_buf)); - rs->rs_count = 1600000; + /* rekey interval should not be predictable */ + chacha_encrypt_bytes(&rsx->rs_chacha, (uint8_t *)&rekey_fuzz, + (uint8_t *)&rekey_fuzz, sizeof(rekey_fuzz)); + rs->rs_count = REKEY_BASE + (rekey_fuzz % REKEY_BASE); } static inline void diff --git a/config.h.in b/config.h.in index cc1fbe864..2caecf30d 100644 --- a/config.h.in +++ b/config.h.in @@ -298,6 +298,9 @@ /* Define to 1 if you have the `getrlimit' function. */ #undef HAVE_GETRLIMIT +/* Define to 1 if you have the `gettid' function. */ +#undef HAVE_GETTID + /* Define to 1 if you have the `glob' function. */ #undef HAVE_GLOB @@ -457,6 +460,12 @@ /* Define to 1 if you have the `OSSL_PARAM_BLD_new' function. */ #undef HAVE_OSSL_PARAM_BLD_NEW +/* Define to 1 if you have the `poll' function. */ +#undef HAVE_POLL + +/* Define to 1 if you have the header file. */ +#undef HAVE_POLL_H + /* Define if you have POSIX threads libraries and header files. */ #undef HAVE_PTHREAD @@ -800,12 +809,18 @@ /* Shared data */ #undef SHARE_DIR +/* The size of `pthread_t', as computed by sizeof. */ +#undef SIZEOF_PTHREAD_T + /* The size of `size_t', as computed by sizeof. */ #undef SIZEOF_SIZE_T /* The size of `time_t', as computed by sizeof. */ #undef SIZEOF_TIME_T +/* The size of `unsigned long', as computed by sizeof. */ +#undef SIZEOF_UNSIGNED_LONG + /* define if (v)snprintf does not return length needed, (but length used) */ #undef SNPRINTF_RET_BROKEN diff --git a/configure b/configure index f40187910..5823e49f2 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.69 for unbound 1.16.3. +# Generated by GNU Autoconf 2.69 for unbound 1.17.1. # # Report bugs to . # @@ -591,8 +591,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='unbound' PACKAGE_TARNAME='unbound' -PACKAGE_VERSION='1.16.3' -PACKAGE_STRING='unbound 1.16.3' +PACKAGE_VERSION='1.17.1' +PACKAGE_STRING='unbound 1.17.1' PACKAGE_BUGREPORT='unbound-bugs@nlnetlabs.nl or https://github.com/NLnetLabs/unbound/issues' PACKAGE_URL='' @@ -1477,7 +1477,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.16.3 to adapt to many kinds of systems. +\`configure' configures unbound 1.17.1 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1543,7 +1543,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of unbound 1.16.3:";; + short | recursive ) echo "Configuration of unbound 1.17.1:";; esac cat <<\_ACEOF @@ -1785,7 +1785,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -unbound configure 1.16.3 +unbound configure 1.17.1 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -2494,7 +2494,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.16.3, which was +It was created by unbound $as_me 1.17.1, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -2844,13 +2844,13 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu UNBOUND_VERSION_MAJOR=1 -UNBOUND_VERSION_MINOR=16 +UNBOUND_VERSION_MINOR=17 -UNBOUND_VERSION_MICRO=3 +UNBOUND_VERSION_MICRO=1 LIBUNBOUND_CURRENT=9 -LIBUNBOUND_REVISION=19 +LIBUNBOUND_REVISION=21 LIBUNBOUND_AGE=1 # 1.0.0 had 0:12:0 # 1.0.1 had 0:13:0 @@ -2937,6 +2937,8 @@ LIBUNBOUND_AGE=1 # 1.16.1 had 9:17:1 # 1.16.2 had 9:18:1 # 1.16.3 had 9:19:1 +# 1.17.0 had 9:20:1 +# 1.17.1 had 9:21:1 # Current -- the number of the binary API that we're implementing # Revision -- which iteration of the implementation of the binary @@ -14772,7 +14774,7 @@ fi fi # Checks for header files. -for ac_header in stdarg.h stdbool.h netinet/in.h netinet/tcp.h sys/param.h sys/select.h sys/socket.h sys/un.h sys/uio.h sys/resource.h arpa/inet.h syslog.h netdb.h sys/wait.h pwd.h glob.h grp.h login_cap.h winsock2.h ws2tcpip.h endian.h sys/endian.h libkern/OSByteOrder.h sys/ipc.h sys/shm.h ifaddrs.h +for ac_header in stdarg.h stdbool.h netinet/in.h netinet/tcp.h sys/param.h sys/select.h sys/socket.h sys/un.h sys/uio.h sys/resource.h arpa/inet.h syslog.h netdb.h sys/wait.h pwd.h glob.h grp.h login_cap.h winsock2.h ws2tcpip.h endian.h sys/endian.h libkern/OSByteOrder.h sys/ipc.h sys/shm.h ifaddrs.h poll.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default @@ -16031,6 +16033,9 @@ else #ifdef HAVE_SYS_TYPES_H #include #endif +#ifdef HAVE_SYS_SELECT_H +#include +#endif #ifdef HAVE_SYS_SOCKET_H #include #endif @@ -17101,6 +17106,72 @@ _ACEOF fi + # The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of unsigned long" >&5 +$as_echo_n "checking size of unsigned long... " >&6; } +if ${ac_cv_sizeof_unsigned_long+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (unsigned long))" "ac_cv_sizeof_unsigned_long" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_unsigned_long" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (unsigned long) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_unsigned_long=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_unsigned_long" >&5 +$as_echo "$ac_cv_sizeof_unsigned_long" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_UNSIGNED_LONG $ac_cv_sizeof_unsigned_long +_ACEOF + + + # The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of pthread_t" >&5 +$as_echo_n "checking size of pthread_t... " >&6; } +if ${ac_cv_sizeof_pthread_t+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (pthread_t))" "ac_cv_sizeof_pthread_t" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_pthread_t" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (pthread_t) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_pthread_t=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_pthread_t" >&5 +$as_echo "$ac_cv_sizeof_pthread_t" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_PTHREAD_T $ac_cv_sizeof_pthread_t +_ACEOF + + if echo "$CFLAGS" | $GREP -e "-pthread" >/dev/null; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if -pthread unused during linking" >&5 @@ -20591,7 +20662,7 @@ if test "$ac_res" != no; then : fi -for ac_func in tzset sigprocmask fcntl getpwnam endpwent getrlimit setrlimit setsid chroot kill chown sleep usleep random srandom recvmsg sendmsg writev socketpair glob initgroups strftime localtime_r setusercontext _beginthreadex endservent endprotoent fsync shmget accept4 getifaddrs if_nametoindex +for ac_func in tzset sigprocmask fcntl getpwnam endpwent getrlimit setrlimit setsid chroot kill chown sleep usleep random srandom recvmsg sendmsg writev socketpair glob initgroups strftime localtime_r setusercontext _beginthreadex endservent endprotoent fsync shmget accept4 getifaddrs if_nametoindex poll gettid do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" @@ -22015,7 +22086,7 @@ _ACEOF -version=1.16.3 +version=1.17.1 date=`date +'%b %e, %Y'` @@ -22534,7 +22605,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.16.3, which was +This file was extended by unbound $as_me 1.17.1, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -22600,7 +22671,7 @@ _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -unbound config.status 1.16.3 +unbound config.status 1.17.1 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" diff --git a/configure.ac b/configure.ac index bf8aa9d8c..2c7583310 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],[16]) -m4_define([VERSION_MICRO],[3]) +m4_define([VERSION_MINOR],[17]) +m4_define([VERSION_MICRO],[1]) 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=19 +LIBUNBOUND_REVISION=21 LIBUNBOUND_AGE=1 # 1.0.0 had 0:12:0 # 1.0.1 had 0:13:0 @@ -105,6 +105,8 @@ LIBUNBOUND_AGE=1 # 1.16.1 had 9:17:1 # 1.16.2 had 9:18:1 # 1.16.3 had 9:19:1 +# 1.17.0 had 9:20:1 +# 1.17.1 had 9:21:1 # Current -- the number of the binary API that we're implementing # Revision -- which iteration of the implementation of the binary @@ -397,7 +399,7 @@ PKG_PROG_PKG_CONFIG fi # Checks for header files. -AC_CHECK_HEADERS([stdarg.h stdbool.h netinet/in.h netinet/tcp.h sys/param.h sys/select.h sys/socket.h sys/un.h sys/uio.h sys/resource.h arpa/inet.h syslog.h netdb.h sys/wait.h pwd.h glob.h grp.h login_cap.h winsock2.h ws2tcpip.h endian.h sys/endian.h libkern/OSByteOrder.h sys/ipc.h sys/shm.h ifaddrs.h],,, [AC_INCLUDES_DEFAULT]) +AC_CHECK_HEADERS([stdarg.h stdbool.h netinet/in.h netinet/tcp.h sys/param.h sys/select.h sys/socket.h sys/un.h sys/uio.h sys/resource.h arpa/inet.h syslog.h netdb.h sys/wait.h pwd.h glob.h grp.h login_cap.h winsock2.h ws2tcpip.h endian.h sys/endian.h libkern/OSByteOrder.h sys/ipc.h sys/shm.h ifaddrs.h poll.h],,, [AC_INCLUDES_DEFAULT]) # net/if.h portability for Darwin see: # https://www.gnu.org/software/autoconf/manual/autoconf-2.69/html_node/Header-Portability.html AC_CHECK_HEADERS([net/if.h],,, [ @@ -607,6 +609,8 @@ if test x_$withval != x_no; then CC="$PTHREAD_CC" ub_have_pthreads=yes AC_CHECK_TYPES([pthread_spinlock_t, pthread_rwlock_t],,,[#include ]) + AC_CHECK_SIZEOF([unsigned long]) + AC_CHECK_SIZEOF(pthread_t) if echo "$CFLAGS" | $GREP -e "-pthread" >/dev/null; then AC_MSG_CHECKING([if -pthread unused during linking]) @@ -1644,7 +1648,7 @@ AC_LINK_IFELSE([AC_LANG_PROGRAM([ AC_MSG_RESULT(no)) AC_SEARCH_LIBS([setusercontext], [util]) -AC_CHECK_FUNCS([tzset sigprocmask fcntl getpwnam endpwent getrlimit setrlimit setsid chroot kill chown sleep usleep random srandom recvmsg sendmsg writev socketpair glob initgroups strftime localtime_r setusercontext _beginthreadex endservent endprotoent fsync shmget accept4 getifaddrs if_nametoindex]) +AC_CHECK_FUNCS([tzset sigprocmask fcntl getpwnam endpwent getrlimit setrlimit setsid chroot kill chown sleep usleep random srandom recvmsg sendmsg writev socketpair glob initgroups strftime localtime_r setusercontext _beginthreadex endservent endprotoent fsync shmget accept4 getifaddrs if_nametoindex poll gettid]) AC_CHECK_FUNCS([setresuid],,[AC_CHECK_FUNCS([setreuid])]) AC_CHECK_FUNCS([setresgid],,[AC_CHECK_FUNCS([setregid])]) diff --git a/daemon/acl_list.c b/daemon/acl_list.c index aecb3e0c6..83cfd7ddf 100644 --- a/daemon/acl_list.c +++ b/daemon/acl_list.c @@ -46,9 +46,10 @@ #include "util/config_file.h" #include "util/net_help.h" #include "services/localzone.h" +#include "services/listen_dnsport.h" #include "sldns/str2wire.h" -struct acl_list* +struct acl_list* acl_list_create(void) { struct acl_list* acl = (struct acl_list*)calloc(1, @@ -63,10 +64,10 @@ acl_list_create(void) return acl; } -void +void acl_list_delete(struct acl_list* acl) { - if(!acl) + if(!acl) return; regional_destroy(acl->region); free(acl); @@ -74,8 +75,8 @@ acl_list_delete(struct acl_list* acl) /** insert new address into acl_list structure */ static struct acl_addr* -acl_list_insert(struct acl_list* acl, struct sockaddr_storage* addr, - socklen_t addrlen, int net, enum acl_access control, +acl_list_insert(struct acl_list* acl, struct sockaddr_storage* addr, + socklen_t addrlen, int net, enum acl_access control, int complain_duplicates) { struct acl_addr* node = regional_alloc_zero(acl->region, @@ -90,6 +91,33 @@ acl_list_insert(struct acl_list* acl, struct sockaddr_storage* addr, return node; } +/** parse str to acl_access enum */ +static int +parse_acl_access(const char* str, enum acl_access* control) +{ + if(strcmp(str, "allow") == 0) + *control = acl_allow; + else if(strcmp(str, "deny") == 0) + *control = acl_deny; + else if(strcmp(str, "refuse") == 0) + *control = acl_refuse; + else if(strcmp(str, "deny_non_local") == 0) + *control = acl_deny_non_local; + else if(strcmp(str, "refuse_non_local") == 0) + *control = acl_refuse_non_local; + else if(strcmp(str, "allow_snoop") == 0) + *control = acl_allow_snoop; + else if(strcmp(str, "allow_setrd") == 0) + *control = acl_allow_setrd; + else if (strcmp(str, "allow_cookie") == 0) + *control = acl_allow_cookie; + else { + log_err("access control type %s unknown", str); + return 0; + } + return 1; +} + /** apply acl_list string */ static int acl_list_str_cfg(struct acl_list* acl, const char* str, const char* s2, @@ -99,29 +127,14 @@ acl_list_str_cfg(struct acl_list* acl, const char* str, const char* s2, int net; socklen_t addrlen; enum acl_access control; - if(strcmp(s2, "allow") == 0) - control = acl_allow; - else if(strcmp(s2, "deny") == 0) - control = acl_deny; - else if(strcmp(s2, "refuse") == 0) - control = acl_refuse; - else if(strcmp(s2, "deny_non_local") == 0) - control = acl_deny_non_local; - else if(strcmp(s2, "refuse_non_local") == 0) - control = acl_refuse_non_local; - else if(strcmp(s2, "allow_snoop") == 0) - control = acl_allow_snoop; - else if(strcmp(s2, "allow_setrd") == 0) - control = acl_allow_setrd; - else { - log_err("access control type %s unknown", str); + if(!parse_acl_access(s2, &control)) { return 0; } if(!netblockstrtoaddr(str, UNBOUND_DNS_PORT, &addr, &addrlen, &net)) { log_err("cannot parse access control: %s %s", str, s2); return 0; } - if(!acl_list_insert(acl, &addr, addrlen, net, control, + if(!acl_list_insert(acl, &addr, addrlen, net, control, complain_duplicates)) { log_err("out of memory"); return 0; @@ -131,19 +144,27 @@ acl_list_str_cfg(struct acl_list* acl, const char* str, const char* s2, /** find or create node (NULL on parse or error) */ static struct acl_addr* -acl_find_or_create(struct acl_list* acl, const char* str) +acl_find_or_create_str2addr(struct acl_list* acl, const char* str, + int is_interface, int port) { struct acl_addr* node; struct sockaddr_storage addr; - int net; socklen_t addrlen; - if(!netblockstrtoaddr(str, UNBOUND_DNS_PORT, &addr, &addrlen, &net)) { - log_err("cannot parse netblock: %s", str); - return NULL; + int net = (str_is_ip6(str)?128:32); + if(is_interface) { + if(!extstrtoaddr(str, &addr, &addrlen, port)) { + log_err("cannot parse interface: %s", str); + return NULL; + } + } else { + if(!netblockstrtoaddr(str, UNBOUND_DNS_PORT, &addr, &addrlen, &net)) { + log_err("cannot parse netblock: %s", str); + return NULL; + } } /* find or create node */ if(!(node=(struct acl_addr*)addr_tree_find(&acl->tree, &addr, - addrlen, net))) { + addrlen, net)) && !is_interface) { /* create node, type 'allow' since otherwise tags are * pointless, can override with specific access-control: cfg */ if(!(node=(struct acl_addr*)acl_list_insert(acl, &addr, @@ -155,14 +176,65 @@ acl_find_or_create(struct acl_list* acl, const char* str) return node; } +/** find or create node (NULL on error) */ +static struct acl_addr* +acl_find_or_create(struct acl_list* acl, struct sockaddr_storage* addr, + socklen_t addrlen, enum acl_access control) +{ + struct acl_addr* node; + int net = (addr_is_ip6(addr, addrlen)?128:32); + /* find or create node */ + if(!(node=(struct acl_addr*)addr_tree_find(&acl->tree, addr, + addrlen, net))) { + /* create node; + * can override with specific access-control: cfg */ + if(!(node=(struct acl_addr*)acl_list_insert(acl, addr, + addrlen, net, control, 1))) { + log_err("out of memory"); + return NULL; + } + } + return node; +} + +/** apply acl_interface string */ +static int +acl_interface_str_cfg(struct acl_list* acl_interface, const char* iface, + const char* s2, int port) +{ + struct acl_addr* node; + enum acl_access control; + if(!parse_acl_access(s2, &control)) { + return 0; + } + if(!(node=acl_find_or_create_str2addr(acl_interface, iface, 1, port))) { + log_err("cannot update ACL on non-configured interface: %s %d", + iface, port); + return 0; + } + node->control = control; + return 1; +} + +struct acl_addr* +acl_interface_insert(struct acl_list* acl_interface, + struct sockaddr_storage* addr, socklen_t addrlen, + enum acl_access control) +{ + return acl_find_or_create(acl_interface, addr, addrlen, control); +} + /** apply acl_tag string */ static int acl_list_tags_cfg(struct acl_list* acl, const char* str, uint8_t* bitmap, - size_t bitmaplen) + size_t bitmaplen, int is_interface, int port) { struct acl_addr* node; - if(!(node=acl_find_or_create(acl, str))) + if(!(node=acl_find_or_create_str2addr(acl, str, is_interface, port))) { + if(is_interface) + log_err("non-configured interface: %s", str); return 0; + } node->taglen = bitmaplen; node->taglist = regional_alloc_init(acl->region, bitmap, bitmaplen); if(!node->taglist) { @@ -175,11 +247,14 @@ acl_list_tags_cfg(struct acl_list* acl, const char* str, uint8_t* bitmap, /** apply acl_view string */ static int acl_list_view_cfg(struct acl_list* acl, const char* str, const char* str2, - struct views* vs) + struct views* vs, int is_interface, int port) { struct acl_addr* node; - if(!(node=acl_find_or_create(acl, str))) + if(!(node=acl_find_or_create_str2addr(acl, str, is_interface, port))) { + if(is_interface) + log_err("non-configured interface: %s", str); return 0; + } node->view = views_find_view(vs, str2, 0 /* get read lock*/); if(!node->view) { log_err("no view with name: %s", str2); @@ -192,13 +267,17 @@ acl_list_view_cfg(struct acl_list* acl, const char* str, const char* str2, /** apply acl_tag_action string */ static int acl_list_tag_action_cfg(struct acl_list* acl, struct config_file* cfg, - const char* str, const char* tag, const char* action) + const char* str, const char* tag, const char* action, + int is_interface, int port) { struct acl_addr* node; int tagid; enum localzone_type t; - if(!(node=acl_find_or_create(acl, str))) + if(!(node=acl_find_or_create_str2addr(acl, str, is_interface, port))) { + if(is_interface) + log_err("non-configured interface: %s", str); return 0; + } /* allocate array if not yet */ if(!node->tag_actions) { node->tag_actions = (uint8_t*)regional_alloc_zero(acl->region, @@ -281,13 +360,17 @@ check_data(const char* data, const struct config_strlist* head) /** apply acl_tag_data string */ static int acl_list_tag_data_cfg(struct acl_list* acl, struct config_file* cfg, - const char* str, const char* tag, const char* data) + const char* str, const char* tag, const char* data, + int is_interface, int port) { struct acl_addr* node; int tagid; char* dupdata; - if(!(node=acl_find_or_create(acl, str))) + if(!(node=acl_find_or_create_str2addr(acl, str, is_interface, port))) { + if(is_interface) + log_err("non-configured interface: %s", str); return 0; + } /* allocate array if not yet */ if(!node->tag_datas) { node->tag_datas = (struct config_strlist**)regional_alloc_zero( @@ -329,11 +412,11 @@ acl_list_tag_data_cfg(struct acl_list* acl, struct config_file* cfg, } /** read acl_list config */ -static int -read_acl_list(struct acl_list* acl, struct config_file* cfg) +static int +read_acl_list(struct acl_list* acl, struct config_str2list* acls) { struct config_str2list* p; - for(p = cfg->acls; p; p = p->next) { + for(p = acls; p; p = p->next) { log_assert(p->str && p->str2); if(!acl_list_str_cfg(acl, p->str, p->str2, 1)) return 0; @@ -341,15 +424,38 @@ read_acl_list(struct acl_list* acl, struct config_file* cfg) return 1; } -/** read acl tags config */ -static int -read_acl_tags(struct acl_list* acl, struct config_file* cfg) +/** read acl view config */ +static int +read_acl_view(struct acl_list* acl, struct config_str2list** acl_view, + struct views* v) { - struct config_strbytelist* np, *p = cfg->acl_tags; - cfg->acl_tags = NULL; + struct config_str2list* np, *p = *acl_view; + *acl_view = NULL; while(p) { log_assert(p->str && p->str2); - if(!acl_list_tags_cfg(acl, p->str, p->str2, p->str2len)) { + if(!acl_list_view_cfg(acl, p->str, p->str2, v, 0, 0)) { + config_deldblstrlist(p); + return 0; + } + /* free the items as we go to free up memory */ + np = p->next; + free(p->str); + free(p->str2); + free(p); + p = np; + } + return 1; +} + +/** read acl tags config */ +static int +read_acl_tags(struct acl_list* acl, struct config_strbytelist** acl_tags) +{ + struct config_strbytelist* np, *p = *acl_tags; + *acl_tags = NULL; + while(p) { + log_assert(p->str && p->str2); + if(!acl_list_tags_cfg(acl, p->str, p->str2, p->str2len, 0, 0)) { config_del_strbytelist(p); return 0; } @@ -363,38 +469,18 @@ read_acl_tags(struct acl_list* acl, struct config_file* cfg) return 1; } -/** read acl view config */ -static int -read_acl_view(struct acl_list* acl, struct config_file* cfg, struct views* v) -{ - struct config_str2list* np, *p = cfg->acl_view; - cfg->acl_view = NULL; - while(p) { - log_assert(p->str && p->str2); - if(!acl_list_view_cfg(acl, p->str, p->str2, v)) { - return 0; - } - /* free the items as we go to free up memory */ - np = p->next; - free(p->str); - free(p->str2); - free(p); - p = np; - } - return 1; -} - /** read acl tag actions config */ -static int -read_acl_tag_actions(struct acl_list* acl, struct config_file* cfg) +static int +read_acl_tag_actions(struct acl_list* acl, struct config_file* cfg, + struct config_str3list** acl_tag_actions) { struct config_str3list* p, *np; - p = cfg->acl_tag_actions; - cfg->acl_tag_actions = NULL; + p = *acl_tag_actions; + *acl_tag_actions = NULL; while(p) { log_assert(p->str && p->str2 && p->str3); if(!acl_list_tag_action_cfg(acl, cfg, p->str, p->str2, - p->str3)) { + p->str3, 0, 0)) { config_deltrplstrlist(p); return 0; } @@ -410,15 +496,17 @@ read_acl_tag_actions(struct acl_list* acl, struct config_file* cfg) } /** read acl tag datas config */ -static int -read_acl_tag_datas(struct acl_list* acl, struct config_file* cfg) +static int +read_acl_tag_datas(struct acl_list* acl, struct config_file* cfg, + struct config_str3list** acl_tag_datas) { struct config_str3list* p, *np; - p = cfg->acl_tag_datas; - cfg->acl_tag_datas = NULL; + p = *acl_tag_datas; + *acl_tag_datas = NULL; while(p) { log_assert(p->str && p->str2 && p->str3); - if(!acl_list_tag_data_cfg(acl, cfg, p->str, p->str2, p->str3)) { + if(!acl_list_tag_data_cfg(acl, cfg, p->str, p->str2, p->str3, + 0, 0)) { config_deltrplstrlist(p); return 0; } @@ -433,30 +521,27 @@ read_acl_tag_datas(struct acl_list* acl, struct config_file* cfg) return 1; } -int +int acl_list_apply_cfg(struct acl_list* acl, struct config_file* cfg, struct views* v) { regional_free_all(acl->region); addr_tree_init(&acl->tree); - if(!read_acl_list(acl, cfg)) + if(!read_acl_list(acl, cfg->acls)) return 0; - if(!read_acl_view(acl, cfg, v)) + if(!read_acl_view(acl, &cfg->acl_view, v)) return 0; - if(!read_acl_tags(acl, cfg)) + if(!read_acl_tags(acl, &cfg->acl_tags)) return 0; - if(!read_acl_tag_actions(acl, cfg)) + if(!read_acl_tag_actions(acl, cfg, &cfg->acl_tag_actions)) return 0; - if(!read_acl_tag_datas(acl, cfg)) + if(!read_acl_tag_datas(acl, cfg, &cfg->acl_tag_datas)) return 0; /* insert defaults, with '0' to ignore them if they are duplicates */ - if(!acl_list_str_cfg(acl, "0.0.0.0/0", "refuse", 0)) - return 0; + /* the 'refuse' defaults for /0 are now done per interface instead */ if(!acl_list_str_cfg(acl, "127.0.0.0/8", "allow", 0)) return 0; if(cfg->do_ip6) { - if(!acl_list_str_cfg(acl, "::0/0", "refuse", 0)) - return 0; if(!acl_list_str_cfg(acl, "::1", "allow", 0)) return 0; if(!acl_list_str_cfg(acl, "::ffff:127.0.0.1", "allow", 0)) @@ -466,7 +551,223 @@ acl_list_apply_cfg(struct acl_list* acl, struct config_file* cfg, return 1; } -enum acl_access +int +acl_interface_compare(const void* k1, const void* k2) +{ + struct addr_tree_node* n1 = (struct addr_tree_node*)k1; + struct addr_tree_node* n2 = (struct addr_tree_node*)k2; + return sockaddr_cmp(&n1->addr, n1->addrlen, &n2->addr, + n2->addrlen); + /* We don't care about comparing node->net. All addresses in the + * acl_interface tree have either 32 (ipv4) or 128 (ipv6). */ +} + +void +acl_interface_init(struct acl_list* acl_interface) +{ + regional_free_all(acl_interface->region); + /* We want comparison in the tree to include only address and port. + * We don't care about comparing node->net. All addresses in the + * acl_interface->tree should have either 32 (ipv4) or 128 (ipv6). + * Initialise with the appropriate compare function but keep treating + * it as an addr_tree. */ + addr_tree_addrport_init(&acl_interface->tree); +} + +static int +read_acl_interface_action(struct acl_list* acl_interface, + struct config_str2list* acls, int port) +{ + struct config_str2list* p; + for(p = acls; p; p = p->next) { + char** resif = NULL; + int num_resif = 0; + int i; + log_assert(p->str && p->str2); + if(!resolve_interface_names(&p->str, 1, NULL, &resif, &num_resif)) + return 0; + for(i = 0; istr2, port)){ + config_del_strarray(resif, num_resif); + return 0; + } + } + config_del_strarray(resif, num_resif); + } + return 1; +} + +/** read acl view config for interface */ +static int +read_acl_interface_view(struct acl_list* acl_interface, + struct config_str2list** acl_view, + struct views* v, int port) +{ + struct config_str2list* np, *p = *acl_view; + *acl_view = NULL; + while(p) { + char** resif = NULL; + int num_resif = 0; + int i; + log_assert(p->str && p->str2); + if(!resolve_interface_names(&p->str, 1, NULL, &resif, &num_resif)) { + config_deldblstrlist(p); + return 0; + } + for(i = 0; istr2, + v, 1, port)) { + config_del_strarray(resif, num_resif); + config_deldblstrlist(p); + return 0; + } + } + config_del_strarray(resif, num_resif); + /* free the items as we go to free up memory */ + np = p->next; + free(p->str); + free(p->str2); + free(p); + p = np; + } + return 1; +} + +/** read acl tags config for interface */ +static int +read_acl_interface_tags(struct acl_list* acl_interface, + struct config_strbytelist** acl_tags, int port) +{ + struct config_strbytelist* np, *p = *acl_tags; + *acl_tags = NULL; + while(p) { + char** resif = NULL; + int num_resif = 0; + int i; + log_assert(p->str && p->str2); + if(!resolve_interface_names(&p->str, 1, NULL, &resif, &num_resif)) { + config_del_strbytelist(p); + return 0; + } + for(i = 0; istr2, + p->str2len, 1, port)) { + config_del_strbytelist(p); + config_del_strarray(resif, num_resif); + return 0; + } + } + config_del_strarray(resif, num_resif); + /* free the items as we go to free up memory */ + np = p->next; + free(p->str); + free(p->str2); + free(p); + p = np; + } + return 1; +} + +/** read acl tag actions config for interface*/ +static int +read_acl_interface_tag_actions(struct acl_list* acl_interface, + struct config_file* cfg, + struct config_str3list** acl_tag_actions, int port) +{ + struct config_str3list* p, *np; + p = *acl_tag_actions; + *acl_tag_actions = NULL; + while(p) { + char** resif = NULL; + int num_resif = 0; + int i; + log_assert(p->str && p->str2 && p->str3); + if(!resolve_interface_names(&p->str, 1, NULL, &resif, &num_resif)) { + config_deltrplstrlist(p); + return 0; + } + for(i = 0; istr2, p->str3, 1, port)) { + config_deltrplstrlist(p); + config_del_strarray(resif, num_resif); + return 0; + } + } + config_del_strarray(resif, num_resif); + /* free the items as we go to free up memory */ + np = p->next; + free(p->str); + free(p->str2); + free(p->str3); + free(p); + p = np; + } + return 1; +} + +/** read acl tag datas config for interface */ +static int +read_acl_interface_tag_datas(struct acl_list* acl_interface, + struct config_file* cfg, + struct config_str3list** acl_tag_datas, int port) +{ + struct config_str3list* p, *np; + p = *acl_tag_datas; + *acl_tag_datas = NULL; + while(p) { + char** resif = NULL; + int num_resif = 0; + int i; + log_assert(p->str && p->str2 && p->str3); + if(!resolve_interface_names(&p->str, 1, NULL, &resif, &num_resif)) { + config_deltrplstrlist(p); + return 0; + } + for(i = 0; istr2, p->str3, 1, port)) { + config_deltrplstrlist(p); + config_del_strarray(resif, num_resif); + return 0; + } + } + config_del_strarray(resif, num_resif); + /* free the items as we go to free up memory */ + np = p->next; + free(p->str); + free(p->str2); + free(p->str3); + free(p); + p = np; + } + return 1; +} + +int +acl_interface_apply_cfg(struct acl_list* acl_interface, struct config_file* cfg, + struct views* v) +{ + if(!read_acl_interface_action(acl_interface, cfg->interface_actions, + cfg->port)) + return 0; + if(!read_acl_interface_view(acl_interface, &cfg->interface_view, v, + cfg->port)) + return 0; + if(!read_acl_interface_tags(acl_interface, &cfg->interface_tags, + cfg->port)) + return 0; + if(!read_acl_interface_tag_actions(acl_interface, cfg, + &cfg->interface_tag_actions, cfg->port)) + return 0; + if(!read_acl_interface_tag_datas(acl_interface, cfg, + &cfg->interface_tag_datas, cfg->port)) + return 0; + addr_tree_init_parents(&acl_interface->tree); + return 1; +} + +enum acl_access acl_get_control(struct acl_addr* acl) { if(acl) return acl->control; @@ -481,7 +782,7 @@ acl_addr_lookup(struct acl_list* acl, struct sockaddr_storage* addr, addr, addrlen); } -size_t +size_t acl_list_get_mem(struct acl_list* acl) { if(!acl) return 0; diff --git a/daemon/acl_list.h b/daemon/acl_list.h index c09e832a1..8aece11bf 100644 --- a/daemon/acl_list.h +++ b/daemon/acl_list.h @@ -36,7 +36,7 @@ /** * \file * - * This file keeps track of the list of clients that are allowed to + * This file keeps track of the list of clients that are allowed to * access the server. */ @@ -65,7 +65,9 @@ enum acl_access { /** allow full access for all queries, recursion and cache snooping */ acl_allow_snoop, /** allow full access for recursion queries and set RD flag regardless of request */ - acl_allow_setrd + acl_allow_setrd, + /** allow full access if valid cookie present or stateful transport */ + acl_allow_cookie }; /** @@ -74,7 +76,7 @@ enum acl_access { struct acl_list { /** regional for allocation */ struct regional* region; - /** + /** * Tree of the addresses that are allowed/blocked. * contents of type acl_addr. */ @@ -108,7 +110,7 @@ struct acl_addr { }; /** - * Create acl structure + * Create acl structure * @return new structure or NULL on error. */ struct acl_list* acl_list_create(void); @@ -119,6 +121,20 @@ struct acl_list* acl_list_create(void); */ void acl_list_delete(struct acl_list* acl); +/** + * Insert interface in the acl_list. This should happen when the listening + * interface is setup. + * @param acl_interface: acl_list to insert to. + * @param addr: interface IP. + * @param addrlen: length of the interface IP. + * @param control: acl_access. + * @return new structure or NULL on error. + */ +struct acl_addr* +acl_interface_insert(struct acl_list* acl_interface, + struct sockaddr_storage* addr, socklen_t addrlen, + enum acl_access control); + /** * Process access control config. * @param acl: where to store. @@ -129,6 +145,25 @@ void acl_list_delete(struct acl_list* acl); int acl_list_apply_cfg(struct acl_list* acl, struct config_file* cfg, struct views* v); +/** compare ACL interface "addr_tree" nodes (+port) */ +int acl_interface_compare(const void* k1, const void* k2); + +/** + * Initialise (also clean) the acl_interface struct. + * @param acl_interface: where to store. + */ +void acl_interface_init(struct acl_list* acl_interface); + +/** + * Process interface control config. + * @param acl_interface: where to store. + * @param cfg: config options. + * @param v: views structure + * @return 0 on error. + */ +int acl_interface_apply_cfg(struct acl_list* acl_interface, struct config_file* cfg, + struct views* v); + /** * Lookup access control status for acl structure. * @param acl: structure for acl storage. diff --git a/daemon/daemon.c b/daemon/daemon.c index 4ed531855..71091133a 100644 --- a/daemon/daemon.c +++ b/daemon/daemon.c @@ -96,6 +96,9 @@ #ifdef HAVE_SYSTEMD #include #endif +#ifdef HAVE_NETDB_H +#include +#endif /** How many quit requests happened. */ static int sig_record_quit = 0; @@ -271,8 +274,17 @@ daemon_init(void) free(daemon); return NULL; } + daemon->acl_interface = acl_list_create(); + if(!daemon->acl_interface) { + acl_list_delete(daemon->acl); + edns_known_options_delete(daemon->env); + free(daemon->env); + free(daemon); + return NULL; + } daemon->tcl = tcl_list_create(); if(!daemon->tcl) { + acl_list_delete(daemon->acl_interface); acl_list_delete(daemon->acl); edns_known_options_delete(daemon->env); free(daemon->env); @@ -284,6 +296,7 @@ daemon_init(void) log_err("gettimeofday: %s", strerror(errno)); daemon->time_last_stat = daemon->time_boot; if((daemon->env->auth_zones = auth_zones_create()) == 0) { + acl_list_delete(daemon->acl_interface); acl_list_delete(daemon->acl); tcl_list_delete(daemon->tcl); edns_known_options_delete(daemon->env); @@ -293,6 +306,7 @@ daemon_init(void) } if(!(daemon->env->edns_strings = edns_strings_create())) { auth_zones_delete(daemon->env->auth_zones); + acl_list_delete(daemon->acl_interface); acl_list_delete(daemon->acl); tcl_list_delete(daemon->tcl); edns_known_options_delete(daemon->env); @@ -303,6 +317,29 @@ daemon_init(void) return daemon; } +static int setup_acl_for_ports(struct acl_list* list, + struct listen_port* port_list) +{ + struct acl_addr* acl_node; + struct addrinfo* addr; + for(; port_list; port_list=port_list->next) { + if(!port_list->socket) { + /* This is mainly for testbound where port_list is + * empty. */ + continue; + } + addr = port_list->socket->addr; + if(!(acl_node = acl_interface_insert(list, + (struct sockaddr_storage*)addr->ai_addr, + (socklen_t)addr->ai_addrlen, + acl_refuse))) { + return 0; + } + port_list->socket->acl = acl_node; + } + return 1; +} + int daemon_open_shared_ports(struct daemon* daemon) { @@ -320,6 +357,8 @@ daemon_open_shared_ports(struct daemon* daemon) free(daemon->ports); daemon->ports = NULL; } + /* clean acl_interface */ + acl_interface_init(daemon->acl_interface); if(!resolve_interface_names(daemon->cfg->ifs, daemon->cfg->num_ifs, NULL, &resif, &num_resif)) return 0; @@ -329,7 +368,8 @@ daemon_open_shared_ports(struct daemon* daemon) daemon->reuseport = 1; #endif /* try to use reuseport */ - p0 = listening_ports_open(daemon->cfg, resif, num_resif, &daemon->reuseport); + p0 = listening_ports_open(daemon->cfg, resif, num_resif, + &daemon->reuseport); if(!p0) { listening_ports_free(p0); config_del_strarray(resif, num_resif); @@ -350,6 +390,12 @@ daemon_open_shared_ports(struct daemon* daemon) return 0; } daemon->ports[0] = p0; + if(!setup_acl_for_ports(daemon->acl_interface, + daemon->ports[0])) { + listening_ports_free(p0); + config_del_strarray(resif, num_resif); + return 0; + } if(daemon->reuseport) { /* continue to use reuseport */ for(i=1; inum_ports; i++) { @@ -365,6 +411,15 @@ daemon_open_shared_ports(struct daemon* daemon) config_del_strarray(resif, num_resif); return 0; } + if(!setup_acl_for_ports(daemon->acl_interface, + daemon->ports[i])) { + for(i=0; inum_ports; i++) + listening_ports_free(daemon->ports[i]); + free(daemon->ports); + daemon->ports = NULL; + config_del_strarray(resif, num_resif); + return 0; + } } } config_del_strarray(resif, num_resif); @@ -604,6 +659,9 @@ daemon_fork(struct daemon* daemon) if(!acl_list_apply_cfg(daemon->acl, daemon->cfg, daemon->views)) fatal_exit("Could not setup access control list"); + if(!acl_interface_apply_cfg(daemon->acl_interface, daemon->cfg, + daemon->views)) + fatal_exit("Could not setup interface control list"); if(!tcl_list_apply_cfg(daemon->tcl, daemon->cfg)) fatal_exit("Could not setup TCP connection limits"); if(daemon->cfg->dnscrypt) { @@ -780,6 +838,7 @@ daemon_delete(struct daemon* daemon) ub_randfree(daemon->rand); alloc_clear(&daemon->superalloc); acl_list_delete(daemon->acl); + acl_list_delete(daemon->acl_interface); tcl_list_delete(daemon->tcl); listen_desetup_locks(); free(daemon->chroot); diff --git a/daemon/daemon.h b/daemon/daemon.h index 3effbafb7..58713e9ce 100644 --- a/daemon/daemon.h +++ b/daemon/daemon.h @@ -113,6 +113,8 @@ struct daemon { struct module_stack mods; /** access control, which client IPs are allowed to connect */ struct acl_list* acl; + /** access control, which interfaces are allowed to connect */ + struct acl_list* acl_interface; /** TCP connection limit, limit connections from client IPs */ struct tcl_list* tcl; /** local authority zones */ diff --git a/daemon/remote.c b/daemon/remote.c index ec7a4d5d9..7d4a41400 100644 --- a/daemon/remote.c +++ b/daemon/remote.c @@ -494,8 +494,8 @@ int remote_accept_callback(struct comm_point* c, void* arg, int err, n->c->do_not_close = 0; comm_point_stop_listening(n->c); comm_point_start_listening(n->c, -1, REMOTE_CONTROL_TCP_TIMEOUT); - memcpy(&n->c->repinfo.addr, &addr, addrlen); - n->c->repinfo.addrlen = addrlen; + memcpy(&n->c->repinfo.remote_addr, &addr, addrlen); + n->c->repinfo.remote_addrlen = addrlen; if(rc->use_cert) { n->shake_state = rc_hs_read; n->ssl = SSL_new(rc->ctx); @@ -3304,7 +3304,7 @@ remote_handshake_later(struct daemon_remote* rc, struct rc_state* s, if(r == 0) log_err("remote control connection closed prematurely"); log_addr(VERB_OPS, "failed connection from", - &s->c->repinfo.addr, s->c->repinfo.addrlen); + &s->c->repinfo.remote_addr, s->c->repinfo.remote_addrlen); log_crypto_err("remote control failed ssl"); clean_point(rc, s); } diff --git a/daemon/stats.c b/daemon/stats.c index 57c428271..6b3834977 100644 --- a/daemon/stats.c +++ b/daemon/stats.c @@ -70,6 +70,9 @@ #include #endif +/** How long to wait for threads to transmit statistics, in msec. */ +#define STATS_THREAD_WAIT 60000 + /** add timers and the values do not overflow or become negative */ static void stats_timeval_add(long long* d_sec, long long* d_usec, long long add_sec, long long add_usec) @@ -380,6 +383,28 @@ void server_stats_obtain(struct worker* worker, struct worker* who, worker_send_cmd(who, worker_cmd_stats); else worker_send_cmd(who, worker_cmd_stats_noreset); verbose(VERB_ALGO, "wait for stats reply"); + if(tube_wait_timeout(worker->cmd, STATS_THREAD_WAIT) == 0) { + verbose(VERB_OPS, "no response from thread %d" +#ifdef HAVE_GETTID + " LWP %u" +#endif +#if defined(HAVE_PTHREAD) && defined(SIZEOF_PTHREAD_T) && defined(SIZEOF_UNSIGNED_LONG) +# if SIZEOF_PTHREAD_T == SIZEOF_UNSIGNED_LONG + " pthread 0x%lx" +# endif +#endif + , + who->thread_num +#ifdef HAVE_GETTID + , (unsigned)who->thread_tid +#endif +#if defined(HAVE_PTHREAD) && defined(SIZEOF_PTHREAD_T) && defined(SIZEOF_UNSIGNED_LONG) +# if SIZEOF_PTHREAD_T == SIZEOF_UNSIGNED_LONG + , (unsigned long)*((unsigned long*)&who->thr_id) +# endif +#endif + ); + } if(!tube_read_msg(worker->cmd, &reply, &len, 0)) fatal_exit("failed to read stats over cmd channel"); if(len != (uint32_t)sizeof(*s)) @@ -496,7 +521,7 @@ void server_stats_insquery(struct ub_server_stats* stats, struct comm_point* c, stats->qhttps++; } } - if(repinfo && addr_is_ip6(&repinfo->addr, repinfo->addrlen)) + if(repinfo && addr_is_ip6(&repinfo->remote_addr, repinfo->remote_addrlen)) stats->qipv6++; if( (flags&BIT_QR) ) stats->qbit_QR++; diff --git a/daemon/worker.c b/daemon/worker.c index 010c4dc0a..47d29ce91 100644 --- a/daemon/worker.c +++ b/daemon/worker.c @@ -547,7 +547,8 @@ answer_norec_from_cache(struct worker* worker, struct query_info* qinfo, static int apply_respip_action(struct worker* worker, const struct query_info* qinfo, struct respip_client_info* cinfo, struct reply_info* rep, - struct comm_reply* repinfo, struct ub_packed_rrset_key** alias_rrset, + struct sockaddr_storage* addr, socklen_t addrlen, + struct ub_packed_rrset_key** alias_rrset, struct reply_info** encode_repp, struct auth_zones* az) { struct respip_action_info actinfo = {0, 0, 0, 0, NULL, 0, NULL}; @@ -574,7 +575,7 @@ apply_respip_action(struct worker* worker, const struct query_info* qinfo, if(actinfo.addrinfo) { respip_inform_print(&actinfo, qinfo->qname, qinfo->qtype, qinfo->qclass, qinfo->local_alias, - repinfo); + addr, addrlen); if(worker->stats.extended && actinfo.rpz_used) { if(actinfo.rpz_disabled) @@ -703,7 +704,7 @@ answer_from_cache(struct worker* worker, struct query_info* qinfo, *alias_rrset = NULL; /* avoid confusion if caller set it to non-NULL */ if((worker->daemon->use_response_ip || worker->daemon->use_rpz) && !partial_rep && !apply_respip_action(worker, qinfo, cinfo, rep, - repinfo, alias_rrset, + &repinfo->client_addr, repinfo->client_addrlen, alias_rrset, &encode_rep, worker->env.auth_zones)) { goto bail_out; } else if(partial_rep && @@ -991,12 +992,14 @@ answer_chaos(struct worker* w, struct query_info* qinfo, * @param w: worker * @param qinfo: query info. Pointer into packet buffer. * @param edns: edns info from query. - * @param repinfo: reply info with source address. + * @param addr: client address. + * @param addrlen: client address length. * @param pkt: packet buffer. */ static void -answer_notify(struct worker* w, struct query_info* qinfo, - struct edns_data* edns, sldns_buffer* pkt, struct comm_reply* repinfo) +answer_notify(struct worker* w, struct query_info* qinfo, + struct edns_data* edns, sldns_buffer* pkt, + struct sockaddr_storage* addr, socklen_t addrlen) { int refused = 0; int rcode = LDNS_RCODE_NOERROR; @@ -1005,8 +1008,8 @@ answer_notify(struct worker* w, struct query_info* qinfo, if(!w->env.auth_zones) return; has_serial = auth_zone_parse_notify_serial(pkt, &serial); if(auth_zones_notify(w->env.auth_zones, &w->env, qinfo->qname, - qinfo->qname_len, qinfo->qclass, &repinfo->addr, - repinfo->addrlen, has_serial, serial, &refused)) { + qinfo->qname_len, qinfo->qclass, addr, + addrlen, has_serial, serial, &refused)) { rcode = LDNS_RCODE_NOERROR; } else { if(refused) @@ -1031,7 +1034,7 @@ answer_notify(struct worker* w, struct query_info* qinfo, "servfail for NOTIFY %sfor %s from", sr, zname); else snprintf(buf, sizeof(buf), "received NOTIFY %sfor %s from", sr, zname); - log_addr(VERB_DETAIL, buf, &repinfo->addr, repinfo->addrlen); + log_addr(VERB_DETAIL, buf, addr, addrlen); } edns->edns_version = EDNS_ADVERTISED_VERSION; edns->udp_size = EDNS_ADVERTISED_SIZE; @@ -1051,8 +1054,8 @@ deny_refuse(struct comm_point* c, enum acl_access acl, { if(acl == deny) { if(verbosity >= VERB_ALGO) { - log_acl_action("dropped", &repinfo->addr, - repinfo->addrlen, acl, acladdr); + log_acl_action("dropped", &repinfo->client_addr, + repinfo->client_addrlen, acl, acladdr); log_buf(VERB_ALGO, "dropped", c->buffer); } comm_point_drop_reply(repinfo); @@ -1063,8 +1066,8 @@ deny_refuse(struct comm_point* c, enum acl_access acl, size_t opt_rr_mark; if(verbosity >= VERB_ALGO) { - log_acl_action("refused", &repinfo->addr, - repinfo->addrlen, acl, acladdr); + log_acl_action("refused", &repinfo->client_addr, + repinfo->client_addrlen, acl, acladdr); log_buf(VERB_ALGO, "refuse", c->buffer); } @@ -1224,12 +1227,24 @@ deny_refuse(struct comm_point* c, enum acl_access acl, } static int -deny_refuse_all(struct comm_point* c, enum acl_access acl, +deny_refuse_all(struct comm_point* c, enum acl_access* acl, struct worker* worker, struct comm_reply* repinfo, - struct acl_addr* acladdr, int ede) + struct acl_addr** acladdr, int ede, int check_proxy) { - return deny_refuse(c, acl, acl_deny, acl_refuse, worker, repinfo, - acladdr, ede); + if(check_proxy) { + *acladdr = acl_addr_lookup(worker->daemon->acl, + &repinfo->remote_addr, repinfo->remote_addrlen); + } else { + *acladdr = acl_addr_lookup(worker->daemon->acl, + &repinfo->client_addr, repinfo->client_addrlen); + } + /* If there is no ACL based on client IP use the interface ACL. */ + if(!(*acladdr) && c->socket) { + *acladdr = c->socket->acl; + } + *acl = acl_get_control(*acladdr); + return deny_refuse(c, *acl, acl_deny, acl_refuse, worker, repinfo, + *acladdr, ede); } static int @@ -1241,7 +1256,7 @@ deny_refuse_non_local(struct comm_point* c, enum acl_access acl, worker, repinfo, acladdr, ede); } -int +int worker_handle_request(struct comm_point* c, void* arg, int error, struct comm_reply* repinfo) { @@ -1286,16 +1301,16 @@ worker_handle_request(struct comm_point* c, void* arg, int error, if(worker_check_request(c->buffer, worker) != 0) { verbose(VERB_ALGO, "dnscrypt: worker check request: bad query."); - log_addr(VERB_CLIENT,"from",&repinfo->addr, - repinfo->addrlen); + log_addr(VERB_CLIENT,"from",&repinfo->client_addr, + repinfo->client_addrlen); comm_point_drop_reply(repinfo); return 0; } if(!query_info_parse(&qinfo, c->buffer)) { verbose(VERB_ALGO, "dnscrypt: worker parse request: formerror."); - log_addr(VERB_CLIENT, "from", &repinfo->addr, - repinfo->addrlen); + log_addr(VERB_CLIENT, "from", &repinfo->client_addr, + repinfo->client_addrlen); comm_point_drop_reply(repinfo); return 0; } @@ -1323,25 +1338,30 @@ worker_handle_request(struct comm_point* c, void* arg, int error, * sending src (client)/dst (local service) addresses over DNSTAP from incoming request handler */ if(worker->dtenv.log_client_query_messages) { - log_addr(VERB_ALGO, "request from client", &repinfo->addr, repinfo->addrlen); + log_addr(VERB_ALGO, "request from client", &repinfo->client_addr, repinfo->client_addrlen); log_addr(VERB_ALGO, "to local addr", (void*)repinfo->c->socket->addr->ai_addr, repinfo->c->socket->addr->ai_addrlen); - dt_msg_send_client_query(&worker->dtenv, &repinfo->addr, (void*)repinfo->c->socket->addr->ai_addr, c->type, c->buffer); + dt_msg_send_client_query(&worker->dtenv, &repinfo->client_addr, (void*)repinfo->c->socket->addr->ai_addr, c->type, c->buffer); } #endif - acladdr = acl_addr_lookup(worker->daemon->acl, &repinfo->addr, - repinfo->addrlen); - acl = acl_get_control(acladdr); - - if((ret=deny_refuse_all(c, acl, worker, repinfo, acladdr, - worker->env.cfg->ede)) != -1) - { + /* Check deny/refuse ACLs */ + if(repinfo->is_proxied) { + if((ret=deny_refuse_all(c, &acl, worker, repinfo, &acladdr, + worker->env.cfg->ede, 1)) != -1) { + if(ret == 1) + goto send_reply; + return ret; + } + } + if((ret=deny_refuse_all(c, &acl, worker, repinfo, &acladdr, + worker->env.cfg->ede, 0)) != -1) { if(ret == 1) goto send_reply; return ret; } + if((ret=worker_check_request(c->buffer, worker)) != 0) { verbose(VERB_ALGO, "worker check request: bad query."); - log_addr(VERB_CLIENT,"from",&repinfo->addr, repinfo->addrlen); + log_addr(VERB_CLIENT,"from",&repinfo->client_addr, repinfo->client_addrlen); if(ret != -1) { LDNS_QR_SET(sldns_buffer_begin(c->buffer)); LDNS_RCODE_SET(sldns_buffer_begin(c->buffer), ret); @@ -1353,20 +1373,24 @@ worker_handle_request(struct comm_point* c, void* arg, int error, worker->stats.num_queries++; - /* check if this query should be dropped based on source ip rate limiting */ - if(!infra_ip_ratelimit_inc(worker->env.infra_cache, repinfo, + /* check if this query should be dropped based on source ip rate limiting + * NOTE: we always check the repinfo->client_address. IP ratelimiting is + * implicitly disabled for proxies. */ + if(!infra_ip_ratelimit_inc(worker->env.infra_cache, + &repinfo->client_addr, repinfo->client_addrlen, *worker->env.now, worker->env.cfg->ip_ratelimit_backoff, c->buffer)) { /* See if we are passed through with slip factor */ if(worker->env.cfg->ip_ratelimit_factor != 0 && ub_random_max(worker->env.rnd, - worker->env.cfg->ip_ratelimit_factor) == 0) { - + worker->env.cfg->ip_ratelimit_factor) == 0) { char addrbuf[128]; - addr_to_str(&repinfo->addr, repinfo->addrlen, - addrbuf, sizeof(addrbuf)); - verbose(VERB_QUERY, "ip_ratelimit allowed through for ip address %s because of slip in ip_ratelimit_factor", - addrbuf); + addr_to_str(&repinfo->client_addr, + repinfo->client_addrlen, addrbuf, + sizeof(addrbuf)); + verbose(VERB_QUERY, "ip_ratelimit allowed through for " + "ip address %s because of slip in " + "ip_ratelimit_factor", addrbuf); } else { worker->stats.num_queries_ip_ratelimited++; comm_point_drop_reply(repinfo); @@ -1377,7 +1401,8 @@ worker_handle_request(struct comm_point* c, void* arg, int error, /* see if query is in the cache */ if(!query_info_parse(&qinfo, c->buffer)) { verbose(VERB_ALGO, "worker parse request: formerror."); - log_addr(VERB_CLIENT,"from",&repinfo->addr, repinfo->addrlen); + log_addr(VERB_CLIENT, "from", &repinfo->client_addr, + repinfo->client_addrlen); memset(&qinfo, 0, sizeof(qinfo)); /* zero qinfo.qname */ if(worker_err_ratelimit(worker, LDNS_RCODE_FORMERR) == -1) { comm_point_drop_reply(repinfo); @@ -1391,13 +1416,14 @@ worker_handle_request(struct comm_point* c, void* arg, int error, } if(worker->env.cfg->log_queries) { char ip[128]; - addr_to_str(&repinfo->addr, repinfo->addrlen, ip, sizeof(ip)); + addr_to_str(&repinfo->client_addr, repinfo->client_addrlen, ip, sizeof(ip)); log_query_in(ip, qinfo.qname, qinfo.qtype, qinfo.qclass); } if(qinfo.qtype == LDNS_RR_TYPE_AXFR || qinfo.qtype == LDNS_RR_TYPE_IXFR) { verbose(VERB_ALGO, "worker request: refused zone transfer."); - log_addr(VERB_CLIENT,"from",&repinfo->addr, repinfo->addrlen); + log_addr(VERB_CLIENT, "from", &repinfo->client_addr, + repinfo->client_addrlen); sldns_buffer_rewind(c->buffer); LDNS_QR_SET(sldns_buffer_begin(c->buffer)); LDNS_RCODE_SET(sldns_buffer_begin(c->buffer), @@ -1414,7 +1440,8 @@ worker_handle_request(struct comm_point* c, void* arg, int error, qinfo.qtype == LDNS_RR_TYPE_MAILB || (qinfo.qtype >= 128 && qinfo.qtype <= 248)) { verbose(VERB_ALGO, "worker request: formerror for meta-type."); - log_addr(VERB_CLIENT,"from",&repinfo->addr, repinfo->addrlen); + log_addr(VERB_CLIENT, "from", &repinfo->client_addr, + repinfo->client_addrlen); if(worker_err_ratelimit(worker, LDNS_RCODE_FORMERR) == -1) { comm_point_drop_reply(repinfo); return 0; @@ -1428,15 +1455,16 @@ worker_handle_request(struct comm_point* c, void* arg, int error, } goto send_reply; } - if((ret=parse_edns_from_query_pkt(c->buffer, &edns, worker->env.cfg, c, - worker->scratchpad)) != 0) { + if((ret=parse_edns_from_query_pkt( + c->buffer, &edns, worker->env.cfg, c, repinfo, + (worker->env.now ? *worker->env.now : time(NULL)), + worker->scratchpad)) != 0) { struct edns_data reply_edns; verbose(VERB_ALGO, "worker parse edns: formerror."); - log_addr(VERB_CLIENT,"from",&repinfo->addr, repinfo->addrlen); + log_addr(VERB_CLIENT, "from", &repinfo->client_addr, + repinfo->client_addrlen); memset(&reply_edns, 0, sizeof(reply_edns)); reply_edns.edns_present = 1; - reply_edns.udp_size = EDNS_ADVERTISED_SIZE; - LDNS_RCODE_SET(sldns_buffer_begin(c->buffer), ret); error_encode(c->buffer, ret, &qinfo, *(uint16_t*)(void *)sldns_buffer_begin(c->buffer), sldns_buffer_read_u16_at(c->buffer, 2), &reply_edns); @@ -1445,22 +1473,15 @@ worker_handle_request(struct comm_point* c, void* arg, int error, } if(edns.edns_present) { if(edns.edns_version != 0) { - edns.ext_rcode = (uint8_t)(EDNS_RCODE_BADVERS>>4); - edns.edns_version = EDNS_ADVERTISED_VERSION; - edns.udp_size = EDNS_ADVERTISED_SIZE; - edns.bits &= EDNS_DO; edns.opt_list_in = NULL; edns.opt_list_out = NULL; edns.opt_list_inplace_cb_out = NULL; - edns.padding_block_size = 0; verbose(VERB_ALGO, "query with bad edns version."); - log_addr(VERB_CLIENT,"from",&repinfo->addr, repinfo->addrlen); - error_encode(c->buffer, EDNS_RCODE_BADVERS&0xf, &qinfo, + log_addr( VERB_CLIENT, "from",&repinfo->remote_addr + , repinfo->remote_addrlen); + extended_error_encode(c->buffer, EDNS_RCODE_BADVERS, &qinfo, *(uint16_t*)(void *)sldns_buffer_begin(c->buffer), - sldns_buffer_read_u16_at(c->buffer, 2), NULL); - if(sldns_buffer_capacity(c->buffer) >= - sldns_buffer_limit(c->buffer)+calc_edns_field_size(&edns)) - attach_edns_record(c->buffer, &edns); + sldns_buffer_read_u16_at(c->buffer, 2), 0, &edns); regional_free_all(worker->scratchpad); goto send_reply; } @@ -1468,21 +1489,62 @@ worker_handle_request(struct comm_point* c, void* arg, int error, worker->daemon->cfg->harden_short_bufsize) { verbose(VERB_QUERY, "worker request: EDNS bufsize %d ignored", (int)edns.udp_size); - log_addr(VERB_CLIENT,"from",&repinfo->addr, repinfo->addrlen); + log_addr(VERB_CLIENT, "from", &repinfo->client_addr, + repinfo->client_addrlen); edns.udp_size = NORMAL_UDP_SIZE; } } + /* "if, else if" sequence below deals with downstream DNS Cookies */ + if (acl != acl_allow_cookie) + ; /* pass; No cookie downstream processing whatsoever */ + + else if (edns.cookie_valid) + ; /* pass; Valid cookie is good! */ + + else if (c->type != comm_udp) + ; /* pass; Stateful transport */ + + else if (edns.cookie_present) { + /* Cookie present, but not valid: Cookie was bad! */ + extended_error_encode(c->buffer, + LDNS_EXT_RCODE_BADCOOKIE, &qinfo, + *(uint16_t*)(void *) + sldns_buffer_begin(c->buffer), + sldns_buffer_read_u16_at(c->buffer, 2), + 0, &edns); + regional_free_all(worker->scratchpad); + goto send_reply; + } else { + /* Cookie requered, but no cookie present on UDP */ + verbose(VERB_ALGO, "worker request: " + "need cookie or stateful transport"); + log_addr(VERB_ALGO, "from",&repinfo->remote_addr + , repinfo->remote_addrlen); + EDNS_OPT_LIST_APPEND_EDE(&edns.opt_list_out, + worker->scratchpad, LDNS_EDE_OTHER, + "DNS Cookie needed for UDP replies"); + error_encode(c->buffer, + (LDNS_RCODE_REFUSED|BIT_TC), &qinfo, + *(uint16_t*)(void *) + sldns_buffer_begin(c->buffer), + sldns_buffer_read_u16_at(c->buffer, 2), + &edns); + regional_free_all(worker->scratchpad); + goto send_reply; + } if(edns.udp_size > worker->daemon->cfg->max_udp_size && c->type == comm_udp) { verbose(VERB_QUERY, "worker request: max UDP reply size modified" " (%d to max-udp-size)", (int)edns.udp_size); - log_addr(VERB_CLIENT,"from",&repinfo->addr, repinfo->addrlen); + log_addr(VERB_CLIENT, "from", &repinfo->client_addr, + repinfo->client_addrlen); edns.udp_size = worker->daemon->cfg->max_udp_size; } if(edns.udp_size < LDNS_HEADER_SIZE) { verbose(VERB_ALGO, "worker request: edns is too small."); - log_addr(VERB_CLIENT, "from", &repinfo->addr, repinfo->addrlen); + log_addr(VERB_CLIENT, "from", &repinfo->client_addr, + repinfo->client_addrlen); LDNS_QR_SET(sldns_buffer_begin(c->buffer)); LDNS_TC_SET(sldns_buffer_begin(c->buffer)); LDNS_RCODE_SET(sldns_buffer_begin(c->buffer), @@ -1506,7 +1568,8 @@ worker_handle_request(struct comm_point* c, void* arg, int error, } if(LDNS_OPCODE_WIRE(sldns_buffer_begin(c->buffer)) == LDNS_PACKET_NOTIFY) { - answer_notify(worker, &qinfo, &edns, c->buffer, repinfo); + answer_notify(worker, &qinfo, &edns, c->buffer, + &repinfo->client_addr, repinfo->client_addrlen); regional_free_all(worker->scratchpad); goto send_reply; } @@ -1582,7 +1645,7 @@ worker_handle_request(struct comm_point* c, void* arg, int error, sldns_buffer_read_u16_at(c->buffer, 2), &edns); regional_free_all(worker->scratchpad); log_addr(VERB_ALGO, "refused nonrec (cache snoop) query from", - &repinfo->addr, repinfo->addrlen); + &repinfo->client_addr, repinfo->client_addrlen); goto send_reply; } @@ -1722,9 +1785,9 @@ lookup_cache: if(verbosity >= VERB_CLIENT) { if(c->type == comm_udp) log_addr(VERB_CLIENT, "udp request from", - &repinfo->addr, repinfo->addrlen); + &repinfo->client_addr, repinfo->client_addrlen); else log_addr(VERB_CLIENT, "tcp request from", - &repinfo->addr, repinfo->addrlen); + &repinfo->client_addr, repinfo->client_addrlen); } /* grab a work request structure for this new request */ @@ -1756,8 +1819,8 @@ send_reply_rc: */ if(worker->dtenv.log_client_response_messages) { log_addr(VERB_ALGO, "from local addr", (void*)repinfo->c->socket->addr->ai_addr, repinfo->c->socket->addr->ai_addrlen); - log_addr(VERB_ALGO, "response to client", &repinfo->addr, repinfo->addrlen); - dt_msg_send_client_response(&worker->dtenv, &repinfo->addr, (void*)repinfo->c->socket->addr->ai_addr, c->type, c->buffer); + log_addr(VERB_ALGO, "response to client", &repinfo->client_addr, repinfo->client_addrlen); + dt_msg_send_client_response(&worker->dtenv, &repinfo->client_addr, (void*)repinfo->c->socket->addr->ai_addr, c->type, c->buffer); } #endif if(worker->env.cfg->log_replies) @@ -1769,10 +1832,12 @@ send_reply_rc: /* log original qname, before the local alias was * used to resolve that CNAME to something else */ qinfo.qname = qinfo.local_alias->rrset->rk.dname; - log_reply_info(NO_VERBOSE, &qinfo, &repinfo->addr, repinfo->addrlen, + log_reply_info(NO_VERBOSE, &qinfo, + &repinfo->client_addr, repinfo->client_addrlen, tv, 1, c->buffer); } else { - log_reply_info(NO_VERBOSE, &qinfo, &repinfo->addr, repinfo->addrlen, + log_reply_info(NO_VERBOSE, &qinfo, + &repinfo->client_addr, repinfo->client_addrlen, tv, 1, c->buffer); } } @@ -1903,6 +1968,9 @@ worker_init(struct worker* worker, struct config_file *cfg, struct dt_env* dtenv = &worker->dtenv; #else void* dtenv = NULL; +#endif +#ifdef HAVE_GETTID + worker->thread_tid = gettid(); #endif worker->need_to_exit = 0; worker->base = comm_base_create(do_sigs); diff --git a/daemon/worker.h b/daemon/worker.h index 3887d0405..3fb52abd9 100644 --- a/daemon/worker.h +++ b/daemon/worker.h @@ -86,6 +86,10 @@ struct worker { struct daemon* daemon; /** thread id */ ub_thread_type thr_id; +#ifdef HAVE_GETTID + /** thread tid, the LWP id. */ + pid_t thread_tid; +#endif /** pipe, for commands for this worker */ struct tube* cmd; /** the event base this worker works with */ diff --git a/dnstap/dtstream.c b/dnstap/dtstream.c index a1dd9703e..9153f0404 100644 --- a/dnstap/dtstream.c +++ b/dnstap/dtstream.c @@ -954,7 +954,7 @@ static int dtio_write_more(struct dt_io_thread* dtio) * -1: continue, >0: number of bytes read into buffer */ static ssize_t receive_bytes(struct dt_io_thread* dtio, void* buf, size_t len) { ssize_t r; - r = recv(dtio->fd, (void*)buf, len, 0); + r = recv(dtio->fd, (void*)buf, len, MSG_DONTWAIT); if(r == -1) { char* to = dtio->socket_path; if(!to) to = dtio->ip_str; @@ -1960,7 +1960,7 @@ static int dtio_open_output_tcp(struct dt_io_thread* dtio) memset(&addr, 0, sizeof(addr)); addrlen = (socklen_t)sizeof(addr); - if(!extstrtoaddr(dtio->ip_str, &addr, &addrlen)) { + if(!extstrtoaddr(dtio->ip_str, &addr, &addrlen, UNBOUND_DNS_PORT)) { log_err("could not parse IP '%s'", dtio->ip_str); return 0; } diff --git a/dnstap/unbound-dnstap-socket.c b/dnstap/unbound-dnstap-socket.c index 63292fbca..3bf889463 100644 --- a/dnstap/unbound-dnstap-socket.c +++ b/dnstap/unbound-dnstap-socket.c @@ -272,7 +272,7 @@ static int make_tcp_accept(char* ip) memset(&addr, 0, sizeof(addr)); len = (socklen_t)sizeof(addr); - if(!extstrtoaddr(ip, &addr, &len)) { + if(!extstrtoaddr(ip, &addr, &len, UNBOUND_DNS_PORT)) { log_err("could not parse IP '%s'", ip); return -1; } @@ -617,7 +617,7 @@ static void log_data_frame(uint8_t* pkt, size_t len) static ssize_t receive_bytes(struct tap_data* data, int fd, void* buf, size_t len) { - ssize_t ret = recv(fd, buf, len, 0); + ssize_t ret = recv(fd, buf, len, MSG_DONTWAIT); if(ret == 0) { /* closed */ if(verbosity) log_info("dnstap client stream closed from %s", diff --git a/doc/Changelog b/doc/Changelog index 24605888b..32e7ae8ae 100644 --- a/doc/Changelog +++ b/doc/Changelog @@ -1,3 +1,119 @@ +21 October 2022: George + - Merge #767 from jonathangray: consistently use IPv4/IPv6 in + unbound.conf.5. + +21 October 2022: Wouter + - Fix that cachedb does not store failures in the external cache. + +18 October 2022: George + - Clarify the use of MAX_SENT_COUNT in the iterator code. + +17 October 2022: Wouter + - testcode/dohclient sets log identity to its name. + +14 October 2022: Wouter + - Merge #768 from fobser: Arithmetic on a pointer to void is a GNU + extension. + - In unit test, print python script name list correctly. + +13 October 2022: Wouter + - Tag for 1.17.0 release. The code repository continues with 1.17.1. + +11 October 2022: George + - Fix PROXYv2 header read for TCP connections when no proxied addresses + are provided. + +7 October 2022: Wouter + - Tag for 1.17.0rc1 release. + +7 October 2022: George + - Fix to stop possible loops in the tcp reuse code (write_wait list + and tcp_wait list). Based on analysis and patch from Prad Seniappan + and Karthik Umashankar. + - Fix unit test to properly test the reuse_write_wait_pop function. + +6 October 2022: Wouter + - Fix to stop responses with TC flag from resulting in partial + responses. It retries to fetch the data elsewhere, or fails the + query and in depth fix removes the TC flag from the cached item. + - Fix proxy length debug output printout typecasts. + +5 October 2022: Wouter + - Fix dnscrypt compile for proxy protocol code changes. + +5 October 2022: George + - Use DEBUG_TDIR from environment in mini_tdir.sh for debugging. + - Fix string comparison in mini_tdir.sh. + - Make ede.tdir test more predictable by using static data. + - Fix checkconf test for dnscrypt and proxy port. + +4 October 2022: George + - Merge #764: Leniency for target discovery when under load (for + NRDelegation changes). + +4 October 2022: Wouter + - Fix static analysis report to remove dead code from the + rpz_callback_from_iterator_module function. + - Fix to clean up after the acl_interface unit test. + +3 October 2022: George + - Merge #760: PROXYv2 downstream support. (New proxy-protocol-port + configuration option). + +3 October 2022: Wouter + - Fix to remove erroneous TC flag from TCP upstream. + - Fix test tdir skip report printout. + - Fix windows compile, the identifier interface is defined in headers. + - Fix to close errno block in comm_point_tcp_handle_read outside of + ifdef. + +26 September 2022: George + - Better output for skipped tdir tests. + +21 September 2022: Wouter + - Patch for CVE-2022-3204 Non-Responsive Delegation Attack. + - This patch was released in 1.16.3, the code repository continues + with the previous features and fixes for 1.17.0. + - Fix doxygen warning in respip.h. + +20 September 2022: George + - Convert tdir tests to use the new skip_test functionality. + - Remove unused testcode/mini_tpkg.sh file. + +16 September 2022: George + - Merge #753: ACL per interface. (New interface-* configuration + options). + +2 September 2022: Wouter + - Remove include that was there for debug purposes. + - Fix to check pthread_t size after pthread has been detected. + +1 September 2022: Wouter + - Fix to update config tests to fix checking if nonblocking sockets + work on OpenBSD. + - Slow down log frequency of write wait failures. + - Fix to set out of file descriptor warning to operational verbosity. + - Fix to log a verbose message at operational notice level if a + thread is not responding, to stats requests. It is logged with + thread identifiers. + +31 August 2022: Wouter + - Fix to avoid process wide fcntl calls mixed with nonblocking + operations after a blocked write. + - Patch from Vadim Fedorenko that adds MSG_DONTWAIT to receive + operations, so that instruction reordering does not cause mistakenly + blocking socket operations. + - Fix to wait for blocked write on UDP sockets, with a timeout if it + takes too long the packet is dropped. + - Fix for wait for udp send to stop when packet is successfully sent. + +22 August 2022: Wouter + - Fix #741: systemd socket activation fails on IPv6. + +12 August 2022: Wouter + - Fix to log accept error ENFILE and EMFILE errno, but slowly, once + per 10 seconds. Also log accept failures when no slow down is used. + 5 August 2022: Wouter - Fix #734 [FR] enable unbound-checkconf to detect more (basic) errors. diff --git a/doc/example.conf.in b/doc/example.conf.in index 27281608f..c21246e4c 100644 --- a/doc/example.conf.in +++ b/doc/example.conf.in @@ -17,7 +17,7 @@ server: # whitespace is not necessary, but looks cleaner. # verbosity number, 0 is least verbose. 1 is default. - verbosity: 1 + # verbosity: 1 # print statistics to the log (for every thread) every N seconds. # Set to "" or 0 to disable. Default is disabled. @@ -50,6 +50,7 @@ server: # interface: 192.0.2.154 # interface: 192.0.2.154@5003 # interface: 2001:DB8::5 + # interface: eth0@5003 # enable this feature to copy the source address of queries to reply. # Socket options are not supported on all platforms. experimental. @@ -217,7 +218,8 @@ server: # the maximum number of hosts that are cached (roundtrip, EDNS, lame). # infra-cache-numhosts: 10000 - # define a number of tags here, use with local-zone, access-control. + # define a number of tags here, use with local-zone, access-control, + # interface-*. # repeat the define-tag statement to add additional tags. # define-tag: "tag1 tag2 tag3" @@ -273,9 +275,7 @@ server: # allow_snoop (recursive and nonrecursive ok) # deny_non_local (drop queries unless can be answered from local-data) # refuse_non_local (like deny_non_local but polite error reply). - # access-control: 0.0.0.0/0 refuse # access-control: 127.0.0.0/8 allow - # access-control: ::0/0 refuse # access-control: ::1 allow # access-control: ::ffff:127.0.0.1 allow @@ -284,7 +284,7 @@ server: # are tagged with one of these tags. # access-control-tag: 192.0.2.0/24 "tag2 tag3" - # set action for particular tag for given access control element + # set action for particular tag for given access control element. # if you have multiple tag values, the tag used to lookup the action # is the first tag match between access-control-tag and local-zone-tag # where "first" comes from the order of the define-tag values. @@ -296,6 +296,58 @@ server: # Set view for access control element # access-control-view: 192.0.2.0/24 viewname + # Similar to 'access-control:' but for interfaces. + # Control which listening interfaces are allowed to accept (recursive) + # queries for this server. + # The specified interfaces should be the same as the ones specified in + # 'interface:' followed by the action. + # The actions are the same as 'access-control:' above. + # By default all the interfaces configured are refused. + # Note: any 'access-control*:' setting overrides all 'interface-*:' + # settings for targeted clients. + # interface-action: 192.0.2.153 allow + # interface-action: 192.0.2.154 allow + # interface-action: 192.0.2.154@5003 allow + # interface-action: 2001:DB8::5 allow + # interface-action: eth0@5003 allow + + # Similar to 'access-control-tag:' but for interfaces. + # Tag interfaces with a list of tags (in "" with spaces between). + # Interfaces using these tags use localzones that are tagged with one + # of these tags. + # The specified interfaces should be the same as the ones specified in + # 'interface:' followed by the list of tags. + # Note: any 'access-control*:' setting overrides all 'interface-*:' + # settings for targeted clients. + # interface-tag: eth0@5003 "tag2 tag3" + + # Similar to 'access-control-tag-action:' but for interfaces. + # Set action for particular tag for a given interface element. + # If you have multiple tag values, the tag used to lookup the action + # is the first tag match between interface-tag and local-zone-tag + # where "first" comes from the order of the define-tag values. + # The specified interfaces should be the same as the ones specified in + # 'interface:' followed by the tag and action. + # Note: any 'access-control*:' setting overrides all 'interface-*:' + # settings for targeted clients. + # interface-tag-action: eth0@5003 tag3 refuse + + # Similar to 'access-control-tag-data:' but for interfaces. + # Set redirect data for a particular tag for an interface element. + # The specified interfaces should be the same as the ones specified in + # 'interface:' followed by the tag and the redirect data. + # Note: any 'access-control*:' setting overrides all 'interface-*:' + # settings for targeted clients. + # interface-tag-data: eth0@5003 tag2 "A 127.0.0.1" + + # Similar to 'access-control-view:' but for interfaces. + # Set view for an interface element. + # The specified interfaces should be the same as the ones specified in + # 'interface:' followed by the view name. + # Note: any 'access-control*:' setting overrides all 'interface-*:' + # settings for targeted clients. + # interface-view: eth0@5003 viewname + # if given, a chroot(2) is done to the given directory. # i.e. you can chroot to the working directory, for example, # for extra security, but make sure all files are in that directory. @@ -850,6 +902,10 @@ server: # Disable TLS for DNS-over-HTTP downstream service. # http-notls-downstream: no + # 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. + # DNS64 prefix. Must be specified when DNS64 is use. # Enable dns64 in module-config. Used to synthesize IPv6 from IPv4. # dns64-prefix: 64:ff9b::0/96 diff --git a/doc/unbound.conf.5.in b/doc/unbound.conf.5.in index 5c95107f5..bf34e93e0 100644 --- a/doc/unbound.conf.5.in +++ b/doc/unbound.conf.5.in @@ -118,7 +118,7 @@ The number of threads to create to serve clients. Use 1 for no threading. .B port: \fI The port number, default 53, on which the server responds to queries. .TP -.B interface: \fI +.B interface: \fI Interface to use to connect to the network. This interface is listened to for queries from clients, and answers to clients are given from it. Can be given multiple times to work on several interfaces. If none are @@ -129,7 +129,7 @@ A port number can be specified with @port (without spaces between interface and port number), if not specified the default port (from \fBport\fR) is used. .TP -.B ip\-address: \fI +.B ip\-address: \fI Same as interface: (for ease of compatibility with nsd.conf). .TP .B interface\-automatic: \fI @@ -349,7 +349,7 @@ ip\-transparent option is also available. The value of the Differentiated Services Codepoint (DSCP) in the differentiated services field (DS) of the outgoing IP packet headers. The field replaces the outdated IPv4 Type-Of-Service field and the -IPV6 traffic class field. +IPv6 traffic class field. .TP .B rrset\-cache\-size: \fI Number of bytes size of the RRset cache. Default is 4 megabytes. @@ -416,7 +416,7 @@ Enable or disable whether ip4 queries are answered or issued. Default is yes. Enable or disable whether ip6 queries are answered or issued. Default is yes. If disabled, queries are not answered on IPv6, and queries are not sent on IPv6 to the internet nameservers. With this option you can disable the -ipv6 transport for sending DNS traffic, it does not impact the contents of +IPv6 transport for sending DNS traffic, it does not impact the contents of the DNS traffic, which may have ip4 and ip6 addresses in it. .TP .B prefer\-ip4: \fI @@ -665,6 +665,17 @@ Ignored if the option is not available. Default is yes. Disable use of TLS for the downstream DNS-over-HTTP connections. Useful for local back end servers. Default is no. .TP +.B proxy\-protocol\-port: \fI +List port numbers as proxy\-protocol\-port, and when interfaces are defined, +eg. with the @port suffix, as this port number, they support and expect PROXYv2. +In this case the proxy address will only be used for the network communication +and initial ACL (check if the proxy itself is denied/refused by configuration). +The proxied address (if any) will then be used as the true client address and +will be used where applicable for logging, ACL, DNSTAP, RPZ and IP ratelimiting. +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 use\-systemd: \fI Enable or disable systemd socket activation. Default is no. @@ -682,8 +693,8 @@ This option is experimental at this time. .B access\-control: \fI The netblock is given as an IP4 or IP6 address with /size appended for a classless network block. The action can be \fIdeny\fR, \fIrefuse\fR, -\fIallow\fR, \fIallow_setrd\fR, \fIallow_snoop\fR, \fIdeny_non_local\fR or -\fIrefuse_non_local\fR. +\fIallow\fR, \fIallow_setrd\fR, \fIallow_snoop\fR, \fIallow_cookie\fR, +\fIdeny_non_local\fR or \fIrefuse_non_local\fR. The most specific netblock match is used, if none match \fIdeny\fR is used. The order of the access\-control statements therefore does not matter. .IP @@ -719,6 +730,14 @@ the cache contents (for malicious acts). However, nonrecursive queries can also be a valuable debugging tool (when you want to examine the cache contents). In that case use \fIallow_snoop\fR for your administration host. .IP +When the \fBanswer\-cookie\fR option is enabled, the \fIallow_cookie\fR action +will allow access to UDP queries that contain a valid Server Cookie as +specified in RFC 7873 and RFC9018. UDP queries containing only a Client Cookie +and no Server Cookie, will receive a BADCOOKIE response including a Server +Cookie, allow clients to retry with that Server Cookie. The \fIallow_cookie\fR +will also accept requests over statefull transports, regardless of the precence +of a Cookie and regardless the \fBanswer\-cookie\fR setting. +.IP By default only localhost is \fIallow\fRed, the rest is \fIrefuse\fRd. The default is \fIrefuse\fRd, because that is protocol\-friendly. The DNS protocol is not designed to handle dropped packets due to policy, and @@ -750,6 +769,46 @@ Set redirect data for particular tag for given access control element. .B access\-control\-view: \fI Set view for given access control element. .TP +.B interface\-action: \fI +Similar to \fBaccess\-control:\fR but for interfaces. +.IP +The action is the same as the ones defined under \fBaccess\-control:\fR. +Interfaces are \fIrefuse\fRd by default. +By default only localhost (the IP netblock, not the loopback interface) is +\fIallow\fRed through the default \fBaccess\-control:\fR behavior. +.IP +Note that the interface needs to be already specified with \fBinterface:\fR +and that any \fBaccess-control*:\fR setting overrides all \fBinterface-*:\fR +settings for targeted clients. +.TP +.B interface\-tag: \fI <"list of tags"> +Similar to \fBaccess\-control-tag:\fR but for interfaces. +.IP +Note that the interface needs to be already specified with \fBinterface:\fR +and that any \fBaccess-control*:\fR setting overrides all \fBinterface-*:\fR +settings for targeted clients. +.TP +.B interface\-tag\-action: \fI +Similar to \fBaccess\-control-tag-action:\fR but for interfaces. +.IP +Note that the interface needs to be already specified with \fBinterface:\fR +and that any \fBaccess-control*:\fR setting overrides all \fBinterface-*:\fR +settings for targeted clients. +.TP +.B interface\-tag\-data: \fI <"resource record string"> +Similar to \fBaccess\-control-tag-data:\fR but for interfaces. +.IP +Note that the interface needs to be already specified with \fBinterface:\fR +and that any \fBaccess-control*:\fR setting overrides all \fBinterface-*:\fR +settings for targeted clients. +.TP +.B interface\-view: \fI +Similar to \fBaccess\-control-view:\fR but for interfaces. +.IP +Note that the interface needs to be already specified with \fBinterface:\fR +and that any \fBaccess-control*:\fR setting overrides all \fBinterface-*:\fR +settings for targeted clients. +.TP .B chroot: \fI If chroot is enabled, you should pass the configfile (from the commandline) as a full path from the original root. After the @@ -1629,7 +1688,7 @@ This specifies the action data for \fIresponse-ip\fR with action being to redirect as specified by "\fIresource record string\fR". "Resource record string" is similar to that of \fIaccess-control-tag-action\fR, but it must be of either AAAA, A or CNAME types. -If the IP-netblock is an IPv6/IPV4 prefix, the record +If the IP-netblock is an IPv6/IPv4 prefix, the record must be AAAA/A respectively, unless it is a CNAME (which can be used for both versions of IP netblocks). If it is CNAME there must not be more than one \fIresponse-ip-data\fR for the same IP-netblock. @@ -1793,6 +1852,15 @@ Set the number of servers that should be used for fast server selection. Only use the fastest specified number of servers with the fast\-server\-permil option, that turns this on or off. The default is to use the fastest 3 servers. .TP 5 +.B answer\-cookie: \fI +Enable to answer to requests containig DNS Cookies as specified in RFC7873 and +RFC9018. Default is no. +.TP 5 +.B cookie\-secret: \fI<128 bit hex string> +Server's in an Anycast deployment need to be able to verify each other's +Server Cookies. For this they need to share the secret used to construct +and verify the Server Cookies. +Default is a 128 bits random secret generated at startup time. .B edns\-client\-string: \fI Include an EDNS0 option containing configured ascii string in queries with destination address matching the configured IP netblock. This configuration @@ -1832,9 +1900,11 @@ section for options. To setup the correct self\-signed certificates use the The option is used to enable remote control, default is "no". If turned off, the server does not listen for control commands. .TP 5 -.B control\-interface: \fI +.B control\-interface: \fI Give IPv4 or IPv6 addresses or local socket path to listen on for control commands. +If an interface name is used instead of an ip address, the list of ip addresses +on that interface are used. By default localhost (127.0.0.1 and ::1) is listened to. Use 0.0.0.0 and ::0 to listen to all interfaces. If you change this and permissions have been dropped, you must restart diff --git a/edns-subnet/subnetmod.c b/edns-subnet/subnetmod.c index d4f61bdd6..0f1df417f 100644 --- a/edns-subnet/subnetmod.c +++ b/edns-subnet/subnetmod.c @@ -765,7 +765,7 @@ subnetmod_operate(struct module_qstate *qstate, enum module_ev event, } else if(qstate->mesh_info->reply_list) { subnet_option_from_ss( - &qstate->mesh_info->reply_list->query_reply.addr, + &qstate->mesh_info->reply_list->query_reply.client_addr, &sq->ecs_client_in, qstate->env->cfg); } diff --git a/iterator/iter_delegpt.c b/iterator/iter_delegpt.c index 4bffa1b3a..fd07aaa13 100644 --- a/iterator/iter_delegpt.c +++ b/iterator/iter_delegpt.c @@ -78,6 +78,7 @@ struct delegpt* delegpt_copy(struct delegpt* dp, struct regional* region) if(!delegpt_add_ns(copy, region, ns->name, ns->lame, ns->tls_auth_name, ns->port)) return NULL; + copy->nslist->cache_lookup_count = ns->cache_lookup_count; copy->nslist->resolved = ns->resolved; copy->nslist->got4 = ns->got4; copy->nslist->got6 = ns->got6; @@ -121,6 +122,7 @@ delegpt_add_ns(struct delegpt* dp, struct regional* region, uint8_t* name, ns->namelen = len; dp->nslist = ns; ns->name = regional_alloc_init(region, name, ns->namelen); + ns->cache_lookup_count = 0; ns->resolved = 0; ns->got4 = 0; ns->got6 = 0; @@ -620,6 +622,7 @@ int delegpt_add_ns_mlc(struct delegpt* dp, uint8_t* name, uint8_t lame, } ns->next = dp->nslist; dp->nslist = ns; + ns->cache_lookup_count = 0; ns->resolved = 0; ns->got4 = 0; ns->got6 = 0; diff --git a/iterator/iter_delegpt.h b/iterator/iter_delegpt.h index 62c8edc51..586597a69 100644 --- a/iterator/iter_delegpt.h +++ b/iterator/iter_delegpt.h @@ -101,6 +101,8 @@ struct delegpt_ns { uint8_t* name; /** length of name */ size_t namelen; + /** number of cache lookups for the name */ + int cache_lookup_count; /** * If the name has been resolved. false if not queried for yet. * true if the A, AAAA queries have been generated. diff --git a/iterator/iter_hints.c b/iterator/iter_hints.c index 9b1a200bb..a60d9a6b1 100644 --- a/iterator/iter_hints.c +++ b/iterator/iter_hints.c @@ -100,7 +100,7 @@ ah(struct delegpt* dp, const char* sv, const char* ip) return 0; } if(!delegpt_add_ns_mlc(dp, dname, 0, NULL, UNBOUND_DNS_PORT) || - !extstrtoaddr(ip, &addr, &addrlen) || + !extstrtoaddr(ip, &addr, &addrlen, UNBOUND_DNS_PORT) || !delegpt_add_target_mlc(dp, dname, dname_len, &addr, addrlen, 0, 0)) { free(dname); diff --git a/iterator/iter_resptype.c b/iterator/iter_resptype.c index f146a2b6b..c2b824a0f 100644 --- a/iterator/iter_resptype.c +++ b/iterator/iter_resptype.c @@ -113,7 +113,11 @@ response_type_from_server(int rdset, if(!msg || !request) return RESPONSE_TYPE_THROWAWAY; - + /* If the TC flag is set, the response is incomplete. Too large to + * fit even in TCP or so. Discard it, it cannot be retrieved here. */ + if((msg->rep->flags & BIT_TC)) + return RESPONSE_TYPE_THROWAWAY; + /* If the message is NXDOMAIN, then it answers the question. */ if(FLAGS_GET_RCODE(msg->rep->flags) == LDNS_RCODE_NXDOMAIN) { /* make sure its not recursive when we don't want it to */ diff --git a/iterator/iter_utils.c b/iterator/iter_utils.c index 3e13e595c..56b184a02 100644 --- a/iterator/iter_utils.c +++ b/iterator/iter_utils.c @@ -1209,6 +1209,9 @@ int iter_lookup_parent_glue_from_cache(struct module_env* env, struct delegpt_ns* ns; size_t num = delegpt_count_targets(dp); for(ns = dp->nslist; ns; ns = ns->next) { + if(ns->cache_lookup_count > ITERATOR_NAME_CACHELOOKUP_MAX_PSIDE) + continue; + ns->cache_lookup_count++; /* get cached parentside A */ akey = rrset_cache_lookup(env->rrset_cache, ns->name, ns->namelen, LDNS_RR_TYPE_A, qinfo->qclass, diff --git a/iterator/iter_utils.h b/iterator/iter_utils.h index 8583fde58..850be96a6 100644 --- a/iterator/iter_utils.h +++ b/iterator/iter_utils.h @@ -62,6 +62,15 @@ struct ub_packed_rrset_key; struct module_stack; struct outside_network; +/* max number of lookups in the cache for target nameserver names. + * This stops, for large delegations, N*N lookups in the cache. */ +#define ITERATOR_NAME_CACHELOOKUP_MAX 3 +/* max number of lookups in the cache for parentside glue for nameserver names + * This stops, for larger delegations, N*N lookups in the cache. + * It is a little larger than the nonpside max, so it allows a couple extra + * lookups of parent side glue. */ +#define ITERATOR_NAME_CACHELOOKUP_MAX_PSIDE 5 + /** * Process config options and set iterator module state. * Sets default values if no config is found. diff --git a/iterator/iterator.c b/iterator/iterator.c index 51a24f5bf..5fd8733b2 100644 --- a/iterator/iterator.c +++ b/iterator/iterator.c @@ -256,9 +256,9 @@ error_supers(struct module_qstate* qstate, int id, struct module_qstate* super) log_err("out of memory adding missing"); } delegpt_mark_neg(dpns, qstate->qinfo.qtype); - dpns->resolved = 1; /* mark as failed */ if((dpns->got4 == 2 || !ie->supports_ipv4) && (dpns->got6 == 2 || !ie->supports_ipv6)) { + dpns->resolved = 1; /* mark as failed */ target_count_increase_nx(super_iq, 1); } } @@ -597,15 +597,17 @@ errinf_reply(struct module_qstate* qstate, struct iter_qstate* iq) { if(qstate->env->cfg->val_log_level < 2 && !qstate->env->cfg->log_servfail) return; - if((qstate->reply && qstate->reply->addrlen != 0) || - (iq->fail_reply && iq->fail_reply->addrlen != 0)) { + if((qstate->reply && qstate->reply->remote_addrlen != 0) || + (iq->fail_reply && iq->fail_reply->remote_addrlen != 0)) { char from[256], frm[512]; - if(qstate->reply && qstate->reply->addrlen != 0) - addr_to_str(&qstate->reply->addr, qstate->reply->addrlen, - from, sizeof(from)); + if(qstate->reply && qstate->reply->remote_addrlen != 0) + addr_to_str(&qstate->reply->remote_addr, + qstate->reply->remote_addrlen, from, + sizeof(from)); else - addr_to_str(&iq->fail_reply->addr, iq->fail_reply->addrlen, - from, sizeof(from)); + addr_to_str(&iq->fail_reply->remote_addr, + iq->fail_reply->remote_addrlen, from, + sizeof(from)); snprintf(frm, sizeof(frm), "from %s", from); errinf(qstate, frm); } @@ -1219,6 +1221,15 @@ generate_dnskey_prefetch(struct module_qstate* qstate, (qstate->query_flags&BIT_RD) && !(qstate->query_flags&BIT_CD)){ return; } + /* we do not generate this prefetch when the query list is full, + * the query is fetched, if needed, when the validator wants it. + * At that time the validator waits for it, after spawning it. + * This means there is one state that uses cpu and a socket, the + * spawned while this one waits, and not several at the same time, + * if we had created the lookup here. And this helps to keep + * the total load down, but the query still succeeds to resolve. */ + if(mesh_jostle_exceeded(qstate->env->mesh)) + return; /* if the DNSKEY is in the cache this lookup will stop quickly */ log_nametypeclass(VERB_ALGO, "schedule dnskey prefetch", @@ -1912,6 +1923,14 @@ query_for_targets(struct module_qstate* qstate, struct iter_qstate* iq, return 0; } query_count++; + /* If the mesh query list is full, exit the loop here. + * This makes the routine spawn one query at a time, + * and this means there is no query state load + * increase, because the spawned state uses cpu and a + * socket while this state waits for that spawned + * state. Next time we can look up further targets */ + if(mesh_jostle_exceeded(qstate->env->mesh)) + break; } /* Send the A request. */ if(ie->supports_ipv4 && @@ -1926,6 +1945,9 @@ query_for_targets(struct module_qstate* qstate, struct iter_qstate* iq, return 0; } query_count++; + /* If the mesh query list is full, exit the loop. */ + if(mesh_jostle_exceeded(qstate->env->mesh)) + break; } /* mark this target as in progress. */ @@ -2086,6 +2108,15 @@ processLastResort(struct module_qstate* qstate, struct iter_qstate* iq, } ns->done_pside6 = 1; query_count++; + if(mesh_jostle_exceeded(qstate->env->mesh)) { + /* Wait for the lookup; do not spawn multiple + * lookups at a time. */ + verbose(VERB_ALGO, "try parent-side glue lookup"); + iq->num_target_queries += query_count; + target_count_increase(iq, query_count); + qstate->ext_state[id] = module_wait_subquery; + return 0; + } } if(ie->supports_ipv4 && !ns->done_pside4) { /* Send the A request. */ @@ -2234,6 +2265,7 @@ processQueryTargets(struct module_qstate* qstate, struct iter_qstate* iq, size_t qout_orig_len = 0; int sq_check_ratelimit = 1; int sq_was_ratelimited = 0; + int can_do_promisc = 0; /* NOTE: a request will encounter this state for each target it * needs to send a query to. That is, at least one per referral, @@ -2245,7 +2277,6 @@ processQueryTargets(struct module_qstate* qstate, struct iter_qstate* iq, iq->num_current_queries, iq->sent_count); /* Make sure that we haven't run away */ - /* FIXME: is this check even necessary? */ if(iq->referral_count > MAX_REFERRAL_COUNT) { verbose(VERB_QUERY, "request has exceeded the maximum " "number of referrrals with %d", iq->referral_count); @@ -2562,6 +2593,11 @@ processQueryTargets(struct module_qstate* qstate, struct iter_qstate* iq, && iq->num_target_queries == 0 && (!iq->target_count || iq->target_count[TARGET_COUNT_NX]==0) && iq->sent_count < TARGET_FETCH_STOP) { + can_do_promisc = 1; + } + /* if the mesh query list is full, then do not waste cpu and sockets to + * fetch promiscuous targets. They can be looked up when needed. */ + if(can_do_promisc && !mesh_jostle_exceeded(qstate->env->mesh)) { tf_policy = ie->target_fetch_policy[iq->depth]; } @@ -2733,6 +2769,37 @@ processQueryTargets(struct module_qstate* qstate, struct iter_qstate* iq, return 0; } + /* We have a target. We could have created promiscuous target + * queries but we are currently under pressure (mesh_jostle_exceeded). + * If we are configured to allow promiscuous target queries and haven't + * gone out to the network for a target query for this delegation, then + * it is possible to slip in a promiscuous one with a 1/10 chance. */ + if(can_do_promisc && tf_policy == 0 && iq->depth == 0 + && iq->depth < ie->max_dependency_depth + && ie->target_fetch_policy[iq->depth] != 0 + && iq->dp_target_count == 0 + && !ub_random_max(qstate->env->rnd, 10)) { + int extra = 0; + verbose(VERB_ALGO, "available target exists in cache but " + "attempt to get extra 1 target"); + (void)query_for_targets(qstate, iq, ie, id, 1, &extra); + /* errors ignored, these targets are not strictly necessary for + * this result, we do not have to reply with SERVFAIL */ + if(extra > 0) { + iq->num_target_queries += extra; + target_count_increase(iq, extra); + check_waiting_queries(iq, qstate, id); + /* undo qname minimise step because we'll get back here + * to do it again */ + if(qout_orig && iq->minimise_count > 0) { + iq->minimise_count--; + iq->qinfo_out.qname = qout_orig; + iq->qinfo_out.qname_len = qout_orig_len; + } + return 0; + } + } + /* Do not check ratelimit for forwarding queries or if we already got a * pass. */ sq_check_ratelimit = (!(iq->chase_flags & BIT_RD) && !iq->ratelimit_ok); @@ -2840,6 +2907,8 @@ processQueryResponse(struct module_qstate* qstate, struct iter_qstate* iq, (int)((iq->chase_flags&BIT_RD) || iq->chase_to_rd), iq->response, &iq->qinfo_out, iq->dp); iq->chase_to_rd = 0; + /* remove TC flag, if this is erroneously set by TCP upstream */ + iq->response->rep->flags &= ~BIT_TC; if(type == RESPONSE_TYPE_REFERRAL && (iq->chase_flags&BIT_RD) && !iq->auth_zone_response) { /* When forwarding (RD bit is set), we handle referrals @@ -2863,8 +2932,8 @@ processQueryResponse(struct module_qstate* qstate, struct iter_qstate* iq, * use dnssec-lame-bypass if it needs to query there.*/ if(qstate->reply) { struct delegpt_addr* a = delegpt_find_addr( - iq->dp, &qstate->reply->addr, - qstate->reply->addrlen); + iq->dp, &qstate->reply->remote_addr, + qstate->reply->remote_addrlen); if(a) a->dnsseclame = 1; } /* test the answer is from the zone we expected, @@ -2960,9 +3029,9 @@ processQueryResponse(struct module_qstate* qstate, struct iter_qstate* iq, (*qstate->env->detach_subs)(qstate); iq->num_target_queries = 0; if(qstate->reply) - sock_list_insert(&qstate->reply_origin, - &qstate->reply->addr, qstate->reply->addrlen, - qstate->region); + sock_list_insert(&qstate->reply_origin, + &qstate->reply->remote_addr, + qstate->reply->remote_addrlen, qstate->region); if(iq->minimisation_state != DONOT_MINIMISE_STATE && !(iq->chase_flags & BIT_RD)) { if(FLAGS_GET_RCODE(iq->response->rep->flags) != @@ -3217,9 +3286,9 @@ processQueryResponse(struct module_qstate* qstate, struct iter_qstate* iq, (*qstate->env->detach_subs)(qstate); iq->num_target_queries = 0; if(qstate->reply) - sock_list_insert(&qstate->reply_origin, - &qstate->reply->addr, qstate->reply->addrlen, - qstate->region); + sock_list_insert(&qstate->reply_origin, + &qstate->reply->remote_addr, + qstate->reply->remote_addrlen, qstate->region); verbose(VERB_ALGO, "cleared outbound list for query restart"); /* go to INIT_REQUEST_STATE for new qname. */ return next_state(iq, INIT_REQUEST_STATE); @@ -3233,9 +3302,10 @@ processQueryResponse(struct module_qstate* qstate, struct iter_qstate* iq, } else if(qstate->reply) { /* need addr for lameness cache, but we may have * gotten this from cache, so test to be sure */ - if(!infra_set_lame(qstate->env->infra_cache, - &qstate->reply->addr, qstate->reply->addrlen, - iq->dp->name, iq->dp->namelen, + if(!infra_set_lame(qstate->env->infra_cache, + &qstate->reply->remote_addr, + qstate->reply->remote_addrlen, + iq->dp->name, iq->dp->namelen, *qstate->env->now, dnsseclame, 0, iq->qchase.qtype)) log_err("mark host lame: out of memory"); @@ -3252,8 +3322,9 @@ processQueryResponse(struct module_qstate* qstate, struct iter_qstate* iq, * gotten this from cache, so test to be sure */ verbose(VERB_DETAIL, "mark as REC_LAME"); if(!infra_set_lame(qstate->env->infra_cache, - &qstate->reply->addr, qstate->reply->addrlen, - iq->dp->name, iq->dp->namelen, + &qstate->reply->remote_addr, + qstate->reply->remote_addrlen, + iq->dp->name, iq->dp->namelen, *qstate->env->now, 0, 1, iq->qchase.qtype)) log_err("mark host lame: out of memory"); } @@ -3494,12 +3565,13 @@ processTargetResponse(struct module_qstate* qstate, int id, } else { verbose(VERB_ALGO, "iterator TargetResponse failed"); delegpt_mark_neg(dpns, qstate->qinfo.qtype); - dpns->resolved = 1; /* fail the target */ if((dpns->got4 == 2 || !ie->supports_ipv4) && - (dpns->got6 == 2 || !ie->supports_ipv6) && + (dpns->got6 == 2 || !ie->supports_ipv6)) { + dpns->resolved = 1; /* fail the target */ /* do not count cached answers */ - (qstate->reply_origin && qstate->reply_origin->len != 0)) { - target_count_increase_nx(foriq, 1); + if(qstate->reply_origin && qstate->reply_origin->len != 0) { + target_count_increase_nx(foriq, 1); + } } } } @@ -3970,6 +4042,17 @@ process_response(struct module_qstate* qstate, struct iter_qstate* iq, } // @TODO set renewed cookie here with infra_set_server_cookie, then bail out + if(qstate->env->cfg->upstream_cookies && event == module_event_interface_not_available) { + struct edns_cookie cookie; + // @TODO make into renew cookie function + infra_get_cookie(qstate->env->infra_cache, &qstate->reply->remote_addr, + qstate->reply->remote_addrlen, iq->dp->name, iq->dp->namelen, + *qstate->env->now, &cookie, 1); + + log_err("!!!!!! interface unavailbale, renewing cookie"); + + goto handle_it; + } if(event == module_event_noreply || event == module_event_error) { if(event == module_event_noreply && iq->timeout_count >= 3 && @@ -4062,7 +4145,8 @@ process_response(struct module_qstate* qstate, struct iter_qstate* iq, * changed */ if (cookie->opt_len == 24 && infra_set_server_cookie(qstate->env->infra_cache, - &qstate->reply->addr, qstate->reply->addrlen, + &qstate->reply->remote_addr, + qstate->reply->remote_addrlen, iq->dp->name, iq->dp->namelen, pif_ptr, cookie) >= 0) { // @TODO do something @@ -4119,8 +4203,8 @@ process_response(struct module_qstate* qstate, struct iter_qstate* iq, if(!iq->response) goto handle_it; log_query_info(VERB_DETAIL, "response for", &qstate->qinfo); - log_name_addr(VERB_DETAIL, "reply from", iq->dp->name, - &qstate->reply->addr, qstate->reply->addrlen); + log_name_addr(VERB_DETAIL, "reply from", iq->dp->name, + &qstate->reply->remote_addr, qstate->reply->remote_addrlen); if(verbosity >= VERB_ALGO) log_dns_msg("incoming scrubbed packet:", &iq->response->qinfo, iq->response->rep); diff --git a/iterator/iterator.h b/iterator/iterator.h index b71b7fe99..18d3270a0 100644 --- a/iterator/iterator.h +++ b/iterator/iterator.h @@ -67,7 +67,8 @@ struct rbtree_type; #define MAX_RESTART_COUNT 11 /** max number of referrals. Makes sure resolver does not run away */ #define MAX_REFERRAL_COUNT 130 -/** max number of queries-sent-out. Make sure large NS set does not loop */ +/** max number of queries-sent-out. Make sure large NS set does not loop. + * Resets on query restarts (e.g., CNAMES) and referrals. */ #define MAX_SENT_COUNT 32 /** max number of queries for which to perform dnsseclameness detection, * (rrsigs missing detection) after that, just pick up that response */ @@ -324,7 +325,7 @@ struct iter_qstate { /** the number of times this query has been restarted. */ int query_restart_count; - /** the number of times this query as followed a referral. */ + /** the number of times this query has followed a referral. */ int referral_count; /** number of queries fired off */ diff --git a/libunbound/libunbound.c b/libunbound/libunbound.c index 038b7b927..ea5ef24bb 100644 --- a/libunbound/libunbound.c +++ b/libunbound/libunbound.c @@ -951,7 +951,7 @@ ub_ctx_set_fwd(struct ub_ctx* ctx, const char* addr) lock_basic_unlock(&ctx->cfglock); /* check syntax for addr */ - if(!extstrtoaddr(addr, &storage, &stlen)) { + if(!extstrtoaddr(addr, &storage, &stlen, UNBOUND_DNS_PORT)) { errno=EINVAL; return UB_SYNTAX; } @@ -1031,7 +1031,7 @@ int ub_ctx_set_stub(struct ub_ctx* ctx, const char* zone, const char* addr, if(addr) { struct sockaddr_storage storage; socklen_t stlen; - if(!extstrtoaddr(addr, &storage, &stlen)) { + if(!extstrtoaddr(addr, &storage, &stlen, UNBOUND_DNS_PORT)) { errno=EINVAL; return UB_SYNTAX; } diff --git a/libunbound/libworker.c b/libunbound/libworker.c index 11bf5f9db..d5fabe6fb 100644 --- a/libunbound/libworker.c +++ b/libunbound/libworker.c @@ -604,6 +604,8 @@ setup_qinfo_edns(struct libworker* w, struct ctx_query* q, edns->opt_list_out = NULL; edns->opt_list_inplace_cb_out = NULL; edns->padding_block_size = 0; + edns->cookie_present = 0; + edns->cookie_valid = 0; if(sldns_buffer_capacity(w->back->udp_buff) < 65535) edns->udp_size = (uint16_t)sldns_buffer_capacity( w->back->udp_buff); diff --git a/pythonmod/interface.i b/pythonmod/interface.i index 0d95613f8..df8514b47 100644 --- a/pythonmod/interface.i +++ b/pythonmod/interface.i @@ -609,9 +609,9 @@ struct mesh_reply { struct comm_reply query_reply; }; -%rename(_addr) comm_reply::addr; +%rename(_addr) comm_reply::client_addr; struct comm_reply { - struct sockaddr_storage addr; + struct sockaddr_storage client_addr; }; %extend comm_reply { diff --git a/pythonmod/pythonmod_utils.c b/pythonmod/pythonmod_utils.c index 1f6f25129..aebe4d2bb 100644 --- a/pythonmod/pythonmod_utils.c +++ b/pythonmod/pythonmod_utils.c @@ -172,14 +172,14 @@ int createResponse(struct module_qstate* qstate, sldns_buffer* pkt) } -/* Convert reply->addr to string */ +/* Convert reply->client_addr to string */ void reply_addr2str(struct comm_reply* reply, char* dest, int maxlen) { - int af = (int)((struct sockaddr_in*) &(reply->addr))->sin_family; - void* sinaddr = &((struct sockaddr_in*) &(reply->addr))->sin_addr; + int af = (int)((struct sockaddr_in*) &(reply->client_addr))->sin_family; + void* sinaddr = &((struct sockaddr_in*) &(reply->client_addr))->sin_addr; if(af == AF_INET6) - sinaddr = &((struct sockaddr_in6*)&(reply->addr))->sin6_addr; + sinaddr = &((struct sockaddr_in6*)&(reply->client_addr))->sin6_addr; dest[0] = 0; if (inet_ntop(af, sinaddr, dest, (socklen_t)maxlen) == 0) return; diff --git a/respip/respip.c b/respip/respip.c index deff66317..942e082b9 100644 --- a/respip/respip.c +++ b/respip/respip.c @@ -1290,7 +1290,7 @@ respip_set_is_empty(const struct respip_set* set) void respip_inform_print(struct respip_action_info* respip_actinfo, uint8_t* qname, uint16_t qtype, uint16_t qclass, struct local_rrset* local_alias, - struct comm_reply* repinfo) + struct sockaddr_storage* addr, socklen_t addrlen) { char srcip[128], respip[128], txt[512]; unsigned port; @@ -1300,10 +1300,10 @@ respip_inform_print(struct respip_action_info* respip_actinfo, uint8_t* qname, if(local_alias) qname = local_alias->rrset->rk.dname; - port = (unsigned)((repinfo->addr.ss_family == AF_INET) ? - ntohs(((struct sockaddr_in*)&repinfo->addr)->sin_port) : - ntohs(((struct sockaddr_in6*)&repinfo->addr)->sin6_port)); - addr_to_str(&repinfo->addr, repinfo->addrlen, srcip, sizeof(srcip)); + port = (unsigned)((addr->ss_family == AF_INET) ? + ntohs(((struct sockaddr_in*)addr)->sin_port) : + ntohs(((struct sockaddr_in6*)addr)->sin6_port)); + addr_to_str(addr, addrlen, srcip, sizeof(srcip)); addr_to_str(&respip_addr->addr, respip_addr->addrlen, respip, sizeof(respip)); if(respip_actinfo->rpz_log) { diff --git a/respip/respip.h b/respip/respip.h index 988a72263..e4ab5cc9c 100644 --- a/respip/respip.h +++ b/respip/respip.h @@ -251,11 +251,13 @@ int respip_set_is_empty(const struct respip_set* set); * @param local_alias: set to a local alias if the query matches an alias in * a local zone. In this case its owner name will be considered the actual * query name. - * @param repinfo: reply info containing the client's source address and port. + * @param addr: the client's source address and port. + * @param addrlen: the client's source address length. */ void respip_inform_print(struct respip_action_info* respip_actinfo, uint8_t* qname, uint16_t qtype, uint16_t qclass, - struct local_rrset* local_alias, struct comm_reply* repinfo); + struct local_rrset* local_alias, struct sockaddr_storage* addr, + socklen_t addrlen); /** * Find resp_addr in tree, create and add to tree if it does not exist. diff --git a/services/authzone.c b/services/authzone.c index b9e0b11ef..079a7eaf1 100644 --- a/services/authzone.c +++ b/services/authzone.c @@ -3699,7 +3699,7 @@ addr_matches_master(struct auth_master* master, struct sockaddr_storage* addr, /* compare address (but not port number, that is the destination * port of the master, the port number of the received notify is * allowed to by any port on that master) */ - if(extstrtoaddr(master->host, &a, &alen) && + if(extstrtoaddr(master->host, &a, &alen, UNBOUND_DNS_PORT) && sockaddr_cmp_addr(addr, addrlen, &a, alen)==0) { *fromhost = master; return 1; @@ -5381,7 +5381,7 @@ xfr_transfer_lookup_host(struct auth_xfer* xfr, struct module_env* env) struct edns_data edns; sldns_buffer* buf = env->scratch_buffer; if(!master) return 0; - if(extstrtoaddr(master->host, &addr, &addrlen)) { + if(extstrtoaddr(master->host, &addr, &addrlen, UNBOUND_DNS_PORT)) { /* not needed, host is in IP addr format */ return 0; } @@ -5419,6 +5419,8 @@ xfr_transfer_lookup_host(struct auth_xfer* xfr, struct module_env* env) edns.opt_list_out = NULL; edns.opt_list_inplace_cb_out = NULL; edns.padding_block_size = 0; + edns.cookie_present = 0; + edns.cookie_valid = 0; if(sldns_buffer_capacity(buf) < 65535) edns.udp_size = (uint16_t)sldns_buffer_capacity(buf); else edns.udp_size = 65535; @@ -6572,7 +6574,7 @@ xfr_probe_lookup_host(struct auth_xfer* xfr, struct module_env* env) struct edns_data edns; sldns_buffer* buf = env->scratch_buffer; if(!master) return 0; - if(extstrtoaddr(master->host, &addr, &addrlen)) { + if(extstrtoaddr(master->host, &addr, &addrlen, UNBOUND_DNS_PORT)) { /* not needed, host is in IP addr format */ return 0; } @@ -6612,6 +6614,8 @@ xfr_probe_lookup_host(struct auth_xfer* xfr, struct module_env* env) edns.opt_list_out = NULL; edns.opt_list_inplace_cb_out = NULL; edns.padding_block_size = 0; + edns.cookie_present = 0; + edns.cookie_valid = 0; if(sldns_buffer_capacity(buf) < 65535) edns.udp_size = (uint16_t)sldns_buffer_capacity(buf); else edns.udp_size = 65535; diff --git a/services/cache/dns.c b/services/cache/dns.c index 6bca8d85f..b6e569734 100644 --- a/services/cache/dns.c +++ b/services/cache/dns.c @@ -404,6 +404,9 @@ cache_fill_missing(struct module_env* env, uint16_t qclass, struct ub_packed_rrset_key* akey; time_t now = *env->now; for(ns = dp->nslist; ns; ns = ns->next) { + if(ns->cache_lookup_count > ITERATOR_NAME_CACHELOOKUP_MAX) + continue; + ns->cache_lookup_count++; akey = rrset_cache_lookup(env->rrset_cache, ns->name, ns->namelen, LDNS_RR_TYPE_A, qclass, 0, now, 0); if(akey) { diff --git a/services/cache/infra.c b/services/cache/infra.c index 03a6b8c2c..5fb697d01 100644 --- a/services/cache/infra.c +++ b/services/cache/infra.c @@ -716,7 +716,7 @@ infra_edns_update(struct infra_cache* infra, struct sockaddr_storage* addr, int infra_get_cookie(struct infra_cache* infra, struct sockaddr_storage* addr, socklen_t addrlen, uint8_t* name, size_t namelen, - time_t timenow, struct edns_cookie* cookie) + time_t timenow, struct edns_cookie* cookie, int renew) { struct lruhash_entry* e = infra_lookup_nottl(infra, addr, addrlen, name, namelen, 1); @@ -741,10 +741,10 @@ infra_get_cookie(struct infra_cache* infra, struct sockaddr_storage* addr, data = (struct infra_data*) e->data; /* renew cookie if the address that is stored isn't available */ - if (data->cookie.pif.addrlen == 0 && - data->cookie.state == SERVER_COOKIE_LEARNED) { + if (renew == 1 || (data->cookie.pif.addrlen == 0 && + data->cookie.state == SERVER_COOKIE_LEARNED)) { infra_fill_client_cookie_random(infra, (uint8_t*) &data->cookie.data); - data->cookie.state == SERVER_COOKIE_UNKNOWN; + data->cookie.state = SERVER_COOKIE_UNKNOWN; } memcpy(cookie, &data->cookie, sizeof(struct edns_cookie)); @@ -1026,14 +1026,13 @@ static struct lruhash_entry* infra_find_ratedata(struct infra_cache* infra, /** find data item in array for ip addresses */ static struct lruhash_entry* infra_find_ip_ratedata(struct infra_cache* infra, - struct comm_reply* repinfo, int wr) + struct sockaddr_storage* addr, socklen_t addrlen, int wr) { struct ip_rate_key key; - hashvalue_type h = hash_addr(&(repinfo->addr), - repinfo->addrlen, 0); + hashvalue_type h = hash_addr(addr, addrlen, 0); memset(&key, 0, sizeof(key)); - key.addr = repinfo->addr; - key.addrlen = repinfo->addrlen; + key.addr = *addr; + key.addrlen = addrlen; key.entry.hash = h; return slabhash_lookup(infra->client_ip_rates, h, &key, wr); } @@ -1068,10 +1067,9 @@ static void infra_create_ratedata(struct infra_cache* infra, /** create rate data item for ip address */ static void infra_ip_create_ratedata(struct infra_cache* infra, - struct comm_reply* repinfo, time_t timenow) + struct sockaddr_storage* addr, socklen_t addrlen, time_t timenow) { - hashvalue_type h = hash_addr(&(repinfo->addr), - repinfo->addrlen, 0); + hashvalue_type h = hash_addr(addr, addrlen, 0); struct ip_rate_key* k = (struct ip_rate_key*)calloc(1, sizeof(*k)); struct ip_rate_data* d = (struct ip_rate_data*)calloc(1, sizeof(*d)); if(!k || !d) { @@ -1079,8 +1077,8 @@ static void infra_ip_create_ratedata(struct infra_cache* infra, free(d); return; /* alloc failure */ } - k->addr = repinfo->addr; - k->addrlen = repinfo->addrlen; + k->addr = *addr; + k->addrlen = addrlen; lock_rw_init(&k->entry.lock); k->entry.hash = h; k->entry.key = k; @@ -1177,8 +1175,8 @@ int infra_ratelimit_inc(struct infra_cache* infra, uint8_t* name, sldns_wire2str_class_buf(qinfo->qclass, cs, sizeof(cs)); ip[0]=0; if(replylist) { - addr_to_str((struct sockaddr_storage *)&replylist->addr, - replylist->addrlen, ip, sizeof(ip)); + addr_to_str((struct sockaddr_storage *)&replylist->remote_addr, + replylist->remote_addrlen, ip, sizeof(ip)); verbose(VERB_OPS, "ratelimit exceeded %s %d query %s %s %s from %s", buf, lim, qnm, cs, ts, ip); } else { verbose(VERB_OPS, "ratelimit exceeded %s %d query %s %s %s", buf, lim, qnm, cs, ts); @@ -1246,8 +1244,8 @@ infra_get_mem(struct infra_cache* infra) } int infra_ip_ratelimit_inc(struct infra_cache* infra, - struct comm_reply* repinfo, time_t timenow, int backoff, - struct sldns_buffer* buffer) + struct sockaddr_storage* addr, socklen_t addrlen, time_t timenow, + int backoff, struct sldns_buffer* buffer) { int max; struct lruhash_entry* entry; @@ -1257,7 +1255,7 @@ int infra_ip_ratelimit_inc(struct infra_cache* infra, return 1; } /* find or insert ratedata */ - entry = infra_find_ip_ratedata(infra, repinfo, 1); + entry = infra_find_ip_ratedata(infra, addr, addrlen, 1); if(entry) { int premax = infra_rate_max(entry->data, timenow, backoff); int* cur = infra_rate_give_second(entry->data, timenow); @@ -1267,8 +1265,7 @@ int infra_ip_ratelimit_inc(struct infra_cache* infra, if(premax <= infra_ip_ratelimit && max > infra_ip_ratelimit) { char client_ip[128], qnm[LDNS_MAX_DOMAINLEN+1+12+12]; - addr_to_str((struct sockaddr_storage *)&repinfo->addr, - repinfo->addrlen, client_ip, sizeof(client_ip)); + addr_to_str(addr, addrlen, client_ip, sizeof(client_ip)); qnm[0]=0; if(sldns_buffer_limit(buffer)>LDNS_HEADER_SIZE && LDNS_QDCOUNT(sldns_buffer_begin(buffer))!=0) { @@ -1293,6 +1290,6 @@ int infra_ip_ratelimit_inc(struct infra_cache* infra, } /* create */ - infra_ip_create_ratedata(infra, repinfo, timenow); + infra_ip_create_ratedata(infra, addr, addrlen, timenow); return 1; } diff --git a/services/cache/infra.h b/services/cache/infra.h index d2d334545..ae945e770 100644 --- a/services/cache/infra.h +++ b/services/cache/infra.h @@ -380,7 +380,7 @@ int infra_edns_update(struct infra_cache* infra, */ int infra_get_cookie(struct infra_cache* infra, struct sockaddr_storage* addr, socklen_t addrlen, uint8_t* name, size_t namelen, - time_t timenow, struct edns_cookie* cookie); + time_t timenow, struct edns_cookie* cookie, int renew); //@TODO fix/remove renew? /** * Find the cookie entry in the cache and update it with to make a 'complete cookie' @@ -501,15 +501,16 @@ int infra_find_ratelimit(struct infra_cache* infra, uint8_t* name, /** Update query ratelimit hash and decide * whether or not a query should be dropped. * @param infra: infra cache - * @param repinfo: information about client + * @param addr: client address + * @param addrlen: client address length * @param timenow: what time it is now. * @param backoff: if backoff is enabled. * @param buffer: with query for logging. * @return 1 if it could be incremented. 0 if the increment overshot the * ratelimit and the query should be dropped. */ int infra_ip_ratelimit_inc(struct infra_cache* infra, - struct comm_reply* repinfo, time_t timenow, int backoff, - struct sldns_buffer* buffer); + struct sockaddr_storage* addr, socklen_t addrlen, time_t timenow, + int backoff, struct sldns_buffer* buffer); /** * Get memory used by the infra cache. diff --git a/services/listen_dnsport.c b/services/listen_dnsport.c index bfb701fda..6c8bb6bc4 100644 --- a/services/listen_dnsport.c +++ b/services/listen_dnsport.c @@ -124,12 +124,12 @@ 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", 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, + "_otherfam", buf, ntohs(((struct sockaddr_in*)addr->ai_addr)->sin_port)); } } @@ -140,7 +140,9 @@ verbose_print_unbound_socket(struct unbound_socket* ub_sock) if(verbosity >= VERB_ALGO) { log_info("listing of unbound_socket structure:"); verbose_print_addr(ub_sock->addr); - log_info("s is: %d, fam is: %s", ub_sock->s, ub_sock->fam == AF_INET?"AF_INET":"AF_INET6"); + log_info("s is: %d, fam is: %s, acl: %s", ub_sock->s, + ub_sock->fam == AF_INET?"AF_INET":"AF_INET6", + ub_sock->acl?"yes":"no"); } } @@ -458,7 +460,14 @@ create_udp_sock(int family, int socktype, struct sockaddr* addr, int action; # endif # if defined(IPV6_V6ONLY) - if(v6only) { + if(v6only +# ifdef HAVE_SYSTEMD + /* Systemd wants to control if the socket is v6 only + * or both, with BindIPv6Only=default, ipv6-only or + * both in systemd.socket, so it is not set here. */ + && !got_fd_from_systemd +# endif + ) { int val=(v6only==2)?0:1; if (setsockopt(s, IPPROTO_IPV6, IPV6_V6ONLY, (void*)&val, (socklen_t)sizeof(val)) < 0) { @@ -776,7 +785,14 @@ create_tcp_accept_sock(struct addrinfo *addr, int v6only, int* noproto, (void)reuseport; #endif /* defined(SO_REUSEPORT) */ #if defined(IPV6_V6ONLY) - if(addr->ai_family == AF_INET6 && v6only) { + if(addr->ai_family == AF_INET6 && v6only +# ifdef HAVE_SYSTEMD + /* Systemd wants to control if the socket is v6 only + * or both, with BindIPv6Only=default, ipv6-only or + * both in systemd.socket, so it is not set here. */ + && !got_fd_from_systemd +# endif + ) { if(setsockopt(s, IPPROTO_IPV6, IPV6_V6ONLY, (void*)&on, (socklen_t)sizeof(on)) < 0) { log_err("setsockopt(..., IPV6_V6ONLY, ...) failed: %s", @@ -1032,6 +1048,7 @@ make_sock(int stype, const char* ifname, const char* port, ub_sock->addr = res; ub_sock->s = s; ub_sock->fam = hints->ai_family; + ub_sock->acl = NULL; return s; } @@ -1076,11 +1093,13 @@ make_sock_port(int stype, const char* ifname, const char* port, * @param list: list head. changed. * @param s: fd. * @param ftype: if fd is UDP. + * @param pp2_enabled: if PROXYv2 is enabled for this port. * @param ub_sock: socket with address. * @return false on failure. list in unchanged then. */ static int -port_insert(struct listen_port** list, int s, enum listen_type ftype, struct unbound_socket* ub_sock) +port_insert(struct listen_port** list, int s, enum listen_type ftype, + int pp2_enabled, struct unbound_socket* ub_sock) { struct listen_port* item = (struct listen_port*)malloc( sizeof(struct listen_port)); @@ -1089,6 +1108,7 @@ port_insert(struct listen_port** list, int s, enum listen_type ftype, struct unb item->next = *list; item->fd = s; item->ftype = ftype; + item->pp2_enabled = pp2_enabled; item->socket = ub_sock; *list = item; return 1; @@ -1184,6 +1204,7 @@ if_is_ssl(const char* ifname, const char* port, int ssl_port, * @param ssl_port: ssl service port number * @param tls_additional_port: list of additional ssl service port numbers. * @param https_port: DoH service port number + * @param proxy_protocol_port: list of PROXYv2 port numbers. * @param reuseport: try to set SO_REUSEPORT if nonNULL and true. * set to false on exit if reuseport failed due to no kernel support. * @param transparent: set IP_TRANSPARENT socket option. @@ -1196,34 +1217,39 @@ if_is_ssl(const char* ifname, const char* port, int ssl_port, * @return: returns false on error. */ static int -ports_create_if(const char* ifname, int do_auto, int do_udp, int do_tcp, +ports_create_if(const char* ifname, int do_auto, int do_udp, int do_tcp, struct addrinfo *hints, const char* port, struct listen_port** list, size_t rcv, size_t snd, int ssl_port, struct config_strlist* tls_additional_port, int https_port, + 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 s, noip6=0; int is_https = if_is_https(ifname, port, https_port); + int is_dnscrypt = if_is_dnscrypt(ifname, port, dnscrypt_port); + int is_pp2 = if_is_pp2(ifname, port, proxy_protocol_port); int nodelay = is_https && http2_nodelay; struct unbound_socket* ub_sock; -#ifdef USE_DNSCRYPT - int is_dnscrypt = ((strchr(ifname, '@') && - atoi(strchr(ifname, '@')+1) == dnscrypt_port) || - (!strchr(ifname, '@') && atoi(port) == dnscrypt_port)); -#else - int is_dnscrypt = 0; - (void)dnscrypt_port; -#endif if(!do_udp && !do_tcp) return 0; + if(is_pp2) { + if(is_dnscrypt) { + fatal_exit("PROXYv2 and DNSCrypt combination not " + "supported!"); + } else if(is_https) { + fatal_exit("PROXYv2 and DoH combination not " + "supported!"); + } + } + if(do_auto) { ub_sock = calloc(1, sizeof(struct unbound_socket)); if(!ub_sock) return 0; - if((s = make_sock_port(SOCK_DGRAM, ifname, port, hints, 1, + 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) { freeaddrinfo(ub_sock->addr); @@ -1241,8 +1267,9 @@ ports_create_if(const char* ifname, int do_auto, int do_udp, int do_tcp, free(ub_sock); return 0; } - if(!port_insert(list, s, - is_dnscrypt?listen_type_udpancil_dnscrypt:listen_type_udpancil, ub_sock)) { + if(!port_insert(list, s, is_dnscrypt + ?listen_type_udpancil_dnscrypt:listen_type_udpancil, + is_pp2, ub_sock)) { sock_close(s); freeaddrinfo(ub_sock->addr); free(ub_sock); @@ -1253,7 +1280,7 @@ ports_create_if(const char* ifname, int do_auto, int do_udp, int do_tcp, if(!ub_sock) return 0; /* regular udp socket */ - if((s = make_sock_port(SOCK_DGRAM, ifname, port, hints, 1, + 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) { freeaddrinfo(ub_sock->addr); @@ -1264,8 +1291,9 @@ ports_create_if(const char* ifname, int do_auto, int do_udp, int do_tcp, } return 0; } - if(!port_insert(list, s, - is_dnscrypt?listen_type_udp_dnscrypt:listen_type_udp, ub_sock)) { + if(!port_insert(list, s, is_dnscrypt + ?listen_type_udp_dnscrypt:listen_type_udp, + is_pp2, ub_sock)) { sock_close(s); freeaddrinfo(ub_sock->addr); free(ub_sock); @@ -1287,7 +1315,7 @@ ports_create_if(const char* ifname, int do_auto, int do_udp, int do_tcp, port_type = listen_type_tcp_dnscrypt; else port_type = listen_type_tcp; - if((s = make_sock_port(SOCK_STREAM, ifname, port, hints, 1, + 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) { freeaddrinfo(ub_sock->addr); @@ -1300,7 +1328,7 @@ ports_create_if(const char* ifname, int do_auto, int do_udp, int do_tcp, } if(is_ssl) verbose(VERB_ALGO, "setup TCP for SSL service"); - if(!port_insert(list, s, port_type, ub_sock)) { + if(!port_insert(list, s, port_type, is_pp2, ub_sock)) { sock_close(s); freeaddrinfo(ub_sock->addr); free(ub_sock); @@ -1389,14 +1417,16 @@ listen_create(struct comm_base* base, struct listen_port* ports, if(ports->ftype == listen_type_udp || ports->ftype == listen_type_udp_dnscrypt) { cp = comm_point_create_udp(base, ports->fd, - front->udp_buff, cb, cb_arg, ports->socket); + front->udp_buff, ports->pp2_enabled, cb, + cb_arg, ports->socket); } else if(ports->ftype == listen_type_tcp || ports->ftype == listen_type_tcp_dnscrypt) { cp = comm_point_create_tcp(base, ports->fd, tcp_accept_count, tcp_idle_timeout, harden_large_queries, 0, NULL, tcp_conn_limit, bufsize, front->udp_buff, - ports->ftype, cb, cb_arg, ports->socket); + ports->ftype, ports->pp2_enabled, cb, cb_arg, + ports->socket); } else if(ports->ftype == listen_type_ssl || ports->ftype == listen_type_http) { cp = comm_point_create_tcp(base, ports->fd, @@ -1404,7 +1434,8 @@ listen_create(struct comm_base* base, struct listen_port* ports, harden_large_queries, http_max_streams, http_endpoint, tcp_conn_limit, bufsize, front->udp_buff, - ports->ftype, cb, cb_arg, ports->socket); + ports->ftype, ports->pp2_enabled, cb, cb_arg, + ports->socket); if(ports->ftype == listen_type_http) { if(!sslctx && !http_notls) { log_warn("HTTPS port configured, but " @@ -1430,7 +1461,8 @@ listen_create(struct comm_base* base, struct listen_port* ports, } else if(ports->ftype == listen_type_udpancil || ports->ftype == listen_type_udpancil_dnscrypt) { cp = comm_point_create_udp_ancil(base, ports->fd, - front->udp_buff, cb, cb_arg, ports->socket); + front->udp_buff, ports->pp2_enabled, cb, + cb_arg, ports->socket); } if(!cp) { log_err("can't create commpoint"); @@ -1702,7 +1734,7 @@ int resolve_interface_names(char** ifs, int num_ifs, #endif /* HAVE_GETIFADDRS */ } -struct listen_port* +struct listen_port* listening_ports_open(struct config_file* cfg, char** ifs, int num_ifs, int* reuseport) { @@ -1765,7 +1797,9 @@ listening_ports_open(struct config_file* cfg, char** ifs, int num_ifs, &hints, portbuf, &list, cfg->so_rcvbuf, cfg->so_sndbuf, cfg->ssl_port, cfg->tls_additional_port, - cfg->https_port, reuseport, cfg->ip_transparent, + cfg->https_port, + cfg->proxy_protocol_port, + reuseport, cfg->ip_transparent, cfg->tcp_mss, cfg->ip_freebind, cfg->http_nodelay, cfg->use_systemd, cfg->dnscrypt_port, cfg->ip_dscp)) { @@ -1780,7 +1814,9 @@ listening_ports_open(struct config_file* cfg, char** ifs, int num_ifs, &hints, portbuf, &list, cfg->so_rcvbuf, cfg->so_sndbuf, cfg->ssl_port, cfg->tls_additional_port, - cfg->https_port, reuseport, cfg->ip_transparent, + cfg->https_port, + cfg->proxy_protocol_port, + reuseport, cfg->ip_transparent, cfg->tcp_mss, cfg->ip_freebind, cfg->http_nodelay, cfg->use_systemd, cfg->dnscrypt_port, cfg->ip_dscp)) { @@ -1793,12 +1829,13 @@ listening_ports_open(struct config_file* cfg, char** ifs, int num_ifs, } if(do_ip6) { hints.ai_family = AF_INET6; - if(!ports_create_if(do_auto?"::0":"::1", - do_auto, cfg->do_udp, do_tcp, + if(!ports_create_if(do_auto?"::0":"::1", + do_auto, cfg->do_udp, do_tcp, &hints, portbuf, &list, cfg->so_rcvbuf, cfg->so_sndbuf, cfg->ssl_port, cfg->tls_additional_port, - cfg->https_port, reuseport, cfg->ip_transparent, + cfg->https_port, cfg->proxy_protocol_port, + reuseport, cfg->ip_transparent, cfg->tcp_mss, cfg->ip_freebind, cfg->http_nodelay, cfg->use_systemd, cfg->dnscrypt_port, cfg->ip_dscp)) { @@ -1808,12 +1845,13 @@ listening_ports_open(struct config_file* cfg, char** ifs, int num_ifs, } if(do_ip4) { hints.ai_family = AF_INET; - if(!ports_create_if(do_auto?"0.0.0.0":"127.0.0.1", - do_auto, cfg->do_udp, do_tcp, + if(!ports_create_if(do_auto?"0.0.0.0":"127.0.0.1", + do_auto, cfg->do_udp, do_tcp, &hints, portbuf, &list, cfg->so_rcvbuf, cfg->so_sndbuf, cfg->ssl_port, cfg->tls_additional_port, - cfg->https_port, reuseport, cfg->ip_transparent, + cfg->https_port, cfg->proxy_protocol_port, + reuseport, cfg->ip_transparent, cfg->tcp_mss, cfg->ip_freebind, cfg->http_nodelay, cfg->use_systemd, cfg->dnscrypt_port, cfg->ip_dscp)) { @@ -1827,10 +1865,11 @@ listening_ports_open(struct config_file* cfg, char** ifs, int num_ifs, continue; hints.ai_family = AF_INET6; if(!ports_create_if(ifs[i], 0, cfg->do_udp, - do_tcp, &hints, portbuf, &list, + do_tcp, &hints, portbuf, &list, cfg->so_rcvbuf, cfg->so_sndbuf, cfg->ssl_port, cfg->tls_additional_port, - cfg->https_port, reuseport, cfg->ip_transparent, + cfg->https_port, cfg->proxy_protocol_port, + reuseport, cfg->ip_transparent, cfg->tcp_mss, cfg->ip_freebind, cfg->http_nodelay, cfg->use_systemd, cfg->dnscrypt_port, cfg->ip_dscp)) { @@ -1842,10 +1881,11 @@ listening_ports_open(struct config_file* cfg, char** ifs, int num_ifs, continue; hints.ai_family = AF_INET; if(!ports_create_if(ifs[i], 0, cfg->do_udp, - do_tcp, &hints, portbuf, &list, + do_tcp, &hints, portbuf, &list, cfg->so_rcvbuf, cfg->so_sndbuf, cfg->ssl_port, cfg->tls_additional_port, - cfg->https_port, reuseport, cfg->ip_transparent, + cfg->https_port, cfg->proxy_protocol_port, + reuseport, cfg->ip_transparent, cfg->tcp_mss, cfg->ip_freebind, cfg->http_nodelay, cfg->use_systemd, cfg->dnscrypt_port, cfg->ip_dscp)) { diff --git a/services/listen_dnsport.h b/services/listen_dnsport.h index 0e63236bc..816d79aea 100644 --- a/services/listen_dnsport.h +++ b/services/listen_dnsport.h @@ -43,6 +43,7 @@ #define LISTEN_DNSPORT_H #include "util/netevent.h" +#include "daemon/acl_list.h" #ifdef HAVE_NGHTTP2_NGHTTP2_H #include #endif @@ -107,11 +108,13 @@ enum listen_type { */ struct unbound_socket { /** socket-address structure */ - struct addrinfo * addr; + struct addrinfo* addr; /** socket descriptor returned by socket() syscall */ - int s; + int s; /** address family (AF_INET/IF_INET6) */ - int fam; + int fam; + /** ACL on the socket (listening interface) */ + struct acl_addr* acl; }; /** @@ -125,7 +128,10 @@ struct listen_port { int fd; /** type of file descriptor, udp or tcp */ enum listen_type ftype; - /** fill in unbpound_socket structure for every opened socket at Unbound startup */ + /** if the port should support PROXYv2 */ + int pp2_enabled; + /** fill in unbound_socket structure for every opened socket at + * Unbound startup */ struct unbound_socket* socket; }; diff --git a/services/localzone.c b/services/localzone.c index 3ed7d835d..3536b7aaa 100644 --- a/services/localzone.c +++ b/services/localzone.c @@ -1744,13 +1744,13 @@ local_zones_zone_answer(struct local_zone* z, struct module_env* env, /** print log information for an inform zone query */ static void lz_inform_print(struct local_zone* z, struct query_info* qinfo, - struct comm_reply* repinfo) + struct sockaddr_storage* addr, socklen_t addrlen) { char ip[128], txt[512]; char zname[LDNS_MAX_DOMAINLEN+1]; - uint16_t port = ntohs(((struct sockaddr_in*)&repinfo->addr)->sin_port); + uint16_t port = ntohs(((struct sockaddr_in*)addr)->sin_port); dname_str(z->name, zname); - addr_to_str(&repinfo->addr, repinfo->addrlen, ip, sizeof(ip)); + addr_to_str(addr, addrlen, ip, sizeof(ip)); snprintf(txt, sizeof(txt), "%s %s %s@%u", zname, local_zone_type2str(z->type), ip, (unsigned)port); log_nametypeclass(NO_VERBOSE, txt, qinfo->qname, qinfo->qtype, qinfo->qclass); @@ -1765,7 +1765,8 @@ lz_type(uint8_t *taglist, size_t taglen, uint8_t *taglist2, size_t taglen2, struct local_zone_override* lzo; if(repinfo && override_tree) { lzo = (struct local_zone_override*)addr_tree_lookup( - override_tree, &repinfo->addr, repinfo->addrlen); + override_tree, &repinfo->client_addr, + repinfo->client_addrlen); if(lzo && lzo->type) { verbose(VERB_ALGO, "local zone override to type %s", local_zone_type2str(lzo->type)); @@ -1888,7 +1889,8 @@ local_zones_answer(struct local_zones* zones, struct module_env* env, lzt == local_zone_inform_deny || lzt == local_zone_inform_redirect) && repinfo) - lz_inform_print(z, qinfo, repinfo); + lz_inform_print(z, qinfo, &repinfo->client_addr, + repinfo->client_addrlen); if(lzt != local_zone_always_refuse && lzt != local_zone_always_transparent diff --git a/services/mesh.c b/services/mesh.c index 972e3d01f..acf7e3912 100644 --- a/services/mesh.c +++ b/services/mesh.c @@ -806,7 +806,7 @@ static void mesh_schedule_prefetch_subnet(struct mesh_area* mesh, /* Fake the ECS data from the client's IP */ struct ecs_data ecs; memset(&ecs, 0, sizeof(ecs)); - subnet_option_from_ss(&rep->addr, &ecs, mesh->env->cfg); + subnet_option_from_ss(&rep->client_addr, &ecs, mesh->env->cfg); if(ecs.subnet_validdata == 0) { log_err("prefetch_subnet subnet_option_from_ss: invalid data"); return; @@ -1490,8 +1490,9 @@ mesh_send_reply(struct mesh_state* m, int rcode, struct reply_info* rep, } /* Log reply sent */ if(m->s.env->cfg->log_replies) { - log_reply_info(NO_VERBOSE, &m->s.qinfo, &r->query_reply.addr, - r->query_reply.addrlen, duration, 0, r_buffer); + log_reply_info(NO_VERBOSE, &m->s.qinfo, + &r->query_reply.client_addr, + r->query_reply.client_addrlen, duration, 0, r_buffer); } } @@ -1532,7 +1533,8 @@ void mesh_query_done(struct mesh_state* mstate) respip_inform_print(mstate->s.respip_action_info, r->qname, mstate->s.qinfo.qtype, mstate->s.qinfo.qclass, r->local_alias, - &r->query_reply); + &r->query_reply.client_addr, + r->query_reply.client_addrlen); if(mstate->s.env->cfg->stat_extended && mstate->s.respip_action_info->rpz_used) { if(mstate->s.respip_action_info->rpz_disabled) @@ -2182,7 +2184,8 @@ mesh_serve_expired_callback(void* arg) if(actinfo.addrinfo) { respip_inform_print(&actinfo, r->qname, qstate->qinfo.qtype, qstate->qinfo.qclass, - r->local_alias, &r->query_reply); + r->local_alias, &r->query_reply.client_addr, + r->query_reply.client_addrlen); if(qstate->env->cfg->stat_extended && actinfo.rpz_used) { if(actinfo.rpz_disabled) @@ -2242,3 +2245,10 @@ mesh_serve_expired_callback(void* arg) mesh_do_callback(mstate, LDNS_RCODE_NOERROR, msg->rep, c, &tv); } } + +int mesh_jostle_exceeded(struct mesh_area* mesh) +{ + if(mesh->all.count < mesh->max_reply_states) + return 0; + return 1; +} diff --git a/services/mesh.h b/services/mesh.h index 3be9b63fa..25121a67b 100644 --- a/services/mesh.h +++ b/services/mesh.h @@ -685,4 +685,15 @@ struct dns_msg* mesh_serve_expired_lookup(struct module_qstate* qstate, struct query_info* lookup_qinfo); +/** + * See if the mesh has space for more queries. You can allocate queries + * anyway, but this checks for the allocated space. + * @param mesh: mesh area. + * @return true if the query list is full. + * It checks the number of all queries, not just number of reply states, + * that have a client address. So that spawned queries count too, + * that were created by the iterator, or other modules. + */ +int mesh_jostle_exceeded(struct mesh_area* mesh); + #endif /* SERVICES_MESH_H */ diff --git a/services/outside_network.c b/services/outside_network.c index 196d20b9b..52b671b75 100644 --- a/services/outside_network.c +++ b/services/outside_network.c @@ -86,10 +86,6 @@ static void serviced_tcp_initiate(struct serviced_query* sq, sldns_buffer* buff) static int randomize_and_send_udp(struct pending* pend, sldns_buffer* packet, int timeout); -/** remove waiting tcp from the outnet waiting list */ -static void waiting_list_remove(struct outside_network* outnet, - struct waiting_tcp* w); - /** select a DNS ID for a TCP stream */ static uint16_t tcp_select_id(struct outside_network* outnet, struct reuse_tcp* reuse); @@ -372,7 +368,8 @@ log_reuse_tcp(enum verbosity_value v, const char* msg, struct reuse_tcp* reuse) } /** pop the first element from the writewait list */ -static struct waiting_tcp* reuse_write_wait_pop(struct reuse_tcp* reuse) +struct waiting_tcp* +reuse_write_wait_pop(struct reuse_tcp* reuse) { struct waiting_tcp* w = reuse->write_wait_first; if(!w) @@ -390,8 +387,8 @@ static struct waiting_tcp* reuse_write_wait_pop(struct reuse_tcp* reuse) } /** remove the element from the writewait list */ -static void reuse_write_wait_remove(struct reuse_tcp* reuse, - struct waiting_tcp* w) +void +reuse_write_wait_remove(struct reuse_tcp* reuse, struct waiting_tcp* w) { log_assert(w); log_assert(w->write_wait_queued); @@ -415,8 +412,8 @@ static void reuse_write_wait_remove(struct reuse_tcp* reuse, } /** push the element after the last on the writewait list */ -static void reuse_write_wait_push_back(struct reuse_tcp* reuse, - struct waiting_tcp* w) +void +reuse_write_wait_push_back(struct reuse_tcp* reuse, struct waiting_tcp* w) { if(!w) return; log_assert(!w->write_wait_queued); @@ -427,7 +424,9 @@ static void reuse_write_wait_push_back(struct reuse_tcp* reuse, w->write_wait_prev = reuse->write_wait_last; } else { reuse->write_wait_first = w; + w->write_wait_prev = NULL; } + w->write_wait_next = NULL; reuse->write_wait_last = w; w->write_wait_queued = 1; } @@ -721,12 +720,12 @@ outnet_tcp_take_into_use(struct waiting_tcp* w) pend->next_free = NULL; pend->query = w; pend->reuse.outnet = w->outnet; - pend->c->repinfo.addrlen = w->addrlen; + pend->c->repinfo.remote_addrlen = w->addrlen; pend->c->tcp_more_read_again = &pend->reuse.cp_more_read_again; pend->c->tcp_more_write_again = &pend->reuse.cp_more_write_again; pend->reuse.cp_more_read_again = 0; pend->reuse.cp_more_write_again = 0; - memcpy(&pend->c->repinfo.addr, &w->addr, w->addrlen); + memcpy(&pend->c->repinfo.remote_addr, &w->addr, w->addrlen); pend->reuse.pending = pend; /* Remove from tree in case the is_ssl will be different and causes the @@ -810,20 +809,50 @@ reuse_tcp_lru_snip(struct outside_network* outnet) return reuse; } -/** call callback on waiting_tcp, if not NULL */ -static void -waiting_tcp_callback(struct waiting_tcp* w, struct comm_point* c, int error, - struct comm_reply* reply_info) +/** remove waiting tcp from the outnet waiting list */ +void +outnet_waiting_tcp_list_remove(struct outside_network* outnet, struct waiting_tcp* w) { - if(w && w->cb) { - fptr_ok(fptr_whitelist_pending_tcp(w->cb)); - (void)(*w->cb)(c, w->cb_arg, error, reply_info); + struct waiting_tcp* p = outnet->tcp_wait_first, *prev = NULL; + w->on_tcp_waiting_list = 0; + while(p) { + if(p == w) { + /* remove w */ + if(prev) + prev->next_waiting = w->next_waiting; + else outnet->tcp_wait_first = w->next_waiting; + if(outnet->tcp_wait_last == w) + outnet->tcp_wait_last = prev; + w->next_waiting = NULL; + return; + } + prev = p; + p = p->next_waiting; } + /* outnet_waiting_tcp_list_remove is currently called only with items + * that are already in the waiting list. */ + log_assert(0); +} + +/** pop the first waiting tcp from the outnet waiting list */ +struct waiting_tcp* +outnet_waiting_tcp_list_pop(struct outside_network* outnet) +{ + struct waiting_tcp* w = outnet->tcp_wait_first; + if(!outnet->tcp_wait_first) return NULL; + log_assert(w->on_tcp_waiting_list); + outnet->tcp_wait_first = w->next_waiting; + if(outnet->tcp_wait_last == w) + outnet->tcp_wait_last = NULL; + w->on_tcp_waiting_list = 0; + w->next_waiting = NULL; + return w; } /** add waiting_tcp element to the outnet tcp waiting list */ -static void -outnet_add_tcp_waiting(struct outside_network* outnet, struct waiting_tcp* w) +void +outnet_waiting_tcp_list_add(struct outside_network* outnet, + struct waiting_tcp* w, int set_timer) { struct timeval tv; log_assert(!w->on_tcp_waiting_list); @@ -835,16 +864,18 @@ outnet_add_tcp_waiting(struct outside_network* outnet, struct waiting_tcp* w) else outnet->tcp_wait_first = w; outnet->tcp_wait_last = w; w->on_tcp_waiting_list = 1; + if(set_timer) { #ifndef S_SPLINT_S - tv.tv_sec = w->timeout/1000; - tv.tv_usec = (w->timeout%1000)*1000; + tv.tv_sec = w->timeout/1000; + tv.tv_usec = (w->timeout%1000)*1000; #endif - comm_timer_set(w->timer, &tv); + comm_timer_set(w->timer, &tv); + } } /** add waiting_tcp element as first to the outnet tcp waiting list */ -static void -outnet_add_tcp_waiting_first(struct outside_network* outnet, +void +outnet_waiting_tcp_list_add_first(struct outside_network* outnet, struct waiting_tcp* w, int reset_timer) { struct timeval tv; @@ -869,6 +900,17 @@ outnet_add_tcp_waiting_first(struct outside_network* outnet, (outnet->tcp_reuse_first && outnet->tcp_reuse_last)); } +/** call callback on waiting_tcp, if not NULL */ +static void +waiting_tcp_callback(struct waiting_tcp* w, struct comm_point* c, int error, + struct comm_reply* reply_info) +{ + if(w && w->cb) { + fptr_ok(fptr_whitelist_pending_tcp(w->cb)); + (void)(*w->cb)(c, w->cb_arg, error, reply_info); + } +} + /** see if buffers can be used to service TCP queries */ static void use_free_buffer(struct outside_network* outnet) @@ -879,15 +921,10 @@ use_free_buffer(struct outside_network* outnet) struct pending_tcp* pend_tcp = NULL; #endif struct reuse_tcp* reuse = NULL; - w = outnet->tcp_wait_first; - log_assert(w->on_tcp_waiting_list); - outnet->tcp_wait_first = w->next_waiting; - if(outnet->tcp_wait_last == w) - outnet->tcp_wait_last = NULL; + w = outnet_waiting_tcp_list_pop(outnet); log_assert( (!outnet->tcp_reuse_first && !outnet->tcp_reuse_last) || (outnet->tcp_reuse_first && outnet->tcp_reuse_last)); - w->on_tcp_waiting_list = 0; reuse = reuse_tcp_find(outnet, &w->addr, w->addrlen, w->ssl_upstream); /* re-select an ID when moving to a new TCP buffer */ @@ -934,7 +971,7 @@ use_free_buffer(struct outside_network* outnet) #endif } else { /* no reuse and no free buffer, put back at the start */ - outnet_add_tcp_waiting_first(outnet, w, 0); + outnet_waiting_tcp_list_add_first(outnet, w, 0); break; } #ifdef USE_DNSTAP @@ -1008,7 +1045,7 @@ reuse_move_writewait_away(struct outside_network* outnet, * fail the query */ w->error_count ++; reuse_tree_by_id_delete(&pend->reuse, w); - outnet_add_tcp_waiting(outnet, w); + outnet_waiting_tcp_list_add(outnet, w, 1); } while((w = reuse_write_wait_pop(&pend->reuse)) != NULL) { if(verbosity >= VERB_CLIENT && w->pkt_len > 12+2+2 && @@ -1019,7 +1056,7 @@ reuse_move_writewait_away(struct outside_network* outnet, verbose(VERB_CLIENT, "reuse_move_writewait_away item %s", buf); } reuse_tree_by_id_delete(&pend->reuse, w); - outnet_add_tcp_waiting(outnet, w); + outnet_waiting_tcp_list_add(outnet, w, 1); } } @@ -1424,11 +1461,11 @@ outnet_udp_cb(struct comm_point* c, void* arg, int error, /* setup lookup key */ key.id = (unsigned)LDNS_ID_WIRE(sldns_buffer_begin(c->buffer)); - memcpy(&key.addr, &reply_info->addr, reply_info->addrlen); - key.addrlen = reply_info->addrlen; + memcpy(&key.addr, &reply_info->remote_addr, reply_info->remote_addrlen); + key.addrlen = reply_info->remote_addrlen; verbose(VERB_ALGO, "Incoming reply id = %4.4x", key.id); log_addr(VERB_ALGO, "Incoming reply addr =", - &reply_info->addr, reply_info->addrlen); + &reply_info->remote_addr, reply_info->remote_addrlen); /* find it, see if this thing is a valid query response */ verbose(VERB_ALGO, "lookup size is %d entries", (int)outnet->pending->count); @@ -1698,7 +1735,7 @@ outside_network_create(struct comm_base *base, size_t bufsize, return NULL; } pc->cp = comm_point_create_udp(outnet->base, -1, - outnet->udp_buff, outnet_udp_cb, outnet, NULL); + outnet->udp_buff, 0, outnet_udp_cb, outnet, NULL); if(!pc->cp) { log_err("malloc failed"); free(pc); @@ -2270,7 +2307,7 @@ outnet_tcptimer(void* arg) verbose(VERB_CLIENT, "outnet_tcptimer"); if(w->on_tcp_waiting_list) { /* it is on the waiting list */ - waiting_list_remove(outnet, w); + outnet_waiting_tcp_list_remove(outnet, w); waiting_tcp_callback(w, NULL, NETEVENT_TIMEOUT, NULL); waiting_tcp_delete(w); } else { @@ -2497,7 +2534,7 @@ pending_tcp_query(struct serviced_query* sq, sldns_buffer* packet, #ifdef USE_DNSTAP w->sq = sq; #endif - outnet_add_tcp_waiting(sq->outnet, w); + outnet_waiting_tcp_list_add(sq->outnet, w, 1); } return w; } @@ -2658,30 +2695,6 @@ serviced_create(struct outside_network* outnet, sldns_buffer* buff, int dnssec, return sq; } -/** remove waiting tcp from the outnet waiting list */ -static void -waiting_list_remove(struct outside_network* outnet, struct waiting_tcp* w) -{ - struct waiting_tcp* p = outnet->tcp_wait_first, *prev = NULL; - w->on_tcp_waiting_list = 0; - while(p) { - if(p == w) { - /* remove w */ - if(prev) - prev->next_waiting = w->next_waiting; - else outnet->tcp_wait_first = w->next_waiting; - if(outnet->tcp_wait_last == w) - outnet->tcp_wait_last = prev; - return; - } - prev = p; - p = p->next_waiting; - } - /* waiting_list_remove is currently called only with items that are - * already in the waiting list. */ - log_assert(0); -} - /** reuse tcp stream, remove serviced query from stream, * return true if the stream is kept, false if it is to be closed */ static int @@ -2776,7 +2789,7 @@ serviced_delete(struct serviced_query* sq) sq->pending = NULL; } else { verbose(VERB_CLIENT, "serviced_delete: tcpwait"); - waiting_list_remove(sq->outnet, w); + outnet_waiting_tcp_list_remove(sq->outnet, w); if(!w->in_cb_and_decommission) waiting_tcp_delete(w); } @@ -3155,8 +3168,8 @@ serviced_tcp_callback(struct comm_point* c, void* arg, int error, rep = &r2; r2.c = c; } - memcpy(&rep->addr, &sq->addr, sq->addrlen); - rep->addrlen = sq->addrlen; + memcpy(&rep->remote_addr, &sq->addr, sq->addrlen); + rep->remote_addrlen = sq->addrlen; serviced_callbacks(sq, error, c, rep); return 0; } @@ -3452,7 +3465,7 @@ outnet_serviced_query(struct outside_network* outnet, if (env->cfg->upstream_cookies && infra_get_cookie(env->infra_cache, addr, addrlen, zone, zonelen, - *env->now, &cookie)) { + *env->now, &cookie, 0)) { if (cookie.state == SERVER_COOKIE_LEARNED) { /* We known the complete cookie, so we attach it */ @@ -3660,7 +3673,7 @@ outnet_comm_point_for_udp(struct outside_network* outnet, if(fd == -1) { return NULL; } - cp = comm_point_create_udp(outnet->base, fd, outnet->udp_buff, + cp = comm_point_create_udp(outnet->base, fd, outnet->udp_buff, 0, cb, cb_arg, NULL); if(!cp) { log_err("malloc failure"); @@ -3748,8 +3761,8 @@ outnet_comm_point_for_tcp(struct outside_network* outnet, close(fd); return 0; } - cp->repinfo.addrlen = to_addrlen; - memcpy(&cp->repinfo.addr, to_addr, to_addrlen); + cp->repinfo.remote_addrlen = to_addrlen; + memcpy(&cp->repinfo.remote_addr, to_addr, to_addrlen); /* setup for SSL (if needed) */ if(ssl) { @@ -3824,8 +3837,8 @@ outnet_comm_point_for_http(struct outside_network* outnet, close(fd); return 0; } - cp->repinfo.addrlen = to_addrlen; - memcpy(&cp->repinfo.addr, to_addr, to_addrlen); + cp->repinfo.remote_addrlen = to_addrlen; + memcpy(&cp->repinfo.remote_addr, to_addr, to_addrlen); /* setup for SSL (if needed) */ if(ssl) { diff --git a/services/outside_network.h b/services/outside_network.h index 9ba0f34bb..f6b08303e 100644 --- a/services/outside_network.h +++ b/services/outside_network.h @@ -725,6 +725,30 @@ struct reuse_tcp* reuse_tcp_lru_snip(struct outside_network* outnet); /** delete readwait waiting_tcp elements, deletes the elements in the list */ void reuse_del_readwait(rbtree_type* tree_by_id); +/** remove waiting tcp from the outnet waiting list */ +void outnet_waiting_tcp_list_remove(struct outside_network* outnet, + struct waiting_tcp* w); + +/** pop the first waiting tcp from the outnet waiting list */ +struct waiting_tcp* outnet_waiting_tcp_list_pop(struct outside_network* outnet); + +/** add waiting_tcp element to the outnet tcp waiting list */ +void outnet_waiting_tcp_list_add(struct outside_network* outnet, + struct waiting_tcp* w, int set_timer); + +/** add waiting_tcp element as first to the outnet tcp waiting list */ +void outnet_waiting_tcp_list_add_first(struct outside_network* outnet, + struct waiting_tcp* w, int reset_timer); + +/** pop the first element from the writewait list */ +struct waiting_tcp* reuse_write_wait_pop(struct reuse_tcp* reuse); + +/** remove the element from the writewait list */ +void reuse_write_wait_remove(struct reuse_tcp* reuse, struct waiting_tcp* w); + +/** push the element after the last on the writewait list */ +void reuse_write_wait_push_back(struct reuse_tcp* reuse, struct waiting_tcp* w); + /** get TCP file descriptor for address, returns -1 on failure, * tcp_mss is 0 or maxseg size to set for TCP packets. */ int outnet_get_tcp_fd(struct sockaddr_storage* addr, socklen_t addrlen, diff --git a/services/rpz.c b/services/rpz.c index 77b6266fe..e876f3f94 100644 --- a/services/rpz.c +++ b/services/rpz.c @@ -1392,11 +1392,13 @@ log_rpz_apply(char* trigger, uint8_t* dname, struct addr_tree_node* addrnode, dnamestr[0]=0; } if(repinfo) { - addr_to_str(&repinfo->addr, repinfo->addrlen, ip, sizeof(ip)); - port = ntohs(((struct sockaddr_in*)&repinfo->addr)->sin_port); + addr_to_str(&repinfo->client_addr, repinfo->client_addrlen, ip, sizeof(ip)); + port = ntohs(((struct sockaddr_in*)&repinfo->client_addr)->sin_port); } else if(ms && ms->mesh_info && ms->mesh_info->reply_list) { - addr_to_str(&ms->mesh_info->reply_list->query_reply.addr, ms->mesh_info->reply_list->query_reply.addrlen, ip, sizeof(ip)); - port = ntohs(((struct sockaddr_in*)&ms->mesh_info->reply_list->query_reply.addr)->sin_port); + addr_to_str(&ms->mesh_info->reply_list->query_reply.client_addr, + ms->mesh_info->reply_list->query_reply.client_addrlen, + ip, sizeof(ip)); + port = ntohs(((struct sockaddr_in*)&ms->mesh_info->reply_list->query_reply.client_addr)->sin_port); } else { ip[0]=0; port = 0; @@ -1468,7 +1470,9 @@ rpz_resolve_client_action_and_zone(struct auth_zones* az, struct query_info* qin } z = rpz_find_zone(r->local_zones, qinfo->qname, qinfo->qname_len, qinfo->qclass, 0, 0, 0); - node = rpz_ipbased_trigger_lookup(r->client_set, &repinfo->addr, repinfo->addrlen, "clientip"); + node = rpz_ipbased_trigger_lookup(r->client_set, + &repinfo->client_addr, repinfo->client_addrlen, + "clientip"); if((z || node) && r->action_override == RPZ_DISABLED_ACTION) { if(r->log) log_rpz_apply((node?"clientip":"qname"), @@ -2164,18 +2168,16 @@ rpz_callback_from_iterator_module(struct module_qstate* ms, struct iter_qstate* lock_rw_unlock(&az->rpz_lock); - if(raddr == NULL && z == NULL) { return NULL; } - else if(raddr != NULL) { + if(raddr == NULL && z == NULL) + return NULL; + + if(raddr != NULL) { if(z) { lock_rw_unlock(&z->lock); } return rpz_apply_nsip_trigger(ms, r, raddr, a); - } else if(z != NULL) { - if(raddr) { - lock_rw_unlock(&raddr->lock); - } - return rpz_apply_nsdname_trigger(ms, r, z, &match, a); - } else { return NULL; } + } + return rpz_apply_nsdname_trigger(ms, r, z, &match, a); } struct dns_msg* rpz_callback_from_iterator_cname(struct module_qstate* ms, diff --git a/services/view.c b/services/view.c index db48ae954..72f364318 100644 --- a/services/view.c +++ b/services/view.c @@ -66,8 +66,9 @@ views_create(void) return v; } -/** This prototype is defined in in respip.h, but we want to avoid - * unnecessary dependencies */ +/* \noop (ignore this comment for doxygen) + * This prototype is defined in in respip.h, but we want to avoid + * unnecessary dependencies */ void respip_set_delete(struct respip_set *set); void diff --git a/sldns/rrdef.h b/sldns/rrdef.h index 73458a51e..d5b0585fd 100644 --- a/sldns/rrdef.h +++ b/sldns/rrdef.h @@ -483,6 +483,9 @@ typedef enum sldns_enum_ede_code sldns_ede_code; #define LDNS_TSIG_ERROR_BADNAME 20 #define LDNS_TSIG_ERROR_BADALG 21 +/** DNS Cookie extended rcode */ +#define LDNS_EXT_RCODE_BADCOOKIE 23 + /** * Contains all information about resource record types. * diff --git a/smallapp/unbound-checkconf.c b/smallapp/unbound-checkconf.c index c25182bd2..f850469ba 100644 --- a/smallapp/unbound-checkconf.c +++ b/smallapp/unbound-checkconf.c @@ -316,7 +316,7 @@ warn_hosts(const char* typ, struct config_stub* list) struct config_strlist* h; for(s=list; s; s=s->next) { for(h=s->hosts; h; h=h->next) { - if(extstrtoaddr(h->str, &a, &alen)) { + if(extstrtoaddr(h->str, &a, &alen, UNBOUND_DNS_PORT)) { fprintf(stderr, "unbound-checkconf: warning:" " %s %s: \"%s\" is an IP%s address, " "and when looked up as a host name " @@ -338,6 +338,8 @@ interfacechecks(struct config_file* cfg) int i, j, i2, j2; char*** resif = NULL; int* num_resif = NULL; + char portbuf[32]; + snprintf(portbuf, sizeof(portbuf), "%d", cfg->port); if(cfg->num_ifs != 0) { resif = (char***)calloc(cfg->num_ifs, sizeof(char**)); @@ -359,9 +361,21 @@ interfacechecks(struct config_file* cfg) fatal_exit("could not resolve interface names, for %s", cfg->ifs[i]); } + /* check for port combinations that are not supported */ + if(if_is_pp2(resif[i][0], portbuf, cfg->proxy_protocol_port)) { + if(if_is_dnscrypt(resif[i][0], portbuf, + cfg->dnscrypt_port)) { + fatal_exit("PROXYv2 and DNSCrypt combination not " + "supported!"); + } else if(if_is_https(resif[i][0], portbuf, + cfg->https_port)) { + fatal_exit("PROXYv2 and DoH combination not " + "supported!"); + } + } /* search for duplicates in the returned addresses */ for(j=0; jport)) { if(strcmp(cfg->ifs[i], resif[i][j]) != 0) fatal_exit("cannot parse interface address '%s' from the interface specified as '%s'", resif[i][j], cfg->ifs[i]); diff --git a/smallapp/unbound-control.c b/smallapp/unbound-control.c index d473702c4..34fb801bb 100644 --- a/smallapp/unbound-control.c +++ b/smallapp/unbound-control.c @@ -601,7 +601,7 @@ contact_server(const char* svr, struct config_file* cfg, int statuscmd) struct sockaddr_storage addr2; socklen_t addrlen2; if(extstrtoaddr(cfg->control_ifs.first->str, &addr2, - &addrlen2)) { + &addrlen2, UNBOUND_DNS_PORT)) { svr = cfg->control_ifs.first->str; } else { if(!resolve_interface_names(NULL, 0, @@ -629,7 +629,7 @@ contact_server(const char* svr, struct config_file* cfg, int statuscmd) svr = "::1"; } if(strchr(svr, '@')) { - if(!extstrtoaddr(svr, &addr, &addrlen)) + if(!extstrtoaddr(svr, &addr, &addrlen, UNBOUND_DNS_PORT)) fatal_exit("could not parse IP@port: %s", svr); #ifdef HAVE_SYS_UN_H } else if(svr[0] == '/') { diff --git a/testcode/delayer.c b/testcode/delayer.c index e915961f5..647a4e24c 100644 --- a/testcode/delayer.c +++ b/testcode/delayer.c @@ -974,7 +974,7 @@ service(const char* bind_str, int bindport, const char* serv_str, dl_tv_add(&reuse, &delay); if(reuse.tv_sec == 0) reuse.tv_sec = 1; - if(!extstrtoaddr(serv_str, &srv_addr, &srv_len)) { + if(!extstrtoaddr(serv_str, &srv_addr, &srv_len, UNBOUND_DNS_PORT)) { printf("cannot parse forward address: %s\n", serv_str); exit(1); } diff --git a/testcode/do-tests.sh b/testcode/do-tests.sh index 2a1cfc4c9..6599f9f66 100755 --- a/testcode/do-tests.sh +++ b/testcode/do-tests.sh @@ -16,6 +16,7 @@ NEED_WHOAMI='07-confroot.tdir' NEED_IPV6='fwd_ancil.tdir fwd_tcp_tc6.tdir stub_udp6.tdir edns_cache.tdir' NEED_NOMINGW='tcp_sigpipe.tdir 07-confroot.tdir 08-host-lib.tdir fwd_ancil.tdir' NEED_DNSCRYPT_PROXY='dnscrypt_queries.tdir dnscrypt_queries_chacha.tdir' +NEED_UNSHARE='acl_interface.tdir proxy_protocol.tdir' # test if dig and ldns-testns are available. test_tool_avail "dig" @@ -50,6 +51,7 @@ for test in `ls -d *.tdir`; do skip_if_in_list $test "$NEED_NC" "nc" skip_if_in_list $test "$NEED_WHOAMI" "whoami" skip_if_in_list $test "$NEED_DNSCRYPT_PROXY" "dnscrypt-proxy" + skip_if_in_list $test "$NEED_UNSHARE" "unshare" if echo $NEED_IPV6 | grep $test >/dev/null; then if test "$HAVE_IPV6" = no; then diff --git a/testcode/dohclient.c b/testcode/dohclient.c index 82e522f90..64af699bc 100644 --- a/testcode/dohclient.c +++ b/testcode/dohclient.c @@ -573,6 +573,7 @@ int main(int argc, char** argv) #endif checklock_start(); log_init(0, 0, 0); + log_ident_set("dohclient"); h2_session = http2_session_create(); if(!h2_session) fatal_exit("out of memory"); diff --git a/testcode/fake_event.c b/testcode/fake_event.c index c4a66d46f..1ac143de3 100644 --- a/testcode/fake_event.c +++ b/testcode/fake_event.c @@ -384,8 +384,8 @@ answer_callback_from_entry(struct replay_runtime* runtime, fill_buffer_with_reply(c.buffer, entry, pend->pkt, pend->pkt_len, pend->tcp_pkt_counter); repinfo.c = &c; - repinfo.addrlen = pend->addrlen; - memcpy(&repinfo.addr, &pend->addr, pend->addrlen); + repinfo.remote_addrlen = pend->addrlen; + memcpy(&repinfo.remote_addr, &pend->addr, pend->addrlen); if(!pend->serviced) { if(entry && entry->reply_list->next && pend->tcp_pkt_counter < count_reply_packets(entry)) { @@ -415,7 +415,7 @@ answer_check_it(struct replay_runtime* runtime) tr = transport_udp; if((runtime->now->addrlen == 0 || sockaddr_cmp( &runtime->now->addr, runtime->now->addrlen, - &ans->repinfo.addr, ans->repinfo.addrlen) == 0) && + &ans->repinfo.remote_addr, ans->repinfo.remote_addrlen) == 0) && find_match(runtime->now->match, ans->pkt, ans->pkt_len, tr)) { log_info("testbound matched event entry from line %d", @@ -453,10 +453,12 @@ fake_front_query(struct replay_runtime* runtime, struct replay_moment *todo) repinfo.c = (struct comm_point*)calloc(1, sizeof(struct comm_point)); if(!repinfo.c) fatal_exit("out of memory in fake_front_query"); - repinfo.addrlen = (socklen_t)sizeof(struct sockaddr_in); + repinfo.remote_addrlen = (socklen_t)sizeof(struct sockaddr_in); if(todo->addrlen != 0) { - repinfo.addrlen = todo->addrlen; - memcpy(&repinfo.addr, &todo->addr, todo->addrlen); + repinfo.remote_addrlen = todo->addrlen; + memcpy(&repinfo.remote_addr, &todo->addr, todo->addrlen); + repinfo.client_addrlen = todo->addrlen; + memcpy(&repinfo.client_addr, &todo->addr, todo->addrlen); } repinfo.c->fd = -1; repinfo.c->ev = (struct internal_event*)runtime; @@ -510,8 +512,8 @@ fake_pending_callback(struct replay_runtime* runtime, p->pkt_len, p->tcp_pkt_counter); } repinfo.c = &c; - repinfo.addrlen = p->addrlen; - memcpy(&repinfo.addr, &p->addr, p->addrlen); + repinfo.remote_addrlen = p->addrlen; + memcpy(&repinfo.remote_addr, &p->addr, p->addrlen); if(!p->serviced) { if(todo->match && todo->match->reply_list->next && !error && p->tcp_pkt_counter < count_reply_packets(todo->match)) { @@ -1285,6 +1287,8 @@ struct serviced_query* outnet_serviced_query(struct outside_network* outnet, if(dnssec) edns.bits = EDNS_DO; edns.padding_block_size = 0; + edns.cookie_present = 0; + edns.cookie_valid = 0; edns.opt_list_in = NULL; edns.opt_list_out = per_upstream_opt_list; edns.opt_list_inplace_cb_out = NULL; @@ -1366,7 +1370,7 @@ struct listen_port* listening_ports_open(struct config_file* ATTR_UNUSED(cfg), char** ATTR_UNUSED(ifs), int ATTR_UNUSED(num_ifs), int* ATTR_UNUSED(reuseport)) { - return calloc(1, 1); + return calloc(1, sizeof(struct listen_port)); } void listening_ports_free(struct listen_port* list) @@ -1685,6 +1689,7 @@ int create_udp_sock(int ATTR_UNUSED(family), int ATTR_UNUSED(socktype), struct comm_point* comm_point_create_udp(struct comm_base *ATTR_UNUSED(base), int ATTR_UNUSED(fd), sldns_buffer* ATTR_UNUSED(buffer), + int ATTR_UNUSED(pp2_enabled), comm_point_callback_type* ATTR_UNUSED(callback), void* ATTR_UNUSED(callback_arg), struct unbound_socket* ATTR_UNUSED(socket)) diff --git a/testcode/mini_tdir.sh b/testcode/mini_tdir.sh index 6bbece8d9..624ecdf7f 100755 --- a/testcode/mini_tdir.sh +++ b/testcode/mini_tdir.sh @@ -8,6 +8,7 @@ fi # This will keep the temporary directory around and return 1 when the test failed. DEBUG=0 +test -n "$DEBUG_TDIR" && DEBUG=1 quiet=0 if test "$1" = "-q"; then @@ -17,9 +18,9 @@ fi if test "$1" = "clean"; then if test $quiet = 0; then - echo "rm -f result.* .done* .tdir.var.master .tdir.var.test" + echo "rm -f result.* .done* .skip* .tdir.var.master .tdir.var.test" fi - rm -f result.* .done* .tdir.var.master .tdir.var.test + rm -f result.* .done* .skip* .tdir.var.master .tdir.var.test exit 0 fi if test "$1" = "fake"; then @@ -54,12 +55,15 @@ if test "$1" = "-f" && test "$2" = "report"; then echo "** PASSED ** $timelen $name: $desc" pass=`expr $pass + 1` fi + elif test -f ".skip-$name"; then + echo ".. SKIPPED.. $timelen $name: $desc" + skip=`expr $skip + 1` else if test -f "result.$name"; then echo "!! FAILED !! $timelen $name: $desc" fail=`expr $fail + 1` else - echo ".> SKIPPED<< $timelen $name: $desc" + echo ".. SKIPPED.. $timelen $name: $desc" skip=`expr $skip + 1` fi fi @@ -81,11 +85,17 @@ if test "$1" = "report" || test "$2" = "report"; then if test $quiet = 0; then echo "** PASSED ** : $name" fi + elif test -f ".skip-$name"; then + if test $quiet = 0; then + echo ".. SKIPPED.. : $name" + fi else if test -f "result.$name"; then echo "!! FAILED !! : $name" else - echo ">> SKIPPED<< : $name" + if test $quiet = 0; then + echo ".. SKIPPED.. : $name" + fi fi fi done @@ -116,6 +126,7 @@ name=`basename $1 .tdir` dir=$name.$$ result=result.$name done=.done-$name +skip=.skip-$name success="no" if test -x "`which bash`"; then shell="bash" @@ -124,8 +135,8 @@ else fi # check already done -if test -f .done-$name; then - echo "minitdir .done-$name exists. skip test." +if test -f $done; then + echo "minitdir $done exists. skip test." exit 0 fi @@ -151,11 +162,16 @@ if test -f $name.pre; then fi echo "minitdir exe $name.pre" >> $result $shell $name.pre $args >> $result - if test $? -ne 0; then + exit_value=$? + if test $exit_value -eq 3; then + echo "$name: SKIPPED" >> $result + echo "$name: SKIPPED" > ../$skip + echo "$name: SKIPPED" + elif test $exit_value -ne 0; then echo "Warning: $name.pre did not exit successfully" fi fi -if test -f $name.test; then +if test -f $name.test -a ! -f ../$skip; then if test $quiet = 0; then echo "minitdir exe $name.test" fi @@ -167,14 +183,14 @@ if test -f $name.test; then success="no" else echo "$name: PASSED" >> $result - echo "$name: PASSED" > ../.done-$name + echo "$name: PASSED" > ../$done if test $quiet = 0; then echo "$name: PASSED" fi success="yes" fi fi -if test -f $name.post; then +if test -f $name.post -a ! -f ../$skip; then if test $quiet = 0; then echo "minitdir exe $name.post" fi @@ -198,7 +214,7 @@ if test $DEBUG -eq 0; then rm -rf $dir fi else - if test $success == "no"; then + if test $success = "no"; then exit 1 fi exit 0 diff --git a/testcode/mini_tpkg.sh b/testcode/mini_tpkg.sh deleted file mode 100755 index ebf27a7d4..000000000 --- a/testcode/mini_tpkg.sh +++ /dev/null @@ -1,128 +0,0 @@ -# tpkg that only exes the files. -args="../.." -if test "$1" = "-a"; then - args=$2 - shift - shift -fi - -if test "$1" = "clean"; then - echo "rm -f result.* .done* .tpkg.var.master .tpkg.var.test" - rm -f result.* .done* .tpkg.var.master .tpkg.var.test - exit 0 -fi -if test "$1" = "fake"; then - echo "minitpkg fake $2" - echo "fake" > .done-`basename $2 .tpkg` - exit 0 -fi -if test "$1" = "report" || test "$2" = "report"; then - echo "Minitpkg Report" - for result in *.tpkg; do - name=`basename $result .tpkg` - if test -f ".done-$name"; then - if test "$1" != "-q"; then - echo "** PASSED ** : $name" - fi - else - if test -f "result.$name"; then - echo "!! FAILED !! : $name" - else - echo ">> SKIPPED<< : $name" - fi - fi - done - exit 0 -fi - -if test "$1" != 'exe'; then - # usage - echo "mini tpkg. Reduced functionality for old shells." - echo " tpkg exe " - echo " tpkg fake " - echo " tpkg clean" - echo " tpkg [-q] report" - exit 1 -fi -shift - -# do not execute if the disk is too full -#DISKLIMIT=100000 -# This check is not portable (to Solaris 10). -#avail=`df . | tail -1 | awk '{print $4}'` -#if test "$avail" -lt "$DISKLIMIT"; then - #echo "minitpkg: The disk is too full! Only $avail." - #exit 1 -#fi - -name=`basename $1 .tpkg` -dir=$name.$$ -result=result.$name -done=.done-$name -success="no" -if test -x "`which bash`"; then - shell="bash" -else - shell="sh" -fi - -# check already done -if test -f .done-$name; then - echo "minitpkg .done-$name exists. skip test." - exit 0 -fi - -# Extract -echo "minitpkg extract $1 to $dir" -mkdir $dir -gzip -cd $name.tpkg | (cd $dir; tar xf -) -cd $dir -mv $name.dir/* . - -# EXE -echo "minitpkg exe $name" > $result -grep "Description:" $name.dsc >> $result 2>&1 -echo "DateRunStart: "`date "+%s" 2>/dev/null` >> $result -if test -f $name.pre; then - echo "minitpkg exe $name.pre" - echo "minitpkg exe $name.pre" >> $result - $shell $name.pre $args >> $result - if test $? -ne 0; then - echo "Warning: $name.pre did not exit successfully" - fi -fi -if test -f $name.test; then - echo "minitpkg exe $name.test" - echo "minitpkg exe $name.test" >> $result - $shell $name.test $args >>$result 2>&1 - if test $? -ne 0; then - echo "$name: FAILED" >> $result - echo "$name: FAILED" - success="no" - else - echo "$name: PASSED" >> $result - echo "$name: PASSED" > ../.done-$name - echo "$name: PASSED" - success="yes" - fi -fi -if test -f $name.post; then - echo "minitpkg exe $name.post" - echo "minitpkg exe $name.post" >> $result - $shell $name.post $args >> $result - if test $? -ne 0; then - echo "Warning: $name.post did not exit successfully" - fi -fi -echo "DateRunEnd: "`date "+%s" 2>/dev/null` >> $result - -mv $result .. -cd .. -rm -rf $dir -# compat for windows where deletion may not succeed initially (files locked -# by processes that still have to exit). -if test $? -eq 1; then - echo "minitpkg waiting for processes to terminate" - sleep 2 # some time to exit, and try again - rm -rf $dir -fi diff --git a/testcode/perf.c b/testcode/perf.c index 55d6483c7..7fb524e22 100644 --- a/testcode/perf.c +++ b/testcode/perf.c @@ -618,7 +618,7 @@ int main(int argc, char* argv[]) printf("error: pass server IP address on commandline.\n"); usage(nm); } - if(!extstrtoaddr(argv[0], &info.dest, &info.destlen)) { + if(!extstrtoaddr(argv[0], &info.dest, &info.destlen, UNBOUND_DNS_PORT)) { printf("Could not parse ip: %s\n", argv[0]); exit(1); } diff --git a/testcode/replay.c b/testcode/replay.c index 2487c146f..43101d6ac 100644 --- a/testcode/replay.c +++ b/testcode/replay.c @@ -179,7 +179,8 @@ replay_range_read(char* remain, FILE* in, const char* name, while(isspace((unsigned char)*parse)) parse++; strip_end_white(parse); - if(!extstrtoaddr(parse, &rng->addr, &rng->addrlen)) { + if(!extstrtoaddr(parse, &rng->addr, &rng->addrlen, + UNBOUND_DNS_PORT)) { log_err("Line %d: could not read ADDRESS: %s", pstate->lineno, parse); free(rng); @@ -287,7 +288,8 @@ replay_moment_read(char* remain, FILE* in, const char* name, } else if(parse_keyword(&remain, "QUERY")) { mom->evt_type = repevt_front_query; readentry = 1; - if(!extstrtoaddr("127.0.0.1", &mom->addr, &mom->addrlen)) + if(!extstrtoaddr("127.0.0.1", &mom->addr, &mom->addrlen, + UNBOUND_DNS_PORT)) fatal_exit("internal error"); } else if(parse_keyword(&remain, "CHECK_ANSWER")) { mom->evt_type = repevt_front_reply; @@ -354,7 +356,7 @@ replay_moment_read(char* remain, FILE* in, const char* name, m++; while(isspace((unsigned char)*m)) m++; - if(!extstrtoaddr(s, &mom->addr, &mom->addrlen)) + if(!extstrtoaddr(s, &mom->addr, &mom->addrlen, UNBOUND_DNS_PORT)) fatal_exit("bad infra_rtt address %s", s); strip_end_white(m); mom->variable = strdup(remain); @@ -372,7 +374,8 @@ replay_moment_read(char* remain, FILE* in, const char* name, while(isspace((unsigned char)*remain)) remain++; strip_end_white(remain); - if(!extstrtoaddr(remain, &mom->addr, &mom->addrlen)) { + if(!extstrtoaddr(remain, &mom->addr, &mom->addrlen, + UNBOUND_DNS_PORT)) { log_err("line %d: could not parse ADDRESS: %s", pstate->lineno, remain); free(mom); diff --git a/testcode/streamtcp.c b/testcode/streamtcp.c index ecc83c1cf..b2c0d5328 100644 --- a/testcode/streamtcp.c +++ b/testcode/streamtcp.c @@ -49,6 +49,7 @@ #include "util/locks.h" #include "util/log.h" #include "util/net_help.h" +#include "util/proxy_protocol.h" #include "util/data/msgencode.h" #include "util/data/msgparse.h" #include "util/data/msgreply.h" @@ -71,6 +72,7 @@ static void usage(char* argv[]) printf("usage: %s [options] name type class ...\n", argv[0]); printf(" sends the name-type-class queries over TCP.\n"); printf("-f server what ipaddr@portnr to send the queries to\n"); + printf("-p client what ipaddr@portnr to include in PROXYv2\n"); printf("-u use UDP. No retries are attempted.\n"); printf("-n do not wait for an answer.\n"); printf("-a print answers as they arrive.\n"); @@ -82,18 +84,17 @@ static void usage(char* argv[]) /** open TCP socket to svr */ static int -open_svr(const char* svr, int udp) +open_svr(const char* svr, int udp, struct sockaddr_storage* addr, + socklen_t* addrlen) { - struct sockaddr_storage addr; - socklen_t addrlen; int fd = -1; /* svr can be ip@port */ - memset(&addr, 0, sizeof(addr)); - if(!extstrtoaddr(svr, &addr, &addrlen)) { + memset(addr, 0, sizeof(*addr)); + if(!extstrtoaddr(svr, addr, addrlen, UNBOUND_DNS_PORT)) { printf("fatal: bad server specs '%s'\n", svr); exit(1); } - fd = socket(addr_is_ip6(&addr, addrlen)?PF_INET6:PF_INET, + fd = socket(addr_is_ip6(addr, *addrlen)?PF_INET6:PF_INET, udp?SOCK_DGRAM:SOCK_STREAM, 0); if(fd == -1) { #ifndef USE_WINSOCK @@ -103,7 +104,7 @@ open_svr(const char* svr, int udp) #endif exit(1); } - if(connect(fd, (struct sockaddr*)&addr, addrlen) < 0) { + if(connect(fd, (struct sockaddr*)addr, *addrlen) < 0) { #ifndef USE_WINSOCK perror("connect() error"); #else @@ -116,11 +117,12 @@ open_svr(const char* svr, int udp) /** write a query over the TCP fd */ static void -write_q(int fd, int udp, SSL* ssl, sldns_buffer* buf, uint16_t id, +write_q(int fd, int udp, SSL* ssl, sldns_buffer* buf, uint16_t id, + sldns_buffer* proxy_buf, int pp2_parsed, const char* strname, const char* strtype, const char* strclass) { struct query_info qinfo; - uint16_t len; + size_t proxy_buf_limit = sldns_buffer_limit(proxy_buf); /* qname */ qinfo.qname = sldns_str2wire_dname(strname, &qinfo.qname_len); if(!qinfo.qname) { @@ -152,9 +154,27 @@ write_q(int fd, int udp, SSL* ssl, sldns_buffer* buf, uint16_t id, attach_edns_record(buf, &edns); } + /* we need to send the PROXYv2 information in every UDP message */ + if(udp && pp2_parsed) { + /* append the proxy_buf with the buf's content + * and use that for sending */ + if(sldns_buffer_capacity(proxy_buf) < + sldns_buffer_limit(proxy_buf) + + sldns_buffer_limit(buf)) { + printf("buffer too small for packet + proxy"); + exit(1); + } + sldns_buffer_clear(proxy_buf); + sldns_buffer_skip(proxy_buf, proxy_buf_limit); + sldns_buffer_write(proxy_buf, sldns_buffer_begin(buf), + sldns_buffer_limit(buf)); + sldns_buffer_flip(proxy_buf); + buf = proxy_buf; + } + /* send it */ if(!udp) { - len = (uint16_t)sldns_buffer_limit(buf); + uint16_t len = (uint16_t)sldns_buffer_limit(buf); len = htons(len); if(ssl) { if(SSL_write(ssl, (void*)&len, (int)sizeof(len)) <= 0) { @@ -167,7 +187,7 @@ write_q(int fd, int udp, SSL* ssl, sldns_buffer* buf, uint16_t id, #ifndef USE_WINSOCK perror("send() len failed"); #else - printf("send len: %s\n", + printf("send len: %s\n", wsa_strerror(WSAGetLastError())); #endif exit(1); @@ -182,17 +202,20 @@ write_q(int fd, int udp, SSL* ssl, sldns_buffer* buf, uint16_t id, } } else { if(send(fd, (void*)sldns_buffer_begin(buf), - sldns_buffer_limit(buf), 0) < + sldns_buffer_limit(buf), 0) < (ssize_t)sldns_buffer_limit(buf)) { #ifndef USE_WINSOCK perror("send() data failed"); #else - printf("send data: %s\n", wsa_strerror(WSAGetLastError())); + printf("send data: %s\n", + wsa_strerror(WSAGetLastError())); #endif exit(1); } } + /* reset the proxy_buf for next packet */ + sldns_buffer_set_limit(proxy_buf, proxy_buf_limit); free(qinfo.qname); } @@ -224,7 +247,7 @@ recv_one(int fd, int udp, SSL* ssl, sldns_buffer* buf) #ifndef USE_WINSOCK perror("read() len failed"); #else - printf("read len: %s\n", + printf("read len: %s\n", wsa_strerror(WSAGetLastError())); #endif exit(1); @@ -243,12 +266,12 @@ recv_one(int fd, int udp, SSL* ssl, sldns_buffer* buf) if(r != (int)len) fatal_exit("ssl_read %d of %d", r, len); } else { - if(recv(fd, (void*)sldns_buffer_begin(buf), len, 0) < + if(recv(fd, (void*)sldns_buffer_begin(buf), len, 0) < (ssize_t)len) { #ifndef USE_WINSOCK perror("read() data failed"); #else - printf("read data: %s\n", + printf("read data: %s\n", wsa_strerror(WSAGetLastError())); #endif exit(1); @@ -257,12 +280,12 @@ recv_one(int fd, int udp, SSL* ssl, sldns_buffer* buf) } else { ssize_t l; sldns_buffer_clear(buf); - if((l=recv(fd, (void*)sldns_buffer_begin(buf), + if((l=recv(fd, (void*)sldns_buffer_begin(buf), sldns_buffer_capacity(buf), 0)) < 0) { #ifndef USE_WINSOCK perror("read() data failed"); #else - printf("read data: %s\n", + printf("read data: %s\n", wsa_strerror(WSAGetLastError())); #endif exit(1); @@ -324,17 +347,40 @@ static int get_random(void) return (int)arc4random(); } +/* parse the pp2_client and populate the proxy_buffer + * It doesn't populate the destination parts. */ +static int parse_pp2_client(const char* pp2_client, int udp, + sldns_buffer* proxy_buf) +{ + struct sockaddr_storage pp2_addr; + socklen_t pp2_addrlen = 0; + memset(&pp2_addr, 0, sizeof(pp2_addr)); + if(*pp2_client == 0) return 0; + if(!extstrtoaddr(pp2_client, &pp2_addr, &pp2_addrlen, UNBOUND_DNS_PORT)) { + printf("fatal: bad proxy client specs '%s'\n", pp2_client); + exit(1); + } + sldns_buffer_clear(proxy_buf); + pp2_write_to_buf(proxy_buf, &pp2_addr, !udp); + sldns_buffer_flip(proxy_buf); + return 1; +} + /** send the TCP queries and print answers */ static void -send_em(const char* svr, int udp, int usessl, int noanswer, int onarrival, - int delay, int num, char** qs) +send_em(const char* svr, const char* pp2_client, int udp, int usessl, + int noanswer, int onarrival, int delay, int num, char** qs) { sldns_buffer* buf = sldns_buffer_new(65553); - int fd = open_svr(svr, udp); - int i, wait_results = 0; + sldns_buffer* proxy_buf = sldns_buffer_new(65553); + struct sockaddr_storage svr_addr; + socklen_t svr_addrlen; + int fd = open_svr(svr, udp, &svr_addr, &svr_addrlen); + int i, wait_results = 0, pp2_parsed; SSL_CTX* ctx = NULL; SSL* ssl = NULL; if(!buf) fatal_exit("out of memory"); + pp2_parsed = parse_pp2_client(pp2_client, udp, proxy_buf); if(usessl) { ctx = connect_sslctx_create(NULL, NULL, NULL, 0); if(!ctx) fatal_exit("cannot create ssl ctx"); @@ -361,6 +407,28 @@ send_em(const char* svr, int udp, int usessl, int noanswer, int onarrival, } } } + /* Send the PROXYv2 information once per stream */ + if(!udp && pp2_parsed) { + if(ssl) { + if(SSL_write(ssl, (void*)sldns_buffer_begin(proxy_buf), + (int)sldns_buffer_limit(proxy_buf)) <= 0) { + log_crypto_err("cannot SSL_write"); + exit(1); + } + } else { + if(send(fd, (void*)sldns_buffer_begin(proxy_buf), + sldns_buffer_limit(proxy_buf), 0) < + (ssize_t)sldns_buffer_limit(proxy_buf)) { +#ifndef USE_WINSOCK + perror("send() data failed"); +#else + printf("send data: %s\n", + wsa_strerror(WSAGetLastError())); +#endif + exit(1); + } + } + } for(i=0; itcp_wait_first; + struct waiting_tcp* n = NULL; + if(first) unit_assert(outnet->tcp_wait_first == first); + if(last) unit_assert(outnet->tcp_wait_last == last && !last->next_waiting); + for(i=0; w; i++) { + unit_assert(ion_tcp_waiting_list); + n = w->next_waiting; + for(j=0; n; j++) { + unit_assert(jnext_waiting; + } + w = w->next_waiting; + } +} + +/** clear the tcp waiting list */ +static void waiting_tcp_list_clear(struct outside_network* outnet) +{ + struct waiting_tcp* w = outnet->tcp_wait_first, *n = NULL; + if(!w) return; + unit_assert(outnet->tcp_wait_first); + unit_assert(outnet->tcp_wait_last); + while(w) { + n = w->next_waiting; + w->on_tcp_waiting_list = 0; + w->next_waiting = (struct waiting_tcp*)1; /* In purpose faux value */ + w = n; + } + outnet->tcp_wait_first = NULL; + outnet->tcp_wait_last = NULL; +} + +/** check removal of the waiting_tcp element on the given position of total + * elements */ +static void check_waiting_tcp_removal(int is_pop, + struct outside_network* outnet, struct waiting_tcp* store, + size_t position, size_t total) +{ + size_t i; + struct waiting_tcp* w; + waiting_tcp_list_clear(outnet); + for(i=0; itcp_wait_first; + for(i=0; inext_waiting; + } + unit_assert(w); /* please clang-analyser */ + outnet_waiting_tcp_list_remove(outnet, w); + } + unit_assert(!(w->on_tcp_waiting_list || w->next_waiting)); + + if(position == 0 && total == 1) { + /* the list should be empty */ + check_waiting_tcp_list(outnet, NULL, NULL, total-1); + } else if(position == 0) { + /* first element should be gone */ + check_waiting_tcp_list(outnet, &store[1], &store[total-1], total-1); + } else if(position == total - 1) { + /* last element should be gone */ + check_waiting_tcp_list(outnet, &store[0], &store[total-2], total-1); + } else { + /* an element should be gone */ + check_waiting_tcp_list(outnet, &store[0], &store[total-1], total-1); + } +} + +static void waiting_tcp_list_test(void) +{ + size_t i = 0; + struct outside_network outnet; + struct waiting_tcp* w, *t = NULL; + struct waiting_tcp store[MAX_TCP_WAITING_NODES]; + memset(&outnet, 0, sizeof(outnet)); + memset(&store, 0, sizeof(store)); + + /* Check add first on empty list */ + unit_show_func("services/outside_network.c", "outnet_waiting_tcp_list_add_first"); + t = &store[i]; + outnet_waiting_tcp_list_add_first(&outnet, t, 0); + check_waiting_tcp_list(&outnet, t, t, 1); + + /* Check add */ + unit_show_func("services/outside_network.c", "outnet_waiting_tcp_list_add"); + for(i=1; iwrite_wait_first; + struct waiting_tcp* n = NULL; + if(first) unit_assert(reuse->write_wait_first == first && !first->write_wait_prev); + if(last) unit_assert(reuse->write_wait_last == last && !last->write_wait_next); + /* check one way */ + for(i=0; w; i++) { + unit_assert(iwrite_wait_queued); + n = w->write_wait_next; + for(j=0; n; j++) { + unit_assert(jwrite_wait_next; + } + w = w->write_wait_next; + } + /* check the other way */ + w = reuse->write_wait_last; + for(i=0; w; i++) { + unit_assert(iwrite_wait_queued); + n = w->write_wait_prev; + for(j=0; n; j++) { + unit_assert(jwrite_wait_prev; + } + w = w->write_wait_prev; + } +} + +/** clear the tcp waiting list */ +static void reuse_write_wait_clear(struct reuse_tcp* reuse) +{ + struct waiting_tcp* w = reuse->write_wait_first, *n = NULL; + if(!w) return; + unit_assert(reuse->write_wait_first); + unit_assert(reuse->write_wait_last); + while(w) { + n = w->write_wait_next; + w->write_wait_queued = 0; + w->write_wait_next = (struct waiting_tcp*)1; /* In purpose faux value */ + w->write_wait_prev = (struct waiting_tcp*)1; /* In purpose faux value */ + w = n; + } + reuse->write_wait_first = NULL; + reuse->write_wait_last = NULL; +} + +/** check removal of the reuse_write_wait element on the given position of total + * elements */ +static void check_reuse_write_wait_removal(int is_pop, + struct reuse_tcp* reuse, struct waiting_tcp* store, + size_t position, size_t total) +{ + size_t i; + struct waiting_tcp* w; + reuse_write_wait_clear(reuse); + for(i=0; iwrite_wait_first; + for(i=0; iwrite_wait_next; + reuse_write_wait_remove(reuse, w); + } + unit_assert(!(w->write_wait_queued || w->write_wait_next || w->write_wait_prev)); + + if(position == 0 && total == 1) { + /* the list should be empty */ + check_reuse_write_wait(reuse, NULL, NULL, total-1); + } else if(position == 0) { + /* first element should be gone */ + check_reuse_write_wait(reuse, &store[1], &store[total-1], total-1); + } else if(position == total - 1) { + /* last element should be gone */ + check_reuse_write_wait(reuse, &store[0], &store[total-2], total-1); + } else { + /* an element should be gone */ + check_reuse_write_wait(reuse, &store[0], &store[total-1], total-1); + } +} + +static void reuse_write_wait_test(void) +{ + size_t i; + struct reuse_tcp reuse; + struct waiting_tcp store[MAX_TCP_WAITING_NODES]; + struct waiting_tcp* w; + memset(&reuse, 0, sizeof(reuse)); + memset(&store, 0, sizeof(store)); + + /* Check adding */ + unit_show_func("services/outside_network.c", "reuse_write_wait_push_back"); + for(i=0; i/dev/null 2>&1; then + if grep "define USE_CACHEDB 1" $PRE/config.h >/dev/null 2>&1; then + : # CACHEDB is supported + else + continue + fi + fi + if test $do_valgrind = "yes"; then echo if (valgrind $VALGRIND_FLAGS $PRE/testbound -p $input >tmpout 2>&1;); then diff --git a/testdata/04-checkconf.tdir/04-checkconf.test b/testdata/04-checkconf.tdir/04-checkconf.test index a2396fef7..339e346d9 100644 --- a/testdata/04-checkconf.tdir/04-checkconf.test +++ b/testdata/04-checkconf.tdir/04-checkconf.test @@ -28,6 +28,12 @@ if grep "define UB_ON_WINDOWS 1" ../../config.h; then else onwin=0 fi +# detect dnscrypt +if grep "define USE_DNSCRYPT 1" ../../config.h; then + with_dnscrypt=1 +else + with_dnscrypt=0 +fi # test check of config files. for f in bad.*; do @@ -37,6 +43,10 @@ for f in bad.*; do echo "skipped on windows" continue fi + if test $f = "bad.proxy-and-dnscrypt" -a $with_dnscrypt -eq 0; then + echo "skipped; no DNSCRYPT support" + continue + fi $PRE/unbound-checkconf $f if test $? != 1; then diff --git a/testdata/04-checkconf.tdir/bad.proxy-and-dnscrypt b/testdata/04-checkconf.tdir/bad.proxy-and-dnscrypt new file mode 100644 index 000000000..f62f7868c --- /dev/null +++ b/testdata/04-checkconf.tdir/bad.proxy-and-dnscrypt @@ -0,0 +1,6 @@ +server: + interface: 127.0.0.1 + proxy-protocol-port: 53 +dnscrypt: + dnscrypt-enable: yes + dnscrypt-port: 53 diff --git a/testdata/04-checkconf.tdir/bad.proxy-and-https b/testdata/04-checkconf.tdir/bad.proxy-and-https new file mode 100644 index 000000000..d27373ce0 --- /dev/null +++ b/testdata/04-checkconf.tdir/bad.proxy-and-https @@ -0,0 +1,4 @@ +server: + interface: 127.0.0.1 + proxy-protocol-port: 53 + https-port: 53 diff --git a/testdata/07-confroot.tdir/07-confroot.dsc b/testdata/07-confroot.tdir/07-confroot.dsc index f1cbe6e7d..a25301709 100644 --- a/testdata/07-confroot.tdir/07-confroot.dsc +++ b/testdata/07-confroot.tdir/07-confroot.dsc @@ -8,7 +8,7 @@ Component: CmdDepends: Depends: Help: -Pre: +Pre: 07-confroot.pre Post: Test: 07-confroot.test AuxFiles: diff --git a/testdata/07-confroot.tdir/07-confroot.pre b/testdata/07-confroot.tdir/07-confroot.pre new file mode 100644 index 000000000..4f966bddd --- /dev/null +++ b/testdata/07-confroot.tdir/07-confroot.pre @@ -0,0 +1,13 @@ +# #-- 07-confroot.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="../.." + +if uname | grep "MINGW" >/dev/null; then + # no chroot, no need to test. + # (test fails on / and \ comparisons, by the way). + skip_test "no chroot on windows, end test" +fi diff --git a/testdata/07-confroot.tdir/07-confroot.test b/testdata/07-confroot.tdir/07-confroot.test index d940aa873..9572330f7 100644 --- a/testdata/07-confroot.tdir/07-confroot.test +++ b/testdata/07-confroot.tdir/07-confroot.test @@ -6,13 +6,6 @@ PRE="../.." -if uname | grep "MINGW" >/dev/null; then - # no chroot, no need to test. - # (test fails on / en \ comparisons, by the way). - echo "no chroot on windows, end test" - exit 0 -fi - # create config file cwd=`pwd -P` subdir=$cwd/subdir diff --git a/testdata/08-host-lib.tdir/08-host-lib.pre b/testdata/08-host-lib.tdir/08-host-lib.pre index 84817891f..481b0ef2c 100644 --- a/testdata/08-host-lib.tdir/08-host-lib.pre +++ b/testdata/08-host-lib.tdir/08-host-lib.pre @@ -4,7 +4,16 @@ # use .tpkg.var.test for in test variable passing [ -f .tpkg.var.test ] && source .tpkg.var.test +PRE="../.." . ../common.sh + +if grep FORK $PRE/config.h | grep "define" >/dev/null 2>&1; then + # nothing + : +else + skip_test "forking is not available; test skipped." +fi + get_random_port 2 FWD_PORT=$(($RND_PORT + 1)) echo "FWD_PORT=$FWD_PORT" >> .tpkg.var.test diff --git a/testdata/08-host-lib.tdir/08-host-lib.test b/testdata/08-host-lib.tdir/08-host-lib.test index 8de897776..18603294e 100644 --- a/testdata/08-host-lib.tdir/08-host-lib.test +++ b/testdata/08-host-lib.tdir/08-host-lib.test @@ -7,14 +7,6 @@ PRE="../.." . ../common.sh -if grep FORK $PRE/config.h | grep "define" >/dev/null 2>&1; then - # nothing - : -else - echo "forking is not available; test skipped." - exit 0 -fi - # test if fwder is up echo "> dig @127.0.0.1 -p $FWD_PORT www.example.com | tee outfile" dig @127.0.0.1 -p $FWD_PORT www.example.com | tee outfile diff --git a/testdata/acl_interface.tdir/acl_interface.conf b/testdata/acl_interface.tdir/acl_interface.conf new file mode 100644 index 000000000..157a2d7b7 --- /dev/null +++ b/testdata/acl_interface.tdir/acl_interface.conf @@ -0,0 +1,140 @@ +server: + verbosity: 7 + use-syslog: no + directory: "" + pidfile: "unbound.pid" + chroot: "" + username: "" + do-not-query-localhost: no + use-caps-for-id: no + define-tag: "one two refuse" + +# Interface configuration for IPv4 + interface: @IPV4_ADDR@@@PORT_ALLOW@ + interface: @IPV4_ADDR@@@PORT_DENY@ + interface: @IPV4_ADDR@@@PORT_REFUSE@ + interface: @IPV4_ADDR@@@PORT_TAG_1@ + interface: @IPV4_ADDR@@@PORT_TAG_2@ + interface: @IPV4_ADDR@@@PORT_TAG_3@ + interface: @IPV4_ADDR@@@PORT_VIEW_INT@ + interface: @IPV4_ADDR@@@PORT_VIEW_EXT@ + interface: @IPV4_ADDR@@@PORT_VIEW_INTEXT@ + + interface-action: @IPV4_ADDR@@@PORT_ALLOW@ allow + interface-action: @IPV4_ADDR@@@PORT_DENY@ deny + # interface-action: @IPV4_ADDR@@@PORT_REFUSE@ refuse # This is the default action + interface-action: @IPV4_ADDR@@@PORT_TAG_1@ allow + interface-action: @IPV4_ADDR@@@PORT_TAG_2@ allow + interface-action: @IPV4_ADDR@@@PORT_TAG_3@ allow + interface-action: @IPV4_ADDR@@@PORT_VIEW_INT@ allow + interface-action: @IPV4_ADDR@@@PORT_VIEW_EXT@ allow + interface-action: @IPV4_ADDR@@@PORT_VIEW_INTEXT@ allow + + interface-tag: @IPV4_ADDR@@@PORT_TAG_1@ "one" + interface-tag: @IPV4_ADDR@@@PORT_TAG_2@ "two" + interface-tag: @IPV4_ADDR@@@PORT_TAG_3@ "refuse" + interface-tag-action: @IPV4_ADDR@@@PORT_TAG_1@ one redirect + interface-tag-data: @IPV4_ADDR@@@PORT_TAG_1@ one "A 1.1.1.1" + interface-tag-action: @IPV4_ADDR@@@PORT_TAG_2@ two redirect + interface-tag-data: @IPV4_ADDR@@@PORT_TAG_2@ two "A 2.2.2.2" + interface-tag-action: @IPV4_ADDR@@@PORT_TAG_3@ refuse always_refuse + + interface-view: @IPV4_ADDR@@@PORT_VIEW_INT@ "int" + interface-view: @IPV4_ADDR@@@PORT_VIEW_EXT@ "ext" + interface-view: @IPV4_ADDR@@@PORT_VIEW_INTEXT@ "intext" + +# Mirrored interface configuration for IPv6 + interface: @IPV6_ADDR@@@PORT_ALLOW@ + interface: @IPV6_ADDR@@@PORT_DENY@ + interface: @IPV6_ADDR@@@PORT_REFUSE@ + interface: @IPV6_ADDR@@@PORT_TAG_1@ + interface: @IPV6_ADDR@@@PORT_TAG_2@ + interface: @IPV6_ADDR@@@PORT_TAG_3@ + interface: @IPV6_ADDR@@@PORT_VIEW_INT@ + interface: @IPV6_ADDR@@@PORT_VIEW_EXT@ + interface: @IPV6_ADDR@@@PORT_VIEW_INTEXT@ + + interface-action: @IPV6_ADDR@@@PORT_ALLOW@ allow + interface-action: @IPV6_ADDR@@@PORT_DENY@ deny + # interface-action: @IPV6_ADDR@@@PORT_REFUSE@ refuse # This is the default action + interface-action: @IPV6_ADDR@@@PORT_TAG_1@ allow + interface-action: @IPV6_ADDR@@@PORT_TAG_2@ allow + interface-action: @IPV6_ADDR@@@PORT_TAG_3@ allow + interface-action: @IPV6_ADDR@@@PORT_VIEW_INT@ allow + interface-action: @IPV6_ADDR@@@PORT_VIEW_EXT@ allow + interface-action: @IPV6_ADDR@@@PORT_VIEW_INTEXT@ allow + + interface-tag: @IPV6_ADDR@@@PORT_TAG_1@ "one" + interface-tag: @IPV6_ADDR@@@PORT_TAG_2@ "two" + interface-tag: @IPV6_ADDR@@@PORT_TAG_3@ "refuse" + interface-tag-action: @IPV6_ADDR@@@PORT_TAG_1@ one redirect + interface-tag-data: @IPV6_ADDR@@@PORT_TAG_1@ one "A 1.1.1.1" + interface-tag-action: @IPV6_ADDR@@@PORT_TAG_2@ two redirect + interface-tag-data: @IPV6_ADDR@@@PORT_TAG_2@ two "A 2.2.2.2" + interface-tag-action: @IPV6_ADDR@@@PORT_TAG_3@ refuse always_refuse + + interface-view: @IPV6_ADDR@@@PORT_VIEW_INT@ "int" + interface-view: @IPV6_ADDR@@@PORT_VIEW_EXT@ "ext" + interface-view: @IPV6_ADDR@@@PORT_VIEW_INTEXT@ "intext" + +# Mirrored interface configuration for interface name + interface: @INTERFACE@@@PORT_ALLOW@ + interface: @INTERFACE@@@PORT_DENY@ + interface: @INTERFACE@@@PORT_REFUSE@ + interface: @INTERFACE@@@PORT_TAG_1@ + interface: @INTERFACE@@@PORT_TAG_2@ + interface: @INTERFACE@@@PORT_TAG_3@ + interface: @INTERFACE@@@PORT_VIEW_INT@ + interface: @INTERFACE@@@PORT_VIEW_EXT@ + interface: @INTERFACE@@@PORT_VIEW_INTEXT@ + + interface-action: @INTERFACE@@@PORT_ALLOW@ allow + interface-action: @INTERFACE@@@PORT_DENY@ deny + # interface-action: @INTERFACE@@@PORT_REFUSE@ refuse # This is the default action + interface-action: @INTERFACE@@@PORT_TAG_1@ allow + interface-action: @INTERFACE@@@PORT_TAG_2@ allow + interface-action: @INTERFACE@@@PORT_TAG_3@ allow + interface-action: @INTERFACE@@@PORT_VIEW_INT@ allow + interface-action: @INTERFACE@@@PORT_VIEW_EXT@ allow + interface-action: @INTERFACE@@@PORT_VIEW_INTEXT@ allow + + interface-tag: @INTERFACE@@@PORT_TAG_1@ "one" + interface-tag: @INTERFACE@@@PORT_TAG_2@ "two" + interface-tag: @INTERFACE@@@PORT_TAG_3@ "refuse" + interface-tag-action: @INTERFACE@@@PORT_TAG_1@ one redirect + interface-tag-data: @INTERFACE@@@PORT_TAG_1@ one "A 1.1.1.1" + interface-tag-action: @INTERFACE@@@PORT_TAG_2@ two redirect + interface-tag-data: @INTERFACE@@@PORT_TAG_2@ two "A 2.2.2.2" + interface-tag-action: @INTERFACE@@@PORT_TAG_3@ refuse always_refuse + + interface-view: @INTERFACE@@@PORT_VIEW_INT@ "int" + interface-view: @INTERFACE@@@PORT_VIEW_EXT@ "ext" + interface-view: @INTERFACE@@@PORT_VIEW_INTEXT@ "intext" + +# Local zones configuration + local-zone: local. transparent + local-data: "local. A 0.0.0.0" + local-zone-tag: local. "one two refuse" + +# Views configuration +view: + name: "int" + view-first: yes + local-zone: "." refuse + local-zone: "internal" transparent +view: + name: "ext" + view-first: yes + local-zone: "internal" refuse +view: + name: "intext" + view-first: yes + +# Stubs configuration +forward-zone: + name: "." + forward-addr: @IPV4_ADDR@@@FORWARD_PORT@ + +stub-zone: + name: "internal" + stub-addr: @IPV4_ADDR@@@STUB_PORT@ diff --git a/testdata/acl_interface.tdir/acl_interface.dsc b/testdata/acl_interface.tdir/acl_interface.dsc new file mode 100644 index 000000000..cfe5c3cf5 --- /dev/null +++ b/testdata/acl_interface.tdir/acl_interface.dsc @@ -0,0 +1,16 @@ +BaseName: acl_interface +Version: 1.0 +Description: Check the interface-* settings +CreationDate: Fri 8 Oct 18:14:40 CEST 2021 +Maintainer: +Category: +Component: +CmdDepends: +Depends: +Help: +Pre: acl_interface.pre +Post: acl_interface.post +Test: acl_interface.test +AuxFiles: +Passed: +Failure: diff --git a/testdata/acl_interface.tdir/acl_interface.post b/testdata/acl_interface.tdir/acl_interface.post new file mode 100644 index 000000000..982e2b895 --- /dev/null +++ b/testdata/acl_interface.tdir/acl_interface.post @@ -0,0 +1,11 @@ +# #-- acl_interface.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 $UNBOUND_PID +kill_pid $FWD_PID +kill_pid $STUB_PID diff --git a/testdata/acl_interface.tdir/acl_interface.pre b/testdata/acl_interface.tdir/acl_interface.pre new file mode 100644 index 000000000..ce5358c1b --- /dev/null +++ b/testdata/acl_interface.tdir/acl_interface.pre @@ -0,0 +1,75 @@ +# #-- acl_interface.pre--# +PRE="../.." +. ../common.sh + +# This test uses the unshare utility +if test ! -x "`which unshare 2>&1`"; then + skip_test "no unshare (from util-linux package) available, skip test" +fi + +get_random_port 11 + +PORT_ALLOW=$RND_PORT +PORT_DENY=$(($RND_PORT + 1)) +PORT_REFUSE=$(($RND_PORT + 2)) +PORT_TAG_1=$(($RND_PORT + 3)) +PORT_TAG_2=$(($RND_PORT + 4)) +PORT_TAG_3=$(($RND_PORT + 5)) +PORT_VIEW_INT=$(($RND_PORT + 6)) +PORT_VIEW_EXT=$(($RND_PORT + 7)) +PORT_VIEW_INTEXT=$(($RND_PORT + 8)) +FORWARD_PORT=$(($RND_PORT + 9)) +STUB_PORT=$(($RND_PORT + 10)) + +IPV4_ADDR=192.168.1.1 +IPV6_ADDR=2001:db8::1 + +INTERFACE=eth24 +INTERFACE_ADDR_1=10.0.0.1 +INTERFACE_ADDR_2=10.0.0.2 +INTERFACE_ADDR_3=10.0.0.3 +INTERFACE_ADDR_4=10.0.0.4 + +# make config file +sed \ + -e 's/@PORT_ALLOW\@/'$PORT_ALLOW'/' \ + -e 's/@PORT_DENY\@/'$PORT_DENY'/' \ + -e 's/@PORT_REFUSE\@/'$PORT_REFUSE'/' \ + -e 's/@PORT_TAG_1\@/'$PORT_TAG_1'/' \ + -e 's/@PORT_TAG_2\@/'$PORT_TAG_2'/' \ + -e 's/@PORT_TAG_3\@/'$PORT_TAG_3'/' \ + -e 's/@PORT_VIEW_INT\@/'$PORT_VIEW_INT'/' \ + -e 's/@PORT_VIEW_EXT\@/'$PORT_VIEW_EXT'/' \ + -e 's/@PORT_VIEW_INTEXT\@/'$PORT_VIEW_INTEXT'/' \ + -e 's/@FORWARD_PORT\@/'$FORWARD_PORT'/' \ + -e 's/@STUB_PORT\@/'$STUB_PORT'/' \ + -e 's/@IPV4_ADDR\@/'$IPV4_ADDR'/' \ + -e 's/@IPV6_ADDR\@/'$IPV6_ADDR'/' \ + -e 's/@INTERFACE\@/'$INTERFACE'/' \ + < acl_interface.conf > ub.conf + +if test -x "`which bash`"; then + shell="bash" +else + shell="sh" +fi + +echo "PORT_ALLOW=$PORT_ALLOW" >> .tpkg.var.test +echo "PORT_DENY=$PORT_DENY" >> .tpkg.var.test +echo "PORT_REFUSE=$PORT_REFUSE" >> .tpkg.var.test +echo "PORT_TAG_1=$PORT_TAG_1" >> .tpkg.var.test +echo "PORT_TAG_2=$PORT_TAG_2" >> .tpkg.var.test +echo "PORT_TAG_3=$PORT_TAG_3" >> .tpkg.var.test +echo "PORT_VIEW_INT=$PORT_VIEW_INT" >> .tpkg.var.test +echo "PORT_VIEW_EXT=$PORT_VIEW_EXT" >> .tpkg.var.test +echo "PORT_VIEW_INTEXT=$PORT_VIEW_INTEXT" >> .tpkg.var.test +echo "FORWARD_PORT=$FORWARD_PORT" >> .tpkg.var.test +echo "STUB_PORT=$STUB_PORT" >> .tpkg.var.test +echo "IPV4_ADDR=$IPV4_ADDR" >> .tpkg.var.test +echo "IPV6_ADDR=$IPV6_ADDR" >> .tpkg.var.test +echo "INTERFACE=$INTERFACE" >> .tpkg.var.test +echo "INTERFACE_ADDR_1=$INTERFACE_ADDR_1" >> .tpkg.var.test +echo "INTERFACE_ADDR_2=$INTERFACE_ADDR_2" >> .tpkg.var.test +echo "INTERFACE_ADDR_3=$INTERFACE_ADDR_3" >> .tpkg.var.test +echo "INTERFACE_ADDR_4=$INTERFACE_ADDR_4" >> .tpkg.var.test +echo "shell=$shell" >> .tpkg.var.test diff --git a/testdata/acl_interface.tdir/acl_interface.test b/testdata/acl_interface.tdir/acl_interface.test new file mode 100644 index 000000000..421081887 --- /dev/null +++ b/testdata/acl_interface.tdir/acl_interface.test @@ -0,0 +1,11 @@ +# #-- acl_interface.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 + +# Run the scenario in an unshared namespace +unshare -rUn $shell acl_interface.test.scenario +exit $? diff --git a/testdata/acl_interface.tdir/acl_interface.test.scenario b/testdata/acl_interface.tdir/acl_interface.test.scenario new file mode 100644 index 000000000..00b2b059f --- /dev/null +++ b/testdata/acl_interface.tdir/acl_interface.test.scenario @@ -0,0 +1,205 @@ +# #-- acl_interface.test.scenario --# +# 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 + +ip addr add $IPV4_ADDR dev lo +ip addr add $IPV6_ADDR dev lo +ip link set lo up + +ip link add $INTERFACE type dummy +ip addr add $INTERFACE_ADDR_1 dev $INTERFACE +ip addr add $INTERFACE_ADDR_2 dev $INTERFACE +ip addr add $INTERFACE_ADDR_3 dev $INTERFACE +ip addr add $INTERFACE_ADDR_4 dev $INTERFACE +ip link set $INTERFACE up + +# start the forwarder in the background +get_ldns_testns +$LDNS_TESTNS -p $FORWARD_PORT acl_interface.testns >fwd.log 2>&1 & +FWD_PID=$! +echo "FWD_PID=$FWD_PID" >> .tpkg.var.test + +# start the stub in the background +$LDNS_TESTNS -p $STUB_PORT acl_interface.testns2 >fwd2.log 2>&1 & +STUB_PID=$! +echo "STUB_PID=$STUB_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_ldns_testns_up fwd.log +wait_ldns_testns_up fwd2.log +wait_unbound_up unbound.log + +end () { + echo "> cat logfiles" + cat fwd.log + cat fwd2.log + cat unbound.log + exit $1 +} + +# Query for the given domain to the given port +# $1: address family [4, 6] +# $2: port +# $3: dname +query () { + addr=$IPV4_ADDR + if test "$1" -eq 6; then + addr=$IPV6_ADDR + fi + echo "> dig -p $2 $3" + dig @"$addr" -p $2 $3 | tee outfile +} + +# Query for the given domain to the given port +# $1: address +# $2: port +# $3: dname +query_addr () { + echo "> dig @$1 -p $2 $3" + dig @"$1" -p $2 $3 | tee outfile +} + +expect_refused () { + echo "> check answer for REFUSED" + if grep "REFUSED" outfile; then + echo "OK" + else + echo "Not OK" + end 1 + fi +} + +expect_external_answer () { + echo "> check external answer" + if grep "1.2.3.4" outfile; then + echo "OK" + else + echo "Not OK" + end 1 + fi +} + +expect_internal_answer () { + echo "> check internal answer" + if grep "10.20.30.40" outfile; then + echo "OK" + else + echo "Not OK" + end 1 + fi +} + +expect_tag_one_answer () { + echo "> check tag 'one' answer" + if grep "1.1.1.1" outfile; then + echo "OK" + else + echo "Not OK" + end 1 + fi +} + +expect_tag_two_answer () { + echo "> check tag 'two' answer" + if grep "2.2.2.2" outfile; then + echo "OK" + else + echo "Not OK" + end 1 + fi +} + +# do the test + +for i in 4 6; do + query $i $PORT_REFUSE "www.external" + expect_refused + + query $i $PORT_REFUSE "www.internal" + expect_refused + + query $i $PORT_ALLOW "www.external" + expect_external_answer + + query $i $PORT_ALLOW "www.internal" + expect_internal_answer + + query $i $PORT_TAG_1 "local" + expect_tag_one_answer + + query $i $PORT_TAG_2 "local" + expect_tag_two_answer + + query $i $PORT_TAG_3 "local" + expect_refused + + query $i $PORT_VIEW_INT "www.internal" + expect_internal_answer + + query $i $PORT_VIEW_INT "www.external" + expect_refused + + query $i $PORT_VIEW_EXT "www.internal" + expect_refused + + query $i $PORT_VIEW_EXT "www.external" + expect_external_answer + + query $i $PORT_VIEW_INTEXT "www.internal" + expect_internal_answer + + query $i $PORT_VIEW_INTEXT "www.external" + expect_external_answer +done + +for addr in $INTERFACE_ADDR_1 $INTERFACE_ADDR_2 $INTERFACE_ADDR_3 $INTERFACE_ADDR_4; do + query_addr $addr $PORT_REFUSE "www.external" + expect_refused + + query_addr $addr $PORT_REFUSE "www.internal" + expect_refused + + query_addr $addr $PORT_ALLOW "www.external" + expect_external_answer + + query_addr $addr $PORT_ALLOW "www.internal" + expect_internal_answer + + query_addr $addr $PORT_TAG_1 "local" + expect_tag_one_answer + + query_addr $addr $PORT_TAG_2 "local" + expect_tag_two_answer + + query_addr $addr $PORT_TAG_3 "local" + expect_refused + + query_addr $addr $PORT_VIEW_INT "www.internal" + expect_internal_answer + + query_addr $addr $PORT_VIEW_INT "www.external" + expect_refused + + query_addr $addr $PORT_VIEW_EXT "www.internal" + expect_refused + + query_addr $addr $PORT_VIEW_EXT "www.external" + expect_external_answer + + query_addr $addr $PORT_VIEW_INTEXT "www.internal" + expect_internal_answer + + query_addr $addr $PORT_VIEW_INTEXT "www.external" + expect_external_answer +done + +end 0 diff --git a/testdata/acl_interface.tdir/acl_interface.testns b/testdata/acl_interface.tdir/acl_interface.testns new file mode 100644 index 000000000..d8c871b1c --- /dev/null +++ b/testdata/acl_interface.tdir/acl_interface.testns @@ -0,0 +1,26 @@ +; nameserver test file +$ORIGIN external. +$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 1.2.3.4 +ENTRY_END + +$ORIGIN local. +$TTL 3600 + +ENTRY_BEGIN +MATCH opcode qtype qname +REPLY QR AA NOERROR +ADJUST copy_id +SECTION QUESTION +@ IN A +SECTION ANSWER +@ IN A 127.0.0.1 +ENTRY_END diff --git a/testdata/acl_interface.tdir/acl_interface.testns2 b/testdata/acl_interface.tdir/acl_interface.testns2 new file mode 100644 index 000000000..e9edfc8ba --- /dev/null +++ b/testdata/acl_interface.tdir/acl_interface.testns2 @@ -0,0 +1,13 @@ +; nameserver test file +$ORIGIN internal. +$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/cachedb_servfail_cname.crpl b/testdata/cachedb_servfail_cname.crpl new file mode 100644 index 000000000..221f00d4d --- /dev/null +++ b/testdata/cachedb_servfail_cname.crpl @@ -0,0 +1,181 @@ +; config options +server: + target-fetch-policy: "0 0 0 0 0" + qname-minimisation: no + minimal-responses: no + ;serve-expired: yes + module-config: "cachedb iterator" + +cachedb: + backend: "testframe" + secret-seed: "testvalue" + +stub-zone: + name: "." + stub-addr: 193.0.14.129 +CONFIG_END + +SCENARIO_BEGIN Test cachedb store and servfail reply from cname. +; the servfail reply should not overwrite the cache contents. + +; 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 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 ns2.example.com. +SECTION ADDITIONAL +ns2.example.com. IN A 1.2.3.5 +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.example.com. +ENTRY_END +RANGE_END + +; ns2.example.com. +RANGE_BEGIN 0 20 + ADDRESS 1.2.3.5 +ENTRY_BEGIN +MATCH opcode qname qtype +REPLY QR AA NOERROR +SECTION QUESTION +www.example.com. IN A +SECTION ANSWER +www.example.com. 10 IN A 1.2.3.4 +ENTRY_END +RANGE_END + +; ns2.example.com., now failing +RANGE_BEGIN 20 100 + ADDRESS 1.2.3.5 +ENTRY_BEGIN +MATCH opcode qname qtype +REPLY QR AA NOERROR +SECTION QUESTION +www.example.com. IN A +SECTION ANSWER +www.example.com. 10 IN CNAME foo.example.com. +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qname qtype +REPLY QR AA SERVFAIL +SECTION QUESTION +foo.example.com. IN A +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qname qtype +REPLY QR AA SERVFAIL +SECTION QUESTION +ns2.example.com. IN A +SECTION ANSWER +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qname qtype +REPLY QR AA SERVFAIL +SECTION QUESTION +ns2.example.com. IN AAAA +SECTION ANSWER +ENTRY_END +RANGE_END + +; get and entry in cache, to make it expired. +STEP 1 QUERY +ENTRY_BEGIN +REPLY RD +SECTION QUESTION +www.example.com. IN A +ENTRY_END + +; get the answer for it +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. 10 IN A 1.2.3.4 +ENTRY_END + +; it is now expired +STEP 20 TIME_PASSES ELAPSE 20 + +; get a servfail in cache for the destination +STEP 30 QUERY +ENTRY_BEGIN +REPLY RD +SECTION QUESTION +foo.example.com. IN A +ENTRY_END + +STEP 40 CHECK_ANSWER +ENTRY_BEGIN +MATCH all +REPLY QR RD RA SERVFAIL +SECTION QUESTION +foo.example.com. IN A +ENTRY_END + +; the query is now a CNAME to servfail. +; there is a valid, but expired, entry in cache. +STEP 50 QUERY +ENTRY_BEGIN +REPLY RD +SECTION QUESTION +www.example.com. IN A +ENTRY_END + +STEP 60 CHECK_ANSWER +ENTRY_BEGIN +MATCH all +REPLY QR RD RA SERVFAIL +SECTION QUESTION +www.example.com. IN A +SECTION ANSWER +www.example.com. 10 IN CNAME foo.example.com. +ENTRY_END + +SCENARIO_END diff --git a/testdata/clang-analysis.tdir/clang-analysis.dsc b/testdata/clang-analysis.tdir/clang-analysis.dsc index 20a62a3e3..b3a0609e3 100644 --- a/testdata/clang-analysis.tdir/clang-analysis.dsc +++ b/testdata/clang-analysis.tdir/clang-analysis.dsc @@ -7,7 +7,7 @@ Category: Component: Depends: Help: -Pre: +Pre: clang-analysis.pre Post: Test: clang-analysis.test AuxFiles: diff --git a/testdata/clang-analysis.tdir/clang-analysis.pre b/testdata/clang-analysis.tdir/clang-analysis.pre new file mode 100644 index 000000000..e9b9a26fa --- /dev/null +++ b/testdata/clang-analysis.tdir/clang-analysis.pre @@ -0,0 +1,21 @@ +# #-- clang-analysis.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 functions +. ../common.sh + +PRE="../.." +if test ! -x "`which clang 2>&1`"; then + skip_test "No clang in path" +fi +#echo "have clang" +# test if assertions are enabled +if grep "^#define UNBOUND_DEBUG" $PRE/config.h >/dev/null; then + : +else + skip_test "UNBOUND_DEBUG is not enabled, skip test" + # no unbound debug means no assertions, and clang analyzer uses + # the assertions to make inferences. +fi diff --git a/testdata/clang-analysis.tdir/clang-analysis.test b/testdata/clang-analysis.tdir/clang-analysis.test index 09c935860..388556a44 100644 --- a/testdata/clang-analysis.tdir/clang-analysis.test +++ b/testdata/clang-analysis.tdir/clang-analysis.test @@ -7,20 +7,6 @@ . ../common.sh PRE="../.." -if test ! -x "`which clang 2>&1`"; then - echo "No clang in path" - exit 0 -fi -#echo "have clang" -# test if assertions are enabled -if grep "^#define UNBOUND_DEBUG" $PRE/config.h >/dev/null; then - : -else - echo "UNBOUND_DEBUG is not enabled, skip test" - # no unbound debug means no assertions, and clang analyzer uses - # the assertions to make inferences. - exit 0 -fi # read value from Makefile # $1: result variable name diff --git a/testdata/common.sh b/testdata/common.sh index 280f5dac4..a449f1a64 100644 --- a/testdata/common.sh +++ b/testdata/common.sh @@ -27,6 +27,7 @@ # wait_petal_up : wait for petal to come up. # wait_nsd_up : wait for nsd to come up. # wait_server_up_or_fail: wait for server to come up or print a failure string +# skip_test x : print message and skip test (must be called in .pre) # kill_pid : kill a server, make sure and wait for it to go down. @@ -109,6 +110,13 @@ skip_if_in_list () { fi } +# Print a message and skip the test. Must be called in the .pre file. +# $1: message to print. +skip_test () { + echo "$1" + exit 3 +} + # function to get a number of random port numbers. # $1: number of random ports. # RND_PORT is returned as the starting port number diff --git a/testdata/dnscrypt_cert.tdir/dnscrypt_cert.post b/testdata/dnscrypt_cert.tdir/dnscrypt_cert.post index 0346d3f84..fcb6c9d0e 100644 --- a/testdata/dnscrypt_cert.tdir/dnscrypt_cert.post +++ b/testdata/dnscrypt_cert.tdir/dnscrypt_cert.post @@ -8,9 +8,6 @@ PRE="../.." . ../common.sh -# Check if we can run the test. -. ./precheck.sh - kill_pid $FWD_PID kill_pid $UNBOUND_PID diff --git a/testdata/dnscrypt_cert.tdir/dnscrypt_cert.pre b/testdata/dnscrypt_cert.tdir/dnscrypt_cert.pre index bee9e8ac6..6cf52299c 100644 --- a/testdata/dnscrypt_cert.tdir/dnscrypt_cert.pre +++ b/testdata/dnscrypt_cert.tdir/dnscrypt_cert.pre @@ -8,7 +8,11 @@ PRE="../.." . ../common.sh # Check if we can run the test. -. ./precheck.sh +if grep "define USE_DNSCRYPT 1" $PRE/config.h; then + echo "have dnscrypt" +else + skip_test "no dnscrypt" +fi get_random_port 3 UNBOUND_PORT=$RND_PORT diff --git a/testdata/dnscrypt_cert.tdir/dnscrypt_cert.test b/testdata/dnscrypt_cert.tdir/dnscrypt_cert.test index f09753792..fdb88e8f9 100644 --- a/testdata/dnscrypt_cert.tdir/dnscrypt_cert.test +++ b/testdata/dnscrypt_cert.tdir/dnscrypt_cert.test @@ -7,9 +7,6 @@ PRE="../.." . ../common.sh -# Check if we can run the test. -. ./precheck.sh - # do the test # Query plain request over DNSCrypt channel get closed diff --git a/testdata/dnscrypt_cert.tdir/precheck.sh b/testdata/dnscrypt_cert.tdir/precheck.sh deleted file mode 100644 index 00fa4bc76..000000000 --- a/testdata/dnscrypt_cert.tdir/precheck.sh +++ /dev/null @@ -1,16 +0,0 @@ -# dnscrypt precheck.sh - -# if no dnscrypt; exit -if grep "define USE_DNSCRYPT 1" $PRE/config.h; then - echo "have dnscrypt" -else - echo "no dnscrypt" - exit 0 -fi - -# if no xchacha20 support in unbound; exit -if grep "define USE_DNSCRYPT_XCHACHA20 1" $PRE/config.h; then - xchacha20=1 -else - xchacha20=0 -fi diff --git a/testdata/dnscrypt_cert_chacha.tdir/dnscrypt_cert_chacha.post b/testdata/dnscrypt_cert_chacha.tdir/dnscrypt_cert_chacha.post index 54337df67..9537d9e82 100644 --- a/testdata/dnscrypt_cert_chacha.tdir/dnscrypt_cert_chacha.post +++ b/testdata/dnscrypt_cert_chacha.tdir/dnscrypt_cert_chacha.post @@ -8,10 +8,5 @@ PRE="../.." . ../common.sh -# Check if we can run the test. -. ./precheck.sh - kill_pid $FWD_PID -if [ $xchacha20 -ne 0 ]; then - kill_pid $UNBOUND_PID -fi +kill_pid $UNBOUND_PID diff --git a/testdata/dnscrypt_cert_chacha.tdir/dnscrypt_cert_chacha.pre b/testdata/dnscrypt_cert_chacha.tdir/dnscrypt_cert_chacha.pre index c77290a8a..4534fdf47 100644 --- a/testdata/dnscrypt_cert_chacha.tdir/dnscrypt_cert_chacha.pre +++ b/testdata/dnscrypt_cert_chacha.tdir/dnscrypt_cert_chacha.pre @@ -7,8 +7,17 @@ PRE="../.." . ../common.sh -# Check if we can run the test. -. ./precheck.sh +# if no dnscrypt; exit +if grep "define USE_DNSCRYPT 1" $PRE/config.h; then + echo "have dnscrypt" +else + skip_test "no dnscrypt" +fi +if grep "define USE_DNSCRYPT_XCHACHA20 1" $PRE/config.h; then + echo "have XChacha20 support" +else + skip_test "no XChacha20 support" +fi get_random_port 3 UNBOUND_PORT=$RND_PORT @@ -34,10 +43,5 @@ echo "UNBOUND_PID=$UNBOUND_PID" >> .tpkg.var.test cat .tpkg.var.test wait_ldns_testns_up fwd.log -if [ $xchacha20 -eq 0 ]; then - # no xchacha20 support, we expect unbound to exit with an error message. - wait_server_up unbound.log "Certificate for XChacha20 but libsodium does not support it" -else - wait_unbound_up unbound.log -fi +wait_unbound_up unbound.log diff --git a/testdata/dnscrypt_cert_chacha.tdir/dnscrypt_cert_chacha.test b/testdata/dnscrypt_cert_chacha.tdir/dnscrypt_cert_chacha.test index 4ef6942be..2db073ad6 100644 --- a/testdata/dnscrypt_cert_chacha.tdir/dnscrypt_cert_chacha.test +++ b/testdata/dnscrypt_cert_chacha.tdir/dnscrypt_cert_chacha.test @@ -6,17 +6,9 @@ PRE="../.." . ../common.sh -# Check if we can run the test. -. ./precheck.sh # do the test -if [ $xchacha20 -eq 0 ]; then - # Unbound would exit before we can attempt any tests. - echo "OK" - exit 0 -fi - # Query plain request over DNSCrypt channel get closed # We use TCP to avoid hanging on waiting for UDP. # We expect `outfile` to contain no DNS payload @@ -104,7 +96,7 @@ do echo "> check answer" grep -F 'DNSC\000\002\000\000\1716\226\255*\244\002L\177g\025_\127tR\151\246R\203\178\153\248\006\137\"\138\173|G/,\160\152\015\010\172\184\220`\175\217\255,\162\018\178-d\007\246k0\003I[\205w\026)\204B\002\161\010\245\243W\191\189Z\216\210x\025\204\247\173\227t\138\018\162~\152\253\211\031z\\\002m5\008\254\2244\246\243W\191\189Z\216\210Y\160\2158Y\160\2158u\210\219\184' outfile cert_found=$? - if [ \( $cert_found -eq 0 -a $xchacha20 -eq 1 \) -o \( $cert_found -ne 0 -a $xchacha20 -eq 0 \) ]; then + if [ \( $cert_found -eq 0 \) ]; then echo "OK" else echo "Not OK" diff --git a/testdata/dnscrypt_cert_chacha.tdir/precheck.sh b/testdata/dnscrypt_cert_chacha.tdir/precheck.sh deleted file mode 100644 index 00fa4bc76..000000000 --- a/testdata/dnscrypt_cert_chacha.tdir/precheck.sh +++ /dev/null @@ -1,16 +0,0 @@ -# dnscrypt precheck.sh - -# if no dnscrypt; exit -if grep "define USE_DNSCRYPT 1" $PRE/config.h; then - echo "have dnscrypt" -else - echo "no dnscrypt" - exit 0 -fi - -# if no xchacha20 support in unbound; exit -if grep "define USE_DNSCRYPT_XCHACHA20 1" $PRE/config.h; then - xchacha20=1 -else - xchacha20=0 -fi diff --git a/testdata/dnstap.tdir/dnstap.post b/testdata/dnstap.tdir/dnstap.post index 6744b4b61..6d5e9d50d 100644 --- a/testdata/dnstap.tdir/dnstap.post +++ b/testdata/dnstap.tdir/dnstap.post @@ -7,7 +7,6 @@ # do your teardown here . ../common.sh PRE="../.." -if grep "define USE_DNSTAP 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi kill_pid $DNSTAP_SOCKET_PID kill_pid $FWD_PID kill $UNBOUND_PID diff --git a/testdata/dnstap.tdir/dnstap.pre b/testdata/dnstap.tdir/dnstap.pre index 6561d77e9..0f2e0231d 100644 --- a/testdata/dnstap.tdir/dnstap.pre +++ b/testdata/dnstap.tdir/dnstap.pre @@ -7,7 +7,7 @@ . ../common.sh PRE="../.." -if grep "define USE_DNSTAP 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi +if grep "define USE_DNSTAP 1" $PRE/config.h; then echo test enabled; else skip_test "test skipped"; fi get_random_port 3 UNBOUND_PORT=$RND_PORT diff --git a/testdata/dnstap.tdir/dnstap.test b/testdata/dnstap.tdir/dnstap.test index fbf8565ff..3a2dcc5e1 100644 --- a/testdata/dnstap.tdir/dnstap.test +++ b/testdata/dnstap.tdir/dnstap.test @@ -6,7 +6,6 @@ . ../common.sh PRE="../.." -if grep "define USE_DNSTAP 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi # test if the server is up. echo "> dig www.example.com." diff --git a/testdata/dnstap_reconnect.tdir/dnstap_reconnect.post b/testdata/dnstap_reconnect.tdir/dnstap_reconnect.post index 0056a20d9..44b8e6b97 100644 --- a/testdata/dnstap_reconnect.tdir/dnstap_reconnect.post +++ b/testdata/dnstap_reconnect.tdir/dnstap_reconnect.post @@ -7,7 +7,6 @@ # do your teardown here . ../common.sh PRE="../.." -if grep "define USE_DNSTAP 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi kill_pid $DNSTAP_SOCKET_PID kill_pid $FWD_PID kill $UNBOUND_PID diff --git a/testdata/dnstap_reconnect.tdir/dnstap_reconnect.pre b/testdata/dnstap_reconnect.tdir/dnstap_reconnect.pre index a1aba4f35..df031ac01 100644 --- a/testdata/dnstap_reconnect.tdir/dnstap_reconnect.pre +++ b/testdata/dnstap_reconnect.tdir/dnstap_reconnect.pre @@ -7,7 +7,7 @@ . ../common.sh PRE="../.." -if grep "define USE_DNSTAP 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi +if grep "define USE_DNSTAP 1" $PRE/config.h; then echo test enabled; else skip_test "test skipped"; fi get_random_port 3 UNBOUND_PORT=$RND_PORT diff --git a/testdata/dnstap_reconnect.tdir/dnstap_reconnect.test b/testdata/dnstap_reconnect.tdir/dnstap_reconnect.test index 94679bc66..8f28bc109 100644 --- a/testdata/dnstap_reconnect.tdir/dnstap_reconnect.test +++ b/testdata/dnstap_reconnect.tdir/dnstap_reconnect.test @@ -6,7 +6,6 @@ . ../common.sh PRE="../.." -if grep "define USE_DNSTAP 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi # test if the server is up. echo "> dig www.example.com." diff --git a/testdata/dnstap_tcp.tdir/dnstap_tcp.post b/testdata/dnstap_tcp.tdir/dnstap_tcp.post index 8aad21e19..f9a52edf6 100644 --- a/testdata/dnstap_tcp.tdir/dnstap_tcp.post +++ b/testdata/dnstap_tcp.tdir/dnstap_tcp.post @@ -7,7 +7,6 @@ # do your teardown here . ../common.sh PRE="../.." -if grep "define USE_DNSTAP 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi kill_pid $DNSTAP_SOCKET_PID kill_pid $FWD_PID kill $UNBOUND_PID diff --git a/testdata/dnstap_tcp.tdir/dnstap_tcp.pre b/testdata/dnstap_tcp.tdir/dnstap_tcp.pre index 3006603c5..aea781de9 100644 --- a/testdata/dnstap_tcp.tdir/dnstap_tcp.pre +++ b/testdata/dnstap_tcp.tdir/dnstap_tcp.pre @@ -7,7 +7,7 @@ . ../common.sh PRE="../.." -if grep "define USE_DNSTAP 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi +if grep "define USE_DNSTAP 1" $PRE/config.h; then echo test enabled; else skip_test "test skipped"; fi get_random_port 4 UNBOUND_PORT=$RND_PORT diff --git a/testdata/dnstap_tcp.tdir/dnstap_tcp.test b/testdata/dnstap_tcp.tdir/dnstap_tcp.test index d57eecfdb..c9aef3e78 100644 --- a/testdata/dnstap_tcp.tdir/dnstap_tcp.test +++ b/testdata/dnstap_tcp.tdir/dnstap_tcp.test @@ -6,7 +6,6 @@ . ../common.sh PRE="../.." -if grep "define USE_DNSTAP 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi # test if the server is up. echo "> dig www.example.com." diff --git a/testdata/dnstap_tls.tdir/dnstap_tls.post b/testdata/dnstap_tls.tdir/dnstap_tls.post index fe1824a06..8adfb1a02 100644 --- a/testdata/dnstap_tls.tdir/dnstap_tls.post +++ b/testdata/dnstap_tls.tdir/dnstap_tls.post @@ -7,7 +7,6 @@ # do your teardown here . ../common.sh PRE="../.." -if grep "define USE_DNSTAP 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi kill_pid $DNSTAP_SOCKET_PID kill_pid $FWD_PID kill $UNBOUND_PID diff --git a/testdata/dnstap_tls.tdir/dnstap_tls.pre b/testdata/dnstap_tls.tdir/dnstap_tls.pre index 1df914873..7a20ec2dd 100644 --- a/testdata/dnstap_tls.tdir/dnstap_tls.pre +++ b/testdata/dnstap_tls.tdir/dnstap_tls.pre @@ -7,7 +7,7 @@ . ../common.sh PRE="../.." -if grep "define USE_DNSTAP 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi +if grep "define USE_DNSTAP 1" $PRE/config.h; then echo test enabled; else skip_test "test skipped"; fi get_random_port 4 UNBOUND_PORT=$RND_PORT diff --git a/testdata/dnstap_tls.tdir/dnstap_tls.test b/testdata/dnstap_tls.tdir/dnstap_tls.test index f9a2bf00d..3a0bf10f0 100644 --- a/testdata/dnstap_tls.tdir/dnstap_tls.test +++ b/testdata/dnstap_tls.tdir/dnstap_tls.test @@ -6,7 +6,6 @@ . ../common.sh PRE="../.." -if grep "define USE_DNSTAP 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi # test if the server is up. echo "> dig www.example.com." diff --git a/testdata/dnstap_tls_badcert.tdir/dnstap_tls_badcert.post b/testdata/dnstap_tls_badcert.tdir/dnstap_tls_badcert.post index d71eb28ae..aa0dfbfa4 100644 --- a/testdata/dnstap_tls_badcert.tdir/dnstap_tls_badcert.post +++ b/testdata/dnstap_tls_badcert.tdir/dnstap_tls_badcert.post @@ -7,7 +7,6 @@ # do your teardown here . ../common.sh PRE="../.." -if grep "define USE_DNSTAP 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi kill_pid $DNSTAP_SOCKET_PID kill_pid $FWD_PID kill $UNBOUND_PID diff --git a/testdata/dnstap_tls_badcert.tdir/dnstap_tls_badcert.pre b/testdata/dnstap_tls_badcert.tdir/dnstap_tls_badcert.pre index eff7074d0..f077965e0 100644 --- a/testdata/dnstap_tls_badcert.tdir/dnstap_tls_badcert.pre +++ b/testdata/dnstap_tls_badcert.tdir/dnstap_tls_badcert.pre @@ -7,7 +7,7 @@ . ../common.sh PRE="../.." -if grep "define USE_DNSTAP 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi +if grep "define USE_DNSTAP 1" $PRE/config.h; then echo test enabled; else skip_test "test skipped"; fi get_random_port 4 UNBOUND_PORT=$RND_PORT diff --git a/testdata/dnstap_tls_badcert.tdir/dnstap_tls_badcert.test b/testdata/dnstap_tls_badcert.tdir/dnstap_tls_badcert.test index 0b85f64ac..b4d944a0f 100644 --- a/testdata/dnstap_tls_badcert.tdir/dnstap_tls_badcert.test +++ b/testdata/dnstap_tls_badcert.tdir/dnstap_tls_badcert.test @@ -6,7 +6,6 @@ . ../common.sh PRE="../.." -if grep "define USE_DNSTAP 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi # test if the server is up. echo "> dig www.example.com." diff --git a/testdata/dnstap_tls_badname.tdir/dnstap_tls_badname.post b/testdata/dnstap_tls_badname.tdir/dnstap_tls_badname.post index 59f05b81d..553aa2f87 100644 --- a/testdata/dnstap_tls_badname.tdir/dnstap_tls_badname.post +++ b/testdata/dnstap_tls_badname.tdir/dnstap_tls_badname.post @@ -7,7 +7,6 @@ # do your teardown here . ../common.sh PRE="../.." -if grep "define USE_DNSTAP 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi kill_pid $DNSTAP_SOCKET_PID kill_pid $FWD_PID kill $UNBOUND_PID diff --git a/testdata/dnstap_tls_badname.tdir/dnstap_tls_badname.pre b/testdata/dnstap_tls_badname.tdir/dnstap_tls_badname.pre index 0ffee6081..6a4a480b6 100644 --- a/testdata/dnstap_tls_badname.tdir/dnstap_tls_badname.pre +++ b/testdata/dnstap_tls_badname.tdir/dnstap_tls_badname.pre @@ -7,7 +7,7 @@ . ../common.sh PRE="../.." -if grep "define USE_DNSTAP 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi +if grep "define USE_DNSTAP 1" $PRE/config.h; then echo test enabled; else skip_test "test skipped"; fi get_random_port 4 UNBOUND_PORT=$RND_PORT diff --git a/testdata/dnstap_tls_badname.tdir/dnstap_tls_badname.test b/testdata/dnstap_tls_badname.tdir/dnstap_tls_badname.test index 248d8f222..907392f6d 100644 --- a/testdata/dnstap_tls_badname.tdir/dnstap_tls_badname.test +++ b/testdata/dnstap_tls_badname.tdir/dnstap_tls_badname.test @@ -6,7 +6,6 @@ . ../common.sh PRE="../.." -if grep "define USE_DNSTAP 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi # test if the server is up. echo "> dig www.example.com." diff --git a/testdata/dnstap_tls_clientauth.tdir/dnstap_tls_clientauth.post b/testdata/dnstap_tls_clientauth.tdir/dnstap_tls_clientauth.post index 83df2a72e..2ef2ac36f 100644 --- a/testdata/dnstap_tls_clientauth.tdir/dnstap_tls_clientauth.post +++ b/testdata/dnstap_tls_clientauth.tdir/dnstap_tls_clientauth.post @@ -7,7 +7,6 @@ # do your teardown here . ../common.sh PRE="../.." -if grep "define USE_DNSTAP 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi kill_pid $DNSTAP_SOCKET_PID kill_pid $FWD_PID kill $UNBOUND_PID diff --git a/testdata/dnstap_tls_clientauth.tdir/dnstap_tls_clientauth.pre b/testdata/dnstap_tls_clientauth.tdir/dnstap_tls_clientauth.pre index a035181ce..80a5cd61b 100644 --- a/testdata/dnstap_tls_clientauth.tdir/dnstap_tls_clientauth.pre +++ b/testdata/dnstap_tls_clientauth.tdir/dnstap_tls_clientauth.pre @@ -7,7 +7,7 @@ . ../common.sh PRE="../.." -if grep "define USE_DNSTAP 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi +if grep "define USE_DNSTAP 1" $PRE/config.h; then echo test enabled; else skip_test "test skipped"; fi get_random_port 4 UNBOUND_PORT=$RND_PORT diff --git a/testdata/dnstap_tls_clientauth.tdir/dnstap_tls_clientauth.test b/testdata/dnstap_tls_clientauth.tdir/dnstap_tls_clientauth.test index 5b9cce0a4..842c8190e 100644 --- a/testdata/dnstap_tls_clientauth.tdir/dnstap_tls_clientauth.test +++ b/testdata/dnstap_tls_clientauth.tdir/dnstap_tls_clientauth.test @@ -6,7 +6,6 @@ . ../common.sh PRE="../.." -if grep "define USE_DNSTAP 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi # test if the server is up. echo "> dig www.example.com." diff --git a/testdata/dnstap_tls_peername.tdir/dnstap_tls_peername.post b/testdata/dnstap_tls_peername.tdir/dnstap_tls_peername.post index 3ca63ada4..733a36ea9 100644 --- a/testdata/dnstap_tls_peername.tdir/dnstap_tls_peername.post +++ b/testdata/dnstap_tls_peername.tdir/dnstap_tls_peername.post @@ -7,7 +7,6 @@ # do your teardown here . ../common.sh PRE="../.." -if grep "define USE_DNSTAP 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi kill_pid $DNSTAP_SOCKET_PID kill_pid $FWD_PID kill $UNBOUND_PID diff --git a/testdata/dnstap_tls_peername.tdir/dnstap_tls_peername.pre b/testdata/dnstap_tls_peername.tdir/dnstap_tls_peername.pre index 25b838d8b..50f9853d4 100644 --- a/testdata/dnstap_tls_peername.tdir/dnstap_tls_peername.pre +++ b/testdata/dnstap_tls_peername.tdir/dnstap_tls_peername.pre @@ -7,7 +7,7 @@ . ../common.sh PRE="../.." -if grep "define USE_DNSTAP 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi +if grep "define USE_DNSTAP 1" $PRE/config.h; then echo test enabled; else skip_test "test skipped"; fi get_random_port 4 UNBOUND_PORT=$RND_PORT diff --git a/testdata/dnstap_tls_peername.tdir/dnstap_tls_peername.test b/testdata/dnstap_tls_peername.tdir/dnstap_tls_peername.test index 03bcbadfd..b5a6adfc3 100644 --- a/testdata/dnstap_tls_peername.tdir/dnstap_tls_peername.test +++ b/testdata/dnstap_tls_peername.tdir/dnstap_tls_peername.test @@ -6,7 +6,6 @@ . ../common.sh PRE="../.." -if grep "define USE_DNSTAP 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi # test if the server is up. echo "> dig www.example.com." diff --git a/testdata/doh_downstream.tdir/doh_downstream.post b/testdata/doh_downstream.tdir/doh_downstream.post index 0e3c00b05..67972a7f0 100644 --- a/testdata/doh_downstream.tdir/doh_downstream.post +++ b/testdata/doh_downstream.tdir/doh_downstream.post @@ -6,7 +6,6 @@ # # do your teardown here PRE="../.." -if grep "define HAVE_NGHTTP2 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi . ../common.sh kill_pid $FWD_PID kill_pid $UNBOUND_PID diff --git a/testdata/doh_downstream.tdir/doh_downstream.pre b/testdata/doh_downstream.tdir/doh_downstream.pre index 29bb805a1..220725440 100644 --- a/testdata/doh_downstream.tdir/doh_downstream.pre +++ b/testdata/doh_downstream.tdir/doh_downstream.pre @@ -6,7 +6,7 @@ PRE="../.." . ../common.sh -if grep "define HAVE_NGHTTP2 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi +if grep "define HAVE_NGHTTP2 1" $PRE/config.h; then echo test enabled; else skip_test "test skipped"; fi get_random_port 2 UNBOUND_PORT=$RND_PORT diff --git a/testdata/doh_downstream.tdir/doh_downstream.test b/testdata/doh_downstream.tdir/doh_downstream.test index d66168fba..78e2e84eb 100644 --- a/testdata/doh_downstream.tdir/doh_downstream.test +++ b/testdata/doh_downstream.tdir/doh_downstream.test @@ -6,7 +6,6 @@ PRE="../.." . ../common.sh -if grep "define HAVE_NGHTTP2 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi get_make (cd $PRE; $MAKE dohclient) diff --git a/testdata/doh_downstream_buffer_size.tdir/doh_downstream_buffer_size.post b/testdata/doh_downstream_buffer_size.tdir/doh_downstream_buffer_size.post index 881970a77..f15ebe555 100644 --- a/testdata/doh_downstream_buffer_size.tdir/doh_downstream_buffer_size.post +++ b/testdata/doh_downstream_buffer_size.tdir/doh_downstream_buffer_size.post @@ -6,7 +6,6 @@ # # do your teardown here PRE="../.." -if grep "define HAVE_NGHTTP2 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi . ../common.sh kill_pid $UNBOUND_PID cat unbound.log diff --git a/testdata/doh_downstream_buffer_size.tdir/doh_downstream_buffer_size.pre b/testdata/doh_downstream_buffer_size.tdir/doh_downstream_buffer_size.pre index a58780ab3..ff68a4677 100644 --- a/testdata/doh_downstream_buffer_size.tdir/doh_downstream_buffer_size.pre +++ b/testdata/doh_downstream_buffer_size.tdir/doh_downstream_buffer_size.pre @@ -6,7 +6,7 @@ PRE="../.." . ../common.sh -if grep "define HAVE_NGHTTP2 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi +if grep "define HAVE_NGHTTP2 1" $PRE/config.h; then echo test enabled; else skip_test "test skipped"; fi get_random_port 1 UNBOUND_PORT=$RND_PORT 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 78c46081d..bbeb9eb2b 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 @@ -6,7 +6,6 @@ PRE="../.." . ../common.sh -if grep "define HAVE_NGHTTP2 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi get_make (cd $PRE; $MAKE dohclient) diff --git a/testdata/doh_downstream_endpoint.tdir/doh_downstream_endpoint.post b/testdata/doh_downstream_endpoint.tdir/doh_downstream_endpoint.post index dcdf8627e..f15ebe555 100644 --- a/testdata/doh_downstream_endpoint.tdir/doh_downstream_endpoint.post +++ b/testdata/doh_downstream_endpoint.tdir/doh_downstream_endpoint.post @@ -7,6 +7,5 @@ # do your teardown here PRE="../.." . ../common.sh -if grep "define HAVE_NGHTTP2 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi kill_pid $UNBOUND_PID cat unbound.log diff --git a/testdata/doh_downstream_endpoint.tdir/doh_downstream_endpoint.pre b/testdata/doh_downstream_endpoint.tdir/doh_downstream_endpoint.pre index cd0d11fd4..dd7acc290 100644 --- a/testdata/doh_downstream_endpoint.tdir/doh_downstream_endpoint.pre +++ b/testdata/doh_downstream_endpoint.tdir/doh_downstream_endpoint.pre @@ -6,7 +6,7 @@ PRE="../.." . ../common.sh -if grep "define HAVE_NGHTTP2 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi +if grep "define HAVE_NGHTTP2 1" $PRE/config.h; then echo test enabled; else skip_test "test skipped"; fi get_random_port 1 UNBOUND_PORT=$RND_PORT echo "UNBOUND_PORT=$UNBOUND_PORT" >> .tpkg.var.test diff --git a/testdata/doh_downstream_endpoint.tdir/doh_downstream_endpoint.test b/testdata/doh_downstream_endpoint.tdir/doh_downstream_endpoint.test index 2a6954cab..d788e3667 100644 --- a/testdata/doh_downstream_endpoint.tdir/doh_downstream_endpoint.test +++ b/testdata/doh_downstream_endpoint.tdir/doh_downstream_endpoint.test @@ -6,7 +6,6 @@ PRE="../.." . ../common.sh -if grep "define HAVE_NGHTTP2 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi get_make (cd $PRE; $MAKE dohclient) diff --git a/testdata/doh_downstream_notls.tdir/doh_downstream_notls.post b/testdata/doh_downstream_notls.tdir/doh_downstream_notls.post index 3ceaeade8..9fb51b6d3 100644 --- a/testdata/doh_downstream_notls.tdir/doh_downstream_notls.post +++ b/testdata/doh_downstream_notls.tdir/doh_downstream_notls.post @@ -6,7 +6,6 @@ # # do your teardown here PRE="../.." -if grep "define HAVE_NGHTTP2 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi . ../common.sh kill_pid $FWD_PID kill_pid $UNBOUND_PID diff --git a/testdata/doh_downstream_notls.tdir/doh_downstream_notls.pre b/testdata/doh_downstream_notls.tdir/doh_downstream_notls.pre index e1f30a575..9c7233d64 100644 --- a/testdata/doh_downstream_notls.tdir/doh_downstream_notls.pre +++ b/testdata/doh_downstream_notls.tdir/doh_downstream_notls.pre @@ -6,7 +6,7 @@ PRE="../.." . ../common.sh -if grep "define HAVE_NGHTTP2 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi +if grep "define HAVE_NGHTTP2 1" $PRE/config.h; then echo test enabled; else skip_test "test skipped"; fi get_random_port 2 UNBOUND_PORT=$RND_PORT diff --git a/testdata/doh_downstream_notls.tdir/doh_downstream_notls.test b/testdata/doh_downstream_notls.tdir/doh_downstream_notls.test index 87ff560d3..040285e8f 100644 --- a/testdata/doh_downstream_notls.tdir/doh_downstream_notls.test +++ b/testdata/doh_downstream_notls.tdir/doh_downstream_notls.test @@ -6,7 +6,6 @@ PRE="../.." . ../common.sh -if grep "define HAVE_NGHTTP2 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi get_make (cd $PRE; $MAKE dohclient) diff --git a/testdata/doh_downstream_post.tdir/doh_downstream_post.post b/testdata/doh_downstream_post.tdir/doh_downstream_post.post index 98034a32c..2f8f5a8e0 100644 --- a/testdata/doh_downstream_post.tdir/doh_downstream_post.post +++ b/testdata/doh_downstream_post.tdir/doh_downstream_post.post @@ -7,7 +7,6 @@ # do your teardown here PRE="../.." . ../common.sh -if grep "define HAVE_NGHTTP2 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi kill_pid $FWD_PID kill_pid $UNBOUND_PID cat unbound.log diff --git a/testdata/doh_downstream_post.tdir/doh_downstream_post.pre b/testdata/doh_downstream_post.tdir/doh_downstream_post.pre index 34df83d4b..a8ecd344b 100644 --- a/testdata/doh_downstream_post.tdir/doh_downstream_post.pre +++ b/testdata/doh_downstream_post.tdir/doh_downstream_post.pre @@ -6,7 +6,7 @@ PRE="../.." . ../common.sh -if grep "define HAVE_NGHTTP2 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi +if grep "define HAVE_NGHTTP2 1" $PRE/config.h; then echo test enabled; else skip_test "test skipped"; fi get_random_port 2 UNBOUND_PORT=$RND_PORT FWD_PORT=$(($RND_PORT + 1)) diff --git a/testdata/doh_downstream_post.tdir/doh_downstream_post.test b/testdata/doh_downstream_post.tdir/doh_downstream_post.test index 6442d1e12..d6a512ae3 100644 --- a/testdata/doh_downstream_post.tdir/doh_downstream_post.test +++ b/testdata/doh_downstream_post.tdir/doh_downstream_post.test @@ -6,7 +6,6 @@ PRE="../.." . ../common.sh -if grep "define HAVE_NGHTTP2 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi get_make (cd $PRE; $MAKE dohclient) diff --git a/testdata/dynlibmod.tdir/dynlibmod.post b/testdata/dynlibmod.tdir/dynlibmod.post index caa0da4f5..99a4268a7 100644 --- a/testdata/dynlibmod.tdir/dynlibmod.post +++ b/testdata/dynlibmod.tdir/dynlibmod.post @@ -7,7 +7,6 @@ # do your teardown here . ../common.sh PRE="../.." -if grep "define WITH_DYNLIBMODULE 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi kill_pid $FWD_PID kill $UNBOUND_PID kill $UNBOUND_PID >/dev/null 2>&1 diff --git a/testdata/dynlibmod.tdir/dynlibmod.pre b/testdata/dynlibmod.tdir/dynlibmod.pre index 94adaa723..fbf229b8b 100644 --- a/testdata/dynlibmod.tdir/dynlibmod.pre +++ b/testdata/dynlibmod.tdir/dynlibmod.pre @@ -7,7 +7,7 @@ . ../common.sh PRE="../.." -if grep "define WITH_DYNLIBMODULE 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi +if grep "define WITH_DYNLIBMODULE 1" $PRE/config.h; then echo test enabled; else skip_test "test skipped"; fi get_random_port 3 UNBOUND_PORT=$RND_PORT diff --git a/testdata/dynlibmod.tdir/dynlibmod.test b/testdata/dynlibmod.tdir/dynlibmod.test index f99f6fbc4..2954acaff 100644 --- a/testdata/dynlibmod.tdir/dynlibmod.test +++ b/testdata/dynlibmod.tdir/dynlibmod.test @@ -6,7 +6,6 @@ . ../common.sh PRE="../.." -if grep "define WITH_DYNLIBMODULE 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi # compile the dynamic library module if grep "define USE_WINSOCK 1" $PRE/config.h; then diff --git a/testdata/ede.tdir/bogus/clean.sh b/testdata/ede.tdir/bogus/clean.sh deleted file mode 100755 index 54128f807..000000000 --- a/testdata/ede.tdir/bogus/clean.sh +++ /dev/null @@ -1 +0,0 @@ -rm -f K* piece1 base expired notyetincepted trust-anchors dnssec-failures.test.signed dnskey-failures.test.signed nsec-failures.test.signed rrsig-failures.test.signed diff --git a/testdata/ede.tdir/bogus/dnskey-failures.test.signed b/testdata/ede.tdir/bogus/dnskey-failures.test.signed new file mode 100644 index 000000000..69bfde48b --- /dev/null +++ b/testdata/ede.tdir/bogus/dnskey-failures.test.signed @@ -0,0 +1,7 @@ +dnskey-failures.test. 3600 IN SOA ns.dnskey-failures.test. hostmaster.dnskey-failures.test. 1 14400 1800 2419200 300 +dnskey-failures.test. 3600 IN RRSIG SOA 13 2 3600 20010201000000 20001230000000 45928 dnskey-failures.test. NKixvGKa0WHSI8oE5THI1hjm5nExVkryUmW15VoNZ3pwqUYexGWLIlfuYsTaDE5GVEtPpSKbA+PlYDk19EsLNQ== +dnskey-failures.test. 3600 IN A 192.0.2.1 +dnskey-failures.test. 3600 IN RRSIG A 13 2 3600 20010201000000 20001230000000 45928 dnskey-failures.test. FCEvbVL3TkzO7jWeOz7E/A3Q64QkpegVazS4OL+ybxN2o8OzXdCJN3QbCGdFP26/Rbj089ThDCZ0+OormAk1dw== +dnskey-failures.test. 3600 IN RRSIG DNSKEY 13 2 3600 20010201000000 20001230000000 45928 dnskey-failures.test. pEjWVsJbFiQBvwNGV3v0nVirMJDOYKXqC4IX9dFuRTnoWSb95anvB08pgaZ1ie+thk6YC1fX2fUTRKRFr3vHnA== +dnskey-failures.test. 300 IN NSEC dnskey-failures.test. A SOA RRSIG NSEC DNSKEY +dnskey-failures.test. 300 IN RRSIG NSEC 13 2 300 20010201000000 20001230000000 45928 dnskey-failures.test. /vAazBDetA5+np+fE7V6f9W+faEQT3ETGueNNhFPjUsPF1dU9Gglu4PZ15fWOxsk0DPWHNmTMF70ZCGQJ2k+fw== diff --git a/testdata/ede.tdir/bogus/dnssec-failures.test.signed b/testdata/ede.tdir/bogus/dnssec-failures.test.signed new file mode 100644 index 000000000..ed8f5d9d9 --- /dev/null +++ b/testdata/ede.tdir/bogus/dnssec-failures.test.signed @@ -0,0 +1,25 @@ +dnssec-failures.test. 3600 IN SOA ns.dnssec-failures.test. hostmaster.dnssec-failures.test. 1 14400 1800 2419200 300 +dnssec-failures.test. 3600 IN RRSIG SOA 13 2 3600 20010201000000 20001230000000 53876 dnssec-failures.test. K37BIR/jLR4tN1JtTx3MwzgozslvnFtwUquCSfiBykCcKIv6wErSI9Gnw/tjH0tXrLI1eoLa5oWkgtxy0KKybg== +dnssec-failures.test. 3600 IN NS ns.dnssec-failures.test. +dnssec-failures.test. 3600 IN RRSIG NS 13 2 3600 20010201000000 20001230000000 53876 dnssec-failures.test. JP6mYQORwnwwv+2q9UxpeeaVs5/171y3lyc1FKAY3FHmFqjd4Uo0byW8jgk/BrJyVkaDeZbjvuZq+BED0codpw== +dnssec-failures.test. 3600 IN DNSKEY 257 3 13 mx6xe39HZrYCpyC+9YmquHIf1WdWYaDqOfcpXg2Gtv5VJGS/WSO14txlUoKjYCldyRwcg9wT6JAwikpkzWS6UQ== ;{id = 53876 (ksk), size = 256b} +dnssec-failures.test. 3600 IN RRSIG DNSKEY 13 2 3600 20010201000000 20001230000000 53876 dnssec-failures.test. F760TrogHIBkenX7nGr6LEvocTcGAZamfAaiftIkwprBp21/LZ+qotGsFu9YWsxlGqB3KAINXYATjS6AEJfGEQ== +dnssec-failures.test. 300 IN NSEC expired.dnssec-failures.test. NS SOA RRSIG NSEC DNSKEY +dnssec-failures.test. 300 IN RRSIG NSEC 13 2 300 20010201000000 20001230000000 53876 dnssec-failures.test. Zk+RW0mbLSzwvSYuNQJhNdd4XmtQv47CiLtHbqOyS8/xt5Pt87T0v1UxnCkZAlA+VTEWbJkasq06ER1wMuTetA== +expired.dnssec-failures.test. 300 IN RRSIG NSEC 13 3 300 20010201000000 20001230000000 53876 dnssec-failures.test. UAhzOVumQZ2PVspwJS5NyOjZypIaQXfHMiXGEUYaZ161IfQdB3coBx2vF8MHdqbePOl6Z4oa51ltITMlBL+Stw== +missingrrsigs.dnssec-failures.test. 3600 IN TXT "Signatures missing" +missingrrsigs.dnssec-failures.test. 300 IN NSEC notyetincepted.dnssec-failures.test. TXT RRSIG NSEC +missingrrsigs.dnssec-failures.test. 300 IN RRSIG NSEC 13 3 300 20010201000000 20001230000000 53876 dnssec-failures.test. 4phKld6eMt4cxA4w6I1i29uAbdfbwFrkpRGLBWwerUgDbOdDwUm1de6t4QhBys7DtoZb3wIS+DLJYjBNbz7Sig== +notyetincepted.dnssec-failures.test. 300 IN RRSIG NSEC 13 3 300 20010201000000 20001230000000 53876 dnssec-failures.test. ix6Gg9uUZ0A56IQXbDJuBQ3vIm6QipuvzQTKd2wF6kZuEW/53wuy4ROBDIQ4IgnQD17vG8tJNeDOCfj0hh8+dQ== +ns.dnssec-failures.test. 3600 IN A 192.0.2.1 +ns.dnssec-failures.test. 3600 IN RRSIG A 13 3 3600 20010201000000 20001230000000 53876 dnssec-failures.test. PbcykgJEHG218vCkj9pD8W5JVqyCD9VRNOy3SHqCTvWGVAApasdZ7n5wzNVpHdKrqlTpyLwf6z6vv4NMYbEQdw== +ns.dnssec-failures.test. 300 IN NSEC sigsinvalid.dnssec-failures.test. A RRSIG NSEC +ns.dnssec-failures.test. 300 IN RRSIG NSEC 13 3 300 20010201000000 20001230000000 53876 dnssec-failures.test. SEO+C116gcmI0sY4lnIM4DQrUxqyaGIIqlvhxyGrzF9jJopRZB8gflQcYPy5qhIwGZJoEMB+SO4er4LCaS8NwA== +sigsinvalid.dnssec-failures.test. 3600 IN TXT "Signatures INVALID" +sigsinvalid.dnssec-failures.test. 3600 IN RRSIG TXT 13 3 3600 20010201000000 20001230000000 53876 dnssec-failures.test. 3XFjjPt+UyY4ZIj8PAINTtOTh7sk4OIAO5akFDQhqgB/Wv6f7dWdqvl8Y2RIqdh0WQz+nGPRMktS8exA3FKW4Q== +sigsinvalid.dnssec-failures.test. 300 IN NSEC dnssec-failures.test. TXT RRSIG NSEC +sigsinvalid.dnssec-failures.test. 300 IN RRSIG NSEC 13 3 300 20010201000000 20001230000000 53876 dnssec-failures.test. gmft6HYmqZalLwmdnuWBqJod3JD5fRoGqiwYXVFxySm2bHPvz8J9xSe7RdTSONXPUc+7mE8IHYff/gGW7gctqw== +expired.dnssec-failures.test. 3600 IN TXT "Expired" +expired.dnssec-failures.test. 3600 IN RRSIG TXT 13 3 3600 20001230000000 20001201000000 53876 dnssec-failures.test. 8zosYGmmGGcGcBuWaf3oL3TE/hpKDrddtm7ZQGndjmqkZ8CVg6RwFb+8YLqcG5du3Si0rmTuZId+qBOV/pnViA== +notyetincepted.dnssec-failures.test. 3600 IN TXT "Not yet incepted" +notyetincepted.dnssec-failures.test. 3600 IN RRSIG TXT 13 3 3600 20010201000000 20010103000000 53876 dnssec-failures.test. lmk0+oEdnnKa1oujIsMeimuElrKvrUSlBknsfSNqOo07VxJxT2R4qkKc95oiEmeSWHcVTOrXxEhtl4kAAactPg== diff --git a/testdata/ede.tdir/bogus/make-broken-zone.sh b/testdata/ede.tdir/bogus/make-broken-zone.sh index 67b4fcfb2..f93df3978 100755 --- a/testdata/ede.tdir/bogus/make-broken-zone.sh +++ b/testdata/ede.tdir/bogus/make-broken-zone.sh @@ -1,21 +1,28 @@ #!/usr/bin/env bash -# create oudated zones -CSK=`ldns-keygen -a ECDSAP256SHA256 -k -r /dev/urandom dnssec-failures.test` -echo $CSK +# This script was used to generate the broken signed zones used for testing. -echo ". IN DS 20326 8 2 e06d44b80b8f1d39a95c0b0d7c65d08458e880409bbc683457104237c7f8ec8d" | \ - cat $CSK.ds - > bogus/trust-anchors +# Override the current date; it is used in Unbound's configuration also. +NOW=20010101 # differentiate for MacOS with "gdate" DATE=date which gdate > /dev/null 2>&1 && DATE=gdate -ONEMONTHAGO=`$DATE -d 'now - 1 month' +%Y%m%d` -YESTERDAY=`$DATE -d 'now - 2 days' +%Y%m%d` -TOMORROW=`$DATE -d 'now + 2 days' +%Y%m%d` +ONEMONTHAGO=`$DATE -d "$NOW - 1 month" +%Y%m%d` +ONEMONTH=`$DATE -d "$NOW + 1 month" +%Y%m%d` +YESTERDAY=`$DATE -d "$NOW - 2 days" +%Y%m%d` +TOMORROW=`$DATE -d "$NOW + 2 days" +%Y%m%d` -ldns-signzone -i $YESTERDAY -f - bogus/dnssec-failures.test $CSK | \ +# Root trust anchor +echo ". IN DS 20326 8 2 e06d44b80b8f1d39a95c0b0d7c65d08458e880409bbc683457104237c7f8ec8d" > bogus/trust-anchors + +# create oudated zones +CSK=`ldns-keygen -a ECDSAP256SHA256 -k -r /dev/urandom dnssec-failures.test` +echo $CSK +cat $CSK.ds >> bogus/trust-anchors + +ldns-signzone -i $YESTERDAY -e $ONEMONTH -f - bogus/dnssec-failures.test $CSK | \ grep -v '^missingrrsigs\.dnssec-failures\.test\..*IN.*RRSIG.*TXT' | \ sed 's/Signatures invalid/Signatures INVALID/g' | \ grep -v '^notyetincepted\.dnssec-failures\.test\..*IN.*TXT' | \ @@ -25,7 +32,7 @@ ldns-signzone -i $YESTERDAY -f - bogus/dnssec-failures.test $CSK | \ ldns-signzone -i $ONEMONTHAGO -e $YESTERDAY -f - bogus/dnssec-failures.test $CSK | \ grep -v '[ ]NSEC[ ]' | \ grep '^expired\.dnssec-failures\.test\..*IN.*TXT' > expired -ldns-signzone -i $TOMORROW -f - bogus/dnssec-failures.test $CSK | \ +ldns-signzone -i $TOMORROW -e $ONEMONTH -f - bogus/dnssec-failures.test $CSK | \ grep -v '[ ]NSEC[ ]' | \ grep '^notyetincepted\.dnssec-failures\.test\..*IN.*TXT' > notyetincepted @@ -33,34 +40,35 @@ cat base expired notyetincepted > bogus/dnssec-failures.test.signed # cleanup old zone keys rm -f $CSK.* + # create zone with DNSKEY missing CSK=`ldns-keygen -a ECDSAP256SHA256 -k -r /dev/urandom dnskey-failures.test` echo $CSK cat $CSK.ds >> bogus/trust-anchors -ldns-signzone -f tmp.signed bogus/dnskey-failures.test $CSK +ldns-signzone -i $YESTERDAY -e $ONEMONTH -f tmp.signed bogus/dnskey-failures.test $CSK grep -v ' DNSKEY ' tmp.signed > bogus/dnskey-failures.test.signed - # cleanup old zone keys rm -f $CSK.* + # create zone with NSEC missing CSK=`ldns-keygen -a ECDSAP256SHA256 -k -r /dev/urandom nsec-failures.test` echo $CSK cat $CSK.ds >> bogus/trust-anchors -ldns-signzone -f tmp.signed bogus/nsec-failures.test $CSK +ldns-signzone -i $YESTERDAY -e $ONEMONTH -f tmp.signed bogus/nsec-failures.test $CSK grep -v ' NSEC ' tmp.signed > bogus/nsec-failures.test.signed - # cleanup old zone keys rm -f $CSK.* + # create zone with RRSIGs missing CSK=`ldns-keygen -a ECDSAP256SHA256 -k -r /dev/urandom rrsig-failures.test` echo $CSK cat $CSK.ds >> bogus/trust-anchors -ldns-signzone -f tmp.signed bogus/rrsig-failures.test $CSK +ldns-signzone -i $YESTERDAY -e $ONEMONTH -f tmp.signed bogus/rrsig-failures.test $CSK grep -v ' RRSIG ' tmp.signed > bogus/rrsig-failures.test.signed # cleanup diff --git a/testdata/ede.tdir/bogus/nsec-failures.test.signed b/testdata/ede.tdir/bogus/nsec-failures.test.signed new file mode 100644 index 000000000..b63138613 --- /dev/null +++ b/testdata/ede.tdir/bogus/nsec-failures.test.signed @@ -0,0 +1,7 @@ +nsec-failures.test. 3600 IN SOA ns.nsec-failures.test. hostmaster.nsec-failures.test. 1 14400 1800 2419200 300 +nsec-failures.test. 3600 IN RRSIG SOA 13 2 3600 20010201000000 20001230000000 12342 nsec-failures.test. ZdnRF2uI0IDJsHTXsd4TclX9gUEkxjp19LykHuI3DaCKe3bY8uTETta8i73hlKWJWeRjmgQojIsi9tBlivOwjQ== +nsec-failures.test. 3600 IN A 192.0.2.1 +nsec-failures.test. 3600 IN RRSIG A 13 2 3600 20010201000000 20001230000000 12342 nsec-failures.test. /JccCtWkuQgSF81gv6DPsxaicmlJoGAhVpCpR4JGgVz3tZMhIp+iXUGeI+CkBofw9G/MK66Hk937JRmMh9UTvQ== +nsec-failures.test. 3600 IN DNSKEY 257 3 13 41tJnzHY0o3WKid0ZsIo6S5SJdC1JiW0H/KizsAD2phHdi1AIDiBclL+nG2lKvPjMoX2hcMfd8h9DfU99HR3kg== ;{id = 12342 (ksk), size = 256b} +nsec-failures.test. 3600 IN RRSIG DNSKEY 13 2 3600 20010201000000 20001230000000 12342 nsec-failures.test. Y23xTzxdqQBjFsWLlqCRgPKT7raPcP0lAy2tR8trW5+vUAhBePXdVixp4AjoxEqXsLLalAtnJnc4QgH7+HO6PA== +nsec-failures.test. 300 IN RRSIG NSEC 13 2 300 20010201000000 20001230000000 12342 nsec-failures.test. KfpncqGIzIPNB2ExkH22/z0jAPmq8jTTjDkLte29iKqR9t3bSZlcS0MQ2QB7Z6tgks8fo7Zpc9+BvaDq7Y6ONg== diff --git a/testdata/ede.tdir/bogus/rrsig-failures.test.signed b/testdata/ede.tdir/bogus/rrsig-failures.test.signed new file mode 100644 index 000000000..222bdc0c6 --- /dev/null +++ b/testdata/ede.tdir/bogus/rrsig-failures.test.signed @@ -0,0 +1,4 @@ +rrsig-failures.test. 3600 IN SOA ns.rrsig-failures.test. hostmaster.rrsig-failures.test. 1 14400 1800 2419200 300 +rrsig-failures.test. 3600 IN A 192.0.2.1 +rrsig-failures.test. 3600 IN DNSKEY 257 3 13 rIMJ4/qnOb91GuxKzAYiCdPNdEtUhyt+mi1Jz+NPP0rJQdGOhXr37LpctEiKK4isabCXcwYlVtFdDPopa4RufA== ;{id = 13838 (ksk), size = 256b} +rrsig-failures.test. 300 IN NSEC rrsig-failures.test. A SOA RRSIG NSEC DNSKEY diff --git a/testdata/ede.tdir/bogus/trust-anchors b/testdata/ede.tdir/bogus/trust-anchors new file mode 100644 index 000000000..bd20c8702 --- /dev/null +++ b/testdata/ede.tdir/bogus/trust-anchors @@ -0,0 +1,5 @@ +. IN DS 20326 8 2 e06d44b80b8f1d39a95c0b0d7c65d08458e880409bbc683457104237c7f8ec8d +dnssec-failures.test. IN DS 53876 13 2 e0207223d847e0d8f3bd2afcf887f727178777a94563b94e1d0be8ca2f070d9a +dnskey-failures.test. IN DS 45928 13 2 9295d5c0d9296599809ce968f994a974d4da7752266ee124ead4ce980c006c20 +nsec-failures.test. IN DS 12342 13 2 b0a994fe4ff12a706b2a47a794601b254a8d28e040832ad6e39e96dbf7736ca2 +rrsig-failures.test. IN DS 13838 13 2 b083d59d2e7ac370e1103bc5ada2a921e4e65745ea8550350b6fcb57eba9f917 diff --git a/testdata/ede.tdir/ede.conf b/testdata/ede.tdir/ede.conf index 13730d42f..639899d13 100644 --- a/testdata/ede.tdir/ede.conf +++ b/testdata/ede.tdir/ede.conf @@ -11,6 +11,7 @@ server: val-log-level: 2 trust-anchor-file: "bogus/trust-anchors" + val-override-date: "20010101020202" module-config: "respip validator iterator" diff --git a/testdata/ede.tdir/ede.pre b/testdata/ede.tdir/ede.pre index e5a0667b0..57e15cc5a 100644 --- a/testdata/ede.tdir/ede.pre +++ b/testdata/ede.tdir/ede.pre @@ -4,7 +4,9 @@ # use .tpkg.var.test for in test variable passing [ -f .tpkg.var.test ] && source .tpkg.var.test +PRE="../.." . ../common.sh + get_random_port 2 UNBOUND_PORT=$RND_PORT UNBOUND_PORT2=$(($RND_PORT + 1)) @@ -16,11 +18,7 @@ sed -e 's/@PORT\@/'$UNBOUND_PORT'/' < ede.conf > temp.conf sed -e 's/@PORT2\@/'$UNBOUND_PORT2'/' < temp.conf > ub.conf sed -e 's/@PORT2\@/'$UNBOUND_PORT2'/' < ede-auth.conf > ub2.conf -# create broken dnssec zone -bogus/make-broken-zone.sh - # start unbound in the background -PRE="../.." $PRE/unbound -d -c ub.conf > unbound.log 2>&1 & UNBOUND_PID=$! echo "UNBOUND_PID=$UNBOUND_PID" >> .tpkg.var.test @@ -30,8 +28,6 @@ $PRE/unbound -d -c ub2.conf > unbound2.log 2>&1 & UNBOUND_PID2=$! echo "UNBOUND_PID2=$UNBOUND_PID2" >> .tpkg.var.test - cat .tpkg.var.test wait_unbound_up unbound.log wait_unbound_up unbound2.log - diff --git a/testdata/edns_upstream_cookies.tdir/edns_upstream_cookies.dsc b/testdata/edns_upstream_cookies.tdir/edns_upstream_cookies.dsc new file mode 100644 index 000000000..5fa0c7731 --- /dev/null +++ b/testdata/edns_upstream_cookies.tdir/edns_upstream_cookies.dsc @@ -0,0 +1,16 @@ +BaseName: edns_upstream_cookies +Version: 1.0 +Description: Test Upstream cookies with changing interfaces +CreationDate: Fri Aug 20 15:42:11 UTC 2021 +Maintainer: Tom Carpay +Category: +Component: +CmdDepends: +Depends: +Help: +Pre: edns_upstream_cookies.pre +Post: edns_upstream_cookies.post +Test: edns_upstream_cookies.test +AuxFiles: +Passed: +Failure: diff --git a/testdata/edns_upstream_cookies.tdir/edns_upstream_cookies.post b/testdata/edns_upstream_cookies.tdir/edns_upstream_cookies.post index e69de29bb..1aad51fa6 100644 --- a/testdata/edns_upstream_cookies.tdir/edns_upstream_cookies.post +++ b/testdata/edns_upstream_cookies.tdir/edns_upstream_cookies.post @@ -0,0 +1,13 @@ +# #-- edns_upstream_cookies.post --# +# 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 + +# teardown +. ../common.sh +kill_pid $UNBOUND_PID +kill_pid $UNBOUND_PID2 + +# remove virtual interface +ip link del veth0 type veth peer name veth1 \ No newline at end of file diff --git a/testdata/edns_upstream_cookies.tdir/edns_upstream_cookies.pre b/testdata/edns_upstream_cookies.tdir/edns_upstream_cookies.pre index 13062fd12..7e6de46a3 100644 --- a/testdata/edns_upstream_cookies.tdir/edns_upstream_cookies.pre +++ b/testdata/edns_upstream_cookies.tdir/edns_upstream_cookies.pre @@ -7,14 +7,33 @@ . ../common.sh get_random_port 2 UNBOUND_PORT=$RND_PORT -NSD_PORT=$(($RND_PORT + 1)) +UNBOUND2_PORT=$(($RND_PORT + 1)) echo "UNBOUND_PORT=$UNBOUND_PORT" >> .tpkg.var.test echo "NSD_PORT=$NSD_PORT" >> .tpkg.var.test +UPSTREAM_IP=10.0.0.1 +UB_IP1=192.128.123.121 +UB_IP2=192.128.123.122 + +echo "UPSTREAM_IP=$UPSTREAM_IP" >> .tpkg.var.test +echo "UB_IP1=$UB_IP1" >> .tpkg.var.test +echo "UB_IP2=$UB_IP2" >> .tpkg.var.test + + # rewrite config file with created ports -sed -e 's/@PORT\@/'$UNBOUND_PORT'/' < edns_upstream_cookies.conf > temp.conf -# sed -e 's/@PORT2\@/'$NSD_PORT'/' < temp.conf > ub.conf -sed -e 's/@PORT2\@/'$NSD_PORT'/' < nsd.conf > nsd1.conf +sed -e 's/@PORT\@/'$UNBOUND_PORT'/' < unbound.conf > ub.conf +sed -e 's/@PORT2\@/'$UNBOUND2_PORT'/' < unbound_auth.conf > temp2.conf +sed -e 's/@IP2\@/'$UPSTREAM_IP'/' < temp2.conf > ub2.conf + + +# create virtual interfaces +ip link add veth0 type veth peer name veth1 +ip link add veth0 type veth peer name veth1 +ip link set dev veth0 up +ip link set dev veth1 up + +ip addr add $UPSTREAM_IP dev veth0 +ip addr add $UB_IP1 dev veth1 # start unbound in the background PRE="../.." @@ -23,12 +42,11 @@ UNBOUND_PID=$! echo "UNBOUND_PID=$UNBOUND_PID" >> .tpkg.var.test # start nsd in the background (for downstream cookies) -# TODO replace this with unbound when downstream cookies are available -nsd -d -c nsd1.conf > nsd1.log 2>&1 & -NSD_PID=$! -echo "NSD_PID=$NSD_PID" >> .tpkg.var.test +$PRE/unbound -d -c ub2.conf > unbound2.log 2>&1 & +UNBOUND_PID2=$! +echo "UNBOUND_PID2=$UNBOUND_PID2" >> .tpkg.var.test cat .tpkg.var.test wait_unbound_up unbound.log -wait_unbound_up nsd1.log +wait_unbound_up unbound2.log diff --git a/testdata/edns_upstream_cookies.tdir/edns_upstream_cookies.test b/testdata/edns_upstream_cookies.tdir/edns_upstream_cookies.test index 0d2362170..49e6cd463 100644 --- a/testdata/edns_upstream_cookies.tdir/edns_upstream_cookies.test +++ b/testdata/edns_upstream_cookies.tdir/edns_upstream_cookies.test @@ -1,3 +1,8 @@ +# #-- edns_upstream_cookies.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 # The problem of this test lies in that we want to look at the connection between # the resolver and the upstream. I cannot think of a way for this to be done @@ -19,22 +24,12 @@ #NSD_IP=192.128.123.120 -NSD_IP=10.0.0.1 -# UB_IP1=192.128.123.121 -# UB_IP2=192.128.123.122 + # UB_IP3=192.128.123.123 # UB_IP4=192.128.123.124 - -# create virtual interfaces -ip link add veth0 type veth peer name veth1 -ip link set dev veth0 up -ip link set dev veth1 up - -ip addr add $NSD_IP dev veth0 -ip addr add $UB_IP1 dev veth1 -ip addr add $UB_IP2 dev veth1 -ip addr add $UB_IP3 dev veth1 -ip addr add $UB_IP4 dev veth1 +# ip addr add $UB_IP2 dev veth1 +# ip addr add $UB_IP3 dev veth1 +# ip addr add $UB_IP4 dev veth1 # start cookie connection by sending first message dig @$UNBOUND -p 9999 example.nl @@ -52,6 +47,11 @@ IFACE=sed -n -e "s/^.*\!\!\!\!\! iterator:udp socket: *//" -e "s/ port.*//p" unb # flush unbound log echo > unbound.log + +# bring up second interface so we verify it keep using the first interface +ip addr add $UB_IP2 dev veth1 + + # send second query with the previous complete cookie attached dig @$UNBOUND -p 9999 example.nl @@ -72,7 +72,29 @@ fi # check on which interface, MUST be the same as last time if [ "$(sed -n -e "s/^.*\!\!\!\!\! iterator:udp socket: *//" -e "s/ port.*//p" unbound.log) != $IFACE" ] -# remove interface that the cookie used last time + +# remove the first interface so the kernel will have to use the second interface +ip addr del $UB_IP1 dev veth1 + +# flush unbound log +echo > unbound.log + + +dig @$UNBOUND -p 9999 example.nl + +# check logs that we get the same complete cookie back +sed -n "s/^.*complete cookie: \[24:0\] *//p" unbound.log > second_query.txt +if ! grep -e "complete cookie: [24:0] " grep_test.txt +then + echo "No complete cookie in the response to the second upstream query" + exit 1 +fi + +# !!!!!! interface unavailable, renewing cookie + + + + # send query (on different interface) with different (!) client cookie diff --git a/testdata/edns_upstream_cookies.tdir/unbound.conf b/testdata/edns_upstream_cookies.tdir/unbound.conf new file mode 100644 index 000000000..c825af648 --- /dev/null +++ b/testdata/edns_upstream_cookies.tdir/unbound.conf @@ -0,0 +1,17 @@ +server: + verbosity: 2 + use-syslog: no + chroot: "" + username: "" + directory: "" + pidfile: "unbound.pid" + interface: 127.0.0.1 + port: @PORT1@ + + val-log-level: 2 + upstream-cookies: yes + +forward-zone: + name: "example.nl" + forward-addr: 127.0.0.1@9998 + forward-no-cache: yes diff --git a/testdata/edns_upstream_cookies.tdir/nsd.conf b/testdata/edns_upstream_cookies.tdir/unbound_auth.conf similarity index 50% rename from testdata/edns_upstream_cookies.tdir/nsd.conf rename to testdata/edns_upstream_cookies.tdir/unbound_auth.conf index 89da30f84..898a4fd94 100644 --- a/testdata/edns_upstream_cookies.tdir/nsd.conf +++ b/testdata/edns_upstream_cookies.tdir/unbound_auth.conf @@ -1,17 +1,16 @@ server: + verbosity: 1 + use-syslog: no + chroot: "" username: "" - database: "" - zonesdir: "" - xfrdfile: "" - #ip-address: 127.0.0.1 - ip-address: 127.0.0.3 - port: 9998 - - nsid: ABC1 + directory: "" + pidfile: "unbound2.pid" + interface: @UPSTREAM_IP@ + port: @PORT2@ answer-cookie: yes cookie-secret: "e5e973e5a6b2a43f48e7dc849e37bfcf" -zone: +auth-zone: name: example.nl zonefile: example.nl.zone diff --git a/testdata/fetch_glue.rpl b/testdata/fetch_glue.rpl index 3e9f64f8d..8860d85b0 100644 --- a/testdata/fetch_glue.rpl +++ b/testdata/fetch_glue.rpl @@ -176,36 +176,7 @@ SECTION ADDITIONAL ns.example.com. IN A 1.2.3.4 ENTRY_END -; due to ordering of answer packets, this is still outstanding, remove it -STEP 21 CHECK_OUT_QUERY -ENTRY_BEGIN -ADJUST copy_id -MATCH qname qtype -REPLY QR -SECTION QUESTION -ns.example.com IN AAAA -ENTRY_END - -; some more recursion needed. -; to finish the NS query -STEP 40 QUERY -ENTRY_BEGIN -REPLY RD -SECTION QUESTION -. IN NS -ENTRY_END - -STEP 41 CHECK_ANSWER -ENTRY_BEGIN -MATCH all -REPLY QR RD RA NOERROR -SECTION QUESTION -. IN NS -SECTION ANSWER -. IN NS K.ROOT-SERVERS.NET. -SECTION AUTHORITY -SECTION ADDITIONAL -K.ROOT-SERVERS.NET. IN A 193.0.14.129 -ENTRY_END +; let (possible) outstanding queries finish resolving +STEP 21 TRAFFIC SCENARIO_END diff --git a/testdata/fetch_glue_cname.rpl b/testdata/fetch_glue_cname.rpl index 4a86afa50..64f00fb20 100644 --- a/testdata/fetch_glue_cname.rpl +++ b/testdata/fetch_glue_cname.rpl @@ -155,7 +155,7 @@ ENTRY_END ENTRY_BEGIN MATCH opcode qtype qname ADJUST copy_id -REPLY QR NOERROR +REPLY QR AA NOERROR SECTION QUESTION ns.example.com. IN AAAA SECTION AUTHORITY @@ -188,36 +188,7 @@ SECTION ADDITIONAL ns.example.com. IN A 1.2.3.4 ENTRY_END -; due to ordering of answer packets, this is still outstanding, remove it -STEP 21 CHECK_OUT_QUERY -ENTRY_BEGIN -ADJUST copy_id -MATCH qname qtype -REPLY QR -SECTION QUESTION -ns.example.com IN AAAA -ENTRY_END - -; some more recursion needed. -; to finish the NS query -STEP 40 QUERY -ENTRY_BEGIN -REPLY RD -SECTION QUESTION -. IN NS -ENTRY_END - -STEP 41 CHECK_ANSWER -ENTRY_BEGIN -MATCH all -REPLY QR RD RA NOERROR -SECTION QUESTION -. IN NS -SECTION ANSWER -. IN NS K.ROOT-SERVERS.NET. -SECTION AUTHORITY -SECTION ADDITIONAL -K.ROOT-SERVERS.NET. IN A 193.0.14.129 -ENTRY_END +; let (possible) outstanding queries finish resolving +STEP 21 TRAFFIC SCENARIO_END diff --git a/testdata/fwd_ancil.tdir/fwd_ancil.post b/testdata/fwd_ancil.tdir/fwd_ancil.post index 6578151af..c11bd44cd 100644 --- a/testdata/fwd_ancil.tdir/fwd_ancil.post +++ b/testdata/fwd_ancil.tdir/fwd_ancil.post @@ -6,11 +6,6 @@ # # do your teardown here . ../common.sh -if test `hostname`"" = "dicht.nlnetlabs.nl"; then - echo "In jail, no ::1, skip test" - exit 0 -fi - kill_pid $FWD_PID if fgrep "service stopped" unbound.log; then exit 0 diff --git a/testdata/fwd_ancil.tdir/fwd_ancil.pre b/testdata/fwd_ancil.tdir/fwd_ancil.pre index e1ce37a7f..6c0fb7a0b 100644 --- a/testdata/fwd_ancil.tdir/fwd_ancil.pre +++ b/testdata/fwd_ancil.tdir/fwd_ancil.pre @@ -6,8 +6,7 @@ . ../common.sh if test `hostname`"" = "dicht.nlnetlabs.nl"; then - echo "In jail, no ::1, skip test" - exit 0 + skip_test "In jail, no ::1, skip test" fi get_random_port 2 @@ -38,7 +37,6 @@ wait_ldns_testns_up fwd.log # string 'Start of service' in log. wait_server_up_or_fail unbound.log "start of service" "disable interface-automatic" if fgrep "disable interface-automatic" unbound.log; then - echo "skip test" - exit 1 + skip_test "skip test" fi diff --git a/testdata/fwd_ancil.tdir/fwd_ancil.test b/testdata/fwd_ancil.tdir/fwd_ancil.test index b90360fb8..8da4754ce 100644 --- a/testdata/fwd_ancil.tdir/fwd_ancil.test +++ b/testdata/fwd_ancil.tdir/fwd_ancil.test @@ -7,11 +7,6 @@ PRE="../.." . ../common.sh -if test `hostname`"" = "dicht.nlnetlabs.nl"; then - echo "In jail, no ::1, skip test" - exit 0 -fi - if fgrep "disable interface-automatic" unbound.log; then echo "skip test" exit 0 diff --git a/testdata/ipset.tdir/ipset.post b/testdata/ipset.tdir/ipset.post index 7af512a4d..4c4c17b13 100644 --- a/testdata/ipset.tdir/ipset.post +++ b/testdata/ipset.tdir/ipset.post @@ -7,7 +7,6 @@ # do your teardown here . ../common.sh PRE="../.." -if grep "define USE_IPSET 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi kill_pid $FWD_PID kill_pid $UNBOUND_PID cat unbound.log diff --git a/testdata/ipset.tdir/ipset.pre b/testdata/ipset.tdir/ipset.pre index ee1aedc70..42c94fac4 100644 --- a/testdata/ipset.tdir/ipset.pre +++ b/testdata/ipset.tdir/ipset.pre @@ -7,7 +7,7 @@ . ../common.sh PRE="../.." -if grep "define USE_IPSET 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi +if grep "define USE_IPSET 1" $PRE/config.h; then echo test enabled; else skip_test "test skipped"; fi get_random_port 2 UNBOUND_PORT=$RND_PORT diff --git a/testdata/ipset.tdir/ipset.test b/testdata/ipset.tdir/ipset.test index 9150e5e3f..4dab457ba 100644 --- a/testdata/ipset.tdir/ipset.test +++ b/testdata/ipset.tdir/ipset.test @@ -6,7 +6,6 @@ . ../common.sh PRE="../.." -if grep "define USE_IPSET 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi # Make all the queries. They need to succeed by the way. echo "> dig www.example.net." diff --git a/testdata/iter_auth_tc.rpl b/testdata/iter_auth_tc.rpl new file mode 100644 index 000000000..417807724 --- /dev/null +++ b/testdata/iter_auth_tc.rpl @@ -0,0 +1,138 @@ +; config options +server: + target-fetch-policy: "0 0 0 0 0" + qname-minimisation: "no" + minimal-responses: no + +stub-zone: + name: "." + stub-addr: 193.0.14.129 # K.ROOT-SERVERS.NET. +CONFIG_END + +SCENARIO_BEGIN Test authoritative response with erroneous TC flag + +; 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 qtype qname +ADJUST copy_id +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 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 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 +ns.example.com. IN A +SECTION ANSWER +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 +ns.example.com. IN AAAA +SECTION ANSWER +SECTION AUTHORITY +example.com. IN NS ns.example.com. +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +; erroneous TC flag here +REPLY QR TC 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 +REPLY QR RD RA SERVFAIL +SECTION QUESTION +www.example.com. IN A +ENTRY_END + +SCENARIO_END diff --git a/testdata/iter_emptydp_for_glue.rpl b/testdata/iter_emptydp_for_glue.rpl index 2e7db65e1..68fad6f15 100644 --- a/testdata/iter_emptydp_for_glue.rpl +++ b/testdata/iter_emptydp_for_glue.rpl @@ -164,11 +164,11 @@ a.gtld-servers.net. IN A 192.5.6.30 ENTRY_END ENTRY_BEGIN -MATCH opcode qname +MATCH opcode subdomain ADJUST copy_id copy_query REPLY QR NOERROR SECTION QUESTION -ns.example.org. IN A +example.org. IN A SECTION AUTHORITY example.org. NS ns.example.net. example.org. NS ns.example.org. diff --git a/testdata/iter_recurse.rpl b/testdata/iter_recurse.rpl index 181af1107..be50b4af8 100644 --- a/testdata/iter_recurse.rpl +++ b/testdata/iter_recurse.rpl @@ -216,14 +216,7 @@ example.com. IN NS ns.example.net. ;ns.example.net IN A 1.2.3.44 ENTRY_END -; due to ordering of answer packets, this is still outstanding, remove it -STEP 21 CHECK_OUT_QUERY -ENTRY_BEGIN -ADJUST copy_id -MATCH qname qtype -REPLY QR -SECTION QUESTION -ns.example.net IN AAAA -ENTRY_END +; let (possible) outstanding queries finish resolving +STEP 21 TRAFFIC SCENARIO_END diff --git a/testdata/nss_compile.tdir/nss_compile.dsc b/testdata/nss_compile.tdir/nss_compile.dsc index 6c59d245f..a719a260d 100644 --- a/testdata/nss_compile.tdir/nss_compile.dsc +++ b/testdata/nss_compile.tdir/nss_compile.dsc @@ -8,7 +8,7 @@ Component: CmdDepends: Depends: Help: -Pre: +Pre: nss_compile.pre Post: Test: nss_compile.test AuxFiles: diff --git a/testdata/nss_compile.tdir/nss_compile.pre b/testdata/nss_compile.tdir/nss_compile.pre new file mode 100644 index 000000000..313f60383 --- /dev/null +++ b/testdata/nss_compile.tdir/nss_compile.pre @@ -0,0 +1,13 @@ +# #-- nss_compile.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 +if test "`hostname`" = "open.nlnetlabs.nl"; then + echo "on open, continue test" +else + skip_test "not on open, no test, do this explicitly" +fi +exit 0 diff --git a/testdata/nss_compile.tdir/nss_compile.test b/testdata/nss_compile.tdir/nss_compile.test index 82b194668..73afd6401 100644 --- a/testdata/nss_compile.tdir/nss_compile.test +++ b/testdata/nss_compile.tdir/nss_compile.test @@ -4,13 +4,6 @@ # use .tpkg.var.test for in test variable passing [ -f .tpkg.var.test ] && source .tpkg.var.test -if test "`hostname`" = "open.nlnetlabs.nl"; then - echo "on open, continue test" -else - echo "not on open, no test, do this explicitly" - exit 0 -fi - . ../common.sh get_make PRE="../.." diff --git a/testdata/padding.tdir/padding.post b/testdata/padding.tdir/padding.post index 826798a8f..9121ccf25 100644 --- a/testdata/padding.tdir/padding.post +++ b/testdata/padding.tdir/padding.post @@ -7,7 +7,6 @@ # do your teardown here . ../common.sh PRE="../.." -if grep "define USE_DNSTAP 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi kill_pid $DNSTAP_SOCKET_PID kill_pid $FWD_PID kill_pid `cat unbound2.pid` diff --git a/testdata/padding.tdir/padding.pre b/testdata/padding.tdir/padding.pre index 4a13d0229..fdb6386be 100644 --- a/testdata/padding.tdir/padding.pre +++ b/testdata/padding.tdir/padding.pre @@ -6,7 +6,7 @@ PRE="../.." . ../common.sh -if grep "define USE_DNSTAP 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi +if grep "define USE_DNSTAP 1" $PRE/config.h; then echo test enabled; else skip_test "test skipped"; fi get_random_port 5 UNBOUND_PORT=$RND_PORT diff --git a/testdata/padding.tdir/padding.test b/testdata/padding.tdir/padding.test index 5111d8139..6161a49ae 100644 --- a/testdata/padding.tdir/padding.test +++ b/testdata/padding.tdir/padding.test @@ -8,7 +8,6 @@ echo There we go... PRE="../.." . ../common.sh -if grep "define USE_DNSTAP 1" $PRE/config.h; then echo test enabled; else echo test skipped; exit 0; fi echo "> query www.example.com. A" dig @127.0.0.1 -p $UNBOUND_PORT www.example.com. | tee outfile diff --git a/testdata/proxy_protocol.tdir/proxy_protocol.conf b/testdata/proxy_protocol.tdir/proxy_protocol.conf new file mode 100644 index 000000000..c5fa0ab33 --- /dev/null +++ b/testdata/proxy_protocol.tdir/proxy_protocol.conf @@ -0,0 +1,34 @@ +server: + verbosity: 5 + num-threads: 1 + interface: 127.0.0.1@@PORT@ + interface: 127.0.0.1@@PROXYPORT@ + interface: 127.0.0.1@@PROXYTLSPORT@ + interface: @INTERFACE_ALLOW_ADDR@@@PORT@ + interface: @INTERFACE_ALLOW_ADDR@@@PROXYPORT@ + interface: @INTERFACE_ALLOW_ADDR@@@PROXYTLSPORT@ + interface: @INTERFACE_REFUSE_ADDR@@@PORT@ + interface: @INTERFACE_REFUSE_ADDR@@@PROXYPORT@ + interface: @INTERFACE_REFUSE_ADDR@@@PROXYTLSPORT@ + proxy-protocol-port: @PROXYPORT@ + proxy-protocol-port: @PROXYTLSPORT@ + tls-port: @PROXYTLSPORT@ + 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" + + # 127.0.0.0/8 is allowed by default. + access-control: @CLIENT_ADDR_ALLOW@/32 allow + access-control: @CLIENT_ADDR_REFUSE@/32 refuse + access-control: @CLIENT_ADDR_ALLOW6@/128 allow + access-control: @CLIENT_ADDR_REFUSE6@/128 refuse + access-control: @INTERFACE_ALLOW_ADDR@/32 allow + +forward-zone: + name: "." + forward-addr: "127.0.0.1@@TOPORT@" diff --git a/testdata/proxy_protocol.tdir/proxy_protocol.dsc b/testdata/proxy_protocol.tdir/proxy_protocol.dsc new file mode 100644 index 000000000..34155f035 --- /dev/null +++ b/testdata/proxy_protocol.tdir/proxy_protocol.dsc @@ -0,0 +1,16 @@ +BaseName: proxy_protocol +Version: 1.0 +Description: Test proxy protocol +CreationDate: Mon Mar 14 16:17:00 CET 2022 +Maintainer: Yorgos Thessalonikefs +Category: +Component: +CmdDepends: +Depends: +Help: +Pre: proxy_protocol.pre +Post: proxy_protocol.post +Test: proxy_protocol.test +AuxFiles: +Passed: +Failure: diff --git a/testdata/proxy_protocol.tdir/proxy_protocol.post b/testdata/proxy_protocol.tdir/proxy_protocol.post new file mode 100644 index 000000000..cbf56bbd9 --- /dev/null +++ b/testdata/proxy_protocol.tdir/proxy_protocol.post @@ -0,0 +1,12 @@ +# #-- proxy_protocol.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 $FWD_PID +kill_pid $UNBOUND_PID +cat unbound.log +exit 0 diff --git a/testdata/proxy_protocol.tdir/proxy_protocol.pre b/testdata/proxy_protocol.tdir/proxy_protocol.pre new file mode 100644 index 000000000..01cf357f5 --- /dev/null +++ b/testdata/proxy_protocol.tdir/proxy_protocol.pre @@ -0,0 +1,66 @@ +# #-- proxy_protocol.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 + +# This test uses the unshare utility +if test ! -x "`which unshare 2>&1`"; then + skip_test "no unshare (from util-linux package) available, skip test" +fi + +get_make +(cd $PRE; $MAKE streamtcp) + +get_random_port 4 +UNBOUND_PORT=$RND_PORT +FWD_PORT=$(($RND_PORT + 1)) +PROXY_PORT=$(($RND_PORT + 2)) +PROXY_TLS_PORT=$(($RND_PORT + 3)) + +INTERFACE_ALLOW=eth123 +INTERFACE_ALLOW_ADDR=10.1.2.3 +INTERFACE_REFUSE=eth234 +INTERFACE_REFUSE_ADDR=10.2.3.4 + +CLIENT_ADDR_ALLOW=1.2.3.4 +CLIENT_ADDR_ALLOW6=2001:db8::cafe:cafe +CLIENT_ADDR_REFUSE=5.6.7.8 +CLIENT_ADDR_REFUSE6=2001:db8::dead:beef + +# make config file +sed \ + -e 's/@PORT\@/'$UNBOUND_PORT'/' \ + -e 's/@TOPORT\@/'$FWD_PORT'/' \ + -e 's/@PROXYPORT\@/'$PROXY_PORT'/' \ + -e 's/@PROXYTLSPORT\@/'$PROXY_TLS_PORT'/' \ + -e 's/@INTERFACE_ALLOW_ADDR\@/'$INTERFACE_ALLOW_ADDR'/' \ + -e 's/@INTERFACE_REFUSE_ADDR\@/'$INTERFACE_REFUSE_ADDR'/' \ + -e 's/@CLIENT_ADDR_ALLOW\@/'$CLIENT_ADDR_ALLOW'/' \ + -e 's/@CLIENT_ADDR_ALLOW6\@/'$CLIENT_ADDR_ALLOW6'/' \ + -e 's/@CLIENT_ADDR_REFUSE\@/'$CLIENT_ADDR_REFUSE'/' \ + -e 's/@CLIENT_ADDR_REFUSE6\@/'$CLIENT_ADDR_REFUSE6'/' \ + < proxy_protocol.conf > ub.conf + +if test -x "`which bash`"; then + shell="bash" +else + shell="sh" +fi + +echo "UNBOUND_PORT=$UNBOUND_PORT" >> .tpkg.var.test +echo "FWD_PORT=$FWD_PORT" >> .tpkg.var.test +echo "PROXY_PORT=$PROXY_PORT" >> .tpkg.var.test +echo "PROXY_TLS_PORT=$PROXY_TLS_PORT" >> .tpkg.var.test +echo "INTERFACE_ALLOW=$INTERFACE_ALLOW" >> .tpkg.var.test +echo "INTERFACE_ALLOW_ADDR=$INTERFACE_ALLOW_ADDR" >> .tpkg.var.test +echo "INTERFACE_REFUSE=$INTERFACE_REFUSE" >> .tpkg.var.test +echo "INTERFACE_REFUSE_ADDR=$INTERFACE_REFUSE_ADDR" >> .tpkg.var.test +echo "CLIENT_ADDR_ALLOW=$CLIENT_ADDR_ALLOW" >> .tpkg.var.test +echo "CLIENT_ADDR_ALLOW6=$CLIENT_ADDR_ALLOW6" >> .tpkg.var.test +echo "CLIENT_ADDR_REFUSE=$CLIENT_ADDR_REFUSE" >> .tpkg.var.test +echo "CLIENT_ADDR_REFUSE6=$CLIENT_ADDR_REFUSE6" >> .tpkg.var.test +echo "shell=$shell" >> .tpkg.var.test diff --git a/testdata/proxy_protocol.tdir/proxy_protocol.test b/testdata/proxy_protocol.tdir/proxy_protocol.test new file mode 100644 index 000000000..3f65e2932 --- /dev/null +++ b/testdata/proxy_protocol.tdir/proxy_protocol.test @@ -0,0 +1,12 @@ +# #-- proxy_protocol.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 + +# Run the scenario in an unshared namespace +unshare -rUn $shell proxy_protocol.test.scenario +exit $? diff --git a/testdata/proxy_protocol.tdir/proxy_protocol.test.scenario b/testdata/proxy_protocol.tdir/proxy_protocol.test.scenario new file mode 100644 index 000000000..0b8fe6efa --- /dev/null +++ b/testdata/proxy_protocol.tdir/proxy_protocol.test.scenario @@ -0,0 +1,193 @@ +# #-- proxy_protocol.test.scenario --# +# 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 + +ip addr add 127.0.0.1 dev lo +ip link set lo up + +ip link add $INTERFACE_ALLOW type dummy +ip addr add $INTERFACE_ALLOW_ADDR dev $INTERFACE_ALLOW +ip link set $INTERFACE_ALLOW up + +ip link add $INTERFACE_REFUSE type dummy +ip addr add $INTERFACE_REFUSE_ADDR dev $INTERFACE_REFUSE +ip link set $INTERFACE_REFUSE up + +# start forwarder in the background +get_ldns_testns +$LDNS_TESTNS -p $FWD_PORT proxy_protocol.testns >fwd.log 2>&1 & +FWD_PID=$! +echo "FWD_PID=$FWD_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 + +wait_ldns_testns_up fwd.log +wait_unbound_up unbound.log + +# call streamtcp and check return value +do_streamtcp () { + $PRE/streamtcp $* A IN >outfile 2>&1 + if test "$?" -ne 0; then + echo "exit status not OK" + echo "> cat logfiles" + cat outfile + cat unbound.log + echo "Not OK" + exit 1 + fi +} + +send_query () { + server=$1 + client=$2 + prot=$3 + query=$4 + echo -n "> query $query to $server" + port=$UNBOUND_PORT + if test ! -z "$client"; then + port=$PROXY_PORT + fi + case $prot in + -u) + echo -n " (over UDP)" + ;; + -s) + echo -n " (over TLS)" + port=$PROXY_TLS_PORT + ;; + *) + echo -n " (over TCP)" + esac + if test ! -z "$client"; then + echo -n " ($client proxied)" + fi + echo + do_streamtcp $prot -f $server@$port $client $query + #cat outfile +} + +expect_answer () { + #query=$1 + #answer=$2 + if grep "$query" outfile | grep "$answer"; then + echo "content OK" + echo + else + echo "> cat logfiles" + cat outfile + cat unbound.log + echo "result contents not OK" + exit 1 + fi +} + +expect_refuse () { + if grep "rcode: REFUSE" outfile; then + echo "content OK" + echo + else + echo "> cat logfiles" + cat outfile + cat unbound.log + echo "result contents not OK" + exit 1 + fi +} + +# Start the test + +# Query without PROXYv2 +# Client localhost +# Expect the result back +server=127.0.0.1 +client="" +query="two.example.net." +answer="2.2.2.2" +for prot in "-u" ""; do + send_query "$server" "$client" "$prot" "$query" + expect_answer +done + +# Query with PROXYv2 +# Client $CLIENT_ADDR_ALLOW should be allowed +# Expect the result back +server=127.0.0.1 +client="-p $CLIENT_ADDR_ALLOW@1234" +query="one.example.net." +answer="1.1.1.1" +for prot in "-u" "" "-s"; do + send_query "$server" "$client" "$prot" "$query" + expect_answer +done + +# Query with PROXYv2 +# Client $CLIENT_ADDR_ALLOW6 should be allowed +# Expect the result back +server=127.0.0.1 +client="-p $CLIENT_ADDR_ALLOW6@1234" +query="one.example.net." +answer="1.1.1.1" +for prot in "-u" "" "-s"; do + send_query "$server" "$client" "$prot" "$query" + expect_answer +done + +# Query with PROXYv2 +# Client $CLIENT_ADDR_REFUSE should be refused +# Expect the REFUSE back +server=127.0.0.1 +client="-p $CLIENT_ADDR_REFUSE" +query="one.example.net." +answer="" +for prot in "-u" "" "-s"; do + send_query "$server" "$client" "$prot" "$query" + expect_refuse +done + +# Query with PROXYv2 +# Client $CLIENT_ADDR_REFUSE6 should be refused +# Expect the REFUSE back +server=127.0.0.1 +client="-p $CLIENT_ADDR_REFUSE6" +query="one.example.net." +answer="" +for prot in "-u" "" "-s"; do + send_query "$server" "$client" "$prot" "$query" + expect_refuse +done + +# Query with PROXYv2 +# Client $CLIENT_ADDR_ALLOW should be allowed; proxy source address should be allowed +# Expect the result back +server=$INTERFACE_ALLOW_ADDR +client="-p $CLIENT_ADDR_ALLOW@1234" +query="one.example.net." +answer="1.1.1.1" +for prot in "-u" "" "-s"; do + send_query "$server" "$client" "$prot" "$query" + expect_answer +done + +# Query with PROXYv2 +# Client $CLIENT_ADDR_ALLOW should be allowed; proxy source address should be refused +# Expect the REFUSE back +server=$INTERFACE_REFUSE_ADDR +client="-p $CLIENT_ADDR_ALLOW@1234" +query="one.example.net." +answer="" +for prot in "-u" "" "-s"; do + send_query "$server" "$client" "$prot" "$query" + expect_refuse +done + +echo "OK" +exit 0 + diff --git a/testdata/proxy_protocol.tdir/proxy_protocol.testns b/testdata/proxy_protocol.tdir/proxy_protocol.testns new file mode 100644 index 000000000..176bc936a --- /dev/null +++ b/testdata/proxy_protocol.tdir/proxy_protocol.testns @@ -0,0 +1,23 @@ +; nameserver test file +$ORIGIN example.net. +$TTL 3600 + +ENTRY_BEGIN +MATCH opcode qtype qname +REPLY QR RD RA NOERROR +ADJUST copy_id +SECTION QUESTION +one IN A +SECTION ANSWER +one IN A 1.1.1.1 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +REPLY QR RD RA NOERROR +ADJUST copy_id +SECTION QUESTION +two IN A +SECTION ANSWER +two IN A 2.2.2.2 +ENTRY_END diff --git a/testdata/proxy_protocol.tdir/unbound_server.key b/testdata/proxy_protocol.tdir/unbound_server.key new file mode 100644 index 000000000..370a7bbb2 --- /dev/null +++ b/testdata/proxy_protocol.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/proxy_protocol.tdir/unbound_server.pem b/testdata/proxy_protocol.tdir/unbound_server.pem new file mode 100644 index 000000000..986807310 --- /dev/null +++ b/testdata/proxy_protocol.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/pylib.tdir/pylib.post b/testdata/pylib.tdir/pylib.post index 875e06d0a..8dbde8d2e 100644 --- a/testdata/pylib.tdir/pylib.post +++ b/testdata/pylib.tdir/pylib.post @@ -8,13 +8,6 @@ PRE="../.." . ../common.sh -# if no python; exit -if grep "define WITH_PYUNBOUND 1" $PRE/config.h; then - echo "have pyunbound" -else - echo "no pyunbound" - exit 0 -fi # kill fwder kill_pid $FWD_PID diff --git a/testdata/pylib.tdir/pylib.pre b/testdata/pylib.tdir/pylib.pre index 30e005906..3a74b6019 100644 --- a/testdata/pylib.tdir/pylib.pre +++ b/testdata/pylib.tdir/pylib.pre @@ -10,8 +10,7 @@ PRE="../.." if grep "define WITH_PYUNBOUND 1" $PRE/config.h; then echo "have pyunbound" else - echo "no pyunbound" - exit 0 + skip_test "no pyunbound" fi # Copy the required libraries diff --git a/testdata/pylib.tdir/pylib.test b/testdata/pylib.tdir/pylib.test index 59f996459..a583daba4 100644 --- a/testdata/pylib.tdir/pylib.test +++ b/testdata/pylib.tdir/pylib.test @@ -5,13 +5,6 @@ [ -f .tpkg.var.test ] && source .tpkg.var.test PRE="../.." -if grep "define WITH_PYUNBOUND 1" $PRE/config.h; then - echo "have pyunbound" -else - echo "no pyunbound" - exit 0 -fi - if test "`uname 2>&1`" = "Darwin"; then echo export DYLD_LIBRARY_PATH="$DYLD_LIBRARY_PATH:../../.libs" export DYLD_LIBRARY_PATH="$DYLD_LIBRARY_PATH:../../.libs" diff --git a/testdata/pymod.tdir/pymod.post b/testdata/pymod.tdir/pymod.post index 368d285ed..5449ad474 100644 --- a/testdata/pymod.tdir/pymod.post +++ b/testdata/pymod.tdir/pymod.post @@ -8,13 +8,6 @@ PRE="../.." . ../common.sh -# if no python; exit -if grep "define WITH_PYTHONMODULE 1" $PRE/config.h; then - echo "have python module" -else - echo "no python module" - exit 0 -fi kill_pid $FWD_PID kill_pid $UNBOUND_PID diff --git a/testdata/pymod.tdir/pymod.pre b/testdata/pymod.tdir/pymod.pre index 9029a8742..f845d6f97 100644 --- a/testdata/pymod.tdir/pymod.pre +++ b/testdata/pymod.tdir/pymod.pre @@ -10,8 +10,7 @@ PRE="../.." if grep "define WITH_PYTHONMODULE 1" $PRE/config.h; then echo "have python module" else - echo "no python module" - exit 0 + skip_test "no python module" fi # get module python local cp $PRE/pythonmod/unboundmodule.py . diff --git a/testdata/pymod.tdir/pymod.py b/testdata/pymod.tdir/pymod.py index a8018e7f7..1eb7af5b1 100644 --- a/testdata/pymod.tdir/pymod.py +++ b/testdata/pymod.tdir/pymod.py @@ -37,7 +37,12 @@ import os def init(id, cfg): - log_info("pythonmod: init called, module id is %d port: %d script: %s" % (id, cfg.port, cfg.python_script)) + scripts=[] + s = cfg.python_script + while s != None: + scripts.append(s.str) + s = s.next + log_info("pythonmod: init called, module id is %d port: %d script: %s" % (id, cfg.port, scripts)) return True def deinit(id): diff --git a/testdata/pymod.tdir/pymod.test b/testdata/pymod.tdir/pymod.test index 43bf6e65f..5ea87282b 100644 --- a/testdata/pymod.tdir/pymod.test +++ b/testdata/pymod.tdir/pymod.test @@ -5,12 +5,6 @@ [ -f .tpkg.var.test ] && source .tpkg.var.test PRE="../.." -if grep "define WITH_PYTHONMODULE 1" $PRE/config.h; then - echo "have python module" -else - echo "no python module" - exit 0 -fi if test "`uname 2>&1`" = "Darwin"; then ldnsdir=`grep ldnsdir= ../../Makefile | sed -e 's/ldnsdir=//'` diff --git a/testdata/pymod_thread.tdir/pymod_thread.post b/testdata/pymod_thread.tdir/pymod_thread.post index e9b307548..b438958b2 100644 --- a/testdata/pymod_thread.tdir/pymod_thread.post +++ b/testdata/pymod_thread.tdir/pymod_thread.post @@ -8,13 +8,6 @@ PRE="../.." . ../common.sh -# if no python; exit -if grep "define WITH_PYTHONMODULE 1" $PRE/config.h; then - echo "have python module" -else - echo "no python module" - exit 0 -fi kill_pid $FWD_PID kill_pid $UNBOUND_PID diff --git a/testdata/pymod_thread.tdir/pymod_thread.pre b/testdata/pymod_thread.tdir/pymod_thread.pre index c16362a0b..79fdc0375 100644 --- a/testdata/pymod_thread.tdir/pymod_thread.pre +++ b/testdata/pymod_thread.tdir/pymod_thread.pre @@ -10,8 +10,7 @@ PRE="../.." if grep "define WITH_PYTHONMODULE 1" $PRE/config.h; then echo "have python module" else - echo "no python module" - exit 0 + skip_test "no python module" fi # get module python local cp $PRE/pythonmod/unboundmodule.py . diff --git a/testdata/pymod_thread.tdir/pymod_thread.test b/testdata/pymod_thread.tdir/pymod_thread.test index c6baa01be..7c55d19ab 100644 --- a/testdata/pymod_thread.tdir/pymod_thread.test +++ b/testdata/pymod_thread.tdir/pymod_thread.test @@ -5,12 +5,6 @@ [ -f .tpkg.var.test ] && source .tpkg.var.test PRE="../.." -if grep "define WITH_PYTHONMODULE 1" $PRE/config.h; then - echo "have python module" -else - echo "no python module" - exit 0 -fi if test "`uname 2>&1`" = "Darwin"; then ldnsdir=`grep ldnsdir= ../../Makefile | sed -e 's/ldnsdir=//'` diff --git a/testdata/root_anchor.tdir/root_anchor.dsc b/testdata/root_anchor.tdir/root_anchor.dsc index daf231da5..2ea179e89 100644 --- a/testdata/root_anchor.tdir/root_anchor.dsc +++ b/testdata/root_anchor.tdir/root_anchor.dsc @@ -8,7 +8,7 @@ Component: CmdDepends: Depends: Help: -Pre: +Pre: root_anchor.pre Post: Test: root_anchor.test AuxFiles: diff --git a/testdata/root_anchor.tdir/root_anchor.pre b/testdata/root_anchor.tdir/root_anchor.pre new file mode 100644 index 000000000..0357646cd --- /dev/null +++ b/testdata/root_anchor.tdir/root_anchor.pre @@ -0,0 +1,11 @@ +# 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 + +# only do this test if the network is up. +if dig @k.root-servers.net . SOA 2>&1 | grep NOERROR ; then + : +else + skip_test "network is not up" +fi diff --git a/testdata/root_anchor.tdir/root_anchor.test b/testdata/root_anchor.tdir/root_anchor.test index f75dadf67..bbff028be 100644 --- a/testdata/root_anchor.tdir/root_anchor.test +++ b/testdata/root_anchor.tdir/root_anchor.test @@ -5,15 +5,6 @@ PRE="../.." -# only do this test if the network is up. -echo "is the net up?" -if dig @k.root-servers.net . SOA 2>&1 | grep NOERROR ; then - echo yes -else - echo no - exit 0 -fi - # test that unbound-anchor, its builtin DNSKEY, works. # so the https is disabled (go to 127.0.0.1@10099). $PRE/unbound-anchor -u "127.0.0.1" -P 10099 -a test.ds -v diff --git a/testdata/root_hints.tdir/root_hints.dsc b/testdata/root_hints.tdir/root_hints.dsc index 5576fbaf9..c01f29074 100644 --- a/testdata/root_hints.tdir/root_hints.dsc +++ b/testdata/root_hints.tdir/root_hints.dsc @@ -8,7 +8,7 @@ Component: CmdDepends: Depends: Help: -Pre: +Pre: root_hints.pre Post: Test: root_hints.test AuxFiles: diff --git a/testdata/root_hints.tdir/root_hints.pre b/testdata/root_hints.tdir/root_hints.pre new file mode 100644 index 000000000..a75669312 --- /dev/null +++ b/testdata/root_hints.tdir/root_hints.pre @@ -0,0 +1,11 @@ +# #-- root_hints.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 + +# dig 9 ? +digv=`dig -v 2>&1 | wc -l` +if test $digv -ne 1; then + skip_test "Dig too old. skip test" +fi diff --git a/testdata/root_hints.tdir/root_hints.test b/testdata/root_hints.tdir/root_hints.test index 6ae4ec7f4..a5c1dc195 100644 --- a/testdata/root_hints.tdir/root_hints.test +++ b/testdata/root_hints.tdir/root_hints.test @@ -1,4 +1,4 @@ -# #-- 06-ianaports.test --# +# #-- root_hints.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 @@ -6,13 +6,6 @@ PRE="../.." -# dig 9 ? -digv=`dig -v 2>&1 | wc -l` -if test $digv -ne 1; then - echo "Dig too old. skip test" - exit 0 -fi - eval `grep ^srcdir= $PRE/Makefile` echo "srcdir="$srcdir diff --git a/testdata/stub_auth_tc.tdir/stub_auth_tc.conf b/testdata/stub_auth_tc.tdir/stub_auth_tc.conf new file mode 100644 index 000000000..b74942799 --- /dev/null +++ b/testdata/stub_auth_tc.tdir/stub_auth_tc.conf @@ -0,0 +1,16 @@ +server: + verbosity: 4 + # num-threads: 1 + interface: 127.0.0.1 + port: @PORT@ + use-syslog: no + directory: . + pidfile: "unbound.pid" + chroot: "" + username: "" + do-not-query-localhost: no + +stub-zone: + name: "example.com" + stub-addr: "127.0.0.1@@TOPORT@" + diff --git a/testdata/stub_auth_tc.tdir/stub_auth_tc.dsc b/testdata/stub_auth_tc.tdir/stub_auth_tc.dsc new file mode 100644 index 000000000..1f71961f1 --- /dev/null +++ b/testdata/stub_auth_tc.tdir/stub_auth_tc.dsc @@ -0,0 +1,16 @@ +BaseName: stub_auth_tc +Version: 1.0 +Description: Authority reply with erroneous TC in TCP +CreationDate: Mon Oct 3 09:11:32 CEST 2022 +Maintainer: dr. W.C.A. Wijngaards +Category: +Component: +CmdDepends: +Depends: +Help: +Pre: stub_auth_tc.pre +Post: stub_auth_tc.post +Test: stub_auth_tc.test +AuxFiles: +Passed: +Failure: diff --git a/testdata/stub_auth_tc.tdir/stub_auth_tc.post b/testdata/stub_auth_tc.tdir/stub_auth_tc.post new file mode 100644 index 000000000..907a885e4 --- /dev/null +++ b/testdata/stub_auth_tc.tdir/stub_auth_tc.post @@ -0,0 +1,11 @@ +# #-- stub_auth_tc.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 $FWD_PID +kill_pid $UNBOUND_PID + diff --git a/testdata/stub_auth_tc.tdir/stub_auth_tc.pre b/testdata/stub_auth_tc.tdir/stub_auth_tc.pre new file mode 100644 index 000000000..2f7e317bc --- /dev/null +++ b/testdata/stub_auth_tc.tdir/stub_auth_tc.pre @@ -0,0 +1,31 @@ +# #-- stub_auth_tc.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 +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 stub_auth_tc.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'/' < stub_auth_tc.conf > ub.conf +# start unbound in the background +PRE="../.." +$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_ldns_testns_up fwd.log +wait_unbound_up unbound.log + diff --git a/testdata/stub_auth_tc.tdir/stub_auth_tc.test b/testdata/stub_auth_tc.tdir/stub_auth_tc.test new file mode 100644 index 000000000..7b7440274 --- /dev/null +++ b/testdata/stub_auth_tc.tdir/stub_auth_tc.test @@ -0,0 +1,26 @@ +# #-- stub_auth_tc.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 @localhost -p $UNBOUND_PORT www.example.com. | tee outfile +echo "> cat logfiles" +cat fwd.log +cat unbound.log +echo "> check answer" +if grep "SERVFAIL" outfile; then + echo "OK" +else + echo "Not OK" + exit 1 +fi +if grep "flags:" outfile | grep " tc "; then + echo "Not OK, TC flag in output" + exit 1 +fi + +exit 0 diff --git a/testdata/stub_auth_tc.tdir/stub_auth_tc.testns b/testdata/stub_auth_tc.tdir/stub_auth_tc.testns new file mode 100644 index 000000000..f2829add4 --- /dev/null +++ b/testdata/stub_auth_tc.tdir/stub_auth_tc.testns @@ -0,0 +1,26 @@ +; nameserver test file +$ORIGIN example.com. +$TTL 3600 + +ENTRY_BEGIN +MATCH opcode qtype qname UDP +REPLY QR AA TC NOERROR +ADJUST copy_id +SECTION QUESTION +www IN A +SECTION ANSWER +www IN A 10.20.30.40 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname TCP +; erroneous TC flag here. +REPLY QR AA TC NOERROR +ADJUST copy_id +SECTION QUESTION +www IN A +SECTION ANSWER +www IN A 10.20.30.40 +www IN A 10.20.30.41 +www IN A 10.20.30.42 +ENTRY_END diff --git a/util/config_file.c b/util/config_file.c index 5259bf7c1..1c4b723bb 100644 --- a/util/config_file.c +++ b/util/config_file.c @@ -55,6 +55,7 @@ #include "util/regional.h" #include "util/fptr_wlist.h" #include "util/data/dname.h" +#include "util/random.h" #include "util/rtt.h" #include "services/cache/infra.h" #include "sldns/wire2str.h" @@ -87,6 +88,9 @@ struct config_parser_state* cfg_parser = 0; /** init ports possible for use */ static void init_outgoing_availports(int* array, int num); +/** init cookie with random data */ +static void init_cookie_secret(uint8_t* cookie_secret,size_t cookie_secret_len); + struct config_file* config_create(void) { @@ -364,6 +368,10 @@ config_create(void) cfg->ipsecmod_whitelist = NULL; cfg->ipsecmod_strict = 0; #endif + cfg->do_answer_cookie = 0; + memset(cfg->cookie_secret, 0, sizeof(cfg->cookie_secret)); + cfg->cookie_secret_len = 16; + init_cookie_secret(cfg->cookie_secret, cfg->cookie_secret_len); #ifdef USE_CACHEDB if(!(cfg->cachedb_backend = strdup("testframe"))) goto error_exit; if(!(cfg->cachedb_secret = strdup("default"))) goto error_exit; @@ -787,6 +795,7 @@ int config_set_option(struct config_file* cfg, const char* opt, else S_SIZET_NONZERO("pad-responses-block-size:", pad_responses_block_size) else S_YNO("pad-queries:", pad_queries) else S_SIZET_NONZERO("pad-queries-block-size:", pad_queries_block_size) + else S_STRLIST("proxy-protocol-port:", proxy_protocol_port) #ifdef USE_IPSECMOD else S_YNO("ipsecmod-enabled:", ipsecmod_enabled) else S_YNO("ipsecmod-ignore-bogus:", ipsecmod_ignore_bogus) @@ -823,7 +832,7 @@ int config_set_option(struct config_file* cfg, const char* opt, * stub-ssl-upstream, forward-zone, auth-zone * name, forward-addr, forward-host, * ratelimit-for-domain, ratelimit-below-domain, - * local-zone-tag, access-control-view, + * local-zone-tag, access-control-view, interface-*, * send-client-subnet, client-subnet-always-forward, * max-client-subnet-ipv4, max-client-subnet-ipv6, * min-client-subnet-ipv4, min-client-subnet-ipv6, @@ -1253,11 +1262,17 @@ config_get_option(struct config_file* cfg, const char* opt, else O_LS3(opt, "access-control-tag-action", acl_tag_actions) else O_LS3(opt, "access-control-tag-data", acl_tag_datas) else O_LS2(opt, "access-control-view", acl_view) + else O_LS2(opt, "interface-action", interface_actions) + else O_LTG(opt, "interface-tag", interface_tags) + else O_LS3(opt, "interface-tag-action", interface_tag_actions) + else O_LS3(opt, "interface-tag-data", interface_tag_datas) + else O_LS2(opt, "interface-view", interface_view) else O_YNO(opt, "pad-responses", pad_responses) else O_DEC(opt, "pad-responses-block-size", pad_responses_block_size) else O_YNO(opt, "pad-queries", pad_queries) else O_DEC(opt, "pad-queries-block-size", pad_queries_block_size) else O_LS2(opt, "edns-client-strings", edns_client_strings) + else O_LST(opt, "proxy-protocol-port", proxy_protocol_port) #ifdef USE_IPSECMOD else O_YNO(opt, "ipsecmod-enabled", ipsecmod_enabled) else O_YNO(opt, "ipsecmod-ignore-bogus", ipsecmod_ignore_bogus) @@ -1608,10 +1623,16 @@ config_delete(struct config_file* cfg) config_deltrplstrlist(cfg->local_zone_overrides); config_del_strarray(cfg->tagname, cfg->num_tags); config_del_strbytelist(cfg->local_zone_tags); - config_del_strbytelist(cfg->acl_tags); config_del_strbytelist(cfg->respip_tags); + config_deldblstrlist(cfg->acl_view); + config_del_strbytelist(cfg->acl_tags); config_deltrplstrlist(cfg->acl_tag_actions); config_deltrplstrlist(cfg->acl_tag_datas); + config_deldblstrlist(cfg->interface_actions); + config_deldblstrlist(cfg->interface_view); + config_del_strbytelist(cfg->interface_tags); + config_deltrplstrlist(cfg->interface_tag_actions); + config_deltrplstrlist(cfg->interface_tag_datas); config_delstrlist(cfg->control_ifs.first); free(cfg->server_key_file); free(cfg->server_cert_file); @@ -1632,6 +1653,7 @@ config_delete(struct config_file* cfg) config_delstrlist(cfg->python_script); config_delstrlist(cfg->dynlib_file); config_deldblstrlist(cfg->edns_client_strings); + config_delstrlist(cfg->proxy_protocol_port); #ifdef USE_IPSECMOD free(cfg->ipsecmod_hook); config_delstrlist(cfg->ipsecmod_whitelist); @@ -1650,6 +1672,21 @@ config_delete(struct config_file* cfg) free(cfg); } +static void +init_cookie_secret(uint8_t* cookie_secret, size_t cookie_secret_len) +{ + struct ub_randstate *rand = ub_initstate(NULL); + + if (!rand) + fatal_exit("could not init random generator"); + while (cookie_secret_len) { + *cookie_secret++ = (uint8_t)ub_random(rand); + cookie_secret_len--; + } + ub_randfree(rand); +} + + static void init_outgoing_availports(int* a, int num) { @@ -2614,3 +2651,35 @@ int cfg_has_https(struct config_file* cfg) } return 0; } + +/** see if interface is PROXYv2, its port number == the proxy port number */ +int +if_is_pp2(const char* ifname, const char* port, + struct config_strlist* proxy_protocol_port) +{ + struct config_strlist* s; + char* p = strchr(ifname, '@'); + for(s = proxy_protocol_port; s; s = s->next) { + if(p && atoi(p+1) == atoi(s->str)) + return 1; + if(!p && atoi(port) == atoi(s->str)) + return 1; + } + return 0; +} + +/** 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) +{ +#ifdef USE_DNSCRYPT + return ((strchr(ifname, '@') && + atoi(strchr(ifname, '@')+1) == dnscrypt_port) || + (!strchr(ifname, '@') && atoi(port) == dnscrypt_port)); +#else + (void)ifname; + (void)port; + (void)dnscrypt_port; + return 0; +#endif +} diff --git a/util/config_file.h b/util/config_file.h index 4b08d4524..a218ce707 100644 --- a/util/config_file.h +++ b/util/config_file.h @@ -114,6 +114,8 @@ struct config_file { int do_tcp_keepalive; /** tcp keepalive timeout, in msec */ int tcp_keepalive_timeout; + /** proxy protocol ports */ + struct config_strlist* proxy_protocol_port; /** private key file for dnstcp-ssl service (enabled if not NULL) */ char* ssl_service_key; @@ -461,6 +463,16 @@ struct config_file { struct config_str3list* acl_tag_datas; /** list of aclname, view*/ struct config_str2list* acl_view; + /** list of interface action entries, linked list */ + struct config_str2list* interface_actions; + /** list of interface, tagbitlist */ + struct config_strbytelist* interface_tags; + /** list of interface, tagname, localzonetype */ + struct config_str3list* interface_tag_actions; + /** list of interface, tagname, redirectdata */ + struct config_str3list* interface_tag_datas; + /** list of interface, view*/ + struct config_str2list* interface_view; /** list of IP-netblock, tagbitlist */ struct config_strbytelist* respip_tags; /** list of response-driven access control entries, linked list */ @@ -678,6 +690,13 @@ struct config_file { int redis_expire_records; #endif #endif + /** Downstream DNS Cookies */ + /** do answer with server cookie when request contained cookie option */ + int do_answer_cookie; + /** cookie secret */ + uint8_t cookie_secret[40]; + /** cookie secret length */ + size_t cookie_secret_len; /* ipset module */ #ifdef USE_IPSET @@ -1314,6 +1333,12 @@ int if_is_https(const char* ifname, const char* port, int https_port); */ int cfg_has_https(struct config_file* cfg); +/** see if interface is PROXYv2, its port number == the proxy port number */ +int if_is_pp2(const char* ifname, const char* port, + struct config_strlist* proxy_protocol_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); #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 7a1fd7f8e..8f6ffaecb 100644 --- a/util/configlexer.c +++ b/util/configlexer.c @@ -1,7 +1,7 @@ #include "config.h" #include "util/configyyrename.h" -#line 3 "" +#line 2 "" #define YY_INT_ALIGNED short int @@ -9,8 +9,8 @@ #define FLEX_SCANNER #define YY_FLEX_MAJOR_VERSION 2 -#define YY_FLEX_MINOR_VERSION 5 -#define YY_FLEX_SUBMINOR_VERSION 35 +#define YY_FLEX_MINOR_VERSION 6 +#define YY_FLEX_SUBMINOR_VERSION 4 #if YY_FLEX_SUBMINOR_VERSION > 0 #define FLEX_BETA #endif @@ -56,7 +56,6 @@ typedef int flex_int32_t; typedef unsigned char flex_uint8_t; typedef unsigned short int flex_uint16_t; typedef unsigned int flex_uint32_t; -#endif /* ! C99 */ /* Limits of integral types. */ #ifndef INT8_MIN @@ -87,63 +86,61 @@ typedef unsigned int flex_uint32_t; #define UINT32_MAX (4294967295U) #endif +#ifndef SIZE_MAX +#define SIZE_MAX (~(size_t)0) +#endif + +#endif /* ! C99 */ + #endif /* ! FLEXINT_H */ -#ifdef __cplusplus +/* begin standard C++ headers. */ -/* The "const" storage-class-modifier is valid. */ -#define YY_USE_CONST - -#else /* ! __cplusplus */ - -/* C99 requires __STDC__ to be defined as 1. */ -#if defined (__STDC__) - -#define YY_USE_CONST - -#endif /* defined (__STDC__) */ -#endif /* ! __cplusplus */ - -#ifdef YY_USE_CONST +/* TODO: this is always defined, so inline it */ #define yyconst const + +#if defined(__GNUC__) && __GNUC__ >= 3 +#define yynoreturn __attribute__((__noreturn__)) #else -#define yyconst +#define yynoreturn #endif /* Returned upon end-of-file. */ #define YY_NULL 0 -/* Promotes a possibly negative, possibly signed char to an unsigned - * integer for use as an array index. If the signed char is negative, - * we want to instead treat it as an 8-bit unsigned char, hence the - * double cast. +/* Promotes a possibly negative, possibly signed char to an + * integer in range [0..255] for use as an array index. */ -#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) +#define YY_SC_TO_UI(c) ((YY_CHAR) (c)) /* Enter a start condition. This macro really ought to take a parameter, * but we do it the disgusting crufty way forced on us by the ()-less * definition of BEGIN. */ #define BEGIN (yy_start) = 1 + 2 * - /* Translate the current start state into a value that can be later handed * to BEGIN to return to the state. The YYSTATE alias is for lex * compatibility. */ #define YY_START (((yy_start) - 1) / 2) #define YYSTATE YY_START - /* Action number for EOF rule of a given start state. */ #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) - /* Special action meaning "start processing a new file". */ -#define YY_NEW_FILE yyrestart(yyin ) - +#define YY_NEW_FILE yyrestart( yyin ) #define YY_END_OF_BUFFER_CHAR 0 /* Size of default input buffer. */ #ifndef YY_BUF_SIZE +#ifdef __ia64__ +/* On IA-64, the buffer size is 16k, not 8k. + * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case. + * Ditto for the __ia64__ case accordingly. + */ +#define YY_BUF_SIZE 32768 +#else #define YY_BUF_SIZE 16384 +#endif /* __ia64__ */ #endif /* The state buf must be large enough to hold one state per character in the main buffer. @@ -167,8 +164,9 @@ extern FILE *yyin, *yyout; #define EOB_ACT_CONTINUE_SCAN 0 #define EOB_ACT_END_OF_FILE 1 #define EOB_ACT_LAST_MATCH 2 - + #define YY_LESS_LINENO(n) + #define YY_LINENO_REWIND_TO(ptr) /* Return all but the first "n" matched characters back to the input stream. */ #define yyless(n) \ @@ -183,7 +181,6 @@ extern FILE *yyin, *yyout; YY_DO_BEFORE_ACTION; /* set up yytext again */ \ } \ while ( 0 ) - #define unput(c) yyunput( c, (yytext_ptr) ) #ifndef YY_STRUCT_YY_BUFFER_STATE @@ -198,7 +195,7 @@ struct yy_buffer_state /* Size of input buffer in bytes, not including room for EOB * characters. */ - yy_size_t yy_buf_size; + int yy_buf_size; /* Number of characters read into yy_ch_buf, not including EOB * characters. @@ -226,7 +223,7 @@ struct yy_buffer_state int yy_bs_lineno; /**< The line count. */ int yy_bs_column; /**< The column count. */ - + /* Whether to try to fill the input buffer when we reach the * end of it. */ @@ -254,7 +251,7 @@ struct yy_buffer_state /* Stack of input buffers. */ static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */ static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */ -static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */ +static YY_BUFFER_STATE * yy_buffer_stack = NULL; /**< Stack as an array. */ /* We provide macros for accessing buffer states in case in the * future we want to put the buffer states in a more general @@ -265,7 +262,6 @@ static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */ #define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ : NULL) - /* Same as previous macro, but useful when we know that the buffer stack is not * NULL or when we need an lvalue. For internal use only. */ @@ -277,7 +273,7 @@ static yy_size_t yy_n_chars; /* number of characters read into yy_ch_buf */ yy_size_t yyleng; /* Points to current character in buffer. */ -static char *yy_c_buf_p = (char *) 0; +static char *yy_c_buf_p = NULL; static int yy_init = 0; /* whether we need to initialize */ static int yy_start = 0; /* start state number */ @@ -286,71 +282,68 @@ static int yy_start = 0; /* start state number */ */ static int yy_did_buffer_switch_on_eof; -void yyrestart (FILE *input_file ); -void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ); -YY_BUFFER_STATE yy_create_buffer (FILE *file,int size ); -void yy_delete_buffer (YY_BUFFER_STATE b ); -void yy_flush_buffer (YY_BUFFER_STATE b ); -void yypush_buffer_state (YY_BUFFER_STATE new_buffer ); -void yypop_buffer_state (void ); +void yyrestart ( FILE *input_file ); +void yy_switch_to_buffer ( YY_BUFFER_STATE new_buffer ); +YY_BUFFER_STATE yy_create_buffer ( FILE *file, int size ); +void yy_delete_buffer ( YY_BUFFER_STATE b ); +void yy_flush_buffer ( YY_BUFFER_STATE b ); +void yypush_buffer_state ( YY_BUFFER_STATE new_buffer ); +void yypop_buffer_state ( void ); -static void yyensure_buffer_stack (void ); -static void yy_load_buffer_state (void ); -static void yy_init_buffer (YY_BUFFER_STATE b,FILE *file ); +static void yyensure_buffer_stack ( void ); +static void yy_load_buffer_state ( void ); +static void yy_init_buffer ( YY_BUFFER_STATE b, FILE *file ); +#define YY_FLUSH_BUFFER yy_flush_buffer( YY_CURRENT_BUFFER ) -#define YY_FLUSH_BUFFER yy_flush_buffer(YY_CURRENT_BUFFER ) +YY_BUFFER_STATE yy_scan_buffer ( char *base, yy_size_t size ); +YY_BUFFER_STATE yy_scan_string ( const char *yy_str ); +YY_BUFFER_STATE yy_scan_bytes ( const char *bytes, yy_size_t len ); -YY_BUFFER_STATE yy_scan_buffer (char *base,yy_size_t size ); -YY_BUFFER_STATE yy_scan_string (yyconst char *yy_str ); -YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,yy_size_t len ); - -void *yyalloc (yy_size_t ); -void *yyrealloc (void *,yy_size_t ); -void yyfree (void * ); +void *yyalloc ( yy_size_t ); +void *yyrealloc ( void *, yy_size_t ); +void yyfree ( void * ); #define yy_new_buffer yy_create_buffer - #define yy_set_interactive(is_interactive) \ { \ if ( ! YY_CURRENT_BUFFER ){ \ yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ - yy_create_buffer(yyin,YY_BUF_SIZE ); \ + yy_create_buffer( yyin, YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ } - #define yy_set_bol(at_bol) \ { \ if ( ! YY_CURRENT_BUFFER ){\ yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ - yy_create_buffer(yyin,YY_BUF_SIZE ); \ + yy_create_buffer( yyin, YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ } - #define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) /* Begin user sect3 */ +typedef flex_uint8_t YY_CHAR; -typedef unsigned char YY_CHAR; - -FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; +FILE *yyin = NULL, *yyout = NULL; typedef int yy_state_type; extern int yylineno; - int yylineno = 1; extern char *yytext; +#ifdef yytext_ptr +#undef yytext_ptr +#endif #define yytext_ptr yytext -static yy_state_type yy_get_previous_state (void ); -static yy_state_type yy_try_NUL_trans (yy_state_type current_state ); -static int yy_get_next_buffer (void ); -static void yy_fatal_error (yyconst char msg[] ); +static yy_state_type yy_get_previous_state ( void ); +static yy_state_type yy_try_NUL_trans ( yy_state_type current_state ); +static int yy_get_next_buffer ( void ); +static void yynoreturn yy_fatal_error ( const char* msg ); /* Done after the current pattern has been matched and before the * corresponding action - sets up yytext. @@ -362,9 +355,8 @@ static void yy_fatal_error (yyconst char msg[] ); (yy_hold_char) = *yy_cp; \ *yy_cp = '\0'; \ (yy_c_buf_p) = yy_cp; - -#define YY_NUM_RULES 364 -#define YY_END_OF_BUFFER 365 +#define YY_NUM_RULES 372 +#define YY_END_OF_BUFFER 373 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info @@ -372,409 +364,416 @@ struct yy_trans_info flex_int32_t yy_verify; flex_int32_t yy_nxt; }; -static yyconst flex_int16_t yy_accept[3616] = +static const flex_int16_t yy_accept[3687] = { 0, - 1, 1, 338, 338, 342, 342, 346, 346, 350, 350, - 1, 1, 354, 354, 358, 358, 365, 362, 1, 336, - 336, 363, 2, 363, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 338, 339, 339, 340, - 363, 342, 343, 343, 344, 363, 349, 346, 347, 347, - 348, 363, 350, 351, 351, 352, 363, 361, 337, 2, - 341, 363, 361, 357, 354, 355, 355, 356, 363, 358, - 359, 359, 360, 363, 362, 0, 1, 2, 2, 2, - 2, 362, 362, 362, 362, 362, 362, 362, 362, 362, + 1, 1, 346, 346, 350, 350, 354, 354, 358, 358, + 1, 1, 362, 362, 366, 366, 373, 370, 1, 344, + 344, 371, 2, 371, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 346, 347, 347, 348, + 371, 350, 351, 351, 352, 371, 357, 354, 355, 355, + 356, 371, 358, 359, 359, 360, 371, 369, 345, 2, + 349, 371, 369, 365, 362, 363, 363, 364, 371, 366, + 367, 367, 368, 371, 370, 0, 1, 2, 2, 2, + 2, 370, 370, 370, 370, 370, 370, 370, 370, 370, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 338, 0, 342, 0, 349, 0, 346, 350, 0, 361, - 0, 2, 2, 361, 357, 0, 354, 358, 0, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 346, 0, 350, 0, 357, 0, 354, 358, 0, + 369, 0, 2, 2, 369, 365, 0, 362, 366, 0, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 361, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 369, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, - 362, 362, 362, 362, 362, 362, 334, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 133, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 143, 362, 362, 362, - 362, 362, 362, 362, 361, 362, 362, 362, 362, 362, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 341, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 133, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 143, 370, 370, 370, 370, 370, 370, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 115, 362, 333, 362, 362, - 362, 362, 362, 362, 362, 362, 8, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, + 370, 369, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 115, 370, 340, 370, 370, 370, + 370, 370, 370, 370, 370, 8, 370, 370, 370, 370, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 134, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 148, 362, 362, 361, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 134, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 148, 370, 370, 369, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 326, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 331, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 361, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 69, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 255, 362, - 14, 15, 362, 19, 18, 362, 362, 239, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 369, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 69, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 260, 370, 14, 15, 370, 19, 18, + 370, 370, 240, 370, 370, 370, 370, 370, 370, 370, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 141, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 237, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 3, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 141, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 238, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 3, 370, 370, 370, 370, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 361, 362, 362, 362, 362, 362, 362, 362, 320, - 362, 362, 319, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 369, 370, 370, + 370, 370, 370, 370, 370, 370, 325, 370, 370, 324, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 345, 362, 362, 362, 362, 362, 362, - 362, 362, 68, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 72, - 362, 289, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 327, 328, 362, 362, 362, 362, 362, 362, 362, - 362, 73, 362, 362, 142, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 137, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 226, 362, 362, 362, 362, 362, 362, 362, 362, 362, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 353, 370, 370, 370, 370, 370, 370, 370, 370, + 68, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 72, 370, 294, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 332, + 333, 370, 370, 370, 370, 370, 370, 370, 370, 73, + 370, 370, 142, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 137, 370, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 21, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 168, 362, 362, - 362, 362, 362, 361, 345, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 113, 362, 362, 362, - 362, 362, 362, 362, 297, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 227, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 21, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 169, 370, 370, 370, + 370, 370, 369, 353, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 113, 370, 370, - 362, 362, 362, 195, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 167, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 112, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, + 370, 370, 370, 370, 370, 302, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 196, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 168, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 35, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 36, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 70, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 140, 362, 362, 362, 361, 362, - 362, 362, 362, 362, 132, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 71, 362, 362, 362, 362, 362, 362, 362, 362, 362, + 370, 370, 370, 112, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 35, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 36, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 70, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 140, 370, 370, 370, + 369, 370, 370, 370, 370, 370, 370, 132, 370, 370, - 362, 362, 362, 259, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 196, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 58, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 71, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 264, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 197, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 58, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 277, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 63, 362, 64, 362, 362, - 362, 362, 362, 116, 362, 117, 362, 362, 362, 362, - 362, 114, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 7, 362, 362, 362, - 362, 361, 362, 362, 362, 362, 362, 362, 362, 362, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 282, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 63, 370, 64, 370, 370, 370, 370, 370, 116, 370, + 117, 370, 370, 370, 370, 370, 114, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 248, 362, 362, 362, 362, 171, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 260, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 49, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 59, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 218, 362, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 7, 370, 370, 370, 370, 369, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 249, 370, 370, + 370, 370, 172, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 265, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, - 217, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 16, 17, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 74, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 225, 362, 362, 362, 362, 362, 362, 119, 362, 118, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 209, 362, 362, + 49, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 59, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 219, 370, 218, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 16, 17, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 74, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 226, 370, 370, 370, 370, 370, 370, 119, 370, 118, - 362, 362, 362, 362, 362, 362, 362, 149, 362, 362, - 362, 361, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 107, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 95, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 238, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 100, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 210, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 149, 370, 370, + 370, 369, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 107, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 95, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 239, 370, 370, 370, 370, 370, 370, 370, 370, 370, - 362, 362, 362, 67, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 212, 213, 362, 362, 362, 291, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 6, 362, 362, 362, 362, 362, 362, 362, 310, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 295, 362, - 362, 362, 362, 362, 362, 362, 321, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 100, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 67, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 213, 214, 370, + 370, 370, 296, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 6, 370, 370, 370, + 370, 370, 370, 370, 315, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, - 362, 46, 362, 362, 362, 362, 362, 48, 362, 362, - 362, 96, 362, 362, 362, 362, 362, 362, 56, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 361, 362, 205, 362, 362, 362, 144, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 230, 362, 206, - 362, 362, 362, 245, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 57, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 146, 125, 362, 126, - 362, 362, 362, 362, 124, 362, 362, 362, 362, 362, + 370, 370, 370, 370, 300, 370, 370, 370, 370, 370, + 370, 370, 326, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 46, 370, 370, + 370, 370, 370, 48, 370, 370, 370, 96, 370, 370, + 370, 370, 370, 370, 56, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 369, 370, 206, 370, + 370, 370, 144, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 231, 370, 370, 207, 370, 370, + 370, 246, 370, 370, 370, 370, 370, 370, 370, 370, - 362, 362, 362, 362, 164, 362, 362, 54, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 276, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 207, 362, 362, 362, 362, - 362, 210, 362, 216, 362, 362, 362, 362, 362, 362, - 244, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 111, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 138, 362, - 362, 362, 362, 362, 362, 362, 362, 65, 362, 362, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 57, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 146, 125, 370, 126, 370, 370, + 370, 370, 124, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 165, 370, 370, 54, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 281, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 208, 370, 370, 370, + 370, 370, 211, 370, 217, 370, 370, 370, 370, 370, + 370, 245, 370, 370, 370, 370, 370, 370, 370, 370, - 362, 29, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 20, 362, 362, 362, 362, 362, - 362, 362, 30, 39, 362, 176, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 203, 362, 362, 361, 362, 362, 362, 362, 362, - 362, 82, 84, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 299, 362, 362, 362, - 362, 256, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 127, 362, 362, 362, 362, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 111, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 138, 370, 370, 370, 370, 370, 370, 370, 370, 65, + 370, 370, 370, 29, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 20, 370, 370, 370, + 370, 370, 370, 370, 30, 39, 370, 177, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 204, 370, 370, 369, 370, 370, 370, + 370, 336, 370, 370, 82, 84, 370, 370, 370, 370, - 362, 362, 362, 362, 362, 362, 362, 163, 362, 50, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 314, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 170, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 308, 362, - 362, 362, 236, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 324, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 188, 362, 362, 362, + 370, 370, 370, 337, 370, 370, 370, 370, 370, 370, + 304, 370, 370, 370, 370, 261, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 127, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 164, 370, 50, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 255, 370, 370, 370, 370, 370, + 370, 370, 319, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, - 362, 362, 362, 362, 362, 362, 120, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 183, 362, 197, 362, 362, 362, 362, 362, 362, - 362, 361, 362, 152, 362, 362, 362, 362, 362, 106, - 362, 362, 362, 362, 228, 362, 362, 362, 362, 362, - 362, 246, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 268, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 145, 362, 362, 362, 362, 362, 362, 362, 362, 362, + 370, 370, 171, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 313, 370, 370, 370, + 370, 237, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 329, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 189, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 120, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 184, 370, 198, 370, 370, 370, 370, 370, 370, 370, + 369, 370, 152, 370, 370, 370, 370, 370, 106, 370, - 362, 362, 362, 362, 362, 362, 362, 362, 187, 362, - 362, 362, 362, 362, 362, 362, 85, 362, 86, 362, - 362, 362, 362, 362, 362, 66, 317, 362, 362, 362, - 362, 362, 94, 198, 362, 219, 362, 249, 362, 362, - 211, 292, 362, 362, 362, 362, 362, 362, 78, 362, - 200, 362, 362, 362, 362, 362, 362, 9, 362, 362, - 362, 362, 362, 110, 362, 362, 362, 362, 362, 281, - 362, 362, 362, 362, 227, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, + 370, 370, 370, 229, 370, 370, 370, 370, 370, 370, + 247, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 273, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 145, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 188, 370, 370, + 370, 370, 370, 370, 370, 85, 370, 86, 370, 370, + 370, 370, 370, 258, 370, 370, 370, 370, 66, 322, + 370, 370, 370, 370, 370, 94, 199, 370, 220, 370, + 250, 370, 370, 212, 297, 370, 370, 370, 370, 370, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 361, 362, 362, 362, 362, 186, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 172, 362, 298, 362, - 362, 362, 362, 362, 267, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 240, 362, 362, 362, - 362, 362, 362, 290, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 169, 362, 362, 362, 362, 362, 362, 362, 362, + 370, 78, 370, 201, 370, 370, 370, 370, 370, 370, + 9, 370, 370, 370, 370, 370, 110, 370, 370, 370, + 370, 370, 370, 286, 370, 370, 370, 370, 228, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 369, 370, 370, 370, 370, 187, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 318, - 362, 199, 362, 362, 362, 362, 362, 362, 362, 362, - 77, 79, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 109, 362, 362, 362, 362, 362, 279, 362, - 362, 362, 362, 294, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 232, 37, 31, - 33, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 38, 362, 32, 34, 362, 40, 362, - 362, 362, 362, 362, 362, 362, 362, 105, 362, 182, - 362, 362, 362, 362, 362, 362, 362, 361, 362, 362, + 173, 370, 303, 370, 370, 370, 370, 370, 272, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 241, 370, 370, 370, 370, 370, 370, 295, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 170, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 323, 370, 200, 370, + 370, 370, 370, 370, 370, 370, 370, 77, 79, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 109, + 370, 370, 370, 370, 370, 370, 284, 370, 370, 370, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 234, - 231, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 76, 362, 362, 362, 147, 362, 128, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 165, 51, 362, - 362, 362, 353, 13, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 312, 362, 315, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 12, 362, 362, 22, 362, 362, 362, 362, 362, - 362, 285, 362, 362, 362, 362, 296, 362, 362, 362, + 370, 299, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 233, 37, 31, 33, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 38, 370, 32, 34, 370, 40, 370, 370, 370, + 370, 370, 370, 370, 370, 105, 370, 183, 370, 370, + 370, 370, 370, 370, 370, 369, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 235, 232, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 76, 370, + 370, 370, 147, 370, 128, 370, 370, 370, 370, 370, - 362, 80, 362, 242, 362, 362, 362, 362, 362, 233, - 362, 362, 75, 362, 362, 362, 362, 362, 362, 23, - 362, 362, 47, 362, 362, 362, 362, 362, 362, 362, - 362, 335, 362, 362, 362, 362, 181, 180, 362, 362, - 353, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 235, 229, 362, 247, 362, 362, 300, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 193, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 87, 362, 362, 362, 362, 362, 280, + 370, 370, 370, 370, 370, 166, 51, 370, 370, 370, + 361, 13, 370, 370, 370, 370, 370, 370, 370, 153, + 370, 370, 370, 370, 370, 370, 370, 317, 370, 320, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 12, 370, 370, 22, 370, 370, 370, 370, + 370, 370, 370, 290, 370, 370, 370, 370, 301, 370, + 370, 370, 370, 80, 370, 243, 370, 370, 370, 370, + 370, 234, 370, 370, 75, 370, 370, 370, 370, 370, + 370, 23, 370, 370, 47, 370, 370, 370, 370, 370, + 370, 370, 370, 342, 370, 370, 370, 370, 182, 181, - 362, 362, 362, 362, 215, 362, 362, 362, 362, 362, - 241, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 287, 362, 362, 362, 322, 323, 178, 362, 362, 362, - 81, 362, 362, 362, 362, 189, 362, 362, 362, 121, - 123, 122, 362, 362, 362, 25, 362, 362, 173, 362, - 175, 362, 220, 362, 362, 362, 362, 179, 362, 362, - 362, 362, 250, 362, 362, 362, 362, 362, 362, 362, - 154, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 258, 362, 362, 362, 362, 362, 362, - 362, 331, 362, 27, 362, 293, 362, 362, 362, 362, + 370, 370, 361, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 236, 230, 370, 248, 370, 370, 305, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 194, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 87, 370, 370, 370, 370, + 370, 370, 370, 285, 370, 370, 370, 370, 216, 370, + 370, 370, 370, 370, 242, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 292, 370, 370, 370, 327, + 328, 179, 370, 370, 370, 81, 370, 370, 370, 370, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 92, 221, 362, 362, 362, 278, 362, - 316, 362, 214, 362, 362, 362, 362, 362, 288, 60, - 362, 362, 362, 362, 362, 362, 4, 362, 362, 362, - 362, 136, 362, 153, 362, 362, 362, 194, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 253, 41, 42, 362, - 362, 362, 362, 362, 362, 362, 301, 362, 362, 362, - 362, 362, 362, 362, 266, 362, 362, 362, 362, 362, - 362, 362, 362, 224, 362, 362, 362, 362, 362, 362, + 190, 370, 370, 370, 121, 123, 122, 370, 370, 370, + 25, 370, 370, 174, 370, 176, 370, 221, 370, 370, + 370, 370, 180, 370, 370, 370, 370, 251, 370, 370, + 370, 370, 370, 370, 370, 155, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 263, 370, + 370, 370, 370, 370, 370, 370, 338, 370, 27, 370, + 298, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 92, 222, + 370, 370, 257, 370, 370, 283, 370, 321, 370, 215, + 370, 370, 370, 370, 370, 293, 60, 370, 370, 370, - 362, 362, 362, 362, 362, 362, 362, 362, 91, 90, - 362, 362, 61, 362, 284, 362, 254, 362, 362, 362, - 362, 362, 11, 362, 362, 362, 362, 362, 362, 362, - 362, 135, 362, 362, 362, 362, 362, 222, 97, 362, - 362, 44, 362, 362, 362, 362, 362, 362, 362, 362, - 185, 362, 362, 362, 362, 362, 362, 362, 156, 362, - 362, 362, 362, 257, 362, 362, 362, 362, 362, 265, - 362, 362, 362, 362, 150, 362, 362, 362, 129, 131, - 130, 362, 362, 362, 99, 103, 98, 166, 362, 362, - 362, 362, 88, 362, 286, 362, 362, 362, 362, 362, + 370, 370, 370, 370, 4, 370, 370, 370, 370, 136, + 370, 154, 370, 370, 370, 195, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 254, 41, 42, 370, 370, 370, + 370, 370, 370, 370, 306, 370, 370, 370, 370, 370, + 370, 370, 271, 370, 370, 370, 370, 370, 370, 370, + 370, 225, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 91, 90, 370, 370, + 61, 370, 370, 289, 370, 259, 370, 370, 370, 370, + 370, 11, 370, 370, 370, 370, 343, 370, 370, 370, - 362, 10, 362, 362, 362, 362, 362, 282, 325, 362, - 362, 362, 362, 362, 362, 330, 43, 362, 362, 362, - 362, 362, 184, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 104, 102, - 362, 55, 362, 362, 89, 362, 313, 362, 362, 362, - 362, 24, 362, 362, 362, 362, 362, 208, 362, 362, - 362, 362, 362, 362, 223, 362, 362, 362, 362, 362, - 362, 362, 362, 204, 362, 362, 174, 83, 362, 362, - 362, 362, 362, 302, 362, 362, 362, 362, 362, 362, + 370, 135, 370, 370, 370, 370, 370, 223, 97, 370, + 370, 44, 370, 370, 370, 370, 370, 370, 370, 370, + 186, 370, 370, 370, 370, 370, 370, 370, 157, 370, + 370, 370, 370, 262, 370, 370, 370, 370, 370, 270, + 370, 370, 370, 370, 150, 370, 370, 370, 129, 131, + 130, 370, 370, 370, 99, 103, 98, 167, 370, 370, + 370, 370, 88, 370, 256, 291, 370, 370, 370, 370, + 370, 370, 10, 370, 370, 370, 370, 370, 287, 330, + 370, 370, 370, 370, 370, 370, 335, 43, 370, 370, + 370, 370, 370, 185, 370, 370, 370, 370, 370, 370, - 362, 262, 362, 362, 261, 151, 362, 362, 101, 52, - 362, 362, 157, 158, 161, 162, 159, 160, 93, 311, - 362, 362, 283, 139, 362, 362, 362, 26, 362, 177, - 362, 362, 362, 362, 202, 362, 252, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 191, 190, - 45, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 309, 362, 362, 362, 362, 108, - 362, 251, 362, 275, 306, 362, 362, 362, 362, 362, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 104, + 102, 370, 55, 370, 370, 89, 370, 318, 370, 370, + 370, 370, 24, 370, 370, 370, 370, 370, 209, 370, + 370, 370, 370, 370, 370, 224, 370, 370, 370, 370, + 370, 370, 370, 370, 205, 370, 370, 175, 83, 370, + 370, 370, 370, 370, 307, 370, 370, 370, 370, 370, + 370, 370, 267, 370, 370, 266, 151, 370, 370, 101, + 52, 370, 370, 158, 159, 162, 163, 160, 161, 93, + 316, 370, 370, 288, 139, 370, 370, 370, 26, 370, - 362, 362, 362, 362, 362, 362, 332, 362, 53, 62, - 5, 362, 362, 243, 362, 362, 307, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 263, 28, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 264, 362, 362, 362, 155, 362, 362, 362, 362, 362, - 362, 362, 362, 192, 362, 201, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 303, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 329, 362, 362, 271, 362, 362, 362, - 362, 362, 304, 362, 362, 362, 362, 362, 362, 305, + 178, 370, 370, 370, 370, 203, 370, 253, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 192, + 191, 45, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 314, 370, 370, 370, 370, + 108, 370, 252, 370, 280, 311, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 339, 370, 53, + 62, 5, 370, 370, 244, 370, 370, 312, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 268, 28, 370, - 362, 362, 362, 269, 362, 272, 273, 362, 362, 362, - 362, 362, 270, 274, 0 + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 269, 370, 370, 370, 156, 370, 370, 370, 370, + 370, 370, 370, 370, 193, 370, 202, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 308, 370, 370, 370, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 370, 334, 370, 370, 276, 370, 370, + 370, 370, 370, 309, 370, 370, 370, 370, 370, 370, + 310, 370, 370, 370, 274, 370, 277, 278, 370, 370, + 370, 370, 370, 275, 279, 0 } ; -static yyconst flex_int32_t yy_ec[256] = +static const YY_CHAR yy_ec[256] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, @@ -806,7 +805,7 @@ static yyconst flex_int32_t yy_ec[256] = 1, 1, 1, 1, 1 } ; -static yyconst flex_int32_t yy_meta[41] = +static const YY_CHAR yy_meta[41] = { 0, 1, 2, 3, 4, 5, 1, 6, 1, 1, 1, 1, 1, 7, 1, 1, 1, 1, 1, 1, 1, @@ -814,815 +813,831 @@ static yyconst flex_int32_t yy_meta[41] = 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ; -static yyconst flex_int16_t yy_base[3634] = +static const flex_int16_t yy_base[3705] = { 0, 0, 0, 38, 41, 44, 46, 59, 65, 71, 77, - 90, 112, 96, 118, 124, 136, 3820, 3700, 81, 7055, - 7055, 7055, 129, 52, 130, 63, 131, 152, 70, 140, - 149, 156, 57, 88, 76, 173, 175, 95, 197, 145, - 185, 199, 208, 213, 178, 123, 3655, 7055, 7055, 7055, - 107, 3541, 7055, 7055, 7055, 154, 2955, 2678, 7055, 7055, - 7055, 245, 2580, 7055, 7055, 7055, 163, 2543, 7055, 249, - 7055, 253, 148, 2396, 1863, 7055, 7055, 7055, 257, 1657, - 7055, 7055, 7055, 233, 1528, 263, 201, 0, 267, 0, - 0, 165, 191, 221, 252, 205, 181, 265, 92, 261, + 90, 112, 96, 118, 124, 136, 4839, 4776, 81, 7180, + 7180, 7180, 129, 52, 137, 63, 130, 159, 70, 132, + 134, 146, 57, 88, 76, 166, 177, 95, 199, 155, + 187, 201, 210, 215, 156, 148, 4222, 7180, 7180, 7180, + 107, 3771, 7180, 7180, 7180, 186, 3298, 3244, 7180, 7180, + 7180, 247, 3157, 7180, 7180, 7180, 199, 3102, 7180, 251, + 7180, 255, 172, 2895, 2736, 7180, 7180, 7180, 259, 2543, + 7180, 7180, 7180, 203, 2183, 265, 203, 0, 269, 0, + 0, 180, 223, 218, 254, 207, 212, 267, 271, 92, - 216, 263, 271, 272, 259, 279, 274, 282, 280, 286, - 283, 284, 291, 293, 299, 303, 306, 314, 310, 311, - 315, 320, 307, 319, 324, 327, 328, 276, 330, 332, - 337, 342, 345, 346, 348, 334, 350, 347, 355, 356, - 358, 361, 363, 362, 376, 373, 378, 365, 382, 369, - 386, 387, 389, 390, 392, 397, 393, 395, 401, 394, - 1497, 420, 1425, 424, 1324, 428, 1213, 1133, 432, 996, - 436, 440, 0, 432, 789, 446, 568, 516, 451, 415, - 444, 425, 445, 446, 447, 448, 449, 450, 452, 451, - 455, 469, 459, 462, 472, 480, 478, 479, 485, 475, + 263, 261, 277, 278, 273, 265, 285, 280, 288, 281, + 292, 152, 282, 286, 299, 305, 306, 309, 313, 308, + 316, 323, 314, 317, 318, 335, 324, 336, 325, 339, + 340, 344, 345, 347, 349, 350, 353, 356, 354, 358, + 361, 364, 366, 369, 368, 236, 370, 378, 384, 123, + 375, 380, 388, 395, 386, 398, 403, 400, 389, 409, + 411, 2000, 402, 1869, 423, 1759, 429, 1643, 1488, 433, + 1286, 438, 442, 0, 434, 1154, 448, 950, 791, 453, + 440, 452, 447, 448, 427, 449, 451, 458, 453, 454, + 455, 456, 459, 468, 473, 471, 475, 478, 421, 483, - 495, 477, 492, 501, 490, 491, 509, 504, 505, 466, - 507, 512, 513, 515, 514, 517, 530, 518, 520, 526, - 535, 537, 545, 547, 524, 549, 552, 553, 560, 557, - 564, 555, 569, 565, 576, 566, 571, 568, 575, 573, - 582, 578, 580, 583, 584, 587, 589, 602, 593, 594, - 600, 597, 611, 606, 613, 608, 610, 614, 617, 620, - 629, 632, 618, 639, 622, 621, 630, 638, 641, 648, - 649, 644, 645, 647, 650, 651, 653, 654, 655, 656, - 665, 673, 664, 671, 678, 675, 677, 680, 681, 684, - 657, 689, 685, 694, 686, 700, 693, 701, 703, 699, + 484, 489, 482, 501, 487, 492, 502, 499, 508, 491, + 509, 510, 516, 512, 518, 519, 517, 520, 522, 536, + 524, 521, 523, 544, 545, 549, 553, 530, 557, 558, + 548, 565, 561, 568, 560, 576, 571, 580, 572, 575, + 563, 582, 577, 579, 584, 587, 586, 589, 593, 594, + 595, 602, 604, 605, 607, 597, 612, 613, 620, 616, + 617, 624, 618, 621, 633, 635, 625, 640, 630, 638, + 645, 639, 648, 649, 656, 651, 641, 655, 654, 657, + 661, 658, 663, 662, 672, 671, 679, 675, 681, 688, + 674, 683, 684, 687, 690, 691, 692, 700, 695, 701, - 705, 706, 708, 707, 710, 713, 7055, 723, 714, 724, - 725, 735, 722, 730, 733, 740, 742, 721, 737, 739, - 744, 745, 747, 748, 749, 751, 754, 758, 756, 762, - 752, 769, 768, 767, 783, 775, 773, 776, 793, 777, - 786, 778, 785, 810, 794, 806, 807, 808, 813, 812, - 816, 817, 819, 815, 821, 831, 833, 834, 835, 836, - 837, 838, 846, 842, 7055, 844, 851, 858, 860, 862, - 863, 869, 871, 841, 875, 878, 880, 877, 893, 915, - 881, 886, 870, 884, 891, 895, 7055, 900, 898, 939, - 908, 888, 910, 920, 922, 921, 917, 928, 925, 930, + 705, 710, 693, 708, 712, 714, 716, 715, 719, 720, + 724, 721, 7180, 728, 725, 732, 734, 741, 738, 743, + 745, 752, 753, 737, 748, 749, 751, 754, 758, 756, + 763, 760, 762, 768, 765, 773, 775, 777, 778, 782, + 795, 788, 784, 785, 798, 786, 792, 796, 818, 823, + 806, 800, 810, 811, 824, 825, 828, 829, 832, 835, + 833, 844, 836, 841, 846, 847, 848, 849, 850, 858, + 854, 7180, 860, 863, 870, 871, 872, 879, 874, 875, + 853, 885, 887, 890, 892, 898, 920, 893, 903, 895, + 900, 904, 908, 7180, 909, 917, 944, 914, 925, 933, - 935, 927, 945, 956, 957, 929, 946, 948, 964, 967, - 971, 972, 968, 974, 970, 981, 976, 977, 978, 992, - 979, 987, 991, 994, 995, 1000, 1009, 998, 1006, 1013, - 985, 1015, 1016, 1017, 1019, 1018, 1041, 1028, 1034, 1031, - 1020, 1039, 1050, 1021, 1045, 1049, 1057, 1047, 1056, 1063, - 1061, 1066, 1067, 1068, 1069, 1077, 1075, 1073, 1078, 1080, - 1082, 1083, 1086, 1089, 1090, 1091, 1093, 1095, 1097, 1094, - 1104, 1102, 1110, 1111, 1113, 7055, 1114, 7055, 1116, 1117, - 1118, 1119, 1120, 1121, 1122, 1124, 7055, 1127, 1130, 1123, - 1023, 1138, 1140, 1150, 1129, 1146, 1151, 1152, 1153, 1154, + 942, 930, 935, 922, 940, 945, 967, 950, 952, 953, + 962, 971, 969, 966, 970, 972, 977, 979, 980, 989, + 993, 981, 985, 988, 1004, 991, 996, 1000, 1009, 999, + 1008, 1010, 1003, 1011, 1015, 1025, 1014, 1029, 1021, 1023, + 1031, 1034, 1035, 1030, 1032, 1055, 1043, 1038, 1051, 1057, + 1049, 1065, 1062, 1064, 1063, 902, 1066, 1074, 1077, 1075, + 1080, 1081, 1082, 1084, 1093, 1092, 1089, 1090, 1097, 1098, + 1099, 1101, 1105, 1091, 1106, 1036, 1107, 1110, 1115, 1116, + 1119, 1120, 1121, 1123, 7180, 1128, 7180, 1126, 1130, 1131, + 1133, 1132, 1134, 1135, 1136, 7180, 1140, 1143, 1137, 1150, - 1156, 1163, 1158, 1161, 1172, 1168, 1170, 1171, 1173, 1176, - 1174, 1177, 1181, 1183, 1184, 1185, 1204, 7055, 1187, 1188, - 1191, 1196, 1189, 1197, 1195, 1213, 1216, 1214, 1222, 1215, - 1219, 1232, 1233, 1235, 1236, 1238, 1240, 1241, 1242, 1244, - 1249, 1252, 1245, 1253, 1254, 1256, 1258, 1259, 1262, 1263, - 1266, 1270, 7055, 1265, 1273, 1279, 1278, 1284, 1285, 1286, - 1287, 1288, 1289, 1290, 1291, 1293, 210, 1298, 1309, 1316, - 1299, 1318, 1302, 1317, 1313, 1315, 1292, 1319, 1323, 1321, - 1334, 1325, 1336, 1341, 1349, 1345, 1347, 1354, 1356, 1351, - 1331, 1353, 1326, 1357, 1358, 1359, 1360, 1361, 1364, 1370, + 1149, 1162, 1159, 1170, 1146, 1165, 1166, 1169, 1167, 1171, + 1173, 1184, 1175, 1180, 1191, 1176, 1187, 1188, 1193, 1194, + 1196, 1189, 1197, 1199, 1200, 1203, 1220, 7180, 1205, 1206, + 1207, 1208, 1211, 1213, 1217, 1231, 1232, 1223, 1224, 1242, + 1243, 1250, 1245, 1247, 1248, 1253, 1254, 1257, 1264, 1256, + 1266, 1268, 1259, 1269, 1272, 1270, 1275, 1277, 1278, 1279, + 1280, 1285, 7180, 1290, 1288, 1296, 1307, 1293, 1294, 1302, + 1303, 1310, 1308, 1306, 1311, 1312, 1314, 1313, 1318, 1320, + 1328, 1327, 1335, 1336, 1331, 1338, 1332, 1333, 1340, 1344, + 1342, 1334, 1355, 1352, 1357, 1360, 1368, 1364, 1367, 1375, - 1368, 1379, 1371, 1374, 1375, 1376, 1380, 1382, 1384, 1385, - 1390, 1386, 1388, 1392, 1402, 1398, 1397, 1407, 1408, 1400, - 1409, 1413, 1416, 1417, 1414, 1420, 7055, 1430, 1423, 1431, - 1433, 1436, 1439, 1438, 1440, 1444, 1445, 1447, 1446, 1448, - 1450, 1454, 1453, 1455, 1457, 1458, 1465, 1470, 1469, 1471, - 1481, 1480, 1461, 1482, 1484, 1485, 1486, 1487, 1494, 1490, - 1502, 1489, 1493, 1503, 1510, 1501, 1507, 1511, 1519, 1505, - 1512, 1517, 1515, 1525, 1527, 1529, 1537, 1538, 1533, 1539, - 1547, 1542, 1523, 1549, 1550, 1556, 1552, 1553, 1557, 1559, - 1560, 1567, 1562, 1563, 1564, 1568, 1573, 1565, 1574, 1581, + 1377, 1370, 1353, 1372, 1378, 1380, 1373, 1379, 1383, 1389, + 1382, 1390, 1391, 1399, 1396, 1397, 1400, 1398, 1406, 1407, + 1402, 1404, 1410, 1411, 1412, 1413, 1427, 1414, 1422, 1423, + 1424, 1437, 1429, 1432, 1439, 1440, 1441, 1443, 7180, 1452, + 1450, 1451, 1449, 1456, 1457, 1462, 1463, 1464, 1465, 1468, + 1466, 1469, 1474, 1476, 1477, 1470, 1478, 1483, 1486, 1490, + 1487, 1497, 1504, 1503, 1505, 1495, 1507, 1508, 1509, 1480, + 1517, 1515, 1518, 1516, 1523, 1524, 1525, 1532, 1527, 1530, + 1533, 1534, 1535, 1536, 1537, 1539, 1546, 1544, 1549, 1555, + 1563, 1550, 1560, 1567, 1568, 1564, 1570, 1571, 1574, 1577, - 1582, 1585, 1587, 1588, 1589, 1590, 1593, 1594, 1592, 1597, - 1599, 1602, 1595, 1603, 1604, 1615, 1606, 1619, 1616, 1618, - 1624, 1625, 1626, 1627, 1632, 1633, 1634, 1636, 1640, 1642, - 1638, 1641, 1650, 1651, 1653, 1654, 1644, 1656, 1659, 1667, - 1668, 1672, 1666, 1664, 1674, 1676, 1679, 1677, 1681, 1685, - 1688, 1684, 1690, 7055, 1682, 1702, 1692, 1700, 1695, 1697, - 1703, 1711, 1706, 1708, 1709, 1710, 1713, 1736, 7055, 1716, - 7055, 7055, 1717, 7055, 7055, 1719, 1718, 7055, 1720, 1723, - 1730, 1737, 1740, 1725, 1746, 1732, 1749, 1750, 1751, 1760, - 1772, 1757, 1761, 1759, 1752, 1765, 1762, 1778, 1763, 1775, + 1578, 1579, 1580, 1581, 1588, 1583, 1584, 1585, 1591, 1586, + 1592, 1602, 1594, 1613, 1598, 1603, 1608, 1610, 1612, 1615, + 1619, 1621, 1616, 1622, 1624, 1625, 1626, 1630, 1627, 1636, + 1646, 1638, 1628, 1648, 1649, 1651, 1653, 1655, 1657, 1660, + 1658, 1661, 1662, 1664, 1667, 1670, 1668, 1674, 1678, 1677, + 1680, 1682, 1685, 1690, 1693, 1697, 1684, 1683, 1699, 1700, + 1702, 1704, 1706, 1708, 1711, 1707, 1713, 7180, 1715, 1724, + 1719, 1720, 1723, 1721, 1726, 1728, 1735, 1731, 1730, 1732, + 1736, 1742, 1763, 7180, 1741, 7180, 7180, 1743, 7180, 7180, + 1744, 1748, 7180, 1745, 1749, 1757, 1758, 1769, 1770, 1776, - 1783, 1781, 1785, 1789, 1801, 1797, 1802, 1793, 1806, 1812, - 1809, 1815, 1816, 1820, 1805, 1787, 1817, 1822, 1823, 1825, - 1824, 1827, 1830, 1833, 1834, 1831, 1829, 1837, 1846, 1848, - 1839, 1856, 7055, 1852, 1860, 1842, 1864, 1862, 1869, 1865, - 1866, 1870, 1874, 1876, 1871, 1877, 1880, 1882, 1881, 1883, - 1884, 1887, 1890, 1893, 1891, 1897, 1898, 1894, 7055, 1903, - 1905, 1904, 1910, 1907, 1908, 1917, 1909, 1918, 1920, 1919, - 1927, 1924, 1930, 1925, 1933, 1935, 1934, 1936, 1939, 7055, - 1945, 1949, 1941, 1946, 1953, 1937, 1955, 1956, 1959, 1960, - 1961, 1963, 1964, 1966, 1971, 1968, 1976, 1970, 1972, 1973, + 1778, 1779, 1780, 1764, 1787, 1798, 1786, 1747, 1788, 1790, + 1791, 1796, 1803, 1813, 1792, 1814, 1812, 1801, 1821, 1831, + 1815, 1828, 1832, 1833, 1834, 1836, 1837, 1839, 1843, 1846, + 1845, 1849, 1850, 1851, 1853, 1852, 1855, 1858, 1861, 1862, + 1859, 1864, 1865, 1880, 1878, 1867, 1885, 7180, 1881, 1888, + 1870, 1896, 1892, 1899, 1891, 1895, 1898, 1903, 1905, 1900, + 1907, 1909, 1911, 1910, 1912, 1913, 1916, 1919, 1922, 1920, + 1924, 1927, 1926, 1932, 7180, 1933, 1934, 1936, 1940, 1937, + 1938, 1947, 1939, 1948, 1949, 1950, 1962, 1954, 1964, 1955, + 1957, 1966, 1959, 1967, 1969, 7180, 1977, 1982, 1971, 1984, - 1983, 1990, 1980, 1992, 1996, 1981, 1993, 1999, 2001, 2002, - 2003, 2004, 2005, 2007, 2009, 2012, 2017, 2014, 2022, 2018, - 2015, 2025, 2036, 2033, 2031, 2020, 2034, 2038, 2040, 2041, - 2051, 2053, 2049, 2048, 2050, 2062, 2055, 2058, 2059, 2060, - 2064, 2074, 2069, 2072, 2070, 2078, 2079, 2081, 2083, 7055, - 2085, 2087, 7055, 2090, 2088, 2089, 2111, 2091, 2093, 2098, - 2095, 2096, 2115, 2118, 2112, 2123, 2117, 2130, 2125, 2135, - 2136, 2138, 2139, 2143, 2137, 2145, 2141, 2146, 2147, 2158, - 2151, 2161, 2170, 2171, 2105, 2172, 2174, 2169, 2173, 2175, - 2194, 2176, 2177, 2183, 2178, 2106, 2179, 2181, 2180, 2185, + 1974, 1978, 1986, 1987, 1988, 1990, 1991, 1993, 1994, 1996, + 2007, 2002, 2004, 2003, 2005, 2013, 2017, 2010, 2020, 2021, + 2029, 2022, 2025, 2030, 2031, 2032, 2033, 2035, 2036, 2038, + 2042, 2043, 2050, 2046, 2054, 2047, 2049, 2065, 2070, 2052, + 2063, 2066, 2067, 2068, 2071, 2074, 2078, 2083, 2081, 2080, + 2082, 2094, 2086, 2090, 2091, 2096, 2097, 2105, 2093, 2103, + 2110, 2102, 2112, 2114, 2116, 2117, 7180, 2118, 2119, 7180, + 2122, 2120, 2123, 2145, 2125, 2126, 2134, 2128, 2147, 2137, + 2149, 2152, 2141, 2158, 2151, 2170, 2159, 2157, 2172, 2160, + 2174, 2173, 2177, 2178, 2180, 2181, 2184, 2186, 2190, 2194, - 2186, 2187, 2201, 2204, 2207, 2203, 2209, 2210, 2211, 2216, - 2219, 2221, 2222, 7055, 2230, 2228, 2232, 2233, 2223, 2241, - 2239, 2237, 7055, 2240, 2243, 2245, 2253, 2246, 2248, 2254, - 2250, 2257, 2258, 2260, 2264, 2265, 2262, 2263, 2275, 7055, - 2266, 7055, 2276, 2277, 2279, 2281, 2285, 2283, 2287, 2286, - 2288, 7055, 7055, 2289, 2295, 2305, 2298, 2309, 2307, 2296, - 2308, 7055, 2310, 2318, 7055, 2319, 2322, 2313, 2314, 2315, - 2324, 2328, 2329, 2336, 2332, 2339, 2335, 2338, 2337, 7055, - 2345, 2353, 2340, 2349, 2355, 2347, 2348, 2359, 2362, 2358, - 7055, 2365, 2366, 2368, 2375, 2373, 2376, 2377, 2378, 2379, + 2203, 2204, 2206, 2207, 2214, 2187, 2200, 2210, 2229, 2211, + 2212, 2213, 2220, 2215, 2221, 2131, 2218, 2222, 2225, 2231, + 2224, 2239, 2241, 2242, 2238, 2245, 2247, 2251, 2253, 2258, + 2257, 7180, 2266, 2264, 2259, 2263, 2270, 2279, 2271, 2272, + 7180, 2275, 2280, 2274, 2287, 2285, 2282, 2288, 2286, 2295, + 2292, 2296, 2298, 2302, 2297, 2299, 2310, 7180, 2305, 7180, + 2300, 2313, 2315, 2317, 2318, 2319, 2323, 2322, 2324, 7180, + 7180, 2325, 2326, 2339, 2334, 2347, 2342, 2331, 2343, 7180, + 2344, 2354, 7180, 2357, 2349, 2352, 2345, 2350, 2362, 2363, + 2366, 2365, 2373, 2368, 2375, 2371, 2372, 2376, 7180, 2382, - 2383, 2384, 2386, 2387, 2389, 2394, 2397, 2398, 2399, 2400, - 2413, 2409, 2416, 7055, 2412, 2393, 2408, 2421, 2418, 2420, - 2422, 2424, 2425, 2426, 2427, 2429, 2434, 2436, 2435, 2438, - 2439, 2441, 2448, 2449, 2458, 2450, 2454, 2462, 2445, 2453, - 2457, 2455, 2470, 2463, 2468, 2471, 2472, 7055, 2474, 2476, - 2478, 2479, 2480, 2482, 171, 2487, 2483, 2488, 2489, 2495, - 2492, 2496, 2505, 2509, 2506, 2507, 2148, 2508, 2510, 2511, - 2514, 2515, 2517, 2520, 2518, 2521, 7055, 2529, 2523, 2526, - 2531, 2532, 2534, 2542, 7055, 2535, 2548, 2545, 2552, 2553, - 2541, 2559, 2557, 2563, 2564, 2565, 2566, 2567, 2574, 2572, + 2384, 2374, 2389, 2391, 2385, 2393, 2392, 2398, 2399, 7180, + 2400, 2404, 2407, 2414, 2410, 2412, 2405, 2415, 2416, 2419, + 2422, 2424, 2425, 2426, 2433, 2435, 2436, 2438, 2440, 2448, + 2446, 2453, 7180, 2449, 2432, 2452, 2461, 2457, 2459, 2456, + 2460, 2463, 2464, 2466, 2431, 2467, 1793, 2471, 2473, 2474, + 2475, 2483, 2484, 2487, 2480, 2488, 2490, 2479, 2492, 2496, + 2497, 2503, 2500, 2501, 2502, 2504, 7180, 2505, 2512, 2509, + 2514, 2520, 2507, 727, 2516, 2513, 2522, 2526, 2523, 2533, + 2536, 2537, 2544, 2545, 2540, 2541, 2547, 2550, 2551, 2552, + 2553, 2554, 2542, 2559, 2560, 2563, 2564, 7180, 2571, 2568, - 2569, 2571, 2575, 7055, 2587, 2584, 2588, 2578, 2590, 2592, - 2591, 2597, 2599, 2601, 2603, 2602, 2604, 2607, 2605, 2608, - 2609, 2610, 2613, 2631, 2618, 2621, 2623, 2622, 2626, 2630, - 2633, 2634, 2635, 2646, 2636, 7055, 2649, 2639, 2644, 2647, - 2648, 2651, 2657, 2653, 2670, 2660, 2661, 2663, 2671, 2680, - 2673, 2674, 2684, 2690, 2677, 2687, 2698, 2695, 2697, 2704, - 2694, 2706, 2708, 2701, 2709, 2716, 2714, 2712, 2717, 2719, - 2718, 2726, 2730, 2729, 2731, 2725, 2728, 2740, 2739, 2749, - 2754, 2747, 7055, 2755, 2741, 2743, 2757, 2768, 2760, 2763, - 2765, 2764, 2771, 2772, 2773, 2774, 2781, 2776, 2782, 2779, + 2572, 2573, 2574, 2575, 2584, 7180, 2577, 2585, 2587, 2594, + 2597, 2591, 2576, 2596, 2599, 2601, 2602, 2606, 2608, 2618, + 2609, 2613, 2611, 2616, 7180, 2624, 2621, 2628, 2619, 2629, + 2632, 2631, 2630, 2637, 2638, 2641, 2643, 2642, 2647, 2646, + 2648, 2650, 2654, 2651, 2661, 2656, 2662, 2663, 2664, 2667, + 2671, 2670, 2673, 2675, 2680, 2677, 7180, 2684, 2681, 2685, + 2687, 2688, 2691, 2700, 2692, 2712, 2694, 2701, 2703, 2709, + 2717, 2714, 2693, 2729, 2719, 2728, 2732, 2737, 2734, 2738, + 2744, 2721, 2746, 2748, 2735, 2749, 2756, 2752, 2754, 2757, + 2758, 2759, 2766, 2769, 2765, 2764, 2771, 2773, 2775, 2776, - 2783, 2784, 2786, 2790, 2795, 2793, 2796, 2798, 2805, 2801, - 2807, 2808, 7055, 2809, 2813, 2814, 2815, 2820, 2817, 2823, - 2825, 2827, 2828, 2829, 2830, 2835, 2836, 2831, 2838, 2839, - 2846, 2842, 2843, 2853, 2844, 7055, 2854, 2845, 2858, 2861, - 2863, 2864, 2865, 2867, 2875, 2874, 2880, 2882, 2868, 2885, - 2870, 2883, 2884, 7055, 2895, 2898, 2891, 2894, 2906, 2893, - 2901, 2903, 2905, 2907, 7055, 2908, 2910, 849, 2909, 2911, - 2912, 2921, 2922, 2917, 7055, 2925, 2918, 2926, 2929, 2930, - 2933, 2934, 2936, 2939, 2940, 2943, 2945, 2954, 2941, 2951, - 7055, 2944, 2968, 2948, 2960, 2970, 2957, 2958, 2972, 2974, + 2778, 2788, 2781, 7180, 2794, 2795, 2783, 2796, 2797, 2805, + 2800, 2801, 2802, 2808, 2811, 2812, 2813, 2815, 2824, 2816, + 2821, 2819, 2825, 2830, 2826, 2828, 2834, 2836, 2838, 2842, + 2844, 2845, 2849, 2850, 7180, 2853, 2846, 2855, 2857, 2859, + 2861, 2865, 2867, 2870, 2862, 2869, 2871, 2873, 2876, 2877, + 2879, 2878, 2886, 2884, 2888, 2885, 2891, 7180, 2899, 2893, + 2900, 2901, 2903, 2905, 2904, 2911, 2915, 2914, 2920, 2922, + 2907, 2923, 2924, 2928, 2929, 7180, 2937, 2938, 2934, 2936, + 2946, 2943, 2944, 2945, 2948, 2933, 7180, 2949, 2950, 2951, + 2955, 2957, 2958, 2965, 2966, 2967, 2964, 7180, 2978, 2962, - 2975, 2981, 2977, 7055, 2986, 2985, 2988, 2998, 2976, 2993, - 2994, 2996, 3000, 3002, 3003, 3004, 3006, 3008, 7055, 3009, - 3013, 3014, 3015, 3018, 3017, 3010, 3026, 3025, 3027, 3030, - 3033, 3036, 3038, 3039, 3040, 3034, 3050, 3042, 3044, 3048, - 3061, 3052, 3054, 3046, 3068, 3070, 3077, 3059, 3074, 3079, - 3076, 3056, 3080, 3081, 3089, 3090, 3091, 3087, 3092, 7055, - 3095, 3096, 3097, 3098, 3099, 3103, 3104, 3102, 3107, 3105, - 3110, 3115, 3112, 3113, 3128, 3130, 3114, 3135, 3121, 3123, - 3137, 3133, 3131, 3139, 3143, 3147, 3144, 3145, 3148, 3157, - 3152, 3154, 3162, 3153, 3158, 3163, 3164, 3166, 3155, 3167, + 2969, 2971, 2974, 2979, 2980, 2983, 2985, 2987, 2988, 2990, + 2992, 2997, 2994, 2999, 7180, 3000, 3008, 3003, 3009, 3014, + 3001, 3011, 3013, 3024, 3016, 3033, 3020, 7180, 3036, 3023, + 3037, 3044, 3039, 3040, 3041, 3042, 3045, 3046, 3049, 3052, + 3055, 3053, 7180, 3054, 3056, 3057, 3061, 3065, 3063, 3064, + 3076, 3077, 3071, 3078, 3079, 3080, 3084, 3082, 3085, 3091, + 3100, 3086, 3088, 3094, 3106, 3096, 3108, 3092, 3113, 3116, + 3121, 3118, 3119, 3123, 3124, 3125, 3126, 3128, 3135, 3137, + 3140, 3138, 3142, 7180, 3145, 3146, 3127, 3148, 3149, 3151, + 3152, 3153, 3154, 3156, 3163, 3168, 3158, 3159, 3175, 3183, - 3175, 3178, 3170, 3168, 3176, 3180, 3194, 3197, 3181, 3198, - 3191, 3199, 3200, 3201, 7055, 3205, 3184, 3206, 3209, 3210, - 3212, 3214, 3222, 3215, 3218, 3233, 3232, 3224, 3234, 3225, - 3217, 3239, 3236, 3246, 3242, 7055, 3243, 7055, 3244, 3247, - 3249, 3257, 3253, 7055, 3255, 7055, 3259, 3264, 3258, 3260, - 3266, 7055, 3267, 3268, 3271, 3269, 3272, 3279, 3275, 3277, - 3281, 3283, 3285, 3293, 3294, 3296, 3284, 3286, 3297, 3303, - 3306, 3304, 3308, 3309, 3310, 3312, 3316, 3313, 3311, 3319, - 3321, 3328, 3324, 3329, 3330, 3332, 7055, 3339, 3341, 3340, - 3345, 3336, 3342, 3334, 3346, 3354, 3351, 3355, 3357, 3358, + 3170, 3179, 3181, 3184, 3185, 3186, 3187, 3188, 3189, 3198, + 3196, 3193, 3195, 3205, 3197, 3204, 3215, 3211, 3212, 3214, + 3217, 3218, 3220, 3202, 3224, 3225, 3219, 3227, 3228, 3229, + 3243, 3245, 3235, 3248, 3238, 3249, 3250, 3253, 3254, 7180, + 3257, 3258, 3255, 3261, 3262, 3268, 3269, 3271, 3272, 3276, + 3283, 3279, 3282, 3288, 3280, 3285, 3290, 3291, 3301, 3294, + 7180, 3296, 7180, 3297, 3302, 3304, 3312, 3308, 7180, 3310, + 7180, 3313, 3320, 3315, 3317, 3321, 7180, 3322, 3323, 3326, + 3327, 3329, 3334, 3324, 3330, 3338, 3340, 3341, 3348, 3352, + 3347, 3332, 3343, 3354, 3360, 3361, 3359, 3363, 3364, 3367, - 3359, 3364, 3361, 3367, 3369, 3371, 3375, 3383, 3374, 3387, - 7055, 3382, 3385, 3386, 3391, 7055, 3388, 3390, 3398, 3400, - 3392, 3395, 3402, 3404, 3408, 3403, 3410, 3411, 3412, 3425, - 3423, 3424, 7055, 3420, 3432, 3416, 3433, 3435, 3426, 3444, - 3445, 3442, 3448, 3451, 3446, 3453, 3454, 3455, 3456, 3457, - 3459, 3466, 3469, 3470, 3471, 3474, 3461, 3478, 3480, 3481, - 3472, 3465, 3482, 3487, 3488, 3489, 3491, 3492, 3493, 3494, - 3495, 3496, 3499, 7055, 3500, 3504, 3508, 3517, 3509, 3514, - 3513, 3520, 3519, 7055, 3523, 3524, 3526, 3525, 3527, 3532, - 3535, 3536, 3538, 3539, 3542, 3543, 3546, 3545, 7055, 3551, + 3368, 3366, 3370, 3371, 3375, 3372, 3377, 3378, 3384, 3385, + 3387, 7180, 3398, 3390, 3386, 3395, 3401, 3402, 3405, 3403, + 3407, 3406, 3409, 3410, 3408, 3412, 3414, 3416, 3424, 3425, + 3426, 3427, 3435, 3442, 3428, 3443, 3439, 7180, 3438, 3450, + 3441, 3445, 7180, 3453, 3447, 3454, 3456, 3459, 3461, 3462, + 3463, 3464, 3467, 3468, 3469, 3472, 3476, 3481, 3484, 7180, + 3474, 3488, 3482, 3491, 3496, 3492, 3504, 3505, 3497, 3500, + 3508, 3512, 3510, 3511, 3513, 3514, 3517, 3518, 3525, 3526, + 3528, 3527, 3529, 3530, 3534, 3536, 3538, 3540, 3541, 3544, + 3542, 3545, 3546, 3550, 3547, 3548, 3551, 3552, 3549, 3567, - 7055, 3552, 3559, 3554, 3564, 3567, 3565, 3569, 3574, 3568, - 3570, 3575, 3582, 3586, 3576, 3578, 3584, 3587, 3588, 3590, - 3598, 3602, 3596, 3604, 3605, 3607, 3608, 3610, 3615, 3611, - 3617, 7055, 7055, 3612, 3613, 3619, 3623, 3621, 3627, 3633, - 3635, 3636, 3638, 3640, 3642, 3651, 7055, 3643, 3649, 3646, - 3653, 3652, 3665, 3654, 3663, 3673, 3669, 3670, 3677, 3675, - 7055, 3676, 3678, 3685, 3680, 3686, 3688, 7055, 3683, 7055, - 3687, 3690, 3694, 3697, 3698, 3699, 3701, 3702, 3704, 3707, - 3710, 3716, 3718, 3725, 3720, 3722, 3727, 3728, 3729, 3730, - 3732, 3733, 3740, 3736, 3738, 3741, 3739, 7055, 3743, 3744, + 7180, 3557, 3566, 3570, 3577, 3556, 3572, 3575, 3579, 3581, + 3585, 3580, 7180, 3591, 3587, 3592, 3582, 3598, 3596, 3600, + 3601, 3603, 3604, 3605, 3608, 3610, 3612, 7180, 3609, 7180, + 3606, 3623, 3617, 3633, 3618, 3627, 3634, 3636, 3638, 3639, + 3641, 3640, 3642, 3644, 3648, 3650, 3649, 3653, 3652, 3660, + 3656, 3666, 3657, 3667, 3669, 3670, 3672, 3682, 3674, 3671, + 7180, 7180, 3675, 3678, 3685, 3689, 3690, 3693, 3694, 3697, + 3701, 3703, 3691, 3704, 3705, 3717, 7180, 3707, 3714, 3715, + 3719, 3718, 3726, 3722, 3728, 3736, 3733, 3731, 3741, 3742, + 7180, 3734, 3739, 3749, 3744, 3747, 3752, 7180, 3751, 7180, - 3751, 3745, 3752, 3760, 3761, 3753, 3759, 7055, 3763, 3767, - 3768, 3769, 3770, 3778, 3773, 3775, 3779, 3784, 3780, 3786, - 3788, 3789, 7055, 3790, 3791, 3802, 3795, 3797, 3799, 3804, - 3810, 3817, 7055, 3814, 3812, 3824, 3823, 3808, 3825, 3826, - 3828, 3830, 3831, 3832, 3833, 3834, 3835, 3841, 3836, 3837, - 3845, 3840, 3856, 3857, 3843, 3847, 3865, 3855, 7055, 3863, - 3864, 3866, 3870, 3869, 3871, 3874, 3877, 3881, 3892, 3875, - 3894, 3896, 3882, 3884, 3887, 3899, 3900, 3907, 3906, 7055, - 3916, 3902, 3917, 3913, 3912, 3919, 3915, 3921, 3923, 3925, - 3927, 3926, 3929, 3930, 3931, 3933, 3945, 3936, 3940, 3943, + 3755, 3758, 3760, 3761, 3762, 3763, 3765, 3764, 3768, 3766, + 3770, 3776, 3788, 3789, 3787, 3785, 3792, 3786, 3793, 3794, + 3796, 3799, 3807, 3800, 3802, 3804, 3803, 7180, 3809, 3805, + 3810, 3815, 3816, 3823, 3824, 3817, 3827, 7180, 3830, 3831, + 3832, 3833, 3834, 3838, 3839, 3842, 3843, 3847, 3848, 3851, + 3852, 3844, 3855, 7180, 3857, 3860, 3869, 3861, 3864, 3866, + 3871, 3874, 3868, 3879, 7180, 3881, 3875, 3889, 3891, 3885, + 3892, 3893, 3887, 3895, 3898, 3900, 3899, 3901, 3902, 3903, + 3905, 3908, 3910, 3909, 3921, 3922, 3923, 3925, 3934, 3914, + 7180, 3930, 3912, 3936, 3937, 3939, 3940, 3944, 3947, 3950, - 3944, 3952, 3951, 7055, 3959, 3954, 3957, 3963, 3956, 3962, - 3975, 3970, 3966, 3973, 3981, 3974, 3982, 3976, 3984, 3987, - 3990, 3978, 7055, 7055, 3992, 3985, 3993, 7055, 3995, 3997, - 4005, 4001, 4008, 4003, 4011, 4009, 4012, 4013, 4014, 4019, - 4020, 7055, 4028, 4025, 4029, 4027, 4031, 4040, 4033, 7055, - 4032, 4043, 4042, 4044, 4046, 4048, 4050, 4053, 4052, 4054, - 4058, 4059, 4060, 4071, 4072, 4062, 4063, 4070, 7055, 4067, - 4073, 4075, 4084, 4077, 4079, 4081, 7055, 4086, 4088, 4093, - 4091, 4099, 4103, 4100, 4106, 4110, 4107, 4111, 4112, 4113, - 4114, 4115, 4116, 4126, 4119, 4123, 4124, 4127, 4133, 4141, + 3952, 3941, 3957, 3962, 3943, 3945, 3954, 3968, 3965, 3976, + 3971, 7180, 3978, 3973, 3983, 3979, 3980, 3982, 3987, 3981, + 3988, 3990, 3992, 3994, 3995, 3997, 3998, 4003, 4010, 4006, + 3996, 4009, 4011, 4023, 4012, 4013, 4014, 4024, 7180, 4036, + 4026, 4022, 4039, 4034, 4028, 4044, 4042, 4046, 4047, 4049, + 4050, 4052, 4054, 4055, 4056, 4059, 4060, 7180, 7180, 4062, + 4063, 4064, 7180, 4069, 4065, 4081, 4067, 4071, 4072, 4079, + 4082, 4087, 4084, 4090, 4085, 4092, 7180, 4101, 4097, 4104, + 4099, 4100, 4109, 4112, 7180, 4105, 4121, 4117, 4113, 4120, + 4122, 4106, 4123, 4125, 4127, 4130, 4131, 4132, 4134, 4144, - 4139, 7055, 4121, 4144, 4145, 4146, 4148, 7055, 4150, 4158, - 4159, 7055, 4162, 4154, 4161, 4163, 4167, 4170, 7055, 4169, - 4168, 4171, 4173, 4176, 4185, 4177, 4188, 4187, 4184, 4189, - 4190, 4192, 7055, 4193, 4191, 4197, 7055, 4208, 4206, 4213, - 4215, 4196, 4200, 4217, 4219, 4220, 4218, 7055, 4225, 7055, - 4228, 4221, 4234, 7055, 4229, 4232, 4237, 4239, 4236, 4243, - 4246, 4247, 4253, 4240, 4249, 4254, 4255, 4257, 4259, 4262, - 4263, 4266, 4265, 4268, 7055, 4276, 4267, 4269, 4270, 4271, - 4286, 4280, 4284, 4273, 4290, 4292, 7055, 7055, 4298, 7055, - 4299, 4293, 4300, 4301, 7055, 4303, 4306, 4310, 4307, 4311, + 4146, 4136, 4145, 4143, 7180, 4141, 4148, 4150, 4152, 4153, + 4154, 4157, 7180, 4159, 4162, 4164, 4168, 4167, 4180, 4171, + 4181, 4183, 4169, 4184, 4185, 4186, 4187, 4188, 4189, 4199, + 4194, 4195, 4196, 4200, 4203, 4205, 4211, 7180, 4214, 4216, + 4217, 4219, 4221, 7180, 4226, 4234, 4235, 7180, 4236, 4218, + 4238, 4239, 4231, 4246, 7180, 4241, 4245, 4247, 4254, 4248, + 4256, 4252, 4263, 4261, 4258, 4262, 4264, 4266, 7180, 4267, + 4265, 4270, 7180, 4272, 4280, 4285, 4288, 4290, 4276, 4297, + 4292, 4294, 4295, 4293, 7180, 4300, 4304, 7180, 4306, 4307, + 4310, 7180, 4308, 4312, 4313, 4315, 4316, 4317, 4321, 4327, - 4313, 4308, 4322, 4319, 7055, 4329, 4330, 7055, 4314, 4332, - 4339, 4334, 4335, 4323, 4336, 4340, 4343, 4325, 4347, 4349, - 4350, 4351, 4353, 4354, 4358, 7055, 4355, 4357, 4362, 4367, - 4368, 4370, 4373, 4378, 4371, 7055, 4382, 4392, 4381, 4384, - 4388, 7055, 4393, 7055, 4385, 4396, 4397, 4398, 4401, 4410, - 7055, 4406, 4407, 4412, 4413, 4414, 4415, 4418, 4422, 4416, - 4424, 4425, 4432, 4428, 4430, 4429, 4437, 4438, 7055, 4435, - 4444, 4448, 4449, 4440, 4452, 4453, 4461, 4457, 4463, 4456, - 4460, 4470, 4459, 4477, 4479, 4466, 4481, 4464, 7055, 4483, - 4484, 4488, 4485, 4495, 4491, 4492, 4497, 7055, 4498, 4499, + 4329, 4323, 4331, 4332, 4333, 4334, 4336, 4345, 4335, 4337, + 4342, 4344, 7180, 4347, 4349, 4354, 4355, 4351, 4356, 4361, + 4362, 4365, 4368, 4268, 7180, 7180, 4376, 7180, 4366, 4372, + 4377, 4378, 7180, 4380, 4382, 4385, 4381, 4383, 4387, 4390, + 4392, 4397, 7180, 4400, 4401, 7180, 4403, 4404, 4412, 4407, + 4409, 4411, 4414, 4417, 4419, 4415, 4413, 4423, 4422, 4427, + 4424, 4429, 4430, 4447, 4431, 4442, 7180, 4432, 4440, 4443, + 4457, 4449, 4451, 4459, 4453, 4460, 7180, 4464, 4466, 4465, + 4470, 4472, 7180, 4473, 7180, 4474, 4476, 4477, 4484, 4478, + 4487, 7180, 4488, 4491, 4494, 4495, 4496, 4498, 4499, 4502, - 4500, 7055, 4502, 4507, 4508, 4512, 4513, 4514, 4516, 4519, - 4518, 4522, 4523, 4520, 7055, 4521, 4528, 4524, 4537, 4541, - 4530, 4529, 7055, 7055, 4545, 7055, 4548, 4526, 4550, 4552, - 4553, 4557, 4558, 4556, 4559, 4561, 4562, 4563, 4569, 4571, - 4572, 7055, 4574, 4581, 4577, 4589, 4590, 4592, 4591, 4579, - 4595, 7055, 7055, 4597, 4601, 4598, 4604, 4605, 4600, 4608, - 4617, 4609, 4618, 4621, 4623, 4630, 7055, 4625, 4613, 4631, - 4622, 7055, 4632, 4634, 4636, 4637, 4638, 4640, 4644, 4641, - 4645, 4646, 4648, 4649, 4651, 4662, 4654, 4655, 4656, 4663, - 4664, 4665, 4669, 4671, 4677, 7055, 4678, 4673, 4679, 4680, + 4506, 4508, 4503, 4515, 4511, 4512, 4510, 4519, 4520, 7180, + 4514, 4517, 4527, 4530, 4534, 4532, 4536, 4537, 4544, 4540, + 4546, 4541, 4542, 4553, 4549, 4554, 4562, 4547, 4560, 4564, + 7180, 4566, 4567, 4569, 4568, 4578, 4573, 4574, 4575, 7180, + 4580, 4581, 4588, 7180, 4584, 4590, 4591, 4595, 4596, 4598, + 4599, 4602, 4601, 4605, 4606, 4603, 7180, 4611, 4612, 4607, + 4604, 4615, 4613, 4625, 7180, 7180, 4628, 7180, 4629, 4630, + 4631, 4632, 4633, 4636, 4639, 4638, 4640, 4642, 4644, 4651, + 4652, 4654, 4655, 7180, 4657, 4666, 4661, 4673, 4669, 4671, + 4674, 7180, 4678, 4664, 7180, 7180, 4680, 4681, 4685, 4688, - 4684, 4198, 4685, 4687, 4688, 4690, 4697, 7055, 4694, 7055, - 4693, 4696, 4695, 4703, 4702, 4713, 4714, 4715, 4716, 4717, - 4720, 4723, 4724, 4727, 4728, 4732, 4733, 4737, 4738, 4742, - 4735, 4746, 4752, 4749, 7055, 4753, 4740, 4755, 4756, 4762, - 4764, 4757, 4766, 4759, 4770, 4767, 4773, 4772, 4780, 4774, - 4781, 4783, 4784, 4785, 7055, 4786, 4793, 4787, 4795, 4789, - 4796, 4797, 4799, 4808, 4811, 4812, 4805, 4813, 7055, 4814, - 4816, 4818, 7055, 4819, 4821, 4822, 4823, 4826, 4828, 4825, - 4832, 4833, 4834, 7055, 4841, 4842, 4843, 4846, 4847, 4851, - 4852, 4853, 4854, 4857, 4856, 4868, 7055, 4870, 4861, 4872, + 4689, 4691, 4675, 7180, 4698, 4695, 4701, 4705, 4706, 4714, + 7180, 4709, 4697, 4712, 4699, 7180, 4710, 4715, 4718, 4721, + 4722, 4724, 4723, 4725, 4726, 4728, 4730, 4733, 4732, 4738, + 4734, 4740, 4744, 4746, 4748, 4749, 4751, 4753, 4756, 7180, + 4757, 4759, 4760, 4761, 4763, 4768, 4769, 4770, 4772, 4773, + 4781, 7180, 4774, 7180, 4777, 4782, 4787, 4783, 4795, 4798, + 4799, 4800, 4801, 4802, 4805, 4807, 4808, 4811, 4816, 4813, + 4806, 4817, 4822, 4823, 7180, 4829, 4830, 4833, 4836, 4838, + 4840, 4841, 7180, 4842, 4843, 4844, 4849, 4851, 4853, 4854, + 4856, 4857, 4859, 4862, 4860, 4867, 4869, 4870, 4871, 4872, - 4875, 4859, 4863, 4874, 4878, 4881, 7055, 4882, 4885, 4889, - 4891, 4898, 4899, 4896, 4897, 4908, 4900, 4904, 4901, 4903, - 4910, 4911, 4914, 4915, 4918, 4919, 4920, 4935, 4936, 4932, - 4921, 7055, 4922, 7055, 4933, 4938, 4939, 4949, 4945, 4941, - 4951, 4955, 4944, 7055, 4956, 4957, 4959, 4948, 4961, 7055, - 4962, 4965, 4967, 4968, 7055, 4975, 4971, 4969, 4979, 4984, - 4985, 7055, 4988, 4990, 4992, 5000, 5001, 4996, 4999, 5002, - 5003, 5006, 5007, 5008, 5009, 5017, 5012, 5014, 7055, 5020, - 5022, 5029, 5030, 5031, 5023, 5033, 5034, 5037, 5039, 5040, - 7055, 5043, 5044, 5045, 5046, 5047, 5051, 5049, 5052, 5056, + 4874, 4876, 7180, 4878, 4882, 4879, 4886, 4887, 4891, 4893, + 4894, 4900, 4903, 4890, 4892, 4904, 7180, 4908, 4910, 4912, + 4919, 7180, 4914, 4915, 4917, 4918, 4920, 4922, 4925, 4926, + 4927, 4928, 7180, 4936, 4932, 4938, 4937, 4939, 4941, 4946, + 4947, 4948, 4953, 4954, 4960, 7180, 4964, 4955, 4965, 4966, + 4950, 4968, 4969, 4972, 4974, 7180, 4979, 4982, 4983, 4976, + 4992, 4995, 4985, 4993, 5002, 4994, 4998, 4997, 5001, 5004, + 5005, 5009, 5010, 5011, 5012, 5013, 5023, 5030, 5026, 5028, + 7180, 5015, 7180, 5016, 5029, 5033, 5043, 5039, 5041, 5044, + 5042, 5046, 7180, 5049, 5051, 5053, 5054, 5055, 7180, 5058, - 5062, 5058, 5060, 5063, 5067, 5070, 5071, 5073, 7055, 5076, - 5074, 5079, 5083, 5087, 5085, 5013, 7055, 5080, 7055, 5091, - 5094, 5096, 5097, 5098, 5101, 7055, 7055, 5103, 5110, 5106, - 5109, 5111, 7055, 7055, 5113, 7055, 5114, 7055, 5115, 5117, - 7055, 7055, 5116, 5119, 5122, 5123, 5125, 5127, 7055, 5135, - 7055, 5137, 5136, 5138, 5141, 5140, 5142, 7055, 5144, 5146, - 5148, 5152, 5151, 7055, 5158, 5153, 5161, 5154, 5165, 7055, - 5169, 5170, 5166, 5171, 7055, 5174, 5177, 5178, 5179, 5181, - 5182, 5186, 5192, 5184, 5187, 5188, 5199, 5193, 5196, 5202, - 5206, 5209, 5211, 5215, 5212, 5203, 5217, 5218, 5225, 5227, + 5056, 5059, 5061, 7180, 5057, 5071, 5062, 5063, 5078, 5079, + 7180, 5084, 5085, 5081, 5093, 5095, 5090, 5092, 5094, 5096, + 5098, 5100, 5101, 5102, 5111, 5104, 5107, 7180, 5109, 5116, + 5122, 5123, 5124, 5106, 5117, 5125, 5127, 5133, 5130, 7180, + 5134, 5135, 5136, 5137, 5138, 5140, 5141, 5142, 5154, 5153, + 5149, 5146, 5151, 5158, 5160, 5162, 5167, 7180, 5163, 5168, + 5169, 5178, 5179, 5180, 5185, 7180, 5181, 7180, 5182, 5186, + 5191, 5194, 5198, 7180, 5201, 5202, 5189, 5206, 7180, 7180, + 5208, 5209, 5210, 5214, 5211, 7180, 7180, 5217, 7180, 5218, + 7180, 5219, 5221, 7180, 7180, 5171, 5223, 5224, 5225, 5226, - 5220, 5223, 5229, 5230, 5231, 5233, 5235, 5236, 5238, 5240, - 5242, 5245, 5246, 5247, 5248, 5251, 5256, 5257, 5259, 5262, - 5264, 5265, 5267, 5268, 5269, 5270, 5272, 5273, 5275, 5276, - 5280, 5284, 5282, 5286, 5288, 7055, 5290, 5293, 5295, 5299, - 5298, 5300, 5304, 5307, 5311, 5313, 7055, 5316, 7055, 5319, - 5321, 5322, 5323, 5325, 7055, 5324, 5327, 5326, 5329, 5328, - 5330, 5332, 5331, 5335, 5336, 5346, 7055, 5352, 5358, 5341, - 5338, 5359, 5362, 7055, 5363, 5365, 5366, 5367, 5369, 5370, - 5371, 5373, 5374, 5378, 5376, 5375, 5380, 5389, 5381, 5390, - 5393, 7055, 5397, 5403, 5404, 5400, 5405, 5406, 5407, 5410, + 5228, 7180, 5235, 7180, 5238, 5239, 5240, 5242, 5229, 5243, + 7180, 5244, 5247, 5252, 5253, 5255, 7180, 5246, 5257, 5261, + 5274, 5260, 5256, 7180, 5270, 5272, 5273, 5276, 7180, 5279, + 5282, 5283, 5277, 5284, 5285, 5286, 5193, 5287, 5289, 5290, + 5299, 5296, 5297, 5300, 5307, 5309, 5311, 5313, 5314, 5315, + 5318, 5319, 5321, 5324, 5327, 5328, 5329, 5330, 5331, 5335, + 5337, 5334, 5343, 5345, 5338, 5347, 5354, 5355, 5356, 5340, + 5358, 5357, 5359, 5361, 5365, 5367, 5370, 5371, 5372, 5373, + 5374, 5375, 5378, 5381, 5382, 5384, 5387, 5388, 5390, 7180, + 5391, 5393, 5395, 5399, 5406, 5407, 5408, 5411, 5417, 5421, - 5409, 5411, 5416, 5412, 5415, 5417, 5429, 5433, 5437, 7055, - 5422, 7055, 5425, 5430, 5438, 5439, 5440, 5442, 5443, 5446, - 7055, 7055, 5444, 5448, 5451, 5453, 5455, 5456, 5458, 5460, - 5461, 5468, 7055, 5462, 5467, 5475, 5481, 5469, 7055, 5478, - 5483, 5484, 5486, 7055, 5487, 5488, 5490, 5491, 5496, 5489, - 5501, 5502, 5505, 5506, 5498, 5509, 5512, 7055, 7055, 7055, - 7055, 5515, 5513, 5518, 5519, 5520, 5521, 5527, 5528, 5530, - 5524, 5525, 5526, 7055, 5543, 7055, 7055, 5544, 7055, 5546, - 5538, 5548, 5547, 5531, 5554, 5556, 5558, 7055, 5559, 7055, - 5560, 5561, 5562, 5568, 5570, 5571, 5572, 5579, 5573, 5581, + 7180, 5423, 7180, 5425, 5401, 5427, 5414, 5428, 7180, 5429, + 5430, 5431, 5432, 5435, 5434, 5437, 5436, 5440, 5441, 5445, + 7180, 5447, 5461, 5450, 5455, 5457, 5463, 7180, 5465, 5468, + 5469, 5470, 5471, 5472, 5475, 5473, 5476, 5480, 5478, 5485, + 5482, 5484, 5486, 5493, 5495, 7180, 5499, 5503, 5510, 5500, + 5505, 5507, 5508, 5512, 5509, 5516, 5513, 5517, 5519, 5520, + 5521, 5524, 5528, 5535, 5536, 5543, 7180, 5525, 7180, 5540, + 5532, 5545, 5546, 5547, 5548, 5550, 5554, 7180, 7180, 5555, + 5556, 5558, 5560, 5562, 5563, 5565, 5567, 5568, 5572, 7180, + 5569, 5571, 5579, 5587, 5589, 5580, 7180, 5582, 5590, 5592, - 5575, 5582, 5589, 5585, 5587, 5584, 5592, 5595, 5602, 7055, - 7055, 5596, 5604, 5605, 5612, 5610, 5613, 5607, 5620, 5619, - 5617, 5616, 5624, 5626, 5627, 5635, 5636, 5628, 5631, 5638, - 7055, 5640, 5641, 5642, 7055, 5632, 7055, 5649, 5650, 5651, - 5652, 5653, 5658, 5659, 5660, 5662, 5664, 7055, 7055, 5657, - 5678, 5673, 7055, 7055, 5663, 5665, 5674, 5676, 5681, 5677, - 5683, 5687, 5686, 5688, 5690, 5691, 7055, 5692, 7055, 5693, - 5700, 5698, 5699, 5711, 5712, 5708, 5715, 5717, 5714, 5718, - 5720, 7055, 5719, 5721, 7055, 5729, 5727, 5731, 5732, 5737, - 5733, 7055, 5738, 5740, 5742, 5745, 7055, 5750, 5747, 5752, + 5595, 7180, 5596, 5598, 5599, 5600, 5605, 5602, 5614, 5606, + 5609, 5615, 5616, 5617, 5620, 7180, 7180, 7180, 7180, 5622, + 5624, 5626, 5627, 5629, 5630, 5632, 5635, 5636, 5634, 5638, + 5639, 7180, 5648, 7180, 7180, 5650, 7180, 5651, 5649, 5652, + 5653, 5659, 5660, 5662, 5665, 7180, 5666, 7180, 5667, 5668, + 5671, 5675, 5677, 5679, 5680, 5683, 5685, 5688, 5687, 5689, + 5696, 5695, 5697, 5691, 5703, 5702, 5710, 7180, 7180, 5704, + 5712, 5713, 5720, 5718, 5721, 5715, 5728, 5727, 5725, 5724, + 5732, 5734, 5735, 5743, 5744, 5736, 5739, 5746, 7180, 5748, + 5749, 5750, 7180, 5740, 7180, 5757, 5758, 5759, 5760, 5761, - 5753, 7055, 5755, 7055, 5756, 5759, 5760, 5767, 5763, 7055, - 5765, 5768, 7055, 5771, 5774, 5778, 5779, 5780, 5781, 7055, - 5784, 5786, 7055, 5787, 5789, 5790, 5796, 5797, 5799, 5792, - 5800, 7055, 5801, 5808, 5810, 5813, 7055, 7055, 5820, 5806, - 135, 5822, 5803, 5819, 5823, 5824, 5831, 5827, 5828, 5834, - 7055, 7055, 5835, 7055, 5829, 5838, 7055, 5836, 5842, 5846, - 5848, 5844, 5850, 5851, 5853, 5855, 5856, 5869, 5859, 5857, - 5874, 7055, 5864, 5884, 5860, 5886, 5887, 5889, 5891, 5893, - 5895, 5881, 5898, 5899, 5875, 5900, 5902, 5904, 5905, 5906, - 5908, 5909, 5911, 7055, 5913, 5917, 5918, 5920, 5922, 7055, + 5766, 5767, 5768, 5770, 5772, 7180, 7180, 5765, 5786, 5781, + 7180, 7180, 5771, 5773, 5782, 5784, 5789, 5785, 5791, 7180, + 5795, 5796, 5797, 5794, 5799, 5801, 5806, 7180, 5807, 7180, + 5808, 5811, 5813, 5816, 5823, 5824, 5819, 5826, 5830, 5827, + 5821, 5831, 7180, 5833, 5832, 7180, 5840, 5844, 5839, 5838, + 5848, 5850, 5851, 7180, 5852, 5854, 5858, 5860, 7180, 5864, + 5861, 5868, 5867, 7180, 5870, 7180, 5855, 5874, 5871, 5886, + 5877, 7180, 5878, 5881, 7180, 5888, 5891, 5893, 5894, 5895, + 5896, 7180, 5900, 5884, 7180, 5901, 5904, 5905, 5911, 5907, + 5913, 5914, 5915, 7180, 5916, 5923, 5919, 5920, 7180, 7180, - 5925, 5927, 5933, 5930, 7055, 5937, 5938, 5939, 5941, 5942, - 7055, 5943, 5945, 5953, 5954, 5946, 5949, 5956, 5862, 5963, - 7055, 5959, 5960, 5966, 7055, 7055, 7055, 5971, 5965, 5973, - 7055, 5975, 5977, 5978, 5979, 7055, 5981, 5983, 5982, 7055, - 7055, 7055, 5984, 5985, 5986, 7055, 5988, 5999, 7055, 5989, - 7055, 5996, 7055, 6000, 6002, 6010, 6004, 7055, 6014, 6012, - 6006, 6022, 7055, 6016, 6028, 6030, 6024, 5998, 6021, 6031, - 7055, 6038, 6034, 6037, 6044, 6035, 6045, 6041, 6046, 6047, - 6054, 6049, 6056, 7055, 6059, 6061, 6064, 6067, 6052, 6058, - 6060, 7055, 6050, 7055, 6077, 7055, 6072, 6078, 6079, 6080, + 5931, 5929, 197, 5938, 5926, 5928, 5935, 5936, 5945, 5940, + 5943, 5951, 7180, 7180, 5941, 7180, 5944, 5953, 7180, 5954, + 5957, 5958, 5963, 5961, 5964, 5967, 5962, 5969, 5970, 5972, + 5971, 5973, 5978, 7180, 5994, 5996, 5989, 5998, 5999, 6001, + 6003, 6005, 6009, 5991, 6011, 6012, 6013, 6014, 6015, 6017, + 6018, 6021, 6022, 6024, 6025, 7180, 6027, 6034, 5974, 6031, + 6038, 6029, 6040, 7180, 6048, 6043, 6052, 6049, 7180, 6056, + 6053, 6057, 6059, 6060, 7180, 6061, 6064, 6071, 6072, 6065, + 6067, 6073, 6075, 6077, 6088, 7180, 6078, 6080, 6081, 7180, + 7180, 7180, 6093, 6095, 6092, 7180, 6100, 6096, 6083, 6101, - 6081, 6082, 6083, 6086, 6088, 6087, 6095, 6097, 6099, 6089, - 6101, 6104, 6105, 7055, 7055, 6114, 6110, 6112, 7055, 6109, - 7055, 6119, 7055, 6120, 6121, 6122, 6123, 6126, 7055, 7055, - 6129, 6125, 6132, 6140, 6133, 6135, 7055, 6142, 6138, 6144, - 6147, 7055, 6155, 7055, 6148, 6157, 6153, 7055, 6150, 6160, - 6162, 6164, 6165, 6167, 6169, 6173, 6170, 6177, 6174, 6175, - 6176, 6184, 6188, 6178, 6189, 6194, 7055, 7055, 7055, 6197, - 6191, 6204, 6200, 6202, 6207, 6206, 7055, 6208, 6215, 6212, - 6210, 6222, 6218, 6220, 7055, 6221, 6223, 6225, 6226, 6228, - 6230, 6231, 6234, 7055, 6238, 6245, 6252, 6248, 6232, 6254, + 7180, 6103, 6104, 6105, 7180, 7180, 7180, 6107, 6109, 6111, + 7180, 6115, 6118, 7180, 6116, 7180, 6121, 7180, 6122, 6124, + 6125, 6130, 7180, 6131, 6133, 6123, 6140, 7180, 6148, 6150, + 6152, 6134, 6138, 6145, 6154, 7180, 6161, 6157, 6160, 6167, + 6153, 6156, 6163, 6169, 6170, 6178, 6173, 6176, 7180, 6177, + 6180, 6182, 6189, 6183, 6179, 6186, 7180, 6191, 7180, 6193, + 7180, 6195, 6196, 6197, 6199, 6204, 6200, 6205, 6206, 6207, + 6215, 6217, 6219, 6220, 6221, 6223, 6226, 6227, 7180, 7180, + 6237, 6229, 7180, 6233, 6241, 7180, 6230, 7180, 6245, 7180, + 6232, 6234, 6249, 6242, 6252, 7180, 7180, 6256, 6253, 6259, - 6256, 6258, 6261, 6263, 6264, 6240, 6271, 6267, 7055, 7055, - 6269, 6270, 7055, 6274, 7055, 6275, 7055, 6276, 6278, 6280, - 6279, 6281, 7055, 6284, 6285, 6287, 6288, 6289, 6295, 6291, - 6293, 7055, 6296, 6303, 6305, 6307, 6308, 7055, 7055, 6310, - 6316, 7055, 6318, 6319, 6320, 6327, 6323, 6322, 6329, 6332, - 7055, 6336, 6333, 6339, 6341, 6342, 6343, 6344, 7055, 6345, - 6346, 6348, 6349, 7055, 6352, 6351, 6354, 6356, 6357, 7055, - 6358, 6360, 6379, 6376, 7055, 6364, 6375, 6374, 7055, 7055, - 7055, 6383, 6386, 6388, 7055, 7055, 7055, 7055, 6390, 6391, - 6393, 6395, 7055, 6398, 7055, 6400, 6404, 6408, 6410, 6417, + 6266, 6261, 6263, 6264, 7180, 6269, 6265, 6267, 6272, 7180, + 6280, 7180, 6275, 6282, 6285, 7180, 6019, 6278, 6288, 6281, + 6289, 6292, 6293, 6294, 6297, 6305, 6300, 6298, 6301, 6307, + 6308, 6312, 6313, 6324, 7180, 7180, 7180, 6302, 6318, 6326, + 6328, 6329, 6336, 6322, 7180, 6334, 6342, 6343, 6331, 6351, + 6335, 6347, 7180, 6337, 6344, 6333, 6354, 6356, 6357, 6359, + 6360, 7180, 6364, 6366, 6371, 6368, 6372, 6374, 6378, 6381, + 6383, 6385, 6387, 6388, 6395, 6391, 7180, 7180, 6393, 6390, + 7180, 6398, 6402, 7180, 6394, 7180, 6399, 6403, 6404, 6405, + 6407, 7180, 6410, 6411, 6412, 6415, 7180, 6416, 6417, 6419, - 6403, 7055, 6411, 6418, 6420, 6421, 6422, 7055, 7055, 6423, - 6425, 6426, 6428, 6430, 6431, 7055, 7055, 6432, 6434, 6438, - 6435, 6437, 7055, 6440, 6443, 6450, 6447, 6453, 6460, 6462, - 6455, 6463, 6464, 6472, 6475, 6465, 6467, 6474, 6478, 6479, - 6477, 6481, 6491, 6486, 6488, 6494, 6489, 6497, 7055, 7055, - 6499, 7055, 6501, 6503, 7055, 6505, 7055, 6507, 6509, 6511, - 6514, 7055, 6516, 6518, 6520, 6522, 6524, 7055, 6525, 6527, - 6529, 6530, 6531, 6532, 7055, 6536, 6537, 6541, 6533, 6538, - 6542, 6544, 6547, 7055, 6549, 6558, 7055, 7055, 6553, 6559, - 6555, 6560, 6565, 7055, 6563, 6573, 6568, 6569, 6570, 6572, + 6433, 7180, 6420, 6428, 6424, 6430, 6434, 7180, 7180, 6435, + 6441, 7180, 6443, 6445, 6446, 6453, 6451, 6454, 6458, 6459, + 7180, 6448, 6461, 6455, 6465, 6467, 6468, 6470, 7180, 6469, + 6471, 6473, 6474, 7180, 6478, 6479, 6481, 6482, 6483, 7180, + 6484, 6486, 6497, 6487, 7180, 6500, 6501, 6502, 7180, 7180, + 7180, 6508, 6510, 6512, 7180, 7180, 7180, 7180, 6514, 6517, + 6505, 6519, 7180, 6511, 7180, 7180, 6528, 6532, 6536, 6538, + 6542, 6521, 7180, 6541, 6535, 6548, 6531, 6543, 7180, 7180, + 6550, 6545, 6552, 6553, 6555, 6556, 7180, 7180, 6559, 6560, + 6562, 6561, 6563, 7180, 6564, 6568, 6575, 6571, 6585, 6588, - 6575, 7055, 6578, 6576, 7055, 7055, 6588, 6579, 7055, 7055, - 6577, 6580, 7055, 7055, 7055, 7055, 7055, 7055, 7055, 7055, - 6593, 6596, 7055, 7055, 6595, 6587, 6602, 7055, 6605, 7055, - 6597, 6606, 6607, 6609, 7055, 6610, 7055, 6612, 6614, 6613, - 6617, 6616, 6621, 6623, 6626, 6628, 6627, 6630, 6632, 6633, - 6637, 6634, 6638, 6648, 6641, 6651, 6644, 6652, 7055, 7055, - 7055, 6640, 6656, 6662, 6658, 6666, 6668, 6671, 6673, 6663, - 6674, 6675, 6679, 6680, 6677, 6681, 6689, 6686, 6687, 6688, - 6691, 6692, 6698, 6704, 7055, 6706, 6695, 6701, 6708, 7055, - 6709, 7055, 6711, 7055, 7055, 6714, 6715, 6717, 6718, 6727, + 6590, 6577, 6591, 6593, 6600, 6601, 6579, 6583, 6597, 6603, + 6606, 6607, 6610, 6619, 6614, 6616, 6622, 6612, 6623, 7180, + 7180, 6625, 7180, 6630, 6631, 7180, 6617, 7180, 6633, 6637, + 6639, 6642, 7180, 6644, 6646, 6648, 6650, 6634, 7180, 6652, + 6654, 6656, 6657, 6569, 6651, 7180, 6659, 6662, 6664, 6665, + 6669, 6667, 6672, 6675, 7180, 6668, 6677, 7180, 7180, 6670, + 6684, 6678, 6685, 6689, 7180, 6690, 6697, 6692, 6694, 6695, + 6698, 6696, 7180, 6702, 6700, 7180, 7180, 6701, 6703, 7180, + 7180, 6710, 6711, 7180, 7180, 7180, 7180, 7180, 7180, 7180, + 7180, 6715, 6719, 7180, 7180, 6713, 6724, 6728, 7180, 6730, - 6728, 6719, 6723, 6726, 6730, 6732, 7055, 6739, 7055, 7055, - 7055, 6734, 6740, 7055, 6742, 6743, 7055, 6741, 6744, 6746, - 6750, 6751, 6748, 6752, 6753, 6769, 7055, 7055, 6754, 6759, - 6762, 6771, 6773, 6772, 6775, 6779, 6780, 6782, 6783, 6792, - 7055, 6789, 6790, 6794, 7055, 6796, 6791, 6797, 6798, 6799, - 6807, 6803, 6806, 7055, 6808, 7055, 6812, 6814, 6815, 6805, - 6813, 6816, 6827, 6825, 6821, 7055, 6831, 6835, 6833, 6837, - 6839, 6841, 6842, 6843, 6845, 6848, 6854, 6851, 6858, 6859, - 6855, 6863, 6860, 7055, 6870, 6861, 7055, 6867, 6871, 6864, - 6873, 6877, 7055, 6882, 6875, 6884, 6885, 6888, 6889, 7055, + 7180, 6717, 6725, 6733, 6721, 7180, 6732, 7180, 6735, 6738, + 6739, 6743, 6742, 6747, 6750, 6751, 6753, 6752, 6754, 6759, + 6755, 6760, 6756, 6762, 6773, 6765, 6767, 6769, 6775, 7180, + 7180, 7180, 6776, 6777, 6782, 6785, 6787, 6791, 6796, 6799, + 6788, 6793, 6800, 6801, 6804, 6802, 6805, 6814, 6810, 6811, + 6812, 6816, 6818, 6822, 6826, 7180, 6829, 6819, 6830, 6832, + 7180, 6833, 7180, 6835, 7180, 7180, 6837, 6839, 6842, 6841, + 6851, 6852, 6843, 6854, 6844, 6856, 6859, 7180, 6865, 7180, + 7180, 7180, 6847, 6855, 7180, 6862, 6866, 7180, 6869, 6872, + 6871, 6873, 6874, 6878, 6879, 6880, 6882, 7180, 7180, 6883, - 6891, 6898, 6893, 7055, 6899, 7055, 7055, 6901, 6895, 6902, - 6908, 6910, 7055, 7055, 7055, 6935, 6942, 6949, 6956, 6963, - 6970, 6977, 88, 6984, 6991, 6998, 7005, 7012, 7019, 7026, - 7033, 7040, 7047 + 6888, 6891, 6893, 6894, 6901, 6904, 6902, 6908, 6909, 6896, + 6917, 7180, 6919, 6916, 6923, 7180, 6920, 6912, 6925, 6926, + 6927, 6934, 6929, 6930, 7180, 6935, 7180, 6938, 6940, 6939, + 6941, 6942, 6950, 6953, 6951, 6955, 7180, 6933, 6957, 6947, + 6964, 6969, 6962, 6971, 6972, 6974, 6975, 6898, 6977, 6979, + 6981, 6982, 6984, 6983, 7180, 6993, 6985, 7180, 6990, 6994, + 6987, 6996, 6997, 7180, 7008, 7000, 7003, 7009, 7012, 7013, + 7180, 7017, 7024, 7014, 7180, 7025, 7180, 7180, 7026, 7018, + 7027, 7029, 7033, 7180, 7180, 7180, 7060, 7067, 7074, 7081, + 7088, 7095, 7102, 88, 7109, 7116, 7123, 7130, 7137, 7144, + + 7151, 7158, 7165, 7172 } ; -static yyconst flex_int16_t yy_def[3634] = +static const flex_int16_t yy_def[3705] = { 0, - 3615, 1, 3616, 3616, 3617, 3617, 3618, 3618, 3619, 3619, - 3620, 3620, 3621, 3621, 3622, 3622, 3615, 3623, 3615, 3615, - 3615, 3615, 3624, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3625, 3615, 3615, 3615, - 3625, 3626, 3615, 3615, 3615, 3626, 3627, 3615, 3615, 3615, - 3615, 3627, 3628, 3615, 3615, 3615, 3628, 3629, 3615, 3630, - 3615, 3629, 3629, 3631, 3615, 3615, 3615, 3615, 3631, 3632, - 3615, 3615, 3615, 3632, 3623, 3623, 3615, 3633, 3624, 3633, - 3624, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, + 3686, 1, 3687, 3687, 3688, 3688, 3689, 3689, 3690, 3690, + 3691, 3691, 3692, 3692, 3693, 3693, 3686, 3694, 3686, 3686, + 3686, 3686, 3695, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3696, 3686, 3686, 3686, + 3696, 3697, 3686, 3686, 3686, 3697, 3698, 3686, 3686, 3686, + 3686, 3698, 3699, 3686, 3686, 3686, 3699, 3700, 3686, 3701, + 3686, 3700, 3700, 3702, 3686, 3686, 3686, 3686, 3702, 3703, + 3686, 3686, 3686, 3703, 3694, 3694, 3686, 3704, 3695, 3704, + 3695, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3625, 3625, 3626, 3626, 3627, 3627, 3615, 3628, 3628, 3629, - 3629, 3630, 3630, 3629, 3631, 3631, 3615, 3632, 3632, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3696, 3696, 3697, 3697, 3698, 3698, 3686, 3699, 3699, + 3700, 3700, 3701, 3701, 3700, 3702, 3702, 3686, 3703, 3703, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3629, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3700, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, - 3623, 3623, 3623, 3623, 3623, 3623, 3615, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3615, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3615, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3629, 3623, 3623, 3623, 3623, 3623, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3686, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3686, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3686, 3694, 3694, 3694, 3694, 3694, 3694, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3615, 3623, 3615, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3615, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, + 3694, 3700, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3686, 3694, 3686, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3686, 3694, 3694, 3694, 3694, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3615, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3615, 3623, 3623, 3629, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3686, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3686, 3694, 3694, 3700, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3615, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3686, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3629, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3615, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3615, 3623, - 3615, 3615, 3623, 3615, 3615, 3623, 3623, 3615, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3700, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3686, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3686, 3694, 3686, 3686, 3694, 3686, 3686, + 3694, 3694, 3686, 3694, 3694, 3694, 3694, 3694, 3694, 3694, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3615, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3615, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3615, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3686, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3686, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3686, 3694, 3694, 3694, 3694, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3629, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3615, - 3623, 3623, 3615, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3700, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3686, 3694, 3694, 3686, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3615, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3615, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3615, - 3623, 3615, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3615, 3615, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3615, 3623, 3623, 3615, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3615, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3615, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3686, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3686, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3686, 3694, 3686, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3686, + 3686, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3686, + 3694, 3694, 3686, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3686, 3694, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3615, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3615, 3623, 3623, - 3623, 3623, 3623, 3629, 3629, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3615, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3615, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3686, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3686, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3686, 3694, 3694, 3694, + 3694, 3694, 3700, 3700, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3686, 3694, 3694, - 3623, 3623, 3623, 3615, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3615, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3615, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, + 3694, 3694, 3694, 3694, 3694, 3686, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3686, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3686, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3615, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3615, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3615, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3615, 3623, 3623, 3623, 3629, 3623, - 3623, 3623, 3623, 3623, 3615, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3615, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, + 3694, 3694, 3694, 3686, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3686, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3686, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3686, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3686, 3694, 3694, 3694, + 3700, 3694, 3694, 3694, 3694, 3694, 3694, 3686, 3694, 3694, - 3623, 3623, 3623, 3615, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3615, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3615, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3686, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3686, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3686, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3686, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3615, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3615, 3623, 3615, 3623, 3623, - 3623, 3623, 3623, 3615, 3623, 3615, 3623, 3623, 3623, 3623, - 3623, 3615, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3615, 3623, 3623, 3623, - 3623, 3629, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3686, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3686, 3694, 3686, 3694, 3694, 3694, 3694, 3694, 3686, 3694, + 3686, 3694, 3694, 3694, 3694, 3694, 3686, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3615, 3623, 3623, 3623, 3623, 3615, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3615, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3615, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3615, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3615, 3623, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3686, 3694, 3694, 3694, 3694, 3700, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3686, 3694, 3694, + 3694, 3694, 3686, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3686, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, - 3615, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3615, 3615, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3615, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3615, 3623, 3623, 3623, 3623, 3623, 3623, 3615, 3623, 3615, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3615, 3623, 3623, + 3686, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3686, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3686, 3694, 3686, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3686, 3686, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3686, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3686, 3694, 3694, 3694, 3694, 3694, 3694, 3686, 3694, 3686, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3615, 3623, 3623, - 3623, 3629, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3615, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3615, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3615, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3615, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3686, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3686, 3694, 3694, + 3694, 3700, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3686, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3686, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3686, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, - 3623, 3623, 3623, 3615, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3615, 3615, 3623, 3623, 3623, 3615, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3615, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3615, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3615, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3615, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3686, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3686, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3686, 3686, 3694, + 3694, 3694, 3686, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3686, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3686, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, - 3623, 3615, 3623, 3623, 3623, 3623, 3623, 3615, 3623, 3623, - 3623, 3615, 3623, 3623, 3623, 3623, 3623, 3623, 3615, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3629, 3623, 3615, 3623, 3623, 3623, 3615, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3615, 3623, 3615, - 3623, 3623, 3623, 3615, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3615, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3615, 3615, 3623, 3615, - 3623, 3623, 3623, 3623, 3615, 3623, 3623, 3623, 3623, 3623, + 3694, 3694, 3694, 3694, 3686, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3686, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3686, 3694, 3694, + 3694, 3694, 3694, 3686, 3694, 3694, 3694, 3686, 3694, 3694, + 3694, 3694, 3694, 3694, 3686, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3700, 3694, 3686, 3694, + 3694, 3694, 3686, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3686, 3694, 3694, 3686, 3694, 3694, + 3694, 3686, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, - 3623, 3623, 3623, 3623, 3615, 3623, 3623, 3615, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3615, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3615, 3623, 3623, 3623, 3623, - 3623, 3615, 3623, 3615, 3623, 3623, 3623, 3623, 3623, 3623, - 3615, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3615, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3615, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3615, 3623, 3623, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3686, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3686, 3686, 3694, 3686, 3694, 3694, + 3694, 3694, 3686, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3686, 3694, 3694, 3686, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3686, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3686, 3694, 3694, 3694, + 3694, 3694, 3686, 3694, 3686, 3694, 3694, 3694, 3694, 3694, + 3694, 3686, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, - 3623, 3615, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3615, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3615, 3615, 3623, 3615, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3615, 3623, 3623, 3629, 3623, 3623, 3623, 3623, 3623, - 3623, 3615, 3615, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3615, 3623, 3623, 3623, - 3623, 3615, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3615, 3623, 3623, 3623, 3623, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3686, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3686, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3686, + 3694, 3694, 3694, 3686, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3686, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3686, 3686, 3694, 3686, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3686, 3694, 3694, 3700, 3694, 3694, 3694, + 3694, 3686, 3694, 3694, 3686, 3686, 3694, 3694, 3694, 3694, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3615, 3623, 3615, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3615, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3615, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3615, 3623, - 3623, 3623, 3615, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3615, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3615, 3623, 3623, 3623, + 3694, 3694, 3694, 3686, 3694, 3694, 3694, 3694, 3694, 3694, + 3686, 3694, 3694, 3694, 3694, 3686, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3686, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3686, 3694, 3686, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3686, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3686, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, - 3623, 3623, 3623, 3623, 3623, 3623, 3615, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3615, 3623, 3615, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3629, 3623, 3615, 3623, 3623, 3623, 3623, 3623, 3615, - 3623, 3623, 3623, 3623, 3615, 3623, 3623, 3623, 3623, 3623, - 3623, 3615, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3615, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3615, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, + 3694, 3694, 3686, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3686, 3694, 3694, 3694, + 3694, 3686, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3686, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3686, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3686, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3686, 3694, 3686, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3700, 3694, 3686, 3694, 3694, 3694, 3694, 3694, 3686, 3694, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3615, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3615, 3623, 3615, 3623, - 3623, 3623, 3623, 3623, 3623, 3615, 3615, 3623, 3623, 3623, - 3623, 3623, 3615, 3615, 3623, 3615, 3623, 3615, 3623, 3623, - 3615, 3615, 3623, 3623, 3623, 3623, 3623, 3623, 3615, 3623, - 3615, 3623, 3623, 3623, 3623, 3623, 3623, 3615, 3623, 3623, - 3623, 3623, 3623, 3615, 3623, 3623, 3623, 3623, 3623, 3615, - 3623, 3623, 3623, 3623, 3615, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, + 3694, 3694, 3694, 3686, 3694, 3694, 3694, 3694, 3694, 3694, + 3686, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3686, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3686, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3686, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3686, 3694, 3686, 3694, 3694, + 3694, 3694, 3694, 3686, 3694, 3694, 3694, 3694, 3686, 3686, + 3694, 3694, 3694, 3694, 3694, 3686, 3686, 3694, 3686, 3694, + 3686, 3694, 3694, 3686, 3686, 3694, 3694, 3694, 3694, 3694, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3629, 3623, 3623, 3623, 3623, 3615, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3615, 3623, 3615, 3623, - 3623, 3623, 3623, 3623, 3615, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3615, 3623, 3623, 3623, - 3623, 3623, 3623, 3615, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3615, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, + 3694, 3686, 3694, 3686, 3694, 3694, 3694, 3694, 3694, 3694, + 3686, 3694, 3694, 3694, 3694, 3694, 3686, 3694, 3694, 3694, + 3694, 3694, 3694, 3686, 3694, 3694, 3694, 3694, 3686, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3700, 3694, 3694, 3694, 3694, 3686, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3615, - 3623, 3615, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3615, 3615, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3615, 3623, 3623, 3623, 3623, 3623, 3615, 3623, - 3623, 3623, 3623, 3615, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3615, 3615, 3615, - 3615, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3615, 3623, 3615, 3615, 3623, 3615, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3615, 3623, 3615, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3629, 3623, 3623, + 3686, 3694, 3686, 3694, 3694, 3694, 3694, 3694, 3686, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3686, 3694, 3694, 3694, 3694, 3694, 3694, 3686, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3686, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3686, 3694, 3686, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3686, 3686, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3686, + 3694, 3694, 3694, 3694, 3694, 3694, 3686, 3694, 3694, 3694, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3615, - 3615, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3615, 3623, 3623, 3623, 3615, 3623, 3615, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3615, 3615, 3623, - 3623, 3623, 3615, 3615, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3615, 3623, 3615, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3615, 3623, 3623, 3615, 3623, 3623, 3623, 3623, 3623, - 3623, 3615, 3623, 3623, 3623, 3623, 3615, 3623, 3623, 3623, + 3694, 3686, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3686, 3686, 3686, 3686, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3686, 3694, 3686, 3686, 3694, 3686, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3686, 3694, 3686, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3700, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3686, 3686, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3686, 3694, + 3694, 3694, 3686, 3694, 3686, 3694, 3694, 3694, 3694, 3694, - 3623, 3615, 3623, 3615, 3623, 3623, 3623, 3623, 3623, 3615, - 3623, 3623, 3615, 3623, 3623, 3623, 3623, 3623, 3623, 3615, - 3623, 3623, 3615, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3615, 3623, 3623, 3623, 3623, 3615, 3615, 3623, 3623, - 3629, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3615, 3615, 3623, 3615, 3623, 3623, 3615, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3615, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3615, 3623, 3623, 3623, 3623, 3623, 3615, + 3694, 3694, 3694, 3694, 3694, 3686, 3686, 3694, 3694, 3694, + 3686, 3686, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3686, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3686, 3694, 3686, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3686, 3694, 3694, 3686, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3686, 3694, 3694, 3694, 3694, 3686, 3694, + 3694, 3694, 3694, 3686, 3694, 3686, 3694, 3694, 3694, 3694, + 3694, 3686, 3694, 3694, 3686, 3694, 3694, 3694, 3694, 3694, + 3694, 3686, 3694, 3694, 3686, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3686, 3694, 3694, 3694, 3694, 3686, 3686, - 3623, 3623, 3623, 3623, 3615, 3623, 3623, 3623, 3623, 3623, - 3615, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3615, 3623, 3623, 3623, 3615, 3615, 3615, 3623, 3623, 3623, - 3615, 3623, 3623, 3623, 3623, 3615, 3623, 3623, 3623, 3615, - 3615, 3615, 3623, 3623, 3623, 3615, 3623, 3623, 3615, 3623, - 3615, 3623, 3615, 3623, 3623, 3623, 3623, 3615, 3623, 3623, - 3623, 3623, 3615, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3615, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3615, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3615, 3623, 3615, 3623, 3615, 3623, 3623, 3623, 3623, + 3694, 3694, 3700, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3686, 3686, 3694, 3686, 3694, 3694, 3686, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3686, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3686, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3686, 3694, 3694, 3694, 3694, 3686, 3694, + 3694, 3694, 3694, 3694, 3686, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3686, 3694, 3694, 3694, 3686, + 3686, 3686, 3694, 3694, 3694, 3686, 3694, 3694, 3694, 3694, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3615, 3615, 3623, 3623, 3623, 3615, 3623, - 3615, 3623, 3615, 3623, 3623, 3623, 3623, 3623, 3615, 3615, - 3623, 3623, 3623, 3623, 3623, 3623, 3615, 3623, 3623, 3623, - 3623, 3615, 3623, 3615, 3623, 3623, 3623, 3615, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3615, 3615, 3615, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3615, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3615, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3615, 3623, 3623, 3623, 3623, 3623, 3623, + 3686, 3694, 3694, 3694, 3686, 3686, 3686, 3694, 3694, 3694, + 3686, 3694, 3694, 3686, 3694, 3686, 3694, 3686, 3694, 3694, + 3694, 3694, 3686, 3694, 3694, 3694, 3694, 3686, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3686, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3686, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3686, 3694, 3686, 3694, + 3686, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3686, 3686, + 3694, 3694, 3686, 3694, 3694, 3686, 3694, 3686, 3694, 3686, + 3694, 3694, 3694, 3694, 3694, 3686, 3686, 3694, 3694, 3694, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3615, 3615, - 3623, 3623, 3615, 3623, 3615, 3623, 3615, 3623, 3623, 3623, - 3623, 3623, 3615, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3615, 3623, 3623, 3623, 3623, 3623, 3615, 3615, 3623, - 3623, 3615, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3615, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3615, 3623, - 3623, 3623, 3623, 3615, 3623, 3623, 3623, 3623, 3623, 3615, - 3623, 3623, 3623, 3623, 3615, 3623, 3623, 3623, 3615, 3615, - 3615, 3623, 3623, 3623, 3615, 3615, 3615, 3615, 3623, 3623, - 3623, 3623, 3615, 3623, 3615, 3623, 3623, 3623, 3623, 3623, + 3694, 3694, 3694, 3694, 3686, 3694, 3694, 3694, 3694, 3686, + 3694, 3686, 3694, 3694, 3694, 3686, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3686, 3686, 3686, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3686, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3686, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3686, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3686, 3686, 3694, 3694, + 3686, 3694, 3694, 3686, 3694, 3686, 3694, 3694, 3694, 3694, + 3694, 3686, 3694, 3694, 3694, 3694, 3686, 3694, 3694, 3694, - 3623, 3615, 3623, 3623, 3623, 3623, 3623, 3615, 3615, 3623, - 3623, 3623, 3623, 3623, 3623, 3615, 3615, 3623, 3623, 3623, - 3623, 3623, 3615, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3615, 3615, - 3623, 3615, 3623, 3623, 3615, 3623, 3615, 3623, 3623, 3623, - 3623, 3615, 3623, 3623, 3623, 3623, 3623, 3615, 3623, 3623, - 3623, 3623, 3623, 3623, 3615, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3615, 3623, 3623, 3615, 3615, 3623, 3623, - 3623, 3623, 3623, 3615, 3623, 3623, 3623, 3623, 3623, 3623, + 3694, 3686, 3694, 3694, 3694, 3694, 3694, 3686, 3686, 3694, + 3694, 3686, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3686, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3686, 3694, + 3694, 3694, 3694, 3686, 3694, 3694, 3694, 3694, 3694, 3686, + 3694, 3694, 3694, 3694, 3686, 3694, 3694, 3694, 3686, 3686, + 3686, 3694, 3694, 3694, 3686, 3686, 3686, 3686, 3694, 3694, + 3694, 3694, 3686, 3694, 3686, 3686, 3694, 3694, 3694, 3694, + 3694, 3694, 3686, 3694, 3694, 3694, 3694, 3694, 3686, 3686, + 3694, 3694, 3694, 3694, 3694, 3694, 3686, 3686, 3694, 3694, + 3694, 3694, 3694, 3686, 3694, 3694, 3694, 3694, 3694, 3694, - 3623, 3615, 3623, 3623, 3615, 3615, 3623, 3623, 3615, 3615, - 3623, 3623, 3615, 3615, 3615, 3615, 3615, 3615, 3615, 3615, - 3623, 3623, 3615, 3615, 3623, 3623, 3623, 3615, 3623, 3615, - 3623, 3623, 3623, 3623, 3615, 3623, 3615, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3615, 3615, - 3615, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3615, 3623, 3623, 3623, 3623, 3615, - 3623, 3615, 3623, 3615, 3615, 3623, 3623, 3623, 3623, 3623, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3686, + 3686, 3694, 3686, 3694, 3694, 3686, 3694, 3686, 3694, 3694, + 3694, 3694, 3686, 3694, 3694, 3694, 3694, 3694, 3686, 3694, + 3694, 3694, 3694, 3694, 3694, 3686, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3686, 3694, 3694, 3686, 3686, 3694, + 3694, 3694, 3694, 3694, 3686, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3686, 3694, 3694, 3686, 3686, 3694, 3694, 3686, + 3686, 3694, 3694, 3686, 3686, 3686, 3686, 3686, 3686, 3686, + 3686, 3694, 3694, 3686, 3686, 3694, 3694, 3694, 3686, 3694, - 3623, 3623, 3623, 3623, 3623, 3623, 3615, 3623, 3615, 3615, - 3615, 3623, 3623, 3615, 3623, 3623, 3615, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3615, 3615, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3615, 3623, 3623, 3623, 3615, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3615, 3623, 3615, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3615, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, - 3623, 3623, 3623, 3615, 3623, 3623, 3615, 3623, 3623, 3623, - 3623, 3623, 3615, 3623, 3623, 3623, 3623, 3623, 3623, 3615, + 3686, 3694, 3694, 3694, 3694, 3686, 3694, 3686, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3686, + 3686, 3686, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3686, 3694, 3694, 3694, 3694, + 3686, 3694, 3686, 3694, 3686, 3686, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3686, 3694, 3686, + 3686, 3686, 3694, 3694, 3686, 3694, 3694, 3686, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3686, 3686, 3694, - 3623, 3623, 3623, 3615, 3623, 3615, 3615, 3623, 3623, 3623, - 3623, 3623, 3615, 3615, 0, 3615, 3615, 3615, 3615, 3615, - 3615, 3615, 3615, 3615, 3615, 3615, 3615, 3615, 3615, 3615, - 3615, 3615, 3615 + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3686, 3694, 3694, 3694, 3686, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3686, 3694, 3686, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3686, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, + 3694, 3694, 3694, 3694, 3686, 3694, 3694, 3686, 3694, 3694, + 3694, 3694, 3694, 3686, 3694, 3694, 3694, 3694, 3694, 3694, + 3686, 3694, 3694, 3694, 3686, 3694, 3686, 3686, 3694, 3694, + 3694, 3694, 3694, 3686, 3686, 0, 3686, 3686, 3686, 3686, + 3686, 3686, 3686, 3686, 3686, 3686, 3686, 3686, 3686, 3686, + + 3686, 3686, 3686, 3686 } ; -static yyconst flex_int16_t yy_nxt[7096] = +static const flex_int16_t yy_nxt[7221] = { 0, 18, 19, 20, 21, 22, 23, 22, 18, 18, 18, 18, 18, 22, 24, 25, 26, 27, 28, 29, 30, @@ -1631,783 +1646,796 @@ static yyconst flex_int16_t yy_nxt[7096] = 48, 49, 50, 48, 49, 50, 53, 54, 53, 54, 55, 51, 55, 85, 51, 85, 85, 56, 85, 56, 58, 59, 60, 61, 85, 22, 58, 59, 60, 61, - 86, 22, 62, 64, 65, 66, 86, 97, 62, 64, - 65, 66, 87, 86, 67, 119, 88, 108, 85, 86, + 86, 22, 62, 64, 65, 66, 86, 98, 62, 64, + 65, 66, 87, 86, 67, 120, 88, 109, 85, 86, 67, 19, 20, 21, 69, 70, 71, 75, 76, 77, - 78, 86, 22, 72, 121, 86, 120, 109, 86, 79, - 161, 161, 73, 19, 20, 21, 69, 70, 71, 75, - 76, 77, 78, 188, 22, 72, 81, 82, 83, 130, + 78, 86, 22, 72, 122, 86, 121, 110, 86, 79, + 162, 162, 73, 19, 20, 21, 69, 70, 71, 75, + 76, 77, 78, 190, 22, 72, 81, 82, 83, 131, 90, 79, 90, 90, 73, 90, 86, 84, 81, 82, - 83, 90, 91, 86, 86, 98, 92, 93, 171, 84, - 94, 160, 99, 86, 110, 95, 100, 163, 86, 101, - 163, 171, 86, 112, 96, 86, 168, 168, 111, 86, - 102, 113, 137, 115, 103, 174, 116, 104, 86, 105, - 106, 180, 114, 117, 171, 118, 86, 122, 86, 126, - 107, 86, 157, 127, 86, 123, 158, 185, 86, 138, - - 159, 124, 87, 139, 86, 125, 88, 128, 181, 129, - 86, 131, 86, 140, 141, 132, 142, 143, 86, 133, - 144, 86, 148, 86, 149, 134, 86, 145, 135, 86, - 152, 146, 147, 150, 86, 136, 178, 178, 184, 151, - 153, 182, 154, 190, 155, 156, 165, 752, 165, 165, - 90, 165, 90, 90, 170, 90, 170, 170, 175, 170, - 175, 175, 173, 175, 85, 86, 85, 85, 90, 85, - 90, 90, 86, 90, 86, 85, 86, 183, 86, 90, - 91, 186, 191, 189, 86, 86, 198, 86, 192, 86, - 193, 197, 86, 86, 187, 86, 86, 86, 232, 86, - - 201, 200, 194, 195, 86, 199, 86, 196, 209, 202, - 204, 205, 86, 203, 207, 208, 86, 211, 206, 86, - 86, 217, 213, 86, 86, 214, 210, 86, 86, 220, - 212, 222, 86, 86, 227, 223, 228, 86, 215, 216, - 86, 86, 219, 86, 229, 86, 218, 86, 231, 221, - 86, 224, 225, 230, 235, 86, 233, 226, 86, 86, - 86, 86, 237, 86, 242, 234, 239, 241, 86, 86, - 240, 86, 244, 236, 86, 86, 86, 238, 86, 250, - 243, 245, 86, 254, 247, 259, 86, 246, 253, 86, - 251, 86, 256, 249, 252, 86, 260, 248, 255, 86, - - 86, 262, 86, 86, 265, 86, 86, 86, 86, 257, - 86, 261, 258, 266, 86, 270, 264, 269, 271, 273, - 263, 274, 268, 161, 161, 267, 272, 163, 86, 165, - 163, 165, 165, 276, 165, 168, 168, 170, 86, 170, - 170, 90, 170, 90, 90, 171, 90, 175, 275, 175, - 175, 277, 175, 173, 178, 178, 279, 86, 86, 86, - 86, 86, 86, 86, 86, 86, 278, 281, 86, 284, - 287, 283, 86, 280, 282, 86, 290, 289, 286, 86, - 293, 285, 86, 291, 288, 86, 294, 295, 86, 296, - 86, 86, 86, 86, 297, 317, 299, 292, 86, 304, - - 305, 300, 306, 86, 86, 86, 301, 307, 86, 308, - 309, 298, 302, 303, 86, 311, 313, 86, 86, 310, - 86, 315, 86, 316, 312, 86, 86, 86, 86, 179, - 86, 86, 323, 86, 318, 324, 330, 86, 320, 86, - 319, 321, 333, 86, 325, 314, 322, 326, 86, 327, - 86, 334, 335, 331, 337, 332, 339, 338, 86, 340, - 86, 328, 86, 329, 336, 86, 86, 343, 86, 177, - 86, 345, 346, 86, 341, 344, 347, 86, 86, 86, - 348, 86, 86, 350, 86, 349, 86, 342, 86, 86, - 352, 86, 351, 86, 354, 86, 86, 86, 359, 355, - - 86, 353, 86, 357, 358, 360, 86, 86, 356, 364, - 86, 366, 361, 86, 365, 86, 362, 368, 370, 86, - 373, 86, 363, 86, 86, 367, 86, 86, 375, 376, - 86, 86, 369, 86, 86, 86, 379, 371, 372, 380, - 378, 374, 86, 86, 385, 86, 382, 383, 384, 377, - 381, 86, 86, 387, 86, 388, 390, 86, 86, 391, - 86, 86, 86, 171, 86, 394, 86, 86, 86, 86, - 86, 386, 401, 399, 397, 395, 392, 86, 86, 389, - 402, 393, 403, 396, 86, 405, 86, 398, 86, 404, - 86, 86, 400, 86, 86, 411, 412, 86, 86, 86, - - 415, 413, 86, 406, 407, 410, 86, 86, 409, 414, - 416, 408, 86, 86, 86, 418, 86, 419, 86, 86, - 86, 86, 422, 86, 417, 423, 86, 86, 420, 424, - 427, 429, 425, 421, 86, 86, 86, 86, 86, 432, - 430, 428, 431, 86, 434, 426, 86, 436, 86, 437, - 86, 435, 86, 86, 439, 86, 433, 86, 86, 443, - 86, 86, 86, 444, 86, 86, 446, 86, 440, 86, - 442, 86, 449, 441, 438, 86, 454, 453, 451, 445, - 86, 86, 86, 447, 455, 448, 86, 450, 86, 86, - 86, 86, 456, 470, 465, 452, 86, 463, 86, 86, - - 473, 474, 176, 472, 464, 457, 86, 86, 458, 466, - 477, 467, 471, 459, 460, 461, 462, 475, 478, 86, - 86, 86, 476, 86, 468, 86, 86, 469, 86, 86, - 86, 487, 86, 488, 86, 489, 481, 479, 485, 486, - 480, 482, 483, 484, 86, 490, 86, 86, 86, 86, - 86, 86, 492, 497, 86, 86, 498, 86, 499, 86, - 493, 491, 86, 515, 86, 504, 496, 500, 494, 503, - 495, 86, 1591, 86, 501, 86, 86, 502, 505, 508, - 506, 509, 86, 86, 86, 517, 507, 511, 86, 516, - 86, 86, 518, 86, 86, 519, 510, 86, 535, 86, - - 512, 86, 533, 513, 86, 514, 86, 520, 86, 521, - 551, 86, 536, 86, 532, 522, 539, 552, 537, 523, - 534, 86, 553, 86, 524, 541, 538, 525, 86, 526, - 86, 527, 540, 86, 86, 171, 550, 561, 86, 554, - 86, 86, 86, 86, 528, 558, 555, 529, 86, 530, - 559, 531, 86, 557, 542, 543, 556, 560, 86, 86, - 563, 86, 569, 565, 544, 545, 546, 547, 548, 86, - 86, 549, 564, 566, 562, 567, 571, 86, 574, 570, - 86, 86, 572, 86, 86, 86, 575, 86, 579, 86, - 86, 86, 86, 568, 86, 573, 582, 578, 86, 577, - - 86, 576, 583, 584, 86, 86, 581, 86, 86, 171, - 589, 86, 585, 86, 580, 594, 586, 598, 590, 86, - 587, 588, 86, 595, 591, 592, 86, 597, 86, 86, - 86, 86, 86, 86, 86, 613, 86, 616, 596, 603, - 604, 86, 593, 599, 86, 600, 602, 86, 601, 615, - 665, 605, 86, 606, 86, 619, 614, 618, 86, 607, - 86, 617, 86, 86, 620, 623, 621, 608, 609, 86, - 86, 610, 611, 622, 86, 612, 86, 625, 627, 86, - 86, 86, 86, 630, 631, 628, 86, 626, 86, 624, - 86, 86, 632, 86, 629, 86, 86, 637, 635, 86, - - 636, 633, 86, 86, 86, 638, 86, 86, 86, 643, - 86, 639, 634, 644, 645, 86, 642, 86, 647, 646, - 648, 641, 640, 86, 86, 650, 86, 86, 652, 86, - 86, 86, 86, 86, 86, 86, 86, 86, 654, 658, - 86, 656, 86, 86, 649, 666, 169, 669, 651, 660, - 653, 86, 655, 86, 657, 659, 664, 668, 661, 86, - 662, 663, 667, 86, 86, 86, 86, 86, 673, 86, - 677, 86, 671, 670, 86, 672, 86, 679, 676, 680, - 674, 86, 675, 86, 86, 86, 86, 86, 683, 86, - 86, 678, 687, 686, 86, 682, 86, 86, 86, 689, - - 86, 86, 86, 681, 86, 688, 684, 685, 86, 86, - 86, 692, 690, 704, 167, 706, 691, 86, 693, 703, - 701, 705, 702, 694, 707, 695, 86, 86, 86, 86, - 708, 696, 86, 697, 709, 86, 698, 699, 710, 717, - 712, 716, 711, 700, 714, 86, 86, 715, 86, 86, - 718, 86, 721, 86, 86, 86, 725, 86, 86, 724, - 713, 719, 86, 727, 720, 86, 86, 86, 731, 86, - 729, 86, 86, 723, 722, 86, 86, 734, 86, 86, - 728, 730, 726, 86, 735, 742, 86, 739, 732, 738, - 740, 86, 171, 733, 737, 736, 741, 86, 86, 86, - - 86, 86, 86, 86, 86, 86, 86, 749, 751, 743, - 762, 86, 86, 744, 746, 86, 747, 750, 745, 753, - 748, 754, 86, 755, 756, 757, 86, 758, 86, 86, - 86, 86, 86, 759, 86, 763, 86, 166, 86, 86, - 760, 768, 782, 761, 86, 764, 769, 86, 771, 86, - 767, 770, 765, 772, 86, 766, 773, 774, 86, 775, - 86, 776, 86, 777, 86, 780, 86, 86, 778, 86, - 86, 86, 86, 86, 86, 783, 786, 86, 781, 787, - 785, 86, 779, 86, 86, 790, 791, 86, 86, 86, - 784, 793, 86, 86, 795, 86, 797, 86, 86, 86, - - 788, 86, 789, 86, 792, 86, 794, 796, 800, 804, - 86, 86, 798, 86, 812, 86, 805, 802, 801, 799, - 86, 86, 86, 807, 806, 803, 86, 86, 808, 86, - 86, 809, 810, 86, 815, 816, 86, 819, 164, 811, - 813, 817, 814, 86, 86, 820, 86, 821, 818, 86, - 822, 86, 86, 86, 824, 825, 826, 86, 86, 86, - 86, 86, 833, 86, 831, 829, 86, 86, 86, 827, - 86, 86, 823, 830, 86, 828, 834, 840, 86, 846, - 838, 832, 86, 86, 86, 835, 837, 842, 841, 836, - 839, 843, 844, 86, 86, 86, 845, 86, 86, 86, - - 86, 852, 86, 86, 850, 855, 86, 86, 853, 854, - 162, 848, 849, 847, 86, 86, 86, 858, 86, 851, - 86, 857, 859, 86, 86, 86, 865, 860, 86, 862, - 86, 856, 86, 861, 867, 868, 86, 866, 86, 870, - 86, 86, 86, 863, 864, 875, 86, 871, 869, 872, - 86, 86, 86, 873, 879, 86, 881, 877, 876, 880, - 86, 882, 86, 86, 883, 86, 86, 878, 874, 86, - 86, 885, 86, 86, 891, 86, 86, 86, 86, 892, - 86, 86, 884, 886, 887, 893, 86, 86, 888, 901, - 898, 889, 894, 890, 86, 86, 895, 897, 86, 899, - - 86, 86, 86, 86, 896, 86, 86, 86, 86, 900, - 86, 908, 86, 904, 903, 86, 86, 86, 902, 86, - 918, 905, 916, 909, 906, 907, 910, 914, 86, 86, - 911, 86, 86, 912, 913, 915, 919, 86, 86, 86, - 86, 925, 917, 920, 924, 86, 86, 86, 922, 86, - 921, 86, 923, 86, 86, 86, 929, 86, 930, 933, - 928, 926, 931, 86, 86, 927, 86, 86, 934, 86, - 179, 938, 86, 936, 941, 932, 937, 86, 939, 86, - 86, 171, 935, 944, 940, 86, 942, 86, 943, 86, - 86, 945, 86, 950, 86, 86, 946, 86, 86, 951, - - 953, 86, 954, 86, 947, 86, 948, 952, 86, 957, - 86, 949, 955, 86, 956, 86, 86, 959, 963, 86, - 960, 86, 86, 86, 86, 958, 86, 964, 965, 86, - 86, 86, 86, 86, 962, 961, 86, 979, 86, 985, - 966, 978, 981, 86, 976, 86, 968, 977, 967, 86, - 86, 969, 982, 86, 970, 980, 987, 984, 971, 86, - 986, 972, 86, 86, 86, 86, 983, 991, 973, 974, - 86, 975, 86, 86, 86, 86, 86, 989, 86, 1000, - 988, 1007, 1003, 1002, 990, 86, 992, 993, 86, 994, - 999, 86, 995, 1001, 86, 1005, 86, 996, 86, 1004, - - 86, 1009, 86, 997, 998, 1012, 86, 1008, 1013, 1010, - 86, 1006, 1025, 1014, 86, 86, 1016, 1015, 86, 86, - 1024, 1017, 86, 1011, 1018, 86, 1019, 1020, 86, 86, - 86, 1021, 1023, 86, 1022, 86, 86, 86, 86, 1027, - 86, 1031, 86, 86, 86, 1030, 86, 86, 1034, 1026, - 86, 1040, 86, 1038, 1036, 86, 1028, 1029, 1032, 86, - 1033, 86, 1035, 1041, 177, 86, 1039, 1044, 1042, 86, - 1043, 1046, 1037, 86, 1045, 86, 1048, 86, 86, 86, - 1047, 1049, 86, 86, 86, 1050, 1052, 86, 1053, 86, - 86, 1051, 1054, 86, 86, 86, 86, 86, 1056, 1057, - - 86, 1058, 1062, 86, 86, 1066, 86, 86, 1055, 1065, - 86, 86, 1064, 1060, 1059, 1063, 86, 86, 86, 1061, - 86, 86, 86, 86, 1073, 1068, 1067, 1069, 1071, 1072, - 86, 86, 86, 86, 1079, 1074, 1075, 86, 86, 1080, - 86, 1070, 1077, 86, 1082, 1078, 86, 86, 86, 86, - 86, 1081, 86, 1083, 86, 1088, 1076, 1085, 86, 86, - 1090, 1091, 86, 1089, 1093, 1084, 86, 1087, 86, 86, - 1095, 1086, 86, 86, 86, 1092, 86, 86, 1104, 86, - 1101, 86, 1099, 86, 86, 86, 86, 1094, 1096, 86, - 1105, 1097, 1098, 86, 86, 1102, 86, 1100, 1103, 1107, - - 1109, 1106, 1110, 86, 1108, 86, 86, 1112, 1114, 86, - 1113, 1111, 86, 1115, 86, 86, 86, 86, 86, 1125, - 86, 1117, 86, 1119, 1126, 86, 1116, 86, 86, 1128, - 86, 86, 1131, 86, 1118, 86, 1120, 1122, 86, 1121, - 1123, 1127, 1124, 1132, 86, 1129, 86, 86, 1130, 86, - 1133, 86, 1135, 86, 86, 1140, 1138, 1134, 1141, 1136, - 1142, 86, 86, 86, 86, 1143, 86, 1137, 86, 1146, - 1148, 86, 86, 86, 1139, 86, 1145, 86, 1150, 1144, - 1151, 1154, 86, 86, 1158, 86, 1155, 171, 1147, 1157, - 1149, 86, 86, 1152, 86, 1153, 86, 1156, 86, 1161, - - 86, 86, 86, 86, 86, 1174, 86, 1177, 86, 86, - 1175, 86, 1160, 1159, 1164, 1162, 1165, 1204, 86, 86, - 1221, 1166, 1163, 1167, 86, 86, 1176, 1168, 86, 1169, - 86, 86, 1179, 1170, 1178, 1171, 86, 1184, 86, 1181, - 1172, 1182, 1185, 86, 1183, 1173, 1180, 1186, 86, 86, - 86, 86, 86, 1188, 86, 1194, 86, 1191, 86, 86, - 86, 86, 1187, 1381, 86, 1189, 1190, 1192, 1193, 1198, - 1200, 86, 1195, 1197, 86, 1196, 1199, 1202, 1203, 1201, - 1205, 1206, 86, 86, 86, 86, 86, 86, 86, 86, - 86, 86, 86, 86, 86, 1218, 86, 1222, 86, 86, - - 86, 1217, 1223, 1220, 1207, 1208, 1209, 86, 1210, 1224, - 1219, 1229, 1225, 1211, 86, 1212, 86, 86, 1226, 1227, - 86, 1213, 86, 86, 86, 1230, 1214, 1215, 1231, 86, - 1228, 1236, 86, 1216, 86, 86, 86, 1239, 1237, 1233, - 1232, 86, 1234, 86, 1240, 86, 86, 1235, 1244, 1243, - 86, 1242, 86, 86, 86, 1238, 86, 1245, 86, 86, - 1250, 86, 1247, 86, 1241, 1248, 86, 86, 1251, 1246, - 86, 86, 1253, 86, 1249, 86, 86, 86, 86, 86, - 1252, 1260, 1262, 1254, 1255, 1257, 1258, 1259, 86, 86, - 86, 1256, 86, 1261, 86, 1263, 86, 1266, 86, 86, - - 86, 86, 86, 1264, 1271, 1276, 1272, 1273, 86, 86, - 1265, 86, 1268, 1267, 1269, 1270, 1277, 1274, 86, 1275, - 86, 86, 86, 86, 1279, 1282, 86, 86, 86, 1278, - 1283, 86, 86, 1284, 1280, 86, 1285, 86, 1286, 1281, - 1287, 86, 86, 1293, 1289, 86, 1295, 1288, 86, 86, - 86, 86, 86, 86, 1291, 1290, 1297, 1292, 86, 1299, - 86, 86, 86, 1296, 1298, 1294, 86, 1302, 86, 1300, - 1305, 86, 86, 1303, 1301, 86, 1304, 1306, 86, 86, - 1307, 86, 1312, 1308, 1309, 1313, 86, 1311, 86, 86, - 86, 86, 86, 1317, 1316, 1310, 86, 86, 1314, 86, - - 86, 1323, 86, 1321, 1324, 1325, 86, 86, 1315, 176, - 86, 86, 86, 86, 1318, 1322, 1319, 1326, 1327, 1320, - 1328, 86, 86, 1330, 1332, 86, 86, 1329, 1334, 86, - 1331, 86, 1336, 86, 86, 86, 1335, 86, 86, 86, - 86, 1333, 86, 1339, 1337, 1342, 1338, 86, 86, 86, - 1343, 86, 86, 1345, 86, 1349, 1350, 1340, 86, 1341, - 1344, 86, 86, 86, 1347, 1351, 86, 86, 86, 1346, - 86, 86, 1353, 1348, 1354, 86, 86, 1355, 1352, 1359, - 1356, 86, 1357, 86, 86, 86, 1358, 86, 1365, 86, - 1361, 86, 86, 86, 1360, 171, 86, 1367, 1368, 1366, - - 86, 86, 86, 1362, 1375, 86, 1364, 1373, 86, 86, - 1363, 1371, 1377, 1372, 1370, 1369, 1378, 1374, 86, 86, - 86, 86, 86, 86, 86, 1380, 1382, 86, 86, 1376, - 86, 86, 1385, 86, 86, 1379, 86, 1383, 1384, 86, - 1388, 1391, 86, 1386, 86, 86, 1389, 86, 86, 1387, - 1392, 1395, 1401, 1390, 86, 86, 171, 1393, 86, 1394, - 1397, 86, 1402, 1403, 1404, 86, 86, 1396, 1406, 1398, - 86, 1399, 86, 1405, 1400, 1407, 86, 86, 86, 86, - 86, 1414, 86, 1411, 86, 86, 1410, 86, 86, 1408, - 1415, 86, 1413, 169, 1409, 1417, 1416, 86, 1412, 1419, - - 86, 86, 1420, 86, 86, 86, 1421, 1418, 1423, 1424, - 86, 1422, 86, 1425, 86, 86, 86, 86, 86, 1429, - 86, 86, 86, 86, 1432, 1426, 86, 1427, 1430, 1437, - 1431, 86, 1433, 1428, 86, 86, 86, 1434, 1439, 86, - 1436, 1438, 1435, 86, 86, 1442, 86, 86, 86, 86, - 1443, 1440, 86, 1449, 1441, 1445, 1451, 86, 1444, 86, - 86, 86, 86, 1448, 86, 1446, 86, 1452, 1454, 1450, - 86, 1453, 1447, 86, 86, 1457, 86, 1459, 1458, 167, - 1456, 1455, 1460, 86, 86, 1464, 86, 86, 1462, 1463, - 86, 1474, 1461, 86, 1465, 1476, 1473, 86, 1466, 1472, - - 86, 1467, 1468, 86, 1475, 1478, 1469, 86, 86, 1477, - 86, 86, 1470, 1479, 86, 1480, 1471, 86, 1481, 86, - 1483, 86, 86, 1488, 1484, 86, 1485, 86, 1482, 86, - 86, 86, 86, 1494, 1486, 1491, 1489, 1495, 86, 86, - 1487, 86, 86, 86, 86, 1490, 1492, 1496, 1497, 1493, - 1499, 1498, 86, 86, 86, 1500, 86, 1501, 1504, 1502, - 86, 1503, 86, 1506, 1507, 1508, 1505, 86, 86, 1511, - 86, 1509, 1510, 86, 1512, 1514, 86, 86, 86, 1513, - 1515, 86, 1516, 1518, 86, 86, 86, 86, 1524, 86, - 1525, 1519, 86, 1520, 86, 86, 86, 86, 1517, 86, - - 1527, 1523, 1529, 86, 1521, 1522, 86, 1526, 86, 86, - 1528, 86, 1531, 1530, 86, 1532, 1535, 1536, 86, 1538, - 86, 86, 86, 1539, 1533, 1540, 86, 86, 86, 1537, - 86, 1541, 1544, 86, 1534, 1546, 86, 1543, 86, 1547, - 86, 86, 86, 86, 86, 1548, 1542, 1552, 86, 86, - 1545, 86, 86, 1557, 1555, 86, 86, 86, 86, 86, - 1558, 1554, 1549, 1550, 1551, 1559, 86, 86, 1560, 1553, - 1562, 86, 1556, 1563, 86, 1561, 86, 86, 86, 1565, - 86, 86, 1567, 86, 1564, 1569, 1568, 86, 86, 1576, - 1566, 1570, 1571, 86, 1572, 86, 86, 86, 86, 1574, - - 1573, 1575, 1579, 1577, 86, 1580, 86, 86, 86, 1581, - 1578, 86, 1582, 1583, 86, 1584, 86, 1587, 86, 86, - 86, 86, 171, 86, 86, 86, 1589, 1586, 1595, 1596, - 86, 86, 1598, 1585, 86, 86, 1597, 1592, 86, 86, - 1588, 1590, 86, 86, 1593, 1599, 86, 86, 1594, 86, - 1606, 1600, 86, 86, 86, 1603, 86, 86, 86, 1601, - 1604, 86, 1602, 1610, 86, 1605, 1611, 86, 166, 1613, - 86, 86, 1607, 86, 1609, 1615, 1614, 1612, 1608, 1617, - 1616, 86, 1618, 86, 1620, 86, 1621, 86, 86, 86, - 86, 1619, 1624, 1629, 86, 1625, 1627, 1626, 86, 86, - - 1622, 86, 1630, 1623, 1628, 1632, 86, 86, 1634, 86, - 1633, 86, 1631, 86, 1637, 86, 86, 86, 1638, 86, - 1639, 86, 86, 86, 1642, 1636, 86, 86, 86, 1647, - 86, 86, 1635, 1651, 1640, 1648, 1644, 1641, 86, 86, - 86, 1643, 1650, 86, 1645, 1646, 86, 86, 1649, 86, - 1652, 86, 86, 86, 1660, 86, 1653, 86, 1659, 86, - 1655, 86, 1654, 86, 1656, 86, 1657, 86, 1661, 86, - 1664, 1658, 86, 1662, 86, 1665, 1667, 1670, 1663, 1668, - 1666, 86, 1669, 86, 1671, 1676, 1672, 86, 1673, 86, - 86, 1674, 86, 86, 86, 1675, 1679, 1680, 1681, 1678, - - 86, 1682, 86, 86, 86, 86, 1683, 1684, 86, 86, - 86, 86, 86, 1685, 1677, 86, 86, 86, 86, 1686, - 86, 1692, 1691, 86, 1688, 86, 86, 86, 86, 1687, - 1689, 1694, 1690, 1695, 86, 1698, 86, 1700, 1693, 1696, - 1699, 86, 1701, 86, 86, 1697, 86, 1702, 86, 1703, - 86, 1707, 86, 1704, 1711, 1705, 86, 86, 86, 1706, - 86, 86, 1712, 1708, 1715, 86, 86, 86, 86, 1718, - 86, 86, 1709, 1717, 1710, 86, 86, 86, 1713, 86, - 86, 86, 1724, 86, 1716, 1719, 1728, 1714, 86, 86, - 1720, 86, 1727, 86, 86, 1721, 1722, 86, 1723, 1734, - - 1729, 1725, 1743, 1726, 86, 1731, 1732, 86, 1730, 1733, - 86, 86, 86, 86, 86, 1735, 1739, 1736, 86, 86, - 1740, 1737, 86, 86, 1747, 86, 1738, 86, 86, 1749, - 86, 86, 1748, 1741, 1744, 86, 1742, 86, 86, 1746, - 1752, 1754, 1745, 1750, 1751, 86, 86, 86, 1757, 86, - 1753, 1755, 86, 1760, 1761, 86, 86, 86, 1756, 86, - 86, 1758, 86, 1765, 1766, 1764, 86, 1768, 86, 1759, - 86, 86, 86, 86, 1762, 1769, 1770, 86, 1763, 86, - 86, 86, 86, 1774, 86, 86, 1767, 1771, 86, 1772, - 86, 1777, 86, 1779, 86, 1773, 86, 86, 86, 86, - - 1785, 1783, 1775, 1780, 1776, 1778, 86, 86, 1786, 86, - 86, 1781, 1784, 1782, 1789, 1788, 86, 86, 1787, 86, - 1792, 86, 86, 86, 86, 86, 86, 1795, 1798, 86, - 1799, 1793, 86, 1801, 86, 1790, 1791, 86, 1796, 1794, - 1797, 86, 86, 86, 1800, 86, 1805, 86, 1804, 171, - 1807, 1808, 86, 86, 86, 86, 1802, 1809, 86, 86, - 1803, 1814, 1806, 1811, 86, 1812, 1810, 86, 86, 1819, - 86, 86, 86, 1813, 86, 1820, 1823, 86, 1815, 1816, - 86, 1817, 86, 1824, 86, 1825, 1827, 86, 86, 1818, - 1829, 1821, 1822, 1828, 1831, 86, 86, 1833, 86, 86, - - 86, 86, 1826, 86, 86, 86, 1836, 1830, 86, 1832, - 1835, 86, 1838, 86, 1839, 86, 86, 86, 1834, 1840, - 1843, 86, 1844, 86, 86, 86, 1841, 1837, 1848, 86, - 1842, 1849, 1851, 86, 1845, 1846, 86, 86, 86, 86, - 1853, 1852, 1855, 1850, 1847, 86, 86, 1859, 86, 1858, - 1856, 1861, 1862, 1866, 1857, 86, 1854, 86, 86, 86, - 1863, 86, 1864, 1860, 86, 1865, 86, 86, 86, 86, - 86, 1867, 86, 1873, 86, 1872, 1874, 1875, 86, 86, - 1868, 1877, 86, 86, 86, 86, 1869, 86, 1870, 1876, - 1871, 86, 1880, 86, 86, 86, 1879, 1878, 1883, 1881, - - 86, 86, 86, 1882, 86, 86, 86, 86, 86, 86, - 1892, 1891, 86, 86, 1884, 1886, 1887, 86, 1888, 1894, - 1885, 86, 86, 1889, 1898, 1895, 86, 86, 1893, 1896, - 86, 1890, 86, 86, 1897, 1904, 86, 86, 86, 86, - 86, 1908, 1899, 1900, 1906, 86, 1901, 1902, 86, 86, - 1907, 86, 86, 1903, 164, 86, 86, 1905, 86, 86, - 1909, 1913, 1910, 1915, 86, 86, 1923, 86, 1916, 1912, - 1914, 1917, 86, 1911, 1918, 1922, 1924, 86, 86, 1919, - 86, 86, 86, 86, 1920, 1927, 1928, 86, 86, 86, - 1921, 86, 1925, 1931, 1929, 86, 1926, 86, 1932, 86, - - 86, 86, 1930, 86, 1933, 1941, 1936, 1935, 1934, 86, - 1938, 86, 1940, 1939, 1942, 86, 1943, 86, 86, 1937, - 86, 86, 1949, 86, 86, 86, 86, 1950, 86, 1951, - 86, 1945, 86, 1955, 86, 1947, 86, 1944, 1946, 1948, - 86, 1958, 1952, 1957, 1954, 1959, 86, 1960, 86, 86, - 1953, 86, 1956, 86, 1964, 86, 86, 1962, 1968, 86, - 1963, 1961, 86, 1969, 86, 86, 86, 86, 162, 1965, - 1970, 1973, 1975, 1967, 1966, 1977, 86, 1971, 86, 1974, - 1978, 1972, 86, 86, 1981, 1976, 86, 1979, 86, 86, - 86, 86, 1985, 86, 1982, 1989, 86, 1980, 86, 86, - - 86, 86, 1987, 86, 1990, 1984, 1986, 86, 1988, 1983, - 86, 86, 86, 86, 86, 86, 1995, 86, 1994, 1991, - 86, 1996, 1992, 86, 1998, 2004, 1993, 1997, 2002, 86, - 1999, 86, 2005, 86, 2000, 86, 2006, 2001, 86, 2008, - 86, 86, 86, 86, 2012, 86, 86, 2014, 2007, 86, - 2003, 86, 86, 86, 86, 2019, 86, 86, 86, 2013, - 2010, 2009, 2011, 2022, 86, 86, 86, 2016, 2021, 2017, - 2018, 2015, 86, 86, 86, 2026, 86, 2020, 2024, 2025, - 86, 86, 171, 86, 2030, 2023, 86, 2028, 86, 2029, - 2033, 86, 86, 86, 2031, 2027, 2037, 86, 2032, 86, - - 2035, 86, 86, 86, 86, 2034, 2039, 2038, 86, 2044, - 86, 2036, 86, 2040, 2041, 86, 2048, 86, 2047, 3615, - 2045, 86, 2042, 86, 2043, 86, 2049, 86, 2046, 2050, - 86, 2053, 2051, 2055, 2052, 2054, 86, 86, 86, 86, - 2056, 86, 2057, 86, 86, 86, 86, 86, 86, 86, - 86, 2062, 2063, 86, 86, 2067, 86, 2064, 86, 2075, - 86, 2058, 2060, 2061, 2066, 2059, 2065, 2068, 86, 86, - 86, 2074, 2076, 2070, 2071, 2073, 86, 86, 86, 86, - 2069, 2072, 86, 86, 86, 3615, 2083, 86, 86, 2077, - 86, 2086, 2078, 2087, 86, 86, 2079, 86, 2080, 2081, - - 86, 2084, 2082, 2085, 2088, 86, 2090, 86, 2089, 86, - 2091, 2095, 86, 86, 2097, 86, 2092, 2096, 2093, 86, - 86, 2094, 2098, 2099, 2101, 86, 86, 2105, 86, 86, - 86, 2102, 86, 2100, 86, 2104, 86, 2108, 86, 86, - 86, 2107, 86, 86, 86, 2113, 86, 2111, 2112, 86, - 2103, 2114, 2115, 86, 2106, 2109, 86, 86, 86, 2123, - 2110, 2116, 2117, 2118, 86, 86, 2125, 86, 2119, 86, - 86, 2126, 86, 2120, 2121, 86, 86, 2122, 2129, 86, - 2130, 2127, 2132, 86, 2124, 2128, 86, 86, 86, 86, - 2131, 86, 2133, 2136, 86, 86, 2138, 86, 86, 2134, - - 86, 2141, 2142, 86, 2144, 86, 86, 2135, 86, 2139, - 86, 2143, 2149, 2137, 86, 2146, 86, 2147, 86, 2140, - 2151, 86, 86, 2145, 86, 86, 86, 86, 2157, 2154, - 2150, 2148, 86, 86, 2155, 2160, 2162, 2152, 86, 2153, - 86, 86, 86, 2161, 86, 86, 86, 2165, 2166, 2159, - 2168, 2164, 2156, 86, 2169, 86, 86, 86, 2158, 86, - 2163, 86, 2170, 86, 2167, 86, 86, 86, 2171, 2174, - 2176, 86, 86, 86, 2179, 86, 86, 2175, 2180, 2181, - 86, 2172, 2173, 86, 86, 86, 86, 2184, 86, 2177, - 86, 2183, 86, 2188, 86, 2182, 2189, 86, 2178, 86, - - 2186, 86, 3615, 2185, 86, 2194, 86, 2195, 2187, 2192, - 2196, 2191, 86, 86, 2190, 2198, 86, 2199, 2193, 86, - 86, 2197, 2202, 86, 86, 86, 86, 86, 86, 86, - 2200, 2206, 86, 2210, 86, 2201, 86, 86, 2204, 86, - 86, 2203, 2213, 2218, 2205, 2215, 86, 2207, 2208, 2209, - 2211, 2212, 86, 2214, 86, 2216, 2217, 86, 86, 86, - 2223, 86, 2224, 86, 2222, 2225, 2227, 86, 2219, 2228, - 2226, 86, 86, 2220, 86, 86, 86, 2233, 2221, 2230, - 86, 86, 86, 86, 86, 2235, 86, 2237, 2231, 86, - 86, 2232, 2239, 2229, 2234, 2241, 2236, 86, 86, 2242, - - 86, 86, 86, 171, 86, 86, 86, 2255, 2245, 86, - 86, 86, 2240, 86, 2238, 2249, 2243, 2246, 2247, 86, - 2251, 86, 2244, 2248, 2250, 2252, 86, 2253, 86, 2254, - 86, 86, 86, 86, 86, 2497, 2256, 2257, 86, 2258, - 2259, 86, 86, 2260, 2261, 86, 2262, 86, 2263, 86, - 86, 2267, 86, 86, 2264, 2266, 86, 2265, 2268, 86, - 86, 2269, 86, 2271, 2270, 2272, 86, 86, 86, 2279, - 86, 2274, 86, 2273, 2277, 86, 86, 2278, 86, 86, - 86, 86, 86, 86, 86, 2275, 86, 2276, 2281, 86, - 2284, 2287, 2288, 86, 2280, 2283, 2282, 86, 2286, 86, - - 2290, 2285, 2291, 86, 2289, 86, 86, 2293, 2294, 2292, - 2296, 86, 86, 86, 86, 2297, 86, 2303, 2295, 86, - 86, 86, 2298, 86, 86, 2305, 86, 86, 2306, 2299, - 2300, 2301, 86, 2302, 2308, 86, 86, 2304, 86, 2307, - 2309, 2310, 86, 86, 2311, 86, 2314, 86, 86, 86, - 2312, 2313, 86, 86, 2319, 2316, 86, 2320, 2317, 2322, - 86, 2315, 86, 86, 86, 2321, 86, 86, 86, 2318, - 86, 86, 2323, 2329, 2324, 86, 2326, 2330, 2325, 2335, - 86, 86, 2328, 86, 86, 3615, 86, 2334, 2332, 2338, - 2331, 86, 2327, 2333, 86, 86, 2339, 86, 86, 2336, - - 2341, 86, 2344, 2337, 2340, 86, 86, 2342, 2345, 86, - 86, 86, 2343, 2350, 86, 2346, 2347, 2352, 2348, 86, - 86, 2353, 2349, 86, 2355, 86, 86, 86, 86, 86, - 2358, 86, 2357, 2351, 2354, 86, 2359, 86, 86, 2364, - 2360, 86, 86, 86, 2368, 86, 2365, 2361, 86, 2369, - 86, 86, 2356, 86, 2367, 2362, 2366, 86, 2363, 2370, - 2373, 86, 86, 2374, 2375, 86, 86, 2371, 2378, 86, - 86, 2372, 86, 86, 86, 2379, 86, 86, 2380, 86, - 2376, 2382, 2384, 86, 2385, 3615, 2377, 2381, 2388, 2383, - 86, 2386, 86, 2387, 86, 2390, 86, 86, 86, 2389, - - 2391, 86, 2396, 2394, 86, 86, 2392, 2397, 86, 2393, - 86, 86, 86, 86, 2399, 86, 2398, 2402, 2403, 2395, - 86, 86, 2400, 2401, 2407, 86, 86, 86, 2404, 86, - 2406, 86, 86, 86, 86, 86, 86, 86, 2415, 86, - 2405, 86, 86, 86, 2408, 2409, 2416, 2410, 2411, 2413, - 86, 2414, 2421, 2417, 86, 2419, 2412, 2418, 86, 2420, - 2422, 86, 2426, 86, 2423, 86, 86, 2425, 2432, 86, - 86, 86, 86, 2434, 86, 86, 86, 2424, 2427, 2430, - 2431, 2433, 86, 2428, 86, 86, 2437, 86, 2441, 2438, - 171, 2429, 86, 2435, 86, 2436, 2443, 2445, 2439, 2446, - - 2448, 2444, 86, 86, 86, 86, 2440, 2447, 86, 2450, - 86, 86, 2442, 86, 86, 2451, 2455, 86, 86, 2456, - 2454, 86, 86, 3615, 2459, 2457, 86, 2460, 2449, 2452, - 86, 86, 2461, 2462, 86, 86, 86, 2464, 86, 2458, - 2453, 2463, 2465, 86, 86, 86, 2466, 86, 2467, 86, - 86, 86, 2470, 86, 86, 2468, 2473, 86, 86, 86, - 2479, 86, 86, 2477, 86, 2472, 2480, 86, 86, 86, - 2469, 2474, 2471, 2475, 2476, 86, 86, 86, 86, 2481, - 2482, 2478, 86, 2488, 86, 2483, 86, 2485, 2486, 2491, - 86, 86, 86, 86, 2484, 2489, 2487, 86, 86, 2492, - - 86, 86, 2490, 86, 2502, 2493, 86, 86, 86, 86, - 86, 2494, 2495, 2500, 2506, 86, 86, 2498, 2507, 2504, - 2496, 2499, 2503, 2505, 2501, 2509, 86, 86, 86, 86, - 86, 2511, 2510, 86, 3615, 2508, 86, 86, 2516, 2517, - 86, 86, 2512, 2518, 2519, 86, 86, 2514, 86, 2515, - 86, 86, 2522, 86, 2513, 86, 2523, 2524, 2526, 86, - 2525, 2520, 86, 2521, 2527, 86, 86, 2528, 86, 86, - 86, 2529, 86, 2530, 2533, 86, 2534, 86, 2536, 86, - 86, 2532, 2538, 86, 2541, 86, 86, 86, 2531, 2535, - 2537, 2540, 2542, 86, 86, 2539, 86, 86, 86, 86, - - 86, 2543, 86, 2544, 2548, 2549, 86, 2551, 86, 86, - 86, 2546, 86, 2545, 2553, 2555, 2554, 2547, 86, 2550, - 2552, 86, 2556, 2558, 86, 86, 86, 86, 2561, 86, - 2564, 86, 86, 2560, 86, 86, 86, 2557, 86, 86, - 2570, 86, 2562, 2569, 2559, 86, 86, 86, 2563, 2566, - 2572, 2568, 2565, 2575, 86, 86, 86, 2571, 2567, 86, - 86, 2573, 2574, 2577, 86, 86, 86, 86, 2583, 86, - 86, 2585, 86, 2578, 86, 2576, 86, 2589, 2579, 2584, - 2581, 86, 2580, 86, 2586, 86, 2590, 86, 86, 2594, - 2591, 86, 2582, 2592, 86, 86, 2596, 2593, 86, 2587, - - 2598, 2588, 86, 2599, 86, 2602, 2603, 2600, 2595, 86, - 86, 86, 86, 86, 86, 2606, 86, 86, 2607, 2601, - 2597, 86, 2608, 86, 86, 2605, 2611, 86, 86, 2610, - 2604, 86, 86, 86, 86, 86, 2613, 2614, 2621, 2609, - 2615, 2616, 2618, 2619, 2612, 86, 86, 2617, 86, 86, - 2620, 86, 86, 2625, 86, 2622, 2626, 86, 86, 2627, - 2624, 86, 86, 2629, 86, 2630, 2623, 2628, 171, 86, - 86, 2636, 86, 2631, 86, 86, 2637, 2632, 86, 2633, - 86, 86, 86, 2638, 86, 2634, 2635, 2639, 86, 2644, - 3615, 2643, 86, 2642, 2640, 2641, 2647, 86, 86, 2648, - - 2649, 86, 2645, 86, 2646, 86, 2650, 2652, 2653, 86, - 2651, 2655, 86, 86, 86, 86, 86, 2657, 2654, 86, - 86, 86, 86, 2661, 2662, 86, 86, 86, 2699, 2656, - 86, 2658, 2664, 86, 2659, 86, 86, 2665, 2666, 2663, - 2660, 2667, 86, 86, 86, 2670, 86, 86, 2668, 2669, - 86, 2674, 86, 86, 2673, 2671, 86, 86, 86, 86, - 86, 2676, 86, 2684, 86, 86, 2675, 2672, 2681, 86, - 2683, 86, 2686, 86, 2680, 86, 86, 2677, 2678, 2679, - 86, 2685, 2682, 86, 86, 2692, 86, 86, 2690, 86, - 2696, 2687, 86, 86, 2697, 2688, 86, 2695, 86, 2689, - - 86, 2693, 2700, 2694, 86, 2691, 2698, 86, 2702, 86, - 86, 86, 2703, 2704, 86, 2706, 86, 2708, 2701, 86, - 2707, 2710, 86, 86, 86, 2712, 86, 86, 86, 86, - 86, 2709, 86, 2711, 2716, 86, 86, 2705, 86, 2721, - 86, 2719, 2714, 2720, 2723, 2713, 2715, 2722, 86, 86, - 86, 86, 2725, 86, 86, 86, 2718, 86, 2717, 86, - 2728, 86, 2730, 2733, 86, 86, 86, 86, 2736, 2724, - 2726, 86, 2735, 2731, 86, 2727, 2729, 2732, 86, 86, - 2734, 2739, 86, 86, 86, 2737, 2740, 86, 2743, 2744, - 86, 86, 86, 2738, 86, 86, 2745, 86, 2741, 86, - - 86, 86, 2742, 2747, 2749, 86, 86, 2750, 2748, 86, - 2746, 2751, 86, 2753, 2752, 86, 86, 2754, 2758, 86, - 2757, 2759, 86, 2760, 86, 86, 2755, 2761, 86, 2756, - 86, 86, 2765, 86, 2763, 2764, 86, 2762, 86, 2766, - 86, 2767, 86, 86, 86, 2768, 86, 2774, 86, 86, - 2776, 86, 2777, 86, 2770, 86, 2769, 2779, 86, 86, - 86, 86, 2773, 2771, 86, 2772, 2778, 2781, 2775, 86, - 86, 2780, 86, 2782, 2784, 86, 2788, 86, 86, 2790, - 86, 86, 86, 86, 2783, 86, 86, 2789, 86, 86, - 2785, 2797, 2786, 171, 2787, 86, 2793, 86, 2799, 86, - - 2795, 86, 2792, 86, 2800, 2798, 86, 2791, 86, 2794, - 2796, 86, 86, 86, 2801, 2806, 2802, 86, 2808, 2810, - 86, 2803, 2809, 2811, 86, 2807, 86, 2812, 2804, 86, - 2813, 2805, 86, 2814, 86, 86, 86, 86, 86, 86, - 86, 86, 86, 86, 86, 86, 2816, 2825, 86, 86, - 2823, 86, 2815, 2818, 86, 2817, 3615, 2819, 2820, 86, - 2829, 2821, 2822, 2824, 2826, 86, 2827, 2828, 2832, 2830, - 2831, 86, 86, 2833, 2835, 86, 86, 2837, 86, 86, - 86, 2834, 86, 86, 86, 2836, 86, 86, 86, 86, - 2841, 86, 2848, 86, 86, 2847, 3615, 2838, 2839, 2842, - - 2840, 2849, 86, 86, 2843, 2844, 86, 2845, 2846, 2853, - 86, 2855, 2852, 86, 2850, 2854, 86, 86, 86, 86, - 86, 2851, 86, 86, 86, 86, 3615, 2861, 86, 86, - 86, 2856, 2866, 2865, 2858, 86, 2857, 2860, 86, 2859, - 2863, 2867, 86, 86, 2862, 2864, 86, 2871, 2868, 2869, - 86, 86, 86, 86, 2870, 86, 86, 86, 2875, 86, - 2876, 86, 2872, 2873, 86, 2882, 86, 2881, 86, 86, - 2885, 86, 2874, 86, 86, 86, 2877, 2879, 2878, 2880, - 86, 86, 86, 2883, 2886, 2888, 2890, 2884, 86, 2887, - 2889, 86, 2891, 2892, 86, 2893, 86, 86, 2897, 86, - - 86, 86, 86, 86, 86, 2901, 2894, 2900, 2902, 86, - 2899, 86, 2898, 2904, 86, 86, 2895, 2896, 86, 86, - 2905, 2903, 86, 2908, 2910, 86, 86, 2906, 86, 2911, - 2913, 86, 86, 86, 86, 2907, 2920, 86, 86, 86, - 86, 86, 2909, 86, 86, 2914, 2915, 2916, 2912, 2917, - 2918, 86, 2919, 3615, 2922, 2923, 86, 86, 2921, 86, - 86, 86, 2924, 2929, 2925, 2926, 2927, 86, 2928, 86, - 2932, 86, 86, 86, 86, 86, 2930, 2931, 2934, 2935, - 2937, 86, 2938, 86, 86, 86, 86, 2933, 86, 2939, - 2936, 2941, 171, 2942, 86, 86, 2946, 86, 86, 2943, - - 86, 2948, 86, 2947, 2940, 86, 2944, 2951, 86, 86, - 2950, 3615, 2949, 2945, 2952, 86, 2954, 86, 86, 2956, - 86, 2955, 2953, 86, 2957, 86, 86, 2961, 2958, 86, - 86, 2959, 86, 86, 2960, 2963, 2962, 86, 2964, 86, - 86, 86, 2968, 2969, 86, 86, 2970, 2966, 86, 86, - 2972, 86, 2965, 86, 86, 86, 2971, 2976, 2975, 2974, - 2973, 2967, 86, 86, 86, 86, 86, 2977, 2978, 2979, - 86, 86, 86, 86, 2984, 86, 86, 86, 86, 2981, - 2982, 2983, 2986, 2980, 2985, 2988, 86, 86, 2987, 86, - 86, 86, 2989, 2994, 86, 2990, 86, 2995, 2991, 86, - - 86, 86, 3000, 86, 86, 86, 86, 2992, 2993, 2997, - 3005, 86, 86, 86, 2998, 2996, 2999, 3004, 3007, 3008, - 3002, 86, 3010, 3001, 86, 86, 3003, 86, 86, 3011, - 86, 86, 86, 86, 86, 3012, 3017, 3006, 3014, 3009, - 86, 3015, 86, 3018, 86, 86, 86, 3016, 3019, 3021, - 86, 86, 3023, 86, 3025, 86, 3013, 3026, 86, 3020, - 86, 3022, 3027, 86, 3028, 86, 86, 3031, 86, 86, - 3029, 3024, 86, 86, 3035, 3030, 86, 3033, 86, 3036, - 86, 86, 3039, 3040, 86, 3034, 3041, 86, 3037, 3032, - 3042, 86, 86, 86, 86, 3043, 3046, 86, 3038, 86, - - 86, 3049, 86, 86, 3050, 86, 3044, 3045, 3051, 86, - 86, 3053, 86, 86, 86, 3057, 86, 3047, 3054, 86, - 3048, 86, 3058, 86, 3061, 3052, 86, 3060, 3056, 3062, - 3059, 3055, 86, 86, 3063, 86, 86, 86, 3068, 3064, - 86, 86, 86, 3067, 86, 3070, 3071, 86, 86, 86, - 3073, 86, 3065, 3072, 3074, 86, 3066, 86, 3076, 86, - 3077, 86, 3080, 86, 86, 3069, 86, 3084, 86, 86, - 86, 3091, 86, 86, 3075, 86, 3092, 86, 3078, 3079, - 3083, 3081, 86, 3085, 3082, 3086, 3088, 86, 86, 3089, - 3135, 3093, 3095, 3087, 86, 3090, 3094, 86, 3096, 86, - - 86, 3097, 86, 3098, 86, 3099, 86, 3100, 86, 3101, - 3102, 86, 86, 86, 3105, 86, 3103, 86, 86, 86, - 3107, 86, 86, 3109, 86, 3114, 86, 3106, 3110, 3115, - 86, 86, 3104, 86, 3116, 86, 3108, 3119, 86, 3117, - 86, 3111, 3112, 86, 3113, 3121, 86, 3120, 3122, 3123, - 86, 86, 86, 3118, 86, 86, 86, 3129, 86, 86, - 3124, 3125, 86, 3126, 3127, 3130, 86, 86, 3132, 86, - 3136, 3131, 86, 86, 3128, 3137, 86, 3142, 86, 86, - 3134, 3133, 3139, 3140, 86, 3138, 86, 3144, 86, 3141, - 86, 86, 86, 3148, 86, 86, 86, 86, 86, 86, - - 3143, 86, 86, 3152, 3145, 3149, 3155, 3150, 3153, 86, - 3147, 86, 86, 86, 3156, 86, 3146, 86, 3158, 86, - 3159, 3154, 3151, 86, 3160, 86, 3161, 86, 3167, 86, - 3157, 3171, 3162, 3164, 86, 86, 3165, 86, 3163, 3166, - 3168, 86, 3169, 86, 86, 3174, 3170, 86, 86, 3173, - 86, 86, 3175, 3172, 86, 3176, 3177, 86, 86, 86, - 86, 3183, 86, 86, 3181, 86, 3178, 86, 3185, 86, - 3179, 86, 86, 86, 86, 3180, 3186, 86, 3182, 3187, - 86, 3189, 3188, 3193, 3190, 86, 3191, 3184, 3192, 3194, - 86, 86, 86, 86, 86, 86, 86, 3198, 3195, 86, - - 86, 86, 86, 3199, 3196, 3197, 3203, 3202, 86, 3205, - 86, 3200, 86, 3209, 86, 3201, 3210, 86, 86, 3206, - 3204, 3212, 86, 86, 3215, 86, 3213, 86, 3208, 3214, - 3207, 3217, 86, 86, 86, 86, 86, 3211, 86, 86, - 3220, 3223, 86, 3216, 3222, 86, 86, 3226, 86, 3218, - 3219, 86, 3221, 86, 3225, 86, 3229, 86, 3224, 3232, - 86, 86, 3233, 86, 3235, 3230, 86, 3228, 86, 3227, - 86, 3236, 3238, 86, 3239, 86, 3231, 86, 86, 3242, - 86, 3234, 86, 86, 3247, 3237, 86, 86, 86, 86, - 86, 86, 3240, 3244, 3253, 3245, 3251, 86, 3241, 3243, - - 3249, 86, 86, 3246, 86, 3254, 3248, 86, 3255, 3250, - 86, 3258, 3259, 86, 3261, 86, 3252, 86, 3260, 86, - 86, 86, 3256, 86, 3257, 86, 3263, 3264, 86, 3267, - 3265, 86, 3270, 86, 86, 86, 86, 3262, 86, 86, - 3275, 86, 3266, 86, 86, 86, 3271, 86, 3268, 3269, - 3279, 86, 3274, 86, 3272, 3615, 3278, 3280, 86, 3283, - 3277, 86, 3276, 3273, 3281, 86, 3282, 86, 3285, 86, - 3286, 86, 3284, 3287, 86, 3288, 86, 86, 3291, 3290, - 86, 3293, 86, 86, 86, 3292, 3295, 86, 86, 86, - 3289, 86, 86, 86, 86, 3301, 3302, 86, 86, 3294, - - 86, 86, 86, 3308, 86, 3309, 86, 3296, 86, 86, - 3311, 3297, 3299, 3298, 3300, 3305, 86, 3307, 86, 3304, - 86, 86, 3306, 86, 3303, 3615, 3314, 3310, 3316, 86, - 3317, 86, 86, 86, 3320, 86, 86, 3318, 3312, 3313, - 86, 3323, 86, 3322, 3315, 86, 86, 3319, 3321, 86, - 3324, 3326, 86, 3325, 86, 86, 86, 86, 86, 86, - 3329, 86, 86, 3331, 86, 86, 3332, 86, 3330, 86, - 86, 86, 3327, 86, 3328, 3341, 3342, 86, 3333, 3615, - 3337, 3334, 3335, 3336, 3338, 3339, 3344, 86, 86, 86, - 3340, 3347, 86, 3343, 3345, 3349, 86, 3346, 3350, 86, - - 3348, 86, 3352, 86, 86, 3351, 86, 3355, 86, 3353, - 3615, 86, 3357, 86, 3358, 3359, 86, 86, 3360, 3361, - 3365, 86, 3362, 86, 86, 3354, 3356, 3363, 3364, 3366, - 86, 86, 3368, 86, 86, 86, 86, 3371, 86, 86, - 3367, 86, 3375, 86, 86, 86, 3374, 86, 86, 3370, - 86, 86, 3369, 86, 3378, 3379, 86, 3380, 3372, 3373, - 86, 3383, 3384, 86, 3376, 3381, 86, 3386, 86, 3385, - 3377, 3382, 3387, 86, 3388, 86, 86, 86, 86, 3393, - 86, 3390, 3395, 3389, 3394, 86, 3391, 86, 86, 3392, - 86, 86, 86, 3402, 86, 3397, 3399, 3400, 3403, 86, - - 3405, 86, 86, 3396, 86, 3404, 3406, 86, 3398, 3401, - 86, 3409, 86, 3410, 86, 3408, 86, 3407, 86, 3413, - 86, 3414, 86, 3415, 86, 3411, 3416, 86, 3417, 86, - 3418, 86, 3419, 86, 3420, 86, 3412, 86, 86, 3423, - 86, 3424, 86, 86, 86, 86, 86, 3422, 3428, 86, - 86, 86, 3425, 3430, 86, 86, 3426, 86, 3434, 3435, - 86, 3431, 86, 3421, 3432, 3427, 86, 3433, 86, 3429, - 3437, 86, 86, 86, 3441, 3439, 86, 3436, 86, 3443, - 3444, 86, 86, 86, 3438, 86, 86, 3446, 86, 86, - 86, 86, 86, 86, 3440, 3445, 3442, 3450, 3451, 3459, - - 86, 86, 3447, 3448, 3449, 3452, 86, 3453, 86, 86, - 86, 3456, 3457, 3455, 3460, 86, 3454, 3461, 86, 86, - 86, 3458, 86, 86, 3464, 86, 86, 86, 3463, 86, - 86, 3469, 3470, 3462, 86, 3472, 86, 3466, 3468, 86, - 86, 86, 3465, 86, 3471, 86, 86, 86, 3467, 3473, - 86, 86, 3481, 86, 86, 3479, 3476, 86, 3474, 3475, - 3478, 86, 3480, 3485, 86, 86, 3483, 3488, 3477, 86, - 3487, 86, 3482, 3484, 3490, 86, 86, 3486, 3492, 86, - 3491, 86, 3493, 3494, 86, 3495, 86, 86, 86, 3489, - 86, 3498, 86, 86, 86, 3496, 3503, 3499, 3500, 86, - - 86, 86, 86, 3507, 86, 86, 3506, 3497, 86, 3502, - 3509, 86, 3505, 3504, 86, 3501, 3510, 86, 3511, 86, - 3514, 86, 86, 3512, 86, 3508, 3517, 86, 86, 3518, - 86, 86, 86, 3513, 3521, 3522, 86, 3515, 3519, 86, - 86, 86, 3516, 86, 3527, 86, 3523, 86, 3526, 3524, - 3520, 3528, 86, 86, 86, 86, 86, 86, 3525, 86, - 3532, 86, 3534, 86, 86, 86, 86, 86, 3529, 3531, - 3539, 3540, 86, 3530, 3533, 86, 3536, 3537, 3535, 3547, - 3538, 3541, 86, 3545, 86, 86, 86, 3542, 86, 3548, - 3543, 3546, 86, 86, 3544, 86, 86, 3549, 3550, 3553, - - 3551, 3554, 86, 86, 86, 86, 3556, 86, 3555, 86, - 86, 86, 86, 3557, 3562, 3552, 86, 3559, 86, 86, - 86, 86, 3565, 3558, 3566, 86, 86, 86, 86, 86, - 3560, 3561, 3564, 3569, 86, 3563, 3567, 3570, 86, 3568, - 86, 3573, 3572, 3574, 86, 3571, 86, 3575, 86, 3577, - 86, 3579, 86, 3580, 86, 86, 86, 3584, 86, 3581, - 3615, 86, 3582, 3587, 86, 3578, 3585, 86, 86, 3586, - 3576, 86, 86, 86, 86, 3583, 86, 86, 3588, 3589, - 86, 3591, 3593, 86, 86, 3595, 86, 3590, 86, 3596, - 86, 3599, 3592, 3594, 3600, 86, 3597, 86, 86, 3603, - - 3604, 86, 86, 3606, 86, 3598, 86, 3601, 86, 3605, - 3607, 86, 86, 3608, 86, 86, 3602, 3609, 3615, 3610, - 3613, 86, 3614, 86, 3615, 3615, 3615, 3611, 3615, 3615, - 3615, 3615, 3615, 3615, 3612, 47, 47, 47, 47, 47, - 47, 47, 52, 52, 52, 52, 52, 52, 52, 57, - 57, 57, 57, 57, 57, 57, 63, 63, 63, 63, - 63, 63, 63, 68, 68, 68, 68, 68, 68, 68, - 74, 74, 74, 74, 74, 74, 74, 80, 80, 80, - 80, 80, 80, 80, 89, 89, 3615, 89, 89, 89, - 89, 161, 161, 3615, 3615, 3615, 161, 161, 163, 163, - - 3615, 3615, 163, 3615, 163, 165, 3615, 3615, 3615, 3615, - 3615, 165, 168, 168, 3615, 3615, 3615, 168, 168, 170, - 3615, 3615, 3615, 3615, 3615, 170, 172, 172, 3615, 172, - 172, 172, 172, 175, 3615, 3615, 3615, 3615, 3615, 175, - 178, 178, 3615, 3615, 3615, 178, 178, 90, 90, 3615, - 90, 90, 90, 90, 17, 3615, 3615, 3615, 3615, 3615, - 3615, 3615, 3615, 3615, 3615, 3615, 3615, 3615, 3615, 3615, - 3615, 3615, 3615, 3615, 3615, 3615, 3615, 3615, 3615, 3615, - 3615, 3615, 3615, 3615, 3615, 3615, 3615, 3615, 3615, 3615, - 3615, 3615, 3615, 3615, 3615 - + 83, 90, 91, 86, 99, 86, 111, 86, 113, 84, + 86, 100, 265, 92, 93, 101, 114, 94, 102, 86, + 112, 86, 95, 116, 96, 86, 117, 115, 86, 86, + 158, 97, 86, 118, 159, 119, 161, 103, 160, 86, + 123, 104, 138, 210, 105, 172, 106, 107, 124, 164, + 86, 127, 164, 86, 125, 128, 181, 108, 126, 175, + + 86, 139, 169, 169, 87, 140, 179, 179, 88, 129, + 172, 130, 86, 132, 86, 141, 142, 133, 143, 144, + 86, 134, 145, 86, 149, 86, 150, 135, 86, 146, + 136, 86, 153, 147, 148, 151, 86, 137, 183, 185, + 182, 152, 154, 258, 155, 186, 156, 157, 166, 86, + 166, 166, 90, 166, 90, 90, 171, 90, 171, 171, + 176, 171, 176, 176, 174, 176, 85, 86, 85, 85, + 90, 85, 90, 90, 86, 90, 86, 85, 86, 184, + 86, 90, 91, 187, 86, 191, 86, 188, 192, 193, + 86, 86, 201, 86, 86, 86, 194, 200, 86, 86, + + 189, 86, 195, 212, 196, 86, 204, 203, 199, 197, + 198, 202, 86, 211, 206, 205, 207, 208, 86, 86, + 220, 86, 86, 214, 209, 216, 86, 86, 217, 86, + 86, 86, 213, 215, 223, 231, 86, 86, 86, 225, + 222, 218, 219, 226, 230, 221, 228, 235, 86, 86, + 233, 229, 86, 86, 224, 232, 234, 86, 86, 227, + 86, 238, 86, 86, 240, 236, 86, 86, 242, 86, + 246, 86, 243, 237, 86, 248, 239, 86, 244, 86, + 241, 86, 86, 86, 249, 254, 245, 247, 86, 251, + 250, 86, 260, 86, 257, 259, 255, 86, 253, 86, + + 256, 86, 86, 252, 263, 162, 162, 266, 86, 261, + 269, 86, 262, 86, 267, 264, 86, 268, 272, 270, + 276, 274, 86, 273, 86, 275, 164, 277, 301, 164, + 166, 271, 166, 166, 86, 166, 169, 169, 278, 171, + 86, 171, 171, 90, 171, 90, 90, 172, 90, 176, + 279, 176, 176, 86, 176, 174, 179, 179, 280, 281, + 86, 86, 86, 285, 86, 86, 86, 86, 86, 86, + 286, 86, 86, 292, 282, 288, 284, 287, 283, 289, + 296, 86, 291, 294, 86, 290, 86, 297, 86, 293, + 295, 86, 300, 299, 302, 86, 86, 86, 319, 303, + + 86, 305, 86, 310, 86, 86, 306, 311, 312, 298, + 315, 307, 86, 313, 86, 86, 304, 308, 309, 314, + 316, 86, 86, 86, 317, 86, 321, 320, 322, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 329, 324, + 330, 318, 336, 86, 326, 323, 325, 327, 328, 86, + 331, 339, 338, 332, 337, 333, 341, 86, 86, 340, + 343, 86, 86, 344, 345, 346, 86, 334, 342, 335, + 86, 86, 349, 86, 86, 351, 86, 352, 86, 350, + 347, 86, 348, 353, 86, 86, 354, 356, 86, 86, + 86, 355, 86, 86, 358, 86, 359, 86, 357, 86, + + 86, 360, 86, 361, 366, 364, 86, 86, 86, 371, + 86, 367, 362, 365, 372, 86, 363, 86, 86, 377, + 86, 368, 373, 369, 375, 86, 86, 380, 370, 86, + 86, 86, 376, 86, 86, 382, 374, 86, 86, 383, + 386, 385, 387, 86, 378, 379, 86, 389, 86, 381, + 384, 86, 86, 86, 86, 390, 395, 388, 86, 392, + 394, 86, 86, 397, 86, 391, 398, 172, 86, 86, + 86, 86, 393, 401, 86, 86, 86, 400, 409, 402, + 396, 406, 404, 399, 86, 86, 410, 86, 86, 403, + 408, 405, 86, 411, 86, 413, 86, 86, 407, 412, + + 86, 86, 414, 86, 86, 86, 86, 421, 86, 417, + 415, 422, 419, 86, 86, 416, 423, 418, 86, 424, + 425, 86, 427, 86, 426, 86, 428, 86, 86, 86, + 420, 431, 86, 86, 86, 436, 432, 86, 86, 438, + 172, 86, 433, 429, 430, 86, 434, 86, 440, 439, + 86, 86, 437, 435, 86, 441, 86, 443, 86, 445, + 446, 86, 86, 444, 86, 86, 86, 86, 452, 86, + 448, 86, 442, 86, 453, 86, 86, 451, 86, 449, + 455, 86, 458, 450, 463, 447, 86, 454, 86, 460, + 86, 86, 456, 457, 464, 86, 459, 86, 86, 86, + + 462, 86, 479, 474, 180, 86, 461, 465, 86, 86, + 472, 86, 487, 86, 475, 473, 476, 466, 480, 86, + 467, 481, 486, 86, 86, 468, 469, 470, 471, 477, + 484, 86, 478, 482, 483, 485, 86, 86, 86, 490, + 488, 86, 86, 489, 496, 86, 86, 498, 86, 86, + 494, 495, 491, 497, 86, 492, 493, 86, 499, 86, + 86, 86, 86, 86, 502, 507, 86, 86, 508, 501, + 509, 86, 503, 86, 500, 525, 86, 514, 506, 510, + 504, 513, 505, 86, 86, 86, 511, 86, 86, 515, + 516, 521, 86, 512, 527, 518, 517, 519, 86, 526, + + 86, 520, 528, 86, 522, 86, 86, 523, 86, 524, + 529, 86, 530, 86, 531, 86, 86, 86, 634, 543, + 532, 86, 86, 545, 533, 549, 542, 86, 546, 534, + 86, 547, 535, 86, 536, 86, 537, 544, 86, 548, + 562, 550, 560, 172, 551, 563, 86, 561, 86, 538, + 568, 178, 539, 86, 540, 86, 541, 86, 86, 552, + 553, 564, 569, 86, 566, 86, 86, 567, 565, 554, + 555, 556, 557, 558, 571, 86, 559, 570, 576, 86, + 86, 572, 86, 86, 86, 86, 574, 578, 577, 575, + 86, 573, 86, 86, 86, 583, 586, 584, 86, 580, + + 582, 86, 86, 581, 86, 579, 86, 587, 585, 86, + 589, 591, 86, 86, 588, 590, 86, 86, 594, 595, + 596, 86, 86, 86, 86, 593, 601, 86, 86, 592, + 600, 606, 597, 602, 86, 609, 86, 598, 86, 599, + 603, 604, 86, 86, 86, 86, 607, 86, 86, 86, + 625, 86, 655, 615, 616, 610, 86, 614, 605, 611, + 626, 608, 86, 612, 86, 617, 613, 618, 86, 627, + 86, 629, 630, 619, 628, 86, 86, 86, 86, 86, + 633, 620, 621, 632, 635, 622, 623, 86, 86, 624, + 86, 637, 639, 86, 86, 86, 631, 86, 642, 640, + + 643, 638, 86, 86, 86, 86, 86, 636, 641, 644, + 86, 86, 86, 649, 86, 647, 648, 645, 86, 86, + 86, 650, 653, 86, 646, 656, 651, 657, 86, 86, + 659, 654, 86, 86, 86, 662, 86, 660, 652, 86, + 658, 86, 664, 86, 86, 86, 86, 86, 86, 86, + 86, 666, 670, 86, 661, 668, 86, 677, 663, 86, + 665, 672, 86, 86, 682, 667, 669, 177, 671, 679, + 676, 673, 86, 674, 675, 86, 678, 681, 86, 86, + 86, 680, 86, 86, 86, 686, 86, 684, 86, 86, + 685, 690, 683, 86, 687, 689, 692, 86, 693, 688, + + 86, 86, 86, 695, 86, 696, 86, 86, 691, 86, + 86, 699, 86, 86, 700, 702, 86, 701, 86, 86, + 86, 86, 694, 697, 86, 717, 86, 698, 703, 705, + 86, 719, 704, 86, 706, 716, 86, 86, 714, 707, + 715, 708, 725, 718, 86, 86, 720, 709, 721, 710, + 722, 724, 711, 712, 723, 86, 86, 730, 86, 713, + 86, 86, 726, 86, 734, 729, 86, 86, 731, 86, + 86, 727, 86, 732, 728, 737, 733, 86, 738, 86, + 740, 86, 86, 86, 742, 86, 744, 736, 86, 735, + 86, 86, 86, 86, 739, 747, 741, 743, 86, 172, + + 748, 86, 745, 86, 751, 753, 86, 86, 750, 172, + 746, 749, 752, 754, 755, 86, 86, 760, 756, 86, + 86, 86, 757, 86, 86, 86, 86, 86, 763, 765, + 759, 86, 768, 86, 758, 769, 761, 762, 764, 767, + 86, 86, 771, 772, 86, 86, 86, 86, 86, 86, + 766, 86, 770, 86, 774, 86, 773, 86, 777, 775, + 778, 776, 783, 782, 779, 86, 86, 784, 86, 786, + 86, 780, 787, 86, 781, 788, 789, 86, 785, 790, + 86, 86, 791, 86, 792, 86, 86, 795, 86, 793, + 86, 86, 86, 86, 797, 86, 86, 796, 798, 801, + + 800, 794, 86, 86, 86, 799, 806, 802, 805, 86, + 86, 86, 86, 86, 808, 86, 810, 86, 803, 86, + 86, 812, 804, 86, 86, 86, 86, 86, 815, 807, + 813, 809, 820, 811, 819, 86, 86, 86, 814, 822, + 86, 817, 86, 816, 823, 86, 818, 824, 825, 821, + 86, 827, 86, 86, 86, 826, 86, 830, 831, 834, + 828, 829, 86, 86, 86, 86, 837, 836, 832, 86, + 86, 833, 835, 840, 839, 86, 86, 86, 86, 86, + 841, 86, 86, 86, 846, 844, 848, 86, 838, 86, + 86, 86, 842, 86, 845, 843, 86, 855, 849, 86, + + 86, 170, 847, 86, 851, 853, 856, 852, 86, 850, + 86, 854, 866, 857, 858, 859, 86, 86, 86, 860, + 86, 86, 86, 861, 867, 869, 862, 865, 86, 86, + 86, 86, 870, 868, 863, 864, 86, 86, 86, 874, + 86, 881, 872, 86, 875, 86, 86, 86, 86, 86, + 86, 878, 86, 876, 873, 884, 877, 86, 883, 86, + 886, 871, 86, 86, 887, 879, 880, 882, 86, 888, + 891, 889, 885, 86, 895, 892, 86, 86, 893, 896, + 86, 86, 897, 86, 86, 899, 890, 86, 894, 901, + 86, 86, 86, 86, 86, 907, 86, 86, 86, 86, + + 908, 86, 898, 900, 86, 86, 909, 86, 902, 903, + 904, 86, 905, 910, 906, 86, 86, 912, 914, 911, + 917, 86, 916, 86, 913, 86, 86, 915, 86, 86, + 919, 918, 86, 920, 86, 86, 924, 86, 86, 86, + 86, 86, 921, 86, 168, 926, 922, 923, 932, 86, + 934, 86, 925, 927, 933, 928, 929, 930, 931, 86, + 937, 86, 86, 935, 86, 936, 86, 941, 86, 940, + 86, 86, 938, 86, 86, 86, 939, 86, 945, 946, + 86, 86, 947, 86, 942, 949, 944, 86, 950, 943, + 86, 86, 957, 86, 952, 86, 86, 86, 86, 951, + + 953, 948, 955, 172, 954, 962, 86, 956, 958, 959, + 86, 961, 86, 86, 960, 86, 964, 86, 967, 86, + 86, 86, 968, 970, 86, 971, 86, 963, 86, 965, + 969, 974, 86, 86, 86, 972, 86, 86, 966, 86, + 977, 86, 981, 86, 86, 86, 978, 973, 86, 86, + 983, 975, 982, 976, 86, 86, 86, 86, 86, 980, + 86, 86, 86, 984, 979, 1018, 996, 997, 999, 994, + 86, 86, 167, 995, 985, 986, 86, 86, 987, 1000, + 998, 988, 86, 86, 1003, 989, 1002, 1001, 990, 86, + 1004, 86, 86, 86, 1009, 991, 992, 1008, 993, 86, + + 86, 86, 1005, 86, 86, 86, 86, 1007, 1021, 86, + 1006, 86, 1010, 1011, 86, 1012, 86, 1366, 1013, 1017, + 1023, 1020, 1019, 1014, 1026, 86, 86, 86, 86, 1015, + 1016, 1025, 1027, 1022, 86, 1033, 1024, 1030, 1031, 1029, + 1028, 86, 1034, 1032, 86, 86, 86, 86, 1037, 86, + 86, 1036, 86, 1039, 1038, 1041, 86, 1040, 86, 86, + 1035, 1042, 86, 86, 86, 86, 86, 1045, 86, 1049, + 1043, 86, 86, 1048, 86, 86, 1052, 86, 86, 1058, + 86, 1044, 165, 86, 1046, 1047, 1050, 1056, 1051, 1054, + 1053, 86, 1059, 86, 86, 1062, 1057, 1060, 86, 1061, + + 1055, 86, 1063, 1064, 86, 86, 1066, 1067, 86, 86, + 1065, 86, 86, 86, 1068, 1070, 86, 1071, 86, 1069, + 86, 1072, 86, 86, 86, 86, 86, 1074, 1075, 86, + 1076, 1080, 86, 86, 1084, 86, 1083, 86, 1073, 86, + 86, 1082, 1078, 1077, 1081, 86, 86, 86, 1079, 86, + 86, 86, 86, 86, 1092, 1087, 1088, 1085, 1090, 1091, + 86, 86, 86, 86, 1086, 1093, 1094, 86, 86, 1098, + 86, 1096, 86, 1089, 1099, 86, 1097, 86, 1101, 86, + 86, 1100, 86, 1102, 86, 1107, 1095, 86, 1104, 1103, + 86, 86, 1109, 1108, 1110, 86, 1105, 86, 1106, 86, + + 86, 86, 1112, 86, 86, 1111, 86, 86, 1113, 86, + 1120, 1114, 1118, 163, 1123, 86, 86, 86, 86, 1115, + 86, 1117, 1116, 86, 1124, 1121, 86, 1119, 1122, 1125, + 86, 1130, 1126, 86, 86, 86, 1129, 1127, 86, 1132, + 1128, 1133, 86, 86, 86, 86, 86, 1131, 86, 86, + 1144, 86, 1136, 1138, 1134, 86, 86, 1145, 1135, 86, + 86, 1147, 86, 86, 1137, 86, 1139, 86, 1141, 1152, + 1140, 1142, 1150, 1146, 1148, 1143, 86, 1151, 86, 86, + 86, 86, 1149, 86, 86, 1160, 1157, 86, 1159, 1153, + 1161, 86, 1155, 86, 86, 86, 86, 1162, 1154, 86, + + 1156, 1165, 1167, 86, 86, 1158, 86, 86, 1164, 86, + 86, 1163, 1173, 1170, 1169, 86, 86, 1174, 172, 1166, + 1176, 1175, 1168, 86, 1177, 86, 1171, 86, 1172, 86, + 86, 86, 86, 86, 1181, 86, 86, 1178, 86, 86, + 1195, 86, 1180, 1194, 86, 1179, 1184, 86, 1185, 1182, + 86, 1196, 1244, 1186, 86, 1183, 1197, 1187, 86, 1198, + 86, 1188, 86, 1189, 86, 86, 1200, 1190, 1202, 1191, + 86, 86, 86, 86, 1192, 1199, 1203, 1205, 1204, 1193, + 1201, 1207, 1206, 86, 1208, 86, 86, 86, 1211, 1209, + 86, 86, 1212, 86, 86, 1215, 86, 86, 1214, 86, + + 86, 1210, 1213, 86, 1220, 1216, 1219, 86, 1218, 1221, + 1223, 1224, 1222, 86, 1217, 1226, 86, 86, 1225, 86, + 86, 1227, 1228, 86, 86, 86, 86, 86, 86, 1242, + 1239, 86, 1229, 86, 86, 86, 1238, 86, 86, 1243, + 1240, 1230, 86, 1231, 86, 1241, 1250, 1245, 1232, 1246, + 1233, 86, 86, 1249, 86, 86, 1234, 1247, 86, 1251, + 86, 1235, 1236, 1248, 86, 1257, 86, 1252, 1237, 1253, + 86, 86, 86, 1260, 1254, 1258, 86, 86, 1255, 86, + 1261, 1263, 1256, 86, 86, 86, 1265, 86, 86, 1266, + 1259, 1262, 86, 86, 1271, 86, 1264, 1268, 86, 86, + + 86, 86, 1269, 1270, 1267, 86, 1274, 1272, 86, 86, + 86, 86, 86, 86, 1273, 86, 1281, 1283, 86, 1275, + 1279, 1278, 1276, 86, 1280, 1277, 86, 1285, 86, 1282, + 86, 86, 86, 1287, 1284, 86, 86, 86, 86, 86, + 1292, 1297, 1293, 1294, 86, 1289, 1286, 86, 1295, 1288, + 1290, 1291, 86, 1296, 1298, 86, 86, 86, 86, 1300, + 86, 1303, 86, 86, 1299, 86, 1304, 86, 1308, 1301, + 86, 1305, 1309, 1302, 1306, 86, 86, 1307, 86, 86, + 1315, 86, 1317, 1310, 86, 86, 86, 86, 86, 86, + 1319, 1311, 1313, 1314, 1312, 86, 1321, 86, 86, 1318, + + 1322, 1316, 86, 1320, 86, 86, 86, 1324, 1323, 1325, + 1328, 86, 86, 86, 1326, 1327, 1329, 86, 86, 1331, + 86, 1334, 1335, 86, 1330, 86, 1333, 86, 86, 86, + 1339, 1338, 86, 1332, 1336, 86, 1337, 86, 86, 86, + 1345, 1343, 1346, 1347, 86, 86, 86, 1364, 86, 86, + 1340, 86, 1344, 86, 1341, 1350, 1348, 1342, 1349, 86, + 1352, 86, 86, 1354, 1351, 86, 86, 1353, 1356, 86, + 86, 1358, 86, 86, 86, 1357, 86, 86, 1359, 86, + 86, 1361, 1360, 1365, 86, 1355, 86, 86, 86, 1367, + 1371, 1372, 86, 86, 1373, 1362, 86, 86, 1363, 1369, + + 86, 86, 1376, 86, 1368, 86, 1375, 1370, 1374, 86, + 86, 1377, 1381, 86, 86, 86, 86, 86, 86, 1378, + 172, 1379, 86, 1383, 1387, 86, 86, 86, 1380, 86, + 1388, 1382, 1389, 86, 1384, 86, 86, 1386, 1390, 86, + 1391, 1393, 1385, 1392, 1395, 1396, 86, 1394, 1398, 86, + 86, 1400, 1401, 86, 86, 86, 180, 86, 86, 1403, + 86, 1397, 1404, 86, 86, 86, 86, 86, 1405, 1402, + 1399, 1408, 86, 86, 1410, 1411, 86, 86, 1406, 1407, + 1412, 86, 1409, 1415, 86, 86, 86, 86, 86, 86, + 86, 1413, 1431, 1419, 1425, 1416, 1414, 86, 86, 1426, + + 86, 1418, 1421, 1417, 86, 1427, 1428, 86, 1420, 86, + 86, 1422, 86, 1423, 86, 86, 1424, 1429, 1430, 86, + 1435, 86, 86, 1434, 86, 1438, 86, 1439, 1432, 86, + 1433, 86, 86, 1437, 86, 1441, 1443, 86, 1436, 1444, + 1440, 86, 86, 86, 86, 86, 1445, 1447, 1442, 1448, + 86, 86, 1446, 1449, 86, 86, 86, 1453, 1450, 86, + 86, 86, 1456, 86, 86, 1451, 1454, 86, 1463, 86, + 1452, 1455, 1457, 1461, 86, 86, 86, 86, 1458, 1462, + 86, 1460, 1459, 86, 86, 1466, 86, 1473, 86, 1464, + 86, 1475, 1467, 86, 86, 1465, 1469, 86, 86, 1468, + + 86, 86, 1470, 1472, 86, 86, 86, 86, 1478, 1476, + 1474, 1471, 1477, 86, 86, 1497, 86, 1482, 1481, 1483, + 1480, 1479, 86, 1488, 1484, 86, 1485, 86, 1486, 1487, + 86, 1489, 86, 1499, 86, 1490, 1498, 178, 1491, 1492, + 1496, 86, 86, 1493, 1502, 86, 1500, 86, 86, 1494, + 86, 86, 1503, 1495, 1501, 1506, 1504, 86, 1505, 86, + 1507, 86, 86, 1512, 1508, 86, 1509, 86, 1510, 86, + 86, 86, 86, 1518, 1513, 1515, 1519, 86, 86, 86, + 1511, 1521, 86, 1520, 86, 1516, 86, 1514, 86, 86, + 1517, 86, 1530, 1528, 86, 1523, 86, 1522, 1531, 1532, + + 1524, 86, 1525, 1529, 1526, 1533, 1527, 86, 86, 86, + 86, 1534, 1539, 86, 86, 86, 1536, 1540, 86, 1538, + 1543, 86, 1541, 1535, 86, 86, 86, 1537, 86, 86, + 1550, 1549, 86, 1545, 86, 1544, 1542, 86, 86, 86, + 1552, 86, 1548, 86, 1546, 1547, 1551, 86, 1554, 86, + 1556, 86, 1553, 1555, 1557, 86, 1561, 86, 86, 86, + 1560, 1563, 86, 86, 1566, 1564, 86, 1558, 86, 1565, + 86, 1569, 86, 1562, 86, 86, 1559, 1571, 86, 1568, + 86, 1572, 86, 86, 86, 1577, 86, 1567, 1573, 86, + 86, 86, 86, 1582, 1570, 1580, 1574, 86, 86, 86, + + 1585, 86, 1583, 1575, 86, 1576, 86, 1579, 177, 1578, + 1584, 1581, 86, 86, 86, 1587, 86, 86, 86, 1590, + 86, 1588, 1586, 1592, 86, 1593, 1589, 86, 86, 1594, + 1591, 1595, 1596, 86, 1597, 86, 86, 86, 1599, 1600, + 1598, 86, 86, 1601, 1604, 1605, 86, 86, 1602, 86, + 86, 86, 1606, 1608, 1607, 1603, 86, 86, 86, 86, + 1612, 86, 86, 86, 86, 1609, 1613, 1614, 172, 1611, + 86, 86, 1620, 1621, 1616, 86, 1610, 86, 86, 86, + 86, 1615, 86, 1617, 86, 1624, 1622, 86, 1623, 1625, + 1618, 86, 86, 86, 1619, 1626, 86, 1632, 86, 1629, + + 86, 86, 1627, 86, 1628, 86, 1630, 86, 1636, 1638, + 86, 1631, 86, 86, 86, 1642, 86, 1640, 1633, 1635, + 1643, 86, 86, 1637, 86, 1634, 86, 86, 1647, 86, + 1639, 1645, 1641, 86, 1644, 1646, 86, 86, 1653, 1648, + 1657, 1649, 1651, 1656, 1650, 1652, 86, 1655, 1654, 86, + 86, 1659, 86, 86, 86, 86, 1660, 86, 86, 86, + 1664, 1658, 86, 1665, 1666, 86, 86, 86, 86, 86, + 86, 1661, 1663, 1669, 86, 1674, 86, 86, 86, 1662, + 1667, 1671, 1675, 1678, 86, 1668, 1670, 1672, 1673, 86, + 86, 86, 86, 86, 1676, 86, 1677, 86, 86, 86, + + 1680, 86, 1679, 1686, 86, 86, 1682, 86, 1683, 86, + 1681, 1687, 1684, 86, 1685, 172, 1691, 1689, 1688, 86, + 1692, 86, 1690, 1697, 1693, 1695, 86, 1696, 1698, 86, + 1694, 86, 86, 1700, 86, 1701, 86, 86, 86, 86, + 86, 86, 1706, 1702, 1707, 1699, 1705, 1708, 86, 1715, + 86, 86, 1709, 86, 1703, 86, 1710, 1713, 86, 86, + 1704, 86, 86, 1714, 86, 86, 86, 86, 1721, 86, + 170, 86, 86, 1720, 1717, 1711, 86, 1712, 1718, 1716, + 1719, 86, 1727, 86, 1723, 1725, 1724, 1728, 86, 1722, + 1729, 1726, 86, 1732, 86, 1730, 86, 86, 86, 86, + + 86, 86, 86, 1731, 1736, 1740, 86, 1735, 86, 86, + 86, 86, 1744, 1733, 1741, 86, 1734, 86, 86, 1737, + 1739, 1738, 1747, 1746, 86, 86, 1742, 86, 86, 1745, + 86, 86, 86, 86, 1743, 1757, 1754, 86, 86, 1756, + 86, 86, 86, 1748, 1749, 168, 1750, 1753, 86, 1751, + 1752, 86, 1755, 1763, 1760, 1761, 86, 1762, 86, 1758, + 1759, 86, 86, 86, 1765, 1764, 86, 86, 86, 1769, + 86, 86, 1767, 1770, 86, 86, 1773, 1766, 1779, 1768, + 1777, 86, 86, 1774, 86, 86, 1771, 1778, 1772, 86, + 1782, 1776, 86, 86, 1775, 86, 86, 1783, 86, 1784, + + 1780, 86, 1781, 86, 86, 1785, 1791, 86, 1790, 86, + 86, 167, 1788, 1786, 86, 86, 1787, 86, 1795, 1796, + 1794, 86, 1798, 86, 1789, 86, 86, 1792, 86, 1799, + 86, 1793, 1800, 86, 86, 86, 86, 86, 1804, 86, + 86, 1797, 86, 86, 1801, 86, 1802, 86, 1809, 1807, + 1803, 86, 1810, 86, 86, 1815, 86, 1805, 1813, 1806, + 86, 86, 1808, 1818, 1811, 86, 1816, 86, 1814, 1817, + 1812, 1819, 86, 86, 86, 1822, 86, 86, 1828, 86, + 86, 86, 1825, 86, 86, 86, 1823, 1829, 86, 1831, + 86, 86, 1820, 1821, 1824, 1826, 1827, 86, 86, 86, + + 86, 1835, 1834, 86, 1830, 1837, 1839, 1832, 86, 1833, + 1838, 86, 1840, 1841, 172, 86, 86, 1836, 86, 86, + 86, 86, 86, 86, 1850, 86, 1851, 86, 1854, 86, + 1842, 1849, 1844, 1843, 1847, 1845, 1846, 86, 86, 86, + 86, 86, 1858, 1856, 1848, 1852, 1855, 1853, 86, 1860, + 1862, 86, 86, 1859, 86, 86, 86, 1863, 86, 1857, + 86, 1861, 1865, 86, 1867, 1864, 86, 86, 1870, 86, + 1871, 1868, 86, 1866, 86, 86, 86, 86, 1876, 1875, + 86, 86, 86, 1883, 1869, 86, 1872, 86, 1880, 86, + 1874, 1881, 1873, 1878, 86, 86, 1887, 86, 1877, 1884, + + 1885, 86, 1879, 1882, 86, 86, 1888, 1890, 1891, 86, + 86, 1893, 1894, 86, 1896, 1895, 1886, 86, 86, 1898, + 1889, 86, 1897, 86, 86, 86, 86, 86, 1899, 1892, + 86, 86, 1905, 1906, 1904, 1907, 1909, 1900, 86, 86, + 86, 86, 86, 86, 1901, 1908, 1902, 86, 1912, 86, + 1903, 86, 1911, 86, 86, 86, 1913, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 1910, 1924, 1923, 86, + 86, 1914, 1918, 1919, 1915, 1917, 1916, 1920, 1921, 86, + 86, 1925, 1927, 86, 1930, 86, 1922, 1926, 86, 1931, + 86, 1928, 86, 86, 86, 86, 1929, 1935, 86, 1937, + + 86, 1932, 1938, 1939, 86, 86, 1934, 1942, 1933, 86, + 1941, 86, 1943, 86, 86, 1936, 86, 86, 86, 86, + 1940, 86, 86, 86, 1944, 86, 1948, 1945, 1950, 1958, + 86, 86, 1951, 1949, 1947, 1952, 86, 1954, 1946, 1957, + 86, 1953, 1955, 1960, 1956, 1959, 86, 86, 1963, 86, + 1962, 86, 86, 86, 86, 86, 1967, 86, 1961, 1966, + 1968, 86, 86, 86, 1964, 86, 86, 1976, 1977, 86, + 86, 1965, 1971, 86, 1975, 1973, 1969, 1970, 1974, 86, + 86, 1972, 86, 86, 86, 86, 1978, 86, 86, 1984, + 1979, 86, 1986, 1980, 1985, 86, 1987, 1982, 86, 1990, + + 1981, 1983, 86, 86, 86, 1991, 86, 86, 1994, 1989, + 86, 1996, 1995, 1988, 86, 1993, 86, 86, 86, 1992, + 86, 2000, 2001, 1998, 2004, 1997, 1999, 86, 86, 2005, + 86, 86, 86, 2011, 2006, 86, 2003, 2009, 2002, 86, + 2013, 86, 2007, 2014, 86, 2010, 86, 86, 2017, 86, + 2008, 2015, 86, 2012, 86, 86, 2021, 86, 2016, 2025, + 86, 2018, 86, 2023, 86, 86, 2020, 2019, 86, 2024, + 2022, 86, 2026, 86, 86, 86, 86, 86, 86, 86, + 2031, 86, 2030, 86, 165, 2032, 2034, 2027, 2038, 86, + 2028, 2033, 2029, 2036, 2035, 2040, 2041, 2037, 86, 86, + + 86, 86, 86, 2042, 2044, 86, 86, 86, 2048, 86, + 2039, 2043, 86, 86, 2050, 86, 86, 86, 86, 2045, + 86, 2055, 86, 86, 2046, 2049, 2047, 2057, 86, 86, + 86, 2052, 2053, 2058, 2054, 2051, 86, 86, 2056, 2062, + 86, 2060, 2061, 86, 86, 86, 172, 86, 2066, 2059, + 2069, 86, 86, 2065, 2064, 86, 86, 86, 2067, 2073, + 86, 86, 2068, 2063, 86, 86, 2074, 2071, 86, 2077, + 86, 2070, 2076, 86, 86, 2072, 2081, 86, 2075, 86, + 2078, 86, 86, 2085, 86, 2084, 2082, 86, 86, 2079, + 2086, 2088, 86, 2080, 86, 2083, 2091, 2090, 86, 2089, + + 86, 2087, 86, 2092, 86, 86, 86, 2094, 86, 2095, + 2093, 86, 86, 86, 86, 86, 86, 2100, 86, 2101, + 2096, 86, 86, 86, 2102, 86, 2105, 86, 2103, 2098, + 2097, 2099, 2106, 2104, 86, 86, 86, 2113, 86, 2109, + 2111, 2114, 2108, 86, 2117, 2107, 2110, 86, 2115, 86, + 86, 2112, 86, 86, 86, 2121, 86, 86, 86, 2116, + 86, 2124, 2125, 86, 2126, 86, 2119, 86, 2118, 2128, + 86, 2122, 2120, 2123, 2127, 86, 2129, 2130, 86, 2131, + 2133, 86, 2134, 2135, 86, 2137, 86, 2136, 2132, 86, + 2139, 86, 86, 86, 86, 86, 86, 2140, 2142, 2143, + + 86, 86, 2146, 86, 2138, 86, 2145, 86, 86, 86, + 86, 86, 2151, 2149, 2144, 2150, 86, 2153, 2141, 86, + 2147, 2152, 86, 86, 86, 86, 86, 86, 2148, 2158, + 2161, 2154, 2155, 2156, 2164, 86, 86, 86, 2157, 86, + 2159, 86, 2165, 2166, 2160, 2162, 2163, 86, 2167, 86, + 2169, 2173, 86, 2168, 2170, 86, 2172, 86, 2171, 86, + 86, 2177, 86, 86, 2174, 86, 2179, 86, 86, 86, + 2182, 2183, 86, 86, 2185, 86, 86, 86, 86, 2175, + 86, 2176, 86, 2192, 86, 86, 2187, 2180, 2190, 2178, + 2181, 2188, 86, 2184, 86, 86, 2191, 86, 86, 2189, + + 86, 2186, 2195, 86, 2198, 86, 2193, 2194, 2201, 2196, + 86, 2203, 86, 86, 86, 2202, 2206, 86, 86, 86, + 2205, 2200, 86, 2197, 2199, 86, 86, 2207, 2209, 2210, + 86, 2211, 2204, 86, 86, 86, 86, 2208, 86, 2214, + 86, 2216, 2212, 86, 86, 86, 2218, 86, 2221, 86, + 2213, 2222, 2217, 2223, 86, 2215, 86, 86, 86, 86, + 2226, 86, 2219, 86, 2231, 86, 86, 86, 2230, 2224, + 86, 2220, 86, 2225, 2228, 86, 2227, 86, 2237, 2236, + 86, 86, 86, 2229, 86, 2234, 2233, 2238, 2241, 2239, + 2232, 2235, 2240, 86, 86, 2244, 86, 86, 86, 86, + + 86, 86, 86, 2245, 2248, 2242, 2252, 86, 86, 86, + 2243, 2246, 86, 86, 2255, 2257, 86, 2247, 86, 2258, + 2249, 2250, 2251, 2254, 86, 2253, 2256, 86, 2259, 86, + 86, 86, 86, 2265, 86, 163, 2260, 2264, 2266, 86, + 2261, 2267, 2269, 2270, 86, 2262, 2268, 86, 86, 86, + 2263, 86, 86, 2275, 86, 2274, 2272, 2271, 86, 86, + 86, 86, 2277, 2281, 2273, 86, 2276, 86, 2279, 86, + 2283, 86, 2278, 2284, 86, 86, 86, 172, 86, 86, + 86, 86, 2287, 86, 2292, 86, 2280, 2282, 2291, 86, + 2285, 2288, 2289, 86, 2339, 2286, 2293, 2290, 86, 2294, + + 2295, 86, 2296, 86, 2298, 86, 86, 86, 86, 2297, + 86, 2299, 2300, 86, 2301, 2302, 2304, 86, 2303, 86, + 86, 86, 2305, 86, 2307, 86, 86, 2311, 86, 86, + 86, 2310, 2306, 2308, 86, 2313, 86, 2309, 2312, 2314, + 86, 2316, 86, 2315, 86, 86, 86, 86, 86, 86, + 86, 2321, 2323, 2318, 2322, 86, 2317, 86, 86, 2325, + 86, 2328, 86, 2319, 86, 2320, 2324, 86, 86, 86, + 2334, 2327, 2329, 2326, 86, 86, 2331, 2332, 86, 86, + 2330, 86, 2341, 2335, 2333, 86, 2338, 2336, 2340, 86, + 86, 86, 2347, 86, 86, 86, 86, 2349, 86, 2337, + + 86, 2342, 2350, 86, 2352, 86, 2343, 2344, 2345, 2346, + 86, 2348, 2354, 86, 86, 2355, 86, 86, 2353, 2358, + 86, 2351, 86, 2357, 86, 86, 86, 86, 86, 2360, + 86, 2363, 86, 2364, 2359, 86, 86, 86, 2367, 2356, + 86, 2365, 86, 86, 86, 86, 2361, 2362, 2368, 2366, + 2369, 2372, 2370, 86, 2374, 86, 86, 2377, 2373, 2375, + 86, 2378, 86, 2371, 86, 2380, 86, 2376, 2382, 2383, + 86, 2387, 86, 86, 2379, 2386, 2381, 86, 86, 86, + 2384, 2390, 2389, 86, 2385, 86, 86, 86, 2392, 86, + 86, 86, 2393, 2388, 2400, 2394, 2391, 86, 2396, 2398, + + 86, 86, 2397, 2401, 86, 2395, 2403, 86, 86, 86, + 2399, 86, 86, 2406, 2405, 86, 86, 2407, 2402, 86, + 2408, 86, 2412, 86, 86, 86, 2416, 86, 86, 2413, + 86, 2417, 86, 86, 2404, 2415, 2411, 2409, 2414, 2410, + 86, 2418, 2422, 86, 2420, 86, 2419, 86, 2423, 86, + 86, 2427, 2421, 86, 86, 86, 2424, 86, 2428, 86, + 86, 2429, 86, 2431, 2425, 2433, 86, 86, 2435, 2437, + 2426, 2432, 2430, 86, 2434, 86, 2436, 86, 2438, 86, + 86, 86, 86, 2440, 2443, 2445, 86, 86, 86, 2441, + 2446, 86, 2442, 86, 86, 2439, 2448, 86, 2447, 2451, + + 2449, 86, 2444, 86, 86, 2450, 2452, 2456, 86, 86, + 2453, 86, 86, 2455, 86, 86, 86, 86, 86, 86, + 86, 2464, 2468, 2454, 86, 86, 86, 2457, 86, 2458, + 2459, 2460, 2462, 2469, 2463, 2470, 2465, 2466, 86, 2461, + 2467, 86, 86, 86, 86, 86, 86, 2472, 2474, 86, + 2481, 86, 86, 86, 2483, 86, 2471, 86, 2479, 2476, + 2473, 2480, 2482, 2477, 86, 86, 2475, 86, 86, 2486, + 86, 2478, 2487, 2490, 172, 2484, 2494, 86, 2495, 86, + 2492, 2488, 86, 2485, 86, 2493, 86, 86, 86, 2489, + 2496, 86, 2499, 86, 86, 2500, 2491, 2498, 86, 2497, + + 2504, 86, 86, 2505, 86, 2508, 2507, 2503, 86, 2501, + 86, 86, 86, 2509, 86, 2510, 2506, 2511, 86, 86, + 2502, 2513, 86, 86, 2512, 86, 2514, 86, 86, 2516, + 2515, 86, 2517, 2519, 86, 86, 86, 86, 86, 86, + 2522, 86, 2528, 86, 2526, 86, 86, 86, 2518, 2521, + 2529, 86, 2524, 86, 2520, 2523, 2531, 86, 2525, 86, + 2530, 86, 86, 2527, 86, 2532, 86, 2537, 2540, 86, + 86, 2535, 86, 86, 86, 2534, 86, 2538, 2541, 2533, + 2536, 86, 86, 86, 2539, 86, 86, 86, 2551, 86, + 86, 2542, 2543, 2544, 86, 86, 86, 2549, 2556, 2545, + + 86, 2547, 2552, 2553, 2548, 2546, 2555, 2550, 86, 2554, + 2558, 86, 86, 86, 86, 86, 2560, 2559, 86, 86, + 86, 86, 2565, 2566, 86, 2568, 86, 2561, 2557, 86, + 86, 2567, 2563, 2564, 2569, 86, 86, 2572, 3686, 2562, + 2573, 2574, 86, 86, 2575, 2570, 86, 2576, 2571, 86, + 2579, 86, 2580, 86, 86, 86, 86, 86, 2577, 2581, + 2582, 2578, 86, 2586, 86, 2587, 86, 86, 2589, 86, + 86, 2591, 86, 86, 2585, 86, 2583, 2584, 2593, 2594, + 86, 2595, 86, 86, 86, 86, 2588, 86, 2590, 86, + 2592, 86, 86, 2597, 2602, 86, 2601, 2596, 2604, 86, + + 86, 2599, 2598, 86, 86, 86, 86, 86, 2600, 2606, + 2608, 2603, 2607, 86, 2609, 2611, 86, 86, 2605, 2614, + 2613, 86, 2612, 86, 2617, 86, 2618, 86, 86, 2610, + 86, 86, 86, 86, 2624, 86, 2615, 2623, 86, 86, + 86, 86, 2616, 2620, 2626, 86, 2622, 2619, 2629, 86, + 86, 86, 86, 2621, 86, 2627, 2628, 2625, 2631, 86, + 86, 86, 2637, 86, 2632, 2630, 86, 86, 86, 2639, + 2633, 2643, 2634, 86, 2635, 2638, 2640, 86, 86, 86, + 2644, 86, 86, 2645, 2646, 86, 2636, 86, 2647, 86, + 2650, 2641, 86, 2642, 2648, 86, 86, 2652, 86, 2656, + + 2653, 2654, 2657, 2649, 2655, 86, 86, 86, 86, 2660, + 86, 86, 2661, 2651, 86, 86, 2662, 86, 86, 2658, + 2665, 2659, 86, 86, 86, 86, 86, 2664, 86, 86, + 2672, 2667, 2668, 2669, 2670, 2663, 86, 2673, 2666, 86, + 2671, 86, 86, 86, 2674, 2675, 86, 2679, 2676, 2677, + 2680, 2678, 86, 2681, 86, 172, 86, 86, 2684, 86, + 2685, 2682, 86, 2683, 86, 2690, 86, 86, 86, 86, + 86, 86, 86, 2697, 86, 86, 86, 2692, 2688, 2686, + 2689, 2687, 2691, 2693, 86, 2694, 2696, 2695, 2700, 2698, + 2701, 86, 86, 2702, 86, 2699, 2703, 86, 86, 2705, + + 2706, 2704, 2707, 86, 2709, 86, 86, 86, 86, 86, + 2711, 86, 2708, 86, 86, 86, 2715, 86, 2716, 86, + 86, 2710, 86, 2712, 86, 2718, 2719, 2713, 2724, 86, + 86, 2717, 2720, 2714, 2721, 86, 86, 86, 86, 2725, + 86, 2722, 2723, 86, 2727, 2728, 86, 86, 86, 86, + 86, 86, 2730, 86, 86, 86, 2729, 2735, 2726, 86, + 2737, 2738, 86, 2740, 86, 2734, 86, 86, 2731, 2732, + 2733, 86, 2739, 86, 2736, 86, 86, 2741, 2744, 2746, + 86, 86, 86, 2742, 86, 2750, 2751, 2749, 2747, 2773, + 2743, 86, 86, 86, 86, 86, 2745, 2748, 86, 86, + + 2753, 2752, 86, 2754, 86, 2757, 86, 86, 2808, 2755, + 2758, 86, 2759, 2756, 86, 86, 2765, 2760, 2761, 86, + 2763, 86, 86, 86, 86, 2764, 2767, 86, 2762, 2769, + 86, 86, 86, 2768, 86, 2766, 86, 86, 86, 86, + 2778, 86, 86, 2776, 2777, 2780, 2771, 2779, 86, 2770, + 2772, 86, 86, 86, 2782, 86, 86, 86, 2775, 86, + 86, 2785, 2774, 2787, 2784, 86, 86, 2790, 86, 86, + 86, 2783, 2781, 86, 86, 2791, 2786, 2788, 2789, 2792, + 2793, 2794, 2797, 86, 2796, 86, 86, 86, 2798, 86, + 86, 2795, 86, 2801, 2802, 86, 86, 86, 86, 86, + + 86, 2803, 86, 86, 2807, 2799, 2805, 2800, 2804, 86, + 86, 2806, 86, 86, 2809, 2811, 2810, 2812, 2815, 2816, + 86, 2817, 86, 2818, 86, 2819, 86, 86, 86, 2813, + 2814, 86, 86, 2823, 86, 2824, 2822, 86, 2825, 2820, + 86, 86, 86, 86, 86, 3686, 2821, 86, 86, 2832, + 86, 86, 2826, 86, 2828, 2834, 86, 2835, 86, 2837, + 86, 2827, 2836, 2829, 2831, 2830, 2833, 86, 86, 86, + 86, 86, 86, 2841, 86, 2839, 2842, 2846, 86, 2838, + 86, 2840, 2848, 86, 86, 86, 86, 86, 86, 2847, + 2843, 86, 2844, 2845, 86, 172, 2855, 86, 2857, 2851, + + 86, 86, 2853, 86, 86, 2850, 86, 2856, 86, 2858, + 2849, 2852, 86, 2854, 86, 2864, 2859, 3686, 2860, 86, + 86, 86, 2861, 2868, 86, 2866, 2867, 86, 2862, 2869, + 86, 2863, 2873, 2865, 86, 2870, 86, 2871, 86, 2872, + 86, 86, 86, 86, 86, 86, 2875, 86, 86, 86, + 86, 2874, 2883, 86, 86, 3686, 2876, 2881, 86, 2887, + 86, 2878, 2877, 86, 2888, 2880, 2879, 2882, 86, 2884, + 86, 2885, 2886, 2889, 86, 2893, 86, 2890, 86, 2892, + 2895, 86, 86, 86, 86, 86, 86, 2894, 86, 86, + 2891, 86, 2899, 86, 2906, 86, 2907, 86, 86, 86, + + 2896, 2897, 2898, 2900, 2901, 2905, 86, 2902, 86, 2903, + 2904, 2911, 86, 86, 2910, 2912, 86, 2913, 86, 2908, + 86, 86, 86, 86, 2909, 86, 86, 2919, 2920, 86, + 86, 2914, 86, 86, 86, 2916, 2915, 86, 86, 2918, + 2917, 86, 2926, 2927, 2924, 86, 2921, 2928, 86, 86, + 2922, 2929, 2923, 86, 2925, 2930, 86, 2931, 86, 86, + 86, 86, 2932, 86, 2933, 2936, 2937, 86, 86, 86, + 2934, 86, 2943, 86, 2942, 86, 86, 2946, 86, 2935, + 86, 86, 86, 2938, 86, 86, 2939, 2941, 2940, 2949, + 2944, 2947, 86, 86, 2945, 86, 2948, 2950, 2952, 2951, + + 86, 2954, 86, 86, 2953, 86, 2955, 2959, 86, 86, + 2956, 86, 86, 86, 2963, 86, 2962, 2964, 86, 86, + 2961, 2960, 86, 2957, 2967, 2958, 2966, 86, 86, 86, + 86, 2968, 2972, 86, 2965, 86, 2973, 86, 2975, 86, + 86, 2970, 86, 86, 2969, 86, 2982, 86, 86, 86, + 2971, 86, 86, 2976, 2979, 2977, 2978, 2980, 2981, 2974, + 2985, 86, 86, 86, 86, 86, 86, 2984, 2986, 2987, + 2989, 2983, 86, 86, 2990, 86, 2988, 2994, 86, 86, + 86, 86, 2992, 2993, 86, 2996, 2997, 2999, 86, 3000, + 86, 2991, 86, 86, 2995, 3003, 172, 3001, 86, 2998, + + 86, 86, 86, 3008, 86, 3004, 3005, 3686, 86, 86, + 86, 3010, 3002, 3009, 3013, 86, 86, 86, 3006, 3011, + 3007, 3012, 3014, 86, 3016, 86, 86, 3018, 86, 3017, + 3015, 86, 3019, 86, 86, 3023, 3020, 86, 86, 3021, + 86, 86, 3022, 3025, 3024, 86, 3026, 86, 86, 86, + 3030, 3031, 86, 86, 3032, 3028, 86, 86, 3034, 86, + 3027, 86, 86, 86, 3033, 3038, 3037, 3036, 3035, 3029, + 86, 86, 86, 86, 86, 3039, 3040, 3041, 86, 86, + 86, 86, 3046, 86, 86, 86, 86, 3043, 3044, 3045, + 3048, 3042, 3047, 3050, 86, 86, 3049, 86, 86, 86, + + 3051, 3056, 86, 3052, 86, 3057, 3053, 86, 86, 86, + 86, 3061, 86, 3064, 86, 3054, 3055, 3059, 3060, 86, + 86, 86, 3062, 3058, 86, 3069, 86, 3063, 3068, 86, + 3071, 3072, 86, 3074, 86, 3066, 86, 86, 3065, 86, + 86, 3067, 3075, 86, 86, 86, 86, 3081, 3076, 3078, + 3073, 86, 86, 86, 3070, 3079, 3083, 86, 3080, 3077, + 3082, 86, 3086, 86, 86, 86, 3088, 86, 86, 3084, + 3090, 86, 3091, 86, 86, 3085, 3092, 86, 3093, 3087, + 86, 86, 3096, 86, 86, 3089, 3094, 86, 3097, 3095, + 86, 86, 3098, 3100, 86, 3104, 3099, 86, 3101, 86, + + 3105, 86, 3102, 3106, 86, 3107, 86, 86, 86, 86, + 3108, 3103, 3111, 86, 86, 3112, 3114, 86, 86, 3115, + 86, 3109, 3110, 3116, 86, 3118, 86, 86, 86, 86, + 3122, 3123, 86, 86, 3113, 3117, 86, 3124, 3125, 86, + 3119, 86, 86, 3121, 86, 3127, 3120, 3126, 86, 86, + 3128, 86, 3133, 86, 86, 3132, 86, 86, 86, 3137, + 3135, 3130, 3129, 3136, 86, 3138, 86, 86, 3131, 3139, + 86, 86, 3142, 3141, 86, 86, 86, 86, 3134, 3145, + 86, 3149, 86, 86, 86, 86, 86, 86, 3151, 3148, + 3181, 86, 3140, 3143, 3144, 3146, 3152, 3150, 3153, 3155, + + 3147, 3156, 86, 3158, 86, 3154, 3157, 86, 3159, 86, + 3161, 86, 86, 3162, 86, 3163, 86, 3164, 86, 3165, + 3167, 3160, 86, 3166, 86, 86, 86, 86, 86, 3168, + 86, 86, 86, 3172, 86, 86, 3174, 86, 86, 3179, + 86, 3171, 86, 3175, 86, 3169, 3180, 86, 3184, 3173, + 3183, 86, 3170, 86, 3307, 3176, 86, 3177, 3178, 3182, + 3186, 86, 86, 3187, 3188, 86, 86, 3189, 3190, 86, + 86, 3185, 86, 86, 86, 3191, 3196, 86, 86, 3192, + 86, 3193, 3194, 3197, 86, 86, 86, 3199, 86, 3198, + 86, 86, 3195, 86, 86, 3204, 86, 3201, 3208, 3200, + + 3205, 86, 3207, 3202, 3206, 86, 86, 3210, 86, 86, + 3203, 3209, 3212, 86, 86, 3216, 86, 86, 86, 3211, + 86, 3214, 86, 3213, 86, 3223, 3217, 3220, 86, 86, + 3218, 86, 3215, 3221, 86, 86, 86, 86, 86, 3228, + 3226, 3224, 3227, 86, 86, 3219, 86, 86, 3222, 3230, + 3232, 86, 3229, 86, 3233, 3225, 3238, 3234, 86, 3231, + 3235, 86, 3236, 86, 3237, 86, 86, 86, 3242, 86, + 86, 3239, 3241, 86, 86, 3243, 86, 3240, 3244, 3245, + 86, 3247, 86, 86, 3246, 3251, 86, 3249, 3253, 86, + 86, 86, 86, 86, 3254, 86, 86, 3248, 3255, 86, + + 3256, 3250, 86, 3257, 86, 3262, 86, 3259, 86, 86, + 86, 3252, 86, 86, 3260, 3258, 3266, 86, 86, 86, + 86, 3263, 3264, 3265, 3261, 3271, 3267, 3270, 86, 3268, + 86, 3273, 86, 86, 86, 3277, 86, 3269, 3278, 86, + 86, 3274, 86, 86, 3280, 86, 86, 86, 3272, 3281, + 86, 3275, 3283, 3284, 86, 86, 3282, 3286, 86, 3279, + 3276, 3287, 86, 3288, 3285, 86, 86, 3289, 3292, 86, + 3291, 3290, 86, 3295, 86, 3297, 86, 86, 86, 86, + 86, 3294, 86, 3299, 3302, 86, 3293, 3303, 86, 3305, + 3308, 86, 3300, 86, 86, 86, 3298, 3296, 86, 3301, + + 3309, 86, 86, 3306, 3312, 86, 86, 86, 3304, 3310, + 86, 86, 3317, 86, 86, 86, 3315, 3314, 86, 3321, + 86, 86, 3311, 3319, 3313, 86, 86, 3326, 3323, 3324, + 3316, 86, 3318, 3328, 3320, 86, 3322, 86, 3325, 86, + 3329, 86, 86, 3331, 86, 3330, 86, 86, 86, 86, + 86, 3327, 3333, 3332, 3334, 86, 86, 86, 3337, 3340, + 86, 3335, 3341, 3336, 86, 3338, 3339, 86, 3345, 86, + 86, 3343, 86, 86, 3686, 3342, 3349, 86, 3350, 86, + 3344, 86, 3348, 3351, 86, 86, 3352, 86, 3347, 3346, + 3355, 86, 3354, 3356, 86, 3357, 86, 3358, 86, 3353, + + 86, 86, 3361, 86, 86, 3363, 86, 86, 86, 3362, + 3365, 86, 86, 3359, 3366, 86, 86, 86, 86, 3364, + 86, 3372, 3373, 86, 86, 86, 3367, 3360, 86, 86, + 86, 3379, 86, 86, 3368, 3382, 3370, 86, 3369, 3378, + 3371, 86, 3376, 86, 3375, 3380, 86, 86, 86, 3377, + 3374, 3381, 3385, 3387, 86, 3388, 86, 3383, 86, 86, + 3391, 86, 3384, 3389, 86, 3396, 86, 86, 86, 3386, + 3394, 86, 86, 3390, 86, 3393, 3392, 3395, 86, 3397, + 86, 86, 86, 86, 86, 3400, 86, 86, 3398, 3402, + 3403, 86, 86, 3401, 86, 86, 86, 86, 3399, 86, + + 86, 3412, 3413, 3404, 3415, 3416, 3405, 3406, 3408, 3407, + 86, 3409, 3410, 86, 86, 86, 3411, 3418, 86, 3414, + 3420, 86, 3421, 86, 86, 86, 3423, 86, 3419, 3422, + 86, 3426, 86, 3417, 86, 3424, 3686, 3425, 3436, 3427, + 3428, 86, 3429, 3430, 86, 86, 3431, 3432, 86, 86, + 3433, 86, 3434, 3435, 86, 86, 86, 3438, 86, 3437, + 3439, 86, 3440, 86, 3442, 86, 86, 3446, 86, 86, + 3441, 3445, 86, 86, 86, 86, 86, 86, 3443, 3450, + 3449, 86, 86, 3451, 86, 3444, 3454, 3455, 86, 3447, + 86, 3452, 86, 3456, 3497, 3453, 86, 3448, 86, 3457, + + 3458, 86, 3459, 86, 86, 3460, 86, 3464, 3466, 3461, + 86, 3468, 3465, 86, 86, 3462, 86, 3467, 3463, 86, + 86, 3470, 3473, 86, 3471, 86, 3474, 86, 3476, 86, + 86, 3469, 86, 3475, 3477, 86, 86, 3480, 86, 3472, + 3478, 3479, 3481, 86, 86, 3484, 86, 86, 3483, 3485, + 86, 3486, 86, 3482, 3487, 86, 3488, 86, 3489, 86, + 3490, 86, 3491, 86, 86, 86, 3494, 86, 3495, 86, + 86, 3499, 86, 3492, 3493, 86, 3501, 86, 86, 3496, + 86, 86, 86, 86, 3498, 86, 3505, 3506, 86, 3508, + 86, 86, 3504, 3502, 3500, 3503, 3507, 86, 86, 3512, + + 3510, 3509, 86, 86, 3515, 86, 3514, 86, 86, 86, + 86, 86, 3517, 86, 86, 86, 86, 3511, 3523, 3516, + 3513, 3521, 3522, 86, 86, 3520, 86, 3518, 86, 3519, + 86, 3524, 86, 3527, 86, 3528, 3530, 86, 86, 3529, + 3531, 86, 3532, 86, 3526, 86, 86, 3534, 86, 3525, + 3535, 86, 86, 3533, 3536, 86, 86, 3540, 3541, 3537, + 86, 3543, 3539, 86, 86, 86, 86, 86, 86, 86, + 3542, 3538, 86, 86, 3552, 86, 3544, 3550, 86, 3556, + 86, 3547, 86, 3545, 3546, 3551, 86, 3549, 86, 86, + 86, 3554, 3548, 3558, 3561, 86, 3553, 3555, 86, 3563, + + 86, 86, 3557, 3559, 86, 3564, 86, 3562, 3565, 86, + 3560, 3566, 86, 86, 86, 86, 3569, 86, 86, 3570, + 3567, 3574, 3571, 86, 86, 86, 3568, 86, 3578, 86, + 3577, 86, 86, 3573, 3580, 86, 3576, 3575, 3581, 86, + 3572, 3582, 86, 86, 3585, 86, 86, 3583, 86, 3588, + 86, 3579, 86, 3589, 86, 86, 86, 86, 3592, 3593, + 86, 3586, 3584, 3590, 86, 86, 3587, 86, 86, 86, + 3594, 3598, 86, 3591, 3597, 86, 3596, 3599, 86, 86, + 3595, 3600, 86, 3603, 86, 86, 86, 86, 3601, 3602, + 3605, 86, 86, 86, 3612, 86, 86, 3610, 3611, 3607, + + 3608, 86, 3604, 3606, 86, 3616, 86, 86, 3618, 86, + 3609, 86, 3617, 3657, 86, 86, 3613, 86, 3619, 3614, + 3620, 86, 86, 3615, 3624, 86, 3621, 3622, 3623, 86, + 86, 3625, 86, 86, 3626, 3627, 86, 3628, 86, 86, + 86, 3633, 86, 86, 3629, 3630, 86, 86, 86, 3636, + 3637, 86, 86, 86, 86, 86, 3635, 3640, 3631, 3632, + 86, 3634, 3638, 86, 86, 3639, 86, 3644, 86, 3645, + 86, 3648, 3647, 3641, 3642, 86, 3643, 86, 3650, 3649, + 3652, 3646, 86, 3651, 86, 86, 3655, 86, 86, 3658, + 86, 3653, 86, 3656, 86, 86, 86, 86, 86, 3659, + + 86, 3660, 3662, 86, 3654, 3664, 86, 86, 3666, 86, + 86, 3670, 3667, 86, 3661, 3663, 86, 3665, 3686, 3668, + 3671, 86, 86, 3674, 3675, 86, 86, 86, 3669, 3677, + 86, 86, 3672, 3676, 3679, 3673, 3678, 86, 86, 86, + 86, 3684, 86, 3680, 3681, 3685, 86, 3686, 3686, 3686, + 3682, 3686, 3686, 3686, 3686, 3686, 3686, 3686, 3686, 3683, + 47, 47, 47, 47, 47, 47, 47, 52, 52, 52, + 52, 52, 52, 52, 57, 57, 57, 57, 57, 57, + 57, 63, 63, 63, 63, 63, 63, 63, 68, 68, + 68, 68, 68, 68, 68, 74, 74, 74, 74, 74, + + 74, 74, 80, 80, 80, 80, 80, 80, 80, 89, + 89, 3686, 89, 89, 89, 89, 162, 162, 3686, 3686, + 3686, 162, 162, 164, 164, 3686, 3686, 164, 3686, 164, + 166, 3686, 3686, 3686, 3686, 3686, 166, 169, 169, 3686, + 3686, 3686, 169, 169, 171, 3686, 3686, 3686, 3686, 3686, + 171, 173, 173, 3686, 173, 173, 173, 173, 176, 3686, + 3686, 3686, 3686, 3686, 176, 179, 179, 3686, 3686, 3686, + 179, 179, 90, 90, 3686, 90, 90, 90, 90, 17, + 3686, 3686, 3686, 3686, 3686, 3686, 3686, 3686, 3686, 3686, + 3686, 3686, 3686, 3686, 3686, 3686, 3686, 3686, 3686, 3686, + + 3686, 3686, 3686, 3686, 3686, 3686, 3686, 3686, 3686, 3686, + 3686, 3686, 3686, 3686, 3686, 3686, 3686, 3686, 3686, 3686 } ; -static yyconst flex_int16_t yy_chk[7096] = +static const flex_int16_t yy_chk[7221] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -2417,779 +2445,792 @@ static yyconst flex_int16_t yy_chk[7096] = 5, 3, 6, 24, 4, 24, 24, 5, 24, 6, 7, 7, 7, 7, 24, 7, 8, 8, 8, 8, 33, 8, 7, 9, 9, 9, 26, 26, 8, 10, - 10, 10, 19, 29, 9, 33, 19, 29, 3623, 35, + 10, 10, 19, 29, 9, 33, 19, 29, 3694, 35, 10, 11, 11, 11, 11, 11, 11, 13, 13, 13, - 13, 34, 13, 11, 35, 99, 34, 29, 38, 13, + 13, 34, 13, 11, 35, 100, 34, 29, 38, 13, 51, 51, 11, 12, 12, 12, 12, 12, 12, 14, - 14, 14, 14, 99, 14, 12, 15, 15, 15, 38, - 23, 14, 23, 23, 12, 23, 46, 15, 16, 16, - 16, 23, 23, 25, 27, 27, 25, 25, 2941, 16, - 25, 46, 27, 30, 30, 25, 27, 56, 40, 27, - 56, 73, 31, 31, 25, 28, 67, 67, 30, 32, - 28, 31, 40, 32, 28, 73, 32, 28, 92, 28, - 28, 92, 31, 32, 1155, 32, 36, 36, 37, 37, - 28, 45, 45, 37, 97, 36, 45, 97, 41, 41, - - 45, 36, 87, 41, 93, 36, 87, 37, 93, 37, - 39, 39, 42, 41, 41, 39, 41, 42, 96, 39, - 42, 43, 43, 567, 43, 39, 44, 42, 39, 101, - 44, 42, 42, 43, 94, 39, 84, 84, 96, 43, - 44, 94, 44, 101, 44, 44, 62, 567, 62, 62, - 70, 62, 70, 70, 72, 70, 72, 72, 79, 72, - 79, 79, 70, 79, 86, 95, 86, 86, 89, 86, - 89, 89, 105, 89, 100, 86, 102, 95, 98, 89, - 89, 98, 102, 100, 103, 104, 106, 107, 102, 128, - 102, 105, 106, 109, 98, 108, 111, 112, 128, 110, - - 108, 107, 103, 103, 113, 106, 114, 104, 113, 108, - 110, 110, 115, 109, 111, 112, 116, 115, 110, 117, - 123, 118, 117, 119, 120, 117, 114, 118, 121, 120, - 116, 121, 124, 122, 123, 121, 124, 125, 117, 117, - 126, 127, 119, 129, 125, 130, 118, 136, 127, 120, - 131, 121, 122, 126, 131, 132, 129, 122, 133, 134, - 138, 135, 133, 137, 137, 130, 135, 136, 139, 140, - 135, 141, 139, 132, 142, 144, 143, 134, 148, 143, - 138, 139, 150, 145, 140, 148, 146, 139, 144, 145, - 143, 147, 147, 142, 143, 149, 148, 141, 146, 151, - - 152, 150, 153, 154, 153, 155, 157, 160, 158, 147, - 156, 149, 147, 153, 159, 156, 152, 155, 157, 159, - 151, 160, 154, 162, 162, 153, 158, 164, 180, 166, - 164, 166, 166, 180, 166, 169, 169, 171, 182, 171, - 171, 172, 171, 172, 172, 174, 172, 176, 174, 176, - 176, 181, 176, 172, 179, 179, 182, 181, 183, 184, - 185, 186, 187, 188, 190, 189, 181, 184, 191, 186, - 189, 185, 193, 183, 184, 194, 192, 191, 188, 210, - 194, 187, 192, 192, 190, 195, 195, 196, 200, 197, - 202, 197, 198, 196, 197, 210, 198, 193, 199, 199, - - 200, 198, 201, 205, 206, 203, 198, 201, 201, 202, - 203, 197, 198, 198, 204, 205, 207, 208, 209, 204, - 211, 208, 207, 209, 206, 212, 213, 215, 214, 178, - 216, 218, 215, 219, 211, 216, 218, 225, 213, 220, - 212, 213, 221, 217, 217, 207, 214, 217, 221, 217, - 222, 222, 223, 219, 224, 220, 226, 225, 223, 227, - 224, 217, 226, 217, 223, 227, 228, 229, 232, 177, - 230, 231, 232, 229, 227, 230, 233, 231, 234, 236, - 234, 238, 233, 235, 237, 234, 240, 228, 239, 235, - 237, 242, 236, 243, 239, 241, 244, 245, 243, 240, - - 246, 238, 247, 241, 242, 244, 249, 250, 240, 248, - 252, 249, 245, 251, 248, 248, 246, 251, 253, 254, - 255, 256, 247, 257, 253, 250, 255, 258, 257, 258, - 259, 263, 252, 260, 266, 265, 261, 254, 254, 262, - 260, 256, 261, 267, 267, 262, 264, 265, 266, 259, - 263, 268, 264, 269, 269, 270, 271, 272, 273, 272, - 274, 270, 271, 275, 276, 274, 277, 278, 279, 280, - 291, 268, 281, 279, 277, 275, 272, 283, 281, 270, - 282, 273, 283, 276, 284, 285, 282, 278, 286, 284, - 287, 285, 280, 288, 289, 291, 292, 290, 293, 295, - - 295, 293, 292, 286, 287, 290, 297, 294, 289, 294, - 296, 288, 300, 296, 298, 298, 299, 299, 301, 302, - 304, 303, 302, 305, 297, 303, 306, 309, 300, 304, - 308, 310, 305, 301, 318, 313, 308, 310, 311, 313, - 311, 309, 312, 314, 314, 306, 315, 316, 312, 317, - 319, 315, 320, 316, 318, 317, 313, 321, 322, 322, - 323, 324, 325, 323, 326, 331, 325, 327, 319, 329, - 321, 328, 328, 320, 317, 330, 332, 331, 330, 324, - 334, 333, 332, 326, 333, 327, 337, 329, 336, 338, - 340, 342, 334, 340, 338, 330, 335, 336, 343, 341, - - 343, 343, 175, 342, 337, 335, 339, 345, 335, 339, - 345, 339, 341, 335, 335, 335, 335, 344, 346, 346, - 347, 348, 344, 344, 339, 350, 349, 339, 354, 351, - 352, 353, 353, 354, 355, 355, 348, 347, 351, 352, - 347, 349, 350, 350, 356, 356, 357, 358, 359, 360, - 361, 362, 358, 363, 374, 364, 364, 366, 364, 363, - 359, 357, 1368, 374, 367, 368, 362, 364, 360, 367, - 361, 368, 1368, 369, 364, 370, 371, 366, 369, 371, - 370, 371, 372, 383, 373, 376, 370, 373, 375, 375, - 378, 376, 377, 377, 381, 378, 372, 384, 383, 382, - - 373, 392, 382, 373, 385, 373, 379, 379, 386, 379, - 392, 389, 384, 388, 381, 379, 388, 393, 385, 379, - 382, 391, 393, 393, 379, 389, 386, 379, 380, 380, - 397, 380, 388, 394, 396, 395, 391, 400, 399, 394, - 402, 398, 406, 400, 380, 397, 394, 380, 401, 380, - 398, 380, 390, 396, 390, 390, 395, 399, 403, 407, - 402, 408, 406, 404, 390, 390, 390, 390, 390, 404, - 405, 390, 403, 404, 401, 405, 408, 409, 411, 407, - 410, 413, 409, 415, 411, 412, 412, 414, 416, 417, - 418, 419, 421, 405, 416, 410, 419, 415, 431, 414, - - 422, 413, 420, 420, 423, 420, 418, 424, 425, 170, - 425, 428, 421, 426, 417, 428, 422, 431, 426, 429, - 423, 424, 427, 429, 427, 427, 430, 430, 432, 433, - 434, 436, 435, 441, 444, 438, 491, 441, 429, 436, - 436, 438, 427, 432, 440, 433, 435, 439, 434, 440, - 491, 436, 442, 436, 437, 444, 439, 443, 445, 437, - 448, 442, 446, 443, 445, 448, 446, 437, 437, 449, - 447, 437, 437, 447, 451, 437, 450, 450, 452, 452, - 453, 454, 455, 455, 456, 453, 458, 451, 457, 449, - 456, 459, 457, 460, 454, 461, 462, 462, 460, 463, - - 461, 458, 464, 465, 466, 462, 467, 470, 468, 467, - 469, 463, 459, 468, 469, 472, 466, 471, 471, 470, - 472, 465, 464, 473, 474, 474, 475, 477, 477, 479, - 480, 481, 482, 483, 484, 485, 490, 486, 480, 484, - 488, 482, 495, 489, 473, 492, 168, 495, 475, 486, - 479, 492, 481, 493, 483, 485, 490, 494, 488, 496, - 488, 489, 493, 494, 497, 498, 499, 500, 498, 501, - 502, 503, 497, 496, 504, 497, 502, 504, 501, 505, - 499, 506, 500, 507, 508, 505, 509, 511, 507, 510, - 512, 503, 511, 510, 513, 506, 514, 515, 516, 513, - - 519, 520, 523, 505, 521, 512, 508, 509, 525, 522, - 524, 516, 514, 522, 167, 524, 515, 517, 517, 521, - 519, 523, 520, 517, 525, 517, 526, 528, 530, 527, - 526, 517, 531, 517, 527, 529, 517, 517, 527, 532, - 529, 531, 528, 517, 530, 532, 533, 530, 534, 535, - 532, 536, 535, 537, 538, 539, 539, 540, 543, 538, - 529, 533, 541, 541, 534, 542, 544, 545, 545, 546, - 543, 547, 548, 537, 536, 549, 550, 548, 554, 551, - 542, 544, 540, 552, 549, 557, 555, 554, 546, 552, - 555, 557, 556, 547, 551, 550, 556, 558, 559, 560, - - 561, 562, 563, 564, 565, 577, 566, 564, 566, 558, - 577, 568, 571, 559, 561, 573, 562, 565, 560, 568, - 563, 569, 569, 570, 571, 572, 575, 573, 576, 570, - 574, 572, 578, 574, 580, 578, 579, 165, 582, 593, - 575, 581, 593, 576, 591, 579, 581, 581, 583, 583, - 580, 582, 579, 584, 584, 579, 585, 586, 586, 587, - 587, 588, 585, 589, 590, 591, 592, 588, 589, 589, - 594, 595, 596, 597, 598, 594, 597, 599, 592, 598, - 596, 601, 590, 600, 603, 601, 602, 604, 605, 606, - 595, 604, 602, 607, 606, 608, 608, 609, 610, 612, - - 599, 613, 600, 611, 603, 614, 605, 607, 611, 615, - 617, 616, 609, 620, 620, 615, 616, 613, 612, 610, - 618, 619, 621, 618, 617, 614, 622, 625, 618, 623, - 624, 618, 618, 626, 623, 624, 629, 628, 163, 619, - 621, 625, 622, 628, 630, 629, 631, 630, 626, 632, - 631, 634, 633, 635, 632, 633, 634, 636, 637, 639, - 638, 640, 641, 641, 639, 637, 643, 642, 644, 635, - 645, 646, 631, 638, 653, 636, 642, 648, 647, 653, - 646, 640, 649, 648, 650, 643, 645, 650, 649, 644, - 647, 651, 651, 652, 651, 654, 652, 655, 656, 657, - - 658, 659, 662, 660, 657, 662, 663, 659, 660, 661, - 161, 655, 656, 654, 666, 661, 664, 665, 670, 658, - 667, 664, 665, 665, 668, 671, 669, 666, 673, 668, - 672, 663, 669, 667, 671, 672, 683, 670, 674, 674, - 675, 85, 676, 668, 668, 678, 679, 675, 673, 676, - 677, 678, 680, 677, 681, 682, 682, 680, 679, 681, - 681, 683, 684, 685, 684, 687, 688, 680, 677, 686, - 689, 686, 690, 691, 692, 693, 694, 695, 698, 693, - 692, 696, 685, 687, 688, 694, 697, 699, 689, 701, - 699, 690, 695, 691, 700, 701, 696, 698, 702, 699, - - 703, 704, 705, 706, 697, 709, 707, 708, 713, 700, - 710, 708, 711, 704, 703, 712, 714, 715, 702, 717, - 717, 705, 715, 709, 706, 707, 710, 713, 716, 719, - 711, 720, 718, 712, 712, 714, 718, 721, 722, 723, - 724, 724, 716, 719, 723, 725, 726, 727, 721, 728, - 720, 731, 722, 729, 732, 730, 728, 737, 729, 732, - 727, 725, 730, 733, 734, 726, 735, 736, 733, 738, - 80, 737, 739, 735, 740, 731, 736, 744, 738, 743, - 740, 741, 734, 743, 739, 742, 741, 745, 742, 746, - 748, 744, 747, 749, 749, 755, 745, 752, 750, 750, - - 751, 751, 752, 753, 746, 757, 747, 750, 759, 756, - 760, 748, 753, 758, 755, 756, 761, 758, 762, 763, - 759, 764, 765, 766, 762, 757, 767, 763, 764, 770, - 773, 777, 776, 779, 761, 760, 780, 777, 784, 784, - 765, 776, 780, 781, 770, 786, 767, 773, 766, 768, - 782, 768, 781, 783, 768, 779, 786, 783, 768, 785, - 785, 768, 787, 788, 789, 795, 782, 790, 768, 768, - 792, 768, 794, 790, 793, 797, 799, 788, 796, 793, - 787, 799, 796, 795, 789, 791, 791, 791, 800, 791, - 792, 798, 791, 794, 802, 798, 801, 791, 803, 797, - - 816, 801, 804, 791, 791, 804, 808, 800, 805, 802, - 806, 798, 816, 805, 805, 807, 807, 806, 815, 809, - 815, 808, 811, 803, 809, 810, 810, 811, 812, 813, - 817, 812, 814, 814, 813, 818, 819, 821, 820, 818, - 822, 822, 827, 823, 826, 821, 824, 825, 825, 817, - 828, 831, 831, 829, 827, 836, 819, 820, 823, 829, - 824, 830, 826, 832, 75, 834, 830, 835, 832, 832, - 834, 837, 828, 835, 836, 838, 839, 837, 840, 841, - 838, 840, 839, 842, 845, 841, 843, 843, 844, 844, - 846, 842, 845, 847, 849, 848, 850, 851, 847, 848, - - 852, 849, 853, 853, 855, 857, 854, 858, 846, 856, - 856, 857, 855, 851, 850, 854, 860, 862, 861, 852, - 864, 865, 867, 863, 865, 860, 858, 861, 863, 864, - 866, 868, 870, 869, 871, 866, 867, 872, 874, 871, - 871, 862, 869, 873, 873, 870, 875, 877, 876, 878, - 886, 872, 879, 874, 883, 879, 868, 876, 881, 884, - 881, 882, 882, 879, 884, 875, 885, 878, 887, 888, - 886, 877, 889, 890, 891, 883, 892, 893, 895, 894, - 892, 896, 890, 898, 895, 899, 900, 885, 887, 897, - 896, 888, 889, 903, 906, 893, 901, 891, 894, 898, - - 900, 897, 901, 902, 899, 904, 907, 903, 905, 905, - 904, 902, 908, 906, 909, 910, 911, 912, 913, 916, - 914, 908, 915, 910, 917, 916, 907, 918, 921, 919, - 917, 920, 922, 926, 909, 919, 911, 913, 922, 912, - 914, 918, 915, 923, 925, 920, 924, 927, 921, 923, - 924, 928, 926, 929, 930, 930, 928, 925, 931, 927, - 932, 934, 933, 935, 931, 933, 932, 927, 937, 936, - 938, 938, 939, 940, 929, 936, 935, 941, 940, 934, - 941, 942, 943, 945, 945, 944, 942, 942, 937, 944, - 939, 946, 947, 941, 948, 941, 949, 943, 951, 948, - - 952, 955, 956, 954, 958, 958, 959, 961, 961, 962, - 959, 960, 947, 946, 952, 949, 954, 985, 985, 996, - 996, 955, 951, 956, 957, 965, 960, 957, 963, 957, - 967, 964, 963, 957, 962, 957, 966, 968, 969, 965, - 957, 966, 968, 968, 967, 957, 964, 969, 970, 971, - 975, 972, 973, 971, 977, 975, 974, 973, 976, 978, - 979, 1167, 970, 1167, 981, 971, 972, 973, 974, 979, - 981, 980, 976, 978, 982, 977, 980, 983, 984, 982, - 986, 987, 988, 983, 984, 986, 989, 987, 990, 992, - 993, 995, 997, 999, 998, 993, 994, 997, 1000, 1001, - - 1002, 992, 998, 995, 988, 989, 990, 991, 991, 999, - 994, 1004, 1000, 991, 1003, 991, 1006, 1004, 1001, 1002, - 1005, 991, 1007, 1008, 1009, 1005, 991, 991, 1006, 1010, - 1003, 1011, 1011, 991, 1012, 1013, 1019, 1015, 1012, 1008, - 1007, 1016, 1009, 1015, 1016, 1017, 1018, 1010, 1020, 1019, - 1022, 1018, 1021, 1024, 1020, 1013, 1025, 1021, 1026, 1028, - 1027, 1029, 1024, 1031, 1017, 1025, 1027, 1030, 1028, 1022, - 1032, 1033, 1030, 1034, 1026, 1037, 1038, 1035, 1036, 1041, - 1029, 1037, 1039, 1031, 1032, 1034, 1035, 1036, 1039, 1043, - 1044, 1033, 1045, 1038, 1046, 1041, 1048, 1045, 1047, 1050, - - 1049, 1051, 1054, 1043, 1050, 1057, 1051, 1054, 1055, 1060, - 1044, 1057, 1047, 1046, 1048, 1049, 1058, 1055, 1056, 1056, - 1059, 1061, 1058, 1063, 1060, 1064, 1068, 1069, 1070, 1059, - 1064, 1064, 1066, 1066, 1061, 1067, 1066, 1071, 1067, 1063, - 1068, 1072, 1073, 1074, 1070, 1075, 1076, 1069, 1077, 1074, - 1079, 1078, 1076, 1083, 1072, 1071, 1078, 1073, 1081, 1081, - 1086, 1087, 1084, 1077, 1079, 1075, 1082, 1084, 1085, 1082, - 1087, 1090, 1088, 1085, 1083, 1089, 1086, 1088, 1092, 1093, - 1089, 1094, 1095, 1090, 1092, 1096, 1096, 1094, 1095, 1097, - 1098, 1099, 1100, 1100, 1099, 1093, 1101, 1102, 1097, 1103, - - 1104, 1106, 1105, 1104, 1107, 1108, 1116, 1106, 1098, 74, - 1107, 1108, 1109, 1110, 1101, 1105, 1102, 1109, 1110, 1103, - 1111, 1117, 1112, 1113, 1116, 1115, 1111, 1112, 1118, 1113, - 1115, 1119, 1120, 1120, 1118, 1121, 1119, 1122, 1123, 1124, - 1125, 1117, 1126, 1123, 1121, 1126, 1122, 1127, 1129, 1128, - 1127, 1130, 1131, 1129, 1132, 1133, 1134, 1124, 1139, 1125, - 1128, 1133, 1134, 1136, 1131, 1135, 1140, 1137, 1142, 1130, - 1141, 1135, 1137, 1132, 1138, 1138, 1144, 1139, 1136, 1143, - 1140, 1145, 1141, 1143, 1146, 1147, 1142, 1149, 1150, 1150, - 1145, 1151, 1152, 1153, 1144, 1154, 1157, 1152, 1153, 1151, - - 1156, 1158, 1159, 1146, 1161, 1161, 1149, 1159, 1160, 1162, - 1147, 1157, 1163, 1158, 1156, 1154, 1164, 1160, 1163, 1165, - 1166, 1168, 1164, 1169, 1170, 1166, 1168, 1171, 1172, 1162, - 1173, 1175, 1171, 1174, 1176, 1165, 1179, 1169, 1170, 1180, - 1174, 1178, 1178, 1172, 1181, 1182, 1175, 1183, 1186, 1173, - 1179, 1182, 1186, 1176, 1191, 1184, 68, 1180, 1188, 1181, - 1184, 1187, 1187, 1188, 1189, 1189, 1190, 1183, 1191, 1184, - 1193, 1184, 1192, 1190, 1184, 1192, 1194, 1195, 1196, 1197, - 1198, 1199, 1201, 1196, 1202, 1200, 1195, 1199, 1203, 1193, - 1200, 1208, 1198, 63, 1194, 1202, 1201, 1206, 1197, 1205, - - 1205, 1207, 1206, 1209, 1211, 1210, 1207, 1203, 1209, 1210, - 1212, 1208, 1213, 1211, 1214, 1216, 1215, 1217, 1219, 1215, - 1218, 1220, 1221, 1222, 1217, 1212, 1223, 1213, 1215, 1222, - 1216, 1225, 1218, 1214, 1226, 1228, 1227, 1219, 1224, 1229, - 1221, 1223, 1220, 1230, 1224, 1227, 1231, 1232, 1233, 1235, - 1228, 1225, 1238, 1234, 1226, 1230, 1237, 1239, 1229, 1234, - 1240, 1241, 1237, 1233, 1242, 1231, 1244, 1238, 1240, 1235, - 1243, 1239, 1232, 1246, 1247, 1243, 1248, 1245, 1244, 58, - 1242, 1241, 1245, 1245, 1249, 1249, 1251, 1252, 1247, 1248, - 1255, 1253, 1246, 1250, 1250, 1255, 1252, 1253, 1250, 1251, - - 1256, 1250, 1250, 1254, 1254, 1257, 1250, 1261, 1258, 1256, - 1259, 1257, 1250, 1258, 1264, 1259, 1250, 1260, 1260, 1262, - 1262, 1263, 1265, 1266, 1263, 1268, 1263, 1267, 1261, 1266, - 1269, 1271, 1270, 1272, 1264, 1269, 1267, 1273, 1276, 1272, - 1265, 1277, 1274, 1273, 1275, 1268, 1270, 1274, 1275, 1271, - 1277, 1276, 1279, 1278, 1285, 1277, 1286, 1277, 1278, 1277, - 1282, 1277, 1280, 1280, 1281, 1281, 1279, 1281, 1284, 1285, - 1287, 1282, 1284, 1289, 1286, 1288, 1290, 1292, 1291, 1287, - 1288, 1288, 1289, 1291, 1293, 1294, 1295, 1296, 1297, 1298, - 1298, 1292, 1300, 1293, 1297, 1299, 1301, 1302, 1290, 1303, - - 1300, 1296, 1302, 1304, 1294, 1295, 1306, 1299, 1305, 1307, - 1301, 1308, 1304, 1303, 1310, 1305, 1308, 1309, 1309, 1311, - 1311, 1312, 1314, 1312, 1306, 1314, 1315, 1316, 1317, 1310, - 1319, 1315, 1318, 1318, 1307, 1320, 1320, 1317, 1321, 1321, - 1322, 1323, 1324, 1325, 1328, 1322, 1316, 1326, 1326, 1327, - 1319, 1329, 1330, 1331, 1329, 1332, 1333, 1335, 1338, 1331, - 1332, 1328, 1323, 1324, 1325, 1333, 1334, 1337, 1334, 1327, - 1337, 1339, 1330, 1338, 1340, 1335, 1341, 1342, 1343, 1340, - 1344, 1349, 1342, 1351, 1339, 1344, 1343, 1346, 1345, 1351, - 1341, 1345, 1346, 1347, 1347, 1348, 1352, 1353, 1350, 1349, - - 1348, 1350, 1355, 1352, 1357, 1356, 1360, 1358, 1355, 1357, - 1353, 1356, 1358, 1359, 1361, 1360, 1362, 1363, 1363, 1359, - 1364, 1366, 1369, 1367, 1370, 1371, 1366, 1362, 1372, 1373, - 1374, 1377, 1376, 1361, 1372, 1373, 1374, 1369, 1376, 1378, - 1364, 1367, 1379, 1380, 1370, 1377, 1381, 1382, 1371, 1383, - 1383, 1377, 1384, 1385, 1389, 1380, 1386, 1392, 1387, 1378, - 1381, 1394, 1379, 1387, 1390, 1382, 1388, 1388, 57, 1390, - 1397, 1398, 1384, 1395, 1386, 1393, 1392, 1389, 1385, 1394, - 1393, 1393, 1395, 1396, 1397, 1399, 1398, 1400, 1401, 1409, - 1403, 1396, 1400, 1405, 1402, 1400, 1402, 1401, 1406, 1405, - - 1399, 1407, 1406, 1399, 1403, 1408, 1410, 1411, 1409, 1412, - 1408, 1408, 1407, 1413, 1412, 1414, 1415, 1416, 1413, 1417, - 1414, 1418, 1420, 1426, 1417, 1411, 1421, 1422, 1423, 1423, - 1425, 1424, 1410, 1427, 1415, 1424, 1420, 1416, 1428, 1427, - 1429, 1418, 1426, 1430, 1421, 1422, 1431, 1436, 1425, 1432, - 1428, 1433, 1434, 1435, 1436, 1438, 1429, 1439, 1435, 1444, - 1431, 1440, 1430, 1437, 1432, 1442, 1433, 1443, 1437, 1452, - 1440, 1434, 1448, 1438, 1441, 1441, 1443, 1446, 1439, 1444, - 1442, 1445, 1445, 1446, 1447, 1452, 1448, 1449, 1449, 1451, - 1447, 1450, 1450, 1453, 1454, 1451, 1455, 1456, 1457, 1454, - - 1458, 1458, 1455, 1456, 1457, 1459, 1459, 1461, 1461, 1462, - 1463, 1464, 1465, 1462, 1453, 1468, 1466, 1467, 1470, 1463, - 1469, 1469, 1468, 1471, 1465, 1473, 1474, 1477, 1472, 1464, - 1466, 1471, 1467, 1472, 1479, 1475, 1480, 1476, 1470, 1473, - 1475, 1475, 1476, 1476, 1483, 1474, 1482, 1477, 1478, 1478, - 1481, 1482, 1484, 1479, 1486, 1480, 1485, 1487, 1488, 1481, - 1486, 1489, 1487, 1483, 1490, 1491, 1494, 1492, 1499, 1493, - 1490, 1495, 1484, 1492, 1485, 1493, 1496, 1497, 1488, 1498, - 1500, 1504, 1499, 1503, 1491, 1494, 1503, 1489, 1501, 1505, - 1495, 1502, 1502, 1506, 1509, 1496, 1497, 1517, 1498, 1509, - - 1504, 1500, 1517, 1501, 1511, 1506, 1507, 1507, 1505, 1508, - 1508, 1510, 1512, 1513, 1514, 1510, 1514, 1511, 1516, 1518, - 1514, 1512, 1519, 1520, 1521, 1521, 1513, 1522, 1524, 1523, - 1531, 1525, 1522, 1514, 1518, 1523, 1516, 1528, 1530, 1520, - 1526, 1528, 1519, 1524, 1525, 1527, 1526, 1529, 1531, 1533, - 1527, 1529, 1532, 1534, 1535, 1535, 1537, 1539, 1530, 1534, - 1540, 1532, 1541, 1541, 1542, 1540, 1543, 1545, 1545, 1533, - 1542, 1549, 1547, 1550, 1537, 1547, 1548, 1548, 1539, 1551, - 1553, 1554, 1556, 1553, 1555, 1557, 1543, 1549, 1559, 1550, - 1560, 1556, 1558, 1558, 1561, 1551, 1562, 1567, 1563, 1568, - - 1564, 1562, 1554, 1559, 1555, 1557, 1564, 1565, 1565, 1566, - 1569, 1560, 1563, 1561, 1568, 1567, 1570, 1572, 1566, 1571, - 1571, 1573, 1574, 1575, 1579, 1576, 1578, 1574, 1577, 1577, - 1578, 1572, 1580, 1580, 1581, 1569, 1570, 1583, 1575, 1573, - 1576, 1582, 1584, 1585, 1579, 1586, 1584, 1594, 1583, 1592, - 1586, 1588, 1588, 1590, 1589, 1593, 1581, 1589, 1591, 1595, - 1582, 1594, 1585, 1591, 1597, 1592, 1590, 1596, 1598, 1598, - 1599, 1600, 1601, 1593, 1603, 1599, 1602, 1602, 1595, 1595, - 1604, 1596, 1605, 1603, 1606, 1604, 1606, 1609, 1607, 1597, - 1608, 1600, 1601, 1607, 1610, 1612, 1608, 1613, 1613, 1614, - - 1610, 1617, 1605, 1618, 1615, 1621, 1617, 1609, 1622, 1612, - 1615, 1619, 1619, 1620, 1620, 1623, 1626, 1624, 1614, 1621, - 1624, 1625, 1625, 1627, 1628, 1629, 1622, 1618, 1629, 1636, - 1623, 1629, 1630, 1634, 1626, 1627, 1631, 1632, 1630, 1639, - 1632, 1631, 1634, 1629, 1628, 1635, 1637, 1638, 1638, 1637, - 1635, 1640, 1641, 1645, 1636, 1642, 1632, 1640, 1641, 1645, - 1642, 1643, 1643, 1639, 1644, 1644, 1646, 1647, 1648, 1649, - 1650, 1646, 1651, 1652, 1657, 1651, 1653, 1654, 1662, 1652, - 1647, 1656, 1653, 1654, 1655, 1661, 1648, 1656, 1649, 1655, - 1650, 1658, 1659, 1659, 1660, 1663, 1658, 1657, 1662, 1660, - - 1664, 1665, 1666, 1661, 1667, 1668, 1669, 1670, 1671, 1672, - 1671, 1670, 1673, 1675, 1663, 1665, 1666, 1676, 1667, 1673, - 1664, 1677, 1679, 1668, 1678, 1675, 1681, 1680, 1672, 1676, - 1678, 1669, 1683, 1682, 1677, 1685, 1685, 1686, 1688, 1687, - 1689, 1689, 1679, 1680, 1687, 1690, 1681, 1682, 1691, 1692, - 1688, 1693, 1694, 1683, 52, 1695, 1696, 1686, 1698, 1697, - 1690, 1694, 1691, 1696, 1700, 1702, 1704, 1704, 1697, 1693, - 1695, 1697, 1703, 1692, 1698, 1703, 1705, 1705, 1707, 1700, - 1706, 1710, 1708, 1711, 1700, 1708, 1709, 1709, 1712, 1715, - 1702, 1716, 1706, 1712, 1710, 1713, 1707, 1717, 1713, 1714, - - 1718, 1719, 1711, 1720, 1714, 1721, 1717, 1716, 1715, 1723, - 1719, 1721, 1720, 1719, 1722, 1722, 1723, 1724, 1725, 1718, - 1726, 1727, 1729, 1728, 1730, 1734, 1735, 1729, 1729, 1730, - 1731, 1725, 1736, 1736, 1738, 1727, 1737, 1724, 1726, 1728, - 1739, 1739, 1731, 1738, 1735, 1739, 1740, 1740, 1741, 1742, - 1734, 1743, 1737, 1744, 1742, 1745, 1748, 1741, 1746, 1750, - 1741, 1740, 1749, 1746, 1746, 1752, 1751, 1754, 47, 1743, - 1748, 1751, 1753, 1745, 1744, 1755, 1755, 1749, 1753, 1752, - 1756, 1750, 1757, 1758, 1759, 1754, 1756, 1757, 1760, 1762, - 1759, 1763, 1764, 1765, 1760, 1767, 1769, 1758, 1764, 1766, - - 1771, 1767, 1766, 1772, 1769, 1763, 1765, 1773, 1766, 1762, - 1774, 1775, 1776, 18, 1777, 1778, 1775, 1779, 1774, 1771, - 1780, 1776, 1772, 1781, 1778, 1783, 1773, 1777, 1782, 1782, - 1779, 1783, 1784, 1785, 1780, 1786, 1785, 1781, 1784, 1787, - 1787, 1788, 1789, 1790, 1791, 1791, 1792, 1793, 1786, 1794, - 1782, 1795, 1797, 1793, 1796, 1799, 1799, 1800, 1802, 1792, - 1789, 1788, 1790, 1802, 1801, 1803, 1806, 1795, 1801, 1796, - 1797, 1794, 1807, 1804, 1805, 1806, 1809, 1800, 1804, 1805, - 1810, 1811, 1812, 1813, 1811, 1803, 1815, 1809, 1816, 1810, - 1814, 1814, 1817, 1819, 1812, 1807, 1818, 1818, 1813, 1820, - - 1816, 1821, 1822, 1824, 1825, 1815, 1820, 1819, 1827, 1826, - 1828, 1817, 1829, 1821, 1822, 1826, 1830, 1830, 1829, 17, - 1827, 1838, 1824, 1831, 1825, 1835, 1831, 1834, 1828, 1832, - 1832, 1836, 1834, 1838, 1835, 1837, 1837, 1836, 1839, 1840, - 1839, 1841, 1840, 1842, 1843, 1844, 1845, 1846, 1847, 1849, - 1850, 1845, 1846, 1852, 1848, 1850, 1855, 1847, 1851, 1856, - 1856, 1841, 1843, 1844, 1849, 1842, 1848, 1851, 1858, 1853, - 1854, 1855, 1857, 1852, 1853, 1854, 1860, 1861, 1857, 1862, - 1851, 1853, 1864, 1863, 1865, 0, 1865, 1866, 1870, 1858, - 1867, 1867, 1860, 1868, 1868, 1873, 1861, 1874, 1862, 1863, - - 1875, 1866, 1864, 1866, 1869, 1869, 1871, 1871, 1870, 1872, - 1872, 1876, 1876, 1877, 1878, 1882, 1873, 1877, 1874, 1879, - 1878, 1875, 1879, 1881, 1883, 1885, 1884, 1887, 1887, 1881, - 1883, 1884, 1886, 1882, 1888, 1886, 1889, 1890, 1890, 1892, - 1891, 1889, 1893, 1894, 1895, 1895, 1896, 1893, 1894, 1898, - 1885, 1896, 1897, 1899, 1888, 1891, 1900, 1901, 1897, 1902, - 1892, 1898, 1898, 1898, 1903, 1902, 1905, 1906, 1898, 1909, - 1907, 1905, 1905, 1899, 1900, 1910, 1908, 1901, 1908, 1913, - 1909, 1906, 1911, 1912, 1903, 1907, 1914, 1916, 1911, 1918, - 1910, 1922, 1912, 1915, 1915, 1917, 1917, 1919, 1926, 1913, - - 1920, 1920, 1921, 1921, 1925, 1925, 1927, 1914, 1929, 1918, - 1930, 1922, 1931, 1916, 1932, 1927, 1934, 1929, 1931, 1919, - 1933, 1933, 1936, 1926, 1935, 1937, 1938, 1939, 1939, 1936, - 1932, 1930, 1940, 1941, 1937, 1943, 1945, 1934, 1944, 1935, - 1946, 1943, 1945, 1944, 1947, 1951, 1949, 1948, 1949, 1941, - 1952, 1947, 1938, 1948, 1953, 1953, 1952, 1954, 1940, 1955, - 1946, 1956, 1954, 1957, 1951, 1959, 1958, 1960, 1955, 1958, - 1960, 1961, 1962, 1963, 1963, 1966, 1967, 1959, 1964, 1965, - 1970, 1956, 1957, 1968, 1964, 1965, 1971, 1968, 1972, 1961, - 1974, 1967, 1975, 1972, 1976, 1966, 1973, 1973, 1962, 1978, - - 1970, 1979, 0, 1968, 1981, 1979, 1980, 1980, 1971, 1976, - 1981, 1975, 1982, 1984, 1974, 1983, 1983, 1984, 1978, 1985, - 1987, 1982, 1986, 1986, 1988, 1989, 1990, 1991, 1992, 1993, - 1985, 1990, 1995, 1994, 2003, 1985, 1996, 1997, 1988, 1994, - 1998, 1987, 1997, 2003, 1989, 1999, 1999, 1991, 1992, 1993, - 1995, 1996, 2001, 1998, 2000, 2000, 2001, 2004, 2005, 2006, - 2007, 2007, 2009, 2009, 2006, 2010, 2011, 2014, 2004, 2013, - 2010, 2010, 2011, 2004, 2015, 2013, 2016, 2018, 2005, 2015, - 2017, 2021, 2020, 2018, 2022, 2021, 2023, 2023, 2016, 2024, - 2026, 2017, 2025, 2014, 2020, 2027, 2022, 2029, 2025, 2028, - - 2028, 2027, 2030, 2031, 2035, 2032, 2034, 2043, 2031, 2042, - 2036, 2302, 2026, 2043, 2024, 2036, 2029, 2032, 2034, 2039, - 2039, 2038, 2030, 2035, 2038, 2040, 2040, 2041, 2041, 2042, - 2044, 2047, 2045, 2046, 2052, 2302, 2044, 2045, 2049, 2046, - 2047, 2051, 2055, 2049, 2051, 2056, 2052, 2053, 2053, 2059, - 2057, 2058, 2058, 2064, 2055, 2057, 2060, 2056, 2059, 2061, - 2062, 2060, 2065, 2062, 2061, 2063, 2063, 2066, 2067, 2070, - 2068, 2065, 2069, 2064, 2068, 2070, 2071, 2069, 2073, 2072, - 2077, 2074, 2078, 2079, 2080, 2066, 2084, 2067, 2072, 2076, - 2076, 2078, 2079, 2082, 2071, 2074, 2073, 2083, 2077, 2081, - - 2081, 2076, 2082, 2085, 2080, 2086, 2092, 2084, 2085, 2083, - 2089, 2089, 2091, 2093, 2094, 2091, 2096, 2098, 2086, 2097, - 2099, 2102, 2092, 2098, 2100, 2100, 2101, 2109, 2101, 2093, - 2094, 2096, 2104, 2097, 2103, 2103, 2114, 2099, 2118, 2102, - 2104, 2106, 2106, 2107, 2107, 2110, 2111, 2112, 2113, 2115, - 2109, 2110, 2111, 2116, 2116, 2113, 2117, 2117, 2114, 2118, - 2119, 2112, 2120, 2121, 2122, 2117, 2123, 2124, 2127, 2115, - 2128, 2125, 2119, 2125, 2120, 2129, 2122, 2125, 2121, 2130, - 2130, 2131, 2124, 2132, 2135, 0, 2133, 2129, 2127, 2133, - 2125, 2134, 2123, 2128, 2139, 2137, 2134, 2140, 2145, 2131, - - 2137, 2141, 2140, 2132, 2135, 2138, 2143, 2138, 2141, 2146, - 2147, 2148, 2139, 2148, 2149, 2143, 2145, 2150, 2146, 2152, - 2153, 2152, 2147, 2150, 2154, 2154, 2155, 2156, 2157, 2160, - 2157, 2158, 2156, 2149, 2153, 2159, 2158, 2161, 2162, 2163, - 2159, 2164, 2166, 2165, 2167, 2163, 2164, 2160, 2170, 2167, - 2167, 2168, 2155, 2174, 2166, 2161, 2165, 2171, 2162, 2168, - 2172, 2172, 2173, 2173, 2174, 2175, 2176, 2170, 2177, 2180, - 2178, 2171, 2183, 2181, 2177, 2178, 2179, 2188, 2179, 2186, - 2175, 2181, 2182, 2182, 2183, 0, 2176, 2180, 2186, 2181, - 2184, 2184, 2185, 2185, 2187, 2188, 2190, 2191, 2193, 2187, - - 2190, 2192, 2194, 2192, 2195, 2196, 2191, 2194, 2194, 2191, - 2197, 2199, 2200, 2201, 2196, 2203, 2195, 2200, 2201, 2193, - 2204, 2205, 2197, 2199, 2206, 2206, 2207, 2208, 2203, 2209, - 2205, 2211, 2210, 2214, 2216, 2212, 2213, 2218, 2214, 2228, - 2204, 2217, 2222, 2221, 2207, 2208, 2216, 2209, 2210, 2212, - 2219, 2213, 2221, 2217, 2220, 2219, 2211, 2218, 2225, 2220, - 2222, 2227, 2228, 2229, 2225, 2230, 2231, 2227, 2234, 2234, - 2232, 2233, 2235, 2236, 2236, 2237, 2238, 2225, 2229, 2232, - 2233, 2235, 2239, 2230, 2240, 2241, 2239, 2243, 2244, 2240, - 2245, 2231, 2250, 2237, 2244, 2238, 2246, 2247, 2241, 2248, - - 2250, 2246, 2246, 2247, 2249, 2248, 2243, 2249, 2251, 2254, - 2254, 2256, 2245, 2259, 2255, 2255, 2257, 2257, 2258, 2258, - 2256, 2260, 2262, 0, 2261, 2259, 2269, 2262, 2251, 2255, - 2261, 2263, 2263, 2264, 2264, 2271, 2265, 2266, 2268, 2260, - 2255, 2265, 2268, 2266, 2270, 2273, 2269, 2274, 2270, 2275, - 2276, 2277, 2274, 2278, 2280, 2271, 2277, 2279, 2281, 2282, - 2283, 2283, 2284, 2281, 2285, 2276, 2284, 2287, 2288, 2289, - 2273, 2278, 2275, 2279, 2280, 2286, 2290, 2291, 2292, 2285, - 2286, 2282, 2293, 2292, 2294, 2287, 2298, 2289, 2290, 2295, - 2295, 2297, 2299, 2300, 2288, 2293, 2291, 2301, 2303, 2297, - - 2304, 2305, 2294, 2306, 2307, 2298, 2311, 2309, 2313, 2312, - 2307, 2299, 2300, 2305, 2313, 2315, 2314, 2303, 2314, 2311, - 2301, 2304, 2309, 2312, 2306, 2316, 2316, 2317, 2318, 2319, - 2320, 2318, 2317, 2321, 0, 2315, 2322, 2323, 2323, 2324, - 2324, 2325, 2319, 2325, 2326, 2326, 2327, 2321, 2331, 2322, - 2328, 2329, 2329, 2337, 2320, 2330, 2330, 2331, 2332, 2332, - 2331, 2327, 2334, 2328, 2333, 2333, 2336, 2334, 2338, 2339, - 2342, 2336, 2344, 2337, 2340, 2340, 2341, 2341, 2343, 2343, - 2346, 2339, 2345, 2345, 2348, 2348, 2347, 2350, 2338, 2342, - 2344, 2347, 2349, 2349, 2351, 2346, 2352, 2353, 2354, 2356, - - 2358, 2350, 2360, 2351, 2356, 2357, 2357, 2359, 2359, 2361, - 2362, 2353, 2363, 2352, 2361, 2363, 2362, 2354, 2367, 2358, - 2360, 2364, 2364, 2365, 2365, 2366, 2368, 2370, 2368, 2371, - 2372, 2372, 2374, 2367, 2375, 2376, 2377, 2364, 2380, 2378, - 2379, 2379, 2370, 2378, 2366, 2381, 2382, 2383, 2371, 2375, - 2381, 2377, 2374, 2385, 2385, 2386, 2387, 2380, 2376, 2388, - 2389, 2382, 2383, 2387, 2390, 2391, 2392, 2393, 2393, 2395, - 2394, 2395, 2402, 2388, 2399, 2386, 2403, 2398, 2389, 2394, - 2391, 2396, 2390, 2398, 2396, 2400, 2399, 2404, 2401, 2403, - 2400, 2405, 2392, 2401, 2406, 2408, 2405, 2402, 2409, 2396, - - 2408, 2396, 2410, 2409, 2411, 2412, 2413, 2410, 2404, 2414, - 2415, 2412, 2413, 2417, 2419, 2416, 2420, 2418, 2417, 2411, - 2406, 2416, 2418, 2421, 2422, 2415, 2421, 2423, 2424, 2420, - 2414, 2425, 2426, 2427, 2431, 2433, 2423, 2424, 2431, 2419, - 2425, 2426, 2428, 2429, 2422, 2430, 2435, 2427, 2428, 2429, - 2430, 2436, 2437, 2437, 2440, 2433, 2438, 2443, 2439, 2439, - 2436, 2448, 2438, 2440, 2441, 2441, 2435, 2439, 2442, 2445, - 2446, 2447, 2447, 2442, 2449, 2451, 2448, 2443, 2452, 2443, - 2453, 2454, 2458, 2449, 2457, 2445, 2446, 2451, 2456, 2457, - 0, 2456, 2459, 2454, 2452, 2453, 2460, 2460, 2461, 2461, - - 2463, 2463, 2458, 2464, 2459, 2465, 2464, 2466, 2467, 2468, - 2465, 2469, 2469, 2466, 2467, 2470, 2471, 2471, 2468, 2472, - 2473, 2474, 2475, 2475, 2476, 2477, 2516, 2478, 2516, 2470, - 2476, 2472, 2478, 2480, 2473, 2481, 2485, 2480, 2481, 2477, - 2474, 2482, 2482, 2483, 2484, 2485, 2486, 2487, 2483, 2484, - 2488, 2489, 2489, 2490, 2488, 2486, 2492, 2493, 2494, 2495, - 2496, 2492, 2498, 2500, 2497, 2499, 2490, 2487, 2497, 2500, - 2499, 2502, 2502, 2503, 2496, 2501, 2504, 2493, 2494, 2495, - 2505, 2501, 2498, 2506, 2507, 2508, 2508, 2511, 2506, 2510, - 2513, 2503, 2512, 2518, 2514, 2504, 2513, 2512, 2515, 2505, - - 2514, 2510, 2518, 2511, 2520, 2507, 2515, 2521, 2521, 2522, - 2523, 2524, 2522, 2523, 2525, 2525, 2528, 2529, 2520, 2530, - 2528, 2531, 2531, 2529, 2532, 2535, 2535, 2537, 2539, 2543, - 2540, 2530, 2544, 2532, 2543, 2545, 2546, 2524, 2547, 2548, - 2548, 2546, 2539, 2547, 2552, 2537, 2540, 2550, 2550, 2553, - 2552, 2554, 2554, 2556, 2555, 2557, 2545, 2559, 2544, 2560, - 2557, 2561, 2560, 2563, 2563, 2562, 2566, 2568, 2567, 2553, - 2555, 2565, 2566, 2561, 2567, 2556, 2559, 2562, 2569, 2573, - 2565, 2571, 2571, 2572, 2574, 2568, 2572, 2576, 2576, 2577, - 2577, 2578, 2579, 2569, 2580, 2581, 2578, 2584, 2573, 2582, - - 2585, 2586, 2574, 2580, 2582, 2583, 2588, 2583, 2581, 2589, - 2579, 2584, 2587, 2586, 2585, 2590, 2596, 2587, 2591, 2591, - 2590, 2592, 2592, 2593, 2593, 2595, 2588, 2594, 2594, 2589, - 2597, 2598, 2598, 2601, 2596, 2597, 2602, 2595, 2599, 2599, - 2600, 2600, 2603, 2604, 2605, 2601, 2606, 2607, 2607, 2608, - 2609, 2609, 2610, 2610, 2603, 2611, 2602, 2612, 2612, 2613, - 2614, 2615, 2606, 2604, 2616, 2605, 2611, 2614, 2608, 2617, - 2618, 2613, 2619, 2615, 2617, 2620, 2621, 2621, 2622, 2623, - 2623, 2624, 2625, 2626, 2616, 2627, 2628, 2622, 2629, 2630, - 2618, 2630, 2619, 2631, 2620, 2633, 2626, 2632, 2632, 2634, - - 2628, 2635, 2625, 2637, 2633, 2631, 2638, 2624, 2639, 2627, - 2629, 2641, 2640, 2642, 2634, 2640, 2635, 2643, 2642, 2644, - 2644, 2637, 2643, 2645, 2645, 2641, 2646, 2646, 2638, 2648, - 2648, 2639, 2650, 2650, 2651, 2652, 2653, 2656, 2654, 2658, - 2657, 2660, 2659, 2661, 2663, 2662, 2652, 2662, 2664, 2665, - 2660, 2671, 2651, 2654, 2670, 2653, 0, 2656, 2657, 2666, - 2666, 2658, 2659, 2661, 2663, 2668, 2664, 2665, 2670, 2668, - 2669, 2669, 2672, 2671, 2673, 2673, 2675, 2676, 2676, 2677, - 2678, 2672, 2679, 2680, 2681, 2675, 2682, 2683, 2686, 2685, - 2680, 2684, 2687, 2687, 2689, 2686, 0, 2677, 2678, 2681, - - 2679, 2688, 2688, 2690, 2682, 2683, 2691, 2684, 2685, 2693, - 2693, 2695, 2691, 2696, 2689, 2694, 2694, 2695, 2697, 2698, - 2699, 2690, 2701, 2700, 2702, 2704, 0, 2701, 2705, 2703, - 2706, 2696, 2706, 2705, 2698, 2711, 2697, 2700, 2713, 2699, - 2703, 2707, 2707, 2714, 2702, 2704, 2708, 2713, 2708, 2709, - 2709, 2715, 2716, 2717, 2711, 2718, 2719, 2723, 2717, 2720, - 2718, 2724, 2714, 2715, 2725, 2726, 2726, 2725, 2727, 2728, - 2729, 2729, 2716, 2730, 2731, 2734, 2719, 2723, 2720, 2724, - 2735, 2732, 2738, 2727, 2730, 2732, 2735, 2728, 2736, 2731, - 2734, 2740, 2736, 2737, 2737, 2738, 2741, 2742, 2743, 2743, - - 2745, 2746, 2750, 2747, 2748, 2748, 2740, 2747, 2749, 2749, - 2746, 2755, 2745, 2751, 2751, 2752, 2741, 2742, 2753, 2754, - 2752, 2750, 2756, 2755, 2757, 2757, 2763, 2753, 2762, 2762, - 2764, 2764, 2765, 2766, 2767, 2754, 2771, 2771, 2772, 2773, - 2768, 2769, 2756, 2770, 2784, 2765, 2766, 2767, 2763, 2768, - 2769, 2781, 2770, 0, 2773, 2775, 2775, 2778, 2772, 2780, - 2783, 2782, 2778, 2784, 2780, 2781, 2782, 2785, 2783, 2786, - 2787, 2787, 2789, 2791, 2792, 2793, 2785, 2786, 2791, 2792, - 2794, 2794, 2795, 2795, 2796, 2797, 2799, 2789, 2801, 2796, - 2793, 2798, 2798, 2799, 2800, 2802, 2803, 2806, 2804, 2800, - - 2805, 2805, 2803, 2804, 2797, 2807, 2801, 2808, 2808, 2812, - 2807, 0, 2806, 2802, 2809, 2809, 2813, 2813, 2814, 2815, - 2818, 2814, 2812, 2816, 2815, 2815, 2817, 2819, 2816, 2822, - 2821, 2817, 2820, 2819, 2818, 2821, 2820, 2823, 2822, 2824, - 2825, 2828, 2826, 2827, 2829, 2836, 2828, 2824, 2826, 2827, - 2830, 2830, 2823, 2832, 2833, 2834, 2829, 2836, 2834, 2833, - 2832, 2825, 2838, 2839, 2840, 2841, 2842, 2838, 2839, 2840, - 2850, 2843, 2844, 2845, 2845, 2846, 2855, 2847, 2856, 2842, - 2843, 2844, 2847, 2841, 2846, 2851, 2852, 2857, 2850, 2858, - 2860, 2851, 2852, 2859, 2859, 2855, 2861, 2860, 2856, 2863, - - 2862, 2864, 2865, 2865, 2866, 2868, 2870, 2857, 2858, 2862, - 2872, 2872, 2873, 2871, 2863, 2861, 2864, 2871, 2874, 2875, - 2868, 2876, 2877, 2866, 2874, 2875, 2870, 2879, 2877, 2878, - 2878, 2880, 2883, 2881, 2884, 2879, 2886, 2873, 2881, 2876, - 2887, 2883, 2886, 2887, 2888, 2889, 2891, 2884, 2888, 2890, - 2890, 2893, 2893, 2894, 2895, 2895, 2880, 2896, 2896, 2889, - 2899, 2891, 2898, 2898, 2899, 2900, 2901, 2903, 2903, 2905, - 2900, 2894, 2906, 2907, 2908, 2901, 2909, 2906, 2911, 2908, - 2908, 2912, 2912, 2914, 2914, 2907, 2915, 2915, 2909, 2905, - 2916, 2916, 2917, 2918, 2919, 2917, 2921, 2921, 2911, 2922, - - 2924, 2925, 2925, 2926, 2926, 2930, 2918, 2919, 2927, 2927, - 2928, 2929, 2929, 2931, 2933, 2934, 2943, 2922, 2930, 2940, - 2924, 2934, 2935, 2935, 2940, 2928, 2936, 2939, 2933, 2942, - 2936, 2931, 2944, 2939, 2942, 2942, 2945, 2946, 2947, 2943, - 2948, 2949, 2955, 2946, 2947, 2949, 2950, 2950, 2953, 2958, - 2955, 2956, 2944, 2953, 2956, 2959, 2945, 2962, 2959, 2960, - 2960, 2961, 2962, 2963, 2964, 2948, 2965, 2966, 2966, 2967, - 2970, 2973, 2969, 2975, 2958, 3019, 2973, 2973, 2961, 2961, - 2965, 2963, 2968, 2967, 2964, 2968, 2969, 2971, 2985, 2970, - 3019, 2974, 2975, 2968, 2982, 2971, 2974, 2974, 2976, 2976, - - 2977, 2977, 2978, 2978, 2979, 2979, 2980, 2980, 2981, 2981, - 2982, 2983, 2984, 2986, 2985, 2987, 2983, 2988, 2989, 2990, - 2987, 2991, 2992, 2989, 2993, 2995, 2995, 2986, 2990, 2996, - 2996, 2997, 2984, 2998, 2997, 2999, 2988, 3001, 3001, 2998, - 3002, 2991, 2992, 3004, 2993, 3003, 3003, 3002, 3004, 3006, - 3006, 3007, 3008, 2999, 3009, 3010, 3012, 3013, 3013, 3016, - 3007, 3008, 3017, 3009, 3010, 3014, 3014, 3015, 3016, 3018, - 3020, 3015, 3022, 3023, 3012, 3020, 3020, 3029, 3029, 3024, - 3018, 3017, 3023, 3024, 3028, 3022, 3030, 3032, 3032, 3028, - 3033, 3034, 3035, 3037, 3037, 3039, 3038, 3043, 3044, 3045, - - 3030, 3047, 3050, 3044, 3033, 3038, 3048, 3039, 3045, 3052, - 3035, 3068, 3048, 3054, 3050, 3055, 3034, 3057, 3054, 3061, - 3055, 3047, 3043, 3056, 3056, 3060, 3057, 3059, 3064, 3064, - 3052, 3068, 3059, 3061, 3069, 3062, 3062, 3067, 3060, 3062, - 3065, 3065, 3066, 3066, 3070, 3072, 3067, 3073, 3076, 3070, - 3074, 3072, 3073, 3069, 3078, 3074, 3075, 3075, 3077, 3079, - 3080, 3081, 3082, 3093, 3079, 3089, 3076, 3081, 3083, 3083, - 3077, 3090, 3085, 3091, 3086, 3078, 3085, 3087, 3080, 3086, - 3088, 3088, 3087, 3093, 3089, 3097, 3090, 3082, 3091, 3095, - 3095, 3098, 3099, 3100, 3101, 3102, 3103, 3100, 3097, 3104, - - 3106, 3105, 3110, 3101, 3098, 3099, 3105, 3104, 3107, 3107, - 3108, 3102, 3109, 3111, 3111, 3103, 3112, 3112, 3113, 3108, - 3106, 3116, 3120, 3117, 3118, 3118, 3116, 3116, 3110, 3117, - 3109, 3122, 3122, 3124, 3125, 3126, 3127, 3113, 3132, 3128, - 3126, 3131, 3131, 3120, 3128, 3133, 3135, 3134, 3136, 3124, - 3125, 3139, 3127, 3134, 3133, 3138, 3138, 3140, 3132, 3141, - 3141, 3145, 3143, 3149, 3146, 3139, 3147, 3136, 3143, 3135, - 3146, 3147, 3150, 3150, 3151, 3151, 3140, 3152, 3153, 3154, - 3154, 3145, 3155, 3157, 3158, 3149, 3156, 3159, 3160, 3161, - 3158, 3164, 3152, 3155, 3164, 3156, 3162, 3162, 3153, 3154, - - 3160, 3163, 3165, 3157, 3171, 3165, 3159, 3166, 3166, 3161, - 3170, 3172, 3173, 3173, 3175, 3174, 3163, 3172, 3174, 3176, - 3175, 3178, 3170, 3181, 3171, 3180, 3178, 3179, 3179, 3182, - 3180, 3183, 3184, 3184, 3186, 3182, 3187, 3176, 3188, 3189, - 3190, 3190, 3181, 3191, 3192, 3199, 3186, 3193, 3183, 3183, - 3195, 3195, 3189, 3206, 3187, 0, 3193, 3196, 3196, 3199, - 3192, 3198, 3191, 3188, 3197, 3197, 3198, 3200, 3201, 3201, - 3202, 3202, 3200, 3203, 3203, 3204, 3204, 3205, 3207, 3206, - 3208, 3211, 3211, 3212, 3207, 3208, 3214, 3214, 3216, 3218, - 3205, 3219, 3221, 3220, 3222, 3222, 3224, 3224, 3225, 3212, - - 3226, 3227, 3228, 3230, 3230, 3231, 3231, 3216, 3229, 3233, - 3234, 3218, 3220, 3219, 3221, 3227, 3234, 3229, 3235, 3226, - 3236, 3237, 3228, 3240, 3225, 0, 3237, 3233, 3241, 3241, - 3243, 3243, 3244, 3245, 3246, 3248, 3247, 3244, 3235, 3236, - 3246, 3249, 3249, 3248, 3240, 3250, 3253, 3245, 3247, 3252, - 3250, 3253, 3254, 3252, 3255, 3256, 3257, 3258, 3260, 3261, - 3256, 3262, 3263, 3258, 3266, 3265, 3260, 3267, 3257, 3268, - 3269, 3271, 3254, 3272, 3255, 3269, 3271, 3276, 3261, 0, - 3266, 3262, 3263, 3265, 3267, 3267, 3273, 3278, 3277, 3274, - 3268, 3277, 3273, 3272, 3274, 3282, 3282, 3276, 3283, 3283, - - 3278, 3284, 3289, 3289, 3290, 3284, 3291, 3292, 3292, 3290, - 0, 3294, 3296, 3296, 3297, 3297, 3301, 3297, 3298, 3298, - 3301, 3298, 3299, 3299, 3303, 3291, 3294, 3300, 3300, 3303, - 3300, 3304, 3305, 3305, 3306, 3307, 3310, 3310, 3311, 3312, - 3304, 3313, 3314, 3314, 3315, 3318, 3313, 3319, 3321, 3307, - 3322, 3320, 3306, 3324, 3319, 3320, 3325, 3321, 3311, 3312, - 3327, 3325, 3326, 3326, 3315, 3322, 3328, 3328, 3331, 3327, - 3318, 3324, 3329, 3329, 3330, 3330, 3332, 3333, 3336, 3334, - 3337, 3332, 3335, 3331, 3334, 3334, 3333, 3338, 3335, 3333, - 3341, 3339, 3340, 3342, 3342, 3337, 3339, 3340, 3343, 3344, - - 3345, 3345, 3347, 3336, 3343, 3344, 3346, 3346, 3338, 3341, - 3348, 3351, 3351, 3353, 3353, 3348, 3354, 3347, 3356, 3358, - 3358, 3359, 3359, 3360, 3360, 3354, 3361, 3361, 3363, 3363, - 3364, 3364, 3365, 3365, 3366, 3366, 3356, 3367, 3369, 3370, - 3370, 3371, 3371, 3372, 3373, 3374, 3379, 3369, 3376, 3376, - 3377, 3380, 3372, 3378, 3378, 3381, 3373, 3382, 3382, 3383, - 3383, 3379, 3385, 3367, 3380, 3374, 3389, 3381, 3391, 3377, - 3386, 3386, 3390, 3392, 3392, 3390, 3395, 3385, 3393, 3395, - 3396, 3397, 3398, 3399, 3389, 3400, 3396, 3398, 3401, 3404, - 3411, 3403, 3408, 3412, 3391, 3397, 3393, 3403, 3404, 3426, - - 3426, 3407, 3399, 3400, 3401, 3407, 3421, 3408, 3425, 3422, - 3431, 3421, 3422, 3412, 3427, 3427, 3411, 3429, 3429, 3432, - 3433, 3425, 3434, 3436, 3433, 3438, 3440, 3439, 3432, 3442, - 3441, 3440, 3441, 3431, 3443, 3443, 3444, 3436, 3439, 3445, - 3447, 3446, 3434, 3448, 3442, 3449, 3450, 3452, 3438, 3444, - 3451, 3453, 3452, 3462, 3455, 3450, 3447, 3457, 3445, 3446, - 3449, 3454, 3451, 3456, 3456, 3458, 3454, 3462, 3448, 3463, - 3458, 3465, 3453, 3455, 3464, 3464, 3470, 3457, 3466, 3466, - 3465, 3467, 3467, 3468, 3468, 3469, 3469, 3471, 3472, 3463, - 3475, 3472, 3473, 3474, 3476, 3470, 3477, 3473, 3474, 3478, - - 3479, 3480, 3477, 3481, 3481, 3482, 3480, 3471, 3487, 3476, - 3483, 3483, 3479, 3478, 3488, 3475, 3484, 3484, 3486, 3486, - 3489, 3489, 3491, 3487, 3493, 3482, 3496, 3496, 3497, 3497, - 3498, 3499, 3502, 3488, 3500, 3501, 3503, 3491, 3498, 3504, - 3500, 3501, 3493, 3505, 3506, 3506, 3502, 3512, 3505, 3503, - 3499, 3508, 3508, 3513, 3518, 3515, 3516, 3519, 3504, 3520, - 3516, 3523, 3519, 3521, 3522, 3524, 3525, 3529, 3512, 3515, - 3524, 3525, 3530, 3513, 3518, 3531, 3521, 3522, 3520, 3534, - 3523, 3526, 3526, 3532, 3532, 3534, 3533, 3529, 3535, 3535, - 3530, 3533, 3536, 3537, 3531, 3538, 3539, 3536, 3537, 3540, - - 3538, 3542, 3542, 3543, 3547, 3540, 3544, 3544, 3543, 3546, - 3548, 3549, 3550, 3546, 3551, 3539, 3552, 3548, 3560, 3553, - 3551, 3555, 3555, 3547, 3557, 3557, 3561, 3558, 3559, 3562, - 3549, 3550, 3553, 3559, 3565, 3552, 3558, 3560, 3564, 3558, - 3563, 3563, 3562, 3564, 3567, 3561, 3569, 3565, 3568, 3568, - 3570, 3570, 3571, 3571, 3572, 3573, 3574, 3575, 3575, 3572, - 0, 3576, 3573, 3578, 3578, 3569, 3576, 3577, 3581, 3577, - 3567, 3579, 3580, 3583, 3586, 3574, 3582, 3590, 3579, 3580, - 3588, 3582, 3585, 3585, 3589, 3588, 3591, 3581, 3595, 3589, - 3592, 3592, 3583, 3586, 3594, 3594, 3590, 3596, 3597, 3597, - - 3598, 3598, 3599, 3601, 3601, 3591, 3603, 3595, 3609, 3599, - 3602, 3602, 3605, 3603, 3608, 3610, 3596, 3605, 0, 3608, - 3611, 3611, 3612, 3612, 0, 0, 0, 3609, 0, 0, - 0, 0, 0, 0, 3610, 3616, 3616, 3616, 3616, 3616, - 3616, 3616, 3617, 3617, 3617, 3617, 3617, 3617, 3617, 3618, - 3618, 3618, 3618, 3618, 3618, 3618, 3619, 3619, 3619, 3619, - 3619, 3619, 3619, 3620, 3620, 3620, 3620, 3620, 3620, 3620, - 3621, 3621, 3621, 3621, 3621, 3621, 3621, 3622, 3622, 3622, - 3622, 3622, 3622, 3622, 3624, 3624, 0, 3624, 3624, 3624, - 3624, 3625, 3625, 0, 0, 0, 3625, 3625, 3626, 3626, - - 0, 0, 3626, 0, 3626, 3627, 0, 0, 0, 0, - 0, 3627, 3628, 3628, 0, 0, 0, 3628, 3628, 3629, - 0, 0, 0, 0, 0, 3629, 3630, 3630, 0, 3630, - 3630, 3630, 3630, 3631, 0, 0, 0, 0, 0, 3631, - 3632, 3632, 0, 0, 0, 3632, 3632, 3633, 3633, 0, - 3633, 3633, 3633, 3633, 3615, 3615, 3615, 3615, 3615, 3615, - 3615, 3615, 3615, 3615, 3615, 3615, 3615, 3615, 3615, 3615, - 3615, 3615, 3615, 3615, 3615, 3615, 3615, 3615, 3615, 3615, - 3615, 3615, 3615, 3615, 3615, 3615, 3615, 3615, 3615, 3615, - 3615, 3615, 3615, 3615, 3615 - + 14, 14, 14, 100, 14, 12, 15, 15, 15, 38, + 23, 14, 23, 23, 12, 23, 150, 15, 16, 16, + 16, 23, 23, 27, 27, 30, 30, 31, 31, 16, + 25, 27, 150, 25, 25, 27, 31, 25, 27, 32, + 30, 46, 25, 32, 25, 112, 32, 31, 40, 45, + 45, 25, 28, 32, 45, 32, 46, 28, 45, 36, + 36, 28, 40, 112, 28, 73, 28, 28, 36, 56, + 37, 37, 56, 92, 36, 37, 92, 28, 36, 73, + + 41, 41, 67, 67, 87, 41, 84, 84, 87, 37, + 3003, 37, 39, 39, 42, 41, 41, 39, 41, 42, + 96, 39, 42, 43, 43, 97, 43, 39, 44, 42, + 39, 94, 44, 42, 42, 43, 93, 39, 94, 96, + 93, 43, 44, 146, 44, 97, 44, 44, 62, 146, + 62, 62, 70, 62, 70, 70, 72, 70, 72, 72, + 79, 72, 79, 79, 70, 79, 86, 95, 86, 86, + 89, 86, 89, 89, 102, 89, 101, 86, 106, 95, + 98, 89, 89, 98, 99, 101, 105, 99, 102, 102, + 103, 104, 107, 108, 110, 113, 103, 106, 107, 114, + + 99, 109, 103, 114, 103, 111, 109, 108, 105, 104, + 104, 107, 115, 113, 110, 109, 111, 111, 116, 117, + 119, 120, 118, 116, 111, 118, 119, 123, 118, 121, + 124, 125, 115, 117, 121, 125, 122, 127, 129, 122, + 120, 118, 118, 122, 124, 119, 123, 129, 126, 128, + 127, 123, 130, 131, 121, 126, 128, 132, 133, 122, + 134, 132, 135, 136, 134, 130, 137, 139, 136, 138, + 138, 140, 136, 131, 141, 140, 133, 142, 136, 143, + 135, 145, 144, 147, 140, 144, 137, 139, 151, 141, + 140, 148, 148, 152, 145, 147, 144, 149, 143, 155, + + 144, 153, 159, 142, 149, 163, 163, 151, 154, 148, + 154, 156, 148, 158, 152, 149, 157, 153, 155, 154, + 159, 157, 160, 156, 161, 158, 165, 160, 199, 165, + 167, 154, 167, 167, 199, 167, 170, 170, 161, 172, + 185, 172, 172, 173, 172, 173, 173, 175, 173, 177, + 175, 177, 177, 181, 177, 173, 180, 180, 181, 182, + 183, 184, 186, 185, 187, 182, 189, 190, 191, 192, + 186, 188, 193, 191, 182, 187, 184, 186, 183, 188, + 195, 194, 190, 193, 196, 189, 195, 195, 197, 192, + 194, 198, 198, 197, 200, 203, 200, 201, 210, 200, + + 205, 201, 202, 202, 210, 206, 201, 203, 204, 196, + 206, 201, 208, 204, 204, 207, 200, 201, 201, 205, + 207, 209, 211, 212, 208, 214, 211, 210, 212, 213, + 217, 215, 216, 218, 222, 219, 223, 221, 218, 214, + 219, 209, 221, 228, 216, 213, 215, 216, 217, 220, + 220, 224, 223, 220, 222, 220, 226, 224, 225, 225, + 227, 231, 226, 228, 229, 230, 227, 220, 226, 220, + 229, 230, 232, 235, 233, 234, 241, 235, 232, 233, + 230, 234, 231, 236, 237, 239, 237, 238, 240, 236, + 243, 237, 244, 238, 240, 242, 241, 245, 239, 247, + + 246, 242, 248, 243, 247, 245, 249, 250, 251, 252, + 256, 248, 243, 246, 252, 252, 244, 253, 254, 257, + 255, 249, 253, 250, 255, 257, 258, 259, 251, 260, + 261, 263, 256, 259, 264, 261, 254, 262, 267, 262, + 265, 264, 266, 269, 258, 258, 265, 268, 266, 260, + 263, 270, 272, 268, 277, 269, 274, 267, 271, 271, + 273, 273, 274, 275, 276, 270, 276, 279, 278, 275, + 280, 282, 272, 278, 281, 284, 283, 277, 286, 279, + 274, 283, 281, 276, 286, 285, 287, 291, 288, 280, + 285, 282, 287, 288, 289, 290, 292, 293, 284, 289, + + 294, 290, 291, 295, 296, 297, 303, 298, 299, 294, + 292, 299, 296, 298, 300, 293, 300, 295, 301, 301, + 302, 304, 304, 302, 303, 305, 305, 306, 308, 307, + 297, 308, 309, 310, 312, 314, 309, 311, 315, 316, + 1174, 314, 310, 306, 307, 316, 311, 317, 318, 317, + 324, 319, 315, 312, 318, 319, 320, 320, 321, 322, + 323, 325, 326, 321, 327, 322, 323, 328, 328, 330, + 324, 329, 319, 332, 329, 333, 331, 327, 335, 325, + 331, 334, 334, 326, 338, 323, 336, 330, 337, 336, + 338, 339, 332, 333, 339, 340, 335, 343, 344, 346, + + 337, 342, 346, 344, 179, 347, 336, 340, 341, 348, + 342, 345, 352, 352, 345, 343, 345, 341, 347, 351, + 341, 348, 351, 353, 354, 341, 341, 341, 341, 345, + 350, 349, 345, 349, 349, 350, 350, 355, 356, 354, + 353, 357, 358, 353, 359, 359, 361, 361, 360, 363, + 357, 358, 355, 360, 364, 356, 356, 362, 362, 365, + 366, 367, 368, 369, 365, 370, 381, 371, 371, 364, + 371, 370, 366, 373, 363, 381, 374, 375, 369, 371, + 367, 374, 368, 375, 376, 377, 371, 379, 380, 376, + 377, 380, 378, 373, 383, 378, 377, 378, 382, 382, + + 383, 379, 384, 384, 380, 385, 388, 380, 390, 380, + 385, 386, 386, 391, 386, 456, 389, 392, 456, 389, + 386, 393, 395, 390, 386, 395, 388, 398, 391, 386, + 396, 392, 386, 387, 387, 404, 387, 389, 399, 393, + 400, 395, 398, 402, 396, 400, 400, 399, 403, 387, + 404, 178, 387, 405, 387, 401, 387, 397, 406, 397, + 397, 401, 405, 408, 402, 409, 410, 403, 401, 397, + 397, 397, 397, 397, 407, 411, 397, 406, 412, 414, + 407, 408, 413, 415, 412, 416, 410, 413, 412, 411, + 417, 409, 418, 419, 422, 417, 420, 418, 423, 414, + + 416, 424, 420, 415, 426, 413, 421, 421, 419, 427, + 423, 425, 430, 428, 422, 424, 433, 425, 428, 429, + 429, 431, 429, 432, 434, 427, 434, 437, 435, 426, + 433, 437, 430, 435, 439, 439, 440, 431, 436, 432, + 436, 436, 438, 444, 441, 445, 438, 442, 443, 476, + 447, 448, 476, 445, 445, 440, 447, 444, 436, 441, + 448, 438, 451, 442, 449, 445, 443, 445, 446, 449, + 450, 451, 452, 446, 450, 453, 455, 454, 452, 457, + 455, 446, 446, 454, 457, 446, 446, 458, 460, 446, + 459, 459, 461, 461, 462, 463, 453, 464, 464, 462, + + 465, 460, 467, 468, 474, 466, 465, 458, 463, 466, + 469, 470, 471, 471, 472, 469, 470, 467, 473, 475, + 477, 471, 474, 478, 468, 477, 472, 478, 479, 480, + 480, 475, 481, 482, 483, 483, 484, 481, 473, 488, + 479, 486, 486, 489, 490, 492, 491, 493, 494, 495, + 499, 489, 493, 497, 482, 491, 498, 500, 484, 505, + 488, 495, 501, 500, 505, 490, 492, 176, 494, 502, + 499, 497, 503, 497, 498, 502, 501, 504, 506, 507, + 509, 503, 508, 504, 510, 508, 511, 507, 513, 516, + 507, 512, 506, 514, 509, 511, 514, 512, 515, 510, + + 517, 518, 522, 516, 515, 517, 519, 520, 513, 521, + 523, 520, 524, 525, 521, 523, 526, 522, 529, 530, + 531, 532, 515, 518, 533, 532, 534, 519, 524, 526, + 535, 534, 525, 527, 527, 531, 538, 539, 529, 527, + 530, 527, 539, 533, 536, 537, 535, 527, 536, 527, + 537, 538, 527, 527, 537, 540, 541, 542, 543, 527, + 544, 545, 539, 542, 545, 541, 546, 547, 542, 550, + 548, 540, 553, 543, 540, 548, 544, 549, 549, 551, + 551, 552, 554, 556, 553, 555, 555, 547, 557, 546, + 558, 559, 560, 561, 550, 558, 552, 554, 562, 171, + + 559, 565, 556, 564, 562, 565, 568, 569, 561, 566, + 557, 560, 564, 566, 567, 570, 571, 572, 568, 574, + 567, 573, 569, 572, 575, 576, 578, 577, 575, 577, + 571, 579, 580, 580, 570, 581, 573, 574, 576, 579, + 582, 581, 583, 584, 585, 587, 588, 592, 583, 584, + 578, 586, 582, 589, 586, 591, 585, 590, 589, 587, + 590, 588, 593, 592, 591, 594, 603, 593, 593, 595, + 595, 591, 596, 596, 591, 597, 598, 598, 594, 599, + 599, 597, 600, 602, 601, 604, 607, 603, 600, 601, + 601, 605, 608, 606, 605, 611, 609, 604, 606, 609, + + 608, 602, 610, 612, 613, 607, 614, 610, 613, 615, + 616, 618, 614, 617, 616, 621, 618, 622, 611, 619, + 620, 620, 612, 623, 624, 625, 626, 628, 623, 615, + 621, 617, 628, 619, 627, 629, 630, 631, 622, 630, + 627, 625, 633, 624, 630, 634, 626, 630, 630, 629, + 632, 632, 635, 636, 637, 631, 638, 635, 636, 640, + 633, 634, 643, 641, 642, 640, 643, 642, 637, 644, + 645, 638, 641, 645, 644, 646, 647, 648, 649, 651, + 646, 650, 652, 656, 651, 649, 653, 653, 643, 654, + 655, 657, 647, 670, 650, 648, 658, 660, 654, 659, + + 661, 169, 652, 660, 656, 658, 661, 657, 666, 655, + 662, 659, 670, 662, 663, 663, 664, 663, 665, 664, + 667, 668, 669, 665, 671, 673, 666, 669, 672, 674, + 671, 673, 674, 672, 667, 668, 675, 676, 677, 678, + 679, 682, 676, 680, 678, 678, 681, 682, 683, 684, + 685, 681, 686, 679, 677, 685, 680, 688, 684, 687, + 687, 675, 689, 692, 688, 681, 681, 683, 690, 689, + 691, 690, 686, 693, 694, 692, 691, 696, 693, 694, + 694, 695, 695, 697, 698, 697, 690, 699, 693, 699, + 700, 701, 702, 703, 704, 705, 706, 707, 708, 710, + + 706, 705, 696, 698, 709, 711, 707, 713, 700, 701, + 702, 715, 703, 708, 704, 712, 716, 710, 712, 709, + 714, 717, 713, 718, 711, 719, 714, 712, 720, 723, + 716, 715, 721, 717, 722, 724, 721, 725, 726, 727, + 729, 733, 718, 728, 168, 723, 719, 720, 728, 730, + 730, 732, 722, 724, 729, 725, 725, 726, 727, 731, + 733, 734, 735, 731, 736, 732, 737, 737, 738, 736, + 739, 741, 734, 740, 742, 743, 735, 744, 741, 742, + 745, 747, 743, 746, 738, 745, 740, 748, 746, 739, + 750, 749, 753, 751, 748, 752, 758, 757, 753, 747, + + 749, 744, 751, 754, 750, 758, 755, 752, 754, 755, + 756, 757, 759, 760, 756, 761, 760, 762, 763, 763, + 766, 764, 764, 765, 765, 766, 767, 759, 769, 761, + 764, 770, 771, 772, 774, 767, 773, 770, 762, 775, + 773, 776, 777, 779, 778, 780, 774, 769, 777, 781, + 779, 771, 778, 772, 785, 782, 788, 791, 794, 776, + 808, 792, 795, 780, 775, 808, 791, 792, 795, 785, + 796, 797, 166, 788, 781, 782, 783, 804, 783, 796, + 794, 783, 798, 799, 799, 783, 798, 797, 783, 800, + 800, 801, 802, 803, 805, 783, 783, 804, 783, 807, + + 805, 809, 801, 810, 811, 815, 1147, 803, 811, 812, + 802, 806, 806, 806, 818, 806, 813, 1147, 806, 807, + 813, 810, 809, 806, 815, 817, 814, 816, 821, 806, + 806, 814, 816, 812, 819, 821, 813, 819, 820, 818, + 817, 822, 822, 820, 820, 823, 824, 825, 825, 826, + 827, 824, 828, 827, 826, 829, 829, 828, 831, 830, + 823, 830, 832, 833, 834, 836, 835, 833, 837, 837, + 831, 838, 841, 836, 839, 840, 840, 842, 843, 846, + 846, 832, 164, 851, 834, 835, 838, 844, 839, 842, + 841, 845, 847, 844, 849, 850, 845, 847, 847, 849, + + 843, 850, 851, 852, 855, 853, 854, 855, 856, 852, + 853, 857, 854, 860, 856, 858, 858, 859, 859, 857, + 861, 860, 862, 864, 863, 865, 866, 862, 863, 867, + 864, 868, 868, 870, 872, 869, 871, 871, 861, 873, + 872, 870, 866, 865, 869, 874, 876, 877, 867, 878, + 880, 881, 883, 879, 881, 876, 877, 873, 879, 880, + 882, 884, 885, 886, 874, 882, 883, 888, 890, 887, + 891, 885, 893, 878, 887, 887, 886, 889, 889, 892, + 894, 888, 895, 890, 899, 895, 884, 901, 892, 891, + 897, 902, 897, 895, 898, 898, 893, 900, 894, 903, + + 904, 905, 900, 906, 907, 899, 908, 909, 901, 910, + 908, 902, 906, 162, 911, 912, 914, 913, 915, 903, + 911, 905, 904, 918, 912, 909, 916, 907, 910, 913, + 917, 918, 914, 919, 920, 922, 917, 915, 923, 920, + 916, 921, 921, 924, 925, 926, 927, 919, 928, 929, + 932, 930, 924, 926, 922, 931, 932, 933, 923, 934, + 936, 935, 937, 933, 925, 940, 927, 935, 929, 940, + 928, 930, 938, 934, 936, 931, 941, 939, 938, 942, + 943, 944, 937, 939, 945, 947, 944, 946, 946, 941, + 948, 947, 943, 950, 949, 951, 948, 949, 942, 953, + + 943, 952, 954, 954, 955, 945, 959, 952, 951, 956, + 957, 950, 958, 957, 956, 962, 960, 958, 958, 953, + 960, 959, 955, 961, 961, 963, 957, 964, 957, 965, + 966, 968, 969, 972, 965, 971, 973, 962, 975, 976, + 976, 978, 964, 975, 1016, 963, 969, 977, 971, 966, + 980, 977, 1016, 972, 983, 968, 978, 973, 974, 979, + 979, 974, 981, 974, 985, 982, 981, 974, 983, 974, + 988, 984, 987, 990, 974, 980, 984, 986, 985, 974, + 982, 987, 986, 986, 988, 989, 992, 991, 990, 989, + 993, 994, 991, 995, 996, 993, 85, 997, 992, 998, + + 1006, 989, 991, 999, 998, 994, 997, 1000, 996, 999, + 1001, 1002, 1000, 1007, 995, 1004, 1001, 1002, 1003, 1003, + 1004, 1005, 1006, 1008, 1010, 1011, 1012, 1005, 1014, 1014, + 1011, 1017, 1007, 1013, 1015, 1018, 1010, 1021, 1019, 1015, + 1012, 1008, 1009, 1009, 1020, 1013, 1022, 1017, 1009, 1018, + 1009, 1025, 1022, 1021, 1023, 1024, 1009, 1019, 1026, 1023, + 1027, 1009, 1009, 1020, 1028, 1029, 1029, 1024, 1009, 1025, + 1031, 1030, 1035, 1033, 1026, 1030, 1036, 1034, 1027, 1033, + 1034, 1036, 1028, 1037, 1039, 1040, 1038, 1044, 1042, 1039, + 1031, 1035, 1038, 1043, 1045, 1047, 1037, 1042, 1046, 1049, + + 1045, 1048, 1043, 1044, 1040, 1051, 1048, 1046, 1050, 1052, + 1055, 1053, 1056, 1061, 1047, 1054, 1055, 1057, 1059, 1049, + 1053, 1052, 1050, 1057, 1054, 1051, 1062, 1061, 1063, 1056, + 1064, 1065, 1066, 1063, 1059, 1068, 1067, 1069, 1072, 1073, + 1068, 1075, 1069, 1072, 1078, 1065, 1062, 1075, 1073, 1064, + 1066, 1067, 1074, 1074, 1076, 1077, 1079, 1081, 1087, 1078, + 1076, 1082, 1085, 1088, 1077, 1086, 1082, 1082, 1086, 1079, + 1084, 1084, 1087, 1081, 1084, 1089, 1090, 1085, 1092, 1091, + 1093, 1094, 1095, 1088, 1096, 1097, 1093, 1102, 1095, 1098, + 1097, 1089, 1091, 1092, 1090, 1100, 1100, 1101, 1105, 1096, + + 1101, 1094, 1103, 1098, 1104, 1107, 1106, 1103, 1102, 1104, + 1107, 1108, 1109, 1111, 1105, 1106, 1108, 1112, 1117, 1111, + 1113, 1114, 1115, 1115, 1109, 1116, 1113, 1114, 1118, 1119, + 1119, 1118, 1120, 1112, 1116, 1121, 1117, 1122, 1123, 1124, + 1125, 1123, 1126, 1127, 1145, 1135, 1125, 1145, 1126, 1127, + 1120, 1128, 1124, 1129, 1121, 1130, 1128, 1122, 1129, 1131, + 1132, 1130, 1134, 1135, 1131, 1136, 1132, 1134, 1137, 1140, + 1138, 1139, 1139, 1141, 1137, 1138, 1142, 1143, 1140, 1144, + 1146, 1142, 1141, 1146, 1148, 1136, 1149, 1150, 1151, 1148, + 1152, 1153, 1158, 1155, 1154, 1143, 1152, 1153, 1144, 1150, + + 1154, 1156, 1157, 1157, 1149, 1159, 1156, 1151, 1155, 1160, + 1161, 1158, 1162, 1163, 1164, 1165, 1162, 1166, 1168, 1159, + 1173, 1160, 1170, 1164, 1169, 1169, 1176, 1171, 1161, 1175, + 1170, 1163, 1171, 1172, 1165, 1177, 1179, 1168, 1172, 1178, + 1173, 1176, 1166, 1175, 1178, 1179, 1180, 1177, 1181, 1181, + 1182, 1183, 1184, 1185, 1186, 1193, 80, 1183, 1184, 1186, + 1187, 1180, 1187, 1188, 1189, 1190, 1191, 1192, 1188, 1185, + 1182, 1191, 1194, 1195, 1193, 1194, 1196, 1197, 1189, 1190, + 1195, 1200, 1192, 1199, 1199, 1201, 1202, 1203, 1204, 1213, + 1207, 1196, 1213, 1203, 1207, 1200, 1197, 1205, 1208, 1208, + + 1209, 1202, 1205, 1201, 1212, 1209, 1210, 1210, 1204, 1214, + 1211, 1205, 1215, 1205, 1216, 1217, 1205, 1211, 1212, 1218, + 1217, 1219, 1221, 1216, 1223, 1220, 1222, 1221, 1214, 1224, + 1215, 1220, 1229, 1219, 1227, 1223, 1226, 1226, 1218, 1227, + 1222, 1228, 1230, 1233, 1232, 1231, 1228, 1230, 1224, 1231, + 1234, 1235, 1229, 1232, 1236, 1238, 1237, 1236, 1233, 1240, + 1239, 1241, 1238, 1242, 1244, 1234, 1236, 1243, 1245, 1246, + 1235, 1237, 1239, 1243, 1245, 1247, 1248, 1249, 1240, 1244, + 1250, 1242, 1241, 1252, 1251, 1248, 1253, 1255, 1254, 1246, + 1256, 1258, 1249, 1255, 1259, 1247, 1251, 1258, 1260, 1250, + + 1261, 1262, 1252, 1254, 1263, 1265, 1273, 1267, 1261, 1259, + 1256, 1253, 1260, 1264, 1268, 1273, 1269, 1265, 1264, 1266, + 1263, 1262, 1270, 1270, 1266, 1266, 1267, 1272, 1268, 1269, + 1271, 1271, 1275, 1275, 1282, 1271, 1274, 75, 1271, 1271, + 1272, 1276, 1274, 1271, 1278, 1277, 1276, 1279, 1285, 1271, + 1278, 1280, 1279, 1271, 1277, 1282, 1280, 1281, 1281, 1283, + 1283, 1284, 1286, 1287, 1284, 1288, 1284, 1289, 1285, 1287, + 1290, 1291, 1292, 1293, 1288, 1290, 1294, 1296, 1295, 1293, + 1286, 1296, 1294, 1295, 1297, 1291, 1298, 1289, 1299, 1300, + 1292, 1301, 1301, 1299, 1303, 1298, 1307, 1297, 1302, 1302, + + 1298, 1302, 1298, 1300, 1298, 1303, 1298, 1305, 1306, 1308, + 1309, 1305, 1310, 1311, 1312, 1313, 1307, 1310, 1310, 1309, + 1313, 1314, 1311, 1306, 1315, 1316, 1317, 1308, 1318, 1320, + 1320, 1319, 1322, 1315, 1321, 1314, 1312, 1319, 1323, 1325, + 1322, 1326, 1318, 1324, 1316, 1317, 1321, 1327, 1324, 1328, + 1326, 1329, 1323, 1325, 1327, 1330, 1331, 1331, 1332, 1337, + 1330, 1333, 1333, 1334, 1337, 1334, 1336, 1328, 1338, 1336, + 1339, 1340, 1340, 1332, 1341, 1345, 1329, 1342, 1342, 1339, + 1343, 1343, 1346, 1344, 1347, 1348, 1348, 1338, 1344, 1349, + 1350, 1352, 1351, 1353, 1341, 1351, 1345, 1354, 1356, 1353, + + 1356, 1355, 1354, 1346, 1357, 1347, 1360, 1350, 74, 1349, + 1355, 1352, 1359, 1361, 1362, 1359, 1363, 1365, 1364, 1362, + 1371, 1360, 1357, 1364, 1366, 1365, 1361, 1368, 1367, 1366, + 1363, 1367, 1368, 1369, 1369, 1370, 1372, 1373, 1371, 1372, + 1370, 1374, 1375, 1373, 1377, 1378, 1386, 1379, 1374, 1380, + 1377, 1378, 1379, 1381, 1380, 1375, 1382, 1383, 1384, 1381, + 1385, 1385, 1388, 1389, 1390, 1382, 1386, 1388, 1391, 1384, + 1392, 1393, 1394, 1395, 1390, 1400, 1383, 1397, 1394, 1395, + 1396, 1389, 1401, 1391, 1402, 1399, 1396, 1403, 1397, 1400, + 1392, 1399, 1404, 1405, 1393, 1400, 1406, 1406, 1407, 1403, + + 1408, 1409, 1401, 1410, 1402, 1411, 1404, 1413, 1410, 1412, + 1412, 1405, 1414, 1416, 1421, 1417, 1418, 1414, 1407, 1409, + 1417, 1417, 1419, 1411, 1422, 1408, 1423, 1420, 1421, 1425, + 1413, 1419, 1416, 1427, 1418, 1420, 1430, 1424, 1425, 1422, + 1430, 1423, 1424, 1429, 1423, 1424, 1426, 1427, 1426, 1429, + 1431, 1432, 1433, 1434, 1435, 1436, 1432, 1432, 1437, 1438, + 1436, 1431, 1439, 1437, 1438, 1440, 1442, 1444, 1441, 1445, + 1446, 1433, 1435, 1441, 1447, 1447, 1449, 1450, 1448, 1434, + 1439, 1444, 1448, 1451, 1453, 1440, 1442, 1445, 1446, 1451, + 1452, 1454, 1455, 1456, 1449, 1458, 1450, 1457, 1459, 1462, + + 1453, 1463, 1452, 1459, 1460, 1468, 1455, 1464, 1456, 1466, + 1454, 1460, 1457, 1461, 1458, 68, 1464, 1462, 1461, 1465, + 1465, 1467, 1463, 1470, 1466, 1468, 1469, 1469, 1471, 1470, + 1467, 1472, 1473, 1473, 1471, 1474, 1474, 1475, 1476, 1477, + 1487, 1478, 1479, 1475, 1480, 1472, 1478, 1481, 1479, 1487, + 1480, 1482, 1482, 1481, 1476, 1483, 1483, 1485, 1485, 1486, + 1477, 1488, 1489, 1486, 1490, 1491, 1492, 1493, 1493, 1494, + 63, 1497, 1498, 1492, 1489, 1483, 1495, 1483, 1490, 1488, + 1491, 1496, 1499, 1501, 1495, 1497, 1496, 1499, 1499, 1494, + 1500, 1498, 1502, 1502, 1503, 1500, 1500, 1504, 1505, 1506, + + 1507, 1508, 1509, 1501, 1506, 1510, 1512, 1505, 1513, 1511, + 1515, 1510, 1514, 1503, 1511, 1524, 1504, 1516, 1514, 1507, + 1509, 1508, 1517, 1516, 1518, 1519, 1512, 1520, 1517, 1515, + 1521, 1522, 1527, 1523, 1513, 1527, 1524, 1525, 1526, 1526, + 1528, 1529, 1530, 1518, 1519, 58, 1520, 1523, 1533, 1521, + 1522, 1535, 1525, 1533, 1530, 1531, 1531, 1532, 1532, 1528, + 1529, 1534, 1536, 1537, 1535, 1534, 1538, 1539, 1543, 1539, + 1541, 1542, 1537, 1539, 1544, 1545, 1542, 1536, 1548, 1538, + 1546, 1546, 1547, 1543, 1548, 1549, 1539, 1547, 1541, 1550, + 1551, 1545, 1552, 1555, 1544, 1553, 1551, 1552, 1556, 1553, + + 1549, 1554, 1550, 1557, 1558, 1554, 1560, 1560, 1559, 1562, + 1564, 57, 1557, 1555, 1559, 1565, 1556, 1566, 1566, 1567, + 1565, 1568, 1570, 1570, 1558, 1567, 1572, 1562, 1574, 1572, + 1575, 1564, 1573, 1573, 1576, 1578, 1579, 1584, 1578, 1580, + 1581, 1568, 1582, 1585, 1574, 1592, 1575, 1583, 1583, 1581, + 1576, 1586, 1584, 1587, 1588, 1589, 1593, 1579, 1587, 1580, + 1591, 1589, 1582, 1592, 1585, 1590, 1590, 1594, 1588, 1591, + 1586, 1593, 1597, 1595, 1596, 1596, 1598, 1599, 1602, 1602, + 1600, 1601, 1599, 1603, 1604, 1606, 1597, 1603, 1605, 1605, + 1607, 1608, 1594, 1595, 1598, 1600, 1601, 1609, 1610, 1615, + + 1611, 1609, 1608, 1614, 1604, 1611, 1614, 1606, 1616, 1607, + 1613, 1613, 1615, 1616, 1617, 1618, 1620, 1610, 1619, 1622, + 1621, 1625, 1623, 1624, 1624, 1626, 1625, 1627, 1628, 1628, + 1617, 1623, 1619, 1618, 1621, 1620, 1620, 1629, 1630, 1631, + 1632, 1635, 1632, 1630, 1622, 1626, 1629, 1627, 1633, 1634, + 1636, 1639, 1637, 1633, 1641, 1634, 1636, 1637, 1642, 1631, + 1645, 1635, 1640, 1640, 1642, 1639, 1644, 1646, 1646, 1647, + 1647, 1644, 1648, 1641, 1649, 1650, 1651, 1652, 1652, 1651, + 1653, 1654, 1655, 1657, 1645, 1656, 1648, 1661, 1656, 1657, + 1650, 1656, 1649, 1654, 1658, 1663, 1661, 1659, 1653, 1658, + + 1659, 1662, 1655, 1656, 1664, 1666, 1662, 1664, 1665, 1665, + 1669, 1667, 1668, 1670, 1670, 1669, 1659, 1667, 1668, 1672, + 1663, 1671, 1671, 1673, 1674, 1672, 1675, 1676, 1673, 1666, + 1677, 1678, 1679, 1680, 1678, 1681, 1683, 1674, 1679, 1680, + 1682, 1681, 1683, 1684, 1675, 1682, 1676, 1685, 1686, 1686, + 1677, 1687, 1685, 1688, 1689, 1691, 1687, 1690, 1692, 1693, + 1695, 1696, 1699, 1694, 1697, 1698, 1684, 1698, 1697, 1706, + 1702, 1688, 1692, 1693, 1689, 1691, 1690, 1694, 1695, 1703, + 1700, 1699, 1702, 1704, 1705, 1707, 1696, 1700, 1708, 1706, + 1705, 1703, 1709, 1712, 1710, 1717, 1704, 1710, 1711, 1711, + + 1715, 1707, 1712, 1714, 1714, 1716, 1709, 1717, 1708, 1719, + 1716, 1718, 1718, 1720, 1721, 1710, 1722, 1723, 1724, 1731, + 1715, 1725, 1729, 1726, 1719, 1727, 1723, 1720, 1725, 1733, + 1733, 1735, 1726, 1724, 1722, 1726, 1732, 1729, 1721, 1732, + 1736, 1727, 1729, 1735, 1731, 1734, 1734, 1737, 1738, 1738, + 1737, 1739, 1740, 1742, 1741, 1743, 1742, 1744, 1736, 1741, + 1743, 1745, 1747, 1746, 1739, 1749, 1748, 1750, 1751, 1751, + 1753, 1740, 1746, 1750, 1749, 1748, 1744, 1745, 1748, 1752, + 1754, 1747, 1755, 1756, 1760, 1757, 1752, 1759, 1763, 1758, + 1753, 1764, 1759, 1754, 1758, 1758, 1760, 1756, 1765, 1765, + + 1755, 1757, 1766, 1767, 1773, 1766, 1768, 1769, 1769, 1764, + 1770, 1770, 1769, 1763, 1771, 1768, 1772, 1774, 1775, 1767, + 1778, 1772, 1773, 1771, 1776, 1770, 1771, 1779, 1780, 1776, + 1776, 1782, 1781, 1783, 1778, 1784, 1775, 1781, 1774, 1783, + 1785, 1785, 1779, 1786, 1788, 1782, 1787, 1792, 1789, 1786, + 1780, 1787, 1793, 1784, 1789, 1790, 1794, 1795, 1788, 1797, + 1796, 1790, 1794, 1796, 1799, 1797, 1793, 1792, 1801, 1796, + 1795, 1802, 1799, 1803, 1804, 1805, 1806, 1808, 1807, 1810, + 1805, 1809, 1804, 1811, 52, 1806, 1808, 1801, 1812, 1812, + 1802, 1807, 1803, 1810, 1809, 1813, 1814, 1811, 1816, 1818, + + 1815, 1813, 1814, 1815, 1817, 1817, 1819, 1820, 1821, 1821, + 1812, 1816, 1822, 1824, 1823, 1825, 1827, 1826, 1830, 1818, + 1823, 1829, 1829, 1831, 1819, 1822, 1820, 1831, 1832, 1833, + 1836, 1825, 1826, 1832, 1827, 1824, 1834, 1835, 1830, 1836, + 1837, 1834, 1835, 1839, 1840, 1841, 1842, 1843, 1841, 1833, + 1844, 1844, 1845, 1840, 1839, 1846, 1847, 1852, 1842, 1848, + 1848, 1849, 1843, 1837, 1850, 1851, 1849, 1846, 1853, 1852, + 1855, 1845, 1851, 1856, 1858, 1847, 1857, 1859, 1850, 1860, + 1853, 1863, 1857, 1861, 1861, 1860, 1858, 1862, 1867, 1855, + 1862, 1864, 1864, 1856, 1866, 1859, 1868, 1867, 1870, 1866, + + 1873, 1863, 1868, 1869, 1869, 1871, 1872, 1871, 1874, 1872, + 1870, 1875, 1877, 1876, 1878, 1879, 1880, 1877, 1881, 1878, + 1873, 1882, 1884, 1883, 1879, 1893, 1882, 1890, 1880, 1875, + 1874, 1876, 1883, 1881, 1885, 1886, 1887, 1888, 1888, 1885, + 1886, 1889, 1884, 1892, 1893, 1883, 1885, 1889, 1890, 1894, + 1895, 1887, 1896, 1897, 1902, 1897, 1905, 1898, 1906, 1892, + 1899, 1899, 1900, 1900, 1901, 1901, 1895, 1907, 1894, 1903, + 1903, 1898, 1896, 1898, 1902, 1904, 1904, 1905, 1909, 1906, + 1908, 1908, 1909, 1910, 1911, 1913, 1914, 1911, 1907, 1910, + 1915, 1913, 1916, 1917, 1920, 1918, 1915, 1916, 1918, 1919, + + 1919, 1921, 1922, 1922, 1914, 1923, 1921, 1924, 1925, 1931, + 1926, 1927, 1927, 1925, 1920, 1926, 1928, 1929, 1917, 1930, + 1923, 1928, 1932, 1929, 1933, 1935, 1936, 1937, 1924, 1931, + 1934, 1930, 1930, 1930, 1937, 1942, 1934, 1938, 1930, 1941, + 1932, 1945, 1938, 1940, 1933, 1935, 1936, 1944, 1940, 1940, + 1942, 1946, 1943, 1941, 1943, 1947, 1945, 1946, 1944, 1948, + 1949, 1950, 1950, 1951, 1947, 1952, 1952, 1953, 1954, 1955, + 1955, 1956, 1956, 1957, 1960, 1960, 1961, 1962, 1965, 1948, + 1967, 1949, 1964, 1968, 1968, 1969, 1962, 1953, 1966, 1951, + 1954, 1964, 1970, 1957, 1966, 1971, 1967, 1973, 1975, 1965, + + 1972, 1961, 1971, 1974, 1974, 1976, 1969, 1970, 1978, 1972, + 1979, 1980, 1981, 1982, 1978, 1979, 1983, 1980, 1986, 1992, + 1982, 1976, 1983, 1973, 1975, 1984, 1989, 1984, 1987, 1988, + 1988, 1989, 1981, 1990, 1987, 1991, 1993, 1986, 1994, 1992, + 1995, 1994, 1990, 1996, 1997, 1998, 1996, 1999, 1999, 2002, + 1991, 2000, 1995, 2001, 2006, 1993, 2004, 2000, 2003, 2001, + 2004, 2007, 1997, 2008, 2009, 2009, 2010, 2011, 2008, 2002, + 2012, 1998, 2014, 2003, 2006, 2015, 2004, 2016, 2016, 2015, + 2018, 2017, 2023, 2007, 2020, 2012, 2011, 2017, 2020, 2018, + 2010, 2014, 2019, 2019, 2021, 2022, 2022, 2024, 2025, 2026, + + 2027, 2028, 2029, 2023, 2026, 2021, 2030, 2031, 2032, 2033, + 2021, 2024, 2030, 2034, 2033, 2035, 2035, 2025, 2036, 2036, + 2027, 2028, 2029, 2032, 2037, 2031, 2034, 2039, 2037, 2040, + 2041, 2050, 2042, 2043, 2043, 47, 2039, 2042, 2045, 2045, + 2040, 2046, 2047, 2049, 2053, 2040, 2046, 2046, 2047, 2049, + 2041, 2051, 2052, 2054, 2056, 2053, 2051, 2050, 2057, 2054, + 2058, 2060, 2057, 2061, 2052, 2062, 2056, 2059, 2059, 2061, + 2063, 2065, 2058, 2064, 2064, 2066, 2063, 2067, 2071, 2068, + 2070, 2124, 2067, 2072, 2074, 2074, 2060, 2062, 2072, 2079, + 2065, 2068, 2070, 2075, 2124, 2066, 2075, 2071, 2076, 2076, + + 2077, 2077, 2078, 2078, 2080, 2081, 2084, 2082, 2083, 2079, + 2080, 2081, 2082, 2086, 2083, 2084, 2087, 2087, 2086, 2089, + 2090, 2093, 2089, 2091, 2091, 2094, 2095, 2096, 2096, 2097, + 2098, 2095, 2090, 2093, 2099, 2098, 2102, 2094, 2097, 2099, + 2100, 2101, 2101, 2100, 2103, 2104, 2105, 2106, 2109, 2107, + 2110, 2106, 2108, 2103, 2107, 2111, 2102, 2112, 2108, 2110, + 2114, 2114, 2115, 2104, 2118, 2105, 2109, 2116, 2117, 2119, + 2119, 2112, 2114, 2111, 2120, 2121, 2116, 2117, 2122, 2129, + 2115, 2123, 2129, 2120, 2118, 2130, 2123, 2121, 2127, 2127, + 2131, 2132, 2136, 2134, 2137, 2135, 2138, 2138, 2136, 2122, + + 2139, 2130, 2139, 2140, 2141, 2141, 2131, 2132, 2134, 2135, + 2142, 2137, 2144, 2144, 2145, 2145, 2147, 2148, 2142, 2149, + 2150, 2140, 2151, 2148, 2152, 2149, 2157, 2153, 2156, 2151, + 2154, 2154, 2155, 2155, 2150, 2159, 2158, 2161, 2157, 2147, + 2160, 2155, 2162, 2163, 2165, 2168, 2152, 2153, 2158, 2156, + 2159, 2162, 2160, 2169, 2164, 2166, 2170, 2166, 2163, 2164, + 2164, 2166, 2172, 2161, 2173, 2168, 2175, 2165, 2170, 2171, + 2171, 2175, 2174, 2176, 2166, 2174, 2169, 2178, 2180, 2179, + 2172, 2179, 2178, 2181, 2173, 2182, 2184, 2186, 2181, 2187, + 2188, 2190, 2182, 2176, 2191, 2184, 2180, 2189, 2187, 2189, + + 2191, 2193, 2188, 2193, 2194, 2186, 2195, 2195, 2196, 2197, + 2190, 2198, 2199, 2198, 2197, 2200, 2203, 2199, 2194, 2201, + 2200, 2202, 2204, 2207, 2205, 2206, 2208, 2211, 2204, 2205, + 2212, 2208, 2208, 2209, 2196, 2207, 2203, 2201, 2206, 2202, + 2213, 2209, 2214, 2214, 2212, 2216, 2211, 2215, 2215, 2217, + 2218, 2219, 2213, 2220, 2222, 2223, 2216, 2219, 2220, 2221, + 2228, 2221, 2225, 2223, 2217, 2224, 2224, 2226, 2226, 2228, + 2218, 2223, 2222, 2229, 2225, 2227, 2227, 2230, 2229, 2232, + 2233, 2235, 2234, 2232, 2234, 2236, 2237, 2238, 2239, 2233, + 2236, 2236, 2233, 2241, 2242, 2230, 2238, 2245, 2237, 2242, + + 2239, 2243, 2235, 2246, 2247, 2241, 2243, 2248, 2248, 2249, + 2245, 2250, 2251, 2247, 2253, 2252, 2256, 2261, 2254, 2255, + 2260, 2256, 2261, 2246, 2258, 2259, 2263, 2249, 2262, 2250, + 2251, 2252, 2254, 2262, 2255, 2263, 2258, 2259, 2264, 2253, + 2260, 2267, 2269, 2270, 2271, 2272, 2273, 2267, 2269, 2274, + 2276, 2276, 2275, 2277, 2278, 2278, 2264, 2279, 2274, 2271, + 2267, 2275, 2277, 2272, 2280, 2281, 2270, 2282, 2283, 2281, + 2285, 2273, 2282, 2286, 2287, 2279, 2289, 2294, 2290, 2286, + 2288, 2283, 2289, 2280, 2290, 2288, 2288, 2291, 2303, 2285, + 2291, 2293, 2297, 2297, 2298, 2298, 2287, 2294, 2299, 2293, + + 2300, 2300, 2301, 2301, 2302, 2305, 2303, 2299, 2306, 2298, + 2313, 2305, 2315, 2306, 2307, 2307, 2302, 2308, 2308, 2309, + 2298, 2310, 2312, 2317, 2309, 2314, 2312, 2310, 2318, 2314, + 2313, 2319, 2315, 2318, 2320, 2321, 2323, 2322, 2324, 2325, + 2321, 2326, 2327, 2327, 2325, 2329, 2328, 2331, 2317, 2320, + 2328, 2330, 2323, 2332, 2319, 2322, 2330, 2333, 2324, 2334, + 2329, 2335, 2336, 2326, 2337, 2331, 2338, 2336, 2339, 2339, + 2341, 2334, 2342, 2343, 2344, 2333, 2345, 2337, 2341, 2332, + 2335, 2346, 2347, 2348, 2338, 2349, 2350, 2353, 2351, 18, + 2355, 2342, 2343, 2344, 2351, 2356, 2358, 2349, 2358, 2345, + + 2357, 2347, 2353, 2355, 2348, 2346, 2357, 2350, 2359, 2356, + 2360, 2360, 2361, 2362, 2363, 2364, 2362, 2361, 2365, 2371, + 2366, 2367, 2367, 2368, 2368, 2370, 2370, 2363, 2359, 2369, + 2372, 2369, 2365, 2366, 2371, 2373, 2374, 2374, 17, 2364, + 2374, 2376, 2376, 2377, 2377, 2372, 2378, 2378, 2373, 2379, + 2380, 2380, 2381, 2381, 2382, 2384, 2385, 2386, 2379, 2382, + 2384, 2379, 2387, 2388, 2388, 2389, 2389, 2390, 2391, 2391, + 2392, 2393, 2393, 2395, 2387, 2394, 2385, 2386, 2395, 2396, + 2396, 2397, 2397, 2398, 2399, 2400, 2390, 2401, 2392, 2402, + 2394, 2404, 2406, 2399, 2405, 2405, 2404, 2398, 2407, 2407, + + 2408, 2401, 2400, 2414, 2409, 2415, 2410, 2411, 2402, 2409, + 2411, 2406, 2410, 2412, 2412, 2413, 2413, 2416, 2408, 2416, + 2415, 2418, 2414, 2419, 2420, 2420, 2421, 2423, 2424, 2412, + 2425, 2426, 2421, 2427, 2428, 2428, 2418, 2427, 2429, 2430, + 2431, 2432, 2419, 2424, 2430, 2435, 2426, 2423, 2434, 2434, + 2437, 2436, 2438, 2425, 2439, 2431, 2432, 2429, 2436, 2440, + 2441, 2442, 2442, 2451, 2437, 2435, 2443, 2444, 2448, 2444, + 2438, 2447, 2439, 2445, 2440, 2443, 2445, 2447, 2449, 2450, + 2448, 2452, 2453, 2449, 2450, 2454, 2441, 2455, 2451, 2460, + 2454, 2445, 2457, 2445, 2452, 2458, 2459, 2457, 2463, 2461, + + 2458, 2459, 2462, 2453, 2460, 2461, 2464, 2466, 2462, 2465, + 2468, 2467, 2466, 2455, 2469, 2465, 2467, 2470, 2471, 2463, + 2470, 2464, 2472, 2473, 2474, 2475, 2476, 2469, 2482, 2484, + 2477, 2472, 2473, 2474, 2475, 2468, 2477, 2478, 2471, 2479, + 2476, 2480, 2485, 2478, 2479, 2480, 2486, 2486, 2482, 2484, + 2487, 2485, 2488, 2488, 2489, 2491, 2487, 2490, 2490, 2492, + 2491, 2488, 2494, 2489, 2495, 2496, 2496, 2497, 2498, 2501, + 2505, 2500, 2502, 2505, 2503, 2507, 2508, 2498, 2494, 2492, + 2495, 2492, 2497, 2500, 2506, 2501, 2503, 2502, 2508, 2506, + 2509, 2509, 2510, 2510, 2514, 2507, 2512, 2512, 2513, 2514, + + 2515, 2513, 2516, 2517, 2518, 2518, 2515, 2519, 2516, 2520, + 2520, 2521, 2517, 2522, 2523, 2524, 2524, 2526, 2525, 2534, + 2527, 2519, 2529, 2521, 2525, 2527, 2529, 2522, 2534, 2530, + 2535, 2526, 2530, 2523, 2531, 2531, 2532, 2533, 2536, 2535, + 2537, 2532, 2533, 2539, 2537, 2538, 2538, 2541, 2542, 2543, + 2544, 2545, 2541, 2546, 2547, 2548, 2539, 2546, 2536, 2552, + 2548, 2549, 2551, 2551, 2553, 2545, 2550, 2549, 2542, 2543, + 2544, 2554, 2550, 2555, 2547, 2556, 2559, 2552, 2555, 2557, + 2557, 2560, 2561, 2553, 2596, 2562, 2563, 2561, 2559, 2596, + 2554, 2562, 2563, 2564, 2567, 2569, 2556, 2560, 2565, 2570, + + 2565, 2564, 2577, 2567, 2571, 2571, 2637, 2572, 2637, 2569, + 2572, 2573, 2573, 2570, 2575, 2576, 2582, 2575, 2576, 2578, + 2578, 2581, 2582, 2583, 2585, 2581, 2584, 2584, 2577, 2588, + 2588, 2590, 2592, 2585, 2593, 2583, 2597, 2598, 2599, 2600, + 2601, 2601, 2609, 2599, 2600, 2605, 2592, 2603, 2603, 2590, + 2593, 2605, 2606, 2607, 2607, 2608, 2610, 2612, 2598, 2618, + 2613, 2610, 2597, 2613, 2609, 2614, 2615, 2616, 2616, 2623, + 2619, 2608, 2606, 2622, 2620, 2618, 2612, 2614, 2615, 2619, + 2620, 2621, 2625, 2625, 2623, 2626, 2627, 2621, 2626, 2628, + 2633, 2622, 2630, 2630, 2631, 2631, 2632, 2634, 2635, 2636, + + 2638, 2632, 2639, 2640, 2636, 2627, 2634, 2628, 2633, 2642, + 2643, 2635, 2641, 2644, 2638, 2640, 2639, 2641, 2644, 2645, + 2645, 2646, 2646, 2647, 2647, 2648, 2648, 2649, 2650, 2642, + 2643, 2651, 2652, 2652, 2653, 2653, 2651, 2654, 2654, 2649, + 2655, 2656, 2657, 2658, 2659, 0, 2650, 2662, 2660, 2661, + 2661, 2665, 2655, 2670, 2657, 2663, 2663, 2664, 2664, 2666, + 2666, 2656, 2665, 2658, 2660, 2659, 2662, 2667, 2668, 2669, + 2672, 2671, 2673, 2670, 2674, 2668, 2671, 2675, 2675, 2667, + 2676, 2669, 2677, 2677, 2678, 2679, 2680, 2681, 2682, 2676, + 2672, 2683, 2673, 2674, 2684, 2685, 2684, 2686, 2686, 2680, + + 2687, 2688, 2682, 2689, 2691, 2679, 2692, 2685, 2693, 2687, + 2678, 2681, 2694, 2683, 2705, 2694, 2688, 0, 2689, 2695, + 2696, 2697, 2691, 2698, 2698, 2696, 2697, 2707, 2692, 2699, + 2699, 2693, 2705, 2695, 2700, 2700, 2702, 2702, 2704, 2704, + 2706, 2708, 2710, 2711, 2712, 2713, 2707, 2715, 2714, 2717, + 2716, 2706, 2716, 2718, 2719, 0, 2708, 2714, 2720, 2720, + 2722, 2711, 2710, 2724, 2722, 2713, 2712, 2715, 2725, 2717, + 2726, 2718, 2719, 2723, 2723, 2727, 2727, 2724, 2729, 2726, + 2730, 2730, 2731, 2732, 2733, 2734, 2736, 2729, 2735, 2737, + 2725, 2739, 2734, 2738, 2741, 2741, 2742, 2742, 2740, 2743, + + 2731, 2732, 2733, 2735, 2736, 2740, 2744, 2737, 2745, 2738, + 2739, 2747, 2747, 2750, 2745, 2748, 2748, 2749, 2751, 2743, + 2752, 2753, 2755, 2749, 2744, 2754, 2757, 2755, 2756, 2756, + 2758, 2750, 2759, 2760, 2761, 2752, 2751, 2762, 2768, 2754, + 2753, 2763, 2762, 2763, 2760, 2771, 2757, 2764, 2764, 2765, + 2758, 2765, 2759, 2770, 2761, 2766, 2766, 2768, 2772, 2773, + 2774, 2775, 2770, 2776, 2771, 2774, 2775, 2777, 2780, 2781, + 2772, 2782, 2783, 2783, 2782, 2784, 2785, 2786, 2786, 2773, + 2787, 2788, 2791, 2776, 2792, 2789, 2777, 2781, 2780, 2789, + 2784, 2787, 2793, 2796, 2785, 2798, 2788, 2791, 2793, 2792, + + 2794, 2795, 2795, 2799, 2794, 2800, 2796, 2801, 2801, 2803, + 2798, 2804, 2805, 2806, 2806, 2808, 2805, 2807, 2807, 2810, + 2804, 2803, 2811, 2799, 2810, 2800, 2809, 2809, 2812, 2813, + 2814, 2811, 2815, 2815, 2808, 2820, 2820, 2821, 2822, 2822, + 2823, 2813, 2824, 2825, 2812, 2826, 2829, 2829, 2827, 2828, + 2814, 2830, 2831, 2823, 2826, 2824, 2825, 2827, 2828, 2821, + 2833, 2833, 2839, 2836, 2838, 2840, 2841, 2831, 2836, 2838, + 2840, 2830, 2842, 2843, 2841, 2844, 2839, 2845, 2845, 2847, + 2849, 2850, 2843, 2844, 2851, 2849, 2850, 2852, 2852, 2853, + 2853, 2842, 2854, 2855, 2847, 2856, 2856, 2854, 2857, 2851, + + 2859, 2858, 2860, 2861, 2864, 2857, 2858, 0, 2862, 2861, + 2863, 2863, 2855, 2862, 2866, 2866, 2865, 2870, 2859, 2864, + 2860, 2865, 2867, 2867, 2871, 2871, 2872, 2873, 2876, 2872, + 2870, 2874, 2873, 2873, 2875, 2877, 2874, 2880, 2879, 2875, + 2878, 2877, 2876, 2879, 2878, 2881, 2880, 2882, 2883, 2886, + 2884, 2885, 2887, 2894, 2886, 2882, 2884, 2885, 2888, 2888, + 2881, 2890, 2891, 2892, 2887, 2894, 2892, 2891, 2890, 2883, + 2896, 2897, 2898, 2899, 2900, 2896, 2897, 2898, 2908, 2901, + 2902, 2903, 2903, 2904, 2913, 2905, 2914, 2900, 2901, 2902, + 2905, 2899, 2904, 2909, 2910, 2915, 2908, 2916, 2918, 2909, + + 2910, 2917, 2917, 2913, 2919, 2918, 2914, 2924, 2921, 2922, + 2923, 2923, 2925, 2926, 2926, 2915, 2916, 2921, 2922, 2927, + 2929, 2931, 2924, 2919, 2932, 2933, 2933, 2925, 2932, 2934, + 2935, 2936, 2937, 2938, 2941, 2929, 2935, 2936, 2927, 2938, + 2940, 2931, 2939, 2939, 2942, 2945, 2944, 2947, 2940, 2942, + 2937, 2950, 2949, 2947, 2934, 2944, 2949, 2948, 2945, 2941, + 2948, 2951, 2952, 2952, 2953, 2955, 2955, 2956, 2967, 2950, + 2957, 2957, 2958, 2958, 2961, 2951, 2960, 2960, 2961, 2953, + 2963, 2962, 2965, 2965, 2969, 2956, 2962, 2968, 2967, 2963, + 2971, 2973, 2968, 2970, 2974, 2974, 2969, 2984, 2970, 2970, + + 2976, 2976, 2971, 2977, 2977, 2978, 2978, 2979, 2980, 2981, + 2979, 2973, 2983, 2983, 2986, 2984, 2987, 2987, 2988, 2988, + 2990, 2980, 2981, 2989, 2989, 2991, 2991, 2992, 2993, 2995, + 2996, 2997, 2997, 2998, 2986, 2990, 2996, 2998, 3001, 3005, + 2992, 3006, 3002, 2995, 3001, 3004, 2993, 3002, 3007, 3008, + 3004, 3004, 3009, 3010, 3015, 3008, 3011, 3017, 3009, 3015, + 3011, 3006, 3005, 3012, 3012, 3017, 3018, 3020, 3007, 3018, + 3021, 3022, 3022, 3021, 3024, 3027, 3023, 3025, 3010, 3024, + 3026, 3028, 3028, 3029, 3031, 3030, 3032, 3059, 3030, 3027, + 3059, 3033, 3020, 3023, 3023, 3025, 3030, 3029, 3031, 3033, + + 3026, 3035, 3037, 3036, 3044, 3032, 3035, 3035, 3036, 3036, + 3038, 3038, 3039, 3039, 3040, 3040, 3041, 3041, 3042, 3042, + 3044, 3037, 3043, 3043, 3045, 3046, 3047, 3048, 3049, 3045, + 3050, 3051, 3217, 3049, 3052, 3053, 3051, 3054, 3055, 3057, + 3057, 3048, 3062, 3052, 3060, 3046, 3058, 3058, 3062, 3050, + 3061, 3061, 3047, 3063, 3217, 3053, 3066, 3054, 3055, 3060, + 3065, 3065, 3068, 3066, 3067, 3067, 3071, 3068, 3070, 3070, + 3072, 3063, 3073, 3074, 3076, 3071, 3077, 3077, 3080, 3072, + 3081, 3073, 3074, 3078, 3078, 3079, 3082, 3080, 3083, 3079, + 3084, 3087, 3076, 3088, 3089, 3085, 3099, 3082, 3089, 3081, + + 3085, 3085, 3088, 3083, 3087, 3095, 3093, 3094, 3094, 3098, + 3084, 3093, 3097, 3097, 3100, 3102, 3102, 3103, 3104, 3095, + 3108, 3099, 3109, 3098, 3110, 3113, 3103, 3109, 3112, 3115, + 3104, 3113, 3100, 3110, 3117, 3119, 3126, 3120, 3121, 3121, + 3119, 3115, 3120, 3122, 3124, 3108, 3125, 3132, 3112, 3124, + 3126, 3133, 3122, 3127, 3127, 3117, 3132, 3127, 3134, 3125, + 3129, 3129, 3130, 3130, 3131, 3131, 3141, 3135, 3137, 3142, + 3138, 3133, 3135, 3139, 3137, 3138, 3143, 3134, 3139, 3140, + 3140, 3142, 3144, 3145, 3141, 3146, 3147, 3144, 3148, 3148, + 3150, 3146, 3155, 3151, 3150, 3152, 3154, 3143, 3151, 3156, + + 3152, 3145, 3153, 3153, 3158, 3160, 3160, 3155, 3162, 3163, + 3164, 3147, 3165, 3167, 3156, 3154, 3165, 3166, 3168, 3169, + 3170, 3162, 3163, 3164, 3158, 3170, 3166, 3169, 3171, 3167, + 3172, 3172, 3173, 3174, 3175, 3176, 3176, 3168, 3177, 3177, + 3178, 3173, 3182, 3187, 3181, 3191, 3184, 3192, 3171, 3181, + 3181, 3174, 3184, 3185, 3185, 3194, 3182, 3189, 3189, 3178, + 3175, 3191, 3193, 3192, 3187, 3195, 3199, 3193, 3198, 3198, + 3195, 3194, 3200, 3201, 3202, 3203, 3203, 3204, 3207, 3201, + 3208, 3200, 3206, 3206, 3209, 3209, 3199, 3211, 3213, 3214, + 3218, 3218, 3207, 3211, 3220, 3214, 3204, 3202, 3215, 3208, + + 3219, 3219, 3221, 3215, 3222, 3222, 3223, 3224, 3213, 3220, + 3225, 3228, 3226, 3227, 3229, 3238, 3224, 3223, 3226, 3230, + 3230, 3231, 3221, 3228, 3222, 3232, 3233, 3238, 3232, 3233, + 3225, 3239, 3227, 3240, 3229, 3244, 3231, 3234, 3234, 3240, + 3241, 3241, 3242, 3243, 3249, 3242, 3256, 3246, 3251, 3243, + 3254, 3239, 3246, 3244, 3247, 3247, 3248, 3255, 3250, 3252, + 3252, 3248, 3254, 3249, 3250, 3251, 3251, 3257, 3258, 3258, + 3259, 3256, 3260, 3261, 0, 3255, 3263, 3263, 3264, 3264, + 3257, 3266, 3261, 3265, 3265, 3267, 3266, 3268, 3260, 3259, + 3269, 3269, 3268, 3270, 3270, 3271, 3271, 3272, 3272, 3267, + + 3273, 3274, 3275, 3280, 3276, 3279, 3279, 3285, 3275, 3276, + 3282, 3282, 3287, 3273, 3283, 3283, 3288, 3289, 3290, 3280, + 3291, 3291, 3293, 3293, 3294, 3295, 3285, 3274, 3296, 3298, + 3299, 3300, 3300, 3303, 3287, 3304, 3289, 3305, 3288, 3299, + 3290, 3304, 3296, 3306, 3295, 3301, 3301, 3307, 3310, 3298, + 3294, 3303, 3307, 3311, 3311, 3313, 3313, 3305, 3314, 3315, + 3316, 3322, 3306, 3314, 3317, 3322, 3316, 3318, 3324, 3310, + 3319, 3319, 3320, 3315, 3323, 3318, 3317, 3320, 3325, 3323, + 3326, 3327, 3330, 3328, 3331, 3326, 3332, 3333, 3324, 3328, + 3330, 3335, 3336, 3327, 3337, 3338, 3339, 3341, 3325, 3342, + + 3344, 3339, 3341, 3331, 3343, 3344, 3332, 3333, 3336, 3335, + 3343, 3337, 3337, 3346, 3347, 3348, 3338, 3347, 3361, 3342, + 3352, 3352, 3353, 3353, 3364, 3354, 3359, 3359, 3348, 3354, + 3360, 3362, 3362, 3346, 3372, 3360, 0, 3361, 3372, 3364, + 3367, 3367, 3368, 3368, 3377, 3368, 3369, 3369, 3375, 3369, + 3370, 3370, 3371, 3371, 3374, 3371, 3378, 3375, 3382, 3374, + 3376, 3376, 3377, 3381, 3381, 3383, 3384, 3385, 3385, 3386, + 3378, 3384, 3389, 3390, 3392, 3391, 3393, 3395, 3382, 3391, + 3390, 3396, 3444, 3392, 3398, 3383, 3396, 3397, 3397, 3386, + 3402, 3393, 3407, 3398, 3444, 3395, 3408, 3389, 3399, 3399, + + 3400, 3400, 3401, 3401, 3403, 3402, 3404, 3405, 3406, 3403, + 3409, 3408, 3405, 3405, 3406, 3404, 3410, 3407, 3404, 3411, + 3412, 3410, 3413, 3413, 3411, 3418, 3414, 3415, 3416, 3416, + 3427, 3409, 3414, 3415, 3417, 3417, 3419, 3422, 3422, 3412, + 3418, 3419, 3424, 3424, 3425, 3429, 3429, 3438, 3427, 3430, + 3430, 3431, 3431, 3425, 3432, 3432, 3434, 3434, 3435, 3435, + 3436, 3436, 3437, 3437, 3445, 3440, 3441, 3441, 3442, 3442, + 3443, 3447, 3447, 3438, 3440, 3448, 3449, 3449, 3450, 3443, + 3452, 3456, 3451, 3460, 3445, 3453, 3453, 3454, 3454, 3457, + 3457, 3462, 3452, 3450, 3448, 3451, 3456, 3461, 3463, 3463, + + 3461, 3460, 3464, 3466, 3467, 3468, 3466, 3469, 3470, 3472, + 3467, 3471, 3469, 3475, 3478, 3474, 3479, 3462, 3478, 3468, + 3464, 3474, 3475, 3482, 3483, 3472, 3496, 3470, 3492, 3471, + 3502, 3479, 3493, 3492, 3505, 3493, 3497, 3497, 3503, 3496, + 3498, 3498, 3500, 3500, 3483, 3507, 3504, 3503, 3509, 3482, + 3504, 3510, 3511, 3502, 3505, 3513, 3512, 3511, 3512, 3507, + 3514, 3514, 3510, 3515, 3516, 3518, 3517, 3519, 3521, 3523, + 3513, 3509, 3520, 3522, 3523, 3524, 3515, 3521, 3526, 3527, + 3527, 3518, 3528, 3516, 3517, 3522, 3525, 3520, 3529, 3533, + 3534, 3525, 3519, 3529, 3535, 3535, 3524, 3526, 3536, 3537, + + 3537, 3541, 3528, 3533, 3538, 3538, 3542, 3536, 3539, 3539, + 3534, 3540, 3540, 3543, 3544, 3546, 3543, 3545, 3547, 3544, + 3541, 3548, 3545, 3549, 3550, 3551, 3542, 3548, 3552, 3552, + 3551, 3553, 3558, 3547, 3554, 3554, 3550, 3549, 3555, 3555, + 3546, 3557, 3557, 3559, 3560, 3560, 3562, 3558, 3564, 3567, + 3567, 3553, 3568, 3568, 3570, 3569, 3573, 3575, 3571, 3572, + 3583, 3562, 3559, 3569, 3571, 3572, 3564, 3574, 3584, 3576, + 3573, 3577, 3577, 3570, 3576, 3586, 3575, 3579, 3579, 3587, + 3574, 3583, 3589, 3587, 3591, 3590, 3592, 3593, 3584, 3586, + 3590, 3594, 3595, 3596, 3597, 3597, 3600, 3595, 3596, 3592, + + 3593, 3601, 3589, 3591, 3602, 3603, 3603, 3604, 3605, 3610, + 3594, 3648, 3604, 3648, 3605, 3607, 3600, 3606, 3606, 3601, + 3607, 3608, 3609, 3602, 3611, 3618, 3608, 3609, 3610, 3614, + 3611, 3613, 3613, 3617, 3614, 3615, 3615, 3617, 3619, 3620, + 3621, 3622, 3623, 3624, 3618, 3619, 3638, 3622, 3626, 3626, + 3628, 3628, 3630, 3629, 3631, 3632, 3624, 3630, 3620, 3621, + 3640, 3623, 3629, 3633, 3635, 3629, 3634, 3634, 3636, 3635, + 3639, 3639, 3638, 3631, 3632, 3643, 3633, 3641, 3641, 3640, + 3643, 3636, 3642, 3642, 3644, 3645, 3646, 3646, 3647, 3649, + 3649, 3644, 3650, 3647, 3651, 3652, 3654, 3653, 3657, 3650, + + 3661, 3651, 3653, 3659, 3645, 3656, 3656, 3660, 3659, 3662, + 3663, 3663, 3660, 3666, 3652, 3654, 3667, 3657, 0, 3661, + 3665, 3665, 3668, 3668, 3669, 3669, 3670, 3674, 3662, 3672, + 3672, 3680, 3666, 3670, 3674, 3667, 3673, 3673, 3676, 3679, + 3681, 3682, 3682, 3676, 3679, 3683, 3683, 0, 0, 0, + 3680, 0, 0, 0, 0, 0, 0, 0, 0, 3681, + 3687, 3687, 3687, 3687, 3687, 3687, 3687, 3688, 3688, 3688, + 3688, 3688, 3688, 3688, 3689, 3689, 3689, 3689, 3689, 3689, + 3689, 3690, 3690, 3690, 3690, 3690, 3690, 3690, 3691, 3691, + 3691, 3691, 3691, 3691, 3691, 3692, 3692, 3692, 3692, 3692, + + 3692, 3692, 3693, 3693, 3693, 3693, 3693, 3693, 3693, 3695, + 3695, 0, 3695, 3695, 3695, 3695, 3696, 3696, 0, 0, + 0, 3696, 3696, 3697, 3697, 0, 0, 3697, 0, 3697, + 3698, 0, 0, 0, 0, 0, 3698, 3699, 3699, 0, + 0, 0, 3699, 3699, 3700, 0, 0, 0, 0, 0, + 3700, 3701, 3701, 0, 3701, 3701, 3701, 3701, 3702, 0, + 0, 0, 0, 0, 3702, 3703, 3703, 0, 0, 0, + 3703, 3703, 3704, 3704, 0, 3704, 3704, 3704, 3704, 3686, + 3686, 3686, 3686, 3686, 3686, 3686, 3686, 3686, 3686, 3686, + 3686, 3686, 3686, 3686, 3686, 3686, 3686, 3686, 3686, 3686, + + 3686, 3686, 3686, 3686, 3686, 3686, 3686, 3686, 3686, 3686, + 3686, 3686, 3686, 3686, 3686, 3686, 3686, 3686, 3686, 3686 } ; static yy_state_type yy_last_accepting_state; @@ -3320,7 +3361,7 @@ static void config_start_include(const char* filename, int toplevel) cfg_parser->filename = nm; cfg_parser->line = 1; inc_toplevel = toplevel; - yy_switch_to_buffer(yy_create_buffer(input,YY_BUF_SIZE)); + yy_switch_to_buffer(yy_create_buffer(input, YY_BUF_SIZE)); } static void config_start_include_glob(const char* filename, int toplevel) @@ -3390,11 +3431,12 @@ static void config_end_include(void) #define yy_set_bol(at_bol) \ { \ if ( ! yy_current_buffer ) \ - yy_current_buffer = yy_create_buffer(yyin,YY_BUF_SIZE ); \ + yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ yy_current_buffer->yy_ch_buf[0] = ((at_bol)?'\n':' '); \ } #endif +#line 3437 "" #define YY_NO_INPUT 1 #line 191 "./util/configlexer.lex" #ifndef YY_NO_UNPUT @@ -3403,8 +3445,9 @@ static void config_end_include(void) #ifndef YY_NO_INPUT #define YY_NO_INPUT 1 #endif +#line 3446 "" -#line 3406 "" +#line 3448 "" #define INITIAL 0 #define quotedstring 1 @@ -3427,36 +3470,36 @@ static void config_end_include(void) #define YY_EXTRA_TYPE void * #endif -static int yy_init_globals (void ); +static int yy_init_globals ( void ); /* Accessor methods to globals. These are made visible to non-reentrant scanners for convenience. */ -int yylex_destroy (void ); +int yylex_destroy ( void ); -int yyget_debug (void ); +int yyget_debug ( void ); -void yyset_debug (int debug_flag ); +void yyset_debug ( int debug_flag ); -YY_EXTRA_TYPE yyget_extra (void ); +YY_EXTRA_TYPE yyget_extra ( void ); -void yyset_extra (YY_EXTRA_TYPE user_defined ); +void yyset_extra ( YY_EXTRA_TYPE user_defined ); -FILE *yyget_in (void ); +FILE *yyget_in ( void ); -void yyset_in (FILE * in_str ); +void yyset_in ( FILE * _in_str ); -FILE *yyget_out (void ); +FILE *yyget_out ( void ); -void yyset_out (FILE * out_str ); +void yyset_out ( FILE * _out_str ); -yy_size_t yyget_leng (void ); + yy_size_t yyget_leng ( void ); -char *yyget_text (void ); +char *yyget_text ( void ); -int yyget_lineno (void ); +int yyget_lineno ( void ); -void yyset_lineno (int line_number ); +void yyset_lineno ( int _line_number ); /* Macros after this point can all be overridden by user definitions in * section 1. @@ -3464,33 +3507,41 @@ void yyset_lineno (int line_number ); #ifndef YY_SKIP_YYWRAP #ifdef __cplusplus -extern "C" int yywrap (void ); +extern "C" int yywrap ( void ); #else -extern int yywrap (void ); +extern int yywrap ( void ); #endif #endif +#ifndef YY_NO_UNPUT + +#endif + #ifndef yytext_ptr -static void yy_flex_strncpy (char *,yyconst char *,int ); +static void yy_flex_strncpy ( char *, const char *, int ); #endif #ifdef YY_NEED_STRLEN -static int yy_flex_strlen (yyconst char * ); +static int yy_flex_strlen ( const char * ); #endif #ifndef YY_NO_INPUT - #ifdef __cplusplus -static int yyinput (void ); +static int yyinput ( void ); #else -static int input (void ); +static int input ( void ); #endif #endif /* Amount of stuff to slurp up with each read. */ #ifndef YY_READ_BUF_SIZE +#ifdef __ia64__ +/* On IA-64, the buffer size is 16k, not 8k */ +#define YY_READ_BUF_SIZE 16384 +#else #define YY_READ_BUF_SIZE 8192 +#endif /* __ia64__ */ #endif /* Copy whatever the last rule matched to the standard output. */ @@ -3498,7 +3549,7 @@ static int input (void ); /* This used to be an fputs(), but since the string might contain NUL's, * we now use fwrite(). */ -#define ECHO fwrite( yytext, yyleng, 1, yyout ) +#define ECHO do { if (fwrite( yytext, (size_t) yyleng, 1, yyout )) {} } while (0) #endif /* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, @@ -3522,7 +3573,7 @@ static int input (void ); else \ { \ errno=0; \ - while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \ + while ( (result = (int) fread(buf, 1, (yy_size_t) max_size, yyin)) == 0 && ferror(yyin)) \ { \ if( errno != EINTR) \ { \ @@ -3577,7 +3628,7 @@ extern int yylex (void); /* Code executed at the end of each rule. */ #ifndef YY_BREAK -#define YY_BREAK break; +#define YY_BREAK /*LINTED*/break; #endif #define YY_RULE_SETUP \ @@ -3587,14 +3638,10 @@ extern int yylex (void); */ YY_DECL { - register yy_state_type yy_current_state; - register char *yy_cp, *yy_bp; - register int yy_act; + yy_state_type yy_current_state; + char *yy_cp, *yy_bp; + int yy_act; -#line 211 "./util/configlexer.lex" - -#line 3595 "" - if ( !(yy_init) ) { (yy_init) = 1; @@ -3615,18 +3662,23 @@ YY_DECL if ( ! YY_CURRENT_BUFFER ) { yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = - yy_create_buffer(yyin,YY_BUF_SIZE ); + yy_create_buffer( yyin, YY_BUF_SIZE ); } - yy_load_buffer_state( ); + yy_load_buffer_state( ); } - while ( 1 ) /* loops until end-of-file is reached */ + { +#line 211 "./util/configlexer.lex" + +#line 3672 "" + + while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */ { (yy_more_len) = 0; if ( (yy_more_flag) ) { - (yy_more_len) = (yy_c_buf_p) - (yytext_ptr); + (yy_more_len) = (int) ((yy_c_buf_p) - (yytext_ptr)); (yy_more_flag) = 0; } yy_cp = (yy_c_buf_p); @@ -3643,7 +3695,7 @@ YY_DECL yy_match: do { - register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; + YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)] ; if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; @@ -3652,13 +3704,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 >= 3616 ) - yy_c = yy_meta[(unsigned int) yy_c]; + if ( yy_current_state >= 3687 ) + yy_c = yy_meta[yy_c]; } - yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; ++yy_cp; } - while ( yy_base[yy_current_state] != 7055 ); + while ( yy_base[yy_current_state] != 7180 ); yy_find_action: yy_act = yy_accept[yy_current_state]; @@ -4448,964 +4500,1004 @@ YY_RULE_SETUP case 153: YY_RULE_SETUP #line 367 "./util/configlexer.lex" -{ YDVAR(1, VAR_SEND_CLIENT_SUBNET) } +{ YDVAR(2, VAR_INTERFACE_ACTION) } YY_BREAK case 154: YY_RULE_SETUP #line 368 "./util/configlexer.lex" -{ YDVAR(1, VAR_CLIENT_SUBNET_ZONE) } +{ YDVAR(1, VAR_SEND_CLIENT_SUBNET) } YY_BREAK case 155: YY_RULE_SETUP #line 369 "./util/configlexer.lex" -{ YDVAR(1, VAR_CLIENT_SUBNET_ALWAYS_FORWARD) } +{ YDVAR(1, VAR_CLIENT_SUBNET_ZONE) } YY_BREAK case 156: YY_RULE_SETUP #line 370 "./util/configlexer.lex" -{ YDVAR(1, VAR_CLIENT_SUBNET_OPCODE) } +{ YDVAR(1, VAR_CLIENT_SUBNET_ALWAYS_FORWARD) } YY_BREAK case 157: YY_RULE_SETUP #line 371 "./util/configlexer.lex" -{ YDVAR(1, VAR_MAX_CLIENT_SUBNET_IPV4) } +{ YDVAR(1, VAR_CLIENT_SUBNET_OPCODE) } YY_BREAK case 158: YY_RULE_SETUP #line 372 "./util/configlexer.lex" -{ YDVAR(1, VAR_MAX_CLIENT_SUBNET_IPV6) } +{ YDVAR(1, VAR_MAX_CLIENT_SUBNET_IPV4) } YY_BREAK case 159: YY_RULE_SETUP #line 373 "./util/configlexer.lex" -{ YDVAR(1, VAR_MIN_CLIENT_SUBNET_IPV4) } +{ YDVAR(1, VAR_MAX_CLIENT_SUBNET_IPV6) } YY_BREAK case 160: YY_RULE_SETUP #line 374 "./util/configlexer.lex" -{ YDVAR(1, VAR_MIN_CLIENT_SUBNET_IPV6) } +{ YDVAR(1, VAR_MIN_CLIENT_SUBNET_IPV4) } YY_BREAK case 161: YY_RULE_SETUP #line 375 "./util/configlexer.lex" -{ YDVAR(1, VAR_MAX_ECS_TREE_SIZE_IPV4) } +{ YDVAR(1, VAR_MIN_CLIENT_SUBNET_IPV6) } YY_BREAK case 162: YY_RULE_SETUP #line 376 "./util/configlexer.lex" -{ YDVAR(1, VAR_MAX_ECS_TREE_SIZE_IPV6) } +{ YDVAR(1, VAR_MAX_ECS_TREE_SIZE_IPV4) } YY_BREAK case 163: YY_RULE_SETUP #line 377 "./util/configlexer.lex" -{ YDVAR(1, VAR_HIDE_IDENTITY) } +{ YDVAR(1, VAR_MAX_ECS_TREE_SIZE_IPV6) } YY_BREAK case 164: YY_RULE_SETUP #line 378 "./util/configlexer.lex" -{ YDVAR(1, VAR_HIDE_VERSION) } +{ YDVAR(1, VAR_HIDE_IDENTITY) } YY_BREAK case 165: YY_RULE_SETUP #line 379 "./util/configlexer.lex" -{ YDVAR(1, VAR_HIDE_TRUSTANCHOR) } +{ YDVAR(1, VAR_HIDE_VERSION) } YY_BREAK case 166: YY_RULE_SETUP #line 380 "./util/configlexer.lex" -{ YDVAR(1, VAR_HIDE_HTTP_USER_AGENT) } +{ YDVAR(1, VAR_HIDE_TRUSTANCHOR) } YY_BREAK case 167: YY_RULE_SETUP #line 381 "./util/configlexer.lex" -{ YDVAR(1, VAR_IDENTITY) } +{ YDVAR(1, VAR_HIDE_HTTP_USER_AGENT) } YY_BREAK case 168: YY_RULE_SETUP #line 382 "./util/configlexer.lex" -{ YDVAR(1, VAR_VERSION) } +{ YDVAR(1, VAR_IDENTITY) } YY_BREAK case 169: YY_RULE_SETUP #line 383 "./util/configlexer.lex" -{ YDVAR(1, VAR_HTTP_USER_AGENT) } +{ YDVAR(1, VAR_VERSION) } YY_BREAK case 170: YY_RULE_SETUP #line 384 "./util/configlexer.lex" -{ YDVAR(1, VAR_MODULE_CONF) } +{ YDVAR(1, VAR_HTTP_USER_AGENT) } YY_BREAK case 171: YY_RULE_SETUP #line 385 "./util/configlexer.lex" -{ YDVAR(1, VAR_DLV_ANCHOR) } +{ YDVAR(1, VAR_MODULE_CONF) } YY_BREAK case 172: YY_RULE_SETUP #line 386 "./util/configlexer.lex" -{ YDVAR(1, VAR_DLV_ANCHOR_FILE) } +{ YDVAR(1, VAR_DLV_ANCHOR) } YY_BREAK case 173: YY_RULE_SETUP #line 387 "./util/configlexer.lex" -{ YDVAR(1, VAR_TRUST_ANCHOR_FILE) } +{ YDVAR(1, VAR_DLV_ANCHOR_FILE) } YY_BREAK case 174: YY_RULE_SETUP #line 388 "./util/configlexer.lex" -{ YDVAR(1, VAR_AUTO_TRUST_ANCHOR_FILE) } +{ YDVAR(1, VAR_TRUST_ANCHOR_FILE) } YY_BREAK case 175: YY_RULE_SETUP #line 389 "./util/configlexer.lex" -{ YDVAR(1, VAR_TRUSTED_KEYS_FILE) } +{ YDVAR(1, VAR_AUTO_TRUST_ANCHOR_FILE) } YY_BREAK case 176: YY_RULE_SETUP #line 390 "./util/configlexer.lex" -{ YDVAR(1, VAR_TRUST_ANCHOR) } +{ YDVAR(1, VAR_TRUSTED_KEYS_FILE) } YY_BREAK case 177: YY_RULE_SETUP #line 391 "./util/configlexer.lex" -{ YDVAR(1, VAR_TRUST_ANCHOR_SIGNALING) } +{ YDVAR(1, VAR_TRUST_ANCHOR) } YY_BREAK case 178: YY_RULE_SETUP #line 392 "./util/configlexer.lex" -{ YDVAR(1, VAR_ROOT_KEY_SENTINEL) } +{ YDVAR(1, VAR_TRUST_ANCHOR_SIGNALING) } YY_BREAK case 179: YY_RULE_SETUP #line 393 "./util/configlexer.lex" -{ YDVAR(1, VAR_VAL_OVERRIDE_DATE) } +{ YDVAR(1, VAR_ROOT_KEY_SENTINEL) } YY_BREAK case 180: YY_RULE_SETUP #line 394 "./util/configlexer.lex" -{ YDVAR(1, VAR_VAL_SIG_SKEW_MIN) } +{ YDVAR(1, VAR_VAL_OVERRIDE_DATE) } YY_BREAK case 181: YY_RULE_SETUP #line 395 "./util/configlexer.lex" -{ YDVAR(1, VAR_VAL_SIG_SKEW_MAX) } +{ YDVAR(1, VAR_VAL_SIG_SKEW_MIN) } YY_BREAK case 182: YY_RULE_SETUP #line 396 "./util/configlexer.lex" -{ YDVAR(1, VAR_VAL_MAX_RESTART) } +{ YDVAR(1, VAR_VAL_SIG_SKEW_MAX) } YY_BREAK case 183: YY_RULE_SETUP #line 397 "./util/configlexer.lex" -{ YDVAR(1, VAR_BOGUS_TTL) } +{ YDVAR(1, VAR_VAL_MAX_RESTART) } YY_BREAK case 184: YY_RULE_SETUP #line 398 "./util/configlexer.lex" -{ YDVAR(1, VAR_VAL_CLEAN_ADDITIONAL) } +{ YDVAR(1, VAR_BOGUS_TTL) } YY_BREAK case 185: YY_RULE_SETUP #line 399 "./util/configlexer.lex" -{ YDVAR(1, VAR_VAL_PERMISSIVE_MODE) } +{ YDVAR(1, VAR_VAL_CLEAN_ADDITIONAL) } YY_BREAK case 186: YY_RULE_SETUP #line 400 "./util/configlexer.lex" -{ YDVAR(1, VAR_AGGRESSIVE_NSEC) } +{ YDVAR(1, VAR_VAL_PERMISSIVE_MODE) } YY_BREAK case 187: YY_RULE_SETUP #line 401 "./util/configlexer.lex" -{ YDVAR(1, VAR_IGNORE_CD_FLAG) } +{ YDVAR(1, VAR_AGGRESSIVE_NSEC) } YY_BREAK case 188: YY_RULE_SETUP #line 402 "./util/configlexer.lex" -{ YDVAR(1, VAR_SERVE_EXPIRED) } +{ YDVAR(1, VAR_IGNORE_CD_FLAG) } YY_BREAK case 189: YY_RULE_SETUP #line 403 "./util/configlexer.lex" -{ YDVAR(1, VAR_SERVE_EXPIRED_TTL) } +{ YDVAR(1, VAR_SERVE_EXPIRED) } YY_BREAK case 190: YY_RULE_SETUP #line 404 "./util/configlexer.lex" -{ YDVAR(1, VAR_SERVE_EXPIRED_TTL_RESET) } +{ YDVAR(1, VAR_SERVE_EXPIRED_TTL) } YY_BREAK case 191: YY_RULE_SETUP #line 405 "./util/configlexer.lex" -{ YDVAR(1, VAR_SERVE_EXPIRED_REPLY_TTL) } +{ YDVAR(1, VAR_SERVE_EXPIRED_TTL_RESET) } YY_BREAK case 192: YY_RULE_SETUP #line 406 "./util/configlexer.lex" -{ YDVAR(1, VAR_SERVE_EXPIRED_CLIENT_TIMEOUT) } +{ YDVAR(1, VAR_SERVE_EXPIRED_REPLY_TTL) } YY_BREAK case 193: YY_RULE_SETUP #line 407 "./util/configlexer.lex" -{ YDVAR(1, VAR_EDE_SERVE_EXPIRED) } +{ YDVAR(1, VAR_SERVE_EXPIRED_CLIENT_TIMEOUT) } YY_BREAK case 194: YY_RULE_SETUP #line 408 "./util/configlexer.lex" -{ YDVAR(1, VAR_SERVE_ORIGINAL_TTL) } +{ YDVAR(1, VAR_EDE_SERVE_EXPIRED) } YY_BREAK case 195: YY_RULE_SETUP #line 409 "./util/configlexer.lex" -{ YDVAR(1, VAR_FAKE_DSA) } +{ YDVAR(1, VAR_SERVE_ORIGINAL_TTL) } YY_BREAK case 196: YY_RULE_SETUP #line 410 "./util/configlexer.lex" -{ YDVAR(1, VAR_FAKE_SHA1) } +{ YDVAR(1, VAR_FAKE_DSA) } YY_BREAK case 197: YY_RULE_SETUP #line 411 "./util/configlexer.lex" -{ YDVAR(1, VAR_VAL_LOG_LEVEL) } +{ YDVAR(1, VAR_FAKE_SHA1) } YY_BREAK case 198: YY_RULE_SETUP #line 412 "./util/configlexer.lex" -{ YDVAR(1, VAR_KEY_CACHE_SIZE) } +{ YDVAR(1, VAR_VAL_LOG_LEVEL) } YY_BREAK case 199: YY_RULE_SETUP #line 413 "./util/configlexer.lex" -{ YDVAR(1, VAR_KEY_CACHE_SLABS) } +{ YDVAR(1, VAR_KEY_CACHE_SIZE) } YY_BREAK case 200: YY_RULE_SETUP #line 414 "./util/configlexer.lex" -{ YDVAR(1, VAR_NEG_CACHE_SIZE) } +{ YDVAR(1, VAR_KEY_CACHE_SLABS) } YY_BREAK case 201: YY_RULE_SETUP #line 415 "./util/configlexer.lex" -{ - YDVAR(1, VAR_VAL_NSEC3_KEYSIZE_ITERATIONS) } +{ YDVAR(1, VAR_NEG_CACHE_SIZE) } YY_BREAK case 202: YY_RULE_SETUP -#line 417 "./util/configlexer.lex" -{ YDVAR(1, VAR_ZONEMD_PERMISSIVE_MODE) } +#line 416 "./util/configlexer.lex" +{ + YDVAR(1, VAR_VAL_NSEC3_KEYSIZE_ITERATIONS) } YY_BREAK case 203: YY_RULE_SETUP #line 418 "./util/configlexer.lex" -{ YDVAR(1, VAR_ZONEMD_CHECK) } +{ YDVAR(1, VAR_ZONEMD_PERMISSIVE_MODE) } YY_BREAK case 204: YY_RULE_SETUP #line 419 "./util/configlexer.lex" -{ YDVAR(1, VAR_ZONEMD_REJECT_ABSENCE) } +{ YDVAR(1, VAR_ZONEMD_CHECK) } YY_BREAK case 205: YY_RULE_SETUP #line 420 "./util/configlexer.lex" -{ YDVAR(1, VAR_ADD_HOLDDOWN) } +{ YDVAR(1, VAR_ZONEMD_REJECT_ABSENCE) } YY_BREAK case 206: YY_RULE_SETUP #line 421 "./util/configlexer.lex" -{ YDVAR(1, VAR_DEL_HOLDDOWN) } +{ YDVAR(1, VAR_ADD_HOLDDOWN) } YY_BREAK case 207: YY_RULE_SETUP #line 422 "./util/configlexer.lex" -{ YDVAR(1, VAR_KEEP_MISSING) } +{ YDVAR(1, VAR_DEL_HOLDDOWN) } YY_BREAK case 208: YY_RULE_SETUP #line 423 "./util/configlexer.lex" -{ YDVAR(1, VAR_PERMIT_SMALL_HOLDDOWN) } +{ YDVAR(1, VAR_KEEP_MISSING) } YY_BREAK case 209: YY_RULE_SETUP #line 424 "./util/configlexer.lex" -{ YDVAR(1, VAR_USE_SYSLOG) } +{ YDVAR(1, VAR_PERMIT_SMALL_HOLDDOWN) } YY_BREAK case 210: YY_RULE_SETUP #line 425 "./util/configlexer.lex" -{ YDVAR(1, VAR_LOG_IDENTITY) } +{ YDVAR(1, VAR_USE_SYSLOG) } YY_BREAK case 211: YY_RULE_SETUP #line 426 "./util/configlexer.lex" -{ YDVAR(1, VAR_LOG_TIME_ASCII) } +{ YDVAR(1, VAR_LOG_IDENTITY) } YY_BREAK case 212: YY_RULE_SETUP #line 427 "./util/configlexer.lex" -{ YDVAR(1, VAR_LOG_QUERIES) } +{ YDVAR(1, VAR_LOG_TIME_ASCII) } YY_BREAK case 213: YY_RULE_SETUP #line 428 "./util/configlexer.lex" -{ YDVAR(1, VAR_LOG_REPLIES) } +{ YDVAR(1, VAR_LOG_QUERIES) } YY_BREAK case 214: YY_RULE_SETUP #line 429 "./util/configlexer.lex" -{ YDVAR(1, VAR_LOG_TAG_QUERYREPLY) } +{ YDVAR(1, VAR_LOG_REPLIES) } YY_BREAK case 215: YY_RULE_SETUP #line 430 "./util/configlexer.lex" -{ YDVAR(1, VAR_LOG_LOCAL_ACTIONS) } +{ YDVAR(1, VAR_LOG_TAG_QUERYREPLY) } YY_BREAK case 216: YY_RULE_SETUP #line 431 "./util/configlexer.lex" -{ YDVAR(1, VAR_LOG_SERVFAIL) } +{ YDVAR(1, VAR_LOG_LOCAL_ACTIONS) } YY_BREAK case 217: YY_RULE_SETUP #line 432 "./util/configlexer.lex" -{ YDVAR(2, VAR_LOCAL_ZONE) } +{ YDVAR(1, VAR_LOG_SERVFAIL) } YY_BREAK case 218: YY_RULE_SETUP #line 433 "./util/configlexer.lex" -{ YDVAR(1, VAR_LOCAL_DATA) } +{ YDVAR(2, VAR_LOCAL_ZONE) } YY_BREAK case 219: YY_RULE_SETUP #line 434 "./util/configlexer.lex" -{ YDVAR(1, VAR_LOCAL_DATA_PTR) } +{ YDVAR(1, VAR_LOCAL_DATA) } YY_BREAK case 220: YY_RULE_SETUP #line 435 "./util/configlexer.lex" -{ YDVAR(1, VAR_UNBLOCK_LAN_ZONES) } +{ YDVAR(1, VAR_LOCAL_DATA_PTR) } YY_BREAK case 221: YY_RULE_SETUP #line 436 "./util/configlexer.lex" -{ YDVAR(1, VAR_INSECURE_LAN_ZONES) } +{ YDVAR(1, VAR_UNBLOCK_LAN_ZONES) } YY_BREAK case 222: YY_RULE_SETUP #line 437 "./util/configlexer.lex" -{ YDVAR(1, VAR_STATISTICS_INTERVAL) } +{ YDVAR(1, VAR_INSECURE_LAN_ZONES) } YY_BREAK case 223: YY_RULE_SETUP #line 438 "./util/configlexer.lex" -{ YDVAR(1, VAR_STATISTICS_CUMULATIVE) } +{ YDVAR(1, VAR_STATISTICS_INTERVAL) } YY_BREAK case 224: YY_RULE_SETUP #line 439 "./util/configlexer.lex" -{ YDVAR(1, VAR_EXTENDED_STATISTICS) } +{ YDVAR(1, VAR_STATISTICS_CUMULATIVE) } YY_BREAK case 225: YY_RULE_SETUP #line 440 "./util/configlexer.lex" -{ YDVAR(1, VAR_SHM_ENABLE) } +{ YDVAR(1, VAR_EXTENDED_STATISTICS) } YY_BREAK case 226: YY_RULE_SETUP #line 441 "./util/configlexer.lex" -{ YDVAR(1, VAR_SHM_KEY) } +{ YDVAR(1, VAR_SHM_ENABLE) } YY_BREAK case 227: YY_RULE_SETUP #line 442 "./util/configlexer.lex" -{ YDVAR(0, VAR_REMOTE_CONTROL) } +{ YDVAR(1, VAR_SHM_KEY) } YY_BREAK case 228: YY_RULE_SETUP #line 443 "./util/configlexer.lex" -{ YDVAR(1, VAR_CONTROL_ENABLE) } +{ YDVAR(0, VAR_REMOTE_CONTROL) } YY_BREAK case 229: YY_RULE_SETUP #line 444 "./util/configlexer.lex" -{ YDVAR(1, VAR_CONTROL_INTERFACE) } +{ YDVAR(1, VAR_CONTROL_ENABLE) } YY_BREAK case 230: YY_RULE_SETUP #line 445 "./util/configlexer.lex" -{ YDVAR(1, VAR_CONTROL_PORT) } +{ YDVAR(1, VAR_CONTROL_INTERFACE) } YY_BREAK case 231: YY_RULE_SETUP #line 446 "./util/configlexer.lex" -{ YDVAR(1, VAR_CONTROL_USE_CERT) } +{ YDVAR(1, VAR_CONTROL_PORT) } YY_BREAK case 232: YY_RULE_SETUP #line 447 "./util/configlexer.lex" -{ YDVAR(1, VAR_SERVER_KEY_FILE) } +{ YDVAR(1, VAR_CONTROL_USE_CERT) } YY_BREAK case 233: YY_RULE_SETUP #line 448 "./util/configlexer.lex" -{ YDVAR(1, VAR_SERVER_CERT_FILE) } +{ YDVAR(1, VAR_SERVER_KEY_FILE) } YY_BREAK case 234: YY_RULE_SETUP #line 449 "./util/configlexer.lex" -{ YDVAR(1, VAR_CONTROL_KEY_FILE) } +{ YDVAR(1, VAR_SERVER_CERT_FILE) } YY_BREAK case 235: YY_RULE_SETUP #line 450 "./util/configlexer.lex" -{ YDVAR(1, VAR_CONTROL_CERT_FILE) } +{ YDVAR(1, VAR_CONTROL_KEY_FILE) } YY_BREAK case 236: YY_RULE_SETUP #line 451 "./util/configlexer.lex" -{ YDVAR(1, VAR_PYTHON_SCRIPT) } +{ YDVAR(1, VAR_CONTROL_CERT_FILE) } YY_BREAK case 237: YY_RULE_SETUP #line 452 "./util/configlexer.lex" -{ YDVAR(0, VAR_PYTHON) } +{ YDVAR(1, VAR_PYTHON_SCRIPT) } YY_BREAK case 238: YY_RULE_SETUP #line 453 "./util/configlexer.lex" -{ YDVAR(1, VAR_DYNLIB_FILE) } +{ YDVAR(0, VAR_PYTHON) } YY_BREAK case 239: YY_RULE_SETUP #line 454 "./util/configlexer.lex" -{ YDVAR(0, VAR_DYNLIB) } +{ YDVAR(1, VAR_DYNLIB_FILE) } YY_BREAK case 240: YY_RULE_SETUP #line 455 "./util/configlexer.lex" -{ YDVAR(1, VAR_DOMAIN_INSECURE) } +{ YDVAR(0, VAR_DYNLIB) } YY_BREAK case 241: YY_RULE_SETUP #line 456 "./util/configlexer.lex" -{ YDVAR(1, VAR_MINIMAL_RESPONSES) } +{ YDVAR(1, VAR_DOMAIN_INSECURE) } YY_BREAK case 242: YY_RULE_SETUP #line 457 "./util/configlexer.lex" -{ YDVAR(1, VAR_RRSET_ROUNDROBIN) } +{ YDVAR(1, VAR_MINIMAL_RESPONSES) } YY_BREAK case 243: YY_RULE_SETUP #line 458 "./util/configlexer.lex" -{ YDVAR(1, VAR_UNKNOWN_SERVER_TIME_LIMIT) } +{ YDVAR(1, VAR_RRSET_ROUNDROBIN) } YY_BREAK case 244: YY_RULE_SETUP #line 459 "./util/configlexer.lex" -{ YDVAR(1, VAR_MAX_UDP_SIZE) } +{ YDVAR(1, VAR_UNKNOWN_SERVER_TIME_LIMIT) } YY_BREAK case 245: YY_RULE_SETUP #line 460 "./util/configlexer.lex" -{ YDVAR(1, VAR_DNS64_PREFIX) } +{ YDVAR(1, VAR_MAX_UDP_SIZE) } YY_BREAK case 246: YY_RULE_SETUP #line 461 "./util/configlexer.lex" -{ YDVAR(1, VAR_DNS64_SYNTHALL) } +{ YDVAR(1, VAR_DNS64_PREFIX) } YY_BREAK case 247: YY_RULE_SETUP #line 462 "./util/configlexer.lex" -{ YDVAR(1, VAR_DNS64_IGNORE_AAAA) } +{ YDVAR(1, VAR_DNS64_SYNTHALL) } YY_BREAK case 248: YY_RULE_SETUP #line 463 "./util/configlexer.lex" -{ YDVAR(1, VAR_DEFINE_TAG) } +{ YDVAR(1, VAR_DNS64_IGNORE_AAAA) } YY_BREAK case 249: YY_RULE_SETUP #line 464 "./util/configlexer.lex" -{ YDVAR(2, VAR_LOCAL_ZONE_TAG) } +{ YDVAR(1, VAR_DEFINE_TAG) } YY_BREAK case 250: YY_RULE_SETUP #line 465 "./util/configlexer.lex" -{ YDVAR(2, VAR_ACCESS_CONTROL_TAG) } +{ YDVAR(2, VAR_LOCAL_ZONE_TAG) } YY_BREAK case 251: YY_RULE_SETUP #line 466 "./util/configlexer.lex" -{ YDVAR(3, VAR_ACCESS_CONTROL_TAG_ACTION) } +{ YDVAR(2, VAR_ACCESS_CONTROL_TAG) } YY_BREAK case 252: YY_RULE_SETUP #line 467 "./util/configlexer.lex" -{ YDVAR(3, VAR_ACCESS_CONTROL_TAG_DATA) } +{ YDVAR(3, VAR_ACCESS_CONTROL_TAG_ACTION) } YY_BREAK case 253: YY_RULE_SETUP #line 468 "./util/configlexer.lex" -{ YDVAR(2, VAR_ACCESS_CONTROL_VIEW) } +{ YDVAR(3, VAR_ACCESS_CONTROL_TAG_DATA) } YY_BREAK case 254: YY_RULE_SETUP #line 469 "./util/configlexer.lex" -{ YDVAR(3, VAR_LOCAL_ZONE_OVERRIDE) } +{ YDVAR(2, VAR_ACCESS_CONTROL_VIEW) } YY_BREAK case 255: YY_RULE_SETUP #line 470 "./util/configlexer.lex" -{ YDVAR(0, VAR_DNSTAP) } +{ YDVAR(2, VAR_INTERFACE_TAG) } YY_BREAK case 256: YY_RULE_SETUP #line 471 "./util/configlexer.lex" -{ YDVAR(1, VAR_DNSTAP_ENABLE) } +{ YDVAR(3, VAR_INTERFACE_TAG_ACTION) } YY_BREAK case 257: YY_RULE_SETUP #line 472 "./util/configlexer.lex" -{ YDVAR(1, VAR_DNSTAP_BIDIRECTIONAL) } +{ YDVAR(3, VAR_INTERFACE_TAG_DATA) } YY_BREAK case 258: YY_RULE_SETUP #line 473 "./util/configlexer.lex" -{ YDVAR(1, VAR_DNSTAP_SOCKET_PATH) } +{ YDVAR(2, VAR_INTERFACE_VIEW) } YY_BREAK case 259: YY_RULE_SETUP #line 474 "./util/configlexer.lex" -{ YDVAR(1, VAR_DNSTAP_IP) } +{ YDVAR(3, VAR_LOCAL_ZONE_OVERRIDE) } YY_BREAK case 260: YY_RULE_SETUP #line 475 "./util/configlexer.lex" -{ YDVAR(1, VAR_DNSTAP_TLS) } +{ YDVAR(0, VAR_DNSTAP) } YY_BREAK case 261: YY_RULE_SETUP #line 476 "./util/configlexer.lex" -{ YDVAR(1, VAR_DNSTAP_TLS_SERVER_NAME) } +{ YDVAR(1, VAR_DNSTAP_ENABLE) } YY_BREAK case 262: YY_RULE_SETUP #line 477 "./util/configlexer.lex" -{ YDVAR(1, VAR_DNSTAP_TLS_CERT_BUNDLE) } +{ YDVAR(1, VAR_DNSTAP_BIDIRECTIONAL) } YY_BREAK case 263: YY_RULE_SETUP #line 478 "./util/configlexer.lex" -{ - YDVAR(1, VAR_DNSTAP_TLS_CLIENT_KEY_FILE) } +{ YDVAR(1, VAR_DNSTAP_SOCKET_PATH) } YY_BREAK case 264: YY_RULE_SETUP -#line 480 "./util/configlexer.lex" -{ - YDVAR(1, VAR_DNSTAP_TLS_CLIENT_CERT_FILE) } +#line 479 "./util/configlexer.lex" +{ YDVAR(1, VAR_DNSTAP_IP) } YY_BREAK case 265: YY_RULE_SETUP -#line 482 "./util/configlexer.lex" -{ YDVAR(1, VAR_DNSTAP_SEND_IDENTITY) } +#line 480 "./util/configlexer.lex" +{ YDVAR(1, VAR_DNSTAP_TLS) } YY_BREAK case 266: YY_RULE_SETUP -#line 483 "./util/configlexer.lex" -{ YDVAR(1, VAR_DNSTAP_SEND_VERSION) } +#line 481 "./util/configlexer.lex" +{ YDVAR(1, VAR_DNSTAP_TLS_SERVER_NAME) } YY_BREAK case 267: YY_RULE_SETUP -#line 484 "./util/configlexer.lex" -{ YDVAR(1, VAR_DNSTAP_IDENTITY) } +#line 482 "./util/configlexer.lex" +{ YDVAR(1, VAR_DNSTAP_TLS_CERT_BUNDLE) } YY_BREAK case 268: YY_RULE_SETUP -#line 485 "./util/configlexer.lex" -{ YDVAR(1, VAR_DNSTAP_VERSION) } +#line 483 "./util/configlexer.lex" +{ + YDVAR(1, VAR_DNSTAP_TLS_CLIENT_KEY_FILE) } YY_BREAK case 269: YY_RULE_SETUP -#line 486 "./util/configlexer.lex" +#line 485 "./util/configlexer.lex" { - YDVAR(1, VAR_DNSTAP_LOG_RESOLVER_QUERY_MESSAGES) } + YDVAR(1, VAR_DNSTAP_TLS_CLIENT_CERT_FILE) } YY_BREAK case 270: YY_RULE_SETUP -#line 488 "./util/configlexer.lex" -{ - YDVAR(1, VAR_DNSTAP_LOG_RESOLVER_RESPONSE_MESSAGES) } +#line 487 "./util/configlexer.lex" +{ YDVAR(1, VAR_DNSTAP_SEND_IDENTITY) } YY_BREAK case 271: YY_RULE_SETUP -#line 490 "./util/configlexer.lex" -{ - YDVAR(1, VAR_DNSTAP_LOG_CLIENT_QUERY_MESSAGES) } +#line 488 "./util/configlexer.lex" +{ YDVAR(1, VAR_DNSTAP_SEND_VERSION) } YY_BREAK case 272: YY_RULE_SETUP -#line 492 "./util/configlexer.lex" -{ - YDVAR(1, VAR_DNSTAP_LOG_CLIENT_RESPONSE_MESSAGES) } +#line 489 "./util/configlexer.lex" +{ YDVAR(1, VAR_DNSTAP_IDENTITY) } YY_BREAK case 273: YY_RULE_SETUP -#line 494 "./util/configlexer.lex" -{ - YDVAR(1, VAR_DNSTAP_LOG_FORWARDER_QUERY_MESSAGES) } +#line 490 "./util/configlexer.lex" +{ YDVAR(1, VAR_DNSTAP_VERSION) } YY_BREAK case 274: YY_RULE_SETUP -#line 496 "./util/configlexer.lex" +#line 491 "./util/configlexer.lex" { - YDVAR(1, VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES) } + YDVAR(1, VAR_DNSTAP_LOG_RESOLVER_QUERY_MESSAGES) } YY_BREAK case 275: YY_RULE_SETUP -#line 498 "./util/configlexer.lex" -{ YDVAR(1, VAR_DISABLE_DNSSEC_LAME_CHECK) } +#line 493 "./util/configlexer.lex" +{ + YDVAR(1, VAR_DNSTAP_LOG_RESOLVER_RESPONSE_MESSAGES) } YY_BREAK case 276: YY_RULE_SETUP -#line 499 "./util/configlexer.lex" -{ YDVAR(1, VAR_IP_RATELIMIT) } +#line 495 "./util/configlexer.lex" +{ + YDVAR(1, VAR_DNSTAP_LOG_CLIENT_QUERY_MESSAGES) } YY_BREAK case 277: YY_RULE_SETUP -#line 500 "./util/configlexer.lex" -{ YDVAR(1, VAR_RATELIMIT) } +#line 497 "./util/configlexer.lex" +{ + YDVAR(1, VAR_DNSTAP_LOG_CLIENT_RESPONSE_MESSAGES) } YY_BREAK case 278: YY_RULE_SETUP -#line 501 "./util/configlexer.lex" -{ YDVAR(1, VAR_IP_RATELIMIT_SLABS) } +#line 499 "./util/configlexer.lex" +{ + YDVAR(1, VAR_DNSTAP_LOG_FORWARDER_QUERY_MESSAGES) } YY_BREAK case 279: YY_RULE_SETUP -#line 502 "./util/configlexer.lex" -{ YDVAR(1, VAR_RATELIMIT_SLABS) } +#line 501 "./util/configlexer.lex" +{ + YDVAR(1, VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES) } YY_BREAK case 280: YY_RULE_SETUP #line 503 "./util/configlexer.lex" -{ YDVAR(1, VAR_IP_RATELIMIT_SIZE) } +{ YDVAR(1, VAR_DISABLE_DNSSEC_LAME_CHECK) } YY_BREAK case 281: YY_RULE_SETUP #line 504 "./util/configlexer.lex" -{ YDVAR(1, VAR_RATELIMIT_SIZE) } +{ YDVAR(1, VAR_IP_RATELIMIT) } YY_BREAK case 282: YY_RULE_SETUP #line 505 "./util/configlexer.lex" -{ YDVAR(2, VAR_RATELIMIT_FOR_DOMAIN) } +{ YDVAR(1, VAR_RATELIMIT) } YY_BREAK case 283: YY_RULE_SETUP #line 506 "./util/configlexer.lex" -{ YDVAR(2, VAR_RATELIMIT_BELOW_DOMAIN) } +{ YDVAR(1, VAR_IP_RATELIMIT_SLABS) } YY_BREAK case 284: YY_RULE_SETUP #line 507 "./util/configlexer.lex" -{ YDVAR(1, VAR_IP_RATELIMIT_FACTOR) } +{ YDVAR(1, VAR_RATELIMIT_SLABS) } YY_BREAK case 285: YY_RULE_SETUP #line 508 "./util/configlexer.lex" -{ YDVAR(1, VAR_RATELIMIT_FACTOR) } +{ YDVAR(1, VAR_IP_RATELIMIT_SIZE) } YY_BREAK case 286: YY_RULE_SETUP #line 509 "./util/configlexer.lex" -{ YDVAR(1, VAR_IP_RATELIMIT_BACKOFF) } +{ YDVAR(1, VAR_RATELIMIT_SIZE) } YY_BREAK case 287: YY_RULE_SETUP #line 510 "./util/configlexer.lex" -{ YDVAR(1, VAR_RATELIMIT_BACKOFF) } +{ YDVAR(2, VAR_RATELIMIT_FOR_DOMAIN) } YY_BREAK case 288: YY_RULE_SETUP #line 511 "./util/configlexer.lex" -{ YDVAR(1, VAR_OUTBOUND_MSG_RETRY) } +{ YDVAR(2, VAR_RATELIMIT_BELOW_DOMAIN) } YY_BREAK case 289: YY_RULE_SETUP #line 512 "./util/configlexer.lex" -{ YDVAR(1, VAR_LOW_RTT) } +{ YDVAR(1, VAR_IP_RATELIMIT_FACTOR) } YY_BREAK case 290: YY_RULE_SETUP #line 513 "./util/configlexer.lex" -{ YDVAR(1, VAR_FAST_SERVER_NUM) } +{ YDVAR(1, VAR_RATELIMIT_FACTOR) } YY_BREAK case 291: YY_RULE_SETUP #line 514 "./util/configlexer.lex" -{ YDVAR(1, VAR_FAST_SERVER_PERMIL) } +{ YDVAR(1, VAR_IP_RATELIMIT_BACKOFF) } YY_BREAK case 292: YY_RULE_SETUP #line 515 "./util/configlexer.lex" -{ YDVAR(1, VAR_FAST_SERVER_PERMIL) } +{ YDVAR(1, VAR_RATELIMIT_BACKOFF) } YY_BREAK case 293: YY_RULE_SETUP #line 516 "./util/configlexer.lex" -{ YDVAR(1, VAR_FAST_SERVER_PERMIL) } +{ YDVAR(1, VAR_OUTBOUND_MSG_RETRY) } YY_BREAK case 294: YY_RULE_SETUP #line 517 "./util/configlexer.lex" -{ YDVAR(2, VAR_RESPONSE_IP_TAG) } +{ YDVAR(1, VAR_LOW_RTT) } YY_BREAK case 295: YY_RULE_SETUP #line 518 "./util/configlexer.lex" -{ YDVAR(2, VAR_RESPONSE_IP) } +{ YDVAR(1, VAR_FAST_SERVER_NUM) } YY_BREAK case 296: YY_RULE_SETUP #line 519 "./util/configlexer.lex" -{ YDVAR(2, VAR_RESPONSE_IP_DATA) } +{ YDVAR(1, VAR_FAST_SERVER_PERMIL) } YY_BREAK case 297: YY_RULE_SETUP #line 520 "./util/configlexer.lex" -{ YDVAR(0, VAR_DNSCRYPT) } +{ YDVAR(1, VAR_FAST_SERVER_PERMIL) } YY_BREAK case 298: YY_RULE_SETUP #line 521 "./util/configlexer.lex" -{ YDVAR(1, VAR_DNSCRYPT_ENABLE) } +{ YDVAR(1, VAR_FAST_SERVER_PERMIL) } YY_BREAK case 299: YY_RULE_SETUP #line 522 "./util/configlexer.lex" -{ YDVAR(1, VAR_DNSCRYPT_PORT) } +{ YDVAR(2, VAR_RESPONSE_IP_TAG) } YY_BREAK case 300: YY_RULE_SETUP #line 523 "./util/configlexer.lex" -{ YDVAR(1, VAR_DNSCRYPT_PROVIDER) } +{ YDVAR(2, VAR_RESPONSE_IP) } YY_BREAK case 301: YY_RULE_SETUP #line 524 "./util/configlexer.lex" -{ YDVAR(1, VAR_DNSCRYPT_SECRET_KEY) } +{ YDVAR(2, VAR_RESPONSE_IP_DATA) } YY_BREAK case 302: YY_RULE_SETUP #line 525 "./util/configlexer.lex" -{ YDVAR(1, VAR_DNSCRYPT_PROVIDER_CERT) } +{ YDVAR(0, VAR_DNSCRYPT) } YY_BREAK case 303: YY_RULE_SETUP #line 526 "./util/configlexer.lex" -{ YDVAR(1, VAR_DNSCRYPT_PROVIDER_CERT_ROTATED) } +{ YDVAR(1, VAR_DNSCRYPT_ENABLE) } YY_BREAK case 304: YY_RULE_SETUP #line 527 "./util/configlexer.lex" -{ - YDVAR(1, VAR_DNSCRYPT_SHARED_SECRET_CACHE_SIZE) } +{ YDVAR(1, VAR_DNSCRYPT_PORT) } YY_BREAK case 305: YY_RULE_SETUP -#line 529 "./util/configlexer.lex" -{ - YDVAR(1, VAR_DNSCRYPT_SHARED_SECRET_CACHE_SLABS) } +#line 528 "./util/configlexer.lex" +{ YDVAR(1, VAR_DNSCRYPT_PROVIDER) } YY_BREAK case 306: YY_RULE_SETUP -#line 531 "./util/configlexer.lex" -{ YDVAR(1, VAR_DNSCRYPT_NONCE_CACHE_SIZE) } +#line 529 "./util/configlexer.lex" +{ YDVAR(1, VAR_DNSCRYPT_SECRET_KEY) } YY_BREAK case 307: YY_RULE_SETUP -#line 532 "./util/configlexer.lex" -{ YDVAR(1, VAR_DNSCRYPT_NONCE_CACHE_SLABS) } +#line 530 "./util/configlexer.lex" +{ YDVAR(1, VAR_DNSCRYPT_PROVIDER_CERT) } YY_BREAK case 308: YY_RULE_SETUP -#line 533 "./util/configlexer.lex" -{ YDVAR(1, VAR_PAD_RESPONSES) } +#line 531 "./util/configlexer.lex" +{ YDVAR(1, VAR_DNSCRYPT_PROVIDER_CERT_ROTATED) } YY_BREAK case 309: YY_RULE_SETUP -#line 534 "./util/configlexer.lex" -{ YDVAR(1, VAR_PAD_RESPONSES_BLOCK_SIZE) } +#line 532 "./util/configlexer.lex" +{ + YDVAR(1, VAR_DNSCRYPT_SHARED_SECRET_CACHE_SIZE) } YY_BREAK case 310: YY_RULE_SETUP -#line 535 "./util/configlexer.lex" -{ YDVAR(1, VAR_PAD_QUERIES) } +#line 534 "./util/configlexer.lex" +{ + YDVAR(1, VAR_DNSCRYPT_SHARED_SECRET_CACHE_SLABS) } YY_BREAK case 311: YY_RULE_SETUP #line 536 "./util/configlexer.lex" -{ YDVAR(1, VAR_PAD_QUERIES_BLOCK_SIZE) } +{ YDVAR(1, VAR_DNSCRYPT_NONCE_CACHE_SIZE) } YY_BREAK case 312: YY_RULE_SETUP #line 537 "./util/configlexer.lex" -{ YDVAR(1, VAR_IPSECMOD_ENABLED) } +{ YDVAR(1, VAR_DNSCRYPT_NONCE_CACHE_SLABS) } YY_BREAK case 313: YY_RULE_SETUP #line 538 "./util/configlexer.lex" -{ YDVAR(1, VAR_IPSECMOD_IGNORE_BOGUS) } +{ YDVAR(1, VAR_PAD_RESPONSES) } YY_BREAK case 314: YY_RULE_SETUP #line 539 "./util/configlexer.lex" -{ YDVAR(1, VAR_IPSECMOD_HOOK) } +{ YDVAR(1, VAR_PAD_RESPONSES_BLOCK_SIZE) } YY_BREAK case 315: YY_RULE_SETUP #line 540 "./util/configlexer.lex" -{ YDVAR(1, VAR_IPSECMOD_MAX_TTL) } +{ YDVAR(1, VAR_PAD_QUERIES) } YY_BREAK case 316: YY_RULE_SETUP #line 541 "./util/configlexer.lex" -{ YDVAR(1, VAR_IPSECMOD_WHITELIST) } +{ YDVAR(1, VAR_PAD_QUERIES_BLOCK_SIZE) } YY_BREAK case 317: YY_RULE_SETUP #line 542 "./util/configlexer.lex" -{ YDVAR(1, VAR_IPSECMOD_WHITELIST) } +{ YDVAR(1, VAR_IPSECMOD_ENABLED) } YY_BREAK case 318: YY_RULE_SETUP #line 543 "./util/configlexer.lex" -{ YDVAR(1, VAR_IPSECMOD_STRICT) } +{ YDVAR(1, VAR_IPSECMOD_IGNORE_BOGUS) } YY_BREAK case 319: YY_RULE_SETUP #line 544 "./util/configlexer.lex" -{ YDVAR(0, VAR_CACHEDB) } +{ YDVAR(1, VAR_IPSECMOD_HOOK) } YY_BREAK case 320: YY_RULE_SETUP #line 545 "./util/configlexer.lex" -{ YDVAR(1, VAR_CACHEDB_BACKEND) } +{ YDVAR(1, VAR_IPSECMOD_MAX_TTL) } YY_BREAK case 321: YY_RULE_SETUP #line 546 "./util/configlexer.lex" -{ YDVAR(1, VAR_CACHEDB_SECRETSEED) } +{ YDVAR(1, VAR_IPSECMOD_WHITELIST) } YY_BREAK case 322: YY_RULE_SETUP #line 547 "./util/configlexer.lex" -{ YDVAR(1, VAR_CACHEDB_REDISHOST) } +{ YDVAR(1, VAR_IPSECMOD_WHITELIST) } YY_BREAK case 323: YY_RULE_SETUP #line 548 "./util/configlexer.lex" -{ YDVAR(1, VAR_CACHEDB_REDISPORT) } +{ YDVAR(1, VAR_IPSECMOD_STRICT) } YY_BREAK case 324: YY_RULE_SETUP #line 549 "./util/configlexer.lex" -{ YDVAR(1, VAR_CACHEDB_REDISTIMEOUT) } +{ YDVAR(0, VAR_CACHEDB) } YY_BREAK case 325: YY_RULE_SETUP #line 550 "./util/configlexer.lex" -{ YDVAR(1, VAR_CACHEDB_REDISEXPIRERECORDS) } +{ YDVAR(1, VAR_CACHEDB_BACKEND) } YY_BREAK case 326: YY_RULE_SETUP #line 551 "./util/configlexer.lex" -{ YDVAR(0, VAR_IPSET) } +{ YDVAR(1, VAR_CACHEDB_SECRETSEED) } YY_BREAK case 327: YY_RULE_SETUP #line 552 "./util/configlexer.lex" -{ YDVAR(1, VAR_IPSET_NAME_V4) } +{ YDVAR(1, VAR_CACHEDB_REDISHOST) } YY_BREAK case 328: YY_RULE_SETUP #line 553 "./util/configlexer.lex" -{ YDVAR(1, VAR_IPSET_NAME_V6) } +{ YDVAR(1, VAR_CACHEDB_REDISPORT) } YY_BREAK case 329: YY_RULE_SETUP #line 554 "./util/configlexer.lex" -{ YDVAR(1, VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM) } +{ YDVAR(1, VAR_CACHEDB_REDISTIMEOUT) } YY_BREAK case 330: YY_RULE_SETUP #line 555 "./util/configlexer.lex" -{ YDVAR(2, VAR_TCP_CONNECTION_LIMIT) } +{ YDVAR(1, VAR_CACHEDB_REDISEXPIRERECORDS) } YY_BREAK case 331: YY_RULE_SETUP #line 556 "./util/configlexer.lex" -{ YDVAR(2, VAR_EDNS_CLIENT_STRING) } +{ YDVAR(0, VAR_IPSET) } YY_BREAK case 332: YY_RULE_SETUP #line 557 "./util/configlexer.lex" -{ YDVAR(1, VAR_EDNS_CLIENT_STRING_OPCODE) } +{ YDVAR(1, VAR_IPSET_NAME_V4) } YY_BREAK case 333: YY_RULE_SETUP #line 558 "./util/configlexer.lex" -{ YDVAR(1, VAR_NSID ) } +{ YDVAR(1, VAR_IPSET_NAME_V6) } YY_BREAK case 334: YY_RULE_SETUP #line 559 "./util/configlexer.lex" -{ YDVAR(1, VAR_EDE ) } +{ YDVAR(1, VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM) } YY_BREAK case 335: YY_RULE_SETUP #line 560 "./util/configlexer.lex" -{ YDVAR(1, VAR_UPSTREAM_COOKIES ) } +{ YDVAR(2, VAR_TCP_CONNECTION_LIMIT) } YY_BREAK case 336: -/* rule 336 can match eol */ YY_RULE_SETUP #line 561 "./util/configlexer.lex" +{ YDVAR(1, VAR_ANSWER_COOKIE ) } + YY_BREAK +case 337: +YY_RULE_SETUP +#line 562 "./util/configlexer.lex" +{ YDVAR(1, VAR_COOKIE_SECRET) } + YY_BREAK +case 338: +YY_RULE_SETUP +#line 563 "./util/configlexer.lex" +{ YDVAR(2, VAR_EDNS_CLIENT_STRING) } + YY_BREAK +case 339: +YY_RULE_SETUP +#line 564 "./util/configlexer.lex" +{ YDVAR(1, VAR_EDNS_CLIENT_STRING_OPCODE) } + YY_BREAK +case 340: +YY_RULE_SETUP +#line 565 "./util/configlexer.lex" +{ YDVAR(1, VAR_NSID ) } + YY_BREAK +case 341: +YY_RULE_SETUP +#line 566 "./util/configlexer.lex" +{ YDVAR(1, VAR_EDE ) } + YY_BREAK +case 342: +YY_RULE_SETUP +#line 567 "./util/configlexer.lex" +{ YDVAR(1, VAR_UPSTREAM_COOKIES ) } + YY_BREAK +case 343: +YY_RULE_SETUP +#line 568 "./util/configlexer.lex" +{ YDVAR(1, VAR_PROXY_PROTOCOL_PORT) } + YY_BREAK +case 344: +/* rule 344 can match eol */ +YY_RULE_SETUP +#line 569 "./util/configlexer.lex" { LEXOUT(("NL\n")); cfg_parser->line++; } YY_BREAK /* Quoted strings. Strip leading and ending quotes */ -case 337: +case 345: YY_RULE_SETUP -#line 564 "./util/configlexer.lex" +#line 572 "./util/configlexer.lex" { BEGIN(quotedstring); LEXOUT(("QS ")); } YY_BREAK case YY_STATE_EOF(quotedstring): -#line 565 "./util/configlexer.lex" +#line 573 "./util/configlexer.lex" { yyerror("EOF inside quoted string"); if(--num_args == 0) { BEGIN(INITIAL); } else { BEGIN(val); } } YY_BREAK -case 338: +case 346: YY_RULE_SETUP -#line 570 "./util/configlexer.lex" +#line 578 "./util/configlexer.lex" { LEXOUT(("STR(%s) ", yytext)); yymore(); } YY_BREAK -case 339: -/* rule 339 can match eol */ +case 347: +/* rule 347 can match eol */ YY_RULE_SETUP -#line 571 "./util/configlexer.lex" +#line 579 "./util/configlexer.lex" { yyerror("newline inside quoted string, no end \""); cfg_parser->line++; BEGIN(INITIAL); } YY_BREAK -case 340: +case 348: YY_RULE_SETUP -#line 573 "./util/configlexer.lex" +#line 581 "./util/configlexer.lex" { LEXOUT(("QE ")); if(--num_args == 0) { BEGIN(INITIAL); } @@ -5418,34 +5510,34 @@ YY_RULE_SETUP } YY_BREAK /* Single Quoted strings. Strip leading and ending quotes */ -case 341: +case 349: YY_RULE_SETUP -#line 585 "./util/configlexer.lex" +#line 593 "./util/configlexer.lex" { BEGIN(singlequotedstr); LEXOUT(("SQS ")); } YY_BREAK case YY_STATE_EOF(singlequotedstr): -#line 586 "./util/configlexer.lex" +#line 594 "./util/configlexer.lex" { yyerror("EOF inside quoted string"); if(--num_args == 0) { BEGIN(INITIAL); } else { BEGIN(val); } } YY_BREAK -case 342: +case 350: YY_RULE_SETUP -#line 591 "./util/configlexer.lex" +#line 599 "./util/configlexer.lex" { LEXOUT(("STR(%s) ", yytext)); yymore(); } YY_BREAK -case 343: -/* rule 343 can match eol */ +case 351: +/* rule 351 can match eol */ YY_RULE_SETUP -#line 592 "./util/configlexer.lex" +#line 600 "./util/configlexer.lex" { yyerror("newline inside quoted string, no end '"); cfg_parser->line++; BEGIN(INITIAL); } YY_BREAK -case 344: +case 352: YY_RULE_SETUP -#line 594 "./util/configlexer.lex" +#line 602 "./util/configlexer.lex" { LEXOUT(("SQE ")); if(--num_args == 0) { BEGIN(INITIAL); } @@ -5458,38 +5550,38 @@ YY_RULE_SETUP } YY_BREAK /* include: directive */ -case 345: +case 353: YY_RULE_SETUP -#line 606 "./util/configlexer.lex" +#line 614 "./util/configlexer.lex" { LEXOUT(("v(%s) ", yytext)); inc_prev = YYSTATE; BEGIN(include); } YY_BREAK case YY_STATE_EOF(include): -#line 608 "./util/configlexer.lex" +#line 616 "./util/configlexer.lex" { yyerror("EOF inside include directive"); BEGIN(inc_prev); } YY_BREAK -case 346: +case 354: YY_RULE_SETUP -#line 612 "./util/configlexer.lex" +#line 620 "./util/configlexer.lex" { LEXOUT(("ISP ")); /* ignore */ } YY_BREAK -case 347: -/* rule 347 can match eol */ +case 355: +/* rule 355 can match eol */ YY_RULE_SETUP -#line 613 "./util/configlexer.lex" +#line 621 "./util/configlexer.lex" { LEXOUT(("NL\n")); cfg_parser->line++;} YY_BREAK -case 348: +case 356: YY_RULE_SETUP -#line 614 "./util/configlexer.lex" +#line 622 "./util/configlexer.lex" { LEXOUT(("IQS ")); BEGIN(include_quoted); } YY_BREAK -case 349: +case 357: YY_RULE_SETUP -#line 615 "./util/configlexer.lex" +#line 623 "./util/configlexer.lex" { LEXOUT(("Iunquotedstr(%s) ", yytext)); config_start_include_glob(yytext, 0); @@ -5497,27 +5589,27 @@ YY_RULE_SETUP } YY_BREAK case YY_STATE_EOF(include_quoted): -#line 620 "./util/configlexer.lex" +#line 628 "./util/configlexer.lex" { yyerror("EOF inside quoted string"); BEGIN(inc_prev); } YY_BREAK -case 350: +case 358: YY_RULE_SETUP -#line 624 "./util/configlexer.lex" +#line 632 "./util/configlexer.lex" { LEXOUT(("ISTR(%s) ", yytext)); yymore(); } YY_BREAK -case 351: -/* rule 351 can match eol */ +case 359: +/* rule 359 can match eol */ YY_RULE_SETUP -#line 625 "./util/configlexer.lex" +#line 633 "./util/configlexer.lex" { yyerror("newline before \" in include name"); cfg_parser->line++; BEGIN(inc_prev); } YY_BREAK -case 352: +case 360: YY_RULE_SETUP -#line 627 "./util/configlexer.lex" +#line 635 "./util/configlexer.lex" { LEXOUT(("IQE ")); yytext[yyleng - 1] = '\0'; @@ -5527,7 +5619,7 @@ YY_RULE_SETUP YY_BREAK case YY_STATE_EOF(INITIAL): case YY_STATE_EOF(val): -#line 633 "./util/configlexer.lex" +#line 641 "./util/configlexer.lex" { LEXOUT(("LEXEOF ")); yy_set_bol(1); /* Set beginning of line, so "^" rules match. */ @@ -5542,39 +5634,39 @@ case YY_STATE_EOF(val): } YY_BREAK /* include-toplevel: directive */ -case 353: +case 361: YY_RULE_SETUP -#line 647 "./util/configlexer.lex" +#line 655 "./util/configlexer.lex" { LEXOUT(("v(%s) ", yytext)); inc_prev = YYSTATE; BEGIN(include_toplevel); } YY_BREAK case YY_STATE_EOF(include_toplevel): -#line 650 "./util/configlexer.lex" +#line 658 "./util/configlexer.lex" { yyerror("EOF inside include_toplevel directive"); BEGIN(inc_prev); } YY_BREAK -case 354: +case 362: YY_RULE_SETUP -#line 654 "./util/configlexer.lex" +#line 662 "./util/configlexer.lex" { LEXOUT(("ITSP ")); /* ignore */ } YY_BREAK -case 355: -/* rule 355 can match eol */ +case 363: +/* rule 363 can match eol */ YY_RULE_SETUP -#line 655 "./util/configlexer.lex" +#line 663 "./util/configlexer.lex" { LEXOUT(("NL\n")); cfg_parser->line++; } YY_BREAK -case 356: +case 364: YY_RULE_SETUP -#line 656 "./util/configlexer.lex" +#line 664 "./util/configlexer.lex" { LEXOUT(("ITQS ")); BEGIN(include_toplevel_quoted); } YY_BREAK -case 357: +case 365: YY_RULE_SETUP -#line 657 "./util/configlexer.lex" +#line 665 "./util/configlexer.lex" { LEXOUT(("ITunquotedstr(%s) ", yytext)); config_start_include_glob(yytext, 1); @@ -5583,29 +5675,29 @@ YY_RULE_SETUP } YY_BREAK case YY_STATE_EOF(include_toplevel_quoted): -#line 663 "./util/configlexer.lex" +#line 671 "./util/configlexer.lex" { yyerror("EOF inside quoted string"); BEGIN(inc_prev); } YY_BREAK -case 358: +case 366: YY_RULE_SETUP -#line 667 "./util/configlexer.lex" +#line 675 "./util/configlexer.lex" { LEXOUT(("ITSTR(%s) ", yytext)); yymore(); } YY_BREAK -case 359: -/* rule 359 can match eol */ +case 367: +/* rule 367 can match eol */ YY_RULE_SETUP -#line 668 "./util/configlexer.lex" +#line 676 "./util/configlexer.lex" { yyerror("newline before \" in include name"); cfg_parser->line++; BEGIN(inc_prev); } YY_BREAK -case 360: +case 368: YY_RULE_SETUP -#line 672 "./util/configlexer.lex" +#line 680 "./util/configlexer.lex" { LEXOUT(("ITQE ")); yytext[yyleng - 1] = '\0'; @@ -5614,33 +5706,33 @@ YY_RULE_SETUP return (VAR_FORCE_TOPLEVEL); } YY_BREAK -case 361: +case 369: YY_RULE_SETUP -#line 680 "./util/configlexer.lex" +#line 688 "./util/configlexer.lex" { LEXOUT(("unquotedstr(%s) ", yytext)); if(--num_args == 0) { BEGIN(INITIAL); } yylval.str = strdup(yytext); return STRING_ARG; } YY_BREAK -case 362: +case 370: YY_RULE_SETUP -#line 684 "./util/configlexer.lex" +#line 692 "./util/configlexer.lex" { ub_c_error_msg("unknown keyword '%s'", yytext); } YY_BREAK -case 363: +case 371: YY_RULE_SETUP -#line 688 "./util/configlexer.lex" +#line 696 "./util/configlexer.lex" { ub_c_error_msg("stray '%s'", yytext); } YY_BREAK -case 364: +case 372: YY_RULE_SETUP -#line 692 "./util/configlexer.lex" +#line 700 "./util/configlexer.lex" ECHO; YY_BREAK -#line 5642 "" +#line 5733 "" case YY_END_OF_BUFFER: { @@ -5716,7 +5808,7 @@ ECHO; { (yy_did_buffer_switch_on_eof) = 0; - if ( yywrap( ) ) + if ( yywrap( ) ) { /* Note: because we've taken care in * yy_get_next_buffer() to have set up @@ -5769,6 +5861,7 @@ ECHO; "fatal flex scanner internal error--no action found" ); } /* end of action switch */ } /* end of scanning one token */ + } /* end of user's declarations */ } /* end of yylex */ /* yy_get_next_buffer - try to read in a new buffer @@ -5780,9 +5873,9 @@ ECHO; */ static int yy_get_next_buffer (void) { - register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; - register char *source = (yytext_ptr); - register int number_to_move, i; + char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; + char *source = (yytext_ptr); + int number_to_move, i; int ret_val; if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) @@ -5811,7 +5904,7 @@ static int yy_get_next_buffer (void) /* Try to read more data. */ /* First move last chars to start of buffer. */ - number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1; + number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr) - 1); for ( i = 0; i < number_to_move; ++i ) *(dest++) = *(source++); @@ -5831,7 +5924,7 @@ static int yy_get_next_buffer (void) { /* Not enough room in the buffer - grow it. */ /* just a shorter name for the current buffer */ - YY_BUFFER_STATE b = YY_CURRENT_BUFFER; + YY_BUFFER_STATE b = YY_CURRENT_BUFFER_LVALUE; int yy_c_buf_p_offset = (int) ((yy_c_buf_p) - b->yy_ch_buf); @@ -5847,11 +5940,12 @@ static int yy_get_next_buffer (void) b->yy_ch_buf = (char *) /* Include room in for 2 EOB chars. */ - yyrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ); + yyrealloc( (void *) b->yy_ch_buf, + (yy_size_t) (b->yy_buf_size + 2) ); } else /* Can't grow it, we don't own it. */ - b->yy_ch_buf = 0; + b->yy_ch_buf = NULL; if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( @@ -5879,7 +5973,7 @@ static int yy_get_next_buffer (void) if ( number_to_move == YY_MORE_ADJ ) { ret_val = EOB_ACT_END_OF_FILE; - yyrestart(yyin ); + yyrestart( yyin ); } else @@ -5893,12 +5987,15 @@ static int yy_get_next_buffer (void) else ret_val = EOB_ACT_CONTINUE_SCAN; - if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { + if (((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { /* Extend the array by 50%, plus the number we really need. */ yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); - YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ); + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc( + (void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf, (yy_size_t) new_size ); if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); + /* "- 2" to take care of EOB's */ + YY_CURRENT_BUFFER_LVALUE->yy_buf_size = (int) (new_size - 2); } (yy_n_chars) += number_to_move; @@ -5914,14 +6011,14 @@ static int yy_get_next_buffer (void) static yy_state_type yy_get_previous_state (void) { - register yy_state_type yy_current_state; - register char *yy_cp; + yy_state_type yy_current_state; + char *yy_cp; yy_current_state = (yy_start); for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) { - register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); + YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; @@ -5930,10 +6027,10 @@ 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 >= 3616 ) - yy_c = yy_meta[(unsigned int) yy_c]; + if ( yy_current_state >= 3687 ) + yy_c = yy_meta[yy_c]; } - yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; } return yy_current_state; @@ -5946,10 +6043,10 @@ static int yy_get_next_buffer (void) */ static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state ) { - register int yy_is_jam; - register char *yy_cp = (yy_c_buf_p); + int yy_is_jam; + char *yy_cp = (yy_c_buf_p); - register YY_CHAR yy_c = 1; + YY_CHAR yy_c = 1; if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; @@ -5958,15 +6055,19 @@ 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 >= 3616 ) - yy_c = yy_meta[(unsigned int) yy_c]; + if ( yy_current_state >= 3687 ) + yy_c = yy_meta[yy_c]; } - yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; - yy_is_jam = (yy_current_state == 3615); + yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; + yy_is_jam = (yy_current_state == 3686); - return yy_is_jam ? 0 : yy_current_state; + return yy_is_jam ? 0 : yy_current_state; } +#ifndef YY_NO_UNPUT + +#endif + #ifndef YY_NO_INPUT #ifdef __cplusplus static int yyinput (void) @@ -6008,13 +6109,13 @@ static int yy_get_next_buffer (void) */ /* Reset buffer status. */ - yyrestart(yyin ); + yyrestart( yyin ); /*FALLTHROUGH*/ case EOB_ACT_END_OF_FILE: { - if ( yywrap( ) ) + if ( yywrap( ) ) return 0; if ( ! (yy_did_buffer_switch_on_eof) ) @@ -6052,11 +6153,11 @@ static int yy_get_next_buffer (void) if ( ! YY_CURRENT_BUFFER ){ yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = - yy_create_buffer(yyin,YY_BUF_SIZE ); + yy_create_buffer( yyin, YY_BUF_SIZE ); } - yy_init_buffer(YY_CURRENT_BUFFER,input_file ); - yy_load_buffer_state( ); + yy_init_buffer( YY_CURRENT_BUFFER, input_file ); + yy_load_buffer_state( ); } /** Switch to a different input buffer. @@ -6084,7 +6185,7 @@ static int yy_get_next_buffer (void) } YY_CURRENT_BUFFER_LVALUE = new_buffer; - yy_load_buffer_state( ); + yy_load_buffer_state( ); /* We don't actually know whether we did this switch during * EOF (yywrap()) processing, but the only time this flag @@ -6112,7 +6213,7 @@ static void yy_load_buffer_state (void) { YY_BUFFER_STATE b; - b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ); + b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); @@ -6121,13 +6222,13 @@ static void yy_load_buffer_state (void) /* yy_ch_buf has to be 2 characters longer than the size given because * we need to put in 2 end-of-buffer characters. */ - b->yy_ch_buf = (char *) yyalloc(b->yy_buf_size + 2 ); + b->yy_ch_buf = (char *) yyalloc( (yy_size_t) (b->yy_buf_size + 2) ); if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_is_our_buffer = 1; - yy_init_buffer(b,file ); + yy_init_buffer( b, file ); return b; } @@ -6146,15 +6247,11 @@ static void yy_load_buffer_state (void) YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; if ( b->yy_is_our_buffer ) - yyfree((void *) b->yy_ch_buf ); + yyfree( (void *) b->yy_ch_buf ); - yyfree((void *) b ); + yyfree( (void *) b ); } -#ifndef __cplusplus -extern int isatty (int ); -#endif /* __cplusplus */ - /* Initializes or reinitializes a buffer. * This function is sometimes called more than once on the same buffer, * such as during a yyrestart() or at EOF. @@ -6164,7 +6261,7 @@ extern int isatty (int ); { int oerrno = errno; - yy_flush_buffer(b ); + yy_flush_buffer( b ); b->yy_input_file = file; b->yy_fill_buffer = 1; @@ -6207,7 +6304,7 @@ extern int isatty (int ); b->yy_buffer_status = YY_BUFFER_NEW; if ( b == YY_CURRENT_BUFFER ) - yy_load_buffer_state( ); + yy_load_buffer_state( ); } /** Pushes the new state onto the stack. The new state becomes @@ -6238,7 +6335,7 @@ void yypush_buffer_state (YY_BUFFER_STATE new_buffer ) YY_CURRENT_BUFFER_LVALUE = new_buffer; /* copied from yy_switch_to_buffer. */ - yy_load_buffer_state( ); + yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } @@ -6257,7 +6354,7 @@ void yypop_buffer_state (void) --(yy_buffer_stack_top); if (YY_CURRENT_BUFFER) { - yy_load_buffer_state( ); + yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } } @@ -6275,15 +6372,15 @@ static void yyensure_buffer_stack (void) * scanner will even need a stack. We use 2 instead of 1 to avoid an * immediate realloc on the next call. */ - num_to_alloc = 1; + num_to_alloc = 1; /* After all that talk, this was set to 1 anyways... */ (yy_buffer_stack) = (struct yy_buffer_state**)yyalloc (num_to_alloc * sizeof(struct yy_buffer_state*) ); if ( ! (yy_buffer_stack) ) YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); - + memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); - + (yy_buffer_stack_max) = num_to_alloc; (yy_buffer_stack_top) = 0; return; @@ -6292,7 +6389,7 @@ static void yyensure_buffer_stack (void) if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ /* Increase the buffer to prepare for a possible push. */ - int grow_size = 8 /* arbitrary grow size */; + yy_size_t grow_size = 8 /* arbitrary grow size */; num_to_alloc = (yy_buffer_stack_max) + grow_size; (yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc @@ -6312,7 +6409,7 @@ static void yyensure_buffer_stack (void) * @param base the character buffer * @param size the size in bytes of the character buffer * - * @return the newly allocated buffer state object. + * @return the newly allocated buffer state object. */ YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size ) { @@ -6322,23 +6419,23 @@ YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size ) base[size-2] != YY_END_OF_BUFFER_CHAR || base[size-1] != YY_END_OF_BUFFER_CHAR ) /* They forgot to leave room for the EOB's. */ - return 0; + return NULL; - b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ); + b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); - b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ + b->yy_buf_size = (int) (size - 2); /* "- 2" to take care of EOB's */ b->yy_buf_pos = b->yy_ch_buf = base; b->yy_is_our_buffer = 0; - b->yy_input_file = 0; + b->yy_input_file = NULL; b->yy_n_chars = b->yy_buf_size; b->yy_is_interactive = 0; b->yy_at_bol = 1; b->yy_fill_buffer = 0; b->yy_buffer_status = YY_BUFFER_NEW; - yy_switch_to_buffer(b ); + yy_switch_to_buffer( b ); return b; } @@ -6351,28 +6448,29 @@ YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size ) * @note If you want to scan bytes that may contain NUL values, then use * yy_scan_bytes() instead. */ -YY_BUFFER_STATE yy_scan_string (yyconst char * yystr ) +YY_BUFFER_STATE yy_scan_string (const char * yystr ) { - return yy_scan_bytes(yystr,strlen(yystr) ); + return yy_scan_bytes( yystr, (int) strlen(yystr) ); } /** Setup the input buffer state to scan the given bytes. The next call to yylex() will * scan from a @e copy of @a bytes. - * @param bytes the byte buffer to scan - * @param len the number of bytes in the buffer pointed to by @a bytes. + * @param yybytes the byte buffer to scan + * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes. * * @return the newly allocated buffer state object. */ -YY_BUFFER_STATE yy_scan_bytes (yyconst char * yybytes, yy_size_t _yybytes_len ) +YY_BUFFER_STATE yy_scan_bytes (const char * yybytes, yy_size_t _yybytes_len ) { YY_BUFFER_STATE b; char *buf; - yy_size_t n, i; + yy_size_t n; + yy_size_t i; /* Get memory for full buffer, including space for trailing EOB's. */ - n = _yybytes_len + 2; - buf = (char *) yyalloc(n ); + n = (yy_size_t) (_yybytes_len + 2); + buf = (char *) yyalloc( n ); if ( ! buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); @@ -6381,7 +6479,7 @@ YY_BUFFER_STATE yy_scan_bytes (yyconst char * yybytes, yy_size_t _yybytes_len buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; - b = yy_scan_buffer(buf,n ); + b = yy_scan_buffer( buf, n ); if ( ! b ) YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); @@ -6397,9 +6495,9 @@ YY_BUFFER_STATE yy_scan_bytes (yyconst char * yybytes, yy_size_t _yybytes_len #define YY_EXIT_FAILURE 2 #endif -static void yy_fatal_error (yyconst char* msg ) +static void yynoreturn yy_fatal_error (const char* msg ) { - (void) fprintf( stderr, "%s\n", msg ); + fprintf( stderr, "%s\n", msg ); exit( YY_EXIT_FAILURE ); } @@ -6410,7 +6508,7 @@ static void yy_fatal_error (yyconst char* msg ) do \ { \ /* Undo effects of setting up yytext. */ \ - int yyless_macro_arg = (n); \ + yy_size_t yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ yytext[yyleng] = (yy_hold_char); \ (yy_c_buf_p) = yytext + yyless_macro_arg; \ @@ -6427,7 +6525,7 @@ static void yy_fatal_error (yyconst char* msg ) */ int yyget_lineno (void) { - + return yylineno; } @@ -6465,29 +6563,29 @@ char *yyget_text (void) } /** Set the current line number. - * @param line_number + * @param _line_number line number * */ -void yyset_lineno (int line_number ) +void yyset_lineno (int _line_number ) { - yylineno = line_number; + yylineno = _line_number; } /** Set the input stream. This does not discard the current * input buffer. - * @param in_str A readable stream. + * @param _in_str A readable stream. * * @see yy_switch_to_buffer */ -void yyset_in (FILE * in_str ) +void yyset_in (FILE * _in_str ) { - yyin = in_str ; + yyin = _in_str ; } -void yyset_out (FILE * out_str ) +void yyset_out (FILE * _out_str ) { - yyout = out_str ; + yyout = _out_str ; } int yyget_debug (void) @@ -6495,9 +6593,9 @@ int yyget_debug (void) return yy_flex_debug; } -void yyset_debug (int bdebug ) +void yyset_debug (int _bdebug ) { - yy_flex_debug = bdebug ; + yy_flex_debug = _bdebug ; } static int yy_init_globals (void) @@ -6506,10 +6604,10 @@ static int yy_init_globals (void) * This function is called from yylex_destroy(), so don't allocate here. */ - (yy_buffer_stack) = 0; + (yy_buffer_stack) = NULL; (yy_buffer_stack_top) = 0; (yy_buffer_stack_max) = 0; - (yy_c_buf_p) = (char *) 0; + (yy_c_buf_p) = NULL; (yy_init) = 0; (yy_start) = 0; @@ -6518,8 +6616,8 @@ static int yy_init_globals (void) yyin = stdin; yyout = stdout; #else - yyin = (FILE *) 0; - yyout = (FILE *) 0; + yyin = NULL; + yyout = NULL; #endif /* For future reference: Set errno on error, since we are called by @@ -6534,7 +6632,7 @@ int yylex_destroy (void) /* Pop the buffer stack, destroying each element. */ while(YY_CURRENT_BUFFER){ - yy_delete_buffer(YY_CURRENT_BUFFER ); + yy_delete_buffer( YY_CURRENT_BUFFER ); YY_CURRENT_BUFFER_LVALUE = NULL; yypop_buffer_state(); } @@ -6555,18 +6653,19 @@ int yylex_destroy (void) */ #ifndef yytext_ptr -static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) +static void yy_flex_strncpy (char* s1, const char * s2, int n ) { - register int i; + + int i; for ( i = 0; i < n; ++i ) s1[i] = s2[i]; } #endif #ifdef YY_NEED_STRLEN -static int yy_flex_strlen (yyconst char * s ) +static int yy_flex_strlen (const char * s ) { - register int n; + int n; for ( n = 0; s[n]; ++n ) ; @@ -6576,11 +6675,12 @@ static int yy_flex_strlen (yyconst char * s ) void *yyalloc (yy_size_t size ) { - return (void *) malloc( size ); + return malloc(size); } void *yyrealloc (void * ptr, yy_size_t size ) { + /* The cast to (char *) in the following accommodates both * implementations that use char* generic pointers, and those * that use void* generic pointers. It works with the latter @@ -6588,17 +6688,16 @@ void *yyrealloc (void * ptr, yy_size_t size ) * any pointer type to void*, and deal with argument conversions * as though doing an assignment. */ - return (void *) realloc( (char *) ptr, size ); + return realloc(ptr, size); } void yyfree (void * ptr ) { - free( (char *) ptr ); /* see yyrealloc() for (char *) cast */ + free( (char *) ptr ); /* see yyrealloc() for (char *) cast */ } #define YYTABLES_NAME "yytables" -#line 692 "./util/configlexer.lex" - +#line 700 "./util/configlexer.lex" diff --git a/util/configlexer.lex b/util/configlexer.lex index 356893b00..138ec876a 100644 --- a/util/configlexer.lex +++ b/util/configlexer.lex @@ -364,6 +364,7 @@ view-first{COLON} { YDVAR(1, VAR_VIEW_FIRST) } do-not-query-address{COLON} { YDVAR(1, VAR_DO_NOT_QUERY_ADDRESS) } do-not-query-localhost{COLON} { YDVAR(1, VAR_DO_NOT_QUERY_LOCALHOST) } access-control{COLON} { YDVAR(2, VAR_ACCESS_CONTROL) } +interface-action{COLON} { YDVAR(2, VAR_INTERFACE_ACTION) } send-client-subnet{COLON} { YDVAR(1, VAR_SEND_CLIENT_SUBNET) } client-subnet-zone{COLON} { YDVAR(1, VAR_CLIENT_SUBNET_ZONE) } client-subnet-always-forward{COLON} { YDVAR(1, VAR_CLIENT_SUBNET_ALWAYS_FORWARD) } @@ -466,6 +467,10 @@ access-control-tag{COLON} { YDVAR(2, VAR_ACCESS_CONTROL_TAG) } access-control-tag-action{COLON} { YDVAR(3, VAR_ACCESS_CONTROL_TAG_ACTION) } access-control-tag-data{COLON} { YDVAR(3, VAR_ACCESS_CONTROL_TAG_DATA) } access-control-view{COLON} { YDVAR(2, VAR_ACCESS_CONTROL_VIEW) } +interface-tag{COLON} { YDVAR(2, VAR_INTERFACE_TAG) } +interface-tag-action{COLON} { YDVAR(3, VAR_INTERFACE_TAG_ACTION) } +interface-tag-data{COLON} { YDVAR(3, VAR_INTERFACE_TAG_DATA) } +interface-view{COLON} { YDVAR(2, VAR_INTERFACE_VIEW) } local-zone-override{COLON} { YDVAR(3, VAR_LOCAL_ZONE_OVERRIDE) } dnstap{COLON} { YDVAR(0, VAR_DNSTAP) } dnstap-enable{COLON} { YDVAR(1, VAR_DNSTAP_ENABLE) } @@ -553,11 +558,14 @@ name-v4{COLON} { YDVAR(1, VAR_IPSET_NAME_V4) } name-v6{COLON} { YDVAR(1, VAR_IPSET_NAME_V6) } udp-upstream-without-downstream{COLON} { YDVAR(1, VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM) } tcp-connection-limit{COLON} { YDVAR(2, VAR_TCP_CONNECTION_LIMIT) } +answer-cookie{COLON} { YDVAR(1, VAR_ANSWER_COOKIE ) } +cookie-secret{COLON} { YDVAR(1, VAR_COOKIE_SECRET) } edns-client-string{COLON} { YDVAR(2, VAR_EDNS_CLIENT_STRING) } edns-client-string-opcode{COLON} { YDVAR(1, VAR_EDNS_CLIENT_STRING_OPCODE) } nsid{COLON} { YDVAR(1, VAR_NSID ) } ede{COLON} { YDVAR(1, VAR_EDE ) } upstream-cookies{COLON} { YDVAR(1, VAR_UPSTREAM_COOKIES ) } +proxy-protocol-port{COLON} { YDVAR(1, VAR_PROXY_PROTOCOL_PORT) } {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 373f61e4c..9aa13bfad 100644 --- a/util/configparser.c +++ b/util/configparser.c @@ -360,38 +360,46 @@ VAR_ALLOW_NOTIFY = 549, VAR_TLS_WIN_CERT = 550, VAR_TCP_CONNECTION_LIMIT = 551, - VAR_FORWARD_NO_CACHE = 552, - VAR_STUB_NO_CACHE = 553, - VAR_LOG_SERVFAIL = 554, - VAR_DENY_ANY = 555, - VAR_UNKNOWN_SERVER_TIME_LIMIT = 556, - VAR_LOG_TAG_QUERYREPLY = 557, - VAR_STREAM_WAIT_SIZE = 558, - VAR_TLS_CIPHERS = 559, - VAR_TLS_CIPHERSUITES = 560, - VAR_TLS_USE_SNI = 561, - VAR_IPSET = 562, - VAR_IPSET_NAME_V4 = 563, - VAR_IPSET_NAME_V6 = 564, - VAR_TLS_SESSION_TICKET_KEYS = 565, - VAR_RPZ = 566, - VAR_TAGS = 567, - VAR_RPZ_ACTION_OVERRIDE = 568, - VAR_RPZ_CNAME_OVERRIDE = 569, - VAR_RPZ_LOG = 570, - VAR_RPZ_LOG_NAME = 571, - VAR_DYNLIB = 572, - VAR_DYNLIB_FILE = 573, - VAR_EDNS_CLIENT_STRING = 574, - VAR_EDNS_CLIENT_STRING_OPCODE = 575, - VAR_NSID = 576, - VAR_ZONEMD_PERMISSIVE_MODE = 577, - VAR_ZONEMD_CHECK = 578, - VAR_ZONEMD_REJECT_ABSENCE = 579, - VAR_RPZ_SIGNAL_NXDOMAIN_RA = 580, - VAR_INTERFACE_AUTOMATIC_PORTS = 581, - VAR_EDE = 582, - VAR_UPSTREAM_COOKIES = 583 + VAR_ANSWER_COOKIE = 552, + VAR_COOKIE_SECRET = 553, + VAR_FORWARD_NO_CACHE = 554, + VAR_STUB_NO_CACHE = 555, + VAR_LOG_SERVFAIL = 556, + VAR_DENY_ANY = 557, + VAR_UNKNOWN_SERVER_TIME_LIMIT = 558, + VAR_LOG_TAG_QUERYREPLY = 559, + VAR_STREAM_WAIT_SIZE = 560, + VAR_TLS_CIPHERS = 561, + VAR_TLS_CIPHERSUITES = 562, + VAR_TLS_USE_SNI = 563, + VAR_IPSET = 564, + VAR_IPSET_NAME_V4 = 565, + VAR_IPSET_NAME_V6 = 566, + VAR_TLS_SESSION_TICKET_KEYS = 567, + VAR_RPZ = 568, + VAR_TAGS = 569, + VAR_RPZ_ACTION_OVERRIDE = 570, + VAR_RPZ_CNAME_OVERRIDE = 571, + VAR_RPZ_LOG = 572, + VAR_RPZ_LOG_NAME = 573, + VAR_DYNLIB = 574, + VAR_DYNLIB_FILE = 575, + VAR_EDNS_CLIENT_STRING = 576, + VAR_EDNS_CLIENT_STRING_OPCODE = 577, + VAR_NSID = 578, + VAR_ZONEMD_PERMISSIVE_MODE = 579, + VAR_ZONEMD_CHECK = 580, + VAR_ZONEMD_REJECT_ABSENCE = 581, + VAR_RPZ_SIGNAL_NXDOMAIN_RA = 582, + VAR_INTERFACE_AUTOMATIC_PORTS = 583, + VAR_EDE = 584, + VAR_UPSTREAM_COOKIES = 585, + VAR_INTERFACE_ACTION = 586, + VAR_INTERFACE_VIEW = 587, + VAR_INTERFACE_TAG = 588, + VAR_INTERFACE_TAG_ACTION = 589, + VAR_INTERFACE_TAG_DATA = 590, + VAR_PROXY_PROTOCOL_PORT = 591 }; #endif /* Tokens. */ @@ -689,38 +697,46 @@ #define VAR_ALLOW_NOTIFY 549 #define VAR_TLS_WIN_CERT 550 #define VAR_TCP_CONNECTION_LIMIT 551 -#define VAR_FORWARD_NO_CACHE 552 -#define VAR_STUB_NO_CACHE 553 -#define VAR_LOG_SERVFAIL 554 -#define VAR_DENY_ANY 555 -#define VAR_UNKNOWN_SERVER_TIME_LIMIT 556 -#define VAR_LOG_TAG_QUERYREPLY 557 -#define VAR_STREAM_WAIT_SIZE 558 -#define VAR_TLS_CIPHERS 559 -#define VAR_TLS_CIPHERSUITES 560 -#define VAR_TLS_USE_SNI 561 -#define VAR_IPSET 562 -#define VAR_IPSET_NAME_V4 563 -#define VAR_IPSET_NAME_V6 564 -#define VAR_TLS_SESSION_TICKET_KEYS 565 -#define VAR_RPZ 566 -#define VAR_TAGS 567 -#define VAR_RPZ_ACTION_OVERRIDE 568 -#define VAR_RPZ_CNAME_OVERRIDE 569 -#define VAR_RPZ_LOG 570 -#define VAR_RPZ_LOG_NAME 571 -#define VAR_DYNLIB 572 -#define VAR_DYNLIB_FILE 573 -#define VAR_EDNS_CLIENT_STRING 574 -#define VAR_EDNS_CLIENT_STRING_OPCODE 575 -#define VAR_NSID 576 -#define VAR_ZONEMD_PERMISSIVE_MODE 577 -#define VAR_ZONEMD_CHECK 578 -#define VAR_ZONEMD_REJECT_ABSENCE 579 -#define VAR_RPZ_SIGNAL_NXDOMAIN_RA 580 -#define VAR_INTERFACE_AUTOMATIC_PORTS 581 -#define VAR_EDE 582 -#define VAR_UPSTREAM_COOKIES 583 +#define VAR_ANSWER_COOKIE 552 +#define VAR_COOKIE_SECRET 553 +#define VAR_FORWARD_NO_CACHE 554 +#define VAR_STUB_NO_CACHE 555 +#define VAR_LOG_SERVFAIL 556 +#define VAR_DENY_ANY 557 +#define VAR_UNKNOWN_SERVER_TIME_LIMIT 558 +#define VAR_LOG_TAG_QUERYREPLY 559 +#define VAR_STREAM_WAIT_SIZE 560 +#define VAR_TLS_CIPHERS 561 +#define VAR_TLS_CIPHERSUITES 562 +#define VAR_TLS_USE_SNI 563 +#define VAR_IPSET 564 +#define VAR_IPSET_NAME_V4 565 +#define VAR_IPSET_NAME_V6 566 +#define VAR_TLS_SESSION_TICKET_KEYS 567 +#define VAR_RPZ 568 +#define VAR_TAGS 569 +#define VAR_RPZ_ACTION_OVERRIDE 570 +#define VAR_RPZ_CNAME_OVERRIDE 571 +#define VAR_RPZ_LOG 572 +#define VAR_RPZ_LOG_NAME 573 +#define VAR_DYNLIB 574 +#define VAR_DYNLIB_FILE 575 +#define VAR_EDNS_CLIENT_STRING 576 +#define VAR_EDNS_CLIENT_STRING_OPCODE 577 +#define VAR_NSID 578 +#define VAR_ZONEMD_PERMISSIVE_MODE 579 +#define VAR_ZONEMD_CHECK 580 +#define VAR_ZONEMD_REJECT_ABSENCE 581 +#define VAR_RPZ_SIGNAL_NXDOMAIN_RA 582 +#define VAR_INTERFACE_AUTOMATIC_PORTS 583 +#define VAR_EDE 584 +#define VAR_UPSTREAM_COOKIES 585 +#define VAR_INTERFACE_ACTION 586 +#define VAR_INTERFACE_VIEW 587 +#define VAR_INTERFACE_TAG 588 +#define VAR_INTERFACE_TAG_ACTION 589 +#define VAR_INTERFACE_TAG_DATA 590 +#define VAR_PROXY_PROTOCOL_PORT 591 @@ -734,16 +750,19 @@ #include #include #include +#include #include #include "util/configyyrename.h" #include "util/config_file.h" #include "util/net_help.h" +#include "sldns/str2wire.h" int ub_c_lex(void); void ub_c_error(const char *message); static void validate_respip_action(const char* action); +static void validate_acl_action(const char* action); /* these need to be global, otherwise they cannot be used inside yacc */ extern struct config_parser_state* cfg_parser; @@ -776,12 +795,12 @@ extern struct config_parser_state* cfg_parser; #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED typedef union YYSTYPE -#line 66 "./util/configparser.y" +#line 69 "./util/configparser.y" { char* str; } /* Line 193 of yacc.c. */ -#line 785 "util/configparser.c" +#line 804 "util/configparser.c" YYSTYPE; # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 @@ -794,7 +813,7 @@ typedef union YYSTYPE /* Line 216 of yacc.c. */ -#line 798 "util/configparser.c" +#line 817 "util/configparser.c" #ifdef short # undef short @@ -1009,20 +1028,20 @@ union yyalloc /* YYFINAL -- State number of the termination state. */ #define YYFINAL 2 /* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 697 +#define YYLAST 719 /* YYNTOKENS -- Number of terminals. */ -#define YYNTOKENS 329 +#define YYNTOKENS 337 /* YYNNTS -- Number of nonterminals. */ -#define YYNNTS 354 +#define YYNNTS 362 /* YYNRULES -- Number of rules. */ -#define YYNRULES 685 +#define YYNRULES 701 /* YYNRULES -- Number of states. */ -#define YYNSTATES 1018 +#define YYNSTATES 1049 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ #define YYUNDEFTOK 2 -#define YYMAXUTOK 583 +#define YYMAXUTOK 591 #define YYTRANSLATE(YYX) \ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) @@ -1088,7 +1107,8 @@ static const yytype_uint16 yytranslate[] = 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 + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336 }; #if YYDEBUG @@ -1121,161 +1141,165 @@ static const yytype_uint16 yyprhs[] = 452, 454, 456, 458, 460, 462, 464, 466, 468, 470, 472, 474, 476, 478, 480, 482, 484, 486, 488, 490, 492, 494, 496, 498, 500, 502, 504, 506, 508, 510, - 513, 514, 516, 518, 520, 522, 524, 526, 528, 530, - 532, 535, 536, 538, 540, 542, 544, 546, 548, 550, - 552, 555, 556, 558, 560, 562, 564, 566, 568, 570, - 572, 575, 576, 578, 580, 582, 584, 586, 588, 590, - 592, 594, 596, 599, 602, 605, 608, 611, 614, 616, - 619, 620, 622, 624, 626, 628, 630, 632, 634, 636, - 638, 640, 642, 644, 647, 650, 653, 656, 659, 662, - 665, 668, 671, 674, 677, 680, 683, 686, 689, 692, - 695, 698, 701, 704, 707, 710, 713, 716, 719, 722, - 725, 728, 731, 734, 737, 740, 743, 746, 749, 752, - 755, 758, 761, 764, 767, 770, 773, 776, 779, 782, - 785, 788, 791, 794, 797, 800, 803, 806, 809, 812, - 815, 818, 821, 824, 827, 830, 833, 836, 839, 842, - 845, 848, 851, 854, 857, 860, 863, 866, 869, 872, - 875, 878, 881, 884, 887, 890, 893, 896, 899, 902, - 905, 908, 911, 914, 917, 920, 923, 926, 929, 932, - 935, 938, 941, 944, 947, 950, 953, 956, 959, 962, - 965, 968, 971, 974, 977, 980, 983, 986, 989, 992, - 995, 998, 1001, 1004, 1007, 1010, 1013, 1016, 1019, 1022, - 1025, 1028, 1031, 1034, 1037, 1040, 1043, 1046, 1049, 1052, - 1055, 1058, 1062, 1065, 1068, 1071, 1074, 1077, 1080, 1083, - 1086, 1089, 1092, 1095, 1098, 1101, 1104, 1107, 1110, 1113, - 1116, 1119, 1122, 1125, 1128, 1131, 1134, 1137, 1140, 1143, - 1146, 1149, 1152, 1155, 1158, 1162, 1165, 1168, 1171, 1174, - 1177, 1180, 1183, 1186, 1189, 1192, 1196, 1200, 1205, 1210, - 1215, 1219, 1223, 1226, 1229, 1232, 1235, 1238, 1241, 1245, - 1249, 1252, 1255, 1258, 1261, 1264, 1267, 1270, 1273, 1276, - 1279, 1282, 1285, 1288, 1291, 1294, 1297, 1300, 1303, 1306, - 1309, 1313, 1316, 1319, 1322, 1325, 1328, 1331, 1334, 1337, - 1340, 1343, 1346, 1349, 1352, 1355, 1358, 1361, 1364, 1367, - 1370, 1373, 1376, 1379, 1382, 1385, 1388, 1391, 1394, 1397, - 1400, 1404, 1408, 1412, 1415, 1418, 1421, 1423, 1426, 1427, - 1429, 1431, 1433, 1435, 1437, 1439, 1441, 1443, 1446, 1449, - 1452, 1455, 1458, 1461, 1464, 1467, 1469, 1472, 1473, 1475, - 1477, 1479, 1481, 1483, 1485, 1487, 1489, 1491, 1493, 1495, - 1497, 1499, 1501, 1503, 1505, 1507, 1509, 1511, 1514, 1517, - 1520, 1523, 1526, 1529, 1532, 1535, 1538, 1541, 1544, 1547, - 1550, 1553, 1556, 1559, 1562, 1565, 1568, 1570, 1573, 1574, - 1576, 1579, 1581, 1584, 1585, 1587, 1590, 1593, 1596, 1600, - 1604, 1606, 1609, 1610, 1612, 1614, 1616, 1618, 1620, 1622, - 1624, 1626, 1628, 1630, 1633, 1636, 1639, 1642, 1645, 1648, - 1651, 1654, 1657, 1660, 1662, 1665, 1666, 1668, 1670, 1672, - 1674, 1676, 1678, 1681, 1684, 1687, 1690, 1693, 1696, 1700, - 1702, 1705, 1706, 1708, 1710, 1713 + 512, 514, 516, 518, 520, 522, 524, 526, 529, 530, + 532, 534, 536, 538, 540, 542, 544, 546, 548, 551, + 552, 554, 556, 558, 560, 562, 564, 566, 568, 571, + 572, 574, 576, 578, 580, 582, 584, 586, 588, 591, + 592, 594, 596, 598, 600, 602, 604, 606, 608, 610, + 612, 615, 618, 621, 624, 627, 630, 632, 635, 636, + 638, 640, 642, 644, 646, 648, 650, 652, 654, 656, + 658, 660, 663, 666, 669, 672, 675, 678, 681, 684, + 687, 690, 693, 696, 699, 702, 705, 708, 711, 714, + 717, 720, 723, 726, 729, 732, 735, 738, 741, 744, + 747, 750, 753, 756, 759, 762, 765, 768, 771, 774, + 777, 780, 783, 786, 789, 792, 795, 798, 801, 804, + 807, 810, 813, 816, 819, 822, 825, 828, 831, 834, + 837, 840, 843, 846, 849, 852, 855, 858, 861, 864, + 867, 870, 873, 876, 879, 882, 885, 888, 891, 894, + 897, 900, 903, 906, 909, 912, 915, 918, 921, 924, + 927, 930, 933, 936, 939, 942, 945, 948, 951, 954, + 957, 960, 963, 966, 969, 972, 975, 978, 981, 984, + 987, 990, 993, 996, 999, 1002, 1005, 1008, 1011, 1014, + 1017, 1020, 1023, 1026, 1029, 1032, 1035, 1038, 1041, 1044, + 1047, 1050, 1053, 1056, 1059, 1062, 1065, 1068, 1071, 1074, + 1078, 1082, 1085, 1088, 1091, 1094, 1097, 1100, 1103, 1106, + 1109, 1112, 1115, 1118, 1121, 1124, 1127, 1130, 1133, 1136, + 1139, 1142, 1145, 1148, 1151, 1154, 1157, 1160, 1163, 1166, + 1169, 1172, 1175, 1178, 1182, 1185, 1188, 1191, 1194, 1197, + 1200, 1203, 1206, 1209, 1212, 1216, 1220, 1225, 1230, 1235, + 1239, 1243, 1248, 1253, 1257, 1261, 1264, 1267, 1270, 1273, + 1276, 1279, 1283, 1287, 1290, 1293, 1296, 1299, 1302, 1305, + 1308, 1311, 1314, 1317, 1320, 1323, 1326, 1329, 1332, 1335, + 1338, 1341, 1344, 1347, 1351, 1354, 1357, 1360, 1363, 1366, + 1369, 1372, 1375, 1378, 1381, 1384, 1387, 1390, 1393, 1396, + 1399, 1402, 1405, 1408, 1411, 1414, 1417, 1420, 1423, 1426, + 1429, 1432, 1435, 1438, 1441, 1445, 1449, 1453, 1456, 1459, + 1462, 1464, 1467, 1468, 1470, 1472, 1474, 1476, 1478, 1480, + 1482, 1484, 1487, 1490, 1493, 1496, 1499, 1502, 1505, 1508, + 1510, 1513, 1514, 1516, 1518, 1520, 1522, 1524, 1526, 1528, + 1530, 1532, 1534, 1536, 1538, 1540, 1542, 1544, 1546, 1548, + 1550, 1552, 1555, 1558, 1561, 1564, 1567, 1570, 1573, 1576, + 1579, 1582, 1585, 1588, 1591, 1594, 1597, 1600, 1603, 1606, + 1609, 1611, 1614, 1615, 1617, 1620, 1622, 1625, 1626, 1628, + 1631, 1634, 1637, 1641, 1645, 1647, 1650, 1651, 1653, 1655, + 1657, 1659, 1661, 1663, 1665, 1667, 1669, 1671, 1674, 1677, + 1680, 1683, 1686, 1689, 1692, 1695, 1698, 1701, 1703, 1706, + 1707, 1709, 1711, 1713, 1715, 1717, 1719, 1722, 1725, 1728, + 1731, 1734, 1737, 1741, 1744, 1747, 1749, 1752, 1753, 1755, + 1757, 1760 }; /* YYRHS -- A `-1'-separated list of the rules' RHS. */ static const yytype_int16 yyrhs[] = { - 330, 0, -1, -1, 330, 331, -1, 333, 334, -1, - 336, 337, -1, 339, 340, -1, 643, 644, -1, 610, - 611, -1, 621, 622, -1, 342, 343, -1, 655, 656, - -1, 668, 669, -1, 678, 679, -1, 345, 346, -1, - 354, 355, -1, 647, 648, -1, 332, -1, 11, -1, - 12, -1, 334, 335, -1, -1, 357, -1, 358, -1, - 364, -1, 377, -1, 384, -1, 385, -1, 388, -1, - 389, -1, 386, -1, 387, -1, 390, -1, 391, -1, - 392, -1, 396, -1, 397, -1, 375, -1, 427, -1, - 428, -1, 429, -1, 430, -1, 431, -1, 459, -1, - 460, -1, 461, -1, 467, -1, 468, -1, 380, -1, - 469, -1, 470, -1, 473, -1, 471, -1, 472, -1, - 477, -1, 478, -1, 479, -1, 493, -1, 442, -1, - 443, -1, 446, -1, 447, -1, 445, -1, 448, -1, - 480, -1, 496, -1, 436, -1, 438, -1, 497, -1, - 504, -1, 505, -1, 506, -1, 381, -1, 458, -1, - 525, -1, 526, -1, 437, -1, 519, -1, 420, -1, - 376, -1, 432, -1, 494, -1, 501, -1, 481, -1, - 495, -1, 528, -1, 529, -1, 382, -1, 359, -1, - 419, -1, 485, -1, 360, -1, 378, -1, 379, -1, - 433, -1, 434, -1, 527, -1, 483, -1, 487, -1, - 488, -1, 361, -1, 530, -1, 462, -1, 492, -1, - 421, -1, 441, -1, 498, -1, 499, -1, 500, -1, - 503, -1, 518, -1, 435, -1, 521, -1, 522, -1, - 523, -1, 450, -1, 457, -1, 489, -1, 490, -1, - 451, -1, 482, -1, 508, -1, 422, -1, 423, -1, - 398, -1, 400, -1, 426, -1, 401, -1, 402, -1, - 403, -1, 411, -1, 412, -1, 413, -1, 414, -1, - 415, -1, 416, -1, 417, -1, 531, -1, 532, -1, - 534, -1, 452, -1, 463, -1, 464, -1, 465, -1, - 466, -1, 535, -1, 536, -1, 537, -1, 474, -1, - 475, -1, 484, -1, 453, -1, 546, -1, 547, -1, - 455, -1, 476, -1, 550, -1, 551, -1, 548, -1, - 549, -1, 552, -1, 553, -1, 555, -1, 554, -1, - 557, -1, 556, -1, 558, -1, 365, -1, 366, -1, - 367, -1, 368, -1, 369, -1, 370, -1, 371, -1, - 372, -1, 373, -1, 374, -1, 486, -1, 502, -1, - 524, -1, 562, -1, 454, -1, 538, -1, 539, -1, - 651, -1, 540, -1, 543, -1, 541, -1, 542, -1, - 544, -1, 563, -1, 564, -1, 565, -1, 566, -1, - 567, -1, 509, -1, 510, -1, 511, -1, 512, -1, - 513, -1, 514, -1, 515, -1, 516, -1, 652, -1, - 418, -1, 545, -1, 653, -1, 654, -1, 362, -1, - 363, -1, 517, -1, 444, -1, 439, -1, 440, -1, - 568, -1, 570, -1, 569, -1, 571, -1, 572, -1, - 573, -1, 399, -1, 507, -1, 404, -1, 406, -1, - 559, -1, 561, -1, 560, -1, 405, -1, 677, -1, - 425, -1, 491, -1, 533, -1, 424, -1, 456, -1, - 407, -1, 408, -1, 409, -1, 410, -1, 574, -1, - 575, -1, 449, -1, 520, -1, 393, -1, 394, -1, - 395, -1, 383, -1, 576, -1, 577, -1, 46, -1, - 337, 338, -1, -1, 578, -1, 579, -1, 580, -1, - 585, -1, 581, -1, 582, -1, 583, -1, 584, -1, - 52, -1, 340, 341, -1, -1, 586, -1, 587, -1, - 588, -1, 589, -1, 590, -1, 591, -1, 592, -1, - 231, -1, 343, 344, -1, -1, 603, -1, 604, -1, - 607, -1, 609, -1, 605, -1, 606, -1, 608, -1, - 283, -1, 346, 347, -1, -1, 593, -1, 594, -1, - 595, -1, 596, -1, 600, -1, 601, -1, 602, -1, - 597, -1, 598, -1, 599, -1, 312, 10, -1, 313, - 10, -1, 314, 10, -1, 315, 10, -1, 316, 10, - -1, 325, 10, -1, 311, -1, 355, 356, -1, -1, - 593, -1, 594, -1, 348, -1, 595, -1, 596, -1, - 597, -1, 349, -1, 350, -1, 351, -1, 352, -1, - 353, -1, 600, -1, 14, 10, -1, 13, 10, -1, - 84, 10, -1, 87, 10, -1, 107, 10, -1, 250, - 10, -1, 251, 10, -1, 15, 10, -1, 209, 10, - -1, 210, 10, -1, 211, 10, -1, 212, 10, -1, - 213, 10, -1, 214, 10, -1, 215, 10, -1, 216, - 10, -1, 217, 10, -1, 218, 10, -1, 17, 10, - -1, 75, 10, -1, 16, 10, -1, 88, 10, -1, - 89, 10, -1, 39, 10, -1, 68, 10, -1, 83, - 10, -1, 326, 10, -1, 19, 10, -1, 20, 10, - -1, 22, 10, -1, 23, 10, -1, 18, 10, -1, - 21, 10, -1, 24, 10, -1, 25, 10, -1, 26, - 10, -1, 106, 10, -1, 105, 10, -1, 138, 10, - -1, 27, 10, -1, 28, 10, -1, 136, 10, -1, - 281, 10, -1, 137, 10, -1, 139, 10, -1, 140, - 10, -1, 141, 10, -1, 145, 10, -1, 295, 10, - -1, 289, 10, -1, 304, 10, -1, 305, 10, -1, - 310, 10, -1, 306, 10, -1, 148, 10, -1, 149, - 10, -1, 150, 10, -1, 151, 10, -1, 152, 10, - -1, 153, 10, -1, 154, 10, -1, 249, 10, -1, - 85, 10, -1, 74, 10, -1, 112, 10, -1, 133, - 10, -1, 134, 10, -1, 302, 10, -1, 299, 10, - -1, 135, 10, -1, 29, 10, -1, 30, 10, -1, - 31, 10, -1, 32, 10, -1, 33, 10, -1, 76, - 10, -1, 90, 10, -1, 91, 10, -1, 121, 10, - -1, 62, 10, -1, 72, 10, -1, 63, 10, -1, - 247, 10, -1, 252, 10, -1, 113, 10, -1, 56, - 10, -1, 57, 10, -1, 244, 10, -1, 245, 10, - -1, 58, 10, -1, 59, 10, -1, 246, 10, -1, - 321, 10, -1, 125, 10, -1, 129, 10, -1, 130, - 10, -1, 193, 10, -1, 224, 10, -1, 194, 10, - -1, 303, 10, -1, 126, 10, -1, 69, 10, -1, - 34, 10, -1, 35, 10, -1, 36, 10, -1, 109, - 10, -1, 159, 10, -1, 160, 10, -1, 161, 10, - -1, 162, 10, -1, 37, 10, -1, 38, 10, -1, - 40, 10, -1, 41, 10, -1, 43, 10, -1, 44, - 10, -1, 42, 10, -1, 163, 10, -1, 164, 10, - -1, 165, 10, -1, 49, 10, -1, 50, 10, -1, - 51, 10, -1, 60, 10, -1, 79, 10, -1, 131, - 10, -1, 93, 10, -1, 192, 10, -1, 86, 10, - -1, 219, 10, -1, 94, 10, -1, 95, 10, -1, - 127, 10, -1, 128, 10, -1, 300, 10, -1, 111, - 10, -1, 55, 10, -1, 77, 10, -1, 80, 10, + 338, 0, -1, -1, 338, 339, -1, 341, 342, -1, + 344, 345, -1, 347, 348, -1, 657, 658, -1, 624, + 625, -1, 635, 636, -1, 350, 351, -1, 669, 670, + -1, 682, 683, -1, 694, 695, -1, 353, 354, -1, + 362, 363, -1, 661, 662, -1, 340, -1, 11, -1, + 12, -1, 342, 343, -1, -1, 365, -1, 366, -1, + 372, -1, 385, -1, 392, -1, 393, -1, 396, -1, + 397, -1, 394, -1, 395, -1, 398, -1, 399, -1, + 400, -1, 404, -1, 405, -1, 383, -1, 435, -1, + 436, -1, 437, -1, 438, -1, 439, -1, 467, -1, + 468, -1, 469, -1, 475, -1, 476, -1, 388, -1, + 477, -1, 478, -1, 481, -1, 479, -1, 480, -1, + 485, -1, 486, -1, 487, -1, 501, -1, 450, -1, + 451, -1, 454, -1, 455, -1, 453, -1, 456, -1, + 488, -1, 505, -1, 444, -1, 446, -1, 506, -1, + 513, -1, 514, -1, 515, -1, 389, -1, 466, -1, + 534, -1, 535, -1, 445, -1, 528, -1, 428, -1, + 384, -1, 440, -1, 502, -1, 510, -1, 489, -1, + 503, -1, 537, -1, 538, -1, 390, -1, 367, -1, + 427, -1, 493, -1, 368, -1, 386, -1, 387, -1, + 441, -1, 442, -1, 536, -1, 491, -1, 495, -1, + 496, -1, 369, -1, 539, -1, 470, -1, 500, -1, + 429, -1, 449, -1, 507, -1, 508, -1, 509, -1, + 512, -1, 527, -1, 443, -1, 530, -1, 531, -1, + 532, -1, 458, -1, 465, -1, 497, -1, 498, -1, + 459, -1, 490, -1, 517, -1, 430, -1, 431, -1, + 406, -1, 408, -1, 434, -1, 409, -1, 410, -1, + 411, -1, 419, -1, 420, -1, 421, -1, 422, -1, + 423, -1, 424, -1, 425, -1, 540, -1, 541, -1, + 543, -1, 460, -1, 471, -1, 472, -1, 473, -1, + 474, -1, 544, -1, 545, -1, 546, -1, 482, -1, + 483, -1, 492, -1, 461, -1, 559, -1, 560, -1, + 463, -1, 484, -1, 563, -1, 564, -1, 561, -1, + 562, -1, 565, -1, 566, -1, 568, -1, 567, -1, + 570, -1, 569, -1, 571, -1, 373, -1, 374, -1, + 375, -1, 376, -1, 377, -1, 378, -1, 379, -1, + 380, -1, 381, -1, 382, -1, 494, -1, 511, -1, + 533, -1, 575, -1, 462, -1, 547, -1, 548, -1, + 665, -1, 549, -1, 552, -1, 550, -1, 551, -1, + 553, -1, 504, -1, 557, -1, 554, -1, 555, -1, + 556, -1, 576, -1, 577, -1, 578, -1, 579, -1, + 580, -1, 518, -1, 519, -1, 520, -1, 521, -1, + 522, -1, 523, -1, 524, -1, 525, -1, 666, -1, + 426, -1, 558, -1, 667, -1, 668, -1, 370, -1, + 371, -1, 526, -1, 452, -1, 447, -1, 448, -1, + 581, -1, 583, -1, 582, -1, 584, -1, 585, -1, + 586, -1, 407, -1, 516, -1, 412, -1, 414, -1, + 572, -1, 574, -1, 573, -1, 413, -1, 691, -1, + 433, -1, 499, -1, 542, -1, 432, -1, 464, -1, + 415, -1, 416, -1, 417, -1, 692, -1, 693, -1, + 418, -1, 587, -1, 588, -1, 457, -1, 529, -1, + 401, -1, 402, -1, 403, -1, 391, -1, 589, -1, + 590, -1, 591, -1, 46, -1, 345, 346, -1, -1, + 592, -1, 593, -1, 594, -1, 599, -1, 595, -1, + 596, -1, 597, -1, 598, -1, 52, -1, 348, 349, + -1, -1, 600, -1, 601, -1, 602, -1, 603, -1, + 604, -1, 605, -1, 606, -1, 231, -1, 351, 352, + -1, -1, 617, -1, 618, -1, 621, -1, 623, -1, + 619, -1, 620, -1, 622, -1, 283, -1, 354, 355, + -1, -1, 607, -1, 608, -1, 609, -1, 610, -1, + 614, -1, 615, -1, 616, -1, 611, -1, 612, -1, + 613, -1, 314, 10, -1, 315, 10, -1, 316, 10, + -1, 317, 10, -1, 318, 10, -1, 327, 10, -1, + 313, -1, 363, 364, -1, -1, 607, -1, 608, -1, + 356, -1, 609, -1, 610, -1, 611, -1, 357, -1, + 358, -1, 359, -1, 360, -1, 361, -1, 614, -1, + 14, 10, -1, 13, 10, -1, 84, 10, -1, 87, + 10, -1, 107, 10, -1, 250, 10, -1, 251, 10, + -1, 15, 10, -1, 209, 10, -1, 210, 10, -1, + 211, 10, -1, 212, 10, -1, 213, 10, -1, 214, + 10, -1, 215, 10, -1, 216, 10, -1, 217, 10, + -1, 218, 10, -1, 17, 10, -1, 75, 10, -1, + 16, 10, -1, 88, 10, -1, 89, 10, -1, 39, + 10, -1, 68, 10, -1, 83, 10, -1, 328, 10, + -1, 19, 10, -1, 20, 10, -1, 22, 10, -1, + 23, 10, -1, 18, 10, -1, 21, 10, -1, 24, + 10, -1, 25, 10, -1, 26, 10, -1, 106, 10, + -1, 105, 10, -1, 138, 10, -1, 27, 10, -1, + 28, 10, -1, 136, 10, -1, 281, 10, -1, 137, + 10, -1, 139, 10, -1, 140, 10, -1, 141, 10, + -1, 145, 10, -1, 295, 10, -1, 289, 10, -1, + 306, 10, -1, 307, 10, -1, 312, 10, -1, 308, + 10, -1, 148, 10, -1, 149, 10, -1, 150, 10, + -1, 151, 10, -1, 152, 10, -1, 153, 10, -1, + 154, 10, -1, 249, 10, -1, 85, 10, -1, 74, + 10, -1, 112, 10, -1, 133, 10, -1, 134, 10, + -1, 304, 10, -1, 301, 10, -1, 135, 10, -1, + 29, 10, -1, 30, 10, -1, 31, 10, -1, 32, + 10, -1, 33, 10, -1, 76, 10, -1, 90, 10, + -1, 91, 10, -1, 121, 10, -1, 62, 10, -1, + 72, 10, -1, 63, 10, -1, 247, 10, -1, 252, + 10, -1, 113, 10, -1, 56, 10, -1, 57, 10, + -1, 244, 10, -1, 245, 10, -1, 58, 10, -1, + 59, 10, -1, 246, 10, -1, 323, 10, -1, 125, + 10, -1, 129, 10, -1, 130, 10, -1, 193, 10, + -1, 224, 10, -1, 194, 10, -1, 305, 10, -1, + 126, 10, -1, 69, 10, -1, 34, 10, -1, 35, + 10, -1, 36, 10, -1, 109, 10, -1, 159, 10, + -1, 160, 10, -1, 161, 10, -1, 162, 10, -1, + 37, 10, -1, 38, 10, -1, 40, 10, -1, 41, + 10, -1, 43, 10, -1, 44, 10, -1, 42, 10, + -1, 163, 10, -1, 164, 10, -1, 165, 10, -1, + 49, 10, -1, 50, 10, -1, 51, 10, -1, 60, + 10, -1, 79, 10, -1, 131, 10, -1, 93, 10, + -1, 192, 10, -1, 86, 10, -1, 219, 10, -1, + 94, 10, -1, 95, 10, -1, 127, 10, -1, 128, + 10, -1, 302, 10, -1, 111, 10, -1, 55, 10, + -1, 77, 10, -1, 80, 10, 10, -1, 331, 10, 10, -1, 61, 10, -1, 64, 10, -1, 116, 10, -1, 117, 10, -1, 118, 10, -1, 78, 10, -1, 220, 10, -1, 119, 10, -1, 65, 10, -1, 66, @@ -1283,139 +1307,144 @@ static const yytype_int16 yyrhs[] = -1, 234, 10, -1, 235, 10, -1, 236, 10, -1, 237, 10, -1, 238, 10, -1, 239, 10, -1, 240, 10, -1, 241, 10, -1, 242, 10, -1, 120, 10, - -1, 73, 10, -1, 322, 10, -1, 123, 10, -1, + -1, 73, 10, -1, 324, 10, -1, 123, 10, -1, 124, 10, -1, 122, 10, -1, 221, 10, -1, 70, 10, -1, 71, 10, -1, 92, 10, -1, 81, 10, 10, -1, 82, 10, -1, 108, 10, -1, 156, 10, - -1, 157, 10, -1, 301, 10, -1, 158, 10, -1, + -1, 157, 10, -1, 303, 10, -1, 158, 10, -1, 166, 10, -1, 167, 10, -1, 168, 10, -1, 225, 10, -1, 226, 10, 10, -1, 227, 10, 10, -1, 229, 10, 10, 10, -1, 230, 10, 10, 10, -1, - 228, 10, 10, 10, -1, 232, 10, 10, -1, 189, - 10, 10, -1, 196, 10, -1, 199, 10, -1, 198, - 10, -1, 201, 10, -1, 197, 10, -1, 200, 10, - -1, 203, 10, 10, -1, 204, 10, 10, -1, 205, - 10, -1, 206, 10, -1, 207, 10, -1, 208, 10, - -1, 202, 10, -1, 290, 10, -1, 293, 10, -1, - 292, 10, -1, 222, 10, -1, 223, 10, -1, 264, - 10, -1, 265, 10, -1, 266, 10, -1, 267, 10, - -1, 268, 10, -1, 270, 10, -1, 269, 10, -1, - 271, 10, -1, 272, 10, -1, 273, 10, -1, 319, - 10, 10, -1, 320, 10, -1, 327, 10, -1, 328, - 10, -1, 45, 10, -1, 47, 10, -1, 48, 10, - -1, 155, 10, -1, 298, 10, -1, 143, 10, -1, - 146, 10, -1, 110, 10, -1, 45, 10, -1, 53, - 10, -1, 54, 10, -1, 142, 10, -1, 297, 10, - -1, 144, 10, -1, 147, 10, -1, 45, 10, -1, - 284, 10, -1, 285, 10, -1, 286, 10, -1, 294, - 10, -1, 323, 10, -1, 324, 10, -1, 287, 10, - -1, 282, 10, -1, 288, 10, -1, 45, 10, -1, - 81, 10, 10, -1, 190, 10, 10, -1, 191, 10, - 10, -1, 82, 10, -1, 108, 10, -1, 233, 10, - -1, 96, -1, 611, 612, -1, -1, 613, -1, 615, - -1, 614, -1, 617, -1, 618, -1, 619, -1, 620, - -1, 616, -1, 97, 10, -1, 99, 10, -1, 98, - 10, -1, 104, 10, -1, 100, 10, -1, 101, 10, - -1, 102, 10, -1, 103, 10, -1, 169, -1, 622, - 623, -1, -1, 624, -1, 626, -1, 625, -1, 627, - -1, 628, -1, 629, -1, 630, -1, 631, -1, 632, - -1, 633, -1, 634, -1, 635, -1, 636, -1, 637, - -1, 638, -1, 639, -1, 640, -1, 641, -1, 642, - -1, 170, 10, -1, 180, 10, -1, 171, 10, -1, - 172, 10, -1, 173, 10, -1, 174, 10, -1, 175, - 10, -1, 176, 10, -1, 177, 10, -1, 178, 10, - -1, 179, 10, -1, 181, 10, -1, 182, 10, -1, - 183, 10, -1, 184, 10, -1, 185, 10, -1, 186, - 10, -1, 187, 10, -1, 188, 10, -1, 114, -1, - 644, 645, -1, -1, 646, -1, 115, 10, -1, 317, - -1, 648, 649, -1, -1, 650, -1, 318, 10, -1, - 195, 10, -1, 243, 10, -1, 190, 10, 10, -1, - 191, 10, 10, -1, 253, -1, 656, 657, -1, -1, - 658, -1, 659, -1, 660, -1, 663, -1, 661, -1, - 662, -1, 664, -1, 665, -1, 666, -1, 667, -1, - 254, 10, -1, 255, 10, -1, 256, 10, -1, 258, - 10, -1, 259, 10, -1, 257, 10, -1, 260, 10, - -1, 261, 10, -1, 262, 10, -1, 263, 10, -1, - 274, -1, 669, 670, -1, -1, 671, -1, 672, -1, - 673, -1, 674, -1, 675, -1, 676, -1, 275, 10, - -1, 276, 10, -1, 277, 10, -1, 278, 10, -1, - 279, 10, -1, 280, 10, -1, 296, 10, 10, -1, - 307, -1, 679, 680, -1, -1, 681, -1, 682, -1, - 308, 10, -1, 309, 10, -1 + 228, 10, 10, 10, -1, 232, 10, 10, -1, 333, + 10, 10, -1, 334, 10, 10, 10, -1, 335, 10, + 10, 10, -1, 332, 10, 10, -1, 189, 10, 10, + -1, 196, 10, -1, 199, 10, -1, 198, 10, -1, + 201, 10, -1, 197, 10, -1, 200, 10, -1, 203, + 10, 10, -1, 204, 10, 10, -1, 205, 10, -1, + 206, 10, -1, 207, 10, -1, 208, 10, -1, 202, + 10, -1, 290, 10, -1, 293, 10, -1, 292, 10, + -1, 222, 10, -1, 223, 10, -1, 264, 10, -1, + 265, 10, -1, 266, 10, -1, 267, 10, -1, 268, + 10, -1, 270, 10, -1, 269, 10, -1, 271, 10, + -1, 272, 10, -1, 273, 10, -1, 321, 10, 10, + -1, 322, 10, -1, 329, 10, -1, 330, 10, -1, + 336, 10, -1, 45, 10, -1, 47, 10, -1, 48, + 10, -1, 155, 10, -1, 300, 10, -1, 143, 10, + -1, 146, 10, -1, 110, 10, -1, 45, 10, -1, + 53, 10, -1, 54, 10, -1, 142, 10, -1, 299, + 10, -1, 144, 10, -1, 147, 10, -1, 45, 10, + -1, 284, 10, -1, 285, 10, -1, 286, 10, -1, + 294, 10, -1, 325, 10, -1, 326, 10, -1, 287, + 10, -1, 282, 10, -1, 288, 10, -1, 45, 10, + -1, 81, 10, 10, -1, 190, 10, 10, -1, 191, + 10, 10, -1, 82, 10, -1, 108, 10, -1, 233, + 10, -1, 96, -1, 625, 626, -1, -1, 627, -1, + 629, -1, 628, -1, 631, -1, 632, -1, 633, -1, + 634, -1, 630, -1, 97, 10, -1, 99, 10, -1, + 98, 10, -1, 104, 10, -1, 100, 10, -1, 101, + 10, -1, 102, 10, -1, 103, 10, -1, 169, -1, + 636, 637, -1, -1, 638, -1, 640, -1, 639, -1, + 641, -1, 642, -1, 643, -1, 644, -1, 645, -1, + 646, -1, 647, -1, 648, -1, 649, -1, 650, -1, + 651, -1, 652, -1, 653, -1, 654, -1, 655, -1, + 656, -1, 170, 10, -1, 180, 10, -1, 171, 10, + -1, 172, 10, -1, 173, 10, -1, 174, 10, -1, + 175, 10, -1, 176, 10, -1, 177, 10, -1, 178, + 10, -1, 179, 10, -1, 181, 10, -1, 182, 10, + -1, 183, 10, -1, 184, 10, -1, 185, 10, -1, + 186, 10, -1, 187, 10, -1, 188, 10, -1, 114, + -1, 658, 659, -1, -1, 660, -1, 115, 10, -1, + 319, -1, 662, 663, -1, -1, 664, -1, 320, 10, + -1, 195, 10, -1, 243, 10, -1, 190, 10, 10, + -1, 191, 10, 10, -1, 253, -1, 670, 671, -1, + -1, 672, -1, 673, -1, 674, -1, 677, -1, 675, + -1, 676, -1, 678, -1, 679, -1, 680, -1, 681, + -1, 254, 10, -1, 255, 10, -1, 256, 10, -1, + 258, 10, -1, 259, 10, -1, 257, 10, -1, 260, + 10, -1, 261, 10, -1, 262, 10, -1, 263, 10, + -1, 274, -1, 683, 684, -1, -1, 685, -1, 686, + -1, 687, -1, 688, -1, 689, -1, 690, -1, 275, + 10, -1, 276, 10, -1, 277, 10, -1, 278, 10, + -1, 279, 10, -1, 280, 10, -1, 296, 10, 10, + -1, 297, 10, -1, 298, 10, -1, 309, -1, 695, + 696, -1, -1, 697, -1, 698, -1, 310, 10, -1, + 311, 10, -1 }; /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ static const yytype_uint16 yyrline[] = { - 0, 196, 196, 196, 197, 197, 198, 198, 199, 199, - 199, 200, 200, 201, 201, 202, 202, 203, 205, 212, - 218, 219, 220, 220, 220, 221, 221, 222, 222, 222, - 223, 223, 224, 224, 224, 225, 225, 226, 226, 226, - 227, 227, 227, 228, 228, 229, 229, 230, 230, 231, - 231, 232, 232, 233, 233, 234, 234, 235, 235, 236, - 236, 236, 237, 237, 238, 238, 238, 239, 239, 239, - 240, 240, 241, 241, 242, 242, 243, 243, 244, 244, - 244, 245, 245, 246, 246, 247, 247, 247, 248, 248, - 249, 249, 250, 250, 251, 251, 251, 252, 252, 253, - 253, 254, 254, 255, 255, 256, 256, 257, 257, 258, - 258, 259, 259, 260, 260, 260, 261, 261, 261, 262, - 262, 262, 263, 263, 263, 263, 264, 265, 265, 265, - 266, 266, 266, 267, 267, 268, 268, 269, 269, 269, - 270, 270, 270, 271, 271, 272, 272, 272, 273, 273, - 273, 274, 274, 274, 275, 275, 276, 276, 277, 277, - 278, 279, 279, 280, 280, 281, 281, 282, 282, 283, - 283, 284, 284, 285, 285, 286, 286, 287, 287, 288, - 288, 289, 289, 289, 290, 290, 291, 291, 292, 292, - 293, 294, 294, 295, 295, 296, 297, 297, 298, 298, - 299, 299, 299, 300, 300, 301, 301, 301, 302, 302, - 302, 303, 303, 304, 305, 305, 306, 306, 307, 307, - 308, 308, 309, 309, 309, 310, 310, 310, 311, 311, - 311, 312, 312, 313, 313, 314, 314, 315, 315, 316, - 316, 317, 317, 318, 318, 319, 319, 319, 322, 336, - 337, 338, 338, 338, 338, 338, 339, 339, 339, 341, - 355, 356, 357, 357, 357, 357, 358, 358, 358, 360, - 376, 377, 378, 378, 378, 378, 379, 379, 379, 381, - 402, 403, 404, 404, 404, 404, 405, 405, 405, 406, - 406, 406, 409, 428, 445, 453, 463, 470, 480, 499, - 500, 501, 501, 501, 501, 501, 502, 502, 502, 503, - 503, 503, 503, 505, 514, 523, 534, 543, 552, 561, - 572, 581, 593, 607, 622, 633, 650, 667, 684, 701, - 716, 731, 744, 759, 768, 777, 786, 795, 804, 813, - 820, 829, 838, 847, 856, 865, 874, 883, 892, 905, - 916, 927, 938, 947, 960, 969, 978, 987, 994, 1001, - 1010, 1017, 1026, 1034, 1041, 1048, 1056, 1065, 1073, 1089, - 1097, 1105, 1113, 1121, 1129, 1138, 1147, 1161, 1170, 1179, - 1188, 1197, 1206, 1215, 1222, 1229, 1255, 1263, 1270, 1277, - 1284, 1291, 1299, 1307, 1315, 1322, 1333, 1344, 1351, 1360, - 1369, 1378, 1387, 1394, 1401, 1408, 1424, 1432, 1440, 1450, - 1460, 1470, 1484, 1492, 1505, 1516, 1524, 1537, 1546, 1555, - 1564, 1573, 1583, 1593, 1601, 1614, 1623, 1631, 1640, 1648, - 1661, 1670, 1679, 1689, 1696, 1706, 1716, 1726, 1736, 1746, - 1756, 1766, 1776, 1783, 1790, 1797, 1806, 1815, 1824, 1833, - 1840, 1850, 1870, 1877, 1895, 1908, 1921, 1934, 1943, 1952, - 1961, 1970, 1980, 1990, 2001, 2010, 2019, 2028, 2037, 2046, - 2055, 2064, 2073, 2086, 2099, 2108, 2115, 2124, 2133, 2142, - 2151, 2160, 2168, 2181, 2189, 2244, 2251, 2266, 2276, 2286, - 2293, 2300, 2307, 2316, 2324, 2338, 2359, 2380, 2392, 2404, - 2416, 2425, 2446, 2455, 2464, 2472, 2480, 2493, 2506, 2521, - 2536, 2545, 2554, 2564, 2574, 2583, 2589, 2598, 2607, 2617, - 2627, 2637, 2646, 2656, 2665, 2678, 2691, 2703, 2717, 2729, - 2743, 2752, 2763, 2772, 2780, 2790, 2797, 2804, 2813, 2822, - 2832, 2842, 2852, 2862, 2869, 2876, 2885, 2894, 2904, 2914, - 2924, 2931, 2938, 2945, 2953, 2963, 2973, 2983, 2993, 3003, - 3013, 3069, 3079, 3087, 3095, 3110, 3119, 3125, 3126, 3127, - 3127, 3127, 3128, 3128, 3128, 3129, 3129, 3131, 3141, 3150, - 3157, 3164, 3171, 3178, 3185, 3192, 3198, 3199, 3200, 3200, - 3200, 3201, 3201, 3201, 3202, 3203, 3203, 3204, 3204, 3205, - 3205, 3206, 3207, 3208, 3209, 3210, 3211, 3213, 3222, 3232, - 3239, 3246, 3255, 3262, 3269, 3276, 3283, 3292, 3301, 3308, - 3315, 3325, 3335, 3345, 3355, 3365, 3375, 3381, 3382, 3383, - 3385, 3391, 3397, 3398, 3399, 3401, 3407, 3417, 3424, 3433, - 3441, 3447, 3448, 3450, 3450, 3450, 3451, 3451, 3452, 3453, - 3454, 3455, 3456, 3458, 3468, 3477, 3484, 3493, 3500, 3509, - 3517, 3530, 3538, 3551, 3557, 3558, 3559, 3559, 3560, 3560, - 3560, 3561, 3563, 3575, 3587, 3599, 3614, 3627, 3640, 3651, - 3657, 3658, 3659, 3659, 3661, 3676 + 0, 203, 203, 203, 204, 204, 205, 205, 206, 206, + 206, 207, 207, 208, 208, 209, 209, 210, 212, 219, + 225, 226, 227, 227, 227, 228, 228, 229, 229, 229, + 230, 230, 231, 231, 231, 232, 232, 233, 233, 233, + 234, 234, 234, 235, 235, 236, 236, 237, 237, 238, + 238, 239, 239, 240, 240, 241, 241, 242, 242, 243, + 243, 243, 244, 244, 245, 245, 245, 246, 246, 246, + 247, 247, 248, 248, 249, 249, 250, 250, 251, 251, + 251, 252, 252, 253, 253, 254, 254, 254, 255, 255, + 256, 256, 257, 257, 258, 258, 258, 259, 259, 260, + 260, 261, 261, 262, 262, 263, 263, 264, 264, 265, + 265, 266, 266, 267, 267, 267, 268, 268, 268, 269, + 269, 269, 270, 270, 270, 270, 271, 272, 272, 272, + 273, 273, 273, 274, 274, 275, 275, 276, 276, 276, + 277, 277, 277, 278, 278, 279, 279, 279, 280, 280, + 280, 281, 281, 281, 282, 282, 283, 283, 284, 284, + 285, 286, 286, 287, 287, 288, 288, 289, 289, 290, + 290, 291, 291, 292, 292, 293, 293, 294, 294, 295, + 295, 296, 296, 296, 297, 297, 298, 298, 299, 299, + 300, 300, 300, 301, 301, 302, 303, 303, 304, 304, + 305, 306, 306, 307, 307, 308, 308, 308, 309, 309, + 310, 310, 310, 311, 311, 311, 312, 312, 313, 314, + 314, 315, 315, 316, 316, 317, 317, 318, 318, 318, + 319, 319, 319, 320, 320, 320, 321, 321, 322, 322, + 323, 323, 324, 324, 325, 325, 326, 326, 327, 327, + 328, 328, 329, 329, 329, 330, 332, 346, 347, 348, + 348, 348, 348, 348, 349, 349, 349, 351, 365, 366, + 367, 367, 367, 367, 368, 368, 368, 370, 386, 387, + 388, 388, 388, 388, 389, 389, 389, 391, 412, 413, + 414, 414, 414, 414, 415, 415, 415, 416, 416, 416, + 419, 438, 455, 463, 473, 480, 490, 509, 510, 511, + 511, 511, 511, 511, 512, 512, 512, 513, 513, 513, + 513, 515, 524, 533, 544, 553, 562, 571, 582, 591, + 603, 617, 632, 643, 660, 677, 694, 711, 726, 741, + 754, 769, 778, 787, 796, 805, 814, 823, 830, 839, + 848, 857, 866, 875, 884, 893, 902, 915, 926, 937, + 948, 957, 970, 979, 988, 997, 1004, 1011, 1020, 1027, + 1036, 1044, 1051, 1058, 1066, 1075, 1083, 1099, 1107, 1115, + 1123, 1131, 1139, 1148, 1157, 1171, 1180, 1189, 1198, 1207, + 1216, 1225, 1232, 1239, 1265, 1273, 1280, 1287, 1294, 1301, + 1309, 1317, 1325, 1332, 1343, 1354, 1361, 1370, 1379, 1388, + 1397, 1404, 1411, 1418, 1434, 1442, 1450, 1460, 1470, 1480, + 1494, 1502, 1515, 1526, 1534, 1547, 1556, 1565, 1574, 1583, + 1593, 1603, 1611, 1624, 1633, 1641, 1650, 1658, 1671, 1680, + 1689, 1699, 1706, 1716, 1726, 1736, 1746, 1756, 1766, 1776, + 1786, 1793, 1800, 1807, 1816, 1825, 1834, 1843, 1850, 1860, + 1868, 1877, 1884, 1902, 1915, 1928, 1941, 1950, 1959, 1968, + 1977, 1987, 1997, 2008, 2017, 2026, 2035, 2044, 2053, 2062, + 2071, 2080, 2093, 2106, 2115, 2122, 2131, 2140, 2149, 2158, + 2167, 2175, 2188, 2196, 2251, 2258, 2273, 2283, 2293, 2300, + 2307, 2314, 2323, 2331, 2345, 2366, 2387, 2399, 2411, 2423, + 2432, 2453, 2465, 2477, 2486, 2507, 2516, 2525, 2533, 2541, + 2554, 2567, 2582, 2597, 2606, 2615, 2625, 2635, 2644, 2650, + 2659, 2668, 2678, 2688, 2698, 2707, 2717, 2726, 2739, 2752, + 2764, 2778, 2790, 2804, 2813, 2824, 2833, 2841, 2848, 2858, + 2865, 2872, 2881, 2890, 2900, 2910, 2920, 2930, 2937, 2944, + 2953, 2962, 2972, 2982, 2992, 2999, 3006, 3013, 3021, 3031, + 3041, 3051, 3061, 3071, 3081, 3137, 3147, 3155, 3163, 3178, + 3187, 3193, 3194, 3195, 3195, 3195, 3196, 3196, 3196, 3197, + 3197, 3199, 3209, 3218, 3225, 3232, 3239, 3246, 3253, 3260, + 3266, 3267, 3268, 3268, 3268, 3269, 3269, 3269, 3270, 3271, + 3271, 3272, 3272, 3273, 3273, 3274, 3275, 3276, 3277, 3278, + 3279, 3281, 3290, 3300, 3307, 3314, 3323, 3330, 3337, 3344, + 3351, 3360, 3369, 3376, 3383, 3393, 3403, 3413, 3423, 3433, + 3443, 3449, 3450, 3451, 3453, 3459, 3465, 3466, 3467, 3469, + 3475, 3485, 3492, 3501, 3509, 3515, 3516, 3518, 3518, 3518, + 3519, 3519, 3520, 3521, 3522, 3523, 3524, 3526, 3536, 3545, + 3552, 3561, 3568, 3577, 3585, 3598, 3606, 3619, 3625, 3626, + 3627, 3627, 3628, 3628, 3628, 3629, 3631, 3643, 3655, 3667, + 3682, 3695, 3708, 3719, 3728, 3743, 3749, 3750, 3751, 3751, + 3753, 3768 }; #endif @@ -1537,23 +1566,26 @@ static const char *const yytname[] = "VAR_URL", "VAR_FOR_DOWNSTREAM", "VAR_FALLBACK_ENABLED", "VAR_TLS_ADDITIONAL_PORT", "VAR_LOW_RTT", "VAR_LOW_RTT_PERMIL", "VAR_FAST_SERVER_PERMIL", "VAR_FAST_SERVER_NUM", "VAR_ALLOW_NOTIFY", - "VAR_TLS_WIN_CERT", "VAR_TCP_CONNECTION_LIMIT", "VAR_FORWARD_NO_CACHE", - "VAR_STUB_NO_CACHE", "VAR_LOG_SERVFAIL", "VAR_DENY_ANY", - "VAR_UNKNOWN_SERVER_TIME_LIMIT", "VAR_LOG_TAG_QUERYREPLY", - "VAR_STREAM_WAIT_SIZE", "VAR_TLS_CIPHERS", "VAR_TLS_CIPHERSUITES", - "VAR_TLS_USE_SNI", "VAR_IPSET", "VAR_IPSET_NAME_V4", "VAR_IPSET_NAME_V6", - "VAR_TLS_SESSION_TICKET_KEYS", "VAR_RPZ", "VAR_TAGS", - "VAR_RPZ_ACTION_OVERRIDE", "VAR_RPZ_CNAME_OVERRIDE", "VAR_RPZ_LOG", - "VAR_RPZ_LOG_NAME", "VAR_DYNLIB", "VAR_DYNLIB_FILE", - "VAR_EDNS_CLIENT_STRING", "VAR_EDNS_CLIENT_STRING_OPCODE", "VAR_NSID", + "VAR_TLS_WIN_CERT", "VAR_TCP_CONNECTION_LIMIT", "VAR_ANSWER_COOKIE", + "VAR_COOKIE_SECRET", "VAR_FORWARD_NO_CACHE", "VAR_STUB_NO_CACHE", + "VAR_LOG_SERVFAIL", "VAR_DENY_ANY", "VAR_UNKNOWN_SERVER_TIME_LIMIT", + "VAR_LOG_TAG_QUERYREPLY", "VAR_STREAM_WAIT_SIZE", "VAR_TLS_CIPHERS", + "VAR_TLS_CIPHERSUITES", "VAR_TLS_USE_SNI", "VAR_IPSET", + "VAR_IPSET_NAME_V4", "VAR_IPSET_NAME_V6", "VAR_TLS_SESSION_TICKET_KEYS", + "VAR_RPZ", "VAR_TAGS", "VAR_RPZ_ACTION_OVERRIDE", + "VAR_RPZ_CNAME_OVERRIDE", "VAR_RPZ_LOG", "VAR_RPZ_LOG_NAME", + "VAR_DYNLIB", "VAR_DYNLIB_FILE", "VAR_EDNS_CLIENT_STRING", + "VAR_EDNS_CLIENT_STRING_OPCODE", "VAR_NSID", "VAR_ZONEMD_PERMISSIVE_MODE", "VAR_ZONEMD_CHECK", "VAR_ZONEMD_REJECT_ABSENCE", "VAR_RPZ_SIGNAL_NXDOMAIN_RA", "VAR_INTERFACE_AUTOMATIC_PORTS", "VAR_EDE", "VAR_UPSTREAM_COOKIES", - "$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", + "VAR_INTERFACE_ACTION", "VAR_INTERFACE_VIEW", "VAR_INTERFACE_TAG", + "VAR_INTERFACE_TAG_ACTION", "VAR_INTERFACE_TAG_DATA", + "VAR_PROXY_PROTOCOL_PORT", "$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", @@ -1615,7 +1647,7 @@ static const char *const yytname[] = "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_module_conf", + "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", @@ -1637,25 +1669,27 @@ static const char *const yytname[] = "server_dns64_ignore_aaaa", "server_define_tag", "server_local_zone_tag", "server_access_control_tag", "server_access_control_tag_action", "server_access_control_tag_data", "server_local_zone_override", - "server_access_control_view", "server_response_ip_tag", - "server_ip_ratelimit", "server_ratelimit", "server_ip_ratelimit_size", - "server_ratelimit_size", "server_ip_ratelimit_slabs", - "server_ratelimit_slabs", "server_ratelimit_for_domain", - "server_ratelimit_below_domain", "server_ip_ratelimit_factor", - "server_ratelimit_factor", "server_ip_ratelimit_backoff", - "server_ratelimit_backoff", "server_outbound_msg_retry", - "server_low_rtt", "server_fast_server_num", "server_fast_server_permil", - "server_qname_minimisation", "server_qname_minimisation_strict", - "server_pad_responses", "server_pad_responses_block_size", - "server_pad_queries", "server_pad_queries_block_size", - "server_ipsecmod_enabled", "server_ipsecmod_ignore_bogus", - "server_ipsecmod_hook", "server_ipsecmod_max_ttl", - "server_ipsecmod_whitelist", "server_ipsecmod_strict", - "server_edns_client_string", "server_edns_client_string_opcode", - "server_ede", "server_upstream_cookies", "stub_name", "stub_host", - "stub_addr", "stub_first", "stub_no_cache", "stub_ssl_upstream", - "stub_tcp_upstream", "stub_prime", "forward_name", "forward_host", - "forward_addr", "forward_first", "forward_no_cache", + "server_access_control_view", "server_interface_tag", + "server_interface_tag_action", "server_interface_tag_data", + "server_interface_view", "server_response_ip_tag", "server_ip_ratelimit", + "server_ratelimit", "server_ip_ratelimit_size", "server_ratelimit_size", + "server_ip_ratelimit_slabs", "server_ratelimit_slabs", + "server_ratelimit_for_domain", "server_ratelimit_below_domain", + "server_ip_ratelimit_factor", "server_ratelimit_factor", + "server_ip_ratelimit_backoff", "server_ratelimit_backoff", + "server_outbound_msg_retry", "server_low_rtt", "server_fast_server_num", + "server_fast_server_permil", "server_qname_minimisation", + "server_qname_minimisation_strict", "server_pad_responses", + "server_pad_responses_block_size", "server_pad_queries", + "server_pad_queries_block_size", "server_ipsecmod_enabled", + "server_ipsecmod_ignore_bogus", "server_ipsecmod_hook", + "server_ipsecmod_max_ttl", "server_ipsecmod_whitelist", + "server_ipsecmod_strict", "server_edns_client_string", + "server_edns_client_string_opcode", "server_ede", + "server_upstream_cookies", "server_proxy_protocol_port", "stub_name", + "stub_host", "stub_addr", "stub_first", "stub_no_cache", + "stub_ssl_upstream", "stub_tcp_upstream", "stub_prime", "forward_name", + "forward_host", "forward_addr", "forward_first", "forward_no_cache", "forward_ssl_upstream", "forward_tcp_upstream", "auth_name", "auth_zonefile", "auth_master", "auth_url", "auth_allow_notify", "auth_zonemd_check", "auth_zonemd_reject_absence", "auth_for_downstream", @@ -1689,8 +1723,9 @@ static const char *const yytname[] = "cachedbstart", "contents_cachedb", "content_cachedb", "cachedb_backend_name", "cachedb_secret_seed", "redis_server_host", "redis_server_port", "redis_timeout", "redis_expire_records", - "server_tcp_connection_limit", "ipsetstart", "contents_ipset", - "content_ipset", "ipset_name_v4", "ipset_name_v6", 0 + "server_tcp_connection_limit", "server_answer_cookie", + "server_cookie_secret", "ipsetstart", "contents_ipset", "content_ipset", + "ipset_name_v4", "ipset_name_v6", 0 }; #endif @@ -1731,45 +1766,46 @@ static const yytype_uint16 yytoknum[] = 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 + 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591 }; # endif /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const yytype_uint16 yyr1[] = { - 0, 329, 330, 330, 331, 331, 331, 331, 331, 331, - 331, 331, 331, 331, 331, 331, 331, 331, 332, 333, - 334, 334, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 336, 337, - 337, 338, 338, 338, 338, 338, 338, 338, 338, 339, - 340, 340, 341, 341, 341, 341, 341, 341, 341, 342, - 343, 343, 344, 344, 344, 344, 344, 344, 344, 345, - 346, 346, 347, 347, 347, 347, 347, 347, 347, 347, - 347, 347, 348, 349, 350, 351, 352, 353, 354, 355, - 355, 356, 356, 356, 356, 356, 356, 356, 356, 356, - 356, 356, 356, 357, 358, 359, 360, 361, 362, 363, + 0, 337, 338, 338, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, 340, 341, + 342, 342, 343, 343, 343, 343, 343, 343, 343, 343, + 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, + 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, + 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, + 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, + 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, + 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, + 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, + 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, + 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, + 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, + 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, + 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, + 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, + 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, + 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, + 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, + 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, + 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, + 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, + 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, + 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, + 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, + 343, 343, 343, 343, 343, 343, 344, 345, 345, 346, + 346, 346, 346, 346, 346, 346, 346, 347, 348, 348, + 349, 349, 349, 349, 349, 349, 349, 350, 351, 351, + 352, 352, 352, 352, 352, 352, 352, 353, 354, 354, + 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 363, 364, + 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 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, @@ -1794,19 +1830,21 @@ static const yytype_uint16 yyr1[] = 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, 611, 612, - 612, 612, 612, 612, 612, 612, 612, 613, 614, 615, - 616, 617, 618, 619, 620, 621, 622, 622, 623, 623, - 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, - 623, 623, 623, 623, 623, 623, 623, 624, 625, 626, - 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, - 637, 638, 639, 640, 641, 642, 643, 644, 644, 645, - 646, 647, 648, 648, 649, 650, 651, 652, 653, 654, - 655, 656, 656, 657, 657, 657, 657, 657, 657, 657, - 657, 657, 657, 658, 659, 660, 661, 662, 663, 664, - 665, 666, 667, 668, 669, 669, 670, 670, 670, 670, - 670, 670, 671, 672, 673, 674, 675, 676, 677, 678, - 679, 679, 680, 680, 681, 682 + 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, + 624, 625, 625, 626, 626, 626, 626, 626, 626, 626, + 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, + 636, 636, 637, 637, 637, 637, 637, 637, 637, 637, + 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, + 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, + 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 658, 659, 660, 661, 662, 662, 663, 664, + 665, 666, 667, 668, 669, 670, 670, 671, 671, 671, + 671, 671, 671, 671, 671, 671, 671, 672, 673, 674, + 675, 676, 677, 678, 679, 680, 681, 682, 683, 683, + 684, 684, 684, 684, 684, 684, 685, 686, 687, 688, + 689, 690, 691, 692, 693, 694, 695, 695, 696, 696, + 697, 698 }; /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ @@ -1836,14 +1874,15 @@ static const yytype_uint8 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, 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, - 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, 1, 1, 1, 1, - 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, + 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, 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, 1, 1, 1, 1, 1, 1, + 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, @@ -1856,31 +1895,32 @@ static const yytype_uint8 yyr2[] = 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 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, 2, 2, 2, - 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 3, 3, 4, 4, 4, - 3, 3, 2, 2, 2, 2, 2, 2, 3, 3, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 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, - 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, 1, 1, 1, 2, 2, 2, + 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 3, 3, 4, 4, 4, 3, + 3, 4, 4, 3, 3, 2, 2, 2, 2, 2, + 2, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 1, 2, 0, 1, - 2, 1, 2, 0, 1, 2, 2, 2, 3, 3, + 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, 2, + 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 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, 2, 2, 2, 2, 2, 2, 3, 1, - 2, 0, 1, 1, 2, 2 + 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, 1, 1, + 1, 2, 2, 2, 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, 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, 2, 2, 2, 2, + 2, 2, 3, 2, 2, 1, 2, 0, 1, 1, + 2, 2 }; /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state @@ -1888,10 +1928,10 @@ static const yytype_uint8 yyr2[] = means the default is an error. */ static const yytype_uint16 yydefact[] = { - 2, 0, 1, 18, 19, 248, 259, 566, 626, 585, - 269, 640, 663, 279, 679, 298, 631, 3, 17, 21, - 250, 261, 271, 281, 300, 568, 587, 628, 633, 642, - 665, 681, 4, 5, 6, 10, 14, 15, 8, 9, + 2, 0, 1, 18, 19, 256, 267, 580, 640, 599, + 277, 654, 677, 287, 695, 306, 645, 3, 17, 21, + 258, 269, 279, 289, 308, 582, 601, 642, 647, 656, + 679, 697, 4, 5, 6, 10, 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, @@ -1915,272 +1955,280 @@ static const yytype_uint16 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, 20, 22, 23, 88, 91, 100, 208, 209, 24, - 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, - 37, 79, 25, 92, 93, 48, 72, 87, 245, 26, - 27, 30, 31, 28, 29, 32, 33, 34, 242, 243, - 244, 35, 36, 124, 220, 125, 127, 128, 129, 222, - 227, 223, 234, 235, 236, 237, 130, 131, 132, 133, - 134, 135, 136, 204, 89, 78, 104, 122, 123, 232, - 229, 126, 38, 39, 40, 41, 42, 80, 94, 95, - 111, 66, 76, 67, 212, 213, 105, 58, 59, 211, - 62, 60, 61, 63, 240, 115, 119, 140, 151, 181, - 154, 233, 116, 73, 43, 44, 45, 102, 141, 142, - 143, 144, 46, 47, 49, 50, 52, 53, 51, 148, - 149, 155, 54, 55, 56, 64, 83, 120, 97, 150, - 90, 177, 98, 99, 117, 118, 230, 103, 57, 81, - 84, 65, 68, 106, 107, 108, 82, 178, 109, 69, - 70, 71, 221, 121, 195, 196, 197, 198, 199, 200, - 201, 202, 210, 110, 77, 241, 112, 113, 114, 179, - 74, 75, 96, 85, 86, 101, 137, 138, 231, 139, - 145, 146, 147, 182, 183, 185, 187, 188, 186, 189, - 205, 152, 153, 158, 159, 156, 157, 160, 161, 163, - 162, 165, 164, 166, 224, 226, 225, 180, 190, 191, - 192, 193, 194, 214, 216, 215, 217, 218, 219, 238, - 239, 246, 247, 184, 203, 206, 207, 228, 0, 0, - 0, 0, 0, 0, 0, 0, 249, 251, 252, 253, - 255, 256, 257, 258, 254, 0, 0, 0, 0, 0, - 0, 0, 260, 262, 263, 264, 265, 266, 267, 268, - 0, 0, 0, 0, 0, 0, 0, 270, 272, 273, - 276, 277, 274, 278, 275, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 280, 282, 283, 284, 285, - 289, 290, 291, 286, 287, 288, 0, 0, 0, 0, - 0, 0, 303, 307, 308, 309, 310, 311, 299, 301, - 302, 304, 305, 306, 312, 0, 0, 0, 0, 0, - 0, 0, 0, 567, 569, 571, 570, 576, 572, 573, - 574, 575, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, + 22, 23, 88, 91, 100, 213, 214, 24, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 37, 79, + 25, 92, 93, 48, 72, 87, 252, 26, 27, 30, + 31, 28, 29, 32, 33, 34, 249, 250, 251, 35, + 36, 124, 225, 125, 127, 128, 129, 227, 232, 228, + 239, 240, 241, 244, 130, 131, 132, 133, 134, 135, + 136, 209, 89, 78, 104, 122, 123, 237, 234, 126, + 38, 39, 40, 41, 42, 80, 94, 95, 111, 66, + 76, 67, 217, 218, 105, 58, 59, 216, 62, 60, + 61, 63, 247, 115, 119, 140, 151, 181, 154, 238, + 116, 73, 43, 44, 45, 102, 141, 142, 143, 144, + 46, 47, 49, 50, 52, 53, 51, 148, 149, 155, + 54, 55, 56, 64, 83, 120, 97, 150, 90, 177, + 98, 99, 117, 118, 235, 103, 57, 81, 84, 190, + 65, 68, 106, 107, 108, 82, 178, 109, 69, 70, + 71, 226, 121, 200, 201, 202, 203, 204, 205, 206, + 207, 215, 110, 77, 248, 112, 113, 114, 179, 74, + 75, 96, 85, 86, 101, 137, 138, 236, 139, 145, + 146, 147, 182, 183, 185, 187, 188, 186, 189, 192, + 193, 194, 191, 210, 152, 153, 158, 159, 156, 157, + 160, 161, 163, 162, 165, 164, 166, 229, 231, 230, + 180, 195, 196, 197, 198, 199, 219, 221, 220, 222, + 223, 224, 245, 246, 253, 254, 255, 184, 208, 211, + 212, 233, 242, 243, 0, 0, 0, 0, 0, 0, + 0, 0, 257, 259, 260, 261, 263, 264, 265, 266, + 262, 0, 0, 0, 0, 0, 0, 0, 268, 270, + 271, 272, 273, 274, 275, 276, 0, 0, 0, 0, + 0, 0, 0, 278, 280, 281, 284, 285, 282, 286, + 283, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 288, 290, 291, 292, 293, 297, 298, 299, 294, + 295, 296, 0, 0, 0, 0, 0, 0, 311, 315, + 316, 317, 318, 319, 307, 309, 310, 312, 313, 314, + 320, 0, 0, 0, 0, 0, 0, 0, 0, 581, + 583, 585, 584, 590, 586, 587, 588, 589, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 586, 588, 590, 589, 591, 592, 593, 594, 595, - 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, - 606, 0, 627, 629, 0, 632, 634, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 641, 643, 644, - 645, 647, 648, 646, 649, 650, 651, 652, 0, 0, - 0, 0, 0, 0, 664, 666, 667, 668, 669, 670, - 671, 0, 0, 680, 682, 683, 314, 313, 320, 333, - 331, 344, 340, 341, 345, 342, 343, 346, 347, 348, - 352, 353, 383, 384, 385, 386, 387, 415, 416, 417, - 423, 424, 336, 425, 426, 429, 427, 428, 433, 434, - 435, 449, 398, 399, 402, 403, 436, 452, 392, 394, - 453, 460, 461, 462, 337, 414, 481, 482, 393, 475, - 376, 332, 388, 450, 457, 437, 0, 0, 485, 338, - 315, 375, 441, 316, 334, 335, 389, 390, 483, 439, - 443, 444, 350, 349, 317, 486, 418, 448, 377, 397, - 454, 455, 456, 459, 474, 391, 479, 477, 478, 406, - 413, 445, 446, 407, 408, 438, 464, 378, 379, 382, - 354, 356, 351, 357, 358, 359, 360, 367, 368, 369, - 370, 371, 372, 373, 487, 488, 490, 419, 420, 421, - 422, 430, 431, 432, 491, 492, 493, 0, 0, 0, - 440, 409, 411, 636, 502, 506, 504, 503, 507, 505, - 514, 0, 0, 510, 511, 512, 513, 321, 322, 323, - 324, 325, 326, 327, 328, 329, 330, 442, 458, 480, - 518, 519, 410, 494, 0, 0, 0, 0, 0, 0, - 465, 466, 467, 468, 469, 470, 471, 472, 473, 637, - 400, 401, 404, 395, 463, 374, 318, 319, 396, 520, - 521, 522, 523, 524, 526, 525, 527, 528, 529, 355, - 362, 515, 517, 516, 361, 0, 381, 447, 489, 380, - 412, 363, 364, 366, 365, 0, 531, 405, 476, 339, - 532, 533, 534, 535, 536, 541, 539, 540, 537, 538, - 542, 543, 544, 545, 547, 548, 546, 559, 0, 563, - 564, 0, 0, 565, 549, 557, 550, 551, 552, 556, - 558, 553, 554, 555, 292, 293, 294, 295, 296, 297, - 577, 579, 578, 581, 582, 583, 584, 580, 607, 609, - 610, 611, 612, 613, 614, 615, 616, 617, 608, 618, - 619, 620, 621, 622, 623, 624, 625, 630, 635, 653, - 654, 655, 658, 656, 657, 659, 660, 661, 662, 672, - 673, 674, 675, 676, 677, 684, 685, 451, 484, 501, - 638, 639, 508, 509, 495, 496, 0, 0, 0, 500, - 678, 530, 560, 561, 562, 499, 497, 498 + 0, 0, 0, 0, 0, 0, 0, 600, 602, 604, + 603, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619, 620, 0, 641, 643, + 0, 646, 648, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 655, 657, 658, 659, 661, 662, 660, + 663, 664, 665, 666, 0, 0, 0, 0, 0, 0, + 678, 680, 681, 682, 683, 684, 685, 0, 0, 696, + 698, 699, 322, 321, 328, 341, 339, 352, 348, 349, + 353, 350, 351, 354, 355, 356, 360, 361, 391, 392, + 393, 394, 395, 423, 424, 425, 431, 432, 344, 433, + 434, 437, 435, 436, 441, 442, 443, 457, 406, 407, + 410, 411, 444, 461, 400, 402, 462, 469, 470, 471, + 345, 422, 490, 491, 401, 484, 384, 340, 396, 458, + 466, 445, 0, 0, 494, 346, 323, 383, 449, 324, + 342, 343, 397, 398, 492, 447, 451, 452, 358, 357, + 325, 495, 426, 456, 385, 405, 463, 464, 465, 468, + 483, 399, 488, 486, 487, 414, 421, 453, 454, 415, + 416, 446, 473, 386, 387, 390, 362, 364, 359, 365, + 366, 367, 368, 375, 376, 377, 378, 379, 380, 381, + 496, 497, 499, 427, 428, 429, 430, 438, 439, 440, + 500, 501, 502, 0, 0, 0, 448, 417, 419, 650, + 515, 519, 517, 516, 520, 518, 527, 0, 0, 523, + 524, 525, 526, 329, 330, 331, 332, 333, 334, 335, + 336, 337, 338, 450, 467, 489, 531, 532, 418, 503, + 0, 0, 0, 0, 0, 0, 474, 475, 476, 477, + 478, 479, 480, 481, 482, 651, 408, 409, 412, 403, + 472, 382, 326, 327, 404, 533, 534, 535, 536, 537, + 539, 538, 540, 541, 542, 363, 370, 528, 530, 529, + 369, 0, 693, 694, 389, 455, 498, 388, 420, 371, + 372, 374, 373, 0, 544, 413, 485, 347, 545, 546, + 0, 0, 0, 0, 0, 547, 548, 549, 550, 555, + 553, 554, 551, 552, 556, 557, 558, 559, 561, 562, + 560, 573, 0, 577, 578, 0, 0, 579, 563, 571, + 564, 565, 566, 570, 572, 567, 568, 569, 300, 301, + 302, 303, 304, 305, 591, 593, 592, 595, 596, 597, + 598, 594, 621, 623, 624, 625, 626, 627, 628, 629, + 630, 631, 622, 632, 633, 634, 635, 636, 637, 638, + 639, 644, 649, 667, 668, 669, 672, 670, 671, 673, + 674, 675, 676, 686, 687, 688, 689, 690, 691, 700, + 701, 459, 493, 514, 652, 653, 521, 522, 504, 505, + 0, 0, 0, 509, 692, 543, 460, 513, 510, 0, + 0, 574, 575, 576, 508, 506, 507, 511, 512 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int16 yydefgoto[] = { - -1, 1, 17, 18, 19, 32, 271, 20, 33, 506, - 21, 34, 522, 22, 35, 537, 23, 36, 555, 572, - 573, 574, 575, 576, 577, 24, 37, 578, 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, 507, - 508, 509, 510, 511, 512, 513, 514, 523, 524, 525, - 526, 527, 528, 529, 556, 557, 558, 559, 560, 561, - 562, 563, 564, 565, 538, 539, 540, 541, 542, 543, - 544, 25, 38, 593, 594, 595, 596, 597, 598, 599, - 600, 601, 26, 39, 621, 622, 623, 624, 625, 626, - 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, - 637, 638, 639, 640, 27, 40, 642, 643, 28, 41, - 645, 646, 493, 494, 495, 496, 29, 42, 657, 658, - 659, 660, 661, 662, 663, 664, 665, 666, 667, 30, - 43, 674, 675, 676, 677, 678, 679, 680, 497, 31, - 44, 683, 684, 685 + -1, 1, 17, 18, 19, 32, 279, 20, 33, 522, + 21, 34, 538, 22, 35, 553, 23, 36, 571, 588, + 589, 590, 591, 592, 593, 24, 37, 594, 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, 523, 524, 525, 526, 527, + 528, 529, 530, 539, 540, 541, 542, 543, 544, 545, + 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, + 554, 555, 556, 557, 558, 559, 560, 25, 38, 609, + 610, 611, 612, 613, 614, 615, 616, 617, 26, 39, + 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, + 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 27, 40, 658, 659, 28, 41, 661, 662, 507, 508, + 509, 510, 29, 42, 673, 674, 675, 676, 677, 678, + 679, 680, 681, 682, 683, 30, 43, 690, 691, 692, + 693, 694, 695, 696, 511, 512, 513, 31, 44, 699, + 700, 701 }; /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ -#define YYPACT_NINF -312 +#define YYPACT_NINF -286 static const yytype_int16 yypact[] = { - -312, 0, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, 305, -39, -32, -43, -30, -44, -42, -98, - -110, -311, -231, -235, -305, 4, 6, 7, 8, 9, - 10, 23, 24, 25, 26, 27, 37, 38, 39, 40, - 41, 43, 44, 53, 54, 56, 57, 58, 59, 60, - 81, 82, 83, 84, 85, 87, 88, 89, 90, 91, - 92, 93, 95, 96, 98, 99, 101, 103, 107, 108, - 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, - 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, - 129, 130, 131, 132, 133, 134, 135, 136, 139, 140, - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, - 151, 152, 153, 154, 155, 156, 157, 158, 160, 161, - 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, - 172, 173, 174, 175, 176, 177, 178, 179, 181, 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, 222, 223, - 224, 225, 226, 227, 228, 229, 234, 235, 236, 237, - 238, 239, 241, 250, 251, 252, 253, 256, 257, 263, - 265, 266, 267, 268, 269, 270, 272, 274, 275, 276, - 277, 278, 279, 280, 281, 282, 285, 286, 287, 288, - 289, 290, 291, 292, 293, 294, 295, 296, 298, 299, - 300, 302, 303, 304, 306, 340, 341, 342, 343, 347, - 348, 349, 391, 392, 393, 394, 395, 396, 397, 398, - 399, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, 405, 409, - 410, 437, 438, 439, 441, 442, -312, -312, -312, -312, - -312, -312, -312, -312, -312, 450, 464, 465, 466, 467, - 468, 469, -312, -312, -312, -312, -312, -312, -312, -312, - 470, 471, 472, 473, 474, 475, 476, -312, -312, -312, - -312, -312, -312, -312, -312, 477, 478, 479, 480, 481, - 482, 483, 526, 528, 548, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, 549, 550, 551, 552, - 553, 554, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, 555, 556, 557, 558, 569, - 570, 571, 572, -312, -312, -312, -312, -312, -312, -312, - -312, -312, 573, 574, 575, 577, 578, 579, 580, 581, - 582, 583, 586, 589, 592, 593, 602, 603, 604, 606, - 607, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, 608, -312, -312, 609, -312, -312, 610, 611, 612, - 613, 618, 619, 620, 624, 625, 626, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, 627, 628, - 629, 630, 631, 632, -312, -312, -312, -312, -312, -312, - -312, 633, 634, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, 635, 636, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, 637, 638, 639, - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, 640, 641, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, 642, 643, 644, 645, 646, 647, - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, 648, -312, -312, -312, -312, - -312, -312, -312, -312, -312, 649, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, 650, -312, - -312, 651, 652, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, 653, 654, 655, -312, - -312, -312, -312, -312, -312, -312, -312, -312 + -286, 250, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -13, 219, 233, 224, 56, 40, 143, -14, + -81, -285, 129, -189, -278, 29, 30, 31, 73, 74, + 87, 92, 119, 120, 121, 123, 124, 132, 165, 208, + 210, 238, 239, 253, 255, 260, 261, 262, 263, 264, + 265, 271, 287, 288, 290, 291, 293, 294, 297, 302, + 303, 304, 318, 320, 321, 323, 325, 326, 327, 329, + 335, 337, 338, 339, 341, 342, 343, 349, 350, 351, + 353, 356, 358, 359, 360, 361, 362, 363, 366, 368, + 369, 383, 384, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 406, 407, 408, 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, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, + 466, 467, 468, 469, 470, 472, 473, 474, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 510, 511, 512, 513, 515, 516, 517, 518, 519, + 520, 521, 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, 550, 551, 552, + 554, 555, 556, 557, 558, 560, 561, 562, 563, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, 564, 565, 566, 567, 568, 569, + 570, 571, -286, -286, -286, -286, -286, -286, -286, -286, + -286, 572, 573, 574, 575, 576, 577, 578, -286, -286, + -286, -286, -286, -286, -286, -286, 579, 580, 581, 582, + 583, 584, 585, -286, -286, -286, -286, -286, -286, -286, + -286, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, 596, 597, 598, 599, 600, 601, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, 602, 603, 604, 605, 606, 607, 608, 609, -286, + -286, -286, -286, -286, -286, -286, -286, -286, 610, 611, + 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, + 622, 623, 624, 625, 626, 627, 628, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, 629, -286, -286, + 630, -286, -286, 631, 632, 633, 634, 635, 636, 637, + 638, 639, 640, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, 641, 642, 643, 644, 645, 646, + -286, -286, -286, -286, -286, -286, -286, 647, 648, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, 649, 650, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, 651, 652, 653, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, 654, 655, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + 656, 657, 658, 659, 660, 661, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, 662, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, 663, -286, -286, -286, -286, -286, -286, + 664, 665, 666, 667, 668, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, 669, -286, -286, 670, 671, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + 672, 673, 674, -286, -286, -286, -286, -286, -286, 675, + 676, -286, -286, -286, -286, -286, -286, -286, -286 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int16 yypgoto[] = { - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -27, 656, 657, 658, 659, -312, - -312, 660, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312, -312, -312, -312, -312, -312, -312, - -312, -312, -312, -312 + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + 677, 678, 679, 680, 681, -286, -286, 682, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, -286, -286, -286, -286, + -286, -286 }; /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If @@ -2190,161 +2238,165 @@ static const yytype_int16 yypgoto[] = #define YYTABLE_NINF -1 static const yytype_uint16 yytable[] = { - 2, 545, 530, 681, 682, 641, 498, 644, 499, 500, - 579, 3, 4, 515, 686, 545, 687, 688, 689, 690, - 691, 516, 517, 647, 648, 649, 650, 651, 652, 653, - 654, 655, 656, 692, 693, 694, 695, 696, 531, 532, - 668, 669, 670, 671, 672, 673, 5, 697, 698, 699, - 700, 701, 6, 702, 703, 585, 586, 587, 588, 589, - 590, 591, 592, 704, 705, 533, 706, 707, 708, 709, - 710, 501, 602, 603, 604, 605, 606, 607, 608, 609, - 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, - 620, 711, 712, 713, 714, 715, 7, 716, 717, 718, - 719, 720, 721, 722, 502, 723, 724, 503, 725, 726, - 518, 727, 519, 728, 8, 520, 504, 729, 730, 731, - 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, - 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, - 752, 753, 754, 755, 756, 757, 758, 534, 535, 759, - 760, 761, 762, 763, 764, 765, 766, 767, 768, 769, - 770, 771, 772, 773, 774, 775, 776, 777, 778, 9, - 779, 780, 781, 782, 783, 784, 785, 786, 787, 788, - 789, 790, 791, 792, 793, 794, 795, 796, 797, 798, - 536, 799, 800, 801, 802, 803, 804, 805, 806, 807, - 808, 809, 810, 811, 812, 813, 814, 815, 816, 817, - 818, 819, 820, 821, 822, 823, 824, 825, 826, 827, - 828, 829, 830, 831, 832, 833, 834, 835, 836, 837, - 838, 10, 839, 840, 841, 842, 843, 844, 845, 846, - 547, 548, 549, 550, 847, 848, 849, 850, 851, 852, - 552, 853, 546, 11, 547, 548, 549, 550, 551, 505, - 854, 855, 856, 857, 552, 521, 858, 859, 566, 567, - 568, 569, 570, 860, 12, 861, 862, 863, 864, 865, - 866, 571, 867, 13, 868, 869, 870, 871, 872, 873, - 874, 875, 876, 553, 554, 877, 878, 879, 880, 881, - 882, 883, 884, 885, 886, 887, 888, 14, 889, 890, - 891, 15, 892, 893, 894, 0, 895, 16, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 896, 897, 898, 899, 77, 78, 79, 900, 901, 902, - 80, 81, 82, 83, 84, 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, 903, 904, 905, 906, 907, 908, 909, 910, 911, - 121, 122, 123, 124, 125, 912, 126, 127, 128, 913, - 914, 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, 915, 916, 917, - 155, 918, 919, 156, 157, 158, 159, 160, 161, 162, - 920, 163, 164, 165, 166, 167, 168, 169, 170, 171, - 172, 173, 174, 175, 921, 922, 923, 924, 925, 926, - 927, 928, 929, 930, 931, 932, 933, 934, 935, 936, - 937, 938, 939, 940, 176, 177, 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, 204, 205, 206, 207, 208, 209, 210, 211, - 212, 213, 214, 215, 216, 217, 941, 218, 942, 219, - 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 943, 944, - 945, 946, 947, 948, 949, 950, 951, 952, 953, 238, - 239, 240, 241, 242, 243, 244, 245, 246, 247, 954, - 955, 956, 957, 958, 959, 960, 248, 961, 962, 963, - 964, 965, 966, 967, 249, 250, 968, 251, 252, 969, - 253, 254, 970, 971, 255, 256, 257, 258, 259, 260, - 261, 262, 972, 973, 974, 263, 975, 976, 977, 978, - 979, 980, 981, 982, 264, 265, 266, 267, 983, 984, - 985, 268, 269, 270, 986, 987, 988, 989, 990, 991, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 697, 698, 657, 660, 77, 78, 79, 702, + 703, 704, 80, 81, 82, 83, 84, 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, 705, 706, 561, 684, 685, 686, 687, + 688, 689, 121, 122, 123, 124, 125, 707, 126, 127, + 128, 561, 708, 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, 709, + 710, 711, 155, 712, 713, 156, 157, 158, 159, 160, + 161, 162, 714, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 618, 619, 620, 621, + 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, + 632, 633, 634, 635, 636, 715, 176, 177, 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, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 716, 218, + 717, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 601, 602, 603, 604, 605, 606, 607, 608, 718, 719, + 2, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 3, 4, 720, 514, 721, 515, 516, 248, 546, + 722, 723, 724, 725, 726, 727, 249, 250, 531, 251, + 252, 728, 253, 254, 255, 256, 532, 533, 257, 258, + 259, 260, 261, 262, 263, 264, 5, 729, 730, 265, + 731, 732, 6, 733, 734, 547, 548, 735, 266, 267, + 268, 269, 736, 737, 738, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 563, 564, 565, 566, 739, 517, + 740, 741, 549, 742, 568, 743, 744, 745, 562, 746, + 563, 564, 565, 566, 567, 747, 7, 748, 749, 750, + 568, 751, 752, 753, 582, 583, 584, 585, 586, 754, + 755, 756, 518, 757, 8, 519, 758, 587, 759, 760, + 761, 762, 763, 764, 520, 534, 765, 535, 766, 767, + 536, 569, 570, 663, 664, 665, 666, 667, 668, 669, + 670, 671, 672, 768, 769, 770, 771, 772, 773, 774, + 775, 776, 777, 778, 779, 780, 781, 782, 783, 784, + 785, 786, 787, 788, 550, 551, 789, 790, 791, 9, + 792, 793, 794, 795, 796, 797, 798, 799, 800, 801, + 802, 803, 804, 805, 806, 807, 808, 809, 810, 811, + 812, 813, 814, 815, 816, 817, 818, 819, 820, 821, + 822, 823, 824, 825, 826, 827, 828, 552, 829, 830, + 831, 832, 833, 834, 835, 836, 837, 838, 839, 840, + 841, 842, 843, 844, 845, 846, 847, 848, 849, 850, + 851, 10, 852, 853, 854, 855, 856, 857, 858, 859, + 860, 861, 862, 863, 864, 865, 866, 867, 868, 869, + 870, 871, 872, 11, 873, 874, 875, 876, 877, 878, + 879, 880, 881, 882, 883, 884, 885, 886, 887, 521, + 888, 889, 890, 891, 12, 892, 893, 894, 895, 896, + 897, 898, 537, 13, 899, 900, 901, 902, 903, 904, + 905, 906, 907, 908, 909, 910, 911, 912, 913, 914, + 915, 916, 917, 918, 919, 920, 921, 922, 923, 14, + 924, 925, 926, 15, 927, 928, 929, 930, 931, 16, + 932, 933, 934, 935, 936, 937, 938, 939, 940, 941, + 942, 943, 944, 945, 946, 947, 948, 949, 950, 951, + 952, 953, 954, 955, 956, 957, 958, 959, 960, 961, + 962, 963, 964, 965, 966, 967, 968, 969, 970, 971, + 972, 973, 974, 975, 976, 977, 978, 979, 980, 981, + 982, 983, 984, 985, 986, 987, 988, 989, 990, 991, 992, 993, 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, - 1012, 1013, 1014, 1015, 1016, 1017, 0, 0, 0, 0, + 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 580, 581, 582, 583, 584 + 0, 0, 0, 0, 595, 596, 597, 598, 599, 600 }; static const yytype_int16 yycheck[] = { - 0, 45, 45, 308, 309, 115, 45, 318, 47, 48, - 37, 11, 12, 45, 10, 45, 10, 10, 10, 10, - 10, 53, 54, 254, 255, 256, 257, 258, 259, 260, - 261, 262, 263, 10, 10, 10, 10, 10, 81, 82, - 275, 276, 277, 278, 279, 280, 46, 10, 10, 10, - 10, 10, 52, 10, 10, 97, 98, 99, 100, 101, - 102, 103, 104, 10, 10, 108, 10, 10, 10, 10, - 10, 110, 170, 171, 172, 173, 174, 175, 176, 177, - 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, - 188, 10, 10, 10, 10, 10, 96, 10, 10, 10, - 10, 10, 10, 10, 143, 10, 10, 146, 10, 10, - 142, 10, 144, 10, 114, 147, 155, 10, 10, 10, + 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, 310, 311, 115, 320, 49, 50, 51, 10, + 10, 10, 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, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 10, 10, 45, 275, 276, 277, 278, + 279, 280, 105, 106, 107, 108, 109, 10, 111, 112, + 113, 45, 10, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 10, + 10, 10, 145, 10, 10, 148, 149, 150, 151, 152, + 153, 154, 10, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 10, 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, 227, 228, 229, 230, 10, 232, + 10, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 97, 98, 99, 100, 101, 102, 103, 104, 10, 10, + 0, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 11, 12, 10, 45, 10, 47, 48, 281, 45, + 10, 10, 10, 10, 10, 10, 289, 290, 45, 292, + 293, 10, 295, 296, 297, 298, 53, 54, 301, 302, + 303, 304, 305, 306, 307, 308, 46, 10, 10, 312, + 10, 10, 52, 10, 10, 81, 82, 10, 321, 322, + 323, 324, 10, 10, 10, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 284, 285, 286, 287, 10, 110, + 10, 10, 108, 10, 294, 10, 10, 10, 282, 10, + 284, 285, 286, 287, 288, 10, 96, 10, 10, 10, + 294, 10, 10, 10, 314, 315, 316, 317, 318, 10, + 10, 10, 143, 10, 114, 146, 10, 327, 10, 10, + 10, 10, 10, 10, 155, 142, 10, 144, 10, 10, + 147, 325, 326, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 190, 191, 10, 10, 10, 169, 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, 190, 191, 10, - 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, 10, 169, - 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 233, 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, 233, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 231, 10, 10, 10, 10, 10, 10, 10, 10, - 284, 285, 286, 287, 10, 10, 10, 10, 10, 10, - 294, 10, 282, 253, 284, 285, 286, 287, 288, 298, - 10, 10, 10, 10, 294, 297, 10, 10, 312, 313, - 314, 315, 316, 10, 274, 10, 10, 10, 10, 10, - 10, 325, 10, 283, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 323, 324, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 307, 10, 10, - 10, 311, 10, 10, 10, -1, 10, 317, 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, - 10, 10, 10, 10, 49, 50, 51, 10, 10, 10, - 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, 82, 83, 84, - 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 105, 106, 107, 108, 109, 10, 111, 112, 113, 10, - 10, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, - 135, 136, 137, 138, 139, 140, 141, 10, 10, 10, - 145, 10, 10, 148, 149, 150, 151, 152, 153, 154, - 10, 156, 157, 158, 159, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 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, 227, 228, 229, 230, 10, 232, 10, 234, - 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, - 245, 246, 247, 248, 249, 250, 251, 252, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, 10, 264, - 265, 266, 267, 268, 269, 270, 271, 272, 273, 10, - 10, 10, 10, 10, 10, 10, 281, 10, 10, 10, - 10, 10, 10, 10, 289, 290, 10, 292, 293, 10, - 295, 296, 10, 10, 299, 300, 301, 302, 303, 304, - 305, 306, 10, 10, 10, 310, 10, 10, 10, 10, - 10, 10, 10, 10, 319, 320, 321, 322, 10, 10, - 10, 326, 327, 328, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 253, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 300, + 10, 10, 10, 10, 274, 10, 10, 10, 10, 10, + 10, 10, 299, 283, 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, 309, + 10, 10, 10, 313, 10, 10, 10, 10, 10, 319, 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, + 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, 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, 37, 37, 37, 37, 37 + -1, -1, -1, -1, 37, 37, 37, 37, 37, 37 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing symbol of state STATE-NUM. */ static const yytype_uint16 yystos[] = { - 0, 330, 0, 11, 12, 46, 52, 96, 114, 169, - 231, 253, 274, 283, 307, 311, 317, 331, 332, 333, - 336, 339, 342, 345, 354, 610, 621, 643, 647, 655, - 668, 678, 334, 337, 340, 343, 346, 355, 611, 622, - 644, 648, 656, 669, 679, 13, 14, 15, 16, 17, + 0, 338, 0, 11, 12, 46, 52, 96, 114, 169, + 231, 253, 274, 283, 309, 313, 319, 339, 340, 341, + 344, 347, 350, 353, 362, 624, 635, 657, 661, 669, + 682, 694, 342, 345, 348, 351, 354, 363, 625, 636, + 658, 662, 670, 683, 695, 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, 49, 50, 51, @@ -2365,9 +2417,9 @@ static const yytype_uint16 yystos[] = 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 281, 289, - 290, 292, 293, 295, 296, 299, 300, 301, 302, 303, - 304, 305, 306, 310, 319, 320, 321, 322, 326, 327, - 328, 335, 357, 358, 359, 360, 361, 362, 363, 364, + 290, 292, 293, 295, 296, 297, 298, 301, 302, 303, + 304, 305, 306, 307, 308, 312, 321, 322, 323, 324, + 328, 329, 330, 331, 332, 333, 334, 335, 336, 343, 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, @@ -2389,26 +2441,28 @@ static const yytype_uint16 yystos[] = 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, 651, 652, 653, 654, 677, 45, 47, - 48, 110, 143, 146, 155, 298, 338, 578, 579, 580, - 581, 582, 583, 584, 585, 45, 53, 54, 142, 144, - 147, 297, 341, 586, 587, 588, 589, 590, 591, 592, - 45, 81, 82, 108, 190, 191, 233, 344, 603, 604, - 605, 606, 607, 608, 609, 45, 282, 284, 285, 286, - 287, 288, 294, 323, 324, 347, 593, 594, 595, 596, - 597, 598, 599, 600, 601, 602, 312, 313, 314, 315, - 316, 325, 348, 349, 350, 351, 352, 353, 356, 593, - 594, 595, 596, 597, 600, 97, 98, 99, 100, 101, - 102, 103, 104, 612, 613, 614, 615, 616, 617, 618, - 619, 620, 170, 171, 172, 173, 174, 175, 176, 177, - 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, - 188, 623, 624, 625, 626, 627, 628, 629, 630, 631, - 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, - 642, 115, 645, 646, 318, 649, 650, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 657, 658, 659, - 660, 661, 662, 663, 664, 665, 666, 667, 275, 276, - 277, 278, 279, 280, 670, 671, 672, 673, 674, 675, - 676, 308, 309, 680, 681, 682, 10, 10, 10, 10, + 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 665, 666, 667, + 668, 691, 692, 693, 45, 47, 48, 110, 143, 146, + 155, 300, 346, 592, 593, 594, 595, 596, 597, 598, + 599, 45, 53, 54, 142, 144, 147, 299, 349, 600, + 601, 602, 603, 604, 605, 606, 45, 81, 82, 108, + 190, 191, 233, 352, 617, 618, 619, 620, 621, 622, + 623, 45, 282, 284, 285, 286, 287, 288, 294, 325, + 326, 355, 607, 608, 609, 610, 611, 612, 613, 614, + 615, 616, 314, 315, 316, 317, 318, 327, 356, 357, + 358, 359, 360, 361, 364, 607, 608, 609, 610, 611, + 614, 97, 98, 99, 100, 101, 102, 103, 104, 626, + 627, 628, 629, 630, 631, 632, 633, 634, 170, 171, + 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 637, 638, 639, + 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 115, 659, 660, + 320, 663, 664, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 671, 672, 673, 674, 675, 676, 677, + 678, 679, 680, 681, 275, 276, 277, 278, 279, 280, + 684, 685, 686, 687, 688, 689, 690, 310, 311, 696, + 697, 698, 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, @@ -2441,7 +2495,8 @@ static const yytype_uint16 yystos[] = 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10 + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10 }; #define yyerrok (yyerrstatus = 0) @@ -3256,7 +3311,7 @@ yyreduce: switch (yyn) { case 18: -#line 206 "./util/configparser.y" +#line 213 "./util/configparser.y" { OUTYY(("\nP(force-toplevel)\n")); cfg_parser->started_toplevel = 0; @@ -3264,15 +3319,15 @@ yyreduce: break; case 19: -#line 213 "./util/configparser.y" +#line 220 "./util/configparser.y" { OUTYY(("\nP(server:)\n")); cfg_parser->started_toplevel = 1; } break; - case 248: -#line 323 "./util/configparser.y" + case 256: +#line 333 "./util/configparser.y" { struct config_stub* s; OUTYY(("\nP(stub_zone:)\n")); @@ -3287,8 +3342,8 @@ yyreduce: } break; - case 259: -#line 342 "./util/configparser.y" + case 267: +#line 352 "./util/configparser.y" { struct config_stub* s; OUTYY(("\nP(forward_zone:)\n")); @@ -3303,8 +3358,8 @@ yyreduce: } break; - case 269: -#line 361 "./util/configparser.y" + case 277: +#line 371 "./util/configparser.y" { struct config_view* s; OUTYY(("\nP(view:)\n")); @@ -3321,8 +3376,8 @@ yyreduce: } break; - case 279: -#line 382 "./util/configparser.y" + case 287: +#line 392 "./util/configparser.y" { struct config_auth* s; OUTYY(("\nP(auth_zone:)\n")); @@ -3344,8 +3399,8 @@ yyreduce: } break; - case 292: -#line 410 "./util/configparser.y" + case 300: +#line 420 "./util/configparser.y" { uint8_t* bitlist; size_t len = 0; @@ -3364,8 +3419,8 @@ yyreduce: } break; - case 293: -#line 429 "./util/configparser.y" + case 301: +#line 439 "./util/configparser.y" { OUTYY(("P(rpz_action_override:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "nxdomain")!=0 && strcmp((yyvsp[(2) - (2)].str), "nodata")!=0 && @@ -3382,8 +3437,8 @@ yyreduce: } break; - case 294: -#line 446 "./util/configparser.y" + case 302: +#line 456 "./util/configparser.y" { OUTYY(("P(rpz_cname_override:%s)\n", (yyvsp[(2) - (2)].str))); free(cfg_parser->cfg->auths->rpz_cname); @@ -3391,8 +3446,8 @@ yyreduce: } break; - case 295: -#line 454 "./util/configparser.y" + case 303: +#line 464 "./util/configparser.y" { OUTYY(("P(rpz_log:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -3402,8 +3457,8 @@ yyreduce: } break; - case 296: -#line 464 "./util/configparser.y" + case 304: +#line 474 "./util/configparser.y" { OUTYY(("P(rpz_log_name:%s)\n", (yyvsp[(2) - (2)].str))); free(cfg_parser->cfg->auths->rpz_log_name); @@ -3411,8 +3466,8 @@ yyreduce: } break; - case 297: -#line 471 "./util/configparser.y" + case 305: +#line 481 "./util/configparser.y" { OUTYY(("P(rpz_signal_nxdomain_ra:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -3422,8 +3477,8 @@ yyreduce: } break; - case 298: -#line 481 "./util/configparser.y" + case 306: +#line 491 "./util/configparser.y" { struct config_auth* s; OUTYY(("\nP(rpz:)\n")); @@ -3443,8 +3498,8 @@ yyreduce: } break; - case 313: -#line 506 "./util/configparser.y" + case 321: +#line 516 "./util/configparser.y" { OUTYY(("P(server_num_threads:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0 && strcmp((yyvsp[(2) - (2)].str), "0") != 0) @@ -3454,8 +3509,8 @@ yyreduce: } break; - case 314: -#line 515 "./util/configparser.y" + case 322: +#line 525 "./util/configparser.y" { OUTYY(("P(server_verbosity:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0 && strcmp((yyvsp[(2) - (2)].str), "0") != 0) @@ -3465,8 +3520,8 @@ yyreduce: } break; - case 315: -#line 524 "./util/configparser.y" + case 323: +#line 534 "./util/configparser.y" { OUTYY(("P(server_statistics_interval:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "") == 0 || strcmp((yyvsp[(2) - (2)].str), "0") == 0) @@ -3478,8 +3533,8 @@ yyreduce: } break; - case 316: -#line 535 "./util/configparser.y" + case 324: +#line 545 "./util/configparser.y" { OUTYY(("P(server_statistics_cumulative:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -3489,8 +3544,8 @@ yyreduce: } break; - case 317: -#line 544 "./util/configparser.y" + case 325: +#line 554 "./util/configparser.y" { OUTYY(("P(server_extended_statistics:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -3500,8 +3555,8 @@ yyreduce: } break; - case 318: -#line 553 "./util/configparser.y" + case 326: +#line 563 "./util/configparser.y" { OUTYY(("P(server_shm_enable:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -3511,8 +3566,8 @@ yyreduce: } break; - case 319: -#line 562 "./util/configparser.y" + case 327: +#line 572 "./util/configparser.y" { OUTYY(("P(server_shm_key:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "") == 0 || strcmp((yyvsp[(2) - (2)].str), "0") == 0) @@ -3524,8 +3579,8 @@ yyreduce: } break; - case 320: -#line 573 "./util/configparser.y" + case 328: +#line 583 "./util/configparser.y" { OUTYY(("P(server_port:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0) @@ -3535,8 +3590,8 @@ yyreduce: } break; - case 321: -#line 582 "./util/configparser.y" + case 329: +#line 592 "./util/configparser.y" { #ifdef CLIENT_SUBNET OUTYY(("P(server_send_client_subnet:%s)\n", (yyvsp[(2) - (2)].str))); @@ -3549,8 +3604,8 @@ yyreduce: } break; - case 322: -#line 594 "./util/configparser.y" + case 330: +#line 604 "./util/configparser.y" { #ifdef CLIENT_SUBNET OUTYY(("P(server_client_subnet_zone:%s)\n", (yyvsp[(2) - (2)].str))); @@ -3564,8 +3619,8 @@ yyreduce: } break; - case 323: -#line 608 "./util/configparser.y" + case 331: +#line 618 "./util/configparser.y" { #ifdef CLIENT_SUBNET OUTYY(("P(server_client_subnet_always_forward:%s)\n", (yyvsp[(2) - (2)].str))); @@ -3581,8 +3636,8 @@ yyreduce: } break; - case 324: -#line 623 "./util/configparser.y" + case 332: +#line 633 "./util/configparser.y" { #ifdef CLIENT_SUBNET OUTYY(("P(client_subnet_opcode:%s)\n", (yyvsp[(2) - (2)].str))); @@ -3594,8 +3649,8 @@ yyreduce: } break; - case 325: -#line 634 "./util/configparser.y" + case 333: +#line 644 "./util/configparser.y" { #ifdef CLIENT_SUBNET OUTYY(("P(max_client_subnet_ipv4:%s)\n", (yyvsp[(2) - (2)].str))); @@ -3613,8 +3668,8 @@ yyreduce: } break; - case 326: -#line 651 "./util/configparser.y" + case 334: +#line 661 "./util/configparser.y" { #ifdef CLIENT_SUBNET OUTYY(("P(max_client_subnet_ipv6:%s)\n", (yyvsp[(2) - (2)].str))); @@ -3632,8 +3687,8 @@ yyreduce: } break; - case 327: -#line 668 "./util/configparser.y" + case 335: +#line 678 "./util/configparser.y" { #ifdef CLIENT_SUBNET OUTYY(("P(min_client_subnet_ipv4:%s)\n", (yyvsp[(2) - (2)].str))); @@ -3651,8 +3706,8 @@ yyreduce: } break; - case 328: -#line 685 "./util/configparser.y" + case 336: +#line 695 "./util/configparser.y" { #ifdef CLIENT_SUBNET OUTYY(("P(min_client_subnet_ipv6:%s)\n", (yyvsp[(2) - (2)].str))); @@ -3670,8 +3725,8 @@ yyreduce: } break; - case 329: -#line 702 "./util/configparser.y" + case 337: +#line 712 "./util/configparser.y" { #ifdef CLIENT_SUBNET OUTYY(("P(max_ecs_tree_size_ipv4:%s)\n", (yyvsp[(2) - (2)].str))); @@ -3687,8 +3742,8 @@ yyreduce: } break; - case 330: -#line 717 "./util/configparser.y" + case 338: +#line 727 "./util/configparser.y" { #ifdef CLIENT_SUBNET OUTYY(("P(max_ecs_tree_size_ipv6:%s)\n", (yyvsp[(2) - (2)].str))); @@ -3704,8 +3759,8 @@ yyreduce: } break; - case 331: -#line 732 "./util/configparser.y" + case 339: +#line 742 "./util/configparser.y" { OUTYY(("P(server_interface:%s)\n", (yyvsp[(2) - (2)].str))); if(cfg_parser->cfg->num_ifs == 0) @@ -3719,8 +3774,8 @@ yyreduce: } break; - case 332: -#line 745 "./util/configparser.y" + case 340: +#line 755 "./util/configparser.y" { OUTYY(("P(server_outgoing_interface:%s)\n", (yyvsp[(2) - (2)].str))); if(cfg_parser->cfg->num_out_ifs == 0) @@ -3736,8 +3791,8 @@ yyreduce: } break; - case 333: -#line 760 "./util/configparser.y" + case 341: +#line 770 "./util/configparser.y" { OUTYY(("P(server_outgoing_range:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0) @@ -3747,8 +3802,8 @@ yyreduce: } break; - case 334: -#line 769 "./util/configparser.y" + case 342: +#line 779 "./util/configparser.y" { OUTYY(("P(server_outgoing_port_permit:%s)\n", (yyvsp[(2) - (2)].str))); if(!cfg_mark_ports((yyvsp[(2) - (2)].str), 1, @@ -3758,8 +3813,8 @@ yyreduce: } break; - case 335: -#line 778 "./util/configparser.y" + case 343: +#line 788 "./util/configparser.y" { OUTYY(("P(server_outgoing_port_avoid:%s)\n", (yyvsp[(2) - (2)].str))); if(!cfg_mark_ports((yyvsp[(2) - (2)].str), 0, @@ -3769,8 +3824,8 @@ yyreduce: } break; - case 336: -#line 787 "./util/configparser.y" + case 344: +#line 797 "./util/configparser.y" { OUTYY(("P(server_outgoing_num_tcp:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0 && strcmp((yyvsp[(2) - (2)].str), "0") != 0) @@ -3780,8 +3835,8 @@ yyreduce: } break; - case 337: -#line 796 "./util/configparser.y" + case 345: +#line 806 "./util/configparser.y" { OUTYY(("P(server_incoming_num_tcp:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0 && strcmp((yyvsp[(2) - (2)].str), "0") != 0) @@ -3791,8 +3846,8 @@ yyreduce: } break; - case 338: -#line 805 "./util/configparser.y" + case 346: +#line 815 "./util/configparser.y" { OUTYY(("P(server_interface_automatic:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -3802,8 +3857,8 @@ yyreduce: } break; - case 339: -#line 814 "./util/configparser.y" + case 347: +#line 824 "./util/configparser.y" { OUTYY(("P(server_interface_automatic_ports:%s)\n", (yyvsp[(2) - (2)].str))); free(cfg_parser->cfg->if_automatic_ports); @@ -3811,8 +3866,8 @@ yyreduce: } break; - case 340: -#line 821 "./util/configparser.y" + case 348: +#line 831 "./util/configparser.y" { OUTYY(("P(server_do_ip4:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -3822,8 +3877,8 @@ yyreduce: } break; - case 341: -#line 830 "./util/configparser.y" + case 349: +#line 840 "./util/configparser.y" { OUTYY(("P(server_do_ip6:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -3833,8 +3888,8 @@ yyreduce: } break; - case 342: -#line 839 "./util/configparser.y" + case 350: +#line 849 "./util/configparser.y" { OUTYY(("P(server_do_udp:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -3844,8 +3899,8 @@ yyreduce: } break; - case 343: -#line 848 "./util/configparser.y" + case 351: +#line 858 "./util/configparser.y" { OUTYY(("P(server_do_tcp:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -3855,8 +3910,8 @@ yyreduce: } break; - case 344: -#line 857 "./util/configparser.y" + case 352: +#line 867 "./util/configparser.y" { OUTYY(("P(server_prefer_ip4:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -3866,8 +3921,8 @@ yyreduce: } break; - case 345: -#line 866 "./util/configparser.y" + case 353: +#line 876 "./util/configparser.y" { OUTYY(("P(server_prefer_ip6:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -3877,8 +3932,8 @@ yyreduce: } break; - case 346: -#line 875 "./util/configparser.y" + case 354: +#line 885 "./util/configparser.y" { OUTYY(("P(server_tcp_mss:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0 && strcmp((yyvsp[(2) - (2)].str), "0") != 0) @@ -3888,8 +3943,8 @@ yyreduce: } break; - case 347: -#line 884 "./util/configparser.y" + case 355: +#line 894 "./util/configparser.y" { OUTYY(("P(server_outgoing_tcp_mss:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0 && strcmp((yyvsp[(2) - (2)].str), "0") != 0) @@ -3899,8 +3954,8 @@ yyreduce: } break; - case 348: -#line 893 "./util/configparser.y" + case 356: +#line 903 "./util/configparser.y" { OUTYY(("P(server_tcp_idle_timeout:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0 && strcmp((yyvsp[(2) - (2)].str), "0") != 0) @@ -3914,8 +3969,8 @@ yyreduce: } break; - case 349: -#line 906 "./util/configparser.y" + case 357: +#line 916 "./util/configparser.y" { OUTYY(("P(server_max_reuse_tcp_queries:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0 && strcmp((yyvsp[(2) - (2)].str), "0") != 0) @@ -3927,8 +3982,8 @@ yyreduce: } break; - case 350: -#line 917 "./util/configparser.y" + case 358: +#line 927 "./util/configparser.y" { OUTYY(("P(server_tcp_reuse_timeout:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0 && strcmp((yyvsp[(2) - (2)].str), "0") != 0) @@ -3940,8 +3995,8 @@ yyreduce: } break; - case 351: -#line 928 "./util/configparser.y" + case 359: +#line 938 "./util/configparser.y" { OUTYY(("P(server_tcp_auth_query_timeout:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0 && strcmp((yyvsp[(2) - (2)].str), "0") != 0) @@ -3953,8 +4008,8 @@ yyreduce: } break; - case 352: -#line 939 "./util/configparser.y" + case 360: +#line 949 "./util/configparser.y" { OUTYY(("P(server_tcp_keepalive:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -3964,8 +4019,8 @@ yyreduce: } break; - case 353: -#line 948 "./util/configparser.y" + case 361: +#line 958 "./util/configparser.y" { OUTYY(("P(server_tcp_keepalive_timeout:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0 && strcmp((yyvsp[(2) - (2)].str), "0") != 0) @@ -3979,8 +4034,8 @@ yyreduce: } break; - case 354: -#line 961 "./util/configparser.y" + case 362: +#line 971 "./util/configparser.y" { OUTYY(("P(server_tcp_upstream:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -3990,8 +4045,8 @@ yyreduce: } break; - case 355: -#line 970 "./util/configparser.y" + case 363: +#line 980 "./util/configparser.y" { OUTYY(("P(server_udp_upstream_without_downstream:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -4001,8 +4056,8 @@ yyreduce: } break; - case 356: -#line 979 "./util/configparser.y" + case 364: +#line 989 "./util/configparser.y" { OUTYY(("P(server_ssl_upstream:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -4012,8 +4067,8 @@ yyreduce: } break; - case 357: -#line 988 "./util/configparser.y" + case 365: +#line 998 "./util/configparser.y" { OUTYY(("P(server_ssl_service_key:%s)\n", (yyvsp[(2) - (2)].str))); free(cfg_parser->cfg->ssl_service_key); @@ -4021,8 +4076,8 @@ yyreduce: } break; - case 358: -#line 995 "./util/configparser.y" + case 366: +#line 1005 "./util/configparser.y" { OUTYY(("P(server_ssl_service_pem:%s)\n", (yyvsp[(2) - (2)].str))); free(cfg_parser->cfg->ssl_service_pem); @@ -4030,8 +4085,8 @@ yyreduce: } break; - case 359: -#line 1002 "./util/configparser.y" + case 367: +#line 1012 "./util/configparser.y" { OUTYY(("P(server_ssl_port:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0) @@ -4041,8 +4096,8 @@ yyreduce: } break; - case 360: -#line 1011 "./util/configparser.y" + case 368: +#line 1021 "./util/configparser.y" { OUTYY(("P(server_tls_cert_bundle:%s)\n", (yyvsp[(2) - (2)].str))); free(cfg_parser->cfg->tls_cert_bundle); @@ -4050,8 +4105,8 @@ yyreduce: } break; - case 361: -#line 1018 "./util/configparser.y" + case 369: +#line 1028 "./util/configparser.y" { OUTYY(("P(server_tls_win_cert:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -4061,8 +4116,8 @@ yyreduce: } break; - case 362: -#line 1027 "./util/configparser.y" + case 370: +#line 1037 "./util/configparser.y" { OUTYY(("P(server_tls_additional_port:%s)\n", (yyvsp[(2) - (2)].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->tls_additional_port, @@ -4071,8 +4126,8 @@ yyreduce: } break; - case 363: -#line 1035 "./util/configparser.y" + case 371: +#line 1045 "./util/configparser.y" { OUTYY(("P(server_tls_ciphers:%s)\n", (yyvsp[(2) - (2)].str))); free(cfg_parser->cfg->tls_ciphers); @@ -4080,8 +4135,8 @@ yyreduce: } break; - case 364: -#line 1042 "./util/configparser.y" + case 372: +#line 1052 "./util/configparser.y" { OUTYY(("P(server_tls_ciphersuites:%s)\n", (yyvsp[(2) - (2)].str))); free(cfg_parser->cfg->tls_ciphersuites); @@ -4089,8 +4144,8 @@ yyreduce: } break; - case 365: -#line 1049 "./util/configparser.y" + case 373: +#line 1059 "./util/configparser.y" { OUTYY(("P(server_tls_session_ticket_keys:%s)\n", (yyvsp[(2) - (2)].str))); if(!cfg_strlist_append(&cfg_parser->cfg->tls_session_ticket_keys, @@ -4099,8 +4154,8 @@ yyreduce: } break; - case 366: -#line 1057 "./util/configparser.y" + case 374: +#line 1067 "./util/configparser.y" { OUTYY(("P(server_tls_use_sni:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -4110,8 +4165,8 @@ yyreduce: } break; - case 367: -#line 1066 "./util/configparser.y" + case 375: +#line 1076 "./util/configparser.y" { OUTYY(("P(server_https_port:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0) @@ -4121,8 +4176,8 @@ yyreduce: } break; - case 368: -#line 1074 "./util/configparser.y" + case 376: +#line 1084 "./util/configparser.y" { OUTYY(("P(server_http_endpoint:%s)\n", (yyvsp[(2) - (2)].str))); free(cfg_parser->cfg->http_endpoint); @@ -4140,8 +4195,8 @@ yyreduce: } break; - case 369: -#line 1090 "./util/configparser.y" + case 377: +#line 1100 "./util/configparser.y" { OUTYY(("P(server_http_max_streams:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0 && strcmp((yyvsp[(2) - (2)].str), "0") != 0) @@ -4151,8 +4206,8 @@ yyreduce: } break; - case 370: -#line 1098 "./util/configparser.y" + case 378: +#line 1108 "./util/configparser.y" { OUTYY(("P(server_http_query_buffer_size:%s)\n", (yyvsp[(2) - (2)].str))); if(!cfg_parse_memsize((yyvsp[(2) - (2)].str), @@ -4162,8 +4217,8 @@ yyreduce: } break; - case 371: -#line 1106 "./util/configparser.y" + case 379: +#line 1116 "./util/configparser.y" { OUTYY(("P(server_http_response_buffer_size:%s)\n", (yyvsp[(2) - (2)].str))); if(!cfg_parse_memsize((yyvsp[(2) - (2)].str), @@ -4173,8 +4228,8 @@ yyreduce: } break; - case 372: -#line 1114 "./util/configparser.y" + case 380: +#line 1124 "./util/configparser.y" { OUTYY(("P(server_http_nodelay:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -4184,8 +4239,8 @@ yyreduce: } break; - case 373: -#line 1122 "./util/configparser.y" + case 381: +#line 1132 "./util/configparser.y" { OUTYY(("P(server_http_notls_downstream:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -4195,8 +4250,8 @@ yyreduce: } break; - case 374: -#line 1130 "./util/configparser.y" + case 382: +#line 1140 "./util/configparser.y" { OUTYY(("P(server_use_systemd:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -4206,8 +4261,8 @@ yyreduce: } break; - case 375: -#line 1139 "./util/configparser.y" + case 383: +#line 1149 "./util/configparser.y" { OUTYY(("P(server_do_daemonize:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -4217,8 +4272,8 @@ yyreduce: } break; - case 376: -#line 1148 "./util/configparser.y" + case 384: +#line 1158 "./util/configparser.y" { OUTYY(("P(server_use_syslog:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -4233,8 +4288,8 @@ yyreduce: } break; - case 377: -#line 1162 "./util/configparser.y" + case 385: +#line 1172 "./util/configparser.y" { OUTYY(("P(server_log_time_ascii:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -4244,8 +4299,8 @@ yyreduce: } break; - case 378: -#line 1171 "./util/configparser.y" + case 386: +#line 1181 "./util/configparser.y" { OUTYY(("P(server_log_queries:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -4255,8 +4310,8 @@ yyreduce: } break; - case 379: -#line 1180 "./util/configparser.y" + case 387: +#line 1190 "./util/configparser.y" { OUTYY(("P(server_log_replies:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -4266,8 +4321,8 @@ yyreduce: } break; - case 380: -#line 1189 "./util/configparser.y" + case 388: +#line 1199 "./util/configparser.y" { OUTYY(("P(server_log_tag_queryreply:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -4277,8 +4332,8 @@ yyreduce: } break; - case 381: -#line 1198 "./util/configparser.y" + case 389: +#line 1208 "./util/configparser.y" { OUTYY(("P(server_log_servfail:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -4288,8 +4343,8 @@ yyreduce: } break; - case 382: -#line 1207 "./util/configparser.y" + case 390: +#line 1217 "./util/configparser.y" { OUTYY(("P(server_log_local_actions:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -4299,8 +4354,8 @@ yyreduce: } break; - case 383: -#line 1216 "./util/configparser.y" + case 391: +#line 1226 "./util/configparser.y" { OUTYY(("P(server_chroot:%s)\n", (yyvsp[(2) - (2)].str))); free(cfg_parser->cfg->chrootdir); @@ -4308,8 +4363,8 @@ yyreduce: } break; - case 384: -#line 1223 "./util/configparser.y" + case 392: +#line 1233 "./util/configparser.y" { OUTYY(("P(server_username:%s)\n", (yyvsp[(2) - (2)].str))); free(cfg_parser->cfg->username); @@ -4317,8 +4372,8 @@ yyreduce: } break; - case 385: -#line 1230 "./util/configparser.y" + case 393: +#line 1240 "./util/configparser.y" { OUTYY(("P(server_directory:%s)\n", (yyvsp[(2) - (2)].str))); free(cfg_parser->cfg->directory); @@ -4345,8 +4400,8 @@ yyreduce: } break; - case 386: -#line 1256 "./util/configparser.y" + case 394: +#line 1266 "./util/configparser.y" { OUTYY(("P(server_logfile:%s)\n", (yyvsp[(2) - (2)].str))); free(cfg_parser->cfg->logfile); @@ -4355,8 +4410,8 @@ yyreduce: } break; - case 387: -#line 1264 "./util/configparser.y" + case 395: +#line 1274 "./util/configparser.y" { OUTYY(("P(server_pidfile:%s)\n", (yyvsp[(2) - (2)].str))); free(cfg_parser->cfg->pidfile); @@ -4364,8 +4419,8 @@ yyreduce: } break; - case 388: -#line 1271 "./util/configparser.y" + case 396: +#line 1281 "./util/configparser.y" { OUTYY(("P(server_root_hints:%s)\n", (yyvsp[(2) - (2)].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->root_hints, (yyvsp[(2) - (2)].str))) @@ -4373,8 +4428,8 @@ yyreduce: } break; - case 389: -#line 1278 "./util/configparser.y" + case 397: +#line 1288 "./util/configparser.y" { OUTYY(("P(server_dlv_anchor_file:%s)\n", (yyvsp[(2) - (2)].str))); log_warn("option dlv-anchor-file ignored: DLV is decommissioned"); @@ -4382,8 +4437,8 @@ yyreduce: } break; - case 390: -#line 1285 "./util/configparser.y" + case 398: +#line 1295 "./util/configparser.y" { OUTYY(("P(server_dlv_anchor:%s)\n", (yyvsp[(2) - (2)].str))); log_warn("option dlv-anchor ignored: DLV is decommissioned"); @@ -4391,8 +4446,8 @@ yyreduce: } break; - case 391: -#line 1292 "./util/configparser.y" + case 399: +#line 1302 "./util/configparser.y" { OUTYY(("P(server_auto_trust_anchor_file:%s)\n", (yyvsp[(2) - (2)].str))); if(!cfg_strlist_insert(&cfg_parser->cfg-> @@ -4401,8 +4456,8 @@ yyreduce: } break; - case 392: -#line 1300 "./util/configparser.y" + case 400: +#line 1310 "./util/configparser.y" { OUTYY(("P(server_trust_anchor_file:%s)\n", (yyvsp[(2) - (2)].str))); if(!cfg_strlist_insert(&cfg_parser->cfg-> @@ -4411,8 +4466,8 @@ yyreduce: } break; - case 393: -#line 1308 "./util/configparser.y" + case 401: +#line 1318 "./util/configparser.y" { OUTYY(("P(server_trusted_keys_file:%s)\n", (yyvsp[(2) - (2)].str))); if(!cfg_strlist_insert(&cfg_parser->cfg-> @@ -4421,8 +4476,8 @@ yyreduce: } break; - case 394: -#line 1316 "./util/configparser.y" + case 402: +#line 1326 "./util/configparser.y" { OUTYY(("P(server_trust_anchor:%s)\n", (yyvsp[(2) - (2)].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->trust_anchor_list, (yyvsp[(2) - (2)].str))) @@ -4430,8 +4485,8 @@ yyreduce: } break; - case 395: -#line 1323 "./util/configparser.y" + case 403: +#line 1333 "./util/configparser.y" { OUTYY(("P(server_trust_anchor_signaling:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -4443,8 +4498,8 @@ yyreduce: } break; - case 396: -#line 1334 "./util/configparser.y" + case 404: +#line 1344 "./util/configparser.y" { OUTYY(("P(server_root_key_sentinel:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -4456,8 +4511,8 @@ yyreduce: } break; - case 397: -#line 1345 "./util/configparser.y" + case 405: +#line 1355 "./util/configparser.y" { OUTYY(("P(server_domain_insecure:%s)\n", (yyvsp[(2) - (2)].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->domain_insecure, (yyvsp[(2) - (2)].str))) @@ -4465,8 +4520,8 @@ yyreduce: } break; - case 398: -#line 1352 "./util/configparser.y" + case 406: +#line 1362 "./util/configparser.y" { OUTYY(("P(server_hide_identity:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -4476,8 +4531,8 @@ yyreduce: } break; - case 399: -#line 1361 "./util/configparser.y" + case 407: +#line 1371 "./util/configparser.y" { OUTYY(("P(server_hide_version:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -4487,8 +4542,8 @@ yyreduce: } break; - case 400: -#line 1370 "./util/configparser.y" + case 408: +#line 1380 "./util/configparser.y" { OUTYY(("P(server_hide_trustanchor:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -4498,8 +4553,8 @@ yyreduce: } break; - case 401: -#line 1379 "./util/configparser.y" + case 409: +#line 1389 "./util/configparser.y" { OUTYY(("P(server_hide_user_agent:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -4509,8 +4564,8 @@ yyreduce: } break; - case 402: -#line 1388 "./util/configparser.y" + case 410: +#line 1398 "./util/configparser.y" { OUTYY(("P(server_identity:%s)\n", (yyvsp[(2) - (2)].str))); free(cfg_parser->cfg->identity); @@ -4518,8 +4573,8 @@ yyreduce: } break; - case 403: -#line 1395 "./util/configparser.y" + case 411: +#line 1405 "./util/configparser.y" { OUTYY(("P(server_version:%s)\n", (yyvsp[(2) - (2)].str))); free(cfg_parser->cfg->version); @@ -4527,8 +4582,8 @@ yyreduce: } break; - case 404: -#line 1402 "./util/configparser.y" + case 412: +#line 1412 "./util/configparser.y" { OUTYY(("P(server_http_user_agent:%s)\n", (yyvsp[(2) - (2)].str))); free(cfg_parser->cfg->http_user_agent); @@ -4536,8 +4591,8 @@ yyreduce: } break; - case 405: -#line 1409 "./util/configparser.y" + case 413: +#line 1419 "./util/configparser.y" { OUTYY(("P(server_nsid:%s)\n", (yyvsp[(2) - (2)].str))); free(cfg_parser->cfg->nsid_cfg_str); @@ -4554,8 +4609,8 @@ yyreduce: } break; - case 406: -#line 1425 "./util/configparser.y" + case 414: +#line 1435 "./util/configparser.y" { OUTYY(("P(server_so_rcvbuf:%s)\n", (yyvsp[(2) - (2)].str))); if(!cfg_parse_memsize((yyvsp[(2) - (2)].str), &cfg_parser->cfg->so_rcvbuf)) @@ -4564,8 +4619,8 @@ yyreduce: } break; - case 407: -#line 1433 "./util/configparser.y" + case 415: +#line 1443 "./util/configparser.y" { OUTYY(("P(server_so_sndbuf:%s)\n", (yyvsp[(2) - (2)].str))); if(!cfg_parse_memsize((yyvsp[(2) - (2)].str), &cfg_parser->cfg->so_sndbuf)) @@ -4574,8 +4629,8 @@ yyreduce: } break; - case 408: -#line 1441 "./util/configparser.y" + case 416: +#line 1451 "./util/configparser.y" { OUTYY(("P(server_so_reuseport:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -4586,8 +4641,8 @@ yyreduce: } break; - case 409: -#line 1451 "./util/configparser.y" + case 417: +#line 1461 "./util/configparser.y" { OUTYY(("P(server_ip_transparent:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -4598,8 +4653,8 @@ yyreduce: } break; - case 410: -#line 1461 "./util/configparser.y" + case 418: +#line 1471 "./util/configparser.y" { OUTYY(("P(server_ip_freebind:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -4610,8 +4665,8 @@ yyreduce: } break; - case 411: -#line 1471 "./util/configparser.y" + case 419: +#line 1481 "./util/configparser.y" { OUTYY(("P(server_ip_dscp:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0 && strcmp((yyvsp[(2) - (2)].str), "0") != 0) @@ -4626,8 +4681,8 @@ yyreduce: } break; - case 412: -#line 1485 "./util/configparser.y" + case 420: +#line 1495 "./util/configparser.y" { OUTYY(("P(server_stream_wait_size:%s)\n", (yyvsp[(2) - (2)].str))); if(!cfg_parse_memsize((yyvsp[(2) - (2)].str), &cfg_parser->cfg->stream_wait_size)) @@ -4636,8 +4691,8 @@ yyreduce: } break; - case 413: -#line 1493 "./util/configparser.y" + case 421: +#line 1503 "./util/configparser.y" { OUTYY(("P(server_edns_buffer_size:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0) @@ -4651,8 +4706,8 @@ yyreduce: } break; - case 414: -#line 1506 "./util/configparser.y" + case 422: +#line 1516 "./util/configparser.y" { OUTYY(("P(server_msg_buffer_size:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0) @@ -4664,8 +4719,8 @@ yyreduce: } break; - case 415: -#line 1517 "./util/configparser.y" + case 423: +#line 1527 "./util/configparser.y" { OUTYY(("P(server_msg_cache_size:%s)\n", (yyvsp[(2) - (2)].str))); if(!cfg_parse_memsize((yyvsp[(2) - (2)].str), &cfg_parser->cfg->msg_cache_size)) @@ -4674,8 +4729,8 @@ yyreduce: } break; - case 416: -#line 1525 "./util/configparser.y" + case 424: +#line 1535 "./util/configparser.y" { OUTYY(("P(server_msg_cache_slabs:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0) { @@ -4689,8 +4744,8 @@ yyreduce: } break; - case 417: -#line 1538 "./util/configparser.y" + case 425: +#line 1548 "./util/configparser.y" { OUTYY(("P(server_num_queries_per_thread:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0) @@ -4700,8 +4755,8 @@ yyreduce: } break; - case 418: -#line 1547 "./util/configparser.y" + case 426: +#line 1557 "./util/configparser.y" { OUTYY(("P(server_jostle_timeout:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0 && strcmp((yyvsp[(2) - (2)].str), "0") != 0) @@ -4711,8 +4766,8 @@ yyreduce: } break; - case 419: -#line 1556 "./util/configparser.y" + case 427: +#line 1566 "./util/configparser.y" { OUTYY(("P(server_delay_close:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0 && strcmp((yyvsp[(2) - (2)].str), "0") != 0) @@ -4722,8 +4777,8 @@ yyreduce: } break; - case 420: -#line 1565 "./util/configparser.y" + case 428: +#line 1575 "./util/configparser.y" { OUTYY(("P(server_udp_connect:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -4733,8 +4788,8 @@ yyreduce: } break; - case 421: -#line 1574 "./util/configparser.y" + case 429: +#line 1584 "./util/configparser.y" { OUTYY(("P(server_unblock_lan_zones:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -4745,8 +4800,8 @@ yyreduce: } break; - case 422: -#line 1584 "./util/configparser.y" + case 430: +#line 1594 "./util/configparser.y" { OUTYY(("P(server_insecure_lan_zones:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -4757,8 +4812,8 @@ yyreduce: } break; - case 423: -#line 1594 "./util/configparser.y" + case 431: +#line 1604 "./util/configparser.y" { OUTYY(("P(server_rrset_cache_size:%s)\n", (yyvsp[(2) - (2)].str))); if(!cfg_parse_memsize((yyvsp[(2) - (2)].str), &cfg_parser->cfg->rrset_cache_size)) @@ -4767,8 +4822,8 @@ yyreduce: } break; - case 424: -#line 1602 "./util/configparser.y" + case 432: +#line 1612 "./util/configparser.y" { OUTYY(("P(server_rrset_cache_slabs:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0) { @@ -4782,8 +4837,8 @@ yyreduce: } break; - case 425: -#line 1615 "./util/configparser.y" + case 433: +#line 1625 "./util/configparser.y" { OUTYY(("P(server_infra_host_ttl:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0 && strcmp((yyvsp[(2) - (2)].str), "0") != 0) @@ -4793,8 +4848,8 @@ yyreduce: } break; - case 426: -#line 1624 "./util/configparser.y" + case 434: +#line 1634 "./util/configparser.y" { OUTYY(("P(server_infra_lame_ttl:%s)\n", (yyvsp[(2) - (2)].str))); verbose(VERB_DETAIL, "ignored infra-lame-ttl: %s (option " @@ -4803,8 +4858,8 @@ yyreduce: } break; - case 427: -#line 1632 "./util/configparser.y" + case 435: +#line 1642 "./util/configparser.y" { OUTYY(("P(server_infra_cache_numhosts:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0) @@ -4814,8 +4869,8 @@ yyreduce: } break; - case 428: -#line 1641 "./util/configparser.y" + case 436: +#line 1651 "./util/configparser.y" { OUTYY(("P(server_infra_cache_lame_size:%s)\n", (yyvsp[(2) - (2)].str))); verbose(VERB_DETAIL, "ignored infra-cache-lame-size: %s " @@ -4824,8 +4879,8 @@ yyreduce: } break; - case 429: -#line 1649 "./util/configparser.y" + case 437: +#line 1659 "./util/configparser.y" { OUTYY(("P(server_infra_cache_slabs:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0) { @@ -4839,8 +4894,8 @@ yyreduce: } break; - case 430: -#line 1662 "./util/configparser.y" + case 438: +#line 1672 "./util/configparser.y" { OUTYY(("P(server_infra_cache_min_rtt:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0 && strcmp((yyvsp[(2) - (2)].str), "0") != 0) @@ -4850,8 +4905,8 @@ yyreduce: } break; - case 431: -#line 1671 "./util/configparser.y" + case 439: +#line 1681 "./util/configparser.y" { OUTYY(("P(server_infra_cache_max_rtt:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0 && strcmp((yyvsp[(2) - (2)].str), "0") != 0) @@ -4861,8 +4916,8 @@ yyreduce: } break; - case 432: -#line 1680 "./util/configparser.y" + case 440: +#line 1690 "./util/configparser.y" { OUTYY(("P(server_infra_keep_probing:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -4873,8 +4928,8 @@ yyreduce: } break; - case 433: -#line 1690 "./util/configparser.y" + case 441: +#line 1700 "./util/configparser.y" { OUTYY(("P(server_target_fetch_policy:%s)\n", (yyvsp[(2) - (2)].str))); free(cfg_parser->cfg->target_fetch_policy); @@ -4882,8 +4937,8 @@ yyreduce: } break; - case 434: -#line 1697 "./util/configparser.y" + case 442: +#line 1707 "./util/configparser.y" { OUTYY(("P(server_harden_short_bufsize:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -4894,8 +4949,8 @@ yyreduce: } break; - case 435: -#line 1707 "./util/configparser.y" + case 443: +#line 1717 "./util/configparser.y" { OUTYY(("P(server_harden_large_queries:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -4906,8 +4961,8 @@ yyreduce: } break; - case 436: -#line 1717 "./util/configparser.y" + case 444: +#line 1727 "./util/configparser.y" { OUTYY(("P(server_harden_glue:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -4918,8 +4973,8 @@ yyreduce: } break; - case 437: -#line 1727 "./util/configparser.y" + case 445: +#line 1737 "./util/configparser.y" { OUTYY(("P(server_harden_dnssec_stripped:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -4930,8 +4985,8 @@ yyreduce: } break; - case 438: -#line 1737 "./util/configparser.y" + case 446: +#line 1747 "./util/configparser.y" { OUTYY(("P(server_harden_below_nxdomain:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -4942,8 +4997,8 @@ yyreduce: } break; - case 439: -#line 1747 "./util/configparser.y" + case 447: +#line 1757 "./util/configparser.y" { OUTYY(("P(server_harden_referral_path:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -4954,8 +5009,8 @@ yyreduce: } break; - case 440: -#line 1757 "./util/configparser.y" + case 448: +#line 1767 "./util/configparser.y" { OUTYY(("P(server_harden_algo_downgrade:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -4966,8 +5021,8 @@ yyreduce: } break; - case 441: -#line 1767 "./util/configparser.y" + case 449: +#line 1777 "./util/configparser.y" { OUTYY(("P(server_use_caps_for_id:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -4978,8 +5033,8 @@ yyreduce: } break; - case 442: -#line 1777 "./util/configparser.y" + case 450: +#line 1787 "./util/configparser.y" { OUTYY(("P(server_caps_whitelist:%s)\n", (yyvsp[(2) - (2)].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->caps_whitelist, (yyvsp[(2) - (2)].str))) @@ -4987,8 +5042,8 @@ yyreduce: } break; - case 443: -#line 1784 "./util/configparser.y" + case 451: +#line 1794 "./util/configparser.y" { OUTYY(("P(server_private_address:%s)\n", (yyvsp[(2) - (2)].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->private_address, (yyvsp[(2) - (2)].str))) @@ -4996,8 +5051,8 @@ yyreduce: } break; - case 444: -#line 1791 "./util/configparser.y" + case 452: +#line 1801 "./util/configparser.y" { OUTYY(("P(server_private_domain:%s)\n", (yyvsp[(2) - (2)].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->private_domain, (yyvsp[(2) - (2)].str))) @@ -5005,8 +5060,8 @@ yyreduce: } break; - case 445: -#line 1798 "./util/configparser.y" + case 453: +#line 1808 "./util/configparser.y" { OUTYY(("P(server_prefetch:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -5016,8 +5071,8 @@ yyreduce: } break; - case 446: -#line 1807 "./util/configparser.y" + case 454: +#line 1817 "./util/configparser.y" { OUTYY(("P(server_prefetch_key:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -5027,8 +5082,8 @@ yyreduce: } break; - case 447: -#line 1816 "./util/configparser.y" + case 455: +#line 1826 "./util/configparser.y" { OUTYY(("P(server_deny_any:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -5038,8 +5093,8 @@ yyreduce: } break; - case 448: -#line 1825 "./util/configparser.y" + case 456: +#line 1835 "./util/configparser.y" { OUTYY(("P(server_unwanted_reply_threshold:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0 && strcmp((yyvsp[(2) - (2)].str), "0") != 0) @@ -5049,8 +5104,8 @@ yyreduce: } break; - case 449: -#line 1834 "./util/configparser.y" + case 457: +#line 1844 "./util/configparser.y" { OUTYY(("P(server_do_not_query_address:%s)\n", (yyvsp[(2) - (2)].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->donotqueryaddrs, (yyvsp[(2) - (2)].str))) @@ -5058,8 +5113,8 @@ yyreduce: } break; - case 450: -#line 1841 "./util/configparser.y" + case 458: +#line 1851 "./util/configparser.y" { OUTYY(("P(server_do_not_query_localhost:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -5070,30 +5125,29 @@ yyreduce: } break; - case 451: -#line 1851 "./util/configparser.y" + case 459: +#line 1861 "./util/configparser.y" { OUTYY(("P(server_access_control:%s %s)\n", (yyvsp[(2) - (3)].str), (yyvsp[(3) - (3)].str))); - if(strcmp((yyvsp[(3) - (3)].str), "deny")!=0 && strcmp((yyvsp[(3) - (3)].str), "refuse")!=0 && - strcmp((yyvsp[(3) - (3)].str), "deny_non_local")!=0 && - strcmp((yyvsp[(3) - (3)].str), "refuse_non_local")!=0 && - strcmp((yyvsp[(3) - (3)].str), "allow_setrd")!=0 && - strcmp((yyvsp[(3) - (3)].str), "allow")!=0 && - strcmp((yyvsp[(3) - (3)].str), "allow_snoop")!=0) { - yyerror("expected deny, refuse, deny_non_local, " - "refuse_non_local, allow, allow_setrd or " - "allow_snoop in access control action"); - free((yyvsp[(2) - (3)].str)); - free((yyvsp[(3) - (3)].str)); - } else { - if(!cfg_str2list_insert(&cfg_parser->cfg->acls, (yyvsp[(2) - (3)].str), (yyvsp[(3) - (3)].str))) - fatal_exit("out of memory adding acl"); - } + validate_acl_action((yyvsp[(3) - (3)].str)); + if(!cfg_str2list_insert(&cfg_parser->cfg->acls, (yyvsp[(2) - (3)].str), (yyvsp[(3) - (3)].str))) + fatal_exit("out of memory adding acl"); } break; - case 452: -#line 1871 "./util/configparser.y" + case 460: +#line 1869 "./util/configparser.y" + { + OUTYY(("P(server_interface_action:%s %s)\n", (yyvsp[(2) - (3)].str), (yyvsp[(3) - (3)].str))); + validate_acl_action((yyvsp[(3) - (3)].str)); + if(!cfg_str2list_insert( + &cfg_parser->cfg->interface_actions, (yyvsp[(2) - (3)].str), (yyvsp[(3) - (3)].str))) + fatal_exit("out of memory adding acl"); + } + break; + + case 461: +#line 1878 "./util/configparser.y" { OUTYY(("P(server_module_conf:%s)\n", (yyvsp[(2) - (2)].str))); free(cfg_parser->cfg->module_conf); @@ -5101,8 +5155,8 @@ yyreduce: } break; - case 453: -#line 1878 "./util/configparser.y" + case 462: +#line 1885 "./util/configparser.y" { OUTYY(("P(server_val_override_date:%s)\n", (yyvsp[(2) - (2)].str))); if(*(yyvsp[(2) - (2)].str) == '\0' || strcmp((yyvsp[(2) - (2)].str), "0") == 0) { @@ -5121,8 +5175,8 @@ yyreduce: } break; - case 454: -#line 1896 "./util/configparser.y" + case 463: +#line 1903 "./util/configparser.y" { OUTYY(("P(server_val_sig_skew_min:%s)\n", (yyvsp[(2) - (2)].str))); if(*(yyvsp[(2) - (2)].str) == '\0' || strcmp((yyvsp[(2) - (2)].str), "0") == 0) { @@ -5136,8 +5190,8 @@ yyreduce: } break; - case 455: -#line 1909 "./util/configparser.y" + case 464: +#line 1916 "./util/configparser.y" { OUTYY(("P(server_val_sig_skew_max:%s)\n", (yyvsp[(2) - (2)].str))); if(*(yyvsp[(2) - (2)].str) == '\0' || strcmp((yyvsp[(2) - (2)].str), "0") == 0) { @@ -5151,8 +5205,8 @@ yyreduce: } break; - case 456: -#line 1922 "./util/configparser.y" + case 465: +#line 1929 "./util/configparser.y" { OUTYY(("P(server_val_max_restart:%s)\n", (yyvsp[(2) - (2)].str))); if(*(yyvsp[(2) - (2)].str) == '\0' || strcmp((yyvsp[(2) - (2)].str), "0") == 0) { @@ -5166,8 +5220,8 @@ yyreduce: } break; - case 457: -#line 1935 "./util/configparser.y" + case 466: +#line 1942 "./util/configparser.y" { OUTYY(("P(server_cache_max_ttl:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0 && strcmp((yyvsp[(2) - (2)].str), "0") != 0) @@ -5177,8 +5231,8 @@ yyreduce: } break; - case 458: -#line 1944 "./util/configparser.y" + case 467: +#line 1951 "./util/configparser.y" { OUTYY(("P(server_cache_max_negative_ttl:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0 && strcmp((yyvsp[(2) - (2)].str), "0") != 0) @@ -5188,8 +5242,8 @@ yyreduce: } break; - case 459: -#line 1953 "./util/configparser.y" + case 468: +#line 1960 "./util/configparser.y" { OUTYY(("P(server_cache_min_ttl:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0 && strcmp((yyvsp[(2) - (2)].str), "0") != 0) @@ -5199,8 +5253,8 @@ yyreduce: } break; - case 460: -#line 1962 "./util/configparser.y" + case 469: +#line 1969 "./util/configparser.y" { OUTYY(("P(server_bogus_ttl:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0 && strcmp((yyvsp[(2) - (2)].str), "0") != 0) @@ -5210,8 +5264,8 @@ yyreduce: } break; - case 461: -#line 1971 "./util/configparser.y" + case 470: +#line 1978 "./util/configparser.y" { OUTYY(("P(server_val_clean_additional:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -5222,8 +5276,8 @@ yyreduce: } break; - case 462: -#line 1981 "./util/configparser.y" + case 471: +#line 1988 "./util/configparser.y" { OUTYY(("P(server_val_permissive_mode:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -5234,8 +5288,8 @@ yyreduce: } break; - case 463: -#line 1991 "./util/configparser.y" + case 472: +#line 1998 "./util/configparser.y" { OUTYY(("P(server_aggressive_nsec:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -5247,8 +5301,8 @@ yyreduce: } break; - case 464: -#line 2002 "./util/configparser.y" + case 473: +#line 2009 "./util/configparser.y" { OUTYY(("P(server_ignore_cd_flag:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -5258,8 +5312,8 @@ yyreduce: } break; - case 465: -#line 2011 "./util/configparser.y" + case 474: +#line 2018 "./util/configparser.y" { OUTYY(("P(server_serve_expired:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -5269,8 +5323,8 @@ yyreduce: } break; - case 466: -#line 2020 "./util/configparser.y" + case 475: +#line 2027 "./util/configparser.y" { OUTYY(("P(server_serve_expired_ttl:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0 && strcmp((yyvsp[(2) - (2)].str), "0") != 0) @@ -5280,8 +5334,8 @@ yyreduce: } break; - case 467: -#line 2029 "./util/configparser.y" + case 476: +#line 2036 "./util/configparser.y" { OUTYY(("P(server_serve_expired_ttl_reset:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -5291,8 +5345,8 @@ yyreduce: } break; - case 468: -#line 2038 "./util/configparser.y" + case 477: +#line 2045 "./util/configparser.y" { OUTYY(("P(server_serve_expired_reply_ttl:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0 && strcmp((yyvsp[(2) - (2)].str), "0") != 0) @@ -5302,8 +5356,8 @@ yyreduce: } break; - case 469: -#line 2047 "./util/configparser.y" + case 478: +#line 2054 "./util/configparser.y" { OUTYY(("P(server_serve_expired_client_timeout:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0 && strcmp((yyvsp[(2) - (2)].str), "0") != 0) @@ -5313,8 +5367,8 @@ yyreduce: } break; - case 470: -#line 2056 "./util/configparser.y" + case 479: +#line 2063 "./util/configparser.y" { OUTYY(("P(server_ede_serve_expired:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -5324,8 +5378,8 @@ yyreduce: } break; - case 471: -#line 2065 "./util/configparser.y" + case 480: +#line 2072 "./util/configparser.y" { OUTYY(("P(server_serve_original_ttl:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -5335,8 +5389,8 @@ yyreduce: } break; - case 472: -#line 2074 "./util/configparser.y" + case 481: +#line 2081 "./util/configparser.y" { OUTYY(("P(server_fake_dsa:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -5350,8 +5404,8 @@ yyreduce: } break; - case 473: -#line 2087 "./util/configparser.y" + case 482: +#line 2094 "./util/configparser.y" { OUTYY(("P(server_fake_sha1:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -5365,8 +5419,8 @@ yyreduce: } break; - case 474: -#line 2100 "./util/configparser.y" + case 483: +#line 2107 "./util/configparser.y" { OUTYY(("P(server_val_log_level:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0 && strcmp((yyvsp[(2) - (2)].str), "0") != 0) @@ -5376,8 +5430,8 @@ yyreduce: } break; - case 475: -#line 2109 "./util/configparser.y" + case 484: +#line 2116 "./util/configparser.y" { OUTYY(("P(server_val_nsec3_keysize_iterations:%s)\n", (yyvsp[(2) - (2)].str))); free(cfg_parser->cfg->val_nsec3_key_iterations); @@ -5385,8 +5439,8 @@ yyreduce: } break; - case 476: -#line 2116 "./util/configparser.y" + case 485: +#line 2123 "./util/configparser.y" { OUTYY(("P(server_zonemd_permissive_mode:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -5396,8 +5450,8 @@ yyreduce: } break; - case 477: -#line 2125 "./util/configparser.y" + case 486: +#line 2132 "./util/configparser.y" { OUTYY(("P(server_add_holddown:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0 && strcmp((yyvsp[(2) - (2)].str), "0") != 0) @@ -5407,8 +5461,8 @@ yyreduce: } break; - case 478: -#line 2134 "./util/configparser.y" + case 487: +#line 2141 "./util/configparser.y" { OUTYY(("P(server_del_holddown:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0 && strcmp((yyvsp[(2) - (2)].str), "0") != 0) @@ -5418,8 +5472,8 @@ yyreduce: } break; - case 479: -#line 2143 "./util/configparser.y" + case 488: +#line 2150 "./util/configparser.y" { OUTYY(("P(server_keep_missing:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0 && strcmp((yyvsp[(2) - (2)].str), "0") != 0) @@ -5429,8 +5483,8 @@ yyreduce: } break; - case 480: -#line 2152 "./util/configparser.y" + case 489: +#line 2159 "./util/configparser.y" { OUTYY(("P(server_permit_small_holddown:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -5441,8 +5495,8 @@ yyreduce: } break; - case 481: -#line 2161 "./util/configparser.y" + case 490: +#line 2168 "./util/configparser.y" { OUTYY(("P(server_key_cache_size:%s)\n", (yyvsp[(2) - (2)].str))); if(!cfg_parse_memsize((yyvsp[(2) - (2)].str), &cfg_parser->cfg->key_cache_size)) @@ -5451,8 +5505,8 @@ yyreduce: } break; - case 482: -#line 2169 "./util/configparser.y" + case 491: +#line 2176 "./util/configparser.y" { OUTYY(("P(server_key_cache_slabs:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0) { @@ -5466,8 +5520,8 @@ yyreduce: } break; - case 483: -#line 2182 "./util/configparser.y" + case 492: +#line 2189 "./util/configparser.y" { OUTYY(("P(server_neg_cache_size:%s)\n", (yyvsp[(2) - (2)].str))); if(!cfg_parse_memsize((yyvsp[(2) - (2)].str), &cfg_parser->cfg->neg_cache_size)) @@ -5476,8 +5530,8 @@ yyreduce: } break; - case 484: -#line 2190 "./util/configparser.y" + case 493: +#line 2197 "./util/configparser.y" { OUTYY(("P(server_local_zone:%s %s)\n", (yyvsp[(2) - (3)].str), (yyvsp[(3) - (3)].str))); if(strcmp((yyvsp[(3) - (3)].str), "static")!=0 && strcmp((yyvsp[(3) - (3)].str), "deny")!=0 && @@ -5533,8 +5587,8 @@ yyreduce: } break; - case 485: -#line 2245 "./util/configparser.y" + case 494: +#line 2252 "./util/configparser.y" { OUTYY(("P(server_local_data:%s)\n", (yyvsp[(2) - (2)].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->local_data, (yyvsp[(2) - (2)].str))) @@ -5542,8 +5596,8 @@ yyreduce: } break; - case 486: -#line 2252 "./util/configparser.y" + case 495: +#line 2259 "./util/configparser.y" { char* ptr; OUTYY(("P(server_local_data_ptr:%s)\n", (yyvsp[(2) - (2)].str))); @@ -5559,8 +5613,8 @@ yyreduce: } break; - case 487: -#line 2267 "./util/configparser.y" + case 496: +#line 2274 "./util/configparser.y" { OUTYY(("P(server_minimal_responses:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -5571,8 +5625,8 @@ yyreduce: } break; - case 488: -#line 2277 "./util/configparser.y" + case 497: +#line 2284 "./util/configparser.y" { OUTYY(("P(server_rrset_roundrobin:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -5583,8 +5637,8 @@ yyreduce: } break; - case 489: -#line 2287 "./util/configparser.y" + case 498: +#line 2294 "./util/configparser.y" { OUTYY(("P(server_unknown_server_time_limit:%s)\n", (yyvsp[(2) - (2)].str))); cfg_parser->cfg->unknown_server_time_limit = atoi((yyvsp[(2) - (2)].str)); @@ -5592,8 +5646,8 @@ yyreduce: } break; - case 490: -#line 2294 "./util/configparser.y" + case 499: +#line 2301 "./util/configparser.y" { OUTYY(("P(server_max_udp_size:%s)\n", (yyvsp[(2) - (2)].str))); cfg_parser->cfg->max_udp_size = atoi((yyvsp[(2) - (2)].str)); @@ -5601,8 +5655,8 @@ yyreduce: } break; - case 491: -#line 2301 "./util/configparser.y" + case 500: +#line 2308 "./util/configparser.y" { OUTYY(("P(dns64_prefix:%s)\n", (yyvsp[(2) - (2)].str))); free(cfg_parser->cfg->dns64_prefix); @@ -5610,8 +5664,8 @@ yyreduce: } break; - case 492: -#line 2308 "./util/configparser.y" + case 501: +#line 2315 "./util/configparser.y" { OUTYY(("P(server_dns64_synthall:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -5621,8 +5675,8 @@ yyreduce: } break; - case 493: -#line 2317 "./util/configparser.y" + case 502: +#line 2324 "./util/configparser.y" { OUTYY(("P(dns64_ignore_aaaa:%s)\n", (yyvsp[(2) - (2)].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->dns64_ignore_aaaa, @@ -5631,8 +5685,8 @@ yyreduce: } break; - case 494: -#line 2325 "./util/configparser.y" + case 503: +#line 2332 "./util/configparser.y" { char* p, *s = (yyvsp[(2) - (2)].str); OUTYY(("P(server_define_tag:%s)\n", (yyvsp[(2) - (2)].str))); @@ -5647,8 +5701,8 @@ yyreduce: } break; - case 495: -#line 2339 "./util/configparser.y" + case 504: +#line 2346 "./util/configparser.y" { size_t len = 0; uint8_t* bitlist = config_parse_taglist(cfg_parser->cfg, (yyvsp[(3) - (3)].str), @@ -5670,8 +5724,8 @@ yyreduce: } break; - case 496: -#line 2360 "./util/configparser.y" + case 505: +#line 2367 "./util/configparser.y" { size_t len = 0; uint8_t* bitlist = config_parse_taglist(cfg_parser->cfg, (yyvsp[(3) - (3)].str), @@ -5693,8 +5747,8 @@ yyreduce: } break; - case 497: -#line 2381 "./util/configparser.y" + case 506: +#line 2388 "./util/configparser.y" { OUTYY(("P(server_access_control_tag_action:%s %s %s)\n", (yyvsp[(2) - (4)].str), (yyvsp[(3) - (4)].str), (yyvsp[(4) - (4)].str))); if(!cfg_str3list_insert(&cfg_parser->cfg->acl_tag_actions, @@ -5707,8 +5761,8 @@ yyreduce: } break; - case 498: -#line 2393 "./util/configparser.y" + case 507: +#line 2400 "./util/configparser.y" { OUTYY(("P(server_access_control_tag_data:%s %s %s)\n", (yyvsp[(2) - (4)].str), (yyvsp[(3) - (4)].str), (yyvsp[(4) - (4)].str))); if(!cfg_str3list_insert(&cfg_parser->cfg->acl_tag_datas, @@ -5721,8 +5775,8 @@ yyreduce: } break; - case 499: -#line 2405 "./util/configparser.y" + case 508: +#line 2412 "./util/configparser.y" { OUTYY(("P(server_local_zone_override:%s %s %s)\n", (yyvsp[(2) - (4)].str), (yyvsp[(3) - (4)].str), (yyvsp[(4) - (4)].str))); if(!cfg_str3list_insert(&cfg_parser->cfg->local_zone_overrides, @@ -5735,8 +5789,8 @@ yyreduce: } break; - case 500: -#line 2417 "./util/configparser.y" + case 509: +#line 2424 "./util/configparser.y" { OUTYY(("P(server_access_control_view:%s %s)\n", (yyvsp[(2) - (3)].str), (yyvsp[(3) - (3)].str))); if(!cfg_str2list_insert(&cfg_parser->cfg->acl_view, @@ -5746,8 +5800,70 @@ yyreduce: } break; - case 501: -#line 2426 "./util/configparser.y" + case 510: +#line 2433 "./util/configparser.y" + { + size_t len = 0; + uint8_t* bitlist = config_parse_taglist(cfg_parser->cfg, (yyvsp[(3) - (3)].str), + &len); + free((yyvsp[(3) - (3)].str)); + OUTYY(("P(server_interface_tag:%s)\n", (yyvsp[(2) - (3)].str))); + if(!bitlist) { + yyerror("could not parse tags, (define-tag them first)"); + free((yyvsp[(2) - (3)].str)); + } + if(bitlist) { + if(!cfg_strbytelist_insert( + &cfg_parser->cfg->interface_tags, + (yyvsp[(2) - (3)].str), bitlist, len)) { + yyerror("out of memory"); + free((yyvsp[(2) - (3)].str)); + } + } + } + break; + + case 511: +#line 2454 "./util/configparser.y" + { + OUTYY(("P(server_interface_tag_action:%s %s %s)\n", (yyvsp[(2) - (4)].str), (yyvsp[(3) - (4)].str), (yyvsp[(4) - (4)].str))); + if(!cfg_str3list_insert(&cfg_parser->cfg->interface_tag_actions, + (yyvsp[(2) - (4)].str), (yyvsp[(3) - (4)].str), (yyvsp[(4) - (4)].str))) { + yyerror("out of memory"); + free((yyvsp[(2) - (4)].str)); + free((yyvsp[(3) - (4)].str)); + free((yyvsp[(4) - (4)].str)); + } + } + break; + + case 512: +#line 2466 "./util/configparser.y" + { + OUTYY(("P(server_interface_tag_data:%s %s %s)\n", (yyvsp[(2) - (4)].str), (yyvsp[(3) - (4)].str), (yyvsp[(4) - (4)].str))); + if(!cfg_str3list_insert(&cfg_parser->cfg->interface_tag_datas, + (yyvsp[(2) - (4)].str), (yyvsp[(3) - (4)].str), (yyvsp[(4) - (4)].str))) { + yyerror("out of memory"); + free((yyvsp[(2) - (4)].str)); + free((yyvsp[(3) - (4)].str)); + free((yyvsp[(4) - (4)].str)); + } + } + break; + + case 513: +#line 2478 "./util/configparser.y" + { + OUTYY(("P(server_interface_view:%s %s)\n", (yyvsp[(2) - (3)].str), (yyvsp[(3) - (3)].str))); + if(!cfg_str2list_insert(&cfg_parser->cfg->interface_view, + (yyvsp[(2) - (3)].str), (yyvsp[(3) - (3)].str))) { + yyerror("out of memory"); + } + } + break; + + case 514: +#line 2487 "./util/configparser.y" { size_t len = 0; uint8_t* bitlist = config_parse_taglist(cfg_parser->cfg, (yyvsp[(3) - (3)].str), @@ -5769,8 +5885,8 @@ yyreduce: } break; - case 502: -#line 2447 "./util/configparser.y" + case 515: +#line 2508 "./util/configparser.y" { OUTYY(("P(server_ip_ratelimit:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0 && strcmp((yyvsp[(2) - (2)].str), "0") != 0) @@ -5780,8 +5896,8 @@ yyreduce: } break; - case 503: -#line 2456 "./util/configparser.y" + case 516: +#line 2517 "./util/configparser.y" { OUTYY(("P(server_ratelimit:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0 && strcmp((yyvsp[(2) - (2)].str), "0") != 0) @@ -5791,8 +5907,8 @@ yyreduce: } break; - case 504: -#line 2465 "./util/configparser.y" + case 517: +#line 2526 "./util/configparser.y" { OUTYY(("P(server_ip_ratelimit_size:%s)\n", (yyvsp[(2) - (2)].str))); if(!cfg_parse_memsize((yyvsp[(2) - (2)].str), &cfg_parser->cfg->ip_ratelimit_size)) @@ -5801,8 +5917,8 @@ yyreduce: } break; - case 505: -#line 2473 "./util/configparser.y" + case 518: +#line 2534 "./util/configparser.y" { OUTYY(("P(server_ratelimit_size:%s)\n", (yyvsp[(2) - (2)].str))); if(!cfg_parse_memsize((yyvsp[(2) - (2)].str), &cfg_parser->cfg->ratelimit_size)) @@ -5811,8 +5927,8 @@ yyreduce: } break; - case 506: -#line 2481 "./util/configparser.y" + case 519: +#line 2542 "./util/configparser.y" { OUTYY(("P(server_ip_ratelimit_slabs:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0) { @@ -5826,8 +5942,8 @@ yyreduce: } break; - case 507: -#line 2494 "./util/configparser.y" + case 520: +#line 2555 "./util/configparser.y" { OUTYY(("P(server_ratelimit_slabs:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0) { @@ -5841,8 +5957,8 @@ yyreduce: } break; - case 508: -#line 2507 "./util/configparser.y" + case 521: +#line 2568 "./util/configparser.y" { OUTYY(("P(server_ratelimit_for_domain:%s %s)\n", (yyvsp[(2) - (3)].str), (yyvsp[(3) - (3)].str))); if(atoi((yyvsp[(3) - (3)].str)) == 0 && strcmp((yyvsp[(3) - (3)].str), "0") != 0) { @@ -5858,8 +5974,8 @@ yyreduce: } break; - case 509: -#line 2522 "./util/configparser.y" + case 522: +#line 2583 "./util/configparser.y" { OUTYY(("P(server_ratelimit_below_domain:%s %s)\n", (yyvsp[(2) - (3)].str), (yyvsp[(3) - (3)].str))); if(atoi((yyvsp[(3) - (3)].str)) == 0 && strcmp((yyvsp[(3) - (3)].str), "0") != 0) { @@ -5875,8 +5991,8 @@ yyreduce: } break; - case 510: -#line 2537 "./util/configparser.y" + case 523: +#line 2598 "./util/configparser.y" { OUTYY(("P(server_ip_ratelimit_factor:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0 && strcmp((yyvsp[(2) - (2)].str), "0") != 0) @@ -5886,8 +6002,8 @@ yyreduce: } break; - case 511: -#line 2546 "./util/configparser.y" + case 524: +#line 2607 "./util/configparser.y" { OUTYY(("P(server_ratelimit_factor:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0 && strcmp((yyvsp[(2) - (2)].str), "0") != 0) @@ -5897,8 +6013,8 @@ yyreduce: } break; - case 512: -#line 2555 "./util/configparser.y" + case 525: +#line 2616 "./util/configparser.y" { OUTYY(("P(server_ip_ratelimit_backoff:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -5909,8 +6025,8 @@ yyreduce: } break; - case 513: -#line 2565 "./util/configparser.y" + case 526: +#line 2626 "./util/configparser.y" { OUTYY(("P(server_ratelimit_backoff:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -5921,8 +6037,8 @@ yyreduce: } break; - case 514: -#line 2575 "./util/configparser.y" + case 527: +#line 2636 "./util/configparser.y" { OUTYY(("P(server_outbound_msg_retry:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0 && strcmp((yyvsp[(2) - (2)].str), "0") != 0) @@ -5932,16 +6048,16 @@ yyreduce: } break; - case 515: -#line 2584 "./util/configparser.y" + case 528: +#line 2645 "./util/configparser.y" { OUTYY(("P(low-rtt option is deprecated, use fast-server-num instead)\n")); free((yyvsp[(2) - (2)].str)); } break; - case 516: -#line 2590 "./util/configparser.y" + case 529: +#line 2651 "./util/configparser.y" { OUTYY(("P(server_fast_server_num:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) <= 0) @@ -5951,8 +6067,8 @@ yyreduce: } break; - case 517: -#line 2599 "./util/configparser.y" + case 530: +#line 2660 "./util/configparser.y" { OUTYY(("P(server_fast_server_permil:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0 && strcmp((yyvsp[(2) - (2)].str), "0") != 0) @@ -5962,8 +6078,8 @@ yyreduce: } break; - case 518: -#line 2608 "./util/configparser.y" + case 531: +#line 2669 "./util/configparser.y" { OUTYY(("P(server_qname_minimisation:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -5974,8 +6090,8 @@ yyreduce: } break; - case 519: -#line 2618 "./util/configparser.y" + case 532: +#line 2679 "./util/configparser.y" { OUTYY(("P(server_qname_minimisation_strict:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -5986,8 +6102,8 @@ yyreduce: } break; - case 520: -#line 2628 "./util/configparser.y" + case 533: +#line 2689 "./util/configparser.y" { OUTYY(("P(server_pad_responses:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -5998,8 +6114,8 @@ yyreduce: } break; - case 521: -#line 2638 "./util/configparser.y" + case 534: +#line 2699 "./util/configparser.y" { OUTYY(("P(server_pad_responses_block_size:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0) @@ -6009,8 +6125,8 @@ yyreduce: } break; - case 522: -#line 2647 "./util/configparser.y" + case 535: +#line 2708 "./util/configparser.y" { OUTYY(("P(server_pad_queries:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -6021,8 +6137,8 @@ yyreduce: } break; - case 523: -#line 2657 "./util/configparser.y" + case 536: +#line 2718 "./util/configparser.y" { OUTYY(("P(server_pad_queries_block_size:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0) @@ -6032,8 +6148,8 @@ yyreduce: } break; - case 524: -#line 2666 "./util/configparser.y" + case 537: +#line 2727 "./util/configparser.y" { #ifdef USE_IPSECMOD OUTYY(("P(server_ipsecmod_enabled:%s)\n", (yyvsp[(2) - (2)].str))); @@ -6047,8 +6163,8 @@ yyreduce: } break; - case 525: -#line 2679 "./util/configparser.y" + case 538: +#line 2740 "./util/configparser.y" { #ifdef USE_IPSECMOD OUTYY(("P(server_ipsecmod_ignore_bogus:%s)\n", (yyvsp[(2) - (2)].str))); @@ -6062,8 +6178,8 @@ yyreduce: } break; - case 526: -#line 2692 "./util/configparser.y" + case 539: +#line 2753 "./util/configparser.y" { #ifdef USE_IPSECMOD OUTYY(("P(server_ipsecmod_hook:%s)\n", (yyvsp[(2) - (2)].str))); @@ -6076,8 +6192,8 @@ yyreduce: } break; - case 527: -#line 2704 "./util/configparser.y" + case 540: +#line 2765 "./util/configparser.y" { #ifdef USE_IPSECMOD OUTYY(("P(server_ipsecmod_max_ttl:%s)\n", (yyvsp[(2) - (2)].str))); @@ -6092,8 +6208,8 @@ yyreduce: } break; - case 528: -#line 2718 "./util/configparser.y" + case 541: +#line 2779 "./util/configparser.y" { #ifdef USE_IPSECMOD OUTYY(("P(server_ipsecmod_whitelist:%s)\n", (yyvsp[(2) - (2)].str))); @@ -6106,8 +6222,8 @@ yyreduce: } break; - case 529: -#line 2730 "./util/configparser.y" + case 542: +#line 2791 "./util/configparser.y" { #ifdef USE_IPSECMOD OUTYY(("P(server_ipsecmod_strict:%s)\n", (yyvsp[(2) - (2)].str))); @@ -6122,8 +6238,8 @@ yyreduce: } break; - case 530: -#line 2744 "./util/configparser.y" + case 543: +#line 2805 "./util/configparser.y" { OUTYY(("P(server_edns_client_string:%s %s)\n", (yyvsp[(2) - (3)].str), (yyvsp[(3) - (3)].str))); if(!cfg_str2list_insert( @@ -6133,8 +6249,8 @@ yyreduce: } break; - case 531: -#line 2753 "./util/configparser.y" + case 544: +#line 2814 "./util/configparser.y" { OUTYY(("P(edns_client_string_opcode:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0 && strcmp((yyvsp[(2) - (2)].str), "0") != 0) @@ -6146,8 +6262,8 @@ yyreduce: } break; - case 532: -#line 2764 "./util/configparser.y" + case 545: +#line 2825 "./util/configparser.y" { OUTYY(("P(server_ede:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -6157,8 +6273,8 @@ yyreduce: } break; - case 533: -#line 2773 "./util/configparser.y" + case 546: +#line 2834 "./util/configparser.y" { OUTYY(("P(server_upstream_cookies:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -6168,8 +6284,17 @@ yyreduce: } break; - case 534: -#line 2781 "./util/configparser.y" + case 547: +#line 2842 "./util/configparser.y" + { + OUTYY(("P(server_proxy_protocol_port:%s)\n", (yyvsp[(2) - (2)].str))); + if(!cfg_strlist_insert(&cfg_parser->cfg->proxy_protocol_port, (yyvsp[(2) - (2)].str))) + yyerror("out of memory"); + } + break; + + case 548: +#line 2849 "./util/configparser.y" { OUTYY(("P(name:%s)\n", (yyvsp[(2) - (2)].str))); if(cfg_parser->cfg->stubs->name) @@ -6180,8 +6305,8 @@ yyreduce: } break; - case 535: -#line 2791 "./util/configparser.y" + case 549: +#line 2859 "./util/configparser.y" { OUTYY(("P(stub-host:%s)\n", (yyvsp[(2) - (2)].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->stubs->hosts, (yyvsp[(2) - (2)].str))) @@ -6189,8 +6314,8 @@ yyreduce: } break; - case 536: -#line 2798 "./util/configparser.y" + case 550: +#line 2866 "./util/configparser.y" { OUTYY(("P(stub-addr:%s)\n", (yyvsp[(2) - (2)].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->stubs->addrs, (yyvsp[(2) - (2)].str))) @@ -6198,8 +6323,8 @@ yyreduce: } break; - case 537: -#line 2805 "./util/configparser.y" + case 551: +#line 2873 "./util/configparser.y" { OUTYY(("P(stub-first:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -6209,8 +6334,8 @@ yyreduce: } break; - case 538: -#line 2814 "./util/configparser.y" + case 552: +#line 2882 "./util/configparser.y" { OUTYY(("P(stub-no-cache:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -6220,8 +6345,8 @@ yyreduce: } break; - case 539: -#line 2823 "./util/configparser.y" + case 553: +#line 2891 "./util/configparser.y" { OUTYY(("P(stub-ssl-upstream:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -6232,8 +6357,8 @@ yyreduce: } break; - case 540: -#line 2833 "./util/configparser.y" + case 554: +#line 2901 "./util/configparser.y" { OUTYY(("P(stub-tcp-upstream:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -6244,8 +6369,8 @@ yyreduce: } break; - case 541: -#line 2843 "./util/configparser.y" + case 555: +#line 2911 "./util/configparser.y" { OUTYY(("P(stub-prime:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -6256,8 +6381,8 @@ yyreduce: } break; - case 542: -#line 2853 "./util/configparser.y" + case 556: +#line 2921 "./util/configparser.y" { OUTYY(("P(name:%s)\n", (yyvsp[(2) - (2)].str))); if(cfg_parser->cfg->forwards->name) @@ -6268,8 +6393,8 @@ yyreduce: } break; - case 543: -#line 2863 "./util/configparser.y" + case 557: +#line 2931 "./util/configparser.y" { OUTYY(("P(forward-host:%s)\n", (yyvsp[(2) - (2)].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->forwards->hosts, (yyvsp[(2) - (2)].str))) @@ -6277,8 +6402,8 @@ yyreduce: } break; - case 544: -#line 2870 "./util/configparser.y" + case 558: +#line 2938 "./util/configparser.y" { OUTYY(("P(forward-addr:%s)\n", (yyvsp[(2) - (2)].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->forwards->addrs, (yyvsp[(2) - (2)].str))) @@ -6286,8 +6411,8 @@ yyreduce: } break; - case 545: -#line 2877 "./util/configparser.y" + case 559: +#line 2945 "./util/configparser.y" { OUTYY(("P(forward-first:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -6297,8 +6422,8 @@ yyreduce: } break; - case 546: -#line 2886 "./util/configparser.y" + case 560: +#line 2954 "./util/configparser.y" { OUTYY(("P(forward-no-cache:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -6308,8 +6433,8 @@ yyreduce: } break; - case 547: -#line 2895 "./util/configparser.y" + case 561: +#line 2963 "./util/configparser.y" { OUTYY(("P(forward-ssl-upstream:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -6320,8 +6445,8 @@ yyreduce: } break; - case 548: -#line 2905 "./util/configparser.y" + case 562: +#line 2973 "./util/configparser.y" { OUTYY(("P(forward-tcp-upstream:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -6332,8 +6457,8 @@ yyreduce: } break; - case 549: -#line 2915 "./util/configparser.y" + case 563: +#line 2983 "./util/configparser.y" { OUTYY(("P(name:%s)\n", (yyvsp[(2) - (2)].str))); if(cfg_parser->cfg->auths->name) @@ -6344,8 +6469,8 @@ yyreduce: } break; - case 550: -#line 2925 "./util/configparser.y" + case 564: +#line 2993 "./util/configparser.y" { OUTYY(("P(zonefile:%s)\n", (yyvsp[(2) - (2)].str))); free(cfg_parser->cfg->auths->zonefile); @@ -6353,8 +6478,8 @@ yyreduce: } break; - case 551: -#line 2932 "./util/configparser.y" + case 565: +#line 3000 "./util/configparser.y" { OUTYY(("P(master:%s)\n", (yyvsp[(2) - (2)].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->auths->masters, (yyvsp[(2) - (2)].str))) @@ -6362,8 +6487,8 @@ yyreduce: } break; - case 552: -#line 2939 "./util/configparser.y" + case 566: +#line 3007 "./util/configparser.y" { OUTYY(("P(url:%s)\n", (yyvsp[(2) - (2)].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->auths->urls, (yyvsp[(2) - (2)].str))) @@ -6371,8 +6496,8 @@ yyreduce: } break; - case 553: -#line 2946 "./util/configparser.y" + case 567: +#line 3014 "./util/configparser.y" { OUTYY(("P(allow-notify:%s)\n", (yyvsp[(2) - (2)].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->auths->allow_notify, @@ -6381,8 +6506,8 @@ yyreduce: } break; - case 554: -#line 2954 "./util/configparser.y" + case 568: +#line 3022 "./util/configparser.y" { OUTYY(("P(zonemd-check:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -6393,8 +6518,8 @@ yyreduce: } break; - case 555: -#line 2964 "./util/configparser.y" + case 569: +#line 3032 "./util/configparser.y" { OUTYY(("P(zonemd-reject-absence:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -6405,8 +6530,8 @@ yyreduce: } break; - case 556: -#line 2974 "./util/configparser.y" + case 570: +#line 3042 "./util/configparser.y" { OUTYY(("P(for-downstream:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -6417,8 +6542,8 @@ yyreduce: } break; - case 557: -#line 2984 "./util/configparser.y" + case 571: +#line 3052 "./util/configparser.y" { OUTYY(("P(for-upstream:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -6429,8 +6554,8 @@ yyreduce: } break; - case 558: -#line 2994 "./util/configparser.y" + case 572: +#line 3062 "./util/configparser.y" { OUTYY(("P(fallback-enabled:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -6441,8 +6566,8 @@ yyreduce: } break; - case 559: -#line 3004 "./util/configparser.y" + case 573: +#line 3072 "./util/configparser.y" { OUTYY(("P(name:%s)\n", (yyvsp[(2) - (2)].str))); if(cfg_parser->cfg->views->name) @@ -6453,8 +6578,8 @@ yyreduce: } break; - case 560: -#line 3014 "./util/configparser.y" + case 574: +#line 3082 "./util/configparser.y" { OUTYY(("P(view_local_zone:%s %s)\n", (yyvsp[(2) - (3)].str), (yyvsp[(3) - (3)].str))); if(strcmp((yyvsp[(3) - (3)].str), "static")!=0 && strcmp((yyvsp[(3) - (3)].str), "deny")!=0 && @@ -6511,8 +6636,8 @@ yyreduce: } break; - case 561: -#line 3070 "./util/configparser.y" + case 575: +#line 3138 "./util/configparser.y" { OUTYY(("P(view_response_ip:%s %s)\n", (yyvsp[(2) - (3)].str), (yyvsp[(3) - (3)].str))); validate_respip_action((yyvsp[(3) - (3)].str)); @@ -6523,8 +6648,8 @@ yyreduce: } break; - case 562: -#line 3080 "./util/configparser.y" + case 576: +#line 3148 "./util/configparser.y" { OUTYY(("P(view_response_ip_data:%s)\n", (yyvsp[(2) - (3)].str))); if(!cfg_str2list_insert( @@ -6533,8 +6658,8 @@ yyreduce: } break; - case 563: -#line 3088 "./util/configparser.y" + case 577: +#line 3156 "./util/configparser.y" { OUTYY(("P(view_local_data:%s)\n", (yyvsp[(2) - (2)].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->views->local_data, (yyvsp[(2) - (2)].str))) { @@ -6543,8 +6668,8 @@ yyreduce: } break; - case 564: -#line 3096 "./util/configparser.y" + case 578: +#line 3164 "./util/configparser.y" { char* ptr; OUTYY(("P(view_local_data_ptr:%s)\n", (yyvsp[(2) - (2)].str))); @@ -6560,8 +6685,8 @@ yyreduce: } break; - case 565: -#line 3111 "./util/configparser.y" + case 579: +#line 3179 "./util/configparser.y" { OUTYY(("P(view-first:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -6571,16 +6696,16 @@ yyreduce: } break; - case 566: -#line 3120 "./util/configparser.y" + case 580: +#line 3188 "./util/configparser.y" { OUTYY(("\nP(remote-control:)\n")); cfg_parser->started_toplevel = 1; } break; - case 577: -#line 3132 "./util/configparser.y" + case 591: +#line 3200 "./util/configparser.y" { OUTYY(("P(control_enable:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -6591,8 +6716,8 @@ yyreduce: } break; - case 578: -#line 3142 "./util/configparser.y" + case 592: +#line 3210 "./util/configparser.y" { OUTYY(("P(control_port:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0) @@ -6602,8 +6727,8 @@ yyreduce: } break; - case 579: -#line 3151 "./util/configparser.y" + case 593: +#line 3219 "./util/configparser.y" { OUTYY(("P(control_interface:%s)\n", (yyvsp[(2) - (2)].str))); if(!cfg_strlist_append(&cfg_parser->cfg->control_ifs, (yyvsp[(2) - (2)].str))) @@ -6611,8 +6736,8 @@ yyreduce: } break; - case 580: -#line 3158 "./util/configparser.y" + case 594: +#line 3226 "./util/configparser.y" { OUTYY(("P(control_use_cert:%s)\n", (yyvsp[(2) - (2)].str))); cfg_parser->cfg->control_use_cert = (strcmp((yyvsp[(2) - (2)].str), "yes")==0); @@ -6620,8 +6745,8 @@ yyreduce: } break; - case 581: -#line 3165 "./util/configparser.y" + case 595: +#line 3233 "./util/configparser.y" { OUTYY(("P(rc_server_key_file:%s)\n", (yyvsp[(2) - (2)].str))); free(cfg_parser->cfg->server_key_file); @@ -6629,8 +6754,8 @@ yyreduce: } break; - case 582: -#line 3172 "./util/configparser.y" + case 596: +#line 3240 "./util/configparser.y" { OUTYY(("P(rc_server_cert_file:%s)\n", (yyvsp[(2) - (2)].str))); free(cfg_parser->cfg->server_cert_file); @@ -6638,8 +6763,8 @@ yyreduce: } break; - case 583: -#line 3179 "./util/configparser.y" + case 597: +#line 3247 "./util/configparser.y" { OUTYY(("P(rc_control_key_file:%s)\n", (yyvsp[(2) - (2)].str))); free(cfg_parser->cfg->control_key_file); @@ -6647,8 +6772,8 @@ yyreduce: } break; - case 584: -#line 3186 "./util/configparser.y" + case 598: +#line 3254 "./util/configparser.y" { OUTYY(("P(rc_control_cert_file:%s)\n", (yyvsp[(2) - (2)].str))); free(cfg_parser->cfg->control_cert_file); @@ -6656,16 +6781,16 @@ yyreduce: } break; - case 585: -#line 3193 "./util/configparser.y" + case 599: +#line 3261 "./util/configparser.y" { OUTYY(("\nP(dnstap:)\n")); cfg_parser->started_toplevel = 1; } break; - case 607: -#line 3214 "./util/configparser.y" + case 621: +#line 3282 "./util/configparser.y" { OUTYY(("P(dt_dnstap_enable:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -6675,8 +6800,8 @@ yyreduce: } break; - case 608: -#line 3223 "./util/configparser.y" + case 622: +#line 3291 "./util/configparser.y" { OUTYY(("P(dt_dnstap_bidirectional:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -6687,8 +6812,8 @@ yyreduce: } break; - case 609: -#line 3233 "./util/configparser.y" + case 623: +#line 3301 "./util/configparser.y" { OUTYY(("P(dt_dnstap_socket_path:%s)\n", (yyvsp[(2) - (2)].str))); free(cfg_parser->cfg->dnstap_socket_path); @@ -6696,8 +6821,8 @@ yyreduce: } break; - case 610: -#line 3240 "./util/configparser.y" + case 624: +#line 3308 "./util/configparser.y" { OUTYY(("P(dt_dnstap_ip:%s)\n", (yyvsp[(2) - (2)].str))); free(cfg_parser->cfg->dnstap_ip); @@ -6705,8 +6830,8 @@ yyreduce: } break; - case 611: -#line 3247 "./util/configparser.y" + case 625: +#line 3315 "./util/configparser.y" { OUTYY(("P(dt_dnstap_tls:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -6716,8 +6841,8 @@ yyreduce: } break; - case 612: -#line 3256 "./util/configparser.y" + case 626: +#line 3324 "./util/configparser.y" { OUTYY(("P(dt_dnstap_tls_server_name:%s)\n", (yyvsp[(2) - (2)].str))); free(cfg_parser->cfg->dnstap_tls_server_name); @@ -6725,8 +6850,8 @@ yyreduce: } break; - case 613: -#line 3263 "./util/configparser.y" + case 627: +#line 3331 "./util/configparser.y" { OUTYY(("P(dt_dnstap_tls_cert_bundle:%s)\n", (yyvsp[(2) - (2)].str))); free(cfg_parser->cfg->dnstap_tls_cert_bundle); @@ -6734,8 +6859,8 @@ yyreduce: } break; - case 614: -#line 3270 "./util/configparser.y" + case 628: +#line 3338 "./util/configparser.y" { OUTYY(("P(dt_dnstap_tls_client_key_file:%s)\n", (yyvsp[(2) - (2)].str))); free(cfg_parser->cfg->dnstap_tls_client_key_file); @@ -6743,8 +6868,8 @@ yyreduce: } break; - case 615: -#line 3277 "./util/configparser.y" + case 629: +#line 3345 "./util/configparser.y" { OUTYY(("P(dt_dnstap_tls_client_cert_file:%s)\n", (yyvsp[(2) - (2)].str))); free(cfg_parser->cfg->dnstap_tls_client_cert_file); @@ -6752,8 +6877,8 @@ yyreduce: } break; - case 616: -#line 3284 "./util/configparser.y" + case 630: +#line 3352 "./util/configparser.y" { OUTYY(("P(dt_dnstap_send_identity:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -6763,8 +6888,8 @@ yyreduce: } break; - case 617: -#line 3293 "./util/configparser.y" + case 631: +#line 3361 "./util/configparser.y" { OUTYY(("P(dt_dnstap_send_version:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -6774,8 +6899,8 @@ yyreduce: } break; - case 618: -#line 3302 "./util/configparser.y" + case 632: +#line 3370 "./util/configparser.y" { OUTYY(("P(dt_dnstap_identity:%s)\n", (yyvsp[(2) - (2)].str))); free(cfg_parser->cfg->dnstap_identity); @@ -6783,8 +6908,8 @@ yyreduce: } break; - case 619: -#line 3309 "./util/configparser.y" + case 633: +#line 3377 "./util/configparser.y" { OUTYY(("P(dt_dnstap_version:%s)\n", (yyvsp[(2) - (2)].str))); free(cfg_parser->cfg->dnstap_version); @@ -6792,8 +6917,8 @@ yyreduce: } break; - case 620: -#line 3316 "./util/configparser.y" + case 634: +#line 3384 "./util/configparser.y" { OUTYY(("P(dt_dnstap_log_resolver_query_messages:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -6804,8 +6929,8 @@ yyreduce: } break; - case 621: -#line 3326 "./util/configparser.y" + case 635: +#line 3394 "./util/configparser.y" { OUTYY(("P(dt_dnstap_log_resolver_response_messages:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -6816,8 +6941,8 @@ yyreduce: } break; - case 622: -#line 3336 "./util/configparser.y" + case 636: +#line 3404 "./util/configparser.y" { OUTYY(("P(dt_dnstap_log_client_query_messages:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -6828,8 +6953,8 @@ yyreduce: } break; - case 623: -#line 3346 "./util/configparser.y" + case 637: +#line 3414 "./util/configparser.y" { OUTYY(("P(dt_dnstap_log_client_response_messages:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -6840,8 +6965,8 @@ yyreduce: } break; - case 624: -#line 3356 "./util/configparser.y" + case 638: +#line 3424 "./util/configparser.y" { OUTYY(("P(dt_dnstap_log_forwarder_query_messages:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -6852,8 +6977,8 @@ yyreduce: } break; - case 625: -#line 3366 "./util/configparser.y" + case 639: +#line 3434 "./util/configparser.y" { OUTYY(("P(dt_dnstap_log_forwarder_response_messages:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -6864,16 +6989,16 @@ yyreduce: } break; - case 626: -#line 3376 "./util/configparser.y" + case 640: +#line 3444 "./util/configparser.y" { OUTYY(("\nP(python:)\n")); cfg_parser->started_toplevel = 1; } break; - case 630: -#line 3386 "./util/configparser.y" + case 644: +#line 3454 "./util/configparser.y" { OUTYY(("P(python-script:%s)\n", (yyvsp[(2) - (2)].str))); if(!cfg_strlist_append_ex(&cfg_parser->cfg->python_script, (yyvsp[(2) - (2)].str))) @@ -6881,16 +7006,16 @@ yyreduce: } break; - case 631: -#line 3392 "./util/configparser.y" + case 645: +#line 3460 "./util/configparser.y" { OUTYY(("\nP(dynlib:)\n")); cfg_parser->started_toplevel = 1; } break; - case 635: -#line 3402 "./util/configparser.y" + case 649: +#line 3470 "./util/configparser.y" { OUTYY(("P(dynlib-file:%s)\n", (yyvsp[(2) - (2)].str))); if(!cfg_strlist_append_ex(&cfg_parser->cfg->dynlib_file, (yyvsp[(2) - (2)].str))) @@ -6898,8 +7023,8 @@ yyreduce: } break; - case 636: -#line 3408 "./util/configparser.y" + case 650: +#line 3476 "./util/configparser.y" { OUTYY(("P(disable_dnssec_lame_check:%s)\n", (yyvsp[(2) - (2)].str))); if (strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -6910,8 +7035,8 @@ yyreduce: } break; - case 637: -#line 3418 "./util/configparser.y" + case 651: +#line 3486 "./util/configparser.y" { OUTYY(("P(server_log_identity:%s)\n", (yyvsp[(2) - (2)].str))); free(cfg_parser->cfg->log_identity); @@ -6919,8 +7044,8 @@ yyreduce: } break; - case 638: -#line 3425 "./util/configparser.y" + case 652: +#line 3493 "./util/configparser.y" { OUTYY(("P(server_response_ip:%s %s)\n", (yyvsp[(2) - (3)].str), (yyvsp[(3) - (3)].str))); validate_respip_action((yyvsp[(3) - (3)].str)); @@ -6930,8 +7055,8 @@ yyreduce: } break; - case 639: -#line 3434 "./util/configparser.y" + case 653: +#line 3502 "./util/configparser.y" { OUTYY(("P(server_response_ip_data:%s)\n", (yyvsp[(2) - (3)].str))); if(!cfg_str2list_insert(&cfg_parser->cfg->respip_data, @@ -6940,16 +7065,16 @@ yyreduce: } break; - case 640: -#line 3442 "./util/configparser.y" + case 654: +#line 3510 "./util/configparser.y" { OUTYY(("\nP(dnscrypt:)\n")); cfg_parser->started_toplevel = 1; } break; - case 653: -#line 3459 "./util/configparser.y" + case 667: +#line 3527 "./util/configparser.y" { OUTYY(("P(dnsc_dnscrypt_enable:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -6959,8 +7084,8 @@ yyreduce: } break; - case 654: -#line 3469 "./util/configparser.y" + case 668: +#line 3537 "./util/configparser.y" { OUTYY(("P(dnsc_dnscrypt_port:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0) @@ -6970,8 +7095,8 @@ yyreduce: } break; - case 655: -#line 3478 "./util/configparser.y" + case 669: +#line 3546 "./util/configparser.y" { OUTYY(("P(dnsc_dnscrypt_provider:%s)\n", (yyvsp[(2) - (2)].str))); free(cfg_parser->cfg->dnscrypt_provider); @@ -6979,8 +7104,8 @@ yyreduce: } break; - case 656: -#line 3485 "./util/configparser.y" + case 670: +#line 3553 "./util/configparser.y" { OUTYY(("P(dnsc_dnscrypt_provider_cert:%s)\n", (yyvsp[(2) - (2)].str))); if(cfg_strlist_find(cfg_parser->cfg->dnscrypt_provider_cert, (yyvsp[(2) - (2)].str))) @@ -6990,8 +7115,8 @@ yyreduce: } break; - case 657: -#line 3494 "./util/configparser.y" + case 671: +#line 3562 "./util/configparser.y" { OUTYY(("P(dnsc_dnscrypt_provider_cert_rotated:%s)\n", (yyvsp[(2) - (2)].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->dnscrypt_provider_cert_rotated, (yyvsp[(2) - (2)].str))) @@ -6999,8 +7124,8 @@ yyreduce: } break; - case 658: -#line 3501 "./util/configparser.y" + case 672: +#line 3569 "./util/configparser.y" { OUTYY(("P(dnsc_dnscrypt_secret_key:%s)\n", (yyvsp[(2) - (2)].str))); if(cfg_strlist_find(cfg_parser->cfg->dnscrypt_secret_key, (yyvsp[(2) - (2)].str))) @@ -7010,8 +7135,8 @@ yyreduce: } break; - case 659: -#line 3510 "./util/configparser.y" + case 673: +#line 3578 "./util/configparser.y" { OUTYY(("P(dnscrypt_shared_secret_cache_size:%s)\n", (yyvsp[(2) - (2)].str))); if(!cfg_parse_memsize((yyvsp[(2) - (2)].str), &cfg_parser->cfg->dnscrypt_shared_secret_cache_size)) @@ -7020,8 +7145,8 @@ yyreduce: } break; - case 660: -#line 3518 "./util/configparser.y" + case 674: +#line 3586 "./util/configparser.y" { OUTYY(("P(dnscrypt_shared_secret_cache_slabs:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0) { @@ -7035,8 +7160,8 @@ yyreduce: } break; - case 661: -#line 3531 "./util/configparser.y" + case 675: +#line 3599 "./util/configparser.y" { OUTYY(("P(dnscrypt_nonce_cache_size:%s)\n", (yyvsp[(2) - (2)].str))); if(!cfg_parse_memsize((yyvsp[(2) - (2)].str), &cfg_parser->cfg->dnscrypt_nonce_cache_size)) @@ -7045,8 +7170,8 @@ yyreduce: } break; - case 662: -#line 3539 "./util/configparser.y" + case 676: +#line 3607 "./util/configparser.y" { OUTYY(("P(dnscrypt_nonce_cache_slabs:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0) { @@ -7060,16 +7185,16 @@ yyreduce: } break; - case 663: -#line 3552 "./util/configparser.y" + case 677: +#line 3620 "./util/configparser.y" { OUTYY(("\nP(cachedb:)\n")); cfg_parser->started_toplevel = 1; } break; - case 672: -#line 3564 "./util/configparser.y" + case 686: +#line 3632 "./util/configparser.y" { #ifdef USE_CACHEDB OUTYY(("P(backend:%s)\n", (yyvsp[(2) - (2)].str))); @@ -7082,8 +7207,8 @@ yyreduce: } break; - case 673: -#line 3576 "./util/configparser.y" + case 687: +#line 3644 "./util/configparser.y" { #ifdef USE_CACHEDB OUTYY(("P(secret-seed:%s)\n", (yyvsp[(2) - (2)].str))); @@ -7096,8 +7221,8 @@ yyreduce: } break; - case 674: -#line 3588 "./util/configparser.y" + case 688: +#line 3656 "./util/configparser.y" { #if defined(USE_CACHEDB) && defined(USE_REDIS) OUTYY(("P(redis_server_host:%s)\n", (yyvsp[(2) - (2)].str))); @@ -7110,8 +7235,8 @@ yyreduce: } break; - case 675: -#line 3600 "./util/configparser.y" + case 689: +#line 3668 "./util/configparser.y" { #if defined(USE_CACHEDB) && defined(USE_REDIS) int port; @@ -7127,8 +7252,8 @@ yyreduce: } break; - case 676: -#line 3615 "./util/configparser.y" + case 690: +#line 3683 "./util/configparser.y" { #if defined(USE_CACHEDB) && defined(USE_REDIS) OUTYY(("P(redis_timeout:%s)\n", (yyvsp[(2) - (2)].str))); @@ -7142,8 +7267,8 @@ yyreduce: } break; - case 677: -#line 3628 "./util/configparser.y" + case 691: +#line 3696 "./util/configparser.y" { #if defined(USE_CACHEDB) && defined(USE_REDIS) OUTYY(("P(redis_expire_records:%s)\n", (yyvsp[(2) - (2)].str))); @@ -7157,8 +7282,8 @@ yyreduce: } break; - case 678: -#line 3641 "./util/configparser.y" + case 692: +#line 3709 "./util/configparser.y" { OUTYY(("P(server_tcp_connection_limit:%s %s)\n", (yyvsp[(2) - (3)].str), (yyvsp[(3) - (3)].str))); if (atoi((yyvsp[(3) - (3)].str)) < 0) @@ -7170,16 +7295,45 @@ yyreduce: } break; - case 679: -#line 3652 "./util/configparser.y" + case 693: +#line 3720 "./util/configparser.y" + { + OUTYY(("P(server_answer_cookie:%s)\n", (yyvsp[(2) - (2)].str))); + if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) + yyerror("expected yes or no."); + else cfg_parser->cfg->do_answer_cookie = (strcmp((yyvsp[(2) - (2)].str), "yes")==0); + free((yyvsp[(2) - (2)].str)); + } + break; + + case 694: +#line 3729 "./util/configparser.y" + { + uint8_t secret[32]; + size_t secret_len = sizeof(secret); + + OUTYY(("P(server_cookie_secret:%s)\n", (yyvsp[(2) - (2)].str))); + if (sldns_str2wire_hex_buf((yyvsp[(2) - (2)].str), secret, &secret_len) + || ( secret_len != 16)) + yyerror("expected 128 bit hex string"); + else { + cfg_parser->cfg->cookie_secret_len = secret_len; + memcpy(cfg_parser->cfg->cookie_secret, secret, sizeof(secret)); + } + free((yyvsp[(2) - (2)].str)); + } + break; + + case 695: +#line 3744 "./util/configparser.y" { OUTYY(("\nP(ipset:)\n")); cfg_parser->started_toplevel = 1; } break; - case 684: -#line 3662 "./util/configparser.y" + case 700: +#line 3754 "./util/configparser.y" { #ifdef USE_IPSET OUTYY(("P(name-v4:%s)\n", (yyvsp[(2) - (2)].str))); @@ -7195,8 +7349,8 @@ yyreduce: } break; - case 685: -#line 3677 "./util/configparser.y" + case 701: +#line 3769 "./util/configparser.y" { #ifdef USE_IPSET OUTYY(("P(name-v6:%s)\n", (yyvsp[(2) - (2)].str))); @@ -7214,7 +7368,7 @@ yyreduce: /* Line 1267 of yacc.c. */ -#line 7218 "util/configparser.c" +#line 7372 "util/configparser.c" default: break; } YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); @@ -7428,7 +7582,7 @@ yyreturn: } -#line 3691 "./util/configparser.y" +#line 3783 "./util/configparser.y" /* parse helper routines could be here */ @@ -7449,5 +7603,21 @@ validate_respip_action(const char* action) } } - +static void +validate_acl_action(const char* action) +{ + if(strcmp(action, "deny")!=0 && + strcmp(action, "refuse")!=0 && + strcmp(action, "deny_non_local")!=0 && + strcmp(action, "refuse_non_local")!=0 && + strcmp(action, "allow_setrd")!=0 && + strcmp(action, "allow")!=0 && + strcmp(action, "allow_snoop")!=0 && + strcmp(action, "allow_cookie")!=0) + { + yyerror("expected deny, refuse, deny_non_local, " + "refuse_non_local, allow, allow_setrd, " + "allow_snoop or allow_cookie as access control action"); + } +} diff --git a/util/configparser.h b/util/configparser.h index a7ff2f319..fd80f9038 100644 --- a/util/configparser.h +++ b/util/configparser.h @@ -333,38 +333,46 @@ VAR_ALLOW_NOTIFY = 549, VAR_TLS_WIN_CERT = 550, VAR_TCP_CONNECTION_LIMIT = 551, - VAR_FORWARD_NO_CACHE = 552, - VAR_STUB_NO_CACHE = 553, - VAR_LOG_SERVFAIL = 554, - VAR_DENY_ANY = 555, - VAR_UNKNOWN_SERVER_TIME_LIMIT = 556, - VAR_LOG_TAG_QUERYREPLY = 557, - VAR_STREAM_WAIT_SIZE = 558, - VAR_TLS_CIPHERS = 559, - VAR_TLS_CIPHERSUITES = 560, - VAR_TLS_USE_SNI = 561, - VAR_IPSET = 562, - VAR_IPSET_NAME_V4 = 563, - VAR_IPSET_NAME_V6 = 564, - VAR_TLS_SESSION_TICKET_KEYS = 565, - VAR_RPZ = 566, - VAR_TAGS = 567, - VAR_RPZ_ACTION_OVERRIDE = 568, - VAR_RPZ_CNAME_OVERRIDE = 569, - VAR_RPZ_LOG = 570, - VAR_RPZ_LOG_NAME = 571, - VAR_DYNLIB = 572, - VAR_DYNLIB_FILE = 573, - VAR_EDNS_CLIENT_STRING = 574, - VAR_EDNS_CLIENT_STRING_OPCODE = 575, - VAR_NSID = 576, - VAR_ZONEMD_PERMISSIVE_MODE = 577, - VAR_ZONEMD_CHECK = 578, - VAR_ZONEMD_REJECT_ABSENCE = 579, - VAR_RPZ_SIGNAL_NXDOMAIN_RA = 580, - VAR_INTERFACE_AUTOMATIC_PORTS = 581, - VAR_EDE = 582, - VAR_UPSTREAM_COOKIES = 583 + VAR_ANSWER_COOKIE = 552, + VAR_COOKIE_SECRET = 553, + VAR_FORWARD_NO_CACHE = 554, + VAR_STUB_NO_CACHE = 555, + VAR_LOG_SERVFAIL = 556, + VAR_DENY_ANY = 557, + VAR_UNKNOWN_SERVER_TIME_LIMIT = 558, + VAR_LOG_TAG_QUERYREPLY = 559, + VAR_STREAM_WAIT_SIZE = 560, + VAR_TLS_CIPHERS = 561, + VAR_TLS_CIPHERSUITES = 562, + VAR_TLS_USE_SNI = 563, + VAR_IPSET = 564, + VAR_IPSET_NAME_V4 = 565, + VAR_IPSET_NAME_V6 = 566, + VAR_TLS_SESSION_TICKET_KEYS = 567, + VAR_RPZ = 568, + VAR_TAGS = 569, + VAR_RPZ_ACTION_OVERRIDE = 570, + VAR_RPZ_CNAME_OVERRIDE = 571, + VAR_RPZ_LOG = 572, + VAR_RPZ_LOG_NAME = 573, + VAR_DYNLIB = 574, + VAR_DYNLIB_FILE = 575, + VAR_EDNS_CLIENT_STRING = 576, + VAR_EDNS_CLIENT_STRING_OPCODE = 577, + VAR_NSID = 578, + VAR_ZONEMD_PERMISSIVE_MODE = 579, + VAR_ZONEMD_CHECK = 580, + VAR_ZONEMD_REJECT_ABSENCE = 581, + VAR_RPZ_SIGNAL_NXDOMAIN_RA = 582, + VAR_INTERFACE_AUTOMATIC_PORTS = 583, + VAR_EDE = 584, + VAR_UPSTREAM_COOKIES = 585, + VAR_INTERFACE_ACTION = 586, + VAR_INTERFACE_VIEW = 587, + VAR_INTERFACE_TAG = 588, + VAR_INTERFACE_TAG_ACTION = 589, + VAR_INTERFACE_TAG_DATA = 590, + VAR_PROXY_PROTOCOL_PORT = 591 }; #endif /* Tokens. */ @@ -662,50 +670,58 @@ #define VAR_ALLOW_NOTIFY 549 #define VAR_TLS_WIN_CERT 550 #define VAR_TCP_CONNECTION_LIMIT 551 -#define VAR_FORWARD_NO_CACHE 552 -#define VAR_STUB_NO_CACHE 553 -#define VAR_LOG_SERVFAIL 554 -#define VAR_DENY_ANY 555 -#define VAR_UNKNOWN_SERVER_TIME_LIMIT 556 -#define VAR_LOG_TAG_QUERYREPLY 557 -#define VAR_STREAM_WAIT_SIZE 558 -#define VAR_TLS_CIPHERS 559 -#define VAR_TLS_CIPHERSUITES 560 -#define VAR_TLS_USE_SNI 561 -#define VAR_IPSET 562 -#define VAR_IPSET_NAME_V4 563 -#define VAR_IPSET_NAME_V6 564 -#define VAR_TLS_SESSION_TICKET_KEYS 565 -#define VAR_RPZ 566 -#define VAR_TAGS 567 -#define VAR_RPZ_ACTION_OVERRIDE 568 -#define VAR_RPZ_CNAME_OVERRIDE 569 -#define VAR_RPZ_LOG 570 -#define VAR_RPZ_LOG_NAME 571 -#define VAR_DYNLIB 572 -#define VAR_DYNLIB_FILE 573 -#define VAR_EDNS_CLIENT_STRING 574 -#define VAR_EDNS_CLIENT_STRING_OPCODE 575 -#define VAR_NSID 576 -#define VAR_ZONEMD_PERMISSIVE_MODE 577 -#define VAR_ZONEMD_CHECK 578 -#define VAR_ZONEMD_REJECT_ABSENCE 579 -#define VAR_RPZ_SIGNAL_NXDOMAIN_RA 580 -#define VAR_INTERFACE_AUTOMATIC_PORTS 581 -#define VAR_EDE 582 -#define VAR_UPSTREAM_COOKIES 583 +#define VAR_ANSWER_COOKIE 552 +#define VAR_COOKIE_SECRET 553 +#define VAR_FORWARD_NO_CACHE 554 +#define VAR_STUB_NO_CACHE 555 +#define VAR_LOG_SERVFAIL 556 +#define VAR_DENY_ANY 557 +#define VAR_UNKNOWN_SERVER_TIME_LIMIT 558 +#define VAR_LOG_TAG_QUERYREPLY 559 +#define VAR_STREAM_WAIT_SIZE 560 +#define VAR_TLS_CIPHERS 561 +#define VAR_TLS_CIPHERSUITES 562 +#define VAR_TLS_USE_SNI 563 +#define VAR_IPSET 564 +#define VAR_IPSET_NAME_V4 565 +#define VAR_IPSET_NAME_V6 566 +#define VAR_TLS_SESSION_TICKET_KEYS 567 +#define VAR_RPZ 568 +#define VAR_TAGS 569 +#define VAR_RPZ_ACTION_OVERRIDE 570 +#define VAR_RPZ_CNAME_OVERRIDE 571 +#define VAR_RPZ_LOG 572 +#define VAR_RPZ_LOG_NAME 573 +#define VAR_DYNLIB 574 +#define VAR_DYNLIB_FILE 575 +#define VAR_EDNS_CLIENT_STRING 576 +#define VAR_EDNS_CLIENT_STRING_OPCODE 577 +#define VAR_NSID 578 +#define VAR_ZONEMD_PERMISSIVE_MODE 579 +#define VAR_ZONEMD_CHECK 580 +#define VAR_ZONEMD_REJECT_ABSENCE 581 +#define VAR_RPZ_SIGNAL_NXDOMAIN_RA 582 +#define VAR_INTERFACE_AUTOMATIC_PORTS 583 +#define VAR_EDE 584 +#define VAR_UPSTREAM_COOKIES 585 +#define VAR_INTERFACE_ACTION 586 +#define VAR_INTERFACE_VIEW 587 +#define VAR_INTERFACE_TAG 588 +#define VAR_INTERFACE_TAG_ACTION 589 +#define VAR_INTERFACE_TAG_DATA 590 +#define VAR_PROXY_PROTOCOL_PORT 591 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED typedef union YYSTYPE -#line 66 "./util/configparser.y" +#line 69 "./util/configparser.y" { char* str; } /* Line 1529 of yacc.c. */ -#line 709 "util/configparser.h" +#line 725 "util/configparser.h" YYSTYPE; # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 diff --git a/util/configparser.y b/util/configparser.y index 25b573258..beb0c3655 100644 --- a/util/configparser.y +++ b/util/configparser.y @@ -42,16 +42,19 @@ #include #include #include +#include #include #include "util/configyyrename.h" #include "util/config_file.h" #include "util/net_help.h" +#include "sldns/str2wire.h" int ub_c_lex(void); void ub_c_error(const char *message); static void validate_respip_action(const char* action); +static void validate_acl_action(const char* action); /* these need to be global, otherwise they cannot be used inside yacc */ extern struct config_parser_state* cfg_parser; @@ -180,6 +183,7 @@ extern struct config_parser_state* cfg_parser; %token VAR_FALLBACK_ENABLED VAR_TLS_ADDITIONAL_PORT VAR_LOW_RTT VAR_LOW_RTT_PERMIL %token VAR_FAST_SERVER_PERMIL VAR_FAST_SERVER_NUM %token VAR_ALLOW_NOTIFY VAR_TLS_WIN_CERT VAR_TCP_CONNECTION_LIMIT +%token VAR_ANSWER_COOKIE VAR_COOKIE_SECRET %token VAR_FORWARD_NO_CACHE VAR_STUB_NO_CACHE VAR_LOG_SERVFAIL VAR_DENY_ANY %token VAR_UNKNOWN_SERVER_TIME_LIMIT VAR_LOG_TAG_QUERYREPLY %token VAR_STREAM_WAIT_SIZE VAR_TLS_CIPHERS VAR_TLS_CIPHERSUITES VAR_TLS_USE_SNI @@ -191,6 +195,9 @@ extern struct config_parser_state* cfg_parser; %token VAR_ZONEMD_PERMISSIVE_MODE VAR_ZONEMD_CHECK VAR_ZONEMD_REJECT_ABSENCE %token VAR_RPZ_SIGNAL_NXDOMAIN_RA VAR_INTERFACE_AUTOMATIC_PORTS VAR_EDE %token VAR_UPSTREAM_COOKIES +%token VAR_INTERFACE_ACTION VAR_INTERFACE_VIEW VAR_INTERFACE_TAG +%token VAR_INTERFACE_TAG_ACTION VAR_INTERFACE_TAG_DATA +%token VAR_PROXY_PROTOCOL_PORT %% toplevelvars: /* empty */ | toplevelvars toplevelvar ; @@ -290,6 +297,8 @@ content_server: server_num_threads | server_verbosity | server_port | server_disable_dnssec_lame_check | server_access_control_tag | server_local_zone_override | server_access_control_tag_action | server_access_control_tag_data | server_access_control_view | + server_interface_action | server_interface_view | server_interface_tag | + server_interface_tag_action | server_interface_tag_data | server_qname_minimisation_strict | server_pad_responses | server_pad_responses_block_size | server_pad_queries | server_pad_queries_block_size | @@ -312,12 +321,13 @@ content_server: server_num_threads | server_verbosity | server_port | server_unknown_server_time_limit | server_log_tag_queryreply | server_stream_wait_size | server_tls_ciphers | server_tls_ciphersuites | server_tls_session_ticket_keys | + server_answer_cookie | server_cookie_secret | server_tls_use_sni | server_edns_client_string | 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_interface_automatic_ports | server_ede | server_upstream_cookies - + server_interface_automatic_ports | server_ede | server_upstream_cookies | + server_proxy_protocol_port ; stubstart: VAR_STUB_ZONE { @@ -1850,21 +1860,18 @@ server_do_not_query_localhost: VAR_DO_NOT_QUERY_LOCALHOST STRING_ARG server_access_control: VAR_ACCESS_CONTROL STRING_ARG STRING_ARG { OUTYY(("P(server_access_control:%s %s)\n", $2, $3)); - if(strcmp($3, "deny")!=0 && strcmp($3, "refuse")!=0 && - strcmp($3, "deny_non_local")!=0 && - strcmp($3, "refuse_non_local")!=0 && - strcmp($3, "allow_setrd")!=0 && - strcmp($3, "allow")!=0 && - strcmp($3, "allow_snoop")!=0) { - yyerror("expected deny, refuse, deny_non_local, " - "refuse_non_local, allow, allow_setrd or " - "allow_snoop in access control action"); - free($2); - free($3); - } else { - if(!cfg_str2list_insert(&cfg_parser->cfg->acls, $2, $3)) - fatal_exit("out of memory adding acl"); - } + validate_acl_action($3); + if(!cfg_str2list_insert(&cfg_parser->cfg->acls, $2, $3)) + fatal_exit("out of memory adding acl"); + } + ; +server_interface_action: VAR_INTERFACE_ACTION STRING_ARG STRING_ARG + { + OUTYY(("P(server_interface_action:%s %s)\n", $2, $3)); + validate_acl_action($3); + if(!cfg_str2list_insert( + &cfg_parser->cfg->interface_actions, $2, $3)) + fatal_exit("out of memory adding acl"); } ; server_module_conf: VAR_MODULE_CONF STRING_ARG @@ -2422,6 +2429,60 @@ server_access_control_view: VAR_ACCESS_CONTROL_VIEW STRING_ARG STRING_ARG } } ; +server_interface_tag: VAR_INTERFACE_TAG STRING_ARG STRING_ARG + { + size_t len = 0; + uint8_t* bitlist = config_parse_taglist(cfg_parser->cfg, $3, + &len); + free($3); + OUTYY(("P(server_interface_tag:%s)\n", $2)); + if(!bitlist) { + yyerror("could not parse tags, (define-tag them first)"); + free($2); + } + if(bitlist) { + if(!cfg_strbytelist_insert( + &cfg_parser->cfg->interface_tags, + $2, bitlist, len)) { + yyerror("out of memory"); + free($2); + } + } + } + ; +server_interface_tag_action: VAR_INTERFACE_TAG_ACTION STRING_ARG STRING_ARG STRING_ARG + { + OUTYY(("P(server_interface_tag_action:%s %s %s)\n", $2, $3, $4)); + if(!cfg_str3list_insert(&cfg_parser->cfg->interface_tag_actions, + $2, $3, $4)) { + yyerror("out of memory"); + free($2); + free($3); + free($4); + } + } + ; +server_interface_tag_data: VAR_INTERFACE_TAG_DATA STRING_ARG STRING_ARG STRING_ARG + { + OUTYY(("P(server_interface_tag_data:%s %s %s)\n", $2, $3, $4)); + if(!cfg_str3list_insert(&cfg_parser->cfg->interface_tag_datas, + $2, $3, $4)) { + yyerror("out of memory"); + free($2); + free($3); + free($4); + } + } + ; +server_interface_view: VAR_INTERFACE_VIEW STRING_ARG STRING_ARG + { + OUTYY(("P(server_interface_view:%s %s)\n", $2, $3)); + if(!cfg_str2list_insert(&cfg_parser->cfg->interface_view, + $2, $3)) { + yyerror("out of memory"); + } + } + ; server_response_ip_tag: VAR_RESPONSE_IP_TAG STRING_ARG STRING_ARG { size_t len = 0; @@ -2777,6 +2838,13 @@ server_upstream_cookies: VAR_UPSTREAM_COOKIES STRING_ARG else cfg_parser->cfg->upstream_cookies = (strcmp($2, "yes")==0); free($2); } +server_proxy_protocol_port: VAR_PROXY_PROTOCOL_PORT STRING_ARG + { + OUTYY(("P(server_proxy_protocol_port:%s)\n", $2)); + if(!cfg_strlist_insert(&cfg_parser->cfg->proxy_protocol_port, $2)) + yyerror("out of memory"); + } + ; stub_name: VAR_NAME STRING_ARG { OUTYY(("P(name:%s)\n", $2)); @@ -3648,6 +3716,30 @@ server_tcp_connection_limit: VAR_TCP_CONNECTION_LIMIT STRING_ARG STRING_ARG } } ; +server_answer_cookie: VAR_ANSWER_COOKIE STRING_ARG + { + OUTYY(("P(server_answer_cookie:%s)\n", $2)); + if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) + yyerror("expected yes or no."); + else cfg_parser->cfg->do_answer_cookie = (strcmp($2, "yes")==0); + free($2); + } + ; +server_cookie_secret: VAR_COOKIE_SECRET STRING_ARG + { + uint8_t secret[32]; + size_t secret_len = sizeof(secret); + + OUTYY(("P(server_cookie_secret:%s)\n", $2)); + if (sldns_str2wire_hex_buf($2, secret, &secret_len) + || ( secret_len != 16)) + yyerror("expected 128 bit hex string"); + else { + cfg_parser->cfg->cookie_secret_len = secret_len; + memcpy(cfg_parser->cfg->cookie_secret, secret, sizeof(secret)); + } + free($2); + } ipsetstart: VAR_IPSET { OUTYY(("\nP(ipset:)\n")); @@ -3708,4 +3800,20 @@ validate_respip_action(const char* action) } } - +static void +validate_acl_action(const char* action) +{ + if(strcmp(action, "deny")!=0 && + strcmp(action, "refuse")!=0 && + strcmp(action, "deny_non_local")!=0 && + strcmp(action, "refuse_non_local")!=0 && + strcmp(action, "allow_setrd")!=0 && + strcmp(action, "allow")!=0 && + strcmp(action, "allow_snoop")!=0 && + strcmp(action, "allow_cookie")!=0) + { + yyerror("expected deny, refuse, deny_non_local, " + "refuse_non_local, allow, allow_setrd, " + "allow_snoop or allow_cookie as access control action"); + } +} diff --git a/util/data/msgencode.c b/util/data/msgencode.c index fe21cfb86..d832ddc91 100644 --- a/util/data/msgencode.c +++ b/util/data/msgencode.c @@ -959,14 +959,15 @@ qinfo_query_encode(sldns_buffer* pkt, struct query_info* qinfo) } void -error_encode(sldns_buffer* buf, int r, struct query_info* qinfo, - uint16_t qid, uint16_t qflags, struct edns_data* edns) +extended_error_encode(sldns_buffer* buf, uint16_t rcode, struct query_info* qinfo, + uint16_t qid, uint16_t qflags, uint16_t xflags, struct edns_data* edns) { uint16_t flags; sldns_buffer_clear(buf); sldns_buffer_write(buf, &qid, sizeof(uint16_t)); - flags = (uint16_t)(BIT_QR | BIT_RA | r); /* QR and retcode*/ + flags = (uint16_t)(BIT_QR | BIT_RA | (rcode & 0xF)); /* QR and retcode*/ + flags |= xflags; flags |= (qflags & (BIT_RD|BIT_CD)); /* copy RD and CD bit */ sldns_buffer_write_u16(buf, flags); if(qinfo) flags = 1; @@ -993,7 +994,7 @@ error_encode(sldns_buffer* buf, int r, struct query_info* qinfo, struct edns_data es = *edns; es.edns_version = EDNS_ADVERTISED_VERSION; es.udp_size = EDNS_ADVERTISED_SIZE; - es.ext_rcode = 0; + es.ext_rcode = (uint8_t)(rcode >> 4); es.bits &= EDNS_DO; if(sldns_buffer_limit(buf) + calc_edns_field_size(&es) > edns->udp_size) @@ -1001,3 +1002,12 @@ error_encode(sldns_buffer* buf, int r, struct query_info* qinfo, attach_edns_record(buf, &es); } } + +void +error_encode(sldns_buffer* buf, int r, struct query_info* qinfo, + uint16_t qid, uint16_t qflags, struct edns_data* edns) +{ + extended_error_encode(buf, (r & 0x000F), qinfo, qid, qflags + , (r & 0xFFF0), edns); +} + diff --git a/util/data/msgencode.h b/util/data/msgencode.h index 30dc515cb..1b37ca870 100644 --- a/util/data/msgencode.h +++ b/util/data/msgencode.h @@ -120,7 +120,7 @@ void attach_edns_record(struct sldns_buffer* pkt, struct edns_data* edns); * Encode an error. With QR and RA set. * * @param pkt: where to store the packet. - * @param r: RCODE value to encode. + * @param r: RCODE value to encode (may contain extra flags). * @param qinfo: if not NULL, the query is included. * @param qid: query ID to set in packet. network order. * @param qflags: original query flags (to copy RD and CD bits). host order. @@ -130,4 +130,21 @@ void attach_edns_record(struct sldns_buffer* pkt, struct edns_data* edns); void error_encode(struct sldns_buffer* pkt, int r, struct query_info* qinfo, uint16_t qid, uint16_t qflags, struct edns_data* edns); +/** + * Encode an extended error. With QR and RA set. + * + * @param pkt: where to store the packet. + * @param rcode: Extended RCODE value to encode. + * @param qinfo: if not NULL, the query is included. + * @param qid: query ID to set in packet. network order. + * @param qflags: original query flags (to copy RD and CD bits). host order. + * @param xflags: extra flags to set (such as for example BIT_AA and/or BIT_TC) + * @param edns: if not NULL, this is the query edns info, + * and an edns reply is attached. Only attached if EDNS record fits reply. + * Without edns extended errors (i.e. > 15 )will not be conveyed. + */ +void extended_error_encode(struct sldns_buffer* pkt, uint16_t rcode, + struct query_info* qinfo, uint16_t qid, uint16_t qflags, + uint16_t xflags, struct edns_data* edns); + #endif /* UTIL_DATA_MSGENCODE_H */ diff --git a/util/data/msgparse.c b/util/data/msgparse.c index 1923ff0d0..9b7eb08d0 100644 --- a/util/data/msgparse.c +++ b/util/data/msgparse.c @@ -964,11 +964,67 @@ edns_opt_list_append_keepalive(struct edns_option** list, int msec, data, region); } +int siphash(const uint8_t *in, const size_t inlen, + const uint8_t *k, uint8_t *out, const size_t outlen); + +/** RFC 1982 comparison, uses unsigned integers, and tries to avoid + * compiler optimization (eg. by avoiding a-b<0 comparisons), + * this routine matches compare_serial(), for SOA serial number checks */ +static int +compare_1982(uint32_t a, uint32_t b) +{ + /* for 32 bit values */ + const uint32_t cutoff = ((uint32_t) 1 << (32 - 1)); + + if (a == b) { + return 0; + } else if ((a < b && b - a < cutoff) || (a > b && a - b > cutoff)) { + return -1; + } else { + return 1; + } +} + +/** if we know that b is larger than a, return the difference between them, + * that is the distance between them. in RFC1982 arith */ +static uint32_t +subtract_1982(uint32_t a, uint32_t b) +{ + /* for 32 bit values */ + const uint32_t cutoff = ((uint32_t) 1 << (32 - 1)); + + if(a == b) + return 0; + if(a < b && b - a < cutoff) { + return b-a; + } + if(a > b && a - b > cutoff) { + return ((uint32_t)0xffffffff) - (a-b-1); + } + /* wrong case, b smaller than a */ + return 0; +} + + +static uint8_t * +cookie_hash(uint8_t *hash, uint8_t *buf, + struct sockaddr_storage *addr, uint8_t *secret) +{ + if (addr->ss_family == AF_INET6) { + memcpy(buf+16, &((struct sockaddr_in6 *)addr)->sin6_addr, 16); + siphash(buf, 32, secret, hash, 8); + } else { + memcpy(buf+16, &((struct sockaddr_in *)addr)->sin_addr, 4); + siphash(buf, 20, secret, hash, 8); + } + return hash; +} + /** parse EDNS options from EDNS wireformat rdata */ static int parse_edns_options_from_query(uint8_t* rdata_ptr, size_t rdata_len, struct edns_data* edns, struct config_file* cfg, struct comm_point* c, - struct regional* region) + struct comm_reply* repinfo, uint32_t now, struct regional* region) { /* To respond with a Keepalive option, the client connection must have * received one message with a TCP Keepalive EDNS option, and that @@ -992,6 +1048,10 @@ parse_edns_options_from_query(uint8_t* rdata_ptr, size_t rdata_len, while(rdata_len >= 4) { uint16_t opt_code = sldns_read_uint16(rdata_ptr); uint16_t opt_len = sldns_read_uint16(rdata_ptr+2); + uint8_t server_cookie[40], hash[8]; + uint32_t cookie_time, subt_1982; + int comp_1982; + rdata_ptr += 4; rdata_len -= 4; if(opt_len > rdata_len) @@ -1054,6 +1114,86 @@ parse_edns_options_from_query(uint8_t* rdata_ptr, size_t rdata_len, edns->padding_block_size = cfg->pad_responses_block_size; break; + case LDNS_EDNS_COOKIE: + if(!cfg || !cfg->do_answer_cookie) + break; + if(opt_len != 8 && (opt_len < 16 || opt_len > 40)) { + verbose(VERB_ALGO, "worker request: " + "badly formatted cookie"); + return LDNS_RCODE_FORMERR; + } + edns->cookie_present = 1; + + /* Copy client cookie, version and timestamp for + * validation and creation purposes. + */ + memcpy(server_cookie, rdata_ptr, 16); + + /* In the "if, if else" block below, we validate a + * RFC9018 cookie. If it doesn't match the recipe, or + * if it doesn't validate, or if the cookie is too old + * (< 30 min), a new cookie is generated. + */ + if (opt_len != 24) + ; /* RFC9018 cookies are 24 bytes long */ + + else if (cfg->cookie_secret_len != 16) + ; /* RFC9018 cookies have 16 byte secrets */ + + else if (rdata_ptr[8] != 1) + ; /* RFC9018 cookies are cookie version 1 */ + + else if ((comp_1982 = compare_1982(now, + (cookie_time = sldns_read_uint32(rdata_ptr + 12)))) > 0 + && (subt_1982 = subtract_1982(cookie_time, now)) > 3600) + ; /* Cookie is older than 1 hour + * (see RFC9018 Section 4.3.) + */ + + else if (comp_1982 <= 0 + && subtract_1982(now, cookie_time) > 300) + ; /* Cookie time is more than 5 minutes in the + * future. (see RFC9018 Section 4.3.) + */ + + else if (memcmp( cookie_hash( hash, server_cookie + , &repinfo->remote_addr + , cfg->cookie_secret) + , rdata_ptr + 16 , 8 ) == 0) { + + /* Cookie is valid! */ + edns->cookie_valid = 1; + if (comp_1982 > 0 && subt_1982 > 1800) + ; /* But older than 30 minutes, + * so create a new one anyway */ + + else if (!edns_opt_list_append( /* Reuse cookie */ + &edns->opt_list_out, LDNS_EDNS_COOKIE, opt_len, + rdata_ptr, region)) { + log_err("out of memory"); + return LDNS_RCODE_SERVFAIL; + } else + /* Cookie to be reused added to + * outgoing options. Done! + */ + break; + } + /* Add a new server cookie to outgoing cookies */ + server_cookie[ 8] = 1; /* Version */ + server_cookie[ 9] = 0; /* Reserved */ + server_cookie[10] = 0; /* Reserved */ + server_cookie[11] = 0; /* Reserved */ + sldns_write_uint32(server_cookie + 12, now); + cookie_hash( hash, server_cookie, &repinfo->remote_addr + , cfg->cookie_secret); + memcpy(server_cookie + 16, hash, 8); + if (!edns_opt_list_append( &edns->opt_list_out + , LDNS_EDNS_COOKIE + , 24, server_cookie, region)) { + log_err("out of memory"); + return LDNS_RCODE_SERVFAIL; + } + break; default: break; } @@ -1128,6 +1268,8 @@ parse_extract_edns_from_response_msg(struct msg_parse* msg, edns->opt_list_out = NULL; edns->opt_list_inplace_cb_out = NULL; edns->padding_block_size = 0; + edns->cookie_present = 0; + edns->cookie_valid = 0; /* take the options */ rdata_len = found->rr_first->size-2; @@ -1183,7 +1325,8 @@ skip_pkt_rrs(sldns_buffer* pkt, int num) int parse_edns_from_query_pkt(sldns_buffer* pkt, struct edns_data* edns, - struct config_file* cfg, struct comm_point* c, struct regional* region) + struct config_file* cfg, struct comm_point* c, + struct comm_reply* repinfo, time_t now, struct regional* region) { size_t rdata_len; uint8_t* rdata_ptr; @@ -1219,6 +1362,8 @@ parse_edns_from_query_pkt(sldns_buffer* pkt, struct edns_data* edns, edns->opt_list_out = NULL; edns->opt_list_inplace_cb_out = NULL; edns->padding_block_size = 0; + edns->cookie_present = 0; + edns->cookie_valid = 0; /* take the options */ rdata_len = sldns_buffer_read_u16(pkt); @@ -1227,7 +1372,7 @@ parse_edns_from_query_pkt(sldns_buffer* pkt, struct edns_data* edns, rdata_ptr = sldns_buffer_current(pkt); /* ignore rrsigs */ return parse_edns_options_from_query(rdata_ptr, rdata_len, edns, cfg, - c, region); + c, repinfo, now, region); } void diff --git a/util/data/msgparse.h b/util/data/msgparse.h index f15ab2bcc..641dc6ad7 100644 --- a/util/data/msgparse.h +++ b/util/data/msgparse.h @@ -72,6 +72,7 @@ struct regional; struct edns_option; struct config_file; struct comm_point; +struct comm_reply; /** number of buckets in parse rrset hash table. Must be power of 2. */ #define PARSE_TABLE_SIZE 32 @@ -217,8 +218,6 @@ struct rr_parse { * region. */ struct edns_data { - /** if EDNS OPT record was present */ - int edns_present; /** Extended RCODE */ uint8_t ext_rcode; /** The EDNS version number */ @@ -238,7 +237,13 @@ struct edns_data { struct edns_option* opt_list_inplace_cb_out; /** block size to pad */ uint16_t padding_block_size; -}; + /** if EDNS OPT record was present */ + unsigned int edns_present : 1; + /** if a cookie was present */ + unsigned int cookie_present : 1; + /** if the cookie validated */ + unsigned int cookie_valid : 1; +}; /** * EDNS option @@ -324,7 +329,8 @@ int skip_pkt_rrs(struct sldns_buffer* pkt, int num); * RCODE formerr if OPT is badly formatted and so on. */ int parse_edns_from_query_pkt(struct sldns_buffer* pkt, struct edns_data* edns, - struct config_file* cfg, struct comm_point* c, struct regional* region); + struct config_file* cfg, struct comm_point* c, + struct comm_reply* repinfo, time_t now, struct regional* region); /** * Calculate hash value for rrset in packet. diff --git a/util/fptr_wlist.c b/util/fptr_wlist.c index 05a22d402..dc8ab6693 100644 --- a/util/fptr_wlist.c +++ b/util/fptr_wlist.c @@ -221,6 +221,7 @@ fptr_whitelist_rbtree_cmp(int (*fptr) (const void *, const void *)) if(fptr == &mesh_state_compare) return 1; else if(fptr == &mesh_state_ref_compare) return 1; else if(fptr == &addr_tree_compare) return 1; + else if(fptr == &addr_tree_addrport_compare) return 1; else if(fptr == &local_zone_cmp) return 1; else if(fptr == &local_data_cmp) return 1; else if(fptr == &fwd_cmp) return 1; diff --git a/util/net_help.c b/util/net_help.c index 8153dbdd1..54fad6986 100644 --- a/util/net_help.c +++ b/util/net_help.c @@ -233,12 +233,11 @@ log_addr(enum verbosity_value v, const char* str, else verbose(v, "%s %s port %d", str, dest, (int)port); } -int +int extstrtoaddr(const char* str, struct sockaddr_storage* addr, - socklen_t* addrlen) + socklen_t* addrlen, int port) { char* s; - int port = UNBOUND_DNS_PORT; if((s=strchr(str, '@'))) { char buf[MAX_ADDR_STRLEN]; if(s-str >= MAX_ADDR_STRLEN) { @@ -255,7 +254,6 @@ extstrtoaddr(const char* str, struct sockaddr_storage* addr, return ipstrtoaddr(str, port, addr, addrlen); } - int ipstrtoaddr(const char* ip, int port, struct sockaddr_storage* addr, socklen_t* addrlen) diff --git a/util/net_help.h b/util/net_help.h index 4dd398460..f1881b3ed 100644 --- a/util/net_help.h +++ b/util/net_help.h @@ -96,6 +96,11 @@ extern uint16_t EDNS_ADVERTISED_SIZE; /** return a random 16-bit number given a random source */ #define GET_RANDOM_ID(rnd) (((unsigned)ub_random(rnd)>>8) & 0xffff) +/** define MSG_DONTWAIT for unsupported platforms */ +#ifndef MSG_DONTWAIT +#define MSG_DONTWAIT 0 +#endif + /** minimal responses when positive answer */ extern int MINIMAL_RESPONSES; @@ -178,10 +183,11 @@ void log_err_addr(const char* str, const char* err, * @param str: the string * @param addr: where to store sockaddr. * @param addrlen: length of stored sockaddr is returned. + * @param port: default port. * @return 0 on error. */ int extstrtoaddr(const char* str, struct sockaddr_storage* addr, - socklen_t* addrlen); + socklen_t* addrlen, int port); /** * Convert ip address string and port to sockaddr. diff --git a/util/netevent.c b/util/netevent.c index 841e09787..c67a49ff8 100644 --- a/util/netevent.c +++ b/util/netevent.c @@ -45,6 +45,7 @@ #include "util/net_help.h" #include "util/tcp_conn_limit.h" #include "util/fptr_wlist.h" +#include "util/proxy_protocol.h" #include "sldns/pkthdr.h" #include "sldns/sbuffer.h" #include "sldns/str2wire.h" @@ -60,6 +61,9 @@ #ifdef HAVE_NETDB_H #include #endif +#ifdef HAVE_POLL_H +#include +#endif #ifdef HAVE_OPENSSL_SSL_H #include @@ -107,6 +111,9 @@ #define NUM_UDP_PER_SELECT 1 #endif +/** timeout in millisec to wait for write to unblock, packets dropped after.*/ +#define SEND_BLOCKED_WAIT_TIMEOUT 200 + /** * The internal event structure for keeping ub_event info for the event. * Possibly other structures (list, tree) this is part of. @@ -132,6 +139,10 @@ struct internal_base { struct ub_event* slow_accept; /** true if slow_accept is enabled */ int slow_accept_enabled; + /** last log time for slow logging of file descriptor errors */ + time_t last_slow_log; + /** last log time for slow logging of write wait failures */ + time_t last_writewait_log; }; /** @@ -367,29 +378,83 @@ comm_point_send_udp_msg(struct comm_point *c, sldns_buffer* packet, * we want to send the answer, and we will wait for * the ethernet interface buffer to have space. */ #ifndef USE_WINSOCK - if(errno == EAGAIN || + if(errno == EAGAIN || errno == EINTR || # ifdef EWOULDBLOCK errno == EWOULDBLOCK || # endif errno == ENOBUFS) { #else if(WSAGetLastError() == WSAEINPROGRESS || + WSAGetLastError() == WSAEINTR || WSAGetLastError() == WSAENOBUFS || WSAGetLastError() == WSAEWOULDBLOCK) { #endif - int e; - fd_set_block(c->fd); - if (!is_connected) { - sent = sendto(c->fd, (void*)sldns_buffer_begin(packet), - sldns_buffer_remaining(packet), 0, - addr, addrlen); - } else { - sent = send(c->fd, (void*)sldns_buffer_begin(packet), - sldns_buffer_remaining(packet), 0); + /* if we set the fd blocking, other threads suddenly + * have a blocking fd that they operate on */ + while(sent == -1 && ( +#ifndef USE_WINSOCK + errno == EAGAIN || errno == EINTR || +# ifdef EWOULDBLOCK + errno == EWOULDBLOCK || +# endif + errno == ENOBUFS +#else + WSAGetLastError() == WSAEINPROGRESS || + WSAGetLastError() == WSAEINTR || + WSAGetLastError() == WSAENOBUFS || + WSAGetLastError() == WSAEWOULDBLOCK +#endif + )) { +#if defined(HAVE_POLL) || defined(USE_WINSOCK) + struct pollfd p; + int pret; + memset(&p, 0, sizeof(p)); + p.fd = c->fd; + p.events = POLLOUT | POLLERR | POLLHUP; +# ifndef USE_WINSOCK + pret = poll(&p, 1, SEND_BLOCKED_WAIT_TIMEOUT); +# else + pret = WSAPoll(&p, 1, + SEND_BLOCKED_WAIT_TIMEOUT); +# endif + if(pret == 0) { + /* timer expired */ + struct comm_base* b = c->ev->base; + if(b->eb->last_writewait_log+SLOW_LOG_TIME <= + b->eb->secs) { + b->eb->last_writewait_log = b->eb->secs; + verbose(VERB_OPS, "send udp blocked " + "for long, dropping packet."); + } + return 0; + } else if(pret < 0 && +#ifndef USE_WINSOCK + errno != EAGAIN && errno != EINTR && +# ifdef EWOULDBLOCK + errno != EWOULDBLOCK && +# endif + errno != ENOBUFS +#else + WSAGetLastError() != WSAEINPROGRESS && + WSAGetLastError() != WSAEINTR && + WSAGetLastError() != WSAENOBUFS && + WSAGetLastError() != WSAEWOULDBLOCK +#endif + ) { + log_err("poll udp out failed: %s", + sock_strerror(errno)); + return 0; + } +#endif /* defined(HAVE_POLL) || defined(USE_WINSOCK) */ + if (!is_connected) { + sent = sendto(c->fd, (void*)sldns_buffer_begin(packet), + sldns_buffer_remaining(packet), 0, + addr, addrlen); + } else { + sent = send(c->fd, (void*)sldns_buffer_begin(packet), + sldns_buffer_remaining(packet), 0); + } } - e = errno; - fd_set_nonblock(c->fd); - errno = e; } } if(sent == -1) { @@ -556,22 +621,74 @@ comm_point_send_udp_msg_if(struct comm_point *c, sldns_buffer* packet, * we want to send the answer, and we will wait for * the ethernet interface buffer to have space. */ #ifndef USE_WINSOCK - if(errno == EAGAIN || + if(errno == EAGAIN || errno == EINTR || # ifdef EWOULDBLOCK errno == EWOULDBLOCK || # endif errno == ENOBUFS) { #else if(WSAGetLastError() == WSAEINPROGRESS || + WSAGetLastError() == WSAEINTR || WSAGetLastError() == WSAENOBUFS || WSAGetLastError() == WSAEWOULDBLOCK) { #endif - int e; - fd_set_block(c->fd); - sent = sendmsg(c->fd, &msg, 0); - e = errno; - fd_set_nonblock(c->fd); - errno = e; + while(sent == -1 && ( +#ifndef USE_WINSOCK + errno == EAGAIN || errno == EINTR || +# ifdef EWOULDBLOCK + errno == EWOULDBLOCK || +# endif + errno == ENOBUFS +#else + WSAGetLastError() == WSAEINPROGRESS || + WSAGetLastError() == WSAEINTR || + WSAGetLastError() == WSAENOBUFS || + WSAGetLastError() == WSAEWOULDBLOCK +#endif + )) { +#if defined(HAVE_POLL) || defined(USE_WINSOCK) + struct pollfd p; + int pret; + memset(&p, 0, sizeof(p)); + p.fd = c->fd; + p.events = POLLOUT | POLLERR | POLLHUP; +# ifndef USE_WINSOCK + pret = poll(&p, 1, SEND_BLOCKED_WAIT_TIMEOUT); +# else + pret = WSAPoll(&p, 1, + SEND_BLOCKED_WAIT_TIMEOUT); +# endif + if(pret == 0) { + /* timer expired */ + struct comm_base* b = c->ev->base; + if(b->eb->last_writewait_log+SLOW_LOG_TIME <= + b->eb->secs) { + b->eb->last_writewait_log = b->eb->secs; + verbose(VERB_OPS, "send udp blocked " + "for long, dropping packet."); + } + return 0; + } else if(pret < 0 && +#ifndef USE_WINSOCK + errno != EAGAIN && errno != EINTR && +# ifdef EWOULDBLOCK + errno != EWOULDBLOCK && +# endif + errno != ENOBUFS +#else + WSAGetLastError() != WSAEINPROGRESS && + WSAGetLastError() != WSAEINTR && + WSAGetLastError() != WSAENOBUFS && + WSAGetLastError() != WSAEWOULDBLOCK +#endif + ) { + log_err("poll udp out failed: %s", + sock_strerror(errno)); + return 0; + } +#endif /* defined(HAVE_POLL) || defined(USE_WINSOCK) */ + sent = sendmsg(c->fd, &msg, 0); + } } } if(sent == -1) { @@ -639,6 +756,67 @@ static int udp_recv_needs_log(int err) return 1; } +/** Parses the PROXYv2 header from buf and updates the comm_reply struct. + * Returns 1 on success, 0 on failure. */ +static int consume_pp2_header(struct sldns_buffer* buf, struct comm_reply* rep, + int stream) { + size_t size; + struct pp2_header *header = pp2_read_header(buf); + if(header == NULL) return 0; + size = PP2_HEADER_SIZE + ntohs(header->len); + if((header->ver_cmd & 0xF) == PP2_CMD_LOCAL) { + /* A connection from the proxy itself. + * No need to do anything with addresses. */ + goto done; + } + if(header->fam_prot == 0x00) { + /* Unspecified family and protocol. This could be used for + * health checks by proxies. + * No need to do anything with addresses. */ + goto done; + } + /* Read the proxied address */ + switch(header->fam_prot) { + case 0x11: /* AF_INET|STREAM */ + case 0x12: /* AF_INET|DGRAM */ + { + struct sockaddr_in* addr = + (struct sockaddr_in*)&rep->client_addr; + addr->sin_family = AF_INET; + addr->sin_addr.s_addr = header->addr.addr4.src_addr; + addr->sin_port = header->addr.addr4.src_port; + rep->client_addrlen = (socklen_t)sizeof(struct sockaddr_in); + } + /* Ignore the destination address; it should be us. */ + break; + case 0x21: /* AF_INET6|STREAM */ + case 0x22: /* AF_INET6|DGRAM */ + { + struct sockaddr_in6* addr = + (struct sockaddr_in6*)&rep->client_addr; + memset(addr, 0, sizeof(*addr)); + addr->sin6_family = AF_INET6; + memcpy(&addr->sin6_addr, + header->addr.addr6.src_addr, 16); + addr->sin6_port = header->addr.addr6.src_port; + rep->client_addrlen = (socklen_t)sizeof(struct sockaddr_in6); + } + /* Ignore the destination address; it should be us. */ + break; + } + rep->is_proxied = 1; +done: + if(!stream) { + /* We are reading a whole packet; + * Move the rest of the data to overwrite the PROXYv2 header */ + /* XXX can we do better to avoid memmove? */ + memmove(header, ((char*)header)+size, + sldns_buffer_limit(buf)-size); + sldns_buffer_set_limit(buf, sldns_buffer_limit(buf)-size); + } + return 1; +} + void comm_point_udp_ancil_callback(int fd, short event, void* arg) { @@ -665,11 +843,11 @@ comm_point_udp_ancil_callback(int fd, short event, void* arg) ub_comm_base_now(rep.c->ev->base); for(i=0; ibuffer); - rep.addrlen = (socklen_t)sizeof(rep.addr); + rep.remote_addrlen = (socklen_t)sizeof(rep.remote_addr); log_assert(fd != -1); log_assert(sldns_buffer_remaining(rep.c->buffer) > 0); - msg.msg_name = &rep.addr; - msg.msg_namelen = (socklen_t)sizeof(rep.addr); + msg.msg_name = &rep.remote_addr; + msg.msg_namelen = (socklen_t)sizeof(rep.remote_addr); iov[0].iov_base = sldns_buffer_begin(rep.c->buffer); iov[0].iov_len = sldns_buffer_remaining(rep.c->buffer); msg.msg_iov = iov; @@ -679,7 +857,7 @@ comm_point_udp_ancil_callback(int fd, short event, void* arg) msg.msg_controllen = sizeof(ancil.buf); #endif /* S_SPLINT_S */ msg.msg_flags = 0; - rcv = recvmsg(fd, &msg, 0); + rcv = recvmsg(fd, &msg, MSG_DONTWAIT); if(rcv == -1) { if(errno != EAGAIN && errno != EINTR && udp_recv_needs_log(errno)) { @@ -687,10 +865,11 @@ comm_point_udp_ancil_callback(int fd, short event, void* arg) } return; } - rep.addrlen = msg.msg_namelen; + rep.remote_addrlen = msg.msg_namelen; sldns_buffer_skip(rep.c->buffer, rcv); sldns_buffer_flip(rep.c->buffer); rep.srctype = 0; + rep.is_proxied = 0; #ifndef S_SPLINT_S for(cmsg = CMSG_FIRSTHDR(&msg); cmsg != NULL; cmsg = CMSG_NXTHDR(&msg, cmsg)) { @@ -720,11 +899,24 @@ comm_point_udp_ancil_callback(int fd, short event, void* arg) if(verbosity >= VERB_ALGO) p_ancil("receive_udp on interface", &rep); #endif /* S_SPLINT_S */ + + if(rep.c->pp2_enabled && !consume_pp2_header(rep.c->buffer, + &rep, 0)) { + log_err("proxy_protocol: could not consume PROXYv2 header"); + return; + } + if(!rep.is_proxied) { + rep.client_addrlen = rep.remote_addrlen; + memmove(&rep.client_addr, &rep.remote_addr, + rep.remote_addrlen); + } + fptr_ok(fptr_whitelist_comm_point(rep.c->callback)); if((*rep.c->callback)(rep.c, rep.c->cb_arg, NETEVENT_NOERROR, &rep)) { /* send back immediate reply */ (void)comm_point_send_udp_msg_if(rep.c, rep.c->buffer, - (struct sockaddr*)&rep.addr, rep.addrlen, &rep); + (struct sockaddr*)&rep.remote_addr, + rep.remote_addrlen, &rep); } if(!rep.c || rep.c->fd == -1) /* commpoint closed */ break; @@ -755,12 +947,12 @@ comm_point_udp_callback(int fd, short event, void* arg) ub_comm_base_now(rep.c->ev->base); for(i=0; ibuffer); - rep.addrlen = (socklen_t)sizeof(rep.addr); + rep.remote_addrlen = (socklen_t)sizeof(rep.remote_addr); log_assert(fd != -1); log_assert(sldns_buffer_remaining(rep.c->buffer) > 0); rcv = recvfrom(fd, (void*)sldns_buffer_begin(rep.c->buffer), - sldns_buffer_remaining(rep.c->buffer), 0, - (struct sockaddr*)&rep.addr, &rep.addrlen); + sldns_buffer_remaining(rep.c->buffer), MSG_DONTWAIT, + (struct sockaddr*)&rep.remote_addr, &rep.remote_addrlen); if(rcv == -1) { #ifndef USE_WINSOCK if(errno != EAGAIN && errno != EINTR @@ -780,6 +972,19 @@ comm_point_udp_callback(int fd, short event, void* arg) sldns_buffer_skip(rep.c->buffer, rcv); sldns_buffer_flip(rep.c->buffer); rep.srctype = 0; + rep.is_proxied = 0; + + if(rep.c->pp2_enabled && !consume_pp2_header(rep.c->buffer, + &rep, 0)) { + log_err("proxy_protocol: could not consume PROXYv2 header"); + return; + } + if(!rep.is_proxied) { + rep.client_addrlen = rep.remote_addrlen; + memmove(&rep.client_addr, &rep.remote_addr, + rep.remote_addrlen); + } + fptr_ok(fptr_whitelist_comm_point(rep.c->callback)); if((*rep.c->callback)(rep.c, rep.c->cb_arg, NETEVENT_NOERROR, &rep)) { /* send back immediate reply */ @@ -789,7 +994,8 @@ comm_point_udp_callback(int fd, short event, void* arg) buffer = rep.c->buffer; #endif (void)comm_point_send_udp_msg(rep.c, buffer, - (struct sockaddr*)&rep.addr, rep.addrlen, 0); + (struct sockaddr*)&rep.remote_addr, + rep.remote_addrlen, 0); } if(!rep.c || rep.c->fd != fd) /* commpoint closed to -1 or reused for another UDP port. Note rep.c cannot be reused with TCP fd. */ @@ -889,6 +1095,16 @@ int comm_point_perform_accept(struct comm_point* c, struct timeval tv; verbose(VERB_ALGO, "out of file descriptors: " "slow accept"); + ub_comm_base_now(b); + if(b->eb->last_slow_log+SLOW_LOG_TIME <= + b->eb->secs) { + b->eb->last_slow_log = b->eb->secs; + verbose(VERB_OPS, "accept failed, " + "slow down accept for %d " + "msec: %s", + NETEVENT_SLOW_ACCEPT_TIME, + sock_strerror(errno)); + } b->eb->slow_accept_enabled = 1; fptr_ok(fptr_whitelist_stop_accept( b->stop_accept)); @@ -909,6 +1125,9 @@ int comm_point_perform_accept(struct comm_point* c, /* we do not want to log here, * error: "event_add failed." */ } + } else { + log_err("accept, with no slow down, " + "failed: %s", sock_strerror(errno)); } return -1; } @@ -1092,10 +1311,16 @@ comm_point_tcp_accept_callback(int fd, short event, void* arg) } log_assert(fd != -1); (void)fd; - new_fd = comm_point_perform_accept(c, &c_hdl->repinfo.addr, - &c_hdl->repinfo.addrlen); + new_fd = comm_point_perform_accept(c, &c_hdl->repinfo.remote_addr, + &c_hdl->repinfo.remote_addrlen); if(new_fd == -1) return; + /* Copy remote_address to client_address. + * Simplest way/time for streams to do that. */ + c_hdl->repinfo.client_addrlen = c_hdl->repinfo.remote_addrlen; + memmove(&c_hdl->repinfo.client_addr, + &c_hdl->repinfo.remote_addr, + c_hdl->repinfo.remote_addrlen); if(c->ssl) { c_hdl->ssl = incoming_ssl_fd(c->ssl, new_fd); if(!c_hdl->ssl) { @@ -1147,6 +1372,7 @@ reclaim_tcp_handler(struct comm_point* c) c->tcp_more_read_again = NULL; c->tcp_more_write_again = NULL; c->tcp_byte_count = 0; + c->pp2_header_state = pp2_header_none; sldns_buffer_clear(c->buffer); } @@ -1278,8 +1504,8 @@ ssl_handshake(struct comm_point* c) return 0; /* silence reset by peer */ #endif if(!tcp_connect_errno_needs_log( - (struct sockaddr*)&c->repinfo.addr, - c->repinfo.addrlen)) + (struct sockaddr*)&c->repinfo.remote_addr, + c->repinfo.remote_addrlen)) return 0; /* silence connect failures that show up because after connect this is the first system call that accesses the socket */ @@ -1291,8 +1517,9 @@ ssl_handshake(struct comm_point* c) unsigned long err = ERR_get_error(); if(!squelch_err_ssl_handshake(err)) { log_crypto_err_code("ssl handshake failed", err); - log_addr(VERB_OPS, "ssl handshake failed", &c->repinfo.addr, - c->repinfo.addrlen); + log_addr(VERB_OPS, "ssl handshake failed", + &c->repinfo.remote_addr, + c->repinfo.remote_addrlen); } return 0; } @@ -1309,7 +1536,8 @@ ssl_handshake(struct comm_point* c) if(!x) { log_addr(VERB_ALGO, "SSL connection failed: " "no certificate", - &c->repinfo.addr, c->repinfo.addrlen); + &c->repinfo.remote_addr, + c->repinfo.remote_addrlen); return 0; } log_cert(VERB_ALGO, "peer certificate", x); @@ -1319,13 +1547,13 @@ ssl_handshake(struct comm_point* c) snprintf(buf, sizeof(buf), "SSL connection " "to %s authenticated", SSL_get0_peername(c->ssl)); - log_addr(VERB_ALGO, buf, &c->repinfo.addr, - c->repinfo.addrlen); + log_addr(VERB_ALGO, buf, &c->repinfo.remote_addr, + c->repinfo.remote_addrlen); } else { #endif log_addr(VERB_ALGO, "SSL connection " - "authenticated", &c->repinfo.addr, - c->repinfo.addrlen); + "authenticated", &c->repinfo.remote_addr, + c->repinfo.remote_addrlen); #ifdef HAVE_SSL_GET0_PEERNAME } #endif @@ -1342,14 +1570,15 @@ ssl_handshake(struct comm_point* c) } log_addr(VERB_ALGO, "SSL connection failed: " "failed to authenticate", - &c->repinfo.addr, c->repinfo.addrlen); + &c->repinfo.remote_addr, + c->repinfo.remote_addrlen); return 0; } } else { /* unauthenticated, the verify peer flag was not set * in c->ssl when the ssl object was created from ssl_ctx */ - log_addr(VERB_ALGO, "SSL connection", &c->repinfo.addr, - c->repinfo.addrlen); + log_addr(VERB_ALGO, "SSL connection", &c->repinfo.remote_addr, + c->repinfo.remote_addrlen); } #ifdef HAVE_SSL_GET0_ALPN_SELECTED @@ -1390,6 +1619,142 @@ ssl_handle_read(struct comm_point* c) if(c->ssl_shake_state != comm_ssl_shake_none) return 1; } + if(c->pp2_enabled && c->pp2_header_state != pp2_header_done) { + struct pp2_header* header = NULL; + size_t want_read_size = 0; + size_t current_read_size = 0; + if(c->pp2_header_state == pp2_header_none) { + want_read_size = PP2_HEADER_SIZE; + if(sldns_buffer_remaining(c->buffer)repinfo.remote_addr, + c->repinfo.remote_addrlen); + return 0; + } + verbose(VERB_ALGO, "proxy_protocol: reading fixed " + "part of PROXYv2 header (len %lu)", + (unsigned long)want_read_size); + current_read_size = want_read_size; + if(c->tcp_byte_count < current_read_size) { + ERR_clear_error(); + if((r=SSL_read(c->ssl, (void*)sldns_buffer_at( + c->buffer, c->tcp_byte_count), + current_read_size - + c->tcp_byte_count)) <= 0) { + int want = SSL_get_error(c->ssl, r); + if(want == SSL_ERROR_ZERO_RETURN) { + if(c->tcp_req_info) + return tcp_req_info_handle_read_close(c->tcp_req_info); + return 0; /* shutdown, closed */ + } else if(want == SSL_ERROR_WANT_READ) { +#ifdef USE_WINSOCK + ub_winsock_tcp_wouldblock(c->ev->ev, UB_EV_READ); +#endif + return 1; /* read more later */ + } else if(want == SSL_ERROR_WANT_WRITE) { + c->ssl_shake_state = comm_ssl_shake_hs_write; + comm_point_listen_for_rw(c, 0, 1); + return 1; + } else if(want == SSL_ERROR_SYSCALL) { +#ifdef ECONNRESET + if(errno == ECONNRESET && verbosity < 2) + return 0; /* silence reset by peer */ +#endif + if(errno != 0) + log_err("SSL_read syscall: %s", + strerror(errno)); + return 0; + } + log_crypto_err("could not SSL_read"); + return 0; + } + c->tcp_byte_count += r; + if(c->tcp_byte_count != current_read_size) return 1; + c->pp2_header_state = pp2_header_init; + } + } + if(c->pp2_header_state == pp2_header_init) { + header = pp2_read_header(c->buffer); + if(!header) { + log_err("proxy_protocol: could not parse " + "PROXYv2 header"); + return 0; + } + want_read_size = ntohs(header->len); + if(sldns_buffer_remaining(c->buffer) < + PP2_HEADER_SIZE + want_read_size) { + log_err_addr("proxy_protocol: not enough " + "buffer size to read PROXYv2 header", "", + &c->repinfo.remote_addr, + c->repinfo.remote_addrlen); + return 0; + } + verbose(VERB_ALGO, "proxy_protocol: reading variable " + "part of PROXYv2 header (len %lu)", + (unsigned long)want_read_size); + current_read_size = PP2_HEADER_SIZE + want_read_size; + if(want_read_size == 0) { + /* nothing more to read; header is complete */ + c->pp2_header_state = pp2_header_done; + } else if(c->tcp_byte_count < current_read_size) { + ERR_clear_error(); + if((r=SSL_read(c->ssl, (void*)sldns_buffer_at( + c->buffer, c->tcp_byte_count), + current_read_size - + c->tcp_byte_count)) <= 0) { + int want = SSL_get_error(c->ssl, r); + if(want == SSL_ERROR_ZERO_RETURN) { + if(c->tcp_req_info) + return tcp_req_info_handle_read_close(c->tcp_req_info); + return 0; /* shutdown, closed */ + } else if(want == SSL_ERROR_WANT_READ) { +#ifdef USE_WINSOCK + ub_winsock_tcp_wouldblock(c->ev->ev, UB_EV_READ); +#endif + return 1; /* read more later */ + } else if(want == SSL_ERROR_WANT_WRITE) { + c->ssl_shake_state = comm_ssl_shake_hs_write; + comm_point_listen_for_rw(c, 0, 1); + return 1; + } else if(want == SSL_ERROR_SYSCALL) { +#ifdef ECONNRESET + if(errno == ECONNRESET && verbosity < 2) + return 0; /* silence reset by peer */ +#endif + if(errno != 0) + log_err("SSL_read syscall: %s", + strerror(errno)); + return 0; + } + log_crypto_err("could not SSL_read"); + return 0; + } + c->tcp_byte_count += r; + if(c->tcp_byte_count != current_read_size) return 1; + c->pp2_header_state = pp2_header_done; + } + } + if(c->pp2_header_state != pp2_header_done || !header) { + log_err_addr("proxy_protocol: wrong state for the " + "PROXYv2 header", "", &c->repinfo.remote_addr, + c->repinfo.remote_addrlen); + return 0; + } + if(!consume_pp2_header(c->buffer, &c->repinfo, 1)) { + log_err_addr("proxy_protocol: could not consume " + "PROXYv2 header", "", &c->repinfo.remote_addr, + c->repinfo.remote_addrlen); + return 0; + } + verbose(VERB_ALGO, "proxy_protocol: successful read of " + "PROXYv2 header"); + /* Clear and reset the buffer to read the following + * DNS packet(s). */ + sldns_buffer_clear(c->buffer); + c->tcp_byte_count = 0; + return 1; + } if(c->tcp_byte_count < sizeof(uint16_t)) { /* read length bytes */ ERR_clear_error(); @@ -1649,16 +2014,18 @@ ssl_handle_it(struct comm_point* c, int is_write) return ssl_handle_write(c); } -/** Handle tcp reading callback. +/** + * Handle tcp reading callback. * @param fd: file descriptor of socket. * @param c: comm point to read from into buffer. * @param short_ok: if true, very short packets are OK (for comm_local). - * @return: 0 on error + * @return: 0 on error */ static int comm_point_tcp_handle_read(int fd, struct comm_point* c, int short_ok) { ssize_t r; + int recv_initial = 0; log_assert(c->type == comm_tcp || c->type == comm_local); if(c->ssl) return ssl_handle_it(c, 0); @@ -1666,78 +2033,111 @@ comm_point_tcp_handle_read(int fd, struct comm_point* c, int short_ok) return 0; log_assert(fd != -1); + if(c->pp2_enabled && c->pp2_header_state != pp2_header_done) { + struct pp2_header* header = NULL; + size_t want_read_size = 0; + size_t current_read_size = 0; + if(c->pp2_header_state == pp2_header_none) { + want_read_size = PP2_HEADER_SIZE; + if(sldns_buffer_remaining(c->buffer)repinfo.remote_addr, + c->repinfo.remote_addrlen); + return 0; + } + verbose(VERB_ALGO, "proxy_protocol: reading fixed " + "part of PROXYv2 header (len %lu)", + (unsigned long)want_read_size); + current_read_size = want_read_size; + if(c->tcp_byte_count < current_read_size) { + r = recv(fd, (void*)sldns_buffer_at(c->buffer, + c->tcp_byte_count), + current_read_size-c->tcp_byte_count, MSG_DONTWAIT); + if(r == 0) { + if(c->tcp_req_info) + return tcp_req_info_handle_read_close(c->tcp_req_info); + return 0; + } else if(r == -1) { + goto recv_error_initial; + } + c->tcp_byte_count += r; + if(c->tcp_byte_count != current_read_size) return 1; + c->pp2_header_state = pp2_header_init; + } + } + if(c->pp2_header_state == pp2_header_init) { + header = pp2_read_header(c->buffer); + if(!header) { + log_err("proxy_protocol: could not parse " + "PROXYv2 header"); + return 0; + } + want_read_size = ntohs(header->len); + if(sldns_buffer_remaining(c->buffer) < + PP2_HEADER_SIZE + want_read_size) { + log_err_addr("proxy_protocol: not enough " + "buffer size to read PROXYv2 header", "", + &c->repinfo.remote_addr, + c->repinfo.remote_addrlen); + return 0; + } + verbose(VERB_ALGO, "proxy_protocol: reading variable " + "part of PROXYv2 header (len %lu)", + (unsigned long)want_read_size); + current_read_size = PP2_HEADER_SIZE + want_read_size; + if(want_read_size == 0) { + /* nothing more to read; header is complete */ + c->pp2_header_state = pp2_header_done; + } else if(c->tcp_byte_count < current_read_size) { + r = recv(fd, (void*)sldns_buffer_at(c->buffer, + c->tcp_byte_count), + current_read_size-c->tcp_byte_count, MSG_DONTWAIT); + if(r == 0) { + if(c->tcp_req_info) + return tcp_req_info_handle_read_close(c->tcp_req_info); + return 0; + } else if(r == -1) { + goto recv_error; + } + c->tcp_byte_count += r; + if(c->tcp_byte_count != current_read_size) return 1; + c->pp2_header_state = pp2_header_done; + } + } + if(c->pp2_header_state != pp2_header_done || !header) { + log_err_addr("proxy_protocol: wrong state for the " + "PROXYv2 header", "", &c->repinfo.remote_addr, + c->repinfo.remote_addrlen); + return 0; + } + if(!consume_pp2_header(c->buffer, &c->repinfo, 1)) { + log_err_addr("proxy_protocol: could not consume " + "PROXYv2 header", "", &c->repinfo.remote_addr, + c->repinfo.remote_addrlen); + return 0; + } + verbose(VERB_ALGO, "proxy_protocol: successful read of " + "PROXYv2 header"); + /* Clear and reset the buffer to read the following + * DNS packet(s). */ + sldns_buffer_clear(c->buffer); + c->tcp_byte_count = 0; + return 1; + } + if(c->tcp_byte_count < sizeof(uint16_t)) { /* read length bytes */ r = recv(fd,(void*)sldns_buffer_at(c->buffer,c->tcp_byte_count), - sizeof(uint16_t)-c->tcp_byte_count, 0); + sizeof(uint16_t)-c->tcp_byte_count, MSG_DONTWAIT); if(r == 0) { if(c->tcp_req_info) return tcp_req_info_handle_read_close(c->tcp_req_info); return 0; } else if(r == -1) { -#ifndef USE_WINSOCK - if(errno == EINTR || errno == EAGAIN) - return 1; -#ifdef ECONNRESET - if(errno == ECONNRESET && verbosity < 2) - return 0; /* silence reset by peer */ -#endif -#ifdef ECONNREFUSED - if(errno == ECONNREFUSED && verbosity < 2) - return 0; /* silence reset by peer */ -#endif -#ifdef ENETUNREACH - if(errno == ENETUNREACH && verbosity < 2) - return 0; /* silence it */ -#endif -#ifdef EHOSTDOWN - if(errno == EHOSTDOWN && verbosity < 2) - return 0; /* silence it */ -#endif -#ifdef EHOSTUNREACH - if(errno == EHOSTUNREACH && verbosity < 2) - return 0; /* silence it */ -#endif -#ifdef ENETDOWN - if(errno == ENETDOWN && verbosity < 2) - return 0; /* silence it */ -#endif -#ifdef EACCES - if(errno == EACCES && verbosity < 2) - return 0; /* silence it */ -#endif -#ifdef ENOTCONN - if(errno == ENOTCONN) { - log_err_addr("read (in tcp s) failed and this could be because TCP Fast Open is enabled [--disable-tfo-client --disable-tfo-server] but does not work", sock_strerror(errno), - &c->repinfo.addr, c->repinfo.addrlen); - return 0; - } -#endif -#else /* USE_WINSOCK */ - if(WSAGetLastError() == WSAECONNREFUSED && verbosity < 2) - return 0; - if(WSAGetLastError() == WSAEHOSTDOWN && verbosity < 2) - return 0; - if(WSAGetLastError() == WSAEHOSTUNREACH && verbosity < 2) - return 0; - if(WSAGetLastError() == WSAENETDOWN && verbosity < 2) - return 0; - if(WSAGetLastError() == WSAENETUNREACH && verbosity < 2) - return 0; - if(WSAGetLastError() == WSAECONNRESET) - return 0; - if(WSAGetLastError() == WSAEINPROGRESS) - return 1; - if(WSAGetLastError() == WSAEWOULDBLOCK) { - ub_winsock_tcp_wouldblock(c->ev->ev, - UB_EV_READ); - return 1; - } -#endif - log_err_addr("read (in tcp s)", sock_strerror(errno), - &c->repinfo.addr, c->repinfo.addrlen); - return 0; - } + if(c->pp2_enabled) goto recv_error; + goto recv_error_initial; + } c->tcp_byte_count += r; if(c->tcp_byte_count != sizeof(uint16_t)) return 1; @@ -1746,48 +2146,110 @@ comm_point_tcp_handle_read(int fd, struct comm_point* c, int short_ok) verbose(VERB_QUERY, "tcp: dropped larger than buffer"); return 0; } - sldns_buffer_set_limit(c->buffer, + sldns_buffer_set_limit(c->buffer, sldns_buffer_read_u16_at(c->buffer, 0)); - if(!short_ok && + if(!short_ok && sldns_buffer_limit(c->buffer) < LDNS_HEADER_SIZE) { verbose(VERB_QUERY, "tcp: dropped bogus too short."); return 0; } - verbose(VERB_ALGO, "Reading tcp query of length %d", + verbose(VERB_ALGO, "Reading tcp query of length %d", (int)sldns_buffer_limit(c->buffer)); } if(sldns_buffer_remaining(c->buffer) == 0) - log_err("in comm_point_tcp_handle_read buffer_remaining is not > 0 as expected, continuing with (harmless) 0 length recv"); + log_err("in comm_point_tcp_handle_read buffer_remaining is " + "not > 0 as expected, continuing with (harmless) 0 " + "length recv"); r = recv(fd, (void*)sldns_buffer_current(c->buffer), - sldns_buffer_remaining(c->buffer), 0); + sldns_buffer_remaining(c->buffer), MSG_DONTWAIT); if(r == 0) { if(c->tcp_req_info) return tcp_req_info_handle_read_close(c->tcp_req_info); return 0; } else if(r == -1) { -#ifndef USE_WINSOCK - if(errno == EINTR || errno == EAGAIN) - return 1; -#else /* USE_WINSOCK */ - if(WSAGetLastError() == WSAECONNRESET) - return 0; - if(WSAGetLastError() == WSAEINPROGRESS) - return 1; - if(WSAGetLastError() == WSAEWOULDBLOCK) { - ub_winsock_tcp_wouldblock(c->ev->ev, UB_EV_READ); - return 1; - } -#endif - log_err_addr("read (in tcp r)", sock_strerror(errno), - &c->repinfo.addr, c->repinfo.addrlen); - return 0; + goto recv_error; } sldns_buffer_skip(c->buffer, r); if(sldns_buffer_remaining(c->buffer) <= 0) { tcp_callback_reader(c); } return 1; + +recv_error_initial: + recv_initial = 1; +recv_error: +#ifndef USE_WINSOCK + if(errno == EINTR || errno == EAGAIN) + return 1; + if(recv_initial) { +#ifdef ECONNRESET + if(errno == ECONNRESET && verbosity < 2) + return 0; /* silence reset by peer */ +#endif +#ifdef ECONNREFUSED + if(errno == ECONNREFUSED && verbosity < 2) + return 0; /* silence reset by peer */ +#endif +#ifdef ENETUNREACH + if(errno == ENETUNREACH && verbosity < 2) + return 0; /* silence it */ +#endif +#ifdef EHOSTDOWN + if(errno == EHOSTDOWN && verbosity < 2) + return 0; /* silence it */ +#endif +#ifdef EHOSTUNREACH + if(errno == EHOSTUNREACH && verbosity < 2) + return 0; /* silence it */ +#endif +#ifdef ENETDOWN + if(errno == ENETDOWN && verbosity < 2) + return 0; /* silence it */ +#endif +#ifdef EACCES + if(errno == EACCES && verbosity < 2) + return 0; /* silence it */ +#endif +#ifdef ENOTCONN + if(errno == ENOTCONN) { + log_err_addr("read (in tcp s) failed and this " + "could be because TCP Fast Open is " + "enabled [--disable-tfo-client " + "--disable-tfo-server] but does not " + "work", sock_strerror(errno), + &c->repinfo.remote_addr, + c->repinfo.remote_addrlen); + return 0; + } +#endif + } +#else /* USE_WINSOCK */ + if(recv_initial) { + if(WSAGetLastError() == WSAECONNREFUSED && verbosity < 2) + return 0; + if(WSAGetLastError() == WSAEHOSTDOWN && verbosity < 2) + return 0; + if(WSAGetLastError() == WSAEHOSTUNREACH && verbosity < 2) + return 0; + if(WSAGetLastError() == WSAENETDOWN && verbosity < 2) + return 0; + if(WSAGetLastError() == WSAENETUNREACH && verbosity < 2) + return 0; + } + if(WSAGetLastError() == WSAECONNRESET) + return 0; + if(WSAGetLastError() == WSAEINPROGRESS) + return 1; + if(WSAGetLastError() == WSAEWOULDBLOCK) { + ub_winsock_tcp_wouldblock(c->ev->ev, + UB_EV_READ); + return 1; + } +#endif + log_err_addr("read (in tcp s)", sock_strerror(errno), + &c->repinfo.remote_addr, c->repinfo.remote_addrlen); + return 0; } /** @@ -1833,7 +2295,8 @@ comm_point_tcp_handle_write(int fd, struct comm_point* c) return 0; /* silence lots of chatter in the logs */ else if(error != 0) { log_err_addr("tcp connect", strerror(error), - &c->repinfo.addr, c->repinfo.addrlen); + &c->repinfo.remote_addr, + c->repinfo.remote_addrlen); #else /* USE_WINSOCK */ /* examine error */ if(error == WSAEINPROGRESS) @@ -1845,7 +2308,8 @@ comm_point_tcp_handle_write(int fd, struct comm_point* c) return 0; else if(error != 0) { log_err_addr("tcp connect", wsa_strerror(error), - &c->repinfo.addr, c->repinfo.addrlen); + &c->repinfo.remote_addr, + c->repinfo.remote_addrlen); #endif /* USE_WINSOCK */ return 0; } @@ -1877,8 +2341,8 @@ comm_point_tcp_handle_write(int fd, struct comm_point* c) iov[1].iov_len = sldns_buffer_limit(buffer); } log_assert(iov[0].iov_len > 0); - msg.msg_name = &c->repinfo.addr; - msg.msg_namelen = c->repinfo.addrlen; + msg.msg_name = &c->repinfo.remote_addr; + msg.msg_namelen = c->repinfo.remote_addrlen; msg.msg_iov = iov; msg.msg_iovlen = 2; r = sendmsg(fd, &msg, MSG_FASTOPEN); @@ -1904,14 +2368,16 @@ comm_point_tcp_handle_write(int fd, struct comm_point* c) if(verbosity < 2) return 0; /* silence lots of chatter in the logs */ log_err_addr("tcp sendmsg", strerror(errno), - &c->repinfo.addr, c->repinfo.addrlen); + &c->repinfo.remote_addr, + c->repinfo.remote_addrlen); return 0; } verbose(VERB_ALGO, "tcp sendmsg for fastopen failed (with %s), try normal connect", strerror(errno)); /* fallthrough to nonFASTOPEN * (MSG_FASTOPEN on Linux 3 produces EPIPE) * we need to perform connect() */ - if(connect(fd, (struct sockaddr *)&c->repinfo.addr, c->repinfo.addrlen) == -1) { + if(connect(fd, (struct sockaddr *)&c->repinfo.remote_addr, + c->repinfo.remote_addrlen) == -1) { #ifdef EINPROGRESS if(errno == EINPROGRESS) return 1; /* wait until connect done*/ @@ -1922,9 +2388,12 @@ comm_point_tcp_handle_write(int fd, struct comm_point* c) return 1; /* wait until connect done*/ #endif if(tcp_connect_errno_needs_log( - (struct sockaddr *)&c->repinfo.addr, c->repinfo.addrlen)) { + (struct sockaddr *)&c->repinfo.remote_addr, + c->repinfo.remote_addrlen)) { log_err_addr("outgoing tcp: connect after EPIPE for fastopen", - strerror(errno), &c->repinfo.addr, c->repinfo.addrlen); + strerror(errno), + &c->repinfo.remote_addr, + c->repinfo.remote_addrlen); } return 0; } @@ -1989,10 +2458,12 @@ comm_point_tcp_handle_write(int fd, struct comm_point* c) #endif # ifdef HAVE_WRITEV log_err_addr("tcp writev", strerror(errno), - &c->repinfo.addr, c->repinfo.addrlen); + &c->repinfo.remote_addr, + c->repinfo.remote_addrlen); # else /* HAVE_WRITEV */ log_err_addr("tcp send s", strerror(errno), - &c->repinfo.addr, c->repinfo.addrlen); + &c->repinfo.remote_addr, + c->repinfo.remote_addrlen); # endif /* HAVE_WRITEV */ #else if(WSAGetLastError() == WSAENOTCONN) @@ -2008,7 +2479,8 @@ comm_point_tcp_handle_write(int fd, struct comm_point* c) return 0; /* silence reset by peer */ log_err_addr("tcp send s", wsa_strerror(WSAGetLastError()), - &c->repinfo.addr, c->repinfo.addrlen); + &c->repinfo.remote_addr, + c->repinfo.remote_addrlen); #endif return 0; } @@ -2056,7 +2528,8 @@ comm_point_tcp_handle_write(int fd, struct comm_point* c) return 0; /* silence reset by peer */ #endif log_err_addr("tcp send r", sock_strerror(errno), - &c->repinfo.addr, c->repinfo.addrlen); + &c->repinfo.remote_addr, + c->repinfo.remote_addrlen); return 0; } if(c->tcp_write_and_read) { @@ -2302,7 +2775,7 @@ http_read_more(int fd, struct comm_point* c) ssize_t r; log_assert(sldns_buffer_remaining(c->buffer) > 0); r = recv(fd, (void*)sldns_buffer_current(c->buffer), - sldns_buffer_remaining(c->buffer), 0); + sldns_buffer_remaining(c->buffer), MSG_DONTWAIT); if(r == 0) { return 0; } else if(r == -1) { @@ -2320,7 +2793,7 @@ http_read_more(int fd, struct comm_point* c) } #endif log_err_addr("read (in http r)", sock_strerror(errno), - &c->repinfo.addr, c->repinfo.addrlen); + &c->repinfo.remote_addr, c->repinfo.remote_addrlen); return 0; } verbose(VERB_ALGO, "http read more skip to %d + %d", @@ -2740,7 +3213,7 @@ ssize_t http2_recv_cb(nghttp2_session* ATTR_UNUSED(session), uint8_t* buf, } #endif /* HAVE_SSL */ - ret = recv(h2_session->c->fd, buf, len, 0); + ret = recv(h2_session->c->fd, buf, len, MSG_DONTWAIT); if(ret == 0) { return NGHTTP2_ERR_EOF; } else if(ret < 0) { @@ -2752,8 +3225,8 @@ ssize_t http2_recv_cb(nghttp2_session* ATTR_UNUSED(session), uint8_t* buf, return NGHTTP2_ERR_CALLBACK_FAILURE; #endif log_err_addr("could not http2 recv: %s", strerror(errno), - &h2_session->c->repinfo.addr, - h2_session->c->repinfo.addrlen); + &h2_session->c->repinfo.remote_addr, + h2_session->c->repinfo.remote_addrlen); #else /* USE_WINSOCK */ if(WSAGetLastError() == WSAECONNRESET) return NGHTTP2_ERR_CALLBACK_FAILURE; @@ -2766,8 +3239,8 @@ ssize_t http2_recv_cb(nghttp2_session* ATTR_UNUSED(session), uint8_t* buf, } log_err_addr("could not http2 recv: %s", wsa_strerror(WSAGetLastError()), - &h2_session->c->repinfo.addr, - h2_session->c->repinfo.addrlen); + &h2_session->c->repinfo.remote_addr, + h2_session->c->repinfo.remote_addrlen); #endif return NGHTTP2_ERR_CALLBACK_FAILURE; } @@ -2789,8 +3262,8 @@ comm_point_http2_handle_read(int ATTR_UNUSED(fd), struct comm_point* c) if(ret != NGHTTP2_ERR_EOF && ret != NGHTTP2_ERR_CALLBACK_FAILURE) { char a[256]; - addr_to_str(&c->repinfo.addr, c->repinfo.addrlen, - a, sizeof(a)); + addr_to_str(&c->repinfo.remote_addr, + c->repinfo.remote_addrlen, a, sizeof(a)); verbose(VERB_QUERY, "http2: session_recv from %s failed, " "error: %s", a, nghttp2_strerror(ret)); } @@ -2938,7 +3411,7 @@ http_check_connect(int fd, struct comm_point* c) return 0; /* silence lots of chatter in the logs */ else if(error != 0) { log_err_addr("http connect", strerror(error), - &c->repinfo.addr, c->repinfo.addrlen); + &c->repinfo.remote_addr, c->repinfo.remote_addrlen); #else /* USE_WINSOCK */ /* examine error */ if(error == WSAEINPROGRESS) @@ -2950,7 +3423,7 @@ http_check_connect(int fd, struct comm_point* c) return 0; else if(error != 0) { log_err_addr("http connect", wsa_strerror(error), - &c->repinfo.addr, c->repinfo.addrlen); + &c->repinfo.remote_addr, c->repinfo.remote_addrlen); #endif /* USE_WINSOCK */ return 0; } @@ -3020,7 +3493,7 @@ http_write_more(int fd, struct comm_point* c) } #endif log_err_addr("http send r", sock_strerror(errno), - &c->repinfo.addr, c->repinfo.addrlen); + &c->repinfo.remote_addr, c->repinfo.remote_addrlen); return 0; } sldns_buffer_skip(c->buffer, r); @@ -3084,8 +3557,8 @@ ssize_t http2_send_cb(nghttp2_session* ATTR_UNUSED(session), const uint8_t* buf, return NGHTTP2_ERR_CALLBACK_FAILURE; #endif log_err_addr("could not http2 write: %s", strerror(errno), - &h2_session->c->repinfo.addr, - h2_session->c->repinfo.addrlen); + &h2_session->c->repinfo.remote_addr, + h2_session->c->repinfo.remote_addrlen); #else /* USE_WINSOCK */ if(WSAGetLastError() == WSAENOTCONN) return NGHTTP2_ERR_WOULDBLOCK; @@ -3100,8 +3573,8 @@ ssize_t http2_send_cb(nghttp2_session* ATTR_UNUSED(session), const uint8_t* buf, return NGHTTP2_ERR_CALLBACK_FAILURE; log_err_addr("could not http2 write: %s", wsa_strerror(WSAGetLastError()), - &h2_session->c->repinfo.addr, - h2_session->c->repinfo.addrlen); + &h2_session->c->repinfo.remote_addr, + h2_session->c->repinfo.remote_addrlen); #endif return NGHTTP2_ERR_CALLBACK_FAILURE; } @@ -3281,7 +3754,8 @@ void comm_point_raw_handle_callback(int ATTR_UNUSED(fd), struct comm_point* comm_point_create_udp(struct comm_base *base, int fd, sldns_buffer* buffer, - comm_point_callback_type* callback, void* callback_arg, struct unbound_socket* socket) + int pp2_enabled, comm_point_callback_type* callback, + void* callback_arg, struct unbound_socket* socket) { struct comm_point* c = (struct comm_point*)calloc(1, sizeof(struct comm_point)); @@ -3321,6 +3795,8 @@ comm_point_create_udp(struct comm_base *base, int fd, sldns_buffer* buffer, c->callback = callback; c->cb_arg = callback_arg; c->socket = socket; + c->pp2_enabled = pp2_enabled; + 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, @@ -3340,8 +3816,8 @@ comm_point_create_udp(struct comm_base *base, int fd, sldns_buffer* buffer, } struct comm_point* -comm_point_create_udp_ancil(struct comm_base *base, int fd, - sldns_buffer* buffer, +comm_point_create_udp_ancil(struct comm_base *base, int fd, + sldns_buffer* buffer, int pp2_enabled, comm_point_callback_type* callback, void* callback_arg, struct unbound_socket* socket) { struct comm_point* c = (struct comm_point*)calloc(1, @@ -3382,6 +3858,8 @@ comm_point_create_udp_ancil(struct comm_base *base, int fd, c->callback = callback; c->cb_arg = callback_arg; c->socket = socket; + c->pp2_enabled = pp2_enabled; + 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, @@ -3461,6 +3939,8 @@ comm_point_create_tcp_handler(struct comm_base *base, c->callback = callback; c->cb_arg = callback_arg; c->socket = socket; + c->pp2_enabled = parent->pp2_enabled; + c->pp2_header_state = pp2_header_none; if(spoolbuf) { c->tcp_req_info = tcp_req_info_create(spoolbuf); if(!c->tcp_req_info) { @@ -3556,6 +4036,8 @@ comm_point_create_http_handler(struct comm_base *base, c->callback = callback; c->cb_arg = callback_arg; c->socket = socket; + c->pp2_enabled = 0; + c->pp2_header_state = pp2_header_none; c->http_min_version = http_version_2; c->http2_stream_max_qbuffer_size = bufsize; @@ -3620,7 +4102,8 @@ comm_point_create_tcp(struct comm_base *base, int fd, int num, uint32_t http_max_streams, char* http_endpoint, struct tcl_list* tcp_conn_limit, size_t bufsize, struct sldns_buffer* spoolbuf, enum listen_type port_type, - comm_point_callback_type* callback, void* callback_arg, struct unbound_socket* socket) + int pp2_enabled, comm_point_callback_type* callback, + void* callback_arg, struct unbound_socket* socket) { struct comm_point* c = (struct comm_point*)calloc(1, sizeof(struct comm_point)); @@ -3671,6 +4154,8 @@ comm_point_create_tcp(struct comm_base *base, int fd, int num, c->callback = NULL; c->cb_arg = NULL; c->socket = socket; + c->pp2_enabled = (port_type==listen_type_http?0:pp2_enabled); + 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, @@ -3763,6 +4248,8 @@ comm_point_create_tcp_out(struct comm_base *base, size_t bufsize, c->repinfo.c = c; c->callback = callback; c->cb_arg = callback_arg; + c->pp2_enabled = 0; + c->pp2_header_state = pp2_header_none; evbits = UB_EV_PERSIST | UB_EV_WRITE; c->ev->ev = ub_event_new(base->eb->base, c->fd, evbits, comm_point_tcp_handle_callback, c); @@ -3829,6 +4316,8 @@ comm_point_create_http_out(struct comm_base *base, size_t bufsize, c->repinfo.c = c; c->callback = callback; c->cb_arg = callback_arg; + c->pp2_enabled = 0; + c->pp2_header_state = pp2_header_none; evbits = UB_EV_PERSIST | UB_EV_WRITE; c->ev->ev = ub_event_new(base->eb->base, c->fd, evbits, comm_point_http_handle_callback, c); @@ -3892,6 +4381,8 @@ comm_point_create_local(struct comm_base *base, int fd, size_t bufsize, #endif c->callback = callback; c->cb_arg = callback_arg; + c->pp2_enabled = 0; + c->pp2_header_state = pp2_header_none; /* ub_event stuff */ evbits = UB_EV_PERSIST | UB_EV_READ; c->ev->ev = ub_event_new(base->eb->base, c->fd, evbits, @@ -3953,6 +4444,8 @@ comm_point_create_raw(struct comm_base* base, int fd, int writing, #endif c->callback = callback; c->cb_arg = callback_arg; + c->pp2_enabled = 0; + c->pp2_header_state = pp2_header_none; /* ub_event stuff */ if(writing) evbits = UB_EV_PERSIST | UB_EV_WRITE; @@ -4068,20 +4561,21 @@ comm_point_send_reply(struct comm_reply *repinfo) #endif if(repinfo->c->type == comm_udp) { if(repinfo->srctype) - comm_point_send_udp_msg_if(repinfo->c, - buffer, (struct sockaddr*)&repinfo->addr, - repinfo->addrlen, repinfo); + comm_point_send_udp_msg_if(repinfo->c, buffer, + (struct sockaddr*)&repinfo->remote_addr, + repinfo->remote_addrlen, repinfo); else comm_point_send_udp_msg(repinfo->c, buffer, - (struct sockaddr*)&repinfo->addr, repinfo->addrlen, 0); + (struct sockaddr*)&repinfo->remote_addr, + repinfo->remote_addrlen, 0); #ifdef USE_DNSTAP /* * 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->ai_addr, repinfo->c->socket->addr->ai_addrlen); - log_addr(VERB_ALGO, "response to client", &repinfo->addr, repinfo->addrlen); - dt_msg_send_client_response(repinfo->c->dtenv, &repinfo->addr, (void*)repinfo->c->socket->addr->ai_addr, repinfo->c->type, repinfo->c->buffer); + 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->ai_addr, repinfo->c->type, repinfo->c->buffer); } #endif } else { @@ -4091,8 +4585,8 @@ comm_point_send_reply(struct comm_reply *repinfo) */ 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->ai_addr, repinfo->c->socket->addr->ai_addrlen); - log_addr(VERB_ALGO, "response to client", &repinfo->addr, repinfo->addrlen); - dt_msg_send_client_response(repinfo->c->tcp_parent->dtenv, &repinfo->addr, (void*)repinfo->c->socket->addr->ai_addr, repinfo->c->type, + 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->ai_addr, repinfo->c->type, ( repinfo->c->tcp_req_info? repinfo->c->tcp_req_info->spool_buffer: repinfo->c->buffer )); } #endif diff --git a/util/netevent.h b/util/netevent.h index a92e8196e..a55b5bb3e 100644 --- a/util/netevent.h +++ b/util/netevent.h @@ -106,6 +106,8 @@ typedef int comm_point_callback_type(struct comm_point*, void*, int, /** timeout to slow accept calls when not possible, in msec. */ #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 /** * A communication point dispatcher. Thread specific. @@ -130,10 +132,11 @@ struct comm_reply { /** the comm_point with fd to send reply on to. */ struct comm_point* c; /** the address (for UDP based communication) */ - struct sockaddr_storage addr; + struct sockaddr_storage remote_addr; /** length of address */ - socklen_t addrlen; - /** return type 0 (none), 4(IP4), 6(IP6) */ + socklen_t remote_addrlen; + /** return type 0 (none), 4(IP4), 6(IP6) + * used only with listen_type_udp_ancil* */ int srctype; /* DnsCrypt context */ #ifdef USE_DNSCRYPT @@ -157,6 +160,13 @@ struct comm_reply { pktinfo; /** max udp size for udp packets */ size_t max_udp_size; + /* if set, the request came through a proxy */ + int is_proxied; + /** the client address + * the same as remote_addr if not proxied */ + struct sockaddr_storage client_addr; + /** the original address length */ + socklen_t client_addrlen; }; /** @@ -280,6 +290,19 @@ struct comm_point { /** variable with type of socket, UDP,TCP-accept,TCP,pipe */ type; + /* -------- PROXYv2 ------- */ + /** if set, PROXYv2 is expected on this connection */ + int pp2_enabled; + /** header state for the PROXYv2 header (for TCP) */ + enum { + /** no header encounter yet */ + pp2_header_none = 0, + /** read the static part of the header */ + pp2_header_init, + /** read the full header */ + pp2_header_done + } pp2_header_state; + /* ---------- Behaviour ----------- */ /** if set the connection is NOT closed on delete. */ int do_not_close; @@ -498,8 +521,9 @@ struct ub_event_base* comm_base_internal(struct comm_base* b); * Create an UDP comm point. 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 fd: file descriptor of open UDP socket. * @param buffer: shared buffer by UDP sockets from this thread. + * @param pp2_enabled: if the comm point will support PROXYv2. * @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. @@ -507,7 +531,7 @@ struct ub_event_base* comm_base_internal(struct comm_base* b); * Sets timeout to NULL. Turns off TCP options. */ struct comm_point* comm_point_create_udp(struct comm_base* base, - int fd, struct sldns_buffer* buffer, + int fd, struct sldns_buffer* buffer, int pp2_enabled, comm_point_callback_type* callback, void* callback_arg, struct unbound_socket* socket); /** @@ -515,8 +539,9 @@ struct comm_point* comm_point_create_udp(struct comm_base* base, * Uses recvmsg instead of recv to get udp message. * 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 fd: file descriptor of open UDP socket. * @param buffer: shared buffer by UDP sockets from this thread. + * @param pp2_enabled: if the comm point will support PROXYv2. * @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. @@ -524,7 +549,7 @@ struct comm_point* comm_point_create_udp(struct comm_base* base, * Sets timeout to NULL. Turns off TCP options. */ struct comm_point* comm_point_create_udp_ancil(struct comm_base* base, - int fd, struct sldns_buffer* buffer, + int fd, struct sldns_buffer* buffer, int pp2_enabled, comm_point_callback_type* callback, void* callback_arg, struct unbound_socket* socket); /** @@ -546,6 +571,7 @@ struct comm_point* comm_point_create_udp_ancil(struct comm_base* base, * or NULL to not create those structures in the tcp handlers. * @param port_type: the type of port we are creating a TCP listener for. Used * to select handler type to use. + * @param pp2_enabled: if the comm point will support PROXYv2. * @param callback: callback function pointer for TCP handlers. * @param callback_arg: will be passed to your callback function. * @param socket: and opened socket properties will be passed to your callback function. @@ -559,7 +585,7 @@ struct comm_point* comm_point_create_tcp(struct comm_base* base, uint32_t http_max_streams, char* http_endpoint, struct tcl_list* tcp_conn_limit, size_t bufsize, struct sldns_buffer* spoolbuf, - enum listen_type port_type, + enum listen_type port_type, int pp2_enabled, comm_point_callback_type* callback, void* callback_arg, struct unbound_socket* socket); /** diff --git a/util/proxy_protocol.c b/util/proxy_protocol.c new file mode 100644 index 000000000..757c5141d --- /dev/null +++ b/util/proxy_protocol.c @@ -0,0 +1,139 @@ +/* + * util/proxy_protocol.c - event notification + * + * 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 + * + * This file contains PROXY protocol functions. + */ +#include "config.h" +#include "util/log.h" +#include "util/proxy_protocol.h" + +int +pp2_write_to_buf(struct sldns_buffer* buf, struct sockaddr_storage* src, + int stream) +{ + int af; + if(!src) return 0; + af = (int)((struct sockaddr_in*)src)->sin_family; + if(sldns_buffer_remaining(buf) < + PP2_HEADER_SIZE + (af==AF_INET?12:36)) { + return 0; + } + /* sig */ + sldns_buffer_write(buf, PP2_SIG, PP2_SIG_LEN); + /* version and command */ + sldns_buffer_write_u8(buf, (PP2_VERSION << 4) | PP2_CMD_PROXY); + if(af==AF_INET) { + /* family and protocol */ + sldns_buffer_write_u8(buf, + (PP2_AF_INET<<4) | + (stream?PP2_PROT_STREAM:PP2_PROT_DGRAM)); + /* length */ + sldns_buffer_write_u16(buf, 12); + /* src addr */ + sldns_buffer_write(buf, + &((struct sockaddr_in*)src)->sin_addr.s_addr, 4); + /* dst addr */ + sldns_buffer_write_u32(buf, 0); + /* src port */ + sldns_buffer_write(buf, + &((struct sockaddr_in*)src)->sin_port, 2); + /* dst port */ + sldns_buffer_write_u16(buf, 0); + } else { + /* family and protocol */ + sldns_buffer_write_u8(buf, + (PP2_AF_INET6<<4) | + (stream?PP2_PROT_STREAM:PP2_PROT_DGRAM)); + /* length */ + sldns_buffer_write_u16(buf, 36); + /* src addr */ + sldns_buffer_write(buf, + &((struct sockaddr_in6*)src)->sin6_addr, 16); + /* dst addr */ + sldns_buffer_set_at(buf, + sldns_buffer_position(buf), 0, 16); + sldns_buffer_skip(buf, 16); + /* src port */ + sldns_buffer_write(buf, + &((struct sockaddr_in6*)src)->sin6_port, 2); + /* dst port */ + sldns_buffer_write_u16(buf, 0); + } + return 1; +} + +struct pp2_header* +pp2_read_header(struct sldns_buffer* buf) +{ + size_t size; + struct pp2_header* header = (struct pp2_header*)sldns_buffer_begin(buf); + /* Try to fail all the unsupported cases first. */ + if(sldns_buffer_remaining(buf) < PP2_HEADER_SIZE) { + log_err("proxy_protocol: not enough space for header"); + return NULL; + } + /* Check for PROXYv2 header */ + if(memcmp(header, PP2_SIG, PP2_SIG_LEN) != 0 || + ((header->ver_cmd & 0xF0)>>4) != PP2_VERSION) { + log_err("proxy_protocol: could not match PROXYv2 header"); + return NULL; + } + /* Check the length */ + size = PP2_HEADER_SIZE + ntohs(header->len); + if(sldns_buffer_remaining(buf) < size) { + log_err("proxy_protocol: not enough space for header"); + return NULL; + } + /* Check for supported commands */ + if((header->ver_cmd & 0xF) != PP2_CMD_LOCAL && + (header->ver_cmd & 0xF) != PP2_CMD_PROXY) { + log_err("proxy_protocol: unsupported command"); + return NULL; + } + /* Check for supported family and protocol */ + if(header->fam_prot != 0x00 /* AF_UNSPEC|UNSPEC */ && + header->fam_prot != 0x11 /* AF_INET|STREAM */ && + header->fam_prot != 0x12 /* AF_INET|DGRAM */ && + header->fam_prot != 0x21 /* AF_INET6|STREAM */ && + header->fam_prot != 0x22 /* AF_INET6|DGRAM */) { + log_err("proxy_protocol: unsupported family and protocol"); + return NULL; + } + /* We have a correct header */ + return header; +} diff --git a/util/proxy_protocol.h b/util/proxy_protocol.h new file mode 100644 index 000000000..13cab9d74 --- /dev/null +++ b/util/proxy_protocol.h @@ -0,0 +1,131 @@ +/* + * util/proxy_protocol.h - PROXY protocol + * + * 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 + * + * This file contains PROXY protocol structs and functions. + * Only v2 is supported. TLVs are not currently supported. + */ +#ifndef PROXY_PROTOCOL_H +#define PROXY_PROTOCOL_H + +#include "sldns/sbuffer.h" + +/** PROXYv2 minimum header size */ +#define PP2_HEADER_SIZE 16 + +/** PROXYv2 header signature */ +#define PP2_SIG "\x0D\x0A\x0D\x0A\x00\x0D\x0A\x51\x55\x49\x54\x0A" +#define PP2_SIG_LEN 12 + +/** PROXYv2 version */ +#define PP2_VERSION 0x2 + +/** + * PROXYv2 command. + */ +enum pp2_command { + PP2_CMD_LOCAL = 0x0, + PP2_CMD_PROXY = 0x1 +}; + +/** + * PROXYv2 address family. + */ +enum pp2_af { + PP2_AF_UNSPEC = 0x0, + PP2_AF_INET = 0x1, + PP2_AF_INET6 = 0x2, + PP2_AF_UNIX = 0x3 +}; + +/** + * PROXYv2 protocol. + */ +enum pp2_protocol { + PP2_PROT_UNSPEC = 0x0, + PP2_PROT_STREAM = 0x1, + PP2_PROT_DGRAM = 0x2 +}; + +/** + * PROXYv2 header. + */ +struct pp2_header { + uint8_t sig[PP2_SIG_LEN]; + uint8_t ver_cmd; + uint8_t fam_prot; + uint16_t len; + union { + struct { /* for TCP/UDP over IPv4, len = 12 */ + uint32_t src_addr; + uint32_t dst_addr; + uint16_t src_port; + uint16_t dst_port; + } addr4; + struct { /* for TCP/UDP over IPv6, len = 36 */ + uint8_t src_addr[16]; + uint8_t dst_addr[16]; + uint16_t src_port; + uint16_t dst_port; + } addr6; + struct { /* for AF_UNIX sockets, len = 216 */ + uint8_t src_addr[108]; + uint8_t dst_addr[108]; + } addru; + } addr; +}; + +/** + * Write a PROXYv2 header at the current position of the buffer. + * @param buf: the buffer to write to. + * @param src: the source address. + * @param stream: if the protocol is stream or datagram. + * @return 1 on success, 0 on failure. + */ +int pp2_write_to_buf(struct sldns_buffer* buf, struct sockaddr_storage* src, + int stream); + +/** + * Read a PROXYv2 header from the current position of the buffer. + * It does initial validation and returns a pointer to the buffer position on + * success. + * @param buf: the buffer to read from. + * @return the pointer to the buffer position on success, NULL on error. + */ +struct pp2_header* pp2_read_header(struct sldns_buffer* buf); + +#endif /* PROXY_PROTOCOL_H */ diff --git a/util/siphash.c b/util/siphash.c new file mode 100644 index 000000000..d69f4b579 --- /dev/null +++ b/util/siphash.c @@ -0,0 +1,165 @@ +/* + SipHash reference C implementation + + Copyright (c) 2012-2016 Jean-Philippe Aumasson + + Copyright (c) 2012-2014 Daniel J. Bernstein + + To the extent possible under law, the author(s) have dedicated all copyright + and related and neighboring rights to this software to the public domain + worldwide. This software is distributed without any warranty. + + You should have received a copy of the CC0 Public Domain Dedication along + with + this software. If not, see + . + */ +#include +#include +#include +#include + +/* default: SipHash-2-4 */ +#define cROUNDS 2 +#define dROUNDS 4 + +#define ROTL(x, b) (uint64_t)(((x) << (b)) | ((x) >> (64 - (b)))) + +#define U32TO8_LE(p, v) \ + (p)[0] = (uint8_t)((v)); \ + (p)[1] = (uint8_t)((v) >> 8); \ + (p)[2] = (uint8_t)((v) >> 16); \ + (p)[3] = (uint8_t)((v) >> 24); + +#define U64TO8_LE(p, v) \ + U32TO8_LE((p), (uint32_t)((v))); \ + U32TO8_LE((p) + 4, (uint32_t)((v) >> 32)); + +#define U8TO64_LE(p) \ + (((uint64_t)((p)[0])) | ((uint64_t)((p)[1]) << 8) | \ + ((uint64_t)((p)[2]) << 16) | ((uint64_t)((p)[3]) << 24) | \ + ((uint64_t)((p)[4]) << 32) | ((uint64_t)((p)[5]) << 40) | \ + ((uint64_t)((p)[6]) << 48) | ((uint64_t)((p)[7]) << 56)) + +#define SIPROUND \ + do { \ + v0 += v1; \ + v1 = ROTL(v1, 13); \ + v1 ^= v0; \ + v0 = ROTL(v0, 32); \ + v2 += v3; \ + v3 = ROTL(v3, 16); \ + v3 ^= v2; \ + v0 += v3; \ + v3 = ROTL(v3, 21); \ + v3 ^= v0; \ + v2 += v1; \ + v1 = ROTL(v1, 17); \ + v1 ^= v2; \ + v2 = ROTL(v2, 32); \ + } while (0) + +#ifdef DEBUG +#define TRACE \ + do { \ + printf("(%3d) v0 %08x %08x\n", (int)inlen, (uint32_t)(v0 >> 32), \ + (uint32_t)v0); \ + printf("(%3d) v1 %08x %08x\n", (int)inlen, (uint32_t)(v1 >> 32), \ + (uint32_t)v1); \ + printf("(%3d) v2 %08x %08x\n", (int)inlen, (uint32_t)(v2 >> 32), \ + (uint32_t)v2); \ + printf("(%3d) v3 %08x %08x\n", (int)inlen, (uint32_t)(v3 >> 32), \ + (uint32_t)v3); \ + } while (0) +#else +#define TRACE +#endif + +int siphash(const uint8_t *in, const size_t inlen, const uint8_t *k, + uint8_t *out, const size_t outlen) { + + assert((outlen == 8) || (outlen == 16)); + uint64_t v0 = 0x736f6d6570736575ULL; + uint64_t v1 = 0x646f72616e646f6dULL; + uint64_t v2 = 0x6c7967656e657261ULL; + uint64_t v3 = 0x7465646279746573ULL; + uint64_t k0 = U8TO64_LE(k); + uint64_t k1 = U8TO64_LE(k + 8); + uint64_t m; + int i; + const uint8_t *end = in + inlen - (inlen % sizeof(uint64_t)); + const int left = inlen & 7; + uint64_t b = ((uint64_t)inlen) << 56; + v3 ^= k1; + v2 ^= k0; + v1 ^= k1; + v0 ^= k0; + + if (outlen == 16) + v1 ^= 0xee; + + for (; in != end; in += 8) { + m = U8TO64_LE(in); + v3 ^= m; + + TRACE; + for (i = 0; i < cROUNDS; ++i) + SIPROUND; + + v0 ^= m; + } + + switch (left) { + case 7: + b |= ((uint64_t)in[6]) << 48; + case 6: + b |= ((uint64_t)in[5]) << 40; + case 5: + b |= ((uint64_t)in[4]) << 32; + case 4: + b |= ((uint64_t)in[3]) << 24; + case 3: + b |= ((uint64_t)in[2]) << 16; + case 2: + b |= ((uint64_t)in[1]) << 8; + case 1: + b |= ((uint64_t)in[0]); + break; + case 0: + break; + } + + v3 ^= b; + + TRACE; + for (i = 0; i < cROUNDS; ++i) + SIPROUND; + + v0 ^= b; + + if (outlen == 16) + v2 ^= 0xee; + else + v2 ^= 0xff; + + TRACE; + for (i = 0; i < dROUNDS; ++i) + SIPROUND; + + b = v0 ^ v1 ^ v2 ^ v3; + U64TO8_LE(out, b); + + if (outlen == 8) + return 0; + + v1 ^= 0xdd; + + TRACE; + for (i = 0; i < dROUNDS; ++i) + SIPROUND; + + b = v0 ^ v1 ^ v2 ^ v3; + U64TO8_LE(out + 8, b); + + return 0; +} diff --git a/util/storage/dnstree.c b/util/storage/dnstree.c index f883044af..eef393f91 100644 --- a/util/storage/dnstree.c +++ b/util/storage/dnstree.c @@ -71,6 +71,14 @@ int addr_tree_compare(const void* k1, const void* k2) return 0; } +int addr_tree_addrport_compare(const void* k1, const void* k2) +{ + struct addr_tree_node* n1 = (struct addr_tree_node*)k1; + struct addr_tree_node* n2 = (struct addr_tree_node*)k2; + return sockaddr_cmp(&n1->addr, n1->addrlen, &n2->addr, + n2->addrlen); +} + void name_tree_init(rbtree_type* tree) { rbtree_init(tree, &name_tree_compare); @@ -81,6 +89,11 @@ void addr_tree_init(rbtree_type* tree) rbtree_init(tree, &addr_tree_compare); } +void addr_tree_addrport_init(rbtree_type* tree) +{ + rbtree_init(tree, &addr_tree_addrport_compare); +} + int name_tree_insert(rbtree_type* tree, struct name_tree_node* node, uint8_t* name, size_t len, int labs, uint16_t dclass) { diff --git a/util/storage/dnstree.h b/util/storage/dnstree.h index d54602fd7..8aaa94098 100644 --- a/util/storage/dnstree.h +++ b/util/storage/dnstree.h @@ -153,6 +153,13 @@ int name_tree_next_root(rbtree_type* tree, uint16_t* dclass); */ void addr_tree_init(rbtree_type* tree); +/** + * Init addr tree to be empty. + * The comparison function to be used is addr_tree_addrport_compare. + * @param tree: to init. + */ +void addr_tree_addrport_init(rbtree_type* tree); + /** * insert element into addr tree. * @param tree: addr tree @@ -207,4 +214,7 @@ int name_tree_compare(const void* k1, const void* k2); /** compare addr tree nodes */ int addr_tree_compare(const void* k1, const void* k2); +/** compare addr tree nodes (address and port only) */ +int addr_tree_addrport_compare(const void* k1, const void* k2); + #endif /* UTIL_STORAGE_DNSTREE_H */ diff --git a/util/tube.c b/util/tube.c index 40556e720..43455feef 100644 --- a/util/tube.c +++ b/util/tube.c @@ -424,6 +424,28 @@ int tube_wait(struct tube* tube) return pollit(tube->sr, NULL); } +int tube_wait_timeout(struct tube* tube, int msec) +{ + struct timeval t; + int fd = tube->sr; + fd_set r; + t.tv_sec = msec/1000; + t.tv_usec = (msec%1000)*1000; +#ifndef S_SPLINT_S + FD_ZERO(&r); + FD_SET(FD_SET_T fd, &r); +#endif + while(1) { + if(select(fd+1, &r, NULL, NULL, &t) == -1) { + if(errno == EAGAIN || errno == EINTR) + continue; + return -1; + } + break; + } + return (int)(FD_ISSET(fd, &r)); +} + int tube_read_fd(struct tube* tube) { return tube->sr; @@ -649,6 +671,26 @@ int tube_wait(struct tube* tube) return 1; } +int tube_wait_timeout(struct tube* tube, int msec) +{ + /* block on eventhandle */ + DWORD res = WSAWaitForMultipleEvents( + 1 /* one event in array */, + &tube->event /* the event to wait for, our pipe signal */, + 0 /* wait for all events is false */, + msec /* wait for timeout */, + 0 /* we are not alertable for IO completion routines */ + ); + if(res == WSA_WAIT_TIMEOUT) { + return 0; + } + if(res == WSA_WAIT_IO_COMPLETION) { + /* a bit unexpected, since we were not alertable */ + return -1; + } + return 1; +} + int tube_read_fd(struct tube* ATTR_UNUSED(tube)) { /* nothing sensible on Windows */ diff --git a/util/tube.h b/util/tube.h index 5b1fdb8e8..5e4fb8644 100644 --- a/util/tube.h +++ b/util/tube.h @@ -204,6 +204,14 @@ int tube_poll(struct tube* tube); */ int tube_wait(struct tube* tube); +/** + * Wait for data to be ready with a timeout. + * @param tube: the tube to wait on. + * @param msec: timeout in milliseconds. + * @return 1 if there is something to read within timeout, readability. + * 0 on a timeout. On failures -1, like errors. */ +int tube_wait_timeout(struct tube* tube, int msec); + /** * Get FD that is readable when new information arrives. * @param tube diff --git a/validator/autotrust.c b/validator/autotrust.c index 3cdf9ceae..3011a0ace 100644 --- a/validator/autotrust.c +++ b/validator/autotrust.c @@ -2376,6 +2376,8 @@ probe_anchor(struct module_env* env, struct trust_anchor* tp) edns.opt_list_out = NULL; edns.opt_list_inplace_cb_out = NULL; edns.padding_block_size = 0; + edns.cookie_present = 0; + edns.cookie_valid = 0; if(sldns_buffer_capacity(buf) < 65535) edns.udp_size = (uint16_t)sldns_buffer_capacity(buf); else edns.udp_size = 65535;