diff options
Diffstat (limited to 'src')
241 files changed, 36710 insertions, 15751 deletions
diff --git a/src/common/address.c b/src/common/address.c index de5d3a6ff7..3b4be1d601 100644 --- a/src/common/address.c +++ b/src/common/address.c @@ -1,6 +1,6 @@ /* Copyright (c) 2003-2004, Roger Dingledine * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -8,24 +8,26 @@ * \brief Functions to use and manipulate the tor_addr_t structure. **/ -#include "orconfig.h" -#include "compat.h" -#include "util.h" -#include "address.h" -#include "torlog.h" -#include "container.h" -#include "sandbox.h" +#define ADDRESS_PRIVATE #ifdef _WIN32 -#include <process.h> -#include <windows.h> -#include <winsock2.h> /* For access to structs needed by GetAdaptersAddresses */ #undef _WIN32_WINNT #define _WIN32_WINNT 0x0501 +#include <process.h> +#include <winsock2.h> +#include <windows.h> #include <iphlpapi.h> #endif +#include "orconfig.h" +#include "compat.h" +#include "util.h" +#include "address.h" +#include "torlog.h" +#include "container.h" +#include "sandbox.h" + #ifdef HAVE_SYS_TIME_H #include <sys/time.h> #endif @@ -89,13 +91,14 @@ tor_addr_to_sockaddr(const tor_addr_t *a, struct sockaddr *sa_out, socklen_t len) { + memset(sa_out, 0, len); + sa_family_t family = tor_addr_family(a); if (family == AF_INET) { struct sockaddr_in *sin; if (len < (int)sizeof(struct sockaddr_in)) return 0; sin = (struct sockaddr_in *)sa_out; - memset(sin, 0, sizeof(struct sockaddr_in)); #ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN sin->sin_len = sizeof(struct sockaddr_in); #endif @@ -108,7 +111,6 @@ tor_addr_to_sockaddr(const tor_addr_t *a, if (len < (int)sizeof(struct sockaddr_in6)) return 0; sin6 = (struct sockaddr_in6 *)sa_out; - memset(sin6, 0, sizeof(struct sockaddr_in6)); #ifdef HAVE_STRUCT_SOCKADDR_IN6_SIN6_LEN sin6->sin6_len = sizeof(struct sockaddr_in6); #endif @@ -121,14 +123,26 @@ tor_addr_to_sockaddr(const tor_addr_t *a, } } +/** Set address <b>a</b> to zero. This address belongs to + * the AF_UNIX family. */ +static void +tor_addr_make_af_unix(tor_addr_t *a) +{ + memset(a, 0, sizeof(*a)); + a->family = AF_UNIX; +} + /** Set the tor_addr_t in <b>a</b> to contain the socket address contained in - * <b>sa</b>. */ + * <b>sa</b>. Return 0 on success and -1 on failure. */ int tor_addr_from_sockaddr(tor_addr_t *a, const struct sockaddr *sa, uint16_t *port_out) { tor_assert(a); tor_assert(sa); + + memset(a, 0, sizeof(*a)); + if (sa->sa_family == AF_INET) { struct sockaddr_in *sin = (struct sockaddr_in *) sa; tor_addr_from_ipv4n(a, sin->sin_addr.s_addr); @@ -139,6 +153,9 @@ tor_addr_from_sockaddr(tor_addr_t *a, const struct sockaddr *sa, tor_addr_from_in6(a, &sin6->sin6_addr); if (port_out) *port_out = ntohs(sin6->sin6_port); + } else if (sa->sa_family == AF_UNIX) { + tor_addr_make_af_unix(a); + return 0; } else { tor_addr_make_unspec(a); return -1; @@ -418,6 +435,10 @@ tor_addr_to_str(char *dest, const tor_addr_t *addr, size_t len, int decorate) ptr = dest; } break; + case AF_UNIX: + tor_snprintf(dest, len, "AF_UNIX"); + ptr = dest; + break; default: return NULL; } @@ -723,6 +744,11 @@ tor_addr_parse_mask_ports(const char *s, /* XXXX_IP6 is this really what we want? */ bits = 96 + bits%32; /* map v4-mapped masks onto 96-128 bits */ } + if (any_flag) { + log_warn(LD_GENERAL, + "Found bit prefix with wildcard address; rejecting"); + goto err; + } } else { /* pick an appropriate mask, as none was given */ if (any_flag) bits = 0; /* This is okay whether it's V6 or V4 (FIX V4-mapped V6!) */ @@ -808,6 +834,8 @@ tor_addr_is_null(const tor_addr_t *addr) } case AF_INET: return (tor_addr_to_ipv4n(addr) == 0); + case AF_UNIX: + return 1; case AF_UNSPEC: return 1; default: @@ -1018,7 +1046,6 @@ tor_addr_compare_masked(const tor_addr_t *addr1, const tor_addr_t *addr2, } else { a2 = tor_addr_to_ipv4h(addr2); } - if (mbits <= 0) return 0; if (mbits > 32) mbits = 32; a1 >>= (32-mbits); a2 >>= (32-mbits); @@ -1114,7 +1141,8 @@ fmt_addr32(uint32_t addr) int tor_addr_parse(tor_addr_t *addr, const char *src) { - char *tmp = NULL; /* Holds substring if we got a dotted quad. */ + /* Holds substring of IPv6 address after removing square brackets */ + char *tmp = NULL; int result; struct in_addr in_tmp; struct in6_addr in6_tmp; @@ -1199,26 +1227,17 @@ typedef ULONG (WINAPI *GetAdaptersAddresses_fn_t)( ULONG, ULONG, PVOID, PIP_ADAPTER_ADDRESSES, PULONG); #endif -/** Try to ask our network interfaces what addresses they are bound to. - * Return a new smartlist of tor_addr_t on success, and NULL on failure. - * (An empty smartlist indicates that we successfully learned that we have no - * addresses.) Log failure messages at <b>severity</b>. */ -static smartlist_t * -get_interface_addresses_raw(int severity) +#ifdef HAVE_IFADDRS_TO_SMARTLIST +/* + * Convert a linked list consisting of <b>ifaddrs</b> structures + * into smartlist of <b>tor_addr_t</b> structures. + */ +STATIC smartlist_t * +ifaddrs_to_smartlist(const struct ifaddrs *ifa) { -#if defined(HAVE_GETIFADDRS) - /* Most free Unixy systems provide getifaddrs, which gives us a linked list - * of struct ifaddrs. */ - struct ifaddrs *ifa = NULL; + smartlist_t *result = smartlist_new(); const struct ifaddrs *i; - smartlist_t *result; - if (getifaddrs(&ifa) < 0) { - log_fn(severity, LD_NET, "Unable to call getifaddrs(): %s", - strerror(errno)); - return NULL; - } - result = smartlist_new(); for (i = ifa; i; i = i->ifa_next) { tor_addr_t tmp; if ((i->ifa_flags & (IFF_UP | IFF_RUNNING)) != (IFF_UP | IFF_RUNNING)) @@ -1233,9 +1252,72 @@ get_interface_addresses_raw(int severity) smartlist_add(result, tor_memdup(&tmp, sizeof(tmp))); } + return result; +} + +/** Use getiffaddrs() function to get list of current machine + * network interface addresses. Represent the result by smartlist of + * <b>tor_addr_t</b> structures. + */ +STATIC smartlist_t * +get_interface_addresses_ifaddrs(int severity) +{ + + /* Most free Unixy systems provide getifaddrs, which gives us a linked list + * of struct ifaddrs. */ + struct ifaddrs *ifa = NULL; + smartlist_t *result; + if (getifaddrs(&ifa) < 0) { + log_fn(severity, LD_NET, "Unable to call getifaddrs(): %s", + strerror(errno)); + return NULL; + } + + result = ifaddrs_to_smartlist(ifa); + freeifaddrs(ifa); + + return result; +} +#endif + +#ifdef HAVE_IP_ADAPTER_TO_SMARTLIST + +/** Convert a Windows-specific <b>addresses</b> linked list into smartlist + * of <b>tor_addr_t</b> structures. + */ + +STATIC smartlist_t * +ip_adapter_addresses_to_smartlist(const IP_ADAPTER_ADDRESSES *addresses) +{ + smartlist_t *result = smartlist_new(); + const IP_ADAPTER_ADDRESSES *address; + + for (address = addresses; address; address = address->Next) { + const IP_ADAPTER_UNICAST_ADDRESS *a; + for (a = address->FirstUnicastAddress; a; a = a->Next) { + /* Yes, it's a linked list inside a linked list */ + const struct sockaddr *sa = a->Address.lpSockaddr; + tor_addr_t tmp; + if (sa->sa_family != AF_INET && sa->sa_family != AF_INET6) + continue; + if (tor_addr_from_sockaddr(&tmp, sa, NULL) < 0) + continue; + smartlist_add(result, tor_memdup(&tmp, sizeof(tmp))); + } + } + return result; -#elif defined(_WIN32) +} + +/** Windows only: use GetAdaptersInfo() function to retrieve network interface + * addresses of current machine and return them to caller as smartlist of + * <b>tor_addr_t</b> structures. + */ +STATIC smartlist_t * +get_interface_addresses_win32(int severity) +{ + /* Windows XP began to provide GetAdaptersAddresses. Windows 2000 had a "GetAdaptersInfo", but that's deprecated; let's just try GetAdaptersAddresses and fall back to connect+getsockname. @@ -1244,7 +1326,7 @@ get_interface_addresses_raw(int severity) smartlist_t *result = NULL; GetAdaptersAddresses_fn_t fn; ULONG size, res; - IP_ADAPTER_ADDRESSES *addresses = NULL, *address; + IP_ADAPTER_ADDRESSES *addresses = NULL; (void) severity; @@ -1279,63 +1361,106 @@ get_interface_addresses_raw(int severity) goto done; } - result = smartlist_new(); - for (address = addresses; address; address = address->Next) { - IP_ADAPTER_UNICAST_ADDRESS *a; - for (a = address->FirstUnicastAddress; a; a = a->Next) { - /* Yes, it's a linked list inside a linked list */ - struct sockaddr *sa = a->Address.lpSockaddr; - tor_addr_t tmp; - if (sa->sa_family != AF_INET && sa->sa_family != AF_INET6) - continue; - if (tor_addr_from_sockaddr(&tmp, sa, NULL) < 0) - continue; - smartlist_add(result, tor_memdup(&tmp, sizeof(tmp))); - } - } + result = ip_adapter_addresses_to_smartlist(addresses); done: if (lib) FreeLibrary(lib); tor_free(addresses); return result; -#elif defined(SIOCGIFCONF) && defined(HAVE_IOCTL) +} + +#endif + +#ifdef HAVE_IFCONF_TO_SMARTLIST + +/* This is defined on Mac OS X */ +#ifndef _SIZEOF_ADDR_IFREQ +#define _SIZEOF_ADDR_IFREQ sizeof +#endif + +/** Convert <b>*ifr</b>, an ifreq structure array of size <b>buflen</b> + * into smartlist of <b>tor_addr_t</b> structures. + */ +STATIC smartlist_t * +ifreq_to_smartlist(const struct ifreq *ifr, size_t buflen) +{ + smartlist_t *result = smartlist_new(); + + struct ifreq *r = (struct ifreq *)ifr; + + while ((char *)r < (char *)ifr+buflen) { + const struct sockaddr *sa = &r->ifr_addr; + tor_addr_t tmp; + int valid_sa_family = (sa->sa_family == AF_INET || + sa->sa_family == AF_INET6); + + int conversion_success = (tor_addr_from_sockaddr(&tmp, sa, NULL) == 0); + + if (valid_sa_family && conversion_success) + smartlist_add(result, tor_memdup(&tmp, sizeof(tmp))); + + r = (struct ifreq *)((char *)r + _SIZEOF_ADDR_IFREQ(*r)); + } + + return result; +} + +/** Use ioctl(.,SIOCGIFCONF,.) to get a list of current machine + * network interface addresses. Represent the result by smartlist of + * <b>tor_addr_t</b> structures. + */ +STATIC smartlist_t * +get_interface_addresses_ioctl(int severity) +{ /* Some older unixy systems make us use ioctl(SIOCGIFCONF) */ struct ifconf ifc; - int fd, i, sz, n; + int fd, sz; + void *databuf = NULL; smartlist_t *result = NULL; + /* This interface, AFAICT, only supports AF_INET addresses */ fd = socket(AF_INET, SOCK_DGRAM, 0); if (fd < 0) { tor_log(severity, LD_NET, "socket failed: %s", strerror(errno)); goto done; } + /* Guess how much space we need. */ - ifc.ifc_len = sz = 15*1024; - ifc.ifc_ifcu.ifcu_req = tor_malloc(sz); + ifc.ifc_len = sz = 4096; + databuf = tor_malloc_zero(sz); + ifc.ifc_buf = databuf; + if (ioctl(fd, SIOCGIFCONF, &ifc) < 0) { tor_log(severity, LD_NET, "ioctl failed: %s", strerror(errno)); close(fd); goto done; } - close(fd); - result = smartlist_new(); - if (ifc.ifc_len < sz) - sz = ifc.ifc_len; - n = sz / sizeof(struct ifreq); - for (i = 0; i < n ; ++i) { - struct ifreq *r = &ifc.ifc_ifcu.ifcu_req[i]; - struct sockaddr *sa = &r->ifr_addr; - tor_addr_t tmp; - if (sa->sa_family != AF_INET && sa->sa_family != AF_INET6) - continue; /* should be impossible */ - if (tor_addr_from_sockaddr(&tmp, sa, NULL) < 0) - continue; - smartlist_add(result, tor_memdup(&tmp, sizeof(tmp))); - } + + result = ifreq_to_smartlist(databuf, ifc.ifc_len); + done: - tor_free(ifc.ifc_ifcu.ifcu_req); + close(fd); + tor_free(databuf); return result; +} +#endif + +/** Try to ask our network interfaces what addresses they are bound to. + * Return a new smartlist of tor_addr_t on success, and NULL on failure. + * (An empty smartlist indicates that we successfully learned that we have no + * addresses.) Log failure messages at <b>severity</b>. */ +STATIC smartlist_t * +get_interface_addresses_raw(int severity) +{ +#if defined(HAVE_IFADDRS_TO_SMARTLIST) + return get_interface_addresses_ifaddrs(severity); +#endif +#if defined(HAVE_IP_ADAPTER_TO_SMARTLIST) + return get_interface_addresses_win32(severity); +#endif +#if defined(HAVE_IFCONF_TO_SMARTLIST) + return get_interface_addresses_ioctl(severity); #else (void) severity; return NULL; @@ -1363,8 +1488,8 @@ tor_addr_is_multicast(const tor_addr_t *a) * connects to the Internet. This address should only be used in checking * whether our address has changed. Return 0 on success, -1 on failure. */ -int -get_interface_address6(int severity, sa_family_t family, tor_addr_t *addr) +MOCK_IMPL(int, +get_interface_address6,(int severity, sa_family_t family, tor_addr_t *addr)) { /* XXX really, this function should yield a smartlist of addresses. */ smartlist_t *addrs; @@ -1693,8 +1818,8 @@ tor_dup_ip(uint32_t addr) * checking whether our address has changed. Return 0 on success, -1 on * failure. */ -int -get_interface_address(int severity, uint32_t *addr) +MOCK_IMPL(int, +get_interface_address,(int severity, uint32_t *addr)) { tor_addr_t local_addr; int r; diff --git a/src/common/address.h b/src/common/address.h index e8bab223a7..8c6ee5abbb 100644 --- a/src/common/address.h +++ b/src/common/address.h @@ -1,6 +1,6 @@ /* Copyright (c) 2003-2004, Roger Dingledine * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -11,10 +11,41 @@ #ifndef TOR_ADDRESS_H #define TOR_ADDRESS_H +//#include <sys/sockio.h> #include "orconfig.h" #include "torint.h" #include "compat.h" +#ifdef ADDRESS_PRIVATE + +#if defined(HAVE_SYS_IOCTL_H) +#include <sys/ioctl.h> +#endif + +#ifdef HAVE_GETIFADDRS +#define HAVE_IFADDRS_TO_SMARTLIST +#endif + +#ifdef _WIN32 +#define HAVE_IP_ADAPTER_TO_SMARTLIST +#endif + +#if defined(SIOCGIFCONF) && defined(HAVE_IOCTL) +#define HAVE_IFCONF_TO_SMARTLIST +#endif + +#if defined(HAVE_NET_IF_H) +#include <net/if.h> // for struct ifconf +#endif + +#if defined(HAVE_IFADDRS_TO_SMARTLIST) +#include <ifaddrs.h> +#endif + +// TODO win32 specific includes +#include "container.h" +#endif // ADDRESS_PRIVATE + /** The number of bits from an address to consider while doing a masked * comparison. */ typedef uint8_t maskbits_t; @@ -159,7 +190,8 @@ char *tor_dup_addr(const tor_addr_t *addr) ATTR_MALLOC; const char *fmt_addr_impl(const tor_addr_t *addr, int decorate); const char *fmt_addrport(const tor_addr_t *addr, uint16_t port); const char * fmt_addr32(uint32_t addr); -int get_interface_address6(int severity, sa_family_t family, tor_addr_t *addr); +MOCK_DECL(int,get_interface_address6,(int severity, sa_family_t family, +tor_addr_t *addr)); /** Flag to specify how to do a comparison between addresses. In an "exact" * comparison, addresses are equivalent only if they are in the same family @@ -236,9 +268,31 @@ int addr_mask_get_bits(uint32_t mask); #define INET_NTOA_BUF_LEN 16 int tor_inet_ntoa(const struct in_addr *in, char *buf, size_t buf_len); char *tor_dup_ip(uint32_t addr) ATTR_MALLOC; -int get_interface_address(int severity, uint32_t *addr); +MOCK_DECL(int,get_interface_address,(int severity, uint32_t *addr)); tor_addr_port_t *tor_addr_port_new(const tor_addr_t *addr, uint16_t port); +#ifdef ADDRESS_PRIVATE +STATIC smartlist_t *get_interface_addresses_raw(int severity); + +#ifdef HAVE_IFADDRS_TO_SMARTLIST +STATIC smartlist_t *ifaddrs_to_smartlist(const struct ifaddrs *ifa); +STATIC smartlist_t *get_interface_addresses_ifaddrs(int severity); +#endif + +#ifdef HAVE_IP_ADAPTER_TO_SMARTLIST +STATIC smartlist_t *ip_adapter_addresses_to_smartlist( + const IP_ADAPTER_ADDRESSES *addresses); +STATIC smartlist_t *get_interface_addresses_win32(int severity); +#endif + +#ifdef HAVE_IFCONF_TO_SMARTLIST +STATIC smartlist_t *ifreq_to_smartlist(const struct ifreq *ifr, + size_t buflen); +STATIC smartlist_t *get_interface_addresses_ioctl(int severity); +#endif + +#endif // ADDRESS_PRIVATE + #endif diff --git a/src/common/aes.c b/src/common/aes.c index 877dce625c..7651f1d93a 100644 --- a/src/common/aes.c +++ b/src/common/aes.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001, Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/common/aes.h b/src/common/aes.h index f014e3a424..df2f3aa65d 100644 --- a/src/common/aes.h +++ b/src/common/aes.h @@ -1,6 +1,6 @@ /* Copyright (c) 2003, Roger Dingledine * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /* Implements a minimal interface to counter-mode AES. */ diff --git a/src/common/backtrace.c b/src/common/backtrace.c index e6fb8938ac..1033c7e5de 100644 --- a/src/common/backtrace.c +++ b/src/common/backtrace.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2014, The Tor Project, Inc. */ +/* Copyright (c) 2013-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define __USE_GNU diff --git a/src/common/backtrace.h b/src/common/backtrace.h index 4938745b3d..a9151d7956 100644 --- a/src/common/backtrace.h +++ b/src/common/backtrace.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2014, The Tor Project, Inc. */ +/* Copyright (c) 2013-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TOR_BACKTRACE_H diff --git a/src/common/compat.c b/src/common/compat.c index 8574bd04c9..5575316b2b 100644 --- a/src/common/compat.c +++ b/src/common/compat.c @@ -1,6 +1,6 @@ /* Copyright (c) 2003-2004, Roger Dingledine * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -27,7 +27,6 @@ #include "compat.h" #ifdef _WIN32 -#include <process.h> #include <windows.h> #include <sys/locking.h> #endif @@ -823,6 +822,7 @@ replace_file(const char *from, const char *to) case FN_NOENT: break; case FN_FILE: + case FN_EMPTY: if (unlink(to)) return -1; break; case FN_ERROR: @@ -2197,9 +2197,20 @@ get_environment(void) #endif } -/** Set *addr to the IP address (in dotted-quad notation) stored in c. - * Return 1 on success, 0 if c is badly formatted. (Like inet_aton(c,addr), - * but works on Windows and Solaris.) +/** Get name of current host and write it to <b>name</b> array, whose + * length is specified by <b>namelen</b> argument. Return 0 upon + * successfull completion; otherwise return return -1. (Currently, + * this function is merely a mockable wrapper for POSIX gethostname().) + */ +MOCK_IMPL(int, +tor_gethostname,(char *name, size_t namelen)) +{ + return gethostname(name,namelen); +} + +/** Set *addr to the IP address (in dotted-quad notation) stored in *str. + * Return 1 on success, 0 if *str is badly formatted. + * (Like inet_aton(str,addr), but works on Windows and Solaris.) */ int tor_inet_aton(const char *str, struct in_addr* addr) @@ -2419,8 +2430,9 @@ tor_inet_pton(int af, const char *src, void *dst) * (This function exists because standard windows gethostbyname * doesn't treat raw IP addresses properly.) */ -int -tor_lookup_hostname(const char *name, uint32_t *addr) + +MOCK_IMPL(int, +tor_lookup_hostname,(const char *name, uint32_t *addr)) { tor_addr_t myaddr; int ret; @@ -2531,109 +2543,6 @@ get_uname(void) * Process control */ -#if defined(USE_PTHREADS) -/** Wraps a void (*)(void*) function and its argument so we can - * invoke them in a way pthreads would expect. - */ -typedef struct tor_pthread_data_t { - void (*func)(void *); - void *data; -} tor_pthread_data_t; -/** Given a tor_pthread_data_t <b>_data</b>, call _data->func(d->data) - * and free _data. Used to make sure we can call functions the way pthread - * expects. */ -static void * -tor_pthread_helper_fn(void *_data) -{ - tor_pthread_data_t *data = _data; - void (*func)(void*); - void *arg; - /* mask signals to worker threads to avoid SIGPIPE, etc */ - sigset_t sigs; - /* We're in a subthread; don't handle any signals here. */ - sigfillset(&sigs); - pthread_sigmask(SIG_SETMASK, &sigs, NULL); - - func = data->func; - arg = data->data; - tor_free(_data); - func(arg); - return NULL; -} -/** - * A pthread attribute to make threads start detached. - */ -static pthread_attr_t attr_detached; -/** True iff we've called tor_threads_init() */ -static int threads_initialized = 0; -#endif - -/** Minimalist interface to run a void function in the background. On - * Unix calls fork, on win32 calls beginthread. Returns -1 on failure. - * func should not return, but rather should call spawn_exit. - * - * NOTE: if <b>data</b> is used, it should not be allocated on the stack, - * since in a multithreaded environment, there is no way to be sure that - * the caller's stack will still be around when the called function is - * running. - */ -int -spawn_func(void (*func)(void *), void *data) -{ -#if defined(USE_WIN32_THREADS) - int rv; - rv = (int)_beginthread(func, 0, data); - if (rv == (int)-1) - return -1; - return 0; -#elif defined(USE_PTHREADS) - pthread_t thread; - tor_pthread_data_t *d; - if (PREDICT_UNLIKELY(!threads_initialized)) - tor_threads_init(); - d = tor_malloc(sizeof(tor_pthread_data_t)); - d->data = data; - d->func = func; - if (pthread_create(&thread,&attr_detached,tor_pthread_helper_fn,d)) - return -1; - return 0; -#else - pid_t pid; - pid = fork(); - if (pid<0) - return -1; - if (pid==0) { - /* Child */ - func(data); - tor_assert(0); /* Should never reach here. */ - return 0; /* suppress "control-reaches-end-of-non-void" warning. */ - } else { - /* Parent */ - return 0; - } -#endif -} - -/** End the current thread/process. - */ -void -spawn_exit(void) -{ -#if defined(USE_WIN32_THREADS) - _endthread(); - //we should never get here. my compiler thinks that _endthread returns, this - //is an attempt to fool it. - tor_assert(0); - _exit(0); -#elif defined(USE_PTHREADS) - pthread_exit(NULL); -#else - /* http://www.erlenstar.demon.co.uk/unix/faq_2.html says we should - * call _exit, not exit, from child processes. */ - _exit(0); -#endif -} - /** Implementation logic for compute_num_cpus(). */ static int compute_num_cpus_impl(void) @@ -2922,280 +2831,6 @@ tor_gmtime_r(const time_t *timep, struct tm *result) } #endif -#if defined(USE_WIN32_THREADS) -void -tor_mutex_init(tor_mutex_t *m) -{ - InitializeCriticalSection(&m->mutex); -} -void -tor_mutex_uninit(tor_mutex_t *m) -{ - DeleteCriticalSection(&m->mutex); -} -void -tor_mutex_acquire(tor_mutex_t *m) -{ - tor_assert(m); - EnterCriticalSection(&m->mutex); -} -void -tor_mutex_release(tor_mutex_t *m) -{ - LeaveCriticalSection(&m->mutex); -} -unsigned long -tor_get_thread_id(void) -{ - return (unsigned long)GetCurrentThreadId(); -} -#elif defined(USE_PTHREADS) -/** A mutex attribute that we're going to use to tell pthreads that we want - * "reentrant" mutexes (i.e., once we can re-lock if we're already holding - * them.) */ -static pthread_mutexattr_t attr_reentrant; -/** Initialize <b>mutex</b> so it can be locked. Every mutex must be set - * up with tor_mutex_init() or tor_mutex_new(); not both. */ -void -tor_mutex_init(tor_mutex_t *mutex) -{ - int err; - if (PREDICT_UNLIKELY(!threads_initialized)) - tor_threads_init(); - err = pthread_mutex_init(&mutex->mutex, &attr_reentrant); - if (PREDICT_UNLIKELY(err)) { - log_err(LD_GENERAL, "Error %d creating a mutex.", err); - tor_fragile_assert(); - } -} -/** Wait until <b>m</b> is free, then acquire it. */ -void -tor_mutex_acquire(tor_mutex_t *m) -{ - int err; - tor_assert(m); - err = pthread_mutex_lock(&m->mutex); - if (PREDICT_UNLIKELY(err)) { - log_err(LD_GENERAL, "Error %d locking a mutex.", err); - tor_fragile_assert(); - } -} -/** Release the lock <b>m</b> so another thread can have it. */ -void -tor_mutex_release(tor_mutex_t *m) -{ - int err; - tor_assert(m); - err = pthread_mutex_unlock(&m->mutex); - if (PREDICT_UNLIKELY(err)) { - log_err(LD_GENERAL, "Error %d unlocking a mutex.", err); - tor_fragile_assert(); - } -} -/** Clean up the mutex <b>m</b> so that it no longer uses any system - * resources. Does not free <b>m</b>. This function must only be called on - * mutexes from tor_mutex_init(). */ -void -tor_mutex_uninit(tor_mutex_t *m) -{ - int err; - tor_assert(m); - err = pthread_mutex_destroy(&m->mutex); - if (PREDICT_UNLIKELY(err)) { - log_err(LD_GENERAL, "Error %d destroying a mutex.", err); - tor_fragile_assert(); - } -} -/** Return an integer representing this thread. */ -unsigned long -tor_get_thread_id(void) -{ - union { - pthread_t thr; - unsigned long id; - } r; - r.thr = pthread_self(); - return r.id; -} -#endif - -/** Return a newly allocated, ready-for-use mutex. */ -tor_mutex_t * -tor_mutex_new(void) -{ - tor_mutex_t *m = tor_malloc_zero(sizeof(tor_mutex_t)); - tor_mutex_init(m); - return m; -} -/** Release all storage and system resources held by <b>m</b>. */ -void -tor_mutex_free(tor_mutex_t *m) -{ - if (!m) - return; - tor_mutex_uninit(m); - tor_free(m); -} - -/* Conditions. */ -#ifdef USE_PTHREADS -#if 0 -/** Cross-platform condition implementation. */ -struct tor_cond_t { - pthread_cond_t cond; -}; -/** Return a newly allocated condition, with nobody waiting on it. */ -tor_cond_t * -tor_cond_new(void) -{ - tor_cond_t *cond = tor_malloc_zero(sizeof(tor_cond_t)); - if (pthread_cond_init(&cond->cond, NULL)) { - tor_free(cond); - return NULL; - } - return cond; -} -/** Release all resources held by <b>cond</b>. */ -void -tor_cond_free(tor_cond_t *cond) -{ - if (!cond) - return; - if (pthread_cond_destroy(&cond->cond)) { - log_warn(LD_GENERAL,"Error freeing condition: %s", strerror(errno)); - return; - } - tor_free(cond); -} -/** Wait until one of the tor_cond_signal functions is called on <b>cond</b>. - * All waiters on the condition must wait holding the same <b>mutex</b>. - * Returns 0 on success, negative on failure. */ -int -tor_cond_wait(tor_cond_t *cond, tor_mutex_t *mutex) -{ - return pthread_cond_wait(&cond->cond, &mutex->mutex) ? -1 : 0; -} -/** Wake up one of the waiters on <b>cond</b>. */ -void -tor_cond_signal_one(tor_cond_t *cond) -{ - pthread_cond_signal(&cond->cond); -} -/** Wake up all of the waiters on <b>cond</b>. */ -void -tor_cond_signal_all(tor_cond_t *cond) -{ - pthread_cond_broadcast(&cond->cond); -} -#endif -/** Set up common structures for use by threading. */ -void -tor_threads_init(void) -{ - if (!threads_initialized) { - pthread_mutexattr_init(&attr_reentrant); - pthread_mutexattr_settype(&attr_reentrant, PTHREAD_MUTEX_RECURSIVE); - tor_assert(0==pthread_attr_init(&attr_detached)); - tor_assert(0==pthread_attr_setdetachstate(&attr_detached, 1)); - threads_initialized = 1; - set_main_thread(); - } -} -#elif defined(USE_WIN32_THREADS) -#if 0 -static DWORD cond_event_tls_index; -struct tor_cond_t { - CRITICAL_SECTION mutex; - smartlist_t *events; -}; -tor_cond_t * -tor_cond_new(void) -{ - tor_cond_t *cond = tor_malloc_zero(sizeof(tor_cond_t)); - InitializeCriticalSection(&cond->mutex); - cond->events = smartlist_new(); - return cond; -} -void -tor_cond_free(tor_cond_t *cond) -{ - if (!cond) - return; - DeleteCriticalSection(&cond->mutex); - /* XXXX notify? */ - smartlist_free(cond->events); - tor_free(cond); -} -int -tor_cond_wait(tor_cond_t *cond, tor_mutex_t *mutex) -{ - HANDLE event; - int r; - tor_assert(cond); - tor_assert(mutex); - event = TlsGetValue(cond_event_tls_index); - if (!event) { - event = CreateEvent(0, FALSE, FALSE, NULL); - TlsSetValue(cond_event_tls_index, event); - } - EnterCriticalSection(&cond->mutex); - - tor_assert(WaitForSingleObject(event, 0) == WAIT_TIMEOUT); - tor_assert(!smartlist_contains(cond->events, event)); - smartlist_add(cond->events, event); - - LeaveCriticalSection(&cond->mutex); - - tor_mutex_release(mutex); - r = WaitForSingleObject(event, INFINITE); - tor_mutex_acquire(mutex); - - switch (r) { - case WAIT_OBJECT_0: /* we got the mutex normally. */ - break; - case WAIT_ABANDONED: /* holding thread exited. */ - case WAIT_TIMEOUT: /* Should never happen. */ - tor_assert(0); - break; - case WAIT_FAILED: - log_warn(LD_GENERAL, "Failed to acquire mutex: %d",(int) GetLastError()); - } - return 0; -} -void -tor_cond_signal_one(tor_cond_t *cond) -{ - HANDLE event; - tor_assert(cond); - - EnterCriticalSection(&cond->mutex); - - if ((event = smartlist_pop_last(cond->events))) - SetEvent(event); - - LeaveCriticalSection(&cond->mutex); -} -void -tor_cond_signal_all(tor_cond_t *cond) -{ - tor_assert(cond); - - EnterCriticalSection(&cond->mutex); - SMARTLIST_FOREACH(cond->events, HANDLE, event, SetEvent(event)); - smartlist_clear(cond->events); - LeaveCriticalSection(&cond->mutex); -} -#endif -void -tor_threads_init(void) -{ -#if 0 - cond_event_tls_index = TlsAlloc(); -#endif - set_main_thread(); -} -#endif - #if defined(HAVE_MLOCKALL) && HAVE_DECL_MLOCKALL && defined(RLIMIT_MEMLOCK) /** Attempt to raise the current and max rlimit to infinity for our process. * This only needs to be done once and can probably only be done when we have @@ -3279,23 +2914,6 @@ tor_mlockall(void) #endif } -/** Identity of the "main" thread */ -static unsigned long main_thread_id = -1; - -/** Start considering the current thread to be the 'main thread'. This has - * no effect on anything besides in_main_thread(). */ -void -set_main_thread(void) -{ - main_thread_id = tor_get_thread_id(); -} -/** Return true iff called from the main thread. */ -int -in_main_thread(void) -{ - return main_thread_id == tor_get_thread_id(); -} - /** * On Windows, WSAEWOULDBLOCK is not always correct: when you see it, * you need to ask the socket for its actual errno. Also, you need to diff --git a/src/common/compat.h b/src/common/compat.h index f2eef5b6e7..23f8614196 100644 --- a/src/common/compat.h +++ b/src/common/compat.h @@ -1,6 +1,6 @@ /* Copyright (c) 2003-2004, Roger Dingledine * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TOR_COMPAT_H @@ -36,9 +36,6 @@ #ifdef HAVE_STRING_H #include <string.h> #endif -#if defined(HAVE_PTHREAD_H) && !defined(_WIN32) -#include <pthread.h> -#endif #include <stdarg.h> #ifdef HAVE_SYS_RESOURCE_H #include <sys/resource.h> @@ -203,6 +200,15 @@ extern INLINE double U64_TO_DBL(uint64_t x) { #define STMT_END } while (0) #endif +/* Some tools (like coccinelle) don't like to see operators as macro + * arguments. */ +#define OP_LT < +#define OP_GT > +#define OP_GE >= +#define OP_LE <= +#define OP_EQ == +#define OP_NE != + /* ===== String compatibility */ #ifdef _WIN32 /* Windows names string functions differently from most other platforms. */ @@ -523,10 +529,11 @@ struct sockaddr_in6 { }; #endif +MOCK_DECL(int,tor_gethostname,(char *name, size_t namelen)); int tor_inet_aton(const char *cp, struct in_addr *addr) ATTR_NONNULL((1,2)); const char *tor_inet_ntop(int af, const void *src, char *dst, size_t len); int tor_inet_pton(int af, const char *src, void *dst); -int tor_lookup_hostname(const char *name, uint32_t *addr) ATTR_NONNULL((1,2)); +MOCK_DECL(int,tor_lookup_hostname,(const char *name, uint32_t *addr)); int set_socket_nonblocking(tor_socket_t socket); int tor_socketpair(int family, int type, int protocol, tor_socket_t fd[2]); int network_init(void); @@ -632,61 +639,10 @@ char **get_environment(void); int get_total_system_memory(size_t *mem_out); -int spawn_func(void (*func)(void *), void *data); -void spawn_exit(void) ATTR_NORETURN; - -#if defined(_WIN32) -#define USE_WIN32_THREADS -#elif defined(HAVE_PTHREAD_H) && defined(HAVE_PTHREAD_CREATE) -#define USE_PTHREADS -#else -#error "No threading system was found" -#endif - int compute_num_cpus(void); -/* Because we use threads instead of processes on most platforms (Windows, - * Linux, etc), we need locking for them. On platforms with poor thread - * support or broken gethostbyname_r, these functions are no-ops. */ - -/** A generic lock structure for multithreaded builds. */ -typedef struct tor_mutex_t { -#if defined(USE_WIN32_THREADS) - /** Windows-only: on windows, we implement locks with CRITICAL_SECTIONS. */ - CRITICAL_SECTION mutex; -#elif defined(USE_PTHREADS) - /** Pthreads-only: with pthreads, we implement locks with - * pthread_mutex_t. */ - pthread_mutex_t mutex; -#else - /** No-threads only: Dummy variable so that tor_mutex_t takes up space. */ - int _unused; -#endif -} tor_mutex_t; - int tor_mlockall(void); -tor_mutex_t *tor_mutex_new(void); -void tor_mutex_init(tor_mutex_t *m); -void tor_mutex_acquire(tor_mutex_t *m); -void tor_mutex_release(tor_mutex_t *m); -void tor_mutex_free(tor_mutex_t *m); -void tor_mutex_uninit(tor_mutex_t *m); -unsigned long tor_get_thread_id(void); -void tor_threads_init(void); - -void set_main_thread(void); -int in_main_thread(void); - -#if 0 -typedef struct tor_cond_t tor_cond_t; -tor_cond_t *tor_cond_new(void); -void tor_cond_free(tor_cond_t *cond); -int tor_cond_wait(tor_cond_t *cond, tor_mutex_t *mutex); -void tor_cond_signal_one(tor_cond_t *cond); -void tor_cond_signal_all(tor_cond_t *cond); -#endif - /** Macros for MIN/MAX. Never use these when the arguments could have * side-effects. * {With GCC extensions we could probably define a safer MIN/MAX. But @@ -732,5 +688,8 @@ STATIC int tor_ersatz_socketpair(int family, int type, int protocol, #endif #endif +/* This needs some of the declarations above so we include it here. */ +#include "compat_threads.h" + #endif diff --git a/src/common/compat_libevent.c b/src/common/compat_libevent.c index 33672f07d8..15308dd4cb 100644 --- a/src/common/compat_libevent.c +++ b/src/common/compat_libevent.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2014, The Tor Project, Inc. */ +/* Copyright (c) 2009-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -146,13 +146,25 @@ tor_evsignal_new(struct event_base * base, int sig, { return tor_event_new(base, sig, EV_SIGNAL|EV_PERSIST, cb, arg); } -/** Work-alike replacement for event_free() on pre-Libevent-2.0 systems. */ +/** Work-alike replacement for event_free() on pre-Libevent-2.0 systems, + * except tolerate tor_event_free(NULL). */ void tor_event_free(struct event *ev) { + if (ev == NULL) + return; event_del(ev); tor_free(ev); } +#else +/* Wrapper for event_free() that tolerates tor_event_free(NULL) */ +void +tor_event_free(struct event *ev) +{ + if (ev == NULL) + return; + event_free(ev); +} #endif /** Global event base for use by the main thread. */ @@ -283,8 +295,8 @@ tor_libevent_initialize(tor_libevent_cfg *torcfg) } /** Return the current Libevent event base that we're set up to use. */ -struct event_base * -tor_libevent_get_base(void) +MOCK_IMPL(struct event_base *, +tor_libevent_get_base, (void)) { return the_event_base; } @@ -717,7 +729,7 @@ tor_gettimeofday_cached_monotonic(struct timeval *tv) struct timeval last_tv = { 0, 0 }; tor_gettimeofday_cached(tv); - if (timercmp(tv, &last_tv, <)) { + if (timercmp(tv, &last_tv, OP_LT)) { memcpy(tv, &last_tv, sizeof(struct timeval)); } else { memcpy(&last_tv, tv, sizeof(struct timeval)); diff --git a/src/common/compat_libevent.h b/src/common/compat_libevent.h index c5c78b822d..6bbfae0056 100644 --- a/src/common/compat_libevent.h +++ b/src/common/compat_libevent.h @@ -1,10 +1,11 @@ -/* Copyright (c) 2009-2014, The Tor Project, Inc. */ +/* Copyright (c) 2009-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TOR_COMPAT_LIBEVENT_H #define TOR_COMPAT_LIBEVENT_H #include "orconfig.h" +#include "testsupport.h" struct event; struct event_base; @@ -28,11 +29,9 @@ void suppress_libevent_log_msg(const char *msg); #define tor_event_new event_new #define tor_evtimer_new evtimer_new #define tor_evsignal_new evsignal_new -#define tor_event_free event_free #define tor_evdns_add_server_port(sock, tcp, cb, data) \ evdns_add_server_port_with_base(tor_libevent_get_base(), \ (sock),(tcp),(cb),(data)); - #else struct event *tor_event_new(struct event_base * base, evutil_socket_t sock, short what, void (*cb)(evutil_socket_t, short, void *), void *arg); @@ -40,10 +39,11 @@ struct event *tor_evtimer_new(struct event_base * base, void (*cb)(evutil_socket_t, short, void *), void *arg); struct event *tor_evsignal_new(struct event_base * base, int sig, void (*cb)(evutil_socket_t, short, void *), void *arg); -void tor_event_free(struct event *ev); #define tor_evdns_add_server_port evdns_add_server_port #endif +void tor_event_free(struct event *ev); + typedef struct periodic_timer_t periodic_timer_t; periodic_timer_t *periodic_timer_new(struct event_base *base, @@ -72,7 +72,7 @@ typedef struct tor_libevent_cfg { } tor_libevent_cfg; void tor_libevent_initialize(tor_libevent_cfg *cfg); -struct event_base *tor_libevent_get_base(void); +MOCK_DECL(struct event_base *, tor_libevent_get_base, (void)); const char *tor_libevent_get_method(void); void tor_check_libevent_version(const char *m, int server, const char **badness_out); diff --git a/src/common/compat_pthreads.c b/src/common/compat_pthreads.c new file mode 100644 index 0000000000..f4a6cad154 --- /dev/null +++ b/src/common/compat_pthreads.c @@ -0,0 +1,287 @@ +/* Copyright (c) 2003-2004, Roger Dingledine + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2015, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#define _GNU_SOURCE + +#include "orconfig.h" +#include <pthread.h> +#include <signal.h> +#include <time.h> + +#include "compat.h" +#include "torlog.h" +#include "util.h" + +/** Wraps a void (*)(void*) function and its argument so we can + * invoke them in a way pthreads would expect. + */ +typedef struct tor_pthread_data_t { + void (*func)(void *); + void *data; +} tor_pthread_data_t; +/** Given a tor_pthread_data_t <b>_data</b>, call _data->func(d->data) + * and free _data. Used to make sure we can call functions the way pthread + * expects. */ +static void * +tor_pthread_helper_fn(void *_data) +{ + tor_pthread_data_t *data = _data; + void (*func)(void*); + void *arg; + /* mask signals to worker threads to avoid SIGPIPE, etc */ + sigset_t sigs; + /* We're in a subthread; don't handle any signals here. */ + sigfillset(&sigs); + pthread_sigmask(SIG_SETMASK, &sigs, NULL); + + func = data->func; + arg = data->data; + tor_free(_data); + func(arg); + return NULL; +} +/** + * A pthread attribute to make threads start detached. + */ +static pthread_attr_t attr_detached; +/** True iff we've called tor_threads_init() */ +static int threads_initialized = 0; + +/** Minimalist interface to run a void function in the background. On + * Unix calls fork, on win32 calls beginthread. Returns -1 on failure. + * func should not return, but rather should call spawn_exit. + * + * NOTE: if <b>data</b> is used, it should not be allocated on the stack, + * since in a multithreaded environment, there is no way to be sure that + * the caller's stack will still be around when the called function is + * running. + */ +int +spawn_func(void (*func)(void *), void *data) +{ + pthread_t thread; + tor_pthread_data_t *d; + if (PREDICT_UNLIKELY(!threads_initialized)) + tor_threads_init(); + d = tor_malloc(sizeof(tor_pthread_data_t)); + d->data = data; + d->func = func; + if (pthread_create(&thread,&attr_detached,tor_pthread_helper_fn,d)) + return -1; + return 0; +} + +/** End the current thread/process. + */ +void +spawn_exit(void) +{ + pthread_exit(NULL); +} + +/** A mutex attribute that we're going to use to tell pthreads that we want + * "recursive" mutexes (i.e., once we can re-lock if we're already holding + * them.) */ +static pthread_mutexattr_t attr_recursive; + +/** Initialize <b>mutex</b> so it can be locked. Every mutex must be set + * up with tor_mutex_init() or tor_mutex_new(); not both. */ +void +tor_mutex_init(tor_mutex_t *mutex) +{ + int err; + if (PREDICT_UNLIKELY(!threads_initialized)) + tor_threads_init(); + err = pthread_mutex_init(&mutex->mutex, &attr_recursive); + if (PREDICT_UNLIKELY(err)) { + log_err(LD_GENERAL, "Error %d creating a mutex.", err); + tor_fragile_assert(); + } +} + +/** As tor_mutex_init, but initialize a mutex suitable that may be + * non-recursive, if the OS supports that. */ +void +tor_mutex_init_nonrecursive(tor_mutex_t *mutex) +{ + int err; + if (PREDICT_UNLIKELY(!threads_initialized)) + tor_threads_init(); + err = pthread_mutex_init(&mutex->mutex, NULL); + if (PREDICT_UNLIKELY(err)) { + log_err(LD_GENERAL, "Error %d creating a mutex.", err); + tor_fragile_assert(); + } +} + +/** Wait until <b>m</b> is free, then acquire it. */ +void +tor_mutex_acquire(tor_mutex_t *m) +{ + int err; + tor_assert(m); + err = pthread_mutex_lock(&m->mutex); + if (PREDICT_UNLIKELY(err)) { + log_err(LD_GENERAL, "Error %d locking a mutex.", err); + tor_fragile_assert(); + } +} +/** Release the lock <b>m</b> so another thread can have it. */ +void +tor_mutex_release(tor_mutex_t *m) +{ + int err; + tor_assert(m); + err = pthread_mutex_unlock(&m->mutex); + if (PREDICT_UNLIKELY(err)) { + log_err(LD_GENERAL, "Error %d unlocking a mutex.", err); + tor_fragile_assert(); + } +} +/** Clean up the mutex <b>m</b> so that it no longer uses any system + * resources. Does not free <b>m</b>. This function must only be called on + * mutexes from tor_mutex_init(). */ +void +tor_mutex_uninit(tor_mutex_t *m) +{ + int err; + tor_assert(m); + err = pthread_mutex_destroy(&m->mutex); + if (PREDICT_UNLIKELY(err)) { + log_err(LD_GENERAL, "Error %d destroying a mutex.", err); + tor_fragile_assert(); + } +} +/** Return an integer representing this thread. */ +unsigned long +tor_get_thread_id(void) +{ + union { + pthread_t thr; + unsigned long id; + } r; + r.thr = pthread_self(); + return r.id; +} + +/* Conditions. */ + +/** Initialize an already-allocated condition variable. */ +int +tor_cond_init(tor_cond_t *cond) +{ + pthread_condattr_t condattr; + + memset(cond, 0, sizeof(tor_cond_t)); + /* Default condition attribute. Might be used if clock monotonic is + * available else this won't affect anything. */ + if (pthread_condattr_init(&condattr)) { + return -1; + } + +#if defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_MONOTONIC) + /* Use monotonic time so when we timedwait() on it, any clock adjustment + * won't affect the timeout value. */ + if (pthread_condattr_setclock(&condattr, CLOCK_MONOTONIC)) { + return -1; + } +#endif + if (pthread_cond_init(&cond->cond, &condattr)) { + return -1; + } + return 0; +} + +/** Release all resources held by <b>cond</b>, but do not free <b>cond</b> + * itself. */ +void +tor_cond_uninit(tor_cond_t *cond) +{ + if (pthread_cond_destroy(&cond->cond)) { + log_warn(LD_GENERAL,"Error freeing condition: %s", strerror(errno)); + return; + } +} +/** Wait until one of the tor_cond_signal functions is called on <b>cond</b>. + * (If <b>tv</b> is set, and that amount of time passes with no signal to + * <b>cond</b>, return anyway. All waiters on the condition must wait holding + * the same <b>mutex</b>. All signallers should hold that mutex. The mutex + * needs to have been allocated with tor_mutex_init_for_cond(). + * + * Returns 0 on success, -1 on failure, 1 on timeout. */ +int +tor_cond_wait(tor_cond_t *cond, tor_mutex_t *mutex, const struct timeval *tv) +{ + int r; + if (tv == NULL) { + while (1) { + r = pthread_cond_wait(&cond->cond, &mutex->mutex); + if (r == EINTR) { + /* EINTR should be impossible according to POSIX, but POSIX, like the + * Pirate's Code, is apparently treated "more like what you'd call + * guidelines than actual rules." */ + continue; + } + return r ? -1 : 0; + } + } else { + struct timeval tvnow, tvsum; + struct timespec ts; + while (1) { +#if defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_MONOTONIC) + if (clock_gettime(CLOCK_MONOTONIC, &ts) < 0) { + return -1; + } + tvnow.tv_sec = ts.tv_sec; + tvnow.tv_usec = ts.tv_nsec / 1000; + timeradd(tv, &tvnow, &tvsum); +#else + if (gettimeofday(&tvnow, NULL) < 0) + return -1; + timeradd(tv, &tvnow, &tvsum); +#endif /* HAVE_CLOCK_GETTIME, CLOCK_MONOTONIC */ + + ts.tv_sec = tvsum.tv_sec; + ts.tv_nsec = tvsum.tv_usec * 1000; + + r = pthread_cond_timedwait(&cond->cond, &mutex->mutex, &ts); + if (r == 0) + return 0; + else if (r == ETIMEDOUT) + return 1; + else if (r == EINTR) + continue; + else + return -1; + } + } +} +/** Wake up one of the waiters on <b>cond</b>. */ +void +tor_cond_signal_one(tor_cond_t *cond) +{ + pthread_cond_signal(&cond->cond); +} +/** Wake up all of the waiters on <b>cond</b>. */ +void +tor_cond_signal_all(tor_cond_t *cond) +{ + pthread_cond_broadcast(&cond->cond); +} + +/** Set up common structures for use by threading. */ +void +tor_threads_init(void) +{ + if (!threads_initialized) { + pthread_mutexattr_init(&attr_recursive); + pthread_mutexattr_settype(&attr_recursive, PTHREAD_MUTEX_RECURSIVE); + tor_assert(0==pthread_attr_init(&attr_detached)); + tor_assert(0==pthread_attr_setdetachstate(&attr_detached, 1)); + threads_initialized = 1; + set_main_thread(); + } +} + diff --git a/src/common/compat_threads.c b/src/common/compat_threads.c new file mode 100644 index 0000000000..d2d929e430 --- /dev/null +++ b/src/common/compat_threads.c @@ -0,0 +1,302 @@ +/* Copyright (c) 2003-2004, Roger Dingledine + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2015, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#define _GNU_SOURCE + +#include "orconfig.h" +#include <stdlib.h> +#include "compat.h" +#include "compat_threads.h" + +#include "util.h" +#include "torlog.h" + +#ifdef HAVE_SYS_EVENTFD_H +#include <sys/eventfd.h> +#endif +#ifdef HAVE_FCNTL_H +#include <fcntl.h> +#endif +#ifdef HAVE_UNISTD_H +#include <unistd.h> +#endif + +/** Return a newly allocated, ready-for-use mutex. */ +tor_mutex_t * +tor_mutex_new(void) +{ + tor_mutex_t *m = tor_malloc_zero(sizeof(tor_mutex_t)); + tor_mutex_init(m); + return m; +} +/** Return a newly allocated, ready-for-use mutex. This one might be + * non-recursive, if that's faster. */ +tor_mutex_t * +tor_mutex_new_nonrecursive(void) +{ + tor_mutex_t *m = tor_malloc_zero(sizeof(tor_mutex_t)); + tor_mutex_init_nonrecursive(m); + return m; +} +/** Release all storage and system resources held by <b>m</b>. */ +void +tor_mutex_free(tor_mutex_t *m) +{ + if (!m) + return; + tor_mutex_uninit(m); + tor_free(m); +} + +/** Allocate and return a new condition variable. */ +tor_cond_t * +tor_cond_new(void) +{ + tor_cond_t *cond = tor_malloc(sizeof(tor_cond_t)); + if (tor_cond_init(cond)<0) + tor_free(cond); + return cond; +} + +/** Free all storage held in <b>c</b>. */ +void +tor_cond_free(tor_cond_t *c) +{ + if (!c) + return; + tor_cond_uninit(c); + tor_free(c); +} + +/** Identity of the "main" thread */ +static unsigned long main_thread_id = -1; + +/** Start considering the current thread to be the 'main thread'. This has + * no effect on anything besides in_main_thread(). */ +void +set_main_thread(void) +{ + main_thread_id = tor_get_thread_id(); +} +/** Return true iff called from the main thread. */ +int +in_main_thread(void) +{ + return main_thread_id == tor_get_thread_id(); +} + +#if defined(HAVE_EVENTFD) || defined(HAVE_PIPE) +/* non-interruptable versions */ +static int +write_ni(int fd, const void *buf, size_t n) +{ + int r; + again: + r = (int) write(fd, buf, n); + if (r < 0 && errno == EINTR) + goto again; + return r; +} +static int +read_ni(int fd, void *buf, size_t n) +{ + int r; + again: + r = (int) read(fd, buf, n); + if (r < 0 && errno == EINTR) + goto again; + return r; +} +#endif + +/* non-interruptable versions */ +static int +send_ni(int fd, const void *buf, size_t n, int flags) +{ + int r; + again: + r = (int) send(fd, buf, n, flags); + if (r < 0 && errno == EINTR) + goto again; + return r; +} + +static int +recv_ni(int fd, void *buf, size_t n, int flags) +{ + int r; + again: + r = (int) recv(fd, buf, n, flags); + if (r < 0 && errno == EINTR) + goto again; + return r; +} + +#ifdef HAVE_EVENTFD +static int +eventfd_alert(int fd) +{ + uint64_t u = 1; + int r = write_ni(fd, (void*)&u, sizeof(u)); + if (r < 0 && errno != EAGAIN) + return -1; + return 0; +} + +static int +eventfd_drain(int fd) +{ + uint64_t u = 0; + int r = read_ni(fd, (void*)&u, sizeof(u)); + if (r < 0 && errno != EAGAIN) + return -1; + return 0; +} +#endif + +#ifdef HAVE_PIPE +static int +pipe_alert(int fd) +{ + ssize_t r = write_ni(fd, "x", 1); + if (r < 0 && errno != EAGAIN) + return -1; + return 0; +} + +static int +pipe_drain(int fd) +{ + char buf[32]; + ssize_t r; + while ((r = read_ni(fd, buf, sizeof(buf))) >= 0) + ; + if (r == 0 || errno != EAGAIN) + return -1; + return 0; +} +#endif + +static int +sock_alert(tor_socket_t fd) +{ + ssize_t r = send_ni(fd, "x", 1, 0); + if (r < 0 && !ERRNO_IS_EAGAIN(tor_socket_errno(fd))) + return -1; + return 0; +} + +static int +sock_drain(tor_socket_t fd) +{ + char buf[32]; + ssize_t r; + while ((r = recv_ni(fd, buf, sizeof(buf), 0)) >= 0) + ; + if (r == 0 || !ERRNO_IS_EAGAIN(tor_socket_errno(fd))) + return -1; + return 0; +} + +/** Allocate a new set of alert sockets, and set the appropriate function + * pointers, in <b>socks_out</b>. */ +int +alert_sockets_create(alert_sockets_t *socks_out, uint32_t flags) +{ + tor_socket_t socks[2] = { TOR_INVALID_SOCKET, TOR_INVALID_SOCKET }; + +#ifdef HAVE_EVENTFD + /* First, we try the Linux eventfd() syscall. This gives a 64-bit counter + * associated with a single file descriptor. */ +#if defined(EFD_CLOEXEC) && defined(EFD_NONBLOCK) + if (!(flags & ASOCKS_NOEVENTFD2)) + socks[0] = eventfd(0, EFD_CLOEXEC|EFD_NONBLOCK); +#endif + if (socks[0] < 0 && !(flags & ASOCKS_NOEVENTFD)) { + socks[0] = eventfd(0,0); + if (socks[0] >= 0) { + if (fcntl(socks[0], F_SETFD, FD_CLOEXEC) < 0 || + set_socket_nonblocking(socks[0]) < 0) { + close(socks[0]); + return -1; + } + } + } + if (socks[0] >= 0) { + socks_out->read_fd = socks_out->write_fd = socks[0]; + socks_out->alert_fn = eventfd_alert; + socks_out->drain_fn = eventfd_drain; + return 0; + } +#endif + +#ifdef HAVE_PIPE2 + /* Now we're going to try pipes. First type the pipe2() syscall, if we + * have it, so we can save some calls... */ + if (!(flags & ASOCKS_NOPIPE2) && + pipe2(socks, O_NONBLOCK|O_CLOEXEC) == 0) { + socks_out->read_fd = socks[0]; + socks_out->write_fd = socks[1]; + socks_out->alert_fn = pipe_alert; + socks_out->drain_fn = pipe_drain; + return 0; + } +#endif + +#ifdef HAVE_PIPE + /* Now try the regular pipe() syscall. Pipes have a bit lower overhead than + * socketpairs, fwict. */ + if (!(flags & ASOCKS_NOPIPE) && + pipe(socks) == 0) { + if (fcntl(socks[0], F_SETFD, FD_CLOEXEC) < 0 || + fcntl(socks[1], F_SETFD, FD_CLOEXEC) < 0 || + set_socket_nonblocking(socks[0]) < 0 || + set_socket_nonblocking(socks[1]) < 0) { + close(socks[0]); + close(socks[1]); + return -1; + } + socks_out->read_fd = socks[0]; + socks_out->write_fd = socks[1]; + socks_out->alert_fn = pipe_alert; + socks_out->drain_fn = pipe_drain; + return 0; + } +#endif + + /* If nothing else worked, fall back on socketpair(). */ + if (!(flags & ASOCKS_NOSOCKETPAIR) && + tor_socketpair(AF_UNIX, SOCK_STREAM, 0, socks) == 0) { + if (set_socket_nonblocking(socks[0]) < 0 || + set_socket_nonblocking(socks[1])) { + tor_close_socket(socks[0]); + tor_close_socket(socks[1]); + return -1; + } + socks_out->read_fd = socks[0]; + socks_out->write_fd = socks[1]; + socks_out->alert_fn = sock_alert; + socks_out->drain_fn = sock_drain; + return 0; + } + return -1; +} + +/** Close the sockets in <b>socks</b>. */ +void +alert_sockets_close(alert_sockets_t *socks) +{ + if (socks->alert_fn == sock_alert) { + /* they are sockets. */ + tor_close_socket(socks->read_fd); + tor_close_socket(socks->write_fd); + } else { + close(socks->read_fd); + if (socks->write_fd != socks->read_fd) + close(socks->write_fd); + } + socks->read_fd = socks->write_fd = -1; +} + diff --git a/src/common/compat_threads.h b/src/common/compat_threads.h new file mode 100644 index 0000000000..acf3083f37 --- /dev/null +++ b/src/common/compat_threads.h @@ -0,0 +1,115 @@ +/* Copyright (c) 2003-2004, Roger Dingledine + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2015, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#ifndef TOR_COMPAT_THREADS_H +#define TOR_COMPAT_THREADS_H + +#include "orconfig.h" +#include "torint.h" +#include "testsupport.h" + +#if defined(HAVE_PTHREAD_H) && !defined(_WIN32) +#include <pthread.h> +#endif + +#if defined(_WIN32) +#define USE_WIN32_THREADS +#elif defined(HAVE_PTHREAD_H) && defined(HAVE_PTHREAD_CREATE) +#define USE_PTHREADS +#else +#error "No threading system was found" +#endif + +int spawn_func(void (*func)(void *), void *data); +void spawn_exit(void) ATTR_NORETURN; + +/* Because we use threads instead of processes on most platforms (Windows, + * Linux, etc), we need locking for them. On platforms with poor thread + * support or broken gethostbyname_r, these functions are no-ops. */ + +/** A generic lock structure for multithreaded builds. */ +typedef struct tor_mutex_t { +#if defined(USE_WIN32_THREADS) + /** Windows-only: on windows, we implement locks with CRITICAL_SECTIONS. */ + CRITICAL_SECTION mutex; +#elif defined(USE_PTHREADS) + /** Pthreads-only: with pthreads, we implement locks with + * pthread_mutex_t. */ + pthread_mutex_t mutex; +#else + /** No-threads only: Dummy variable so that tor_mutex_t takes up space. */ + int _unused; +#endif +} tor_mutex_t; + +tor_mutex_t *tor_mutex_new(void); +tor_mutex_t *tor_mutex_new_nonrecursive(void); +void tor_mutex_init(tor_mutex_t *m); +void tor_mutex_init_nonrecursive(tor_mutex_t *m); +void tor_mutex_acquire(tor_mutex_t *m); +void tor_mutex_release(tor_mutex_t *m); +void tor_mutex_free(tor_mutex_t *m); +void tor_mutex_uninit(tor_mutex_t *m); +unsigned long tor_get_thread_id(void); +void tor_threads_init(void); + +/** Conditions need nonrecursive mutexes with pthreads. */ +#define tor_mutex_init_for_cond(m) tor_mutex_init_nonrecursive(m) + +void set_main_thread(void); +int in_main_thread(void); + +typedef struct tor_cond_t { +#ifdef USE_PTHREADS + pthread_cond_t cond; +#elif defined(USE_WIN32_THREADS) + HANDLE event; + + CRITICAL_SECTION lock; + int n_waiting; + int n_to_wake; + int generation; +#else +#error no known condition implementation. +#endif +} tor_cond_t; + +tor_cond_t *tor_cond_new(void); +void tor_cond_free(tor_cond_t *cond); +int tor_cond_init(tor_cond_t *cond); +void tor_cond_uninit(tor_cond_t *cond); +int tor_cond_wait(tor_cond_t *cond, tor_mutex_t *mutex, + const struct timeval *tv); +void tor_cond_signal_one(tor_cond_t *cond); +void tor_cond_signal_all(tor_cond_t *cond); + +/** Helper type used to manage waking up the main thread while it's in + * the libevent main loop. Used by the work queue code. */ +typedef struct alert_sockets_s { + /* XXXX This structure needs a better name. */ + /** Socket that the main thread should listen for EV_READ events on. + * Note that this socket may be a regular fd on a non-Windows platform. + */ + tor_socket_t read_fd; + /** Socket to use when alerting the main thread. */ + tor_socket_t write_fd; + /** Function to alert the main thread */ + int (*alert_fn)(tor_socket_t write_fd); + /** Function to make the main thread no longer alerted. */ + int (*drain_fn)(tor_socket_t read_fd); +} alert_sockets_t; + +/* Flags to disable one or more alert_sockets backends. */ +#define ASOCKS_NOEVENTFD2 (1u<<0) +#define ASOCKS_NOEVENTFD (1u<<1) +#define ASOCKS_NOPIPE2 (1u<<2) +#define ASOCKS_NOPIPE (1u<<3) +#define ASOCKS_NOSOCKETPAIR (1u<<4) + +int alert_sockets_create(alert_sockets_t *socks_out, uint32_t flags); +void alert_sockets_close(alert_sockets_t *socks); + +#endif + diff --git a/src/common/compat_winthreads.c b/src/common/compat_winthreads.c new file mode 100644 index 0000000000..71b994c4e4 --- /dev/null +++ b/src/common/compat_winthreads.c @@ -0,0 +1,196 @@ +/* Copyright (c) 2003-2004, Roger Dingledine + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2015, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "compat.h" +#include <windows.h> +#include <process.h> +#include "util.h" +#include "container.h" +#include "torlog.h" +#include <process.h> + +/* This value is more or less total cargo-cult */ +#define SPIN_COUNT 2000 + +/** Minimalist interface to run a void function in the background. On + * Unix calls fork, on win32 calls beginthread. Returns -1 on failure. + * func should not return, but rather should call spawn_exit. + * + * NOTE: if <b>data</b> is used, it should not be allocated on the stack, + * since in a multithreaded environment, there is no way to be sure that + * the caller's stack will still be around when the called function is + * running. + */ +int +spawn_func(void (*func)(void *), void *data) +{ + int rv; + rv = (int)_beginthread(func, 0, data); + if (rv == (int)-1) + return -1; + return 0; +} + +/** End the current thread/process. + */ +void +spawn_exit(void) +{ + _endthread(); + //we should never get here. my compiler thinks that _endthread returns, this + //is an attempt to fool it. + tor_assert(0); + _exit(0); +} + +void +tor_mutex_init(tor_mutex_t *m) +{ + InitializeCriticalSection(&m->mutex); +} +void +tor_mutex_init_nonrecursive(tor_mutex_t *m) +{ + InitializeCriticalSection(&m->mutex); +} + +void +tor_mutex_uninit(tor_mutex_t *m) +{ + DeleteCriticalSection(&m->mutex); +} +void +tor_mutex_acquire(tor_mutex_t *m) +{ + tor_assert(m); + EnterCriticalSection(&m->mutex); +} +void +tor_mutex_release(tor_mutex_t *m) +{ + LeaveCriticalSection(&m->mutex); +} +unsigned long +tor_get_thread_id(void) +{ + return (unsigned long)GetCurrentThreadId(); +} + +int +tor_cond_init(tor_cond_t *cond) +{ + memset(cond, 0, sizeof(tor_cond_t)); + if (InitializeCriticalSectionAndSpinCount(&cond->lock, SPIN_COUNT)==0) { + return -1; + } + if ((cond->event = CreateEvent(NULL,TRUE,FALSE,NULL)) == NULL) { + DeleteCriticalSection(&cond->lock); + return -1; + } + cond->n_waiting = cond->n_to_wake = cond->generation = 0; + return 0; +} +void +tor_cond_uninit(tor_cond_t *cond) +{ + DeleteCriticalSection(&cond->lock); + CloseHandle(cond->event); +} + +static void +tor_cond_signal_impl(tor_cond_t *cond, int broadcast) +{ + EnterCriticalSection(&cond->lock); + if (broadcast) + cond->n_to_wake = cond->n_waiting; + else + ++cond->n_to_wake; + cond->generation++; + SetEvent(cond->event); + LeaveCriticalSection(&cond->lock); +} +void +tor_cond_signal_one(tor_cond_t *cond) +{ + tor_cond_signal_impl(cond, 0); +} +void +tor_cond_signal_all(tor_cond_t *cond) +{ + tor_cond_signal_impl(cond, 1); +} + +int +tor_cond_wait(tor_cond_t *cond, tor_mutex_t *lock_, const struct timeval *tv) +{ + CRITICAL_SECTION *lock = &lock_->mutex; + int generation_at_start; + int waiting = 1; + int result = -1; + DWORD ms = INFINITE, ms_orig = INFINITE, startTime, endTime; + if (tv) + ms_orig = ms = tv->tv_sec*1000 + (tv->tv_usec+999)/1000; + + EnterCriticalSection(&cond->lock); + ++cond->n_waiting; + generation_at_start = cond->generation; + LeaveCriticalSection(&cond->lock); + + LeaveCriticalSection(lock); + + startTime = GetTickCount(); + do { + DWORD res; + res = WaitForSingleObject(cond->event, ms); + EnterCriticalSection(&cond->lock); + if (cond->n_to_wake && + cond->generation != generation_at_start) { + --cond->n_to_wake; + --cond->n_waiting; + result = 0; + waiting = 0; + goto out; + } else if (res != WAIT_OBJECT_0) { + result = (res==WAIT_TIMEOUT) ? 1 : -1; + --cond->n_waiting; + waiting = 0; + goto out; + } else if (ms != INFINITE) { + endTime = GetTickCount(); + if (startTime + ms_orig <= endTime) { + result = 1; /* Timeout */ + --cond->n_waiting; + waiting = 0; + goto out; + } else { + ms = startTime + ms_orig - endTime; + } + } + /* If we make it here, we are still waiting. */ + if (cond->n_to_wake == 0) { + /* There is nobody else who should wake up; reset + * the event. */ + ResetEvent(cond->event); + } + out: + LeaveCriticalSection(&cond->lock); + } while (waiting); + + EnterCriticalSection(lock); + + EnterCriticalSection(&cond->lock); + if (!cond->n_waiting) + ResetEvent(cond->event); + LeaveCriticalSection(&cond->lock); + + return result; +} + +void +tor_threads_init(void) +{ + set_main_thread(); +} + diff --git a/src/common/container.c b/src/common/container.c index ab4e22de52..37e28004ae 100644 --- a/src/common/container.c +++ b/src/common/container.c @@ -1,6 +1,6 @@ /* Copyright (c) 2003-2004, Roger Dingledine * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/common/container.h b/src/common/container.h index d3d20af5b2..377cdf5dba 100644 --- a/src/common/container.h +++ b/src/common/container.h @@ -1,6 +1,6 @@ /* Copyright (c) 2003-2004, Roger Dingledine * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TOR_CONTAINER_H diff --git a/src/common/crypto.c b/src/common/crypto.c index 90a16fab1a..370c04a315 100644 --- a/src/common/crypto.c +++ b/src/common/crypto.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001, Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -1012,7 +1012,7 @@ crypto_pk_public_checksig(crypto_pk_t *env, char *to, env->key, RSA_PKCS1_PADDING); if (r<0) { - crypto_log_errors(LOG_WARN, "checking RSA signature"); + crypto_log_errors(LOG_INFO, "checking RSA signature"); return -1; } return r; @@ -1293,7 +1293,7 @@ crypto_pk_asn1_decode(const char *str, size_t len) * Return 0 on success, -1 on failure. */ int -crypto_pk_get_digest(crypto_pk_t *pk, char *digest_out) +crypto_pk_get_digest(const crypto_pk_t *pk, char *digest_out) { unsigned char *buf = NULL; int len; @@ -2752,6 +2752,8 @@ base64_decode(char *dest, size_t destlen, const char *src, size_t srclen) if (destlen > SIZE_T_CEILING) return -1; + memset(dest, 0, destlen); + EVP_DecodeInit(&ctx); EVP_DecodeUpdate(&ctx, (unsigned char*)dest, &len, (unsigned char*)src, srclen); @@ -2773,6 +2775,8 @@ base64_decode(char *dest, size_t destlen, const char *src, size_t srclen) if (destlen > SIZE_T_CEILING) return -1; + memset(dest, 0, destlen); + /* Iterate over all the bytes in src. Each one will add 0 or 6 bits to the * value we're decoding. Accumulate bits in <b>n</b>, and whenever we have * 24 bits, batch them into 3 bytes and flush those bytes to dest. @@ -2952,6 +2956,8 @@ base32_decode(char *dest, size_t destlen, const char *src, size_t srclen) tor_assert((nbits/8) <= destlen); /* We need enough space. */ tor_assert(destlen < SIZE_T_CEILING); + memset(dest, 0, destlen); + /* Convert base32 encoded chars to the 5-bit values that they represent. */ tmp = tor_malloc_zero(srclen); for (j = 0; j < srclen; ++j) { diff --git a/src/common/crypto.h b/src/common/crypto.h index d496521849..d305bc17a0 100644 --- a/src/common/crypto.h +++ b/src/common/crypto.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001, Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -180,7 +180,7 @@ int crypto_pk_private_hybrid_decrypt(crypto_pk_t *env, char *to, int crypto_pk_asn1_encode(crypto_pk_t *pk, char *dest, size_t dest_len); crypto_pk_t *crypto_pk_asn1_decode(const char *str, size_t len); -int crypto_pk_get_digest(crypto_pk_t *pk, char *digest_out); +int crypto_pk_get_digest(const crypto_pk_t *pk, char *digest_out); int crypto_pk_get_all_digests(crypto_pk_t *pk, digests_t *digests_out); int crypto_pk_get_fingerprint(crypto_pk_t *pk, char *fp_out,int add_space); int crypto_pk_get_hashed_fingerprint(crypto_pk_t *pk, char *fp_out); diff --git a/src/common/crypto_curve25519.c b/src/common/crypto_curve25519.c index c04b715abd..5bb14b0d95 100644 --- a/src/common/crypto_curve25519.c +++ b/src/common/crypto_curve25519.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2014, The Tor Project, Inc. */ +/* Copyright (c) 2012-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /* Wrapper code for a curve25519 implementation. */ diff --git a/src/common/crypto_curve25519.h b/src/common/crypto_curve25519.h index e8f885227e..48e8a6d962 100644 --- a/src/common/crypto_curve25519.h +++ b/src/common/crypto_curve25519.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2014, The Tor Project, Inc. */ +/* Copyright (c) 2012-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TOR_CRYPTO_CURVE25519_H diff --git a/src/common/crypto_ed25519.c b/src/common/crypto_ed25519.c index 340fb4956f..f2e6945ac8 100644 --- a/src/common/crypto_ed25519.c +++ b/src/common/crypto_ed25519.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2014, The Tor Project, Inc. */ +/* Copyright (c) 2013-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /* Wrapper code for an ed25519 implementation. */ diff --git a/src/common/crypto_ed25519.h b/src/common/crypto_ed25519.h index 8c3663e0dd..7efa74bff5 100644 --- a/src/common/crypto_ed25519.h +++ b/src/common/crypto_ed25519.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2014, The Tor Project, Inc. */ +/* Copyright (c) 2012-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TOR_CRYPTO_ED25519_H diff --git a/src/common/crypto_format.c b/src/common/crypto_format.c index 63dd391914..00e0e9ea85 100644 --- a/src/common/crypto_format.c +++ b/src/common/crypto_format.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2014, The Tor Project, Inc. */ +/* Copyright (c) 2012-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /* Formatting and parsing code for crypto-related data structures. */ diff --git a/src/common/crypto_s2k.c b/src/common/crypto_s2k.c index 6d9ee497ab..99f3b2ebbc 100644 --- a/src/common/crypto_s2k.c +++ b/src/common/crypto_s2k.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001, Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define CRYPTO_S2K_PRIVATE diff --git a/src/common/crypto_s2k.h b/src/common/crypto_s2k.h index a33dc96e46..66df24c3c4 100644 --- a/src/common/crypto_s2k.h +++ b/src/common/crypto_s2k.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001, Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TOR_CRYPTO_S2K_H_INCLUDED diff --git a/src/common/di_ops.c b/src/common/di_ops.c index 0dcd6924e7..c9d1350880 100644 --- a/src/common/di_ops.c +++ b/src/common/di_ops.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2011-2014, The Tor Project, Inc. */ +/* Copyright (c) 2011-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/common/di_ops.h b/src/common/di_ops.h index 935f93fc1a..bbb1caa00c 100644 --- a/src/common/di_ops.h +++ b/src/common/di_ops.h @@ -1,6 +1,6 @@ /* Copyright (c) 2003-2004, Roger Dingledine * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/common/include.am b/src/common/include.am index 6441596199..14838ab555 100644 --- a/src/common/include.am +++ b/src/common/include.am @@ -54,10 +54,18 @@ endif LIBDONNA += $(LIBED25519_REF10) +if THREADS_PTHREADS +threads_impl_source=src/common/compat_pthreads.c +endif +if THREADS_WIN32 +threads_impl_source=src/common/compat_winthreads.c +endif + LIBOR_A_SOURCES = \ src/common/address.c \ src/common/backtrace.c \ src/common/compat.c \ + src/common/compat_threads.c \ src/common/container.c \ src/common/di_ops.c \ src/common/log.c \ @@ -66,10 +74,12 @@ LIBOR_A_SOURCES = \ src/common/util_codedigest.c \ src/common/util_process.c \ src/common/sandbox.c \ + src/common/workqueue.c \ src/ext/csiphash.c \ src/ext/trunnel/trunnel.c \ $(libor_extra_source) \ - $(libor_mempool_source) + $(libor_mempool_source) \ + $(threads_impl_source) LIBOR_CRYPTO_A_SOURCES = \ src/common/aes.c \ @@ -102,7 +112,6 @@ src_common_libor_testing_a_CFLAGS = $(AM_CFLAGS) $(TEST_CFLAGS) src_common_libor_crypto_testing_a_CFLAGS = $(AM_CFLAGS) $(TEST_CFLAGS) src_common_libor_event_testing_a_CFLAGS = $(AM_CFLAGS) $(TEST_CFLAGS) - COMMONHEADERS = \ src/common/address.h \ src/common/backtrace.h \ @@ -110,6 +119,7 @@ COMMONHEADERS = \ src/common/ciphers.inc \ src/common/compat.h \ src/common/compat_libevent.h \ + src/common/compat_threads.h \ src/common/container.h \ src/common/crypto.h \ src/common/crypto_curve25519.h \ @@ -128,6 +138,7 @@ COMMONHEADERS = \ src/common/tortls.h \ src/common/util.h \ src/common/util_process.h \ + src/common/workqueue.h \ $(libor_mempool_header) noinst_HEADERS+= $(COMMONHEADERS) diff --git a/src/common/log.c b/src/common/log.c index ad0da7da6b..2e7c711413 100644 --- a/src/common/log.c +++ b/src/common/log.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001, Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -451,7 +451,7 @@ MOCK_IMPL(STATIC void, logv,(int severity, log_domain_mask_t domain, const char *funcname, const char *suffix, const char *format, va_list ap)) { - char buf[10024]; + char buf[10240]; size_t msg_len = 0; int formatted = 0; logfile_t *lf; diff --git a/src/common/memarea.c b/src/common/memarea.c index 40c09bd0e6..6841ba54e7 100644 --- a/src/common/memarea.c +++ b/src/common/memarea.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2008-2014, The Tor Project, Inc. */ +/* Copyright (c) 2008-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** \file memarea.c diff --git a/src/common/memarea.h b/src/common/memarea.h index fb261d11fa..d14f3a2bae 100644 --- a/src/common/memarea.h +++ b/src/common/memarea.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2008-2014, The Tor Project, Inc. */ +/* Copyright (c) 2008-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /* Tor dependencies */ diff --git a/src/common/mempool.c b/src/common/mempool.c index 695a110d3d..55a34070d7 100644 --- a/src/common/mempool.c +++ b/src/common/mempool.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2007-2014, The Tor Project, Inc. */ +/* Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #if 1 /* Tor dependencies */ diff --git a/src/common/mempool.h b/src/common/mempool.h index 1e7a3121de..5cbeb8f482 100644 --- a/src/common/mempool.h +++ b/src/common/mempool.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2007-2014, The Tor Project, Inc. */ +/* Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/common/procmon.c b/src/common/procmon.c index ee27e97f79..2d0f021724 100644 --- a/src/common/procmon.c +++ b/src/common/procmon.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2011-2014, The Tor Project, Inc. */ +/* Copyright (c) 2011-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/common/procmon.h b/src/common/procmon.h index 6c487648bb..ccee6bfac6 100644 --- a/src/common/procmon.h +++ b/src/common/procmon.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2011-2014, The Tor Project, Inc. */ +/* Copyright (c) 2011-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/common/sandbox.c b/src/common/sandbox.c index ece56df81f..450b04a6f7 100644 --- a/src/common/sandbox.c +++ b/src/common/sandbox.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -58,6 +58,16 @@ #include <time.h> #include <poll.h> +#ifdef HAVE_LINUX_NETFILTER_IPV4_H +#include <linux/netfilter_ipv4.h> +#endif +#ifdef HAVE_LINUX_IF_H +#include <linux/if.h> +#endif +#ifdef HAVE_LINUX_NETFILTER_IPV6_IP6_TABLES_H +#include <linux/netfilter_ipv6/ip6_tables.h> +#endif + #if defined(HAVE_EXECINFO_H) && defined(HAVE_BACKTRACE) && \ defined(HAVE_BACKTRACE_SYMBOLS_FD) && defined(HAVE_SIGACTION) #define USE_BACKTRACE @@ -634,6 +644,22 @@ sb_getsockopt(scmp_filter_ctx ctx, sandbox_cfg_t *filter) if (rc) return rc; +#ifdef HAVE_LINUX_NETFILTER_IPV4_H + rc = seccomp_rule_add_2(ctx, SCMP_ACT_ALLOW, SCMP_SYS(getsockopt), + SCMP_CMP(1, SCMP_CMP_EQ, SOL_IP), + SCMP_CMP(2, SCMP_CMP_EQ, SO_ORIGINAL_DST)); + if (rc) + return rc; +#endif + +#ifdef HAVE_LINUX_NETFILTER_IPV6_IP6_TABLES_H + rc = seccomp_rule_add_2(ctx, SCMP_ACT_ALLOW, SCMP_SYS(getsockopt), + SCMP_CMP(1, SCMP_CMP_EQ, SOL_IPV6), + SCMP_CMP(2, SCMP_CMP_EQ, IP6T_SO_ORIGINAL_DST)); + if (rc) + return rc; +#endif + return 0; } @@ -1309,6 +1335,13 @@ sandbox_disable_getaddrinfo_cache(void) sandbox_getaddrinfo_cache_disabled = 1; } +void +sandbox_freeaddrinfo(struct addrinfo *ai) +{ + if (sandbox_getaddrinfo_cache_disabled) + freeaddrinfo(ai); +} + int sandbox_getaddrinfo(const char *name, const char *servname, const struct addrinfo *hints, diff --git a/src/common/sandbox.h b/src/common/sandbox.h index ad001865a7..36d25d6516 100644 --- a/src/common/sandbox.h +++ b/src/common/sandbox.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -115,7 +115,7 @@ struct addrinfo; int sandbox_getaddrinfo(const char *name, const char *servname, const struct addrinfo *hints, struct addrinfo **res); -#define sandbox_freeaddrinfo(addrinfo) ((void)0) +void sandbox_freeaddrinfo(struct addrinfo *addrinfo); void sandbox_free_getaddrinfo_cache(void); #else #define sandbox_getaddrinfo(name, servname, hints, res) \ diff --git a/src/common/testsupport.h b/src/common/testsupport.h index 2610086700..db7700aeb0 100644 --- a/src/common/testsupport.h +++ b/src/common/testsupport.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2014, The Tor Project, Inc. */ +/* Copyright (c) 2013-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TOR_TESTSUPPORT_H @@ -20,8 +20,8 @@ * * and implement it as: * - * MOCK_IMPL(void - * writebuf,(size_t n, char *buf) + * MOCK_IMPL(void, + * writebuf,(size_t n, char *buf)) * { * ... * } diff --git a/src/common/torgzip.c b/src/common/torgzip.c index 4480e4b747..4f23407e23 100644 --- a/src/common/torgzip.c +++ b/src/common/torgzip.c @@ -1,6 +1,6 @@ /* Copyright (c) 2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -92,10 +92,27 @@ tor_zlib_get_header_version_str(void) /** Return the 'bits' value to tell zlib to use <b>method</b>.*/ static INLINE int -method_bits(compress_method_t method) +method_bits(compress_method_t method, zlib_compression_level_t level) { /* Bits+16 means "use gzip" in zlib >= 1.2 */ - return method == GZIP_METHOD ? 15+16 : 15; + const int flag = method == GZIP_METHOD ? 16 : 0; + switch (level) { + default: + case HIGH_COMPRESSION: return flag + 15; + case MEDIUM_COMPRESSION: return flag + 13; + case LOW_COMPRESSION: return flag + 11; + } +} + +static INLINE int +get_memlevel(zlib_compression_level_t level) +{ + switch (level) { + default: + case HIGH_COMPRESSION: return 8; + case MEDIUM_COMPRESSION: return 7; + case LOW_COMPRESSION: return 6; + } } /** @{ */ @@ -162,8 +179,9 @@ tor_gzip_compress(char **out, size_t *out_len, stream->avail_in = (unsigned int)in_len; if (deflateInit2(stream, Z_BEST_COMPRESSION, Z_DEFLATED, - method_bits(method), - 8, Z_DEFAULT_STRATEGY) != Z_OK) { + method_bits(method, HIGH_COMPRESSION), + get_memlevel(HIGH_COMPRESSION), + Z_DEFAULT_STRATEGY) != Z_OK) { log_warn(LD_GENERAL, "Error from deflateInit2: %s", stream->msg?stream->msg:"<no message>"); goto err; @@ -289,7 +307,7 @@ tor_gzip_uncompress(char **out, size_t *out_len, stream->avail_in = (unsigned int)in_len; if (inflateInit2(stream, - method_bits(method)) != Z_OK) { + method_bits(method, HIGH_COMPRESSION)) != Z_OK) { log_warn(LD_GENERAL, "Error from inflateInit2: %s", stream->msg?stream->msg:"<no message>"); goto err; @@ -315,7 +333,8 @@ tor_gzip_uncompress(char **out, size_t *out_len, log_warn(LD_BUG, "Error freeing gzip structures"); goto err; } - if (inflateInit2(stream, method_bits(method)) != Z_OK) { + if (inflateInit2(stream, + method_bits(method,HIGH_COMPRESSION)) != Z_OK) { log_warn(LD_GENERAL, "Error from second inflateInit2: %s", stream->msg?stream->msg:"<no message>"); goto err; @@ -426,10 +445,11 @@ struct tor_zlib_state_t { * <b>compress</b>, it's for compression; otherwise it's for * decompression. */ tor_zlib_state_t * -tor_zlib_new(int compress, compress_method_t method) +tor_zlib_new(int compress, compress_method_t method, + zlib_compression_level_t compression_level) { tor_zlib_state_t *out; - int bits; + int bits, memlevel; if (method == GZIP_METHOD && !is_gzip_supported()) { /* Old zlib version don't support gzip in inflateInit2 */ @@ -437,21 +457,29 @@ tor_zlib_new(int compress, compress_method_t method) return NULL; } + if (! compress) { + /* use this setting for decompression, since we might have the + * max number of window bits */ + compression_level = HIGH_COMPRESSION; + } + out = tor_malloc_zero(sizeof(tor_zlib_state_t)); out->stream.zalloc = Z_NULL; out->stream.zfree = Z_NULL; out->stream.opaque = NULL; out->compress = compress; - bits = method_bits(method); + bits = method_bits(method, compression_level); + memlevel = get_memlevel(compression_level); if (compress) { if (deflateInit2(&out->stream, Z_BEST_COMPRESSION, Z_DEFLATED, - bits, 8, Z_DEFAULT_STRATEGY) != Z_OK) + bits, memlevel, + Z_DEFAULT_STRATEGY) != Z_OK) goto err; } else { if (inflateInit2(&out->stream, bits) != Z_OK) goto err; } - out->allocation = tor_zlib_state_size_precalc(!compress, bits, 8); + out->allocation = tor_zlib_state_size_precalc(!compress, bits, memlevel); total_zlib_allocation += out->allocation; diff --git a/src/common/torgzip.h b/src/common/torgzip.h index 1378d55b76..0fc2deb6c4 100644 --- a/src/common/torgzip.h +++ b/src/common/torgzip.h @@ -1,6 +1,6 @@ /* Copyright (c) 2003, Roger Dingledine * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -19,6 +19,15 @@ typedef enum { NO_METHOD=0, GZIP_METHOD=1, ZLIB_METHOD=2, UNKNOWN_METHOD=3 } compress_method_t; +/** + * Enumeration to define tradeoffs between memory usage and compression level. + * HIGH_COMPRESSION saves the most bandwidth; LOW_COMPRESSION saves the most + * memory. + **/ +typedef enum { + HIGH_COMPRESSION, MEDIUM_COMPRESSION, LOW_COMPRESSION +} zlib_compression_level_t; + int tor_gzip_compress(char **out, size_t *out_len, const char *in, size_t in_len, @@ -47,7 +56,8 @@ typedef enum { } tor_zlib_output_t; /** Internal state for an incremental zlib compression/decompression. */ typedef struct tor_zlib_state_t tor_zlib_state_t; -tor_zlib_state_t *tor_zlib_new(int compress, compress_method_t method); +tor_zlib_state_t *tor_zlib_new(int compress, compress_method_t method, + zlib_compression_level_t level); tor_zlib_output_t tor_zlib_process(tor_zlib_state_t *state, char **out, size_t *out_len, diff --git a/src/common/torint.h b/src/common/torint.h index d0b0ac14a0..6171700898 100644 --- a/src/common/torint.h +++ b/src/common/torint.h @@ -1,6 +1,6 @@ /* Copyright (c) 2003, Roger Dingledine * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -191,6 +191,10 @@ typedef unsigned __int64 uint64_t; #endif #endif +#ifndef INT64_MIN +#define INT64_MIN ((- INT64_MAX) - 1) +#endif + #ifndef SIZE_MAX #if SIZEOF_SIZE_T == 8 #define SIZE_MAX UINT64_MAX diff --git a/src/common/torlog.h b/src/common/torlog.h index fa7266c199..8923a9e213 100644 --- a/src/common/torlog.h +++ b/src/common/torlog.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001, Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -97,8 +97,10 @@ #define LD_HEARTBEAT (1u<<20) /** Abstract channel_t code */ #define LD_CHANNEL (1u<<21) +/** Scheduler */ +#define LD_SCHED (1u<<22) /** Number of logging domains in the code. */ -#define N_LOGGING_DOMAINS 22 +#define N_LOGGING_DOMAINS 23 /** This log message is not safe to send to a callback-based logger * immediately. Used as a flag, not a log domain. */ diff --git a/src/common/tortls.c b/src/common/tortls.c index cca2d420b6..ca629135a6 100644 --- a/src/common/tortls.c +++ b/src/common/tortls.c @@ -1,6 +1,6 @@ /* Copyright (c) 2003, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -29,6 +29,20 @@ #include <ws2tcpip.h> #endif #endif + +#ifdef __GNUC__ +#define GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__) +#endif + +#if __GNUC__ && GCC_VERSION >= 402 +#if GCC_VERSION >= 406 +#pragma GCC diagnostic push +#endif +/* Some versions of OpenSSL declare SSL_get_selected_srtp_profile twice in + * srtp.h. Suppress the GCC warning so we can build with -Wredundant-decl. */ +#pragma GCC diagnostic ignored "-Wredundant-decls" +#endif + #include <openssl/ssl.h> #include <openssl/ssl3.h> #include <openssl/err.h> @@ -37,6 +51,14 @@ #include <openssl/bio.h> #include <openssl/opensslv.h> +#if __GNUC__ && GCC_VERSION >= 402 +#if GCC_VERSION >= 406 +#pragma GCC diagnostic pop +#else +#pragma GCC diagnostic warning "-Wredundant-decls" +#endif +#endif + #ifdef USE_BUFFEREVENTS #include <event2/bufferevent_ssl.h> #include <event2/buffer.h> diff --git a/src/common/tortls.h b/src/common/tortls.h index 235d801202..f8c6d5913b 100644 --- a/src/common/tortls.h +++ b/src/common/tortls.h @@ -1,6 +1,6 @@ /* Copyright (c) 2003, Roger Dingledine * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TOR_TORTLS_H diff --git a/src/common/util.c b/src/common/util.c index 50097dac93..442d57a2cf 100644 --- a/src/common/util.c +++ b/src/common/util.c @@ -1,6 +1,6 @@ /* Copyright (c) 2003, Roger Dingledine * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -513,6 +513,61 @@ round_uint64_to_next_multiple_of(uint64_t number, uint64_t divisor) return number; } +/** Return the lowest x in [INT64_MIN, INT64_MAX] such that x is at least + * <b>number</b>, and x modulo <b>divisor</b> == 0. */ +int64_t +round_int64_to_next_multiple_of(int64_t number, int64_t divisor) +{ + tor_assert(divisor > 0); + if (number >= 0 && INT64_MAX - divisor + 1 >= number) + number += divisor - 1; + number -= number % divisor; + return number; +} + +/** Transform a random value <b>p</b> from the uniform distribution in + * [0.0, 1.0[ into a Laplace distributed value with location parameter + * <b>mu</b> and scale parameter <b>b</b>. Truncate the final result + * to be an integer in [INT64_MIN, INT64_MAX]. */ +int64_t +sample_laplace_distribution(double mu, double b, double p) +{ + double result; + + tor_assert(p >= 0.0 && p < 1.0); + /* This is the "inverse cumulative distribution function" from: + * http://en.wikipedia.org/wiki/Laplace_distribution */ + result = mu - b * (p > 0.5 ? 1.0 : -1.0) + * tor_mathlog(1.0 - 2.0 * fabs(p - 0.5)); + + if (result >= INT64_MAX) + return INT64_MAX; + else if (result <= INT64_MIN) + return INT64_MIN; + else + return (int64_t) result; +} + +/** Add random noise between INT64_MIN and INT64_MAX coming from a + * Laplace distribution with mu = 0 and b = <b>delta_f</b>/<b>epsilon</b> + * to <b>signal</b> based on the provided <b>random</b> value in + * [0.0, 1.0[. */ +int64_t +add_laplace_noise(int64_t signal, double random, double delta_f, + double epsilon) +{ + int64_t noise = sample_laplace_distribution( + 0.0, /* just add noise, no further signal */ + delta_f / epsilon, random); + + if (noise > 0 && INT64_MAX - noise < signal) + return INT64_MAX; + else if (noise < 0 && INT64_MIN - noise > signal) + return INT64_MIN; + else + return signal + noise; +} + /** Return the number of bits set in <b>v</b>. */ int n_bits_set_u8(uint8_t v) @@ -1223,6 +1278,9 @@ base16_decode(char *dest, size_t destlen, const char *src, size_t srclen) return -1; if (destlen < srclen/2 || destlen > SIZE_T_CEILING) return -1; + + memset(dest, 0, destlen); + end = src+srclen; while (src<end) { v1 = hex_decode_digit_(*src); @@ -1323,6 +1381,20 @@ esc_for_log(const char *s) return result; } +/** Similar to esc_for_log. Allocate and return a new string representing + * the first n characters in <b>chars</b>, surround by quotes and using + * standard C escapes. If a NUL character is encountered in <b>chars</b>, + * the resulting string will be terminated there. + */ +char * +esc_for_log_len(const char *chars, size_t n) +{ + char *string = tor_strndup(chars, n); + char *string_escaped = esc_for_log(string); + tor_free(string); + return string_escaped; +} + /** Allocate and return a new string representing the contents of <b>s</b>, * surrounded by quotes and using standard C escapes. * @@ -1656,15 +1728,18 @@ format_iso_time_nospace_usec(char *buf, const struct timeval *tv) /** Given an ISO-formatted UTC time value (after the epoch) in <b>cp</b>, * parse it and store its value in *<b>t</b>. Return 0 on success, -1 on - * failure. Ignore extraneous stuff in <b>cp</b> separated by whitespace from - * the end of the time string. */ + * failure. Ignore extraneous stuff in <b>cp</b> after the end of the time + * string, unless <b>strict</b> is set. */ int -parse_iso_time(const char *cp, time_t *t) +parse_iso_time_(const char *cp, time_t *t, int strict) { struct tm st_tm; unsigned int year=0, month=0, day=0, hour=0, minute=0, second=0; - if (tor_sscanf(cp, "%u-%2u-%2u %2u:%2u:%2u", &year, &month, - &day, &hour, &minute, &second) < 6) { + int n_fields; + char extra_char; + n_fields = tor_sscanf(cp, "%u-%2u-%2u %2u:%2u:%2u%c", &year, &month, + &day, &hour, &minute, &second, &extra_char); + if (strict ? (n_fields != 6) : (n_fields < 6)) { char *esc = esc_for_log(cp); log_warn(LD_GENERAL, "ISO time %s was unparseable", esc); tor_free(esc); @@ -1693,6 +1768,16 @@ parse_iso_time(const char *cp, time_t *t) return tor_timegm(&st_tm, t); } +/** Given an ISO-formatted UTC time value (after the epoch) in <b>cp</b>, + * parse it and store its value in *<b>t</b>. Return 0 on success, -1 on + * failure. Reject the string if any characters are present after the time. + */ +int +parse_iso_time(const char *cp, time_t *t) +{ + return parse_iso_time_(cp, t, 1); +} + /** Given a <b>date</b> in one of the three formats allowed by HTTP (ugh), * parse it into <b>tm</b>. Return 0 on success, negative on failure. */ int @@ -1957,15 +2042,24 @@ clean_name_for_stat(char *name) #endif } -/** Return FN_ERROR if filename can't be read, FN_NOENT if it doesn't - * exist, FN_FILE if it is a regular file, or FN_DIR if it's a - * directory. On FN_ERROR, sets errno. */ +/** Return: + * FN_ERROR if filename can't be read, is NULL, or is zero-length, + * FN_NOENT if it doesn't exist, + * FN_FILE if it is a non-empty regular file, or a FIFO on unix-like systems, + * FN_EMPTY for zero-byte regular files, + * FN_DIR if it's a directory, and + * FN_ERROR for any other file type. + * On FN_ERROR and FN_NOENT, sets errno. (errno is not set when FN_ERROR + * is returned due to an unhandled file type.) */ file_status_t file_status(const char *fname) { struct stat st; char *f; int r; + if (!fname || strlen(fname) == 0) { + return FN_ERROR; + } f = tor_strdup(fname); clean_name_for_stat(f); log_debug(LD_FS, "stat()ing %s", f); @@ -1977,16 +2071,23 @@ file_status(const char *fname) } return FN_ERROR; } - if (st.st_mode & S_IFDIR) + if (st.st_mode & S_IFDIR) { return FN_DIR; - else if (st.st_mode & S_IFREG) - return FN_FILE; + } else if (st.st_mode & S_IFREG) { + if (st.st_size > 0) { + return FN_FILE; + } else if (st.st_size == 0) { + return FN_EMPTY; + } else { + return FN_ERROR; + } #ifndef _WIN32 - else if (st.st_mode & S_IFIFO) + } else if (st.st_mode & S_IFIFO) { return FN_FILE; #endif - else + } else { return FN_ERROR; + } } /** Check whether <b>dirname</b> exists and is private. If yes return 0. If @@ -2905,7 +3006,7 @@ expand_filename(const char *filename) tor_free(username); rest = slash ? (slash+1) : ""; #else - log_warn(LD_CONFIG, "Couldn't expend homedir on system without pwd.h"); + log_warn(LD_CONFIG, "Couldn't expand homedir on system without pwd.h"); return tor_strdup(filename); #endif } diff --git a/src/common/util.h b/src/common/util.h index 921dd79da0..175a078c6b 100644 --- a/src/common/util.h +++ b/src/common/util.h @@ -1,6 +1,6 @@ /* Copyright (c) 2003-2004, Roger Dingledine * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -172,6 +172,10 @@ uint64_t round_to_power_of_2(uint64_t u64); unsigned round_to_next_multiple_of(unsigned number, unsigned divisor); uint32_t round_uint32_to_next_multiple_of(uint32_t number, uint32_t divisor); uint64_t round_uint64_to_next_multiple_of(uint64_t number, uint64_t divisor); +int64_t round_int64_to_next_multiple_of(int64_t number, int64_t divisor); +int64_t sample_laplace_distribution(double mu, double b, double p); +int64_t add_laplace_noise(int64_t signal, double random, double delta_f, + double epsilon); int n_bits_set_u8(uint8_t v); /* Compute the CEIL of <b>a</b> divided by <b>b</b>, for nonnegative <b>a</b> @@ -235,6 +239,7 @@ int tor_mem_is_zero(const char *mem, size_t len); int tor_digest_is_zero(const char *digest); int tor_digest256_is_zero(const char *digest); char *esc_for_log(const char *string) ATTR_MALLOC; +char *esc_for_log_len(const char *chars, size_t n) ATTR_MALLOC; const char *escaped(const char *string); char *tor_escape_str_for_pt_args(const char *string, @@ -270,6 +275,7 @@ void format_local_iso_time(char *buf, time_t t); void format_iso_time(char *buf, time_t t); void format_iso_time_nospace(char *buf, time_t t); void format_iso_time_nospace_usec(char *buf, const struct timeval *tv); +int parse_iso_time_(const char *cp, time_t *t, int strict); int parse_iso_time(const char *buf, time_t *t); int parse_http_time(const char *buf, struct tm *tm); int format_time_interval(char *out, size_t out_len, long interval); @@ -337,7 +343,7 @@ enum stream_status get_string_from_pipe(FILE *stream, char *buf, size_t count); /** Return values from file_status(); see that function's documentation * for details. */ -typedef enum { FN_ERROR, FN_NOENT, FN_FILE, FN_DIR } file_status_t; +typedef enum { FN_ERROR, FN_NOENT, FN_FILE, FN_DIR, FN_EMPTY } file_status_t; file_status_t file_status(const char *filename); /** Possible behaviors for check_private_dir() on encountering a nonexistent diff --git a/src/common/util_process.c b/src/common/util_process.c index 1924c19509..849a5c0b63 100644 --- a/src/common/util_process.c +++ b/src/common/util_process.c @@ -1,6 +1,6 @@ /* Copyright (c) 2003-2004, Roger Dingledine * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/common/util_process.h b/src/common/util_process.h index e7c55ed33d..c55cd8c5fa 100644 --- a/src/common/util_process.h +++ b/src/common/util_process.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2011-2014, The Tor Project, Inc. */ +/* Copyright (c) 2011-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/common/workqueue.c b/src/common/workqueue.c new file mode 100644 index 0000000000..5da29d5ab9 --- /dev/null +++ b/src/common/workqueue.c @@ -0,0 +1,490 @@ +/* copyright (c) 2013-2015, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "orconfig.h" +#include "compat.h" +#include "compat_threads.h" +#include "util.h" +#include "workqueue.h" +#include "tor_queue.h" +#include "torlog.h" + +struct threadpool_s { + /** An array of pointers to workerthread_t: one for each running worker + * thread. */ + struct workerthread_s **threads; + + /** Condition variable that we wait on when we have no work, and which + * gets signaled when our queue becomes nonempty. */ + tor_cond_t condition; + /** Queue of pending work that we have to do. */ + TOR_TAILQ_HEAD(, workqueue_entry_s) work; + + /** The current 'update generation' of the threadpool. Any thread that is + * at an earlier generation needs to run the update function. */ + unsigned generation; + + /** Function that should be run for updates on each thread. */ + int (*update_fn)(void *, void *); + /** Function to free update arguments if they can't be run. */ + void (*free_update_arg_fn)(void *); + /** Array of n_threads update arguments. */ + void **update_args; + + /** Number of elements in threads. */ + int n_threads; + /** Mutex to protect all the above fields. */ + tor_mutex_t lock; + + /** A reply queue to use when constructing new threads. */ + replyqueue_t *reply_queue; + + /** Functions used to allocate and free thread state. */ + void *(*new_thread_state_fn)(void*); + void (*free_thread_state_fn)(void*); + void *new_thread_state_arg; +}; + +struct workqueue_entry_s { + /** The next workqueue_entry_t that's pending on the same thread or + * reply queue. */ + TOR_TAILQ_ENTRY(workqueue_entry_s) next_work; + /** The threadpool to which this workqueue_entry_t was assigned. This field + * is set when the workqueue_entry_t is created, and won't be cleared until + * after it's handled in the main thread. */ + struct threadpool_s *on_pool; + /** True iff this entry is waiting for a worker to start processing it. */ + uint8_t pending; + /** Function to run in the worker thread. */ + int (*fn)(void *state, void *arg); + /** Function to run while processing the reply queue. */ + void (*reply_fn)(void *arg); + /** Argument for the above functions. */ + void *arg; +}; + +struct replyqueue_s { + /** Mutex to protect the answers field */ + tor_mutex_t lock; + /** Doubly-linked list of answers that the reply queue needs to handle. */ + TOR_TAILQ_HEAD(, workqueue_entry_s) answers; + + /** Mechanism to wake up the main thread when it is receiving answers. */ + alert_sockets_t alert; +}; + +/** A worker thread represents a single thread in a thread pool. To avoid + * contention, each gets its own queue. This breaks the guarantee that that + * queued work will get executed strictly in order. */ +typedef struct workerthread_s { + /** Which thread it this? In range 0..in_pool->n_threads-1 */ + int index; + /** The pool this thread is a part of. */ + struct threadpool_s *in_pool; + /** User-supplied state field that we pass to the worker functions of each + * work item. */ + void *state; + /** Reply queue to which we pass our results. */ + replyqueue_t *reply_queue; + /** The current update generation of this thread */ + unsigned generation; +} workerthread_t; + +static void queue_reply(replyqueue_t *queue, workqueue_entry_t *work); + +/** Allocate and return a new workqueue_entry_t, set up to run the function + * <b>fn</b> in the worker thread, and <b>reply_fn</b> in the main + * thread. See threadpool_queue_work() for full documentation. */ +static workqueue_entry_t * +workqueue_entry_new(int (*fn)(void*, void*), + void (*reply_fn)(void*), + void *arg) +{ + workqueue_entry_t *ent = tor_malloc_zero(sizeof(workqueue_entry_t)); + ent->fn = fn; + ent->reply_fn = reply_fn; + ent->arg = arg; + return ent; +} + +/** + * Release all storage held in <b>ent</b>. Call only when <b>ent</b> is not on + * any queue. + */ +static void +workqueue_entry_free(workqueue_entry_t *ent) +{ + if (!ent) + return; + memset(ent, 0xf0, sizeof(*ent)); + tor_free(ent); +} + +/** + * Cancel a workqueue_entry_t that has been returned from + * threadpool_queue_work. + * + * You must not call this function on any work whose reply function has been + * executed in the main thread; that will cause undefined behavior (probably, + * a crash). + * + * If the work is cancelled, this function return the argument passed to the + * work function. It is the caller's responsibility to free this storage. + * + * This function will have no effect if the worker thread has already executed + * or begun to execute the work item. In that case, it will return NULL. + */ +void * +workqueue_entry_cancel(workqueue_entry_t *ent) +{ + int cancelled = 0; + void *result = NULL; + tor_mutex_acquire(&ent->on_pool->lock); + if (ent->pending) { + TOR_TAILQ_REMOVE(&ent->on_pool->work, ent, next_work); + cancelled = 1; + result = ent->arg; + } + tor_mutex_release(&ent->on_pool->lock); + + if (cancelled) { + workqueue_entry_free(ent); + } + return result; +} + +/**DOCDOC + + must hold lock */ +static int +worker_thread_has_work(workerthread_t *thread) +{ + return !TOR_TAILQ_EMPTY(&thread->in_pool->work) || + thread->generation != thread->in_pool->generation; +} + +/** + * Main function for the worker thread. + */ +static void +worker_thread_main(void *thread_) +{ + workerthread_t *thread = thread_; + threadpool_t *pool = thread->in_pool; + workqueue_entry_t *work; + int result; + + tor_mutex_acquire(&pool->lock); + while (1) { + /* lock must be held at this point. */ + while (worker_thread_has_work(thread)) { + /* lock must be held at this point. */ + if (thread->in_pool->generation != thread->generation) { + void *arg = thread->in_pool->update_args[thread->index]; + thread->in_pool->update_args[thread->index] = NULL; + int (*update_fn)(void*,void*) = thread->in_pool->update_fn; + thread->generation = thread->in_pool->generation; + tor_mutex_release(&pool->lock); + + int r = update_fn(thread->state, arg); + + if (r < 0) { + return; + } + + tor_mutex_acquire(&pool->lock); + continue; + } + work = TOR_TAILQ_FIRST(&pool->work); + TOR_TAILQ_REMOVE(&pool->work, work, next_work); + work->pending = 0; + tor_mutex_release(&pool->lock); + + /* We run the work function without holding the thread lock. This + * is the main thread's first opportunity to give us more work. */ + result = work->fn(thread->state, work->arg); + + /* Queue the reply for the main thread. */ + queue_reply(thread->reply_queue, work); + + /* We may need to exit the thread. */ + if (result >= WQ_RPL_ERROR) { + return; + } + tor_mutex_acquire(&pool->lock); + } + /* At this point the lock is held, and there is no work in this thread's + * queue. */ + + /* TODO: support an idle-function */ + + /* Okay. Now, wait till somebody has work for us. */ + if (tor_cond_wait(&pool->condition, &pool->lock, NULL) < 0) { + log_warn(LD_GENERAL, "Fail tor_cond_wait."); + } + } +} + +/** Put a reply on the reply queue. The reply must not currently be on + * any thread's work queue. */ +static void +queue_reply(replyqueue_t *queue, workqueue_entry_t *work) +{ + int was_empty; + tor_mutex_acquire(&queue->lock); + was_empty = TOR_TAILQ_EMPTY(&queue->answers); + TOR_TAILQ_INSERT_TAIL(&queue->answers, work, next_work); + tor_mutex_release(&queue->lock); + + if (was_empty) { + if (queue->alert.alert_fn(queue->alert.write_fd) < 0) { + /* XXXX complain! */ + } + } +} + +/** Allocate and start a new worker thread to use state object <b>state</b>, + * and send responses to <b>replyqueue</b>. */ +static workerthread_t * +workerthread_new(void *state, threadpool_t *pool, replyqueue_t *replyqueue) +{ + workerthread_t *thr = tor_malloc_zero(sizeof(workerthread_t)); + thr->state = state; + thr->reply_queue = replyqueue; + thr->in_pool = pool; + + if (spawn_func(worker_thread_main, thr) < 0) { + log_err(LD_GENERAL, "Can't launch worker thread."); + return NULL; + } + + return thr; +} + +/** + * Queue an item of work for a thread in a thread pool. The function + * <b>fn</b> will be run in a worker thread, and will receive as arguments the + * thread's state object, and the provided object <b>arg</b>. It must return + * one of WQ_RPL_REPLY, WQ_RPL_ERROR, or WQ_RPL_SHUTDOWN. + * + * Regardless of its return value, the function <b>reply_fn</b> will later be + * run in the main thread when it invokes replyqueue_process(), and will + * receive as its argument the same <b>arg</b> object. It's the reply + * function's responsibility to free the work object. + * + * On success, return a workqueue_entry_t object that can be passed to + * workqueue_entry_cancel(). On failure, return NULL. + * + * Note that because each thread has its own work queue, work items may not + * be executed strictly in order. + */ +workqueue_entry_t * +threadpool_queue_work(threadpool_t *pool, + int (*fn)(void *, void *), + void (*reply_fn)(void *), + void *arg) +{ + workqueue_entry_t *ent = workqueue_entry_new(fn, reply_fn, arg); + ent->on_pool = pool; + ent->pending = 1; + + tor_mutex_acquire(&pool->lock); + + TOR_TAILQ_INSERT_TAIL(&pool->work, ent, next_work); + + tor_mutex_release(&pool->lock); + + tor_cond_signal_one(&pool->condition); + + return ent; +} + +/** + * Queue a copy of a work item for every thread in a pool. This can be used, + * for example, to tell the threads to update some parameter in their states. + * + * Arguments are as for <b>threadpool_queue_work</b>, except that the + * <b>arg</b> value is passed to <b>dup_fn</b> once per each thread to + * make a copy of it. + * + * UPDATE FUNCTIONS MUST BE IDEMPOTENT. We do not guarantee that every update + * will be run. If a new update is scheduled before the old update finishes + * running, then the new will replace the old in any threads that haven't run + * it yet. + * + * Return 0 on success, -1 on failure. + */ +int +threadpool_queue_update(threadpool_t *pool, + void *(*dup_fn)(void *), + int (*fn)(void *, void *), + void (*free_fn)(void *), + void *arg) +{ + int i, n_threads; + void (*old_args_free_fn)(void *arg); + void **old_args; + void **new_args; + + tor_mutex_acquire(&pool->lock); + n_threads = pool->n_threads; + old_args = pool->update_args; + old_args_free_fn = pool->free_update_arg_fn; + + new_args = tor_calloc(n_threads, sizeof(void*)); + for (i = 0; i < n_threads; ++i) { + if (dup_fn) + new_args[i] = dup_fn(arg); + else + new_args[i] = arg; + } + + pool->update_args = new_args; + pool->free_update_arg_fn = free_fn; + pool->update_fn = fn; + ++pool->generation; + + tor_mutex_release(&pool->lock); + + tor_cond_signal_all(&pool->condition); + + if (old_args) { + for (i = 0; i < n_threads; ++i) { + if (old_args[i] && old_args_free_fn) + old_args_free_fn(old_args[i]); + } + tor_free(old_args); + } + + return 0; +} + +/** Launch threads until we have <b>n</b>. */ +static int +threadpool_start_threads(threadpool_t *pool, int n) +{ + tor_mutex_acquire(&pool->lock); + + if (pool->n_threads < n) + pool->threads = tor_realloc(pool->threads, sizeof(workerthread_t*)*n); + + while (pool->n_threads < n) { + void *state = pool->new_thread_state_fn(pool->new_thread_state_arg); + workerthread_t *thr = workerthread_new(state, pool, pool->reply_queue); + thr->index = pool->n_threads; + + if (!thr) { + tor_mutex_release(&pool->lock); + return -1; + } + pool->threads[pool->n_threads++] = thr; + } + tor_mutex_release(&pool->lock); + + return 0; +} + +/** + * Construct a new thread pool with <b>n</b> worker threads, configured to + * send their output to <b>replyqueue</b>. The threads' states will be + * constructed with the <b>new_thread_state_fn</b> call, receiving <b>arg</b> + * as its argument. When the threads close, they will call + * <b>free_thread_state_fn</b> on their states. + */ +threadpool_t * +threadpool_new(int n_threads, + replyqueue_t *replyqueue, + void *(*new_thread_state_fn)(void*), + void (*free_thread_state_fn)(void*), + void *arg) +{ + threadpool_t *pool; + pool = tor_malloc_zero(sizeof(threadpool_t)); + tor_mutex_init_nonrecursive(&pool->lock); + tor_cond_init(&pool->condition); + TOR_TAILQ_INIT(&pool->work); + + pool->new_thread_state_fn = new_thread_state_fn; + pool->new_thread_state_arg = arg; + pool->free_thread_state_fn = free_thread_state_fn; + pool->reply_queue = replyqueue; + + if (threadpool_start_threads(pool, n_threads) < 0) { + tor_mutex_uninit(&pool->lock); + tor_free(pool); + return NULL; + } + + return pool; +} + +/** Return the reply queue associated with a given thread pool. */ +replyqueue_t * +threadpool_get_replyqueue(threadpool_t *tp) +{ + return tp->reply_queue; +} + +/** Allocate a new reply queue. Reply queues are used to pass results from + * worker threads to the main thread. Since the main thread is running an + * IO-centric event loop, it needs to get woken up with means other than a + * condition variable. */ +replyqueue_t * +replyqueue_new(uint32_t alertsocks_flags) +{ + replyqueue_t *rq; + + rq = tor_malloc_zero(sizeof(replyqueue_t)); + if (alert_sockets_create(&rq->alert, alertsocks_flags) < 0) { + tor_free(rq); + return NULL; + } + + tor_mutex_init(&rq->lock); + TOR_TAILQ_INIT(&rq->answers); + + return rq; +} + +/** + * Return the "read socket" for a given reply queue. The main thread should + * listen for read events on this socket, and call replyqueue_process() every + * time it triggers. + */ +tor_socket_t +replyqueue_get_socket(replyqueue_t *rq) +{ + return rq->alert.read_fd; +} + +/** + * Process all pending replies on a reply queue. The main thread should call + * this function every time the socket returned by replyqueue_get_socket() is + * readable. + */ +void +replyqueue_process(replyqueue_t *queue) +{ + if (queue->alert.drain_fn(queue->alert.read_fd) < 0) { + static ratelim_t warn_limit = RATELIM_INIT(7200); + log_fn_ratelim(&warn_limit, LOG_WARN, LD_GENERAL, + "Failure from drain_fd"); + } + + tor_mutex_acquire(&queue->lock); + while (!TOR_TAILQ_EMPTY(&queue->answers)) { + /* lock must be held at this point.*/ + workqueue_entry_t *work = TOR_TAILQ_FIRST(&queue->answers); + TOR_TAILQ_REMOVE(&queue->answers, work, next_work); + tor_mutex_release(&queue->lock); + work->on_pool = NULL; + + work->reply_fn(work->arg); + workqueue_entry_free(work); + + tor_mutex_acquire(&queue->lock); + } + + tor_mutex_release(&queue->lock); +} + diff --git a/src/common/workqueue.h b/src/common/workqueue.h new file mode 100644 index 0000000000..92e82b8a48 --- /dev/null +++ b/src/common/workqueue.h @@ -0,0 +1,48 @@ +/* Copyright (c) 2013, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#ifndef TOR_WORKQUEUE_H +#define TOR_WORKQUEUE_H + +#include "compat.h" + +/** A replyqueue is used to tell the main thread about the outcome of + * work that we queued for the the workers. */ +typedef struct replyqueue_s replyqueue_t; +/** A thread-pool manages starting threads and passing work to them. */ +typedef struct threadpool_s threadpool_t; +/** A workqueue entry represents a request that has been passed to a thread + * pool. */ +typedef struct workqueue_entry_s workqueue_entry_t; + +/** Possible return value from a work function: indicates success. */ +#define WQ_RPL_REPLY 0 +/** Possible return value from a work function: indicates fatal error */ +#define WQ_RPL_ERROR 1 +/** Possible return value from a work function: indicates thread is shutting + * down. */ +#define WQ_RPL_SHUTDOWN 2 + +workqueue_entry_t *threadpool_queue_work(threadpool_t *pool, + int (*fn)(void *, void *), + void (*reply_fn)(void *), + void *arg); +int threadpool_queue_update(threadpool_t *pool, + void *(*dup_fn)(void *), + int (*fn)(void *, void *), + void (*free_fn)(void *), + void *arg); +void *workqueue_entry_cancel(workqueue_entry_t *pending_work); +threadpool_t *threadpool_new(int n_threads, + replyqueue_t *replyqueue, + void *(*new_thread_state_fn)(void*), + void (*free_thread_state_fn)(void*), + void *arg); +replyqueue_t *threadpool_get_replyqueue(threadpool_t *tp); + +replyqueue_t *replyqueue_new(uint32_t alertsocks_flags); +tor_socket_t replyqueue_get_socket(replyqueue_t *rq); +void replyqueue_process(replyqueue_t *queue); + +#endif + diff --git a/src/config/geoip b/src/config/geoip index 28cb59ecb7..2359d05010 100644 --- a/src/config/geoip +++ b/src/config/geoip @@ -1,4 +1,4 @@ -# Last updated based on August 7 2014 Maxmind GeoLite2 Country +# Last updated based on January 7 2015 Maxmind GeoLite2 Country # wget https://geolite.maxmind.com/download/geoip/database/GeoLite2-Country.mmdb.gz # gunzip GeoLite2-Country.mmdb.gz # python mmdb-convert.py GeoLite2-Country.mmdb @@ -16,7 +16,7 @@ 16859136,16875519,JP 16875520,16908287,TH 16908288,16909055,CN -16909056,16909311,AU +16909056,16909311,US 16909312,16941055,CN 16941056,16973823,TH 16973824,17039359,CN @@ -39,7 +39,8 @@ 18219008,18350079,IN 18350080,18874367,CN 18874368,18907135,MY -18907136,18939903,HK +18907136,18923519,SG +18923520,18939903,HK 18939904,19005439,JP 19005440,19136511,TW 19136512,19202047,HK @@ -71,7 +72,7 @@ 29949952,30015487,KR 30015488,30408703,CN 30408704,33554431,KR -33554432,33554432,DE +33554432,33554432,RU 33554433,34603007,FR 34604544,34605055,DE 34612224,34612735,IL @@ -131,9 +132,7 @@ 36700160,36962303,AE 36962304,37224447,IL 37486592,37748735,RU -37748736,38258687,SE -38258688,38258943,DK -38258944,38273023,SE +37748736,38273023,SE 38273024,38797311,KZ 38797312,39059455,PT 39059456,39321599,GR @@ -166,9 +165,9 @@ 57083941,57083941,BE 57083942,68305407,US 68305408,68305919,MX -68305920,69094399,US -69094400,69094655,AU -69094656,71020543,US +68305920,68973055,US +68973056,68973311,CA +68973312,71020543,US 71020544,71020799,CA 71020800,71571339,US 71571340,71571340,DE @@ -207,7 +206,9 @@ 83961856,83963903,CY 83963904,83965951,RU 83965952,83967999,CZ -83968000,83976191,DE +83968000,83972863,DE +83972864,83973119,GB +83973120,83976191,DE 83976192,83978239,CH 83978240,83980287,IQ 83980288,83982335,CH @@ -223,9 +224,7 @@ 84049920,84082687,RO 84082688,84148223,RU 84148224,84410367,DE -84410368,84418559,RU -84418560,84420607,GB -84420608,84434943,RU +84410368,84434943,RU 84434944,84443135,IT 84443136,84451327,LB 84451328,84457471,RU @@ -237,101 +236,8 @@ 84545536,84549631,GB 84549632,84551679,GE 84551680,84557823,DE -84557824,84557824,NL -84557825,84557825,US -84557826,84558063,NL -84558064,84558071,US -84558072,84558879,NL -84558880,84558887,US -84558888,84560635,NL -84560636,84560639,US -84560640,84561063,NL -84561064,84561071,US -84561072,84561215,NL -84561216,84561247,US -84561248,84561351,NL -84561352,84561359,MY -84561360,84561639,NL -84561640,84561647,ES -84561648,84561655,AF -84561656,84561727,NL -84561728,84561791,US -84561792,84562383,NL -84562384,84562391,US -84562392,84562511,NL -84562512,84562527,US -84562528,84563647,NL -84563648,84563655,US -84563656,84563691,NL -84563692,84563695,GB -84563696,84563703,NL -84563704,84563711,US -84563712,84564411,NL -84564412,84564415,US -84564416,84564498,NL -84564499,84564499,GB -84564500,84564863,NL -84564864,84564871,TR -84564872,84565247,NL -84565248,84565311,US -84565312,84565655,NL -84565656,84565663,US -84565664,84566303,NL -84566304,84566319,US -84566320,84566383,NL -84566384,84566415,US -84566416,84566420,NL -84566421,84566421,US -84566422,84566495,NL -84566496,84566527,US -84566528,84566567,NL -84566568,84566583,US -84566584,84566591,NL -84566592,84566687,US -84566688,84566719,NL -84566720,84566743,US -84566744,84567039,NL -84567040,84567055,US -84567056,84567071,NL -84567072,84567103,US -84567104,84567119,NL -84567120,84567135,US -84567136,84567199,NL -84567200,84567231,US -84567232,84567375,NL -84567376,84567391,US -84567392,84567535,NL -84567536,84567551,US -84567552,84567599,NL -84567600,84567615,US -84567616,84567647,NL -84567648,84567679,US -84567680,84567903,NL -84567904,84567919,US -84567920,84567999,NL -84568000,84568015,US -84568016,84568223,NL -84568224,84568239,US -84568240,84568255,GB -84568256,84568287,NL -84568288,84568303,US -84568304,84568351,NL -84568352,84568399,US -84568400,84568591,NL -84568592,84568607,GB -84568608,84568847,NL -84568848,84568863,US -84568864,84568927,NL -84568928,84568943,GB -84568944,84568991,NL -84568992,84569023,GB -84569024,84569119,NL -84569120,84569135,US -84569136,84569183,NL -84569184,84569199,US -84569200,84570127,NL -84570128,84570143,US -84570144,84574207,NL +84557824,84566015,NL +84566016,84574207,GB 84574208,84576255,FR 84576256,84582399,GB 84582400,84590591,DE @@ -370,6 +276,7 @@ 85387264,85389311,SE 85389312,85391359,DE 85391360,85393407,NL +85395456,85395711,TR 85395968,85396223,BE 85396480,85397503,ES 85398528,85398783,SA @@ -434,7 +341,9 @@ 86442496,86442499,ES 86442500,86442507,FR 86442508,86442511,ES -86442512,86442687,FR +86442512,86442591,FR +86442592,86442599,IT +86442600,86442687,FR 86442688,86442691,ES 86442692,86442699,FR 86442700,86442700,ES @@ -497,7 +406,9 @@ 86446720,86446727,NL 86446728,86446983,FR 86446984,86446991,IT -86446992,86447095,FR +86446992,86447071,FR +86447072,86447087,DE +86447088,86447095,FR 86447096,86447103,ES 86447104,86447255,FR 86447256,86447263,PL @@ -510,7 +421,9 @@ 86448808,86448851,FR 86448852,86448855,IT 86448856,86448859,PT -86448860,86449363,FR +86448860,86449311,FR +86449312,86449343,ES +86449344,86449363,FR 86449364,86449367,DE 86449368,86449499,FR 86449500,86449503,ES @@ -543,7 +456,9 @@ 86454616,86454619,ES 86454620,86454823,FR 86454824,86454831,ES -86454832,86455623,FR +86454832,86455591,FR +86455592,86455595,NL +86455596,86455623,FR 86455624,86455624,DE 86455625,86456195,FR 86456196,86456211,DE @@ -567,9 +482,13 @@ 86457800,86457803,ES 86457804,86466839,FR 86466840,86466847,NL -86466848,86467320,FR +86466848,86466943,FR +86466944,86466959,DE +86466960,86467320,FR 86467321,86467321,FI -86467322,86467999,FR +86467322,86467551,FR +86467552,86467583,PT +86467584,86467999,FR 86468000,86468003,PL 86468004,86468055,FR 86468056,86468056,DE @@ -599,7 +518,9 @@ 86474476,86474479,DE 86474480,86474527,FR 86474528,86474531,DE -86474532,86474751,FR +86474532,86474743,FR +86474744,86474747,LT +86474748,86474751,FR 86474752,86482943,HR 86482944,86484991,RU 86484992,86487039,NL @@ -613,12 +534,11 @@ 86503424,86505471,DE 86505472,86507519,GB 86507520,86573055,ES -86573056,86638591,RO +86573056,86638591,SA 86638592,86671359,RU -86671360,86671615,JE -86671616,86671871,GB -86671872,86672895,JE -86672896,86673407,GB +86671360,86672895,JE +86672896,86673151,GB +86673152,86673407,JE 86673408,86675455,DE 86675456,86677503,IT 86677504,86687743,FR @@ -708,7 +628,9 @@ 87601152,87621631,DE 87621632,87623679,LB 87623680,87625727,KG -87625728,87627775,NL +87625728,87626880,NL +87626881,87626881,GB +87626882,87627775,NL 87627776,87629823,ES 87629824,87631871,IR 87631872,87633919,DE @@ -717,23 +639,15 @@ 87638016,87640063,UA 87640064,87642111,RS 87642112,87646207,GB -87646208,87646463,FR -87646464,87646719,RE -87646720,87646975,YT -87646976,87647231,FR -87647232,87647743,RE -87647744,87648511,FR -87648512,87649535,RE -87649536,87649791,FR -87649792,87650815,RE -87650816,87651583,FR -87651584,87651839,RE -87651840,87653119,FR -87653120,87653375,RE -87653376,87653631,FR -87653632,87653887,RE -87653888,87654143,FR -87654144,87654399,RE +87646208,87647999,FR +87648000,87648255,RE +87648256,87651839,FR +87651840,87652095,RE +87652096,87652351,FR +87652352,87652863,RE +87652864,87653375,FR +87653376,87653887,RE +87653888,87654399,FR 87654400,87670783,PL 87670784,87672831,DE 87672832,87674879,CH @@ -797,9 +711,7 @@ 88940544,88948735,GB 88948736,88965119,IT 88965120,88997887,AM -88997888,89028607,DE -89028608,89031167,US -89031168,89063423,DE +88997888,89063423,IR 89063424,89079807,GB 89079808,89096191,NL 89096192,89128959,RU @@ -843,12 +755,15 @@ 90544128,90546175,RU 90546176,90548223,DE 90548224,90550271,GB -90550272,90570751,RU +90550272,90554367,EE +90554368,90570751,RU 90570752,90578943,IT 90578944,90583039,IR 90583040,90587135,CZ 90587136,90589183,PL -90589184,90591231,FR +90589184,90589439,FR +90589440,90589695,RE +90589696,90591231,FR 90591232,90595327,GB 90595328,90603519,PS 90603520,90605567,ES @@ -857,7 +772,7 @@ 90609664,90611711,RU 90611712,90613759,DE 90613760,90615807,GB -90615808,90617855,SI +90615808,90617855,BA 90617856,90619903,GB 90619904,90636287,IL 90636288,90701823,DK @@ -878,7 +793,8 @@ 90734592,90736639,SY 90736640,90738687,NL 90738688,90740735,DE -90740736,90742783,NL +90740736,90742527,NL +90742528,90742783,RO 90742784,90750975,BG 90750976,90753023,FR 90753024,90755071,RU @@ -891,11 +807,13 @@ 90764800,90765311,IL 90765312,90767359,PL 90767360,90832895,UA -90832896,90963967,RO +90832896,90898431,IR +90898432,90963967,AE 90963968,91226111,SA 91226112,92274687,IR 92274688,92536831,RU -92536832,92602367,NL +92536832,92585983,NL +92585984,92602367,SA 92602368,92604415,BA 92604416,92606463,PL 92606464,92608511,GB @@ -933,7 +851,9 @@ 92734516,92734519,IT 92734520,92734735,FR 92734736,92734739,DE -92734740,92735615,FR +92734740,92735103,FR +92735104,92735119,GB +92735120,92735615,FR 92735616,92735616,DE 92735617,92735619,FR 92735620,92735623,ES @@ -945,11 +865,17 @@ 92736000,92736255,GB 92736256,92736479,FR 92736480,92736480,DE -92736481,92738663,FR +92736481,92736571,FR +92736572,92736575,NL +92736576,92737751,FR +92737752,92737759,NL +92737760,92738271,FR +92738272,92738303,NL +92738304,92738663,FR 92738664,92738679,ES -92738680,92738719,FR -92738720,92738727,GB -92738728,92740447,FR +92738680,92739199,FR +92739200,92739215,DE +92739216,92740447,FR 92740448,92740455,IT 92740456,92741203,FR 92741204,92741207,IT @@ -961,14 +887,18 @@ 92742416,92742419,IT 92742420,92742487,FR 92742488,92742491,IT -92742492,92742691,FR +92742492,92742639,FR +92742640,92742643,ES +92742644,92742691,FR 92742692,92742695,IT 92742696,92742815,FR 92742816,92742819,ES -92742820,92743243,FR +92742820,92743047,FR +92743048,92743055,NL +92743056,92743243,FR 92743244,92743247,IT -92743248,92743303,FR -92743304,92743307,IT +92743248,92743295,FR +92743296,92743307,IT 92743308,92743311,FR 92743312,92743315,IT 92743316,92743355,FR @@ -985,7 +915,10 @@ 92744284,92744291,NL 92744292,92744555,FR 92744556,92744559,IT -92744560,92747711,FR +92744560,92744575,NL +92744576,92746415,FR +92746416,92746431,ES +92746432,92747711,FR 92747712,92747775,GB 92747776,92748773,FR 92748774,92748774,PT @@ -995,21 +928,49 @@ 92749748,92749751,ES 92749752,92751711,FR 92751712,92751712,DE -92751713,92753547,FR +92751713,92753079,FR +92753080,92753087,ES +92753088,92753547,FR 92753548,92753551,IT 92753552,92754579,FR 92754580,92754583,ES 92754584,92757311,FR 92757312,92757375,ES -92757376,92762127,FR +92757376,92761215,FR +92761216,92761343,DE +92761344,92762127,FR 92762128,92762135,ES -92762136,92782687,FR +92762136,92762383,FR +92762384,92762391,ES +92762392,92764223,FR +92764224,92764287,ES +92764288,92782687,FR 92782688,92782719,ES -92782720,92783543,FR +92782720,92783291,FR +92783292,92783295,DE +92783296,92783543,FR 92783544,92783547,ES -92783548,92786827,FR +92783548,92784159,FR +92784160,92784191,IT +92784192,92784255,FR +92784256,92784263,NL +92784264,92785363,FR +92785364,92785367,PT +92785368,92786827,FR 92786828,92786831,IT -92786832,92795123,FR +92786832,92789499,FR +92789500,92789503,IT +92789504,92790271,FR +92790272,92790275,DE +92790276,92792107,FR +92792108,92792111,IT +92792112,92792119,FR +92792120,92792127,NL +92792128,92792415,FR +92792416,92792431,ES +92792432,92793055,FR +92793056,92793087,ES +92793088,92795123,FR 92795124,92795127,IT 92795128,92798975,FR 92798976,93323263,RU @@ -1032,7 +993,9 @@ 93419520,93421567,IT 93421568,93425663,DE 93425664,93426687,GI -93426688,93427711,DE +93426688,93427085,DE +93427086,93427086,GI +93427087,93427711,DE 93427712,93429759,NO 93429760,93431807,RU 93431808,93433855,ES @@ -1056,9 +1019,7 @@ 93693952,93695999,IE 93696000,93700095,FR 93700096,93702143,PL -93702144,93705983,RU -93705984,93706239,UA -93706240,93708287,RU +93702144,93708287,RU 93708288,93712383,DE 93712384,93714431,HU 93714432,93716479,NL @@ -1068,10 +1029,10 @@ 93765632,93774847,SE 93774848,93776127,NO 93776128,93782015,SE -93782016,93833983,GB -93833984,93834239,NL -93834240,93835263,GB -93835264,93835519,NL +93782016,93835263,GB +93835264,93835407,NL +93835408,93835415,GB +93835416,93835519,NL 93835520,93836287,GB 93836288,93836799,NL 93836800,93842351,GB @@ -1088,9 +1049,7 @@ 93906944,93908991,BA 93908992,93911039,IT 93911040,93913087,AE -93913088,93914319,NL -93914320,93914323,AZ -93914324,93914357,NL +93913088,93914357,NL 93914358,93914358,GB 93914359,93914710,NL 93914711,93914711,GB @@ -1109,7 +1068,9 @@ 93916528,93916543,US 93916544,93916591,NL 93916592,93916599,US -93916600,93916971,NL +93916600,93916791,NL +93916792,93916799,CA +93916800,93916971,NL 93916972,93916975,US 93916976,93918103,NL 93918104,93918111,US @@ -1122,8 +1083,8 @@ 93918600,93918655,NL 93918656,93918687,US 93918688,93919263,NL -93919264,93919279,US -93919280,93919391,NL +93919264,93919287,US +93919288,93919391,NL 93919392,93919395,US 93919396,93919951,NL 93919952,93919959,US @@ -1131,31 +1092,23 @@ 93920060,93920063,US 93920064,93920163,NL 93920164,93920167,US -93920168,93920223,NL -93920224,93920231,US -93920232,93920575,NL +93920168,93920575,NL 93920576,93920639,US -93920640,93920855,NL -93920856,93920863,US -93920864,93920967,NL -93920968,93920975,US -93920976,93921055,NL +93920640,93921055,NL 93921056,93921059,US -93921060,93921063,NL -93921064,93921071,GB -93921072,93923551,NL -93923552,93923559,US -93923560,93923567,NL +93921060,93923095,NL +93923096,93923103,US +93923104,93923567,NL 93923568,93923575,US 93923576,93923855,NL 93923856,93923863,US 93923864,93924407,NL 93924408,93924415,JP -93924416,93924591,NL -93924592,93924599,US -93924600,93925807,NL +93924416,93925807,NL 93925808,93925815,KE -93925816,93927143,NL +93925816,93926143,NL +93926144,93926151,BO +93926152,93927143,NL 93927144,93927151,JP 93927152,93927231,NL 93927232,93927247,CL @@ -1177,7 +1130,11 @@ 93974528,93976575,CH 93976576,93978623,GB 93978624,94011391,ES -94011392,94175231,RO +94011392,94027775,RO +94027776,94035967,IT +94035968,94044159,RO +94044160,94109695,SY +94109696,94175231,SA 94175232,94178303,SE 94178304,94178559,NO 94178560,94179071,SE @@ -1192,7 +1149,9 @@ 94184960,94185471,IT 94185472,94186495,LU 94186496,94187263,DE -94187264,94188287,AT +94187264,94187519,AT +94187520,94187775,SE +94187776,94188287,AT 94188288,94189311,SE 94189312,94189567,LI 94189568,94191615,SE @@ -1234,7 +1193,7 @@ 94369792,94371839,TR 94371840,94502911,IR 94502912,94568447,OM -94568448,94633983,RO +94568448,94633983,SA 94633984,94896127,RU 94896128,95158271,IT 95158272,95166463,RU @@ -1264,22 +1223,35 @@ 95388928,95389183,AU 95389184,95389695,DE 95389696,95390207,GB -95390208,95393151,DE +95390208,95393023,DE +95393024,95393151,GB 95393152,95393279,RS -95393280,95393407,DE +95393280,95393407,GB 95393408,95393535,AE 95393536,95393663,DE 95393664,95393791,QA 95393792,95394047,GB 95394048,95395327,AU -95395328,95395839,GB +95395328,95395455,GB +95395456,95395583,DE +95395584,95395839,GB 95395840,95398399,DE 95398400,95398655,GB -95398656,95400447,DE +95398656,95399679,DE +95399680,95399807,US +95399808,95399935,DE +95399936,95400063,CA +95400064,95400191,DE +95400192,95400319,US +95400320,95400447,DE 95400448,95400703,GB -95400704,95401471,DE +95400704,95400831,US +95400832,95400959,DE +95400960,95401087,US +95401088,95401471,DE 95401472,95401727,GB -95401728,95401903,DE +95401728,95401855,US +95401856,95401903,DE 95401904,95401911,AT 95401912,95401983,DE 95401984,95402111,GB @@ -1290,15 +1262,22 @@ 95402696,95402703,HR 95402704,95402719,DE 95402720,95402751,US -95402752,95403183,DE +95402752,95403007,DE +95403008,95403135,US +95403136,95403183,DE 95403184,95403191,BE -95403192,95403519,DE +95403192,95403263,DE +95403264,95403391,US +95403392,95403519,DE 95403520,95403775,GB 95403776,95404799,DE 95404800,95405055,GB -95405056,95405567,DE +95405056,95405311,DE +95405312,95405439,US +95405440,95405567,DE 95405568,95405823,GB -95405824,95406335,DE +95405824,95405951,US +95405952,95406335,DE 95406336,95407359,GB 95407360,95407871,US 95407872,95408639,DE @@ -1308,8 +1287,8 @@ 95409920,95410175,DE 95410176,95410431,AU 95410432,95410447,CH -95410448,95410687,DE -95410688,95410943,GB +95410448,95410559,DE +95410560,95410943,GB 95410944,95411199,DE 95411200,95411215,NL 95411216,95420415,DE @@ -1348,27 +1327,137 @@ 96153600,96155647,PL 96155648,96157695,CH 96157696,96165887,RU -96165888,96166143,GP -96166144,96167167,FR -96167168,96167423,GP -96167424,96167679,FR -96167680,96167935,GP -96167936,96168191,MQ -96168192,96169471,FR -96169472,96169727,MQ -96169728,96170751,FR -96170752,96171263,GF -96171264,96173055,FR +96165888,96168703,GP +96168704,96168959,MQ +96168960,96171775,GP +96171776,96172031,GF +96172032,96173055,GP 96173056,96173311,MQ -96173312,96174079,FR +96173312,96174079,GP 96174080,96206847,HU 96206848,96305151,RU 96305152,96321535,DE 96321536,96337919,RU 96337920,96403455,IR 96403456,96468991,AZ -96468992,96731135,RO -96731136,96796671,DE +96468992,96731135,AE +96731136,96739479,FR +96739480,96739483,DE +96739484,96739583,FR +96739584,96739587,PT +96739588,96740111,FR +96740112,96740127,IT +96740128,96740223,FR +96740224,96740351,IT +96740352,96741039,FR +96741040,96741043,PT +96741044,96742407,FR +96742408,96742415,NL +96742416,96742427,FR +96742428,96742431,NL +96742432,96742679,FR +96742680,96742687,DE +96742688,96744607,FR +96744608,96744611,IT +96744612,96744831,FR +96744832,96744839,GB +96744840,96746879,FR +96746880,96747007,IT +96747008,96747103,FR +96747104,96747135,DE +96747136,96747291,FR +96747292,96747295,PT +96747296,96747343,FR +96747344,96747359,DE +96747360,96747407,FR +96747408,96747423,DE +96747424,96756427,FR +96756428,96756431,ES +96756432,96756447,DE +96756448,96756743,FR +96756744,96756751,NL +96756752,96757639,FR +96757640,96757643,CH +96757644,96757883,FR +96757884,96757887,ES +96757888,96759767,FR +96759768,96759775,IT +96759776,96760403,FR +96760404,96760407,IT +96760408,96761855,FR +96761856,96761871,BE +96761872,96762863,FR +96762864,96762879,NL +96762880,96762943,FR +96762944,96763007,ES +96763008,96763163,FR +96763164,96763167,PT +96763168,96763199,DE +96763200,96763551,FR +96763552,96763555,GB +96763556,96764375,FR +96764376,96764383,IT +96764384,96764559,FR +96764560,96764575,NL +96764576,96766943,FR +96766944,96766975,BE +96766976,96767031,FR +96767032,96767035,GB +96767036,96767823,FR +96767824,96767839,BE +96767840,96768151,FR +96768152,96768155,FI +96768156,96769279,FR +96769280,96769295,ES +96769296,96770651,FR +96770652,96770655,PL +96770656,96772215,FR +96772216,96772223,PT +96772224,96772407,FR +96772408,96772408,GB +96772409,96773119,FR +96773120,96773375,ES +96773376,96775599,FR +96775600,96775615,DE +96775616,96776319,FR +96776320,96776323,ES +96776324,96777023,FR +96777024,96777087,ES +96777088,96778171,FR +96778172,96778175,PT +96778176,96778247,FR +96778248,96778255,IT +96778256,96778867,FR +96778868,96778871,BE +96778872,96778991,FR +96778992,96779007,DE +96779008,96779167,FR +96779168,96779199,PT +96779200,96779247,FR +96779248,96779255,CZ +96779256,96779839,FR +96779840,96779903,NL +96779904,96783299,FR +96783300,96783303,ES +96783304,96783311,BE +96783312,96783327,DE +96783328,96783519,FR +96783520,96783551,ES +96783552,96783887,FR +96783888,96783903,DE +96783904,96785135,FR +96785136,96785151,NL +96785152,96785407,FR +96785408,96785423,NL +96785424,96786431,FR +96786432,96786495,GB +96786496,96792751,FR +96792752,96792767,DE +96792768,96793583,FR +96793584,96793599,DE +96793600,96794471,FR +96794472,96794479,ES +96794480,96796671,FR 96796672,96862207,AZ 96862208,96894975,GB 96894976,96897023,CZ @@ -1417,7 +1506,9 @@ 98734080,98736127,CH 98736128,98738175,RU 98738176,98740223,NO -98740224,98741503,DE +98740224,98740479,DE +98740480,98740735,US +98740736,98741503,DE 98741504,98741759,US 98741760,98742271,DE 98742272,98744319,GB @@ -1427,11 +1518,13 @@ 98893824,98959359,TR 98959360,99024895,DE 99024896,99025167,GB -99025168,99025407,IT +99025168,99025279,DE +99025280,99025407,US 99025408,99025663,NL 99025664,99025919,DE 99025920,99025935,FI -99025936,99026175,SE +99025936,99026047,DE +99026048,99026175,US 99026176,99026943,DE 99026944,99027199,GB 99027200,99027215,HR @@ -1439,23 +1532,31 @@ 99027456,99027711,PL 99027712,99027967,DE 99027968,99027983,ES -99027984,99028223,DE +99027984,99028095,DE +99028096,99028223,US 99028224,99028239,GB -99028240,99028735,DE +99028240,99028351,DE +99028352,99028479,US +99028480,99028735,DE 99028736,99028751,SE -99028752,99028991,EG -99028992,99029247,GB -99029248,99029503,DE +99028752,99028863,DE +99028864,99028991,US +99028992,99029503,GB 99029504,99029519,IE -99029520,99029759,TR -99029760,99031295,DE +99029520,99030783,DE +99030784,99031039,US +99031040,99031295,DE 99031296,99031551,GB -99031552,99031807,DE +99031552,99031679,DE +99031680,99031807,US 99031808,99031823,GB -99031824,99032063,FR +99031824,99031935,DE +99031936,99032063,US 99032064,99043839,DE 99043840,99043847,AT -99043848,99044351,DE +99043848,99044095,DE +99044096,99044223,US +99044224,99044351,DE 99044352,99044359,BE 99044360,99044607,DE 99044608,99044615,HR @@ -1500,12 +1601,12 @@ 100560896,100560959,GB 100560960,100561023,RO 100561024,100561151,GB -100561152,100564991,RO +100561152,100561599,RO +100561600,100561663,US +100561664,100564991,RO 100564992,100569087,SE 100569088,100569343,FR -100569344,100569599,SE -100569600,100569855,FR -100569856,100573183,SE +100569344,100573183,SE 100573184,100575231,GB 100575232,100577279,DK 100577280,100579327,RU @@ -1519,45 +1620,58 @@ 100634624,100636671,ES 100636672,100638719,NL 100638720,100646911,UA -100646912,100663295,RU -100663296,134874866,US +100646912,100647679,RU +100647680,100647711,TR +100647712,100663295,RU +100663296,100663296,CN +100663297,134738943,US +134738944,134739199,CA +134739200,134874866,US 134874867,134874867,DO 134874868,135192575,US 135192576,135200767,MX -135200768,135432191,US +135200768,135430143,US +135430144,135430399,CA +135430400,135432191,US 135432192,135434239,CA -135434240,135603199,US +135434240,135441407,US +135441408,135441663,CA +135441664,135556607,US +135556608,135556863,CA +135556864,135603199,US 135603200,135604223,CA -135604224,135607039,US +135604224,135604479,US +135604480,135604735,CA +135604736,135607039,US 135607040,135607295,CA 135607296,135776255,US 135776256,135776511,GU -135776512,135790591,US -135790592,135790847,CA -135790848,135791103,US +135776512,135791103,US 135791104,135791615,CA -135791616,135792639,US -135792640,135794687,CA -135794688,136237055,US +135791616,135792383,US +135792384,135794687,CA +135794688,135926527,US +135926528,135926783,VI +135926784,135945727,US +135945728,135945983,CA +135945984,136175615,US +136175616,136175871,CA +136175872,136237055,US 136237056,136239103,CA 136239104,136404991,US 136404992,136407039,CA 136407040,136413183,US -136413184,136415231,CA -136415232,136415665,US +136413184,136415665,CA 136415666,136415666,FR -136415667,136689919,US -136689920,136690175,CA -136690176,139954241,US +136415667,136415743,CA +136415744,139954241,US 139954242,139954242,ES 139954243,152305663,US 152305664,152338431,GB 152338432,167772159,US 184549376,201897983,US 201897984,201898239,PR -201898240,202182143,US -202182144,202182399,GB -202182400,202385407,US +201898240,202385407,US 202385408,202385919,PR 202385920,202706431,US 202706432,202706943,PR @@ -1565,9 +1679,11 @@ 202935552,202935807,PR 202935808,203272959,US 203272960,203273215,GB -203273216,203659007,US -203659008,203659263,VI -203659264,204047871,US +203273216,203658975,US +203658976,203658991,VI +203658992,204047359,US +204047360,204047615,VI +204047616,204047871,US 204047872,204047999,PR 204048000,204048031,US 204048032,204048047,PR @@ -1577,17 +1693,13 @@ 211126784,211126911,PR 211126912,211263999,US 211264000,211264255,SA -211264256,211597311,US -211597312,211597567,VI -211597568,211597719,US +211264256,211597719,US 211597720,211597727,VI 211597728,212787199,US 212787200,212788223,PR 212788224,212788479,US 212788480,212788735,VI -212788736,212788863,US -212788864,212788991,PR -212788992,212791831,US +212788736,212791831,US 212791832,212791839,VI 212791840,212791935,US 212791936,212792063,VI @@ -1595,25 +1707,36 @@ 212793088,212793343,PR 212793344,212794575,US 212794576,212794583,VI -212794584,214698239,US +212794584,213799167,US +213799168,213799423,CA +213799424,214617343,US +214617344,214617599,CA +214617600,214698239,US 214698240,214698255,VI 214698256,214698303,US 214698304,214698311,VI -214698312,214699519,US -214699520,214699647,PR -214699648,214699775,VI -214699776,214778367,US -214778368,214778623,PR -214778624,217709055,US -217709056,217709311,PR -217709312,219512063,US +214698312,214779135,US +214779136,214779391,PR +214779392,219249919,US +219249920,219250175,GB +219250176,219512063,US 219512064,219512319,GB 219512320,234881023,US 234881024,234883071,CN 234883072,234884095,JP 234884096,234885119,CN 234885120,234889215,VN -234889216,234913791,KR +234889216,234893311,JP +234893312,234895359,KR +234895360,234895615,TW +234895616,234895871,MY +234895872,234896127,TH +234896128,234896383,MN +234896384,234896639,IN +234896640,234896895,AE +234896896,234897151,PH +234897152,234897407,TW +234897408,234913791,KR 234913792,234946559,HK 234946560,234947583,CN 234947584,234950655,JP @@ -1652,7 +1775,9 @@ 243400704,243531775,CN 243531776,243662847,JP 243662848,243793919,CN -243793920,243859455,HK +243793920,243858687,HK +243858688,243858943,GB +243858944,243859455,HK 243859456,243916799,AU 243916800,243924991,JP 243924992,243990527,KR @@ -1704,7 +1829,9 @@ 265023488,265027583,GB 265027584,265060351,US 265060352,265093119,FR -265093120,266062079,US +265093120,265533695,US +265533696,265533951,JP +265533952,266062079,US 266062080,266062335,IN 266062336,266070271,US 266070272,266070527,AU @@ -1834,7 +1961,9 @@ 344260608,344260863,GB 344260864,344262655,US 344262656,344262911,GB -344262912,344588543,US +344262912,344270847,US +344270848,344270911,GB +344270912,344588543,US 344588544,344589055,GB 344589056,344592895,US 344592896,344592945,GB @@ -1880,7 +2009,8 @@ 386842624,386846719,NL 386846720,386862079,US 386862080,386862335,JP -386862336,386875391,US +386862336,386862591,KR +386862592,386875391,US 386875392,386879487,NL 386879488,386887679,US 386887680,386891775,NL @@ -2054,7 +2184,9 @@ 391897088,391905279,CA 391905280,391938047,US 391938048,391946239,CA -391946240,392429567,US +391946240,392390538,US +392390539,392390539,HK +392390540,392429567,US 392429568,392433663,NL 392433664,392441855,US 392441856,392445951,IE @@ -2075,6 +2207,8 @@ 392765440,392765695,GB 392765696,394264575,US 394264576,394264831,CA +394270720,394271231,NL +394296320,394296831,NL 398458880,398635007,US 398635008,398643199,NL 398643200,398647295,US @@ -2109,7 +2243,9 @@ 399458304,399466495,NL 399466496,399601663,US 399601664,399618047,NL -399618048,399630335,US +399618048,399619839,US +399619840,399620095,AU +399620096,399630335,US 399630336,399638527,NL 399638528,399818751,US 399818752,399831039,NL @@ -2160,7 +2296,19 @@ 401130496,401130751,DE 401130752,401137151,US 401137152,401137663,GB -401137664,401145855,US +401137664,401142783,US +401142784,401143039,PE +401143040,401143295,BZ +401143296,401143551,NG +401143552,401143807,IM +401143808,401144063,SA +401144064,401144319,VE +401144320,401144575,BS +401144576,401144831,MA +401144832,401145087,OM +401145088,401145343,CO +401145344,401145599,SC +401145600,401145855,YE 401145856,401211391,CA 401211392,401293311,US 401293312,401297407,CA @@ -2175,7 +2323,15 @@ 401547264,401555455,CA 401555456,402096639,US 402096640,402096895,FR -402096896,402105087,US +402096896,402097151,US +402097152,402097407,AR +402097408,402097663,KE +402097664,402097919,SY +402097920,402098175,MX +402098176,402098431,BN +402098432,402098687,BH +402098688,402098943,AW +402098944,402105087,US 402105088,402105343,GB 402105344,402107391,US 402107392,402107647,IT @@ -2203,7 +2359,9 @@ 402374656,402399231,US 402399232,402403327,CA 402403328,402415615,US -402415616,402417663,CA +402415616,402416639,CA +402416640,402416895,US +402416896,402417663,CA 402417664,402550015,US 402550016,402550271,CA 402550272,402550783,GB @@ -2234,9 +2392,9 @@ 406061056,406110207,US 406110208,406142975,CA 406142976,406147071,US -406147072,406151167,CA +406147072,406159359,CA 406159360,406175743,US -406183936,406208511,CA +406175744,406216703,CA 406216704,406241279,US 406241280,406257663,PR 406257664,406274047,US @@ -2247,10 +2405,8 @@ 406323200,406388735,US 406388736,406454271,CA 406454272,406683647,US -406683648,406683775,CA -406683776,406683903,US -406683904,406684159,CA -406684160,406838783,US +406683648,406684031,CA +406684032,406838783,US 406838784,406839295,CA 406839296,406847487,US 406847488,407408639,CA @@ -2269,6 +2425,7 @@ 409272320,409337855,US 409337856,409354239,CA 409354240,409509887,US +409509888,409518079,CA 409518080,409550847,US 409550848,409567231,CA 409567232,409731071,US @@ -2278,6 +2435,8 @@ 410189824,410648575,US 410648576,410714111,CA 410714112,411156479,US +411156480,411160575,CA +411160576,411164671,US 411164672,411168767,CA 411168768,411303935,US 411303936,411369471,NL @@ -2288,7 +2447,9 @@ 411639808,411664383,CA 411664384,411680767,US 411680768,411688959,CA -411688960,411697151,PR +411688960,411691519,PR +411691520,411692031,US +411692032,411697151,PR 411697152,411746303,CA 411746304,411762687,PR 411762688,411770879,CA @@ -2301,8 +2462,9 @@ 411983872,411988991,US 411988992,411989247,GB 411989248,412057599,US +412057600,412065791,CA 412073984,412221439,US -412221440,412237823,CA +412221440,412254207,CA 412254208,412483583,US 412483584,412549119,CA 412549120,412614655,US @@ -2318,7 +2480,9 @@ 412958720,413007871,CA 413007872,413908991,US 413908992,413925375,PR -413925376,415760383,US +413925376,414502655,US +414502656,414502783,CA +414502784,415760383,US 415760384,416022527,CA 416022528,416059391,US 416059392,416088063,CA @@ -2334,7 +2498,9 @@ 416743424,416776191,CA 416776192,417202175,US 417202176,417267711,CA -417267712,417366015,US +417267712,417335807,US +417335808,417335935,VI +417335936,417366015,US 417366016,417398783,CA 417398784,417431551,US 417431552,417529855,CA @@ -2346,9 +2512,7 @@ 417796096,417800191,US 417800192,417808383,BS 417808384,417816575,CA -417820672,417832191,US -417832192,417832447,VI -417832448,417857535,US +417820672,417857535,US 417857536,417923071,AR 417923072,418062335,US 418062336,418070527,CA @@ -2541,7 +2705,8 @@ 460983296,460984319,HK 460984320,460988415,PG 460988416,460994559,JP -460994560,460995583,MY +460994560,460995327,MY +460995328,460995583,SG 460996608,461008895,JP 461008896,461012991,AU 461012992,461045759,KR @@ -2554,9 +2719,9 @@ 461056000,461058047,AU 461058048,461062143,HK 461062144,461078527,IN -461078528,461078783,FJ -461078784,461079039,AU -461079040,461094911,FJ +461078528,461088767,FJ +461088768,461089023,AU +461089024,461094911,FJ 461094912,461096959,HK 461096960,461099007,TW 461099008,461100031,JP @@ -2628,7 +2793,7 @@ 469729280,469762047,IN 469762048,520093695,US 520093696,520257535,PL -520257536,520290303,RO +520257536,520290303,IR 520290304,520292351,TR 520292352,520294399,NL 520294400,520296447,RU @@ -2662,26 +2827,34 @@ 520491648,520491775,IS 520491776,520492031,IE 520492032,520493055,GB -520493056,520494079,IT +520493056,520493311,BE +520493312,520493823,IT +520493824,520494079,FI 520494080,520494335,FR -520494336,520494591,IT +520494336,520494591,CZ 520494592,520494847,CH 520494848,520495103,DK -520495104,520495871,IT +520495104,520495359,SE +520495360,520495615,BE +520495616,520495871,SE 520495872,520496383,DE -520496384,520496895,IT +520496384,520496639,TR +520496640,520496767,CZ +520496768,520496895,TR 520496896,520497151,ES 520497152,520497407,FR -520497408,520497919,IT +520497408,520497919,CH 520497920,520498175,FR 520498176,520498431,CH 520498432,520498687,SE -520498688,520498943,IT -520498944,520499199,FR -520499200,520500223,IT +520498688,520499711,FR +520499712,520500223,DK 520500224,520500479,LU 520500480,520500735,DE -520500736,520501759,IT +520500736,520500991,LT +520500992,520501247,AT +520501248,520501503,LU +520501504,520501759,NO 520501760,520502271,GB 520502272,520502783,IT 520502784,520503295,GB @@ -2733,18 +2906,20 @@ 520949760,520951807,RU 520951808,520953855,IE 520953856,520962047,RU -520962048,520978431,IE +520962048,520963407,IE +520963408,520963408,US +520963409,520978431,IE 520978432,520980479,RU 520980480,520982527,IT 520982528,520984575,RU -520984576,520986623,GB +520984576,520986623,NG 520986624,520988671,PS 520988672,520990719,DE 520990720,520992767,RU 520994816,521011199,BG -521011200,521020415,RO -521020416,521021439,MD -521021440,521057279,RO +521011200,521039871,RO +521039872,521043967,IR +521043968,521057279,RO 521057280,521058303,MD 521058304,521076735,RO 521076736,521078783,ES @@ -2783,7 +2958,9 @@ 521601024,521666559,RU 521666560,521668607,GB 521668608,521670655,CH -521670656,521672703,HU +521670656,521670911,HU +521670912,521671935,DE +521671936,521672703,HU 521672704,521674751,RU 521674752,521676799,GB 521676800,521678847,ES @@ -2808,7 +2985,8 @@ 521711616,521713663,SK 521713664,521715711,HU 521715712,521717759,LV -521717760,521719807,IR +521717760,521718783,IQ +521718784,521719807,IR 521719808,521721855,UA 521721856,521723903,GB 521723904,521725951,SA @@ -2849,13 +3027,7 @@ 521953280,521961471,RU 521961472,521969663,CZ 521969664,521977855,UA -521977856,521986303,RU -521986304,521986559,UA -521986560,521989631,RU -521989632,521989887,UA -521989888,521991679,RU -521991680,521991935,UA -521991936,521994239,RU +521977856,521994239,RU 521994240,522002431,KG 522002432,522010623,IR 522010624,522018815,AE @@ -2885,8 +3057,9 @@ 522719232,522721279,UA 522721280,522741759,RU 522741760,522743807,UA -522743808,522747903,RU -522747904,522764287,UA +522743808,522763263,RU +522763264,522763519,UA +522763520,522764287,RU 522780672,522782719,RU 522782720,522784767,UA 522784768,522786815,BG @@ -3061,11 +3234,23 @@ 529596416,529661951,TR 529661952,529727487,GE 529727488,529793023,HR -529793024,529793337,CZ -529793338,529793338,RU -529793339,529793535,CZ -529793536,529794303,RU -529794304,529818623,CZ +529793024,529793279,CZ +529793280,529794303,RU +529794304,529794559,CZ +529794560,529796095,RU +529796096,529797119,UA +529797120,529798143,RU +529798144,529798399,CZ +529798400,529798655,RU +529798656,529798911,KZ +529798912,529799167,UA +529799168,529799423,RU +529799424,529799679,UA +529799680,529800191,RU +529800192,529800703,UA +529800704,529801215,CZ +529801216,529817599,RU +529817600,529818623,CZ 529818624,529826303,RU 529826304,529826815,CZ 529826816,529827839,RU @@ -3160,8 +3345,8 @@ 531372544,531372799,DE 531372800,531380223,CH 531380224,531390463,DE -531390464,531394559,CH -531394560,531398655,DE +531390464,531392511,CH +531392512,531398655,DE 531398656,531400703,RU 531400704,531402751,UA 531402752,531404799,LU @@ -3171,7 +3356,9 @@ 531415040,531423231,RU 531423232,531425279,NO 531425280,531427327,FR -531427328,531427703,GB +531427328,531427559,GB +531427560,531427567,IT +531427568,531427703,GB 531427704,531427711,IT 531427712,531428263,GB 531428264,531428271,IT @@ -3195,14 +3382,16 @@ 531429600,531429607,IT 531429608,531430319,GB 531430320,531430327,IT -531430328,531430823,GB +531430328,531430791,GB +531430792,531430799,IT +531430800,531430823,GB 531430824,531430831,IT 531430832,531430847,GB 531430848,531430855,IT -531430856,531430927,GB -531430928,531430935,IT -531430936,531431423,GB -531431424,531496959,RO +531430856,531430903,GB +531430904,531430911,IT +531430912,531431423,GB +531431424,531496959,RU 531496960,531628031,PL 531628032,531660799,TR 531660800,531693567,BA @@ -3231,7 +3420,9 @@ 532209664,532210687,DE 532210688,532211711,RU 532211712,532212223,LU -532212224,532213759,RU +532212224,532212479,RU +532212480,532212735,NL +532212736,532213759,RU 532213760,532214015,GB 532214016,532221951,RU 532221952,532223999,IT @@ -3243,7 +3434,9 @@ 532246528,532250623,BA 532250624,532283391,GB 532283392,532291583,TR -532291584,532293631,IE +532291584,532292351,IE +532292352,532292607,GB +532292608,532293631,IE 532293632,532295679,IT 532295680,532297727,KG 532297728,532303871,RU @@ -3269,22 +3462,23 @@ 532347904,532348671,GB 532348672,532348927,NL 532348928,532365311,IE -532365312,532365567,LU -532365568,532365823,NL +532365312,532365823,NL 532365824,532366079,DE 532366080,532366207,NL 532366208,532366239,AR 532366240,532366271,PA -532366272,532371455,DE -532371456,532373503,NL +532366272,532367359,DE +532367360,532368383,US +532368384,532368639,NL +532368640,532369919,DE +532369920,532373503,NL 532373504,532375551,RU 532375552,532377599,IT 532377600,532381695,DE 532381696,532414463,NL 532414464,532676607,IT 532676608,532692991,GE -532692992,532700927,CZ -532700928,532701183,SK +532692992,532701183,CZ 532701184,532703231,GB 532703232,532705279,RU 532705280,532709375,NL @@ -3324,9 +3518,7 @@ 532805632,532807679,SE 532807680,533200895,IT 533200896,533233663,TR -533233664,533236991,IE -533236992,533237247,GB -533237248,533250047,IE +533233664,533250047,IE 533250048,533254143,RU 533254144,533256191,NL 533256192,533262335,RU @@ -3336,7 +3528,9 @@ 533331968,533397503,UA 533397504,533463039,KW 533463040,533479423,RU -533479424,533481471,DE +533479424,533479519,DE +533479520,533479551,FI +533479552,533481471,DE 533481472,533483519,NO 533483520,533485567,FR 533485568,533487615,LU @@ -3385,9 +3579,7 @@ 533895168,533897215,TR 533897216,533899263,DE 533899264,533901311,RU -533901312,533904383,IL -533904384,533904639,FR -533904640,533905407,IL +533901312,533905407,IL 533905408,533913599,RU 533913600,533915647,ES 533915648,533919743,GB @@ -3401,8 +3593,10 @@ 533970944,533987327,SE 533987328,534118399,DE 534118400,534151167,KW -534151168,534183935,DE -534183936,534249471,RO +534151168,534163455,DE +534163456,534167551,ES +534167552,534183935,DE +534183936,534249471,AE 534249472,534253567,GB 534253568,534257663,FR 534257664,534259711,SE @@ -3430,7 +3624,6 @@ 534372352,534374399,KW 534374400,534376447,FR 534376448,534378495,IE -534378496,534380543,FR 534380544,534511615,AE 534511616,534512639,BZ 534512640,534512895,NL @@ -3439,10 +3632,13 @@ 534513216,534513279,VG 534513280,534513407,NL 534513408,534513663,SE -534513664,534515455,US -534515456,534515711,DE +534513664,534514687,US +534514688,534515455,DE +534515456,534515711,SE 534515712,534515967,GB -534515968,534517759,US +534515968,534516735,US +534516736,534516991,GB +534516992,534517759,US 534517760,534518783,NL 534518784,534519039,DE 534519040,534519167,NL @@ -3466,12 +3662,17 @@ 534523136,534523391,NL 534523392,534523903,DE 534523904,534530047,US -534530048,534544383,DE +534530048,534538239,ES +534538240,534540287,US +534540288,534542335,NL +534542336,534544383,DE 534544384,534546431,RO 534546432,534548479,DE 534548480,534550527,PL 534550528,534560767,RU -534560768,534609919,GB +534560768,534573823,GB +534573824,534574079,NL +534574080,534609919,GB 534609920,534642687,ES 534642688,534645759,CZ 534645760,534646271,PL @@ -3533,12 +3734,18 @@ 540737758,540737758,BR 540737759,540803071,BZ 540803072,540811263,US -540811264,540814335,SG +540811264,540814085,SG +540814086,540814086,TH +540814087,540814327,SG +540814328,540814328,IN +540814329,540814335,SG 540814336,540814591,US 540814592,540819455,SG 540819456,540820959,US 540820960,540820975,CA -540820976,540826383,US +540820976,540825347,US +540825348,540825348,CA +540825349,540826383,US 540826384,540826399,CA 540826400,543690751,US 543690752,543691007,AR @@ -3640,15 +3847,15 @@ 543881728,543883263,GB 543883264,544436771,US 544436772,544436775,CA -544436776,586972927,US +544436776,545858303,US +545858304,545858559,PR +545858560,586972927,US 586972928,586973183,CA 586973184,586977023,US 586977024,586977279,AU 586977280,587006719,US 587006720,587006975,GB -587006976,587039487,US -587039488,587039743,NO -587039744,603979775,US +587006976,603979775,US 603979776,603980799,CN 603980800,603981823,NP 603981824,604110847,CN @@ -3723,8 +3930,7 @@ 621330432,621346815,PL 621346816,621355007,RU 621355008,621357055,UA -621357056,621360895,RU -621360896,621361151,DE +621357056,621361151,RU 621361152,621363199,GB 621363200,621381631,RU 621381632,621383679,FR @@ -3749,7 +3955,9 @@ 621445120,621805567,ES 621805568,621813759,NL 621813760,621821951,SA -621821952,621823999,DE +621821952,621823567,DE +621823568,621823583,US +621823584,621823999,DE 621824000,621826047,FR 621826048,621828095,RU 621830144,621838335,FI @@ -3771,17 +3979,14 @@ 621939712,621940479,RU 621940480,621942527,GB 621942528,621969407,RU -621971456,621971711,IM -621971712,621971967,GB -621971968,621972223,IM -621972224,621972479,GB -621972480,621972991,IM -621972992,621973503,GB +621971456,621972991,IM +621972992,621973247,GB +621973248,621973503,IM 621973504,621975551,IE 621975552,621977599,RU 621977600,621981695,FR 621981696,621983743,US -621983744,621985791,RS +621983744,621985791,GB 621985792,621987839,US 621987840,621989887,DK 621989888,621992959,SE @@ -3812,7 +4017,7 @@ 622415872,622417919,MK 622417920,622419967,IM 622419968,622428159,UA -622428160,622460927,RO +622428160,622460927,GB 622460928,622477311,AZ 622477312,622479359,AL 622479360,622481407,GB @@ -3830,18 +4035,12 @@ 622510080,622512127,PL 622512128,622514175,DE 622514176,622518271,NO -622518272,622519295,NL -622519296,622520319,FR +622518272,622518527,GB +622518528,622520319,NL 622520320,622522367,RU 622522368,622524415,FR 622524416,622526463,ES -622526464,622553087,DE -622553088,622555135,US -622555136,622559743,DE -622559744,622561791,AT -622561792,622582271,DE -622582272,622583295,AT -622583296,622591999,DE +622526464,622591999,IR 622592000,622624767,OM 622624768,622626815,NO 622626816,622630911,DK @@ -3856,7 +4055,7 @@ 622868480,622870527,FR 622870528,622874623,AZ 622874624,622878719,IT -622878720,622880767,FR +622878720,622878975,FR 622880768,622882815,IT 622882816,622886911,IR 622886912,622919679,GR @@ -3896,7 +4095,7 @@ 623077856,623077857,WS 623077858,623077861,NZ 623077862,623083519,CH -623083520,623116287,RO +623083520,623116287,ES 623116288,623378431,KW 623378432,623509503,OM 623509504,623640575,RO @@ -3922,9 +4121,9 @@ 623794176,623796223,ES 623796224,623798271,GB 623798272,623800319,GE -623800320,623801087,SE -623801088,623801599,US -623801600,623801855,SE +623800320,623800831,SE +623800832,623801087,NL +623801088,623801855,US 623801856,623802367,NL 623802368,623802879,SE 623802880,623804148,NL @@ -3932,7 +4131,6 @@ 623804160,623804415,NL 623804416,623806463,RU 623806464,623808511,NL -623808512,623810559,RU 623810560,623812607,ES 623812608,623820799,SE 623820800,623821823,NL @@ -3959,7 +4157,7 @@ 624029696,624033791,SE 624033792,624164863,DE 624164864,624427007,UA -624427008,624492543,RO +624427008,624492543,SA 624492544,624558079,UA 624558080,624562175,SK 624562176,624564223,TR @@ -3977,35 +4175,31 @@ 624575400,624575403,US 624575404,624575679,NL 624575680,624575743,US -624575744,624575871,NL -624575872,624575879,US -624575880,624576031,NL -624576032,624576039,US -624576040,624576127,NL +624575744,624575759,NL +624575760,624575767,BE +624575768,624576111,NL +624576112,624576119,US +624576120,624576127,NL 624576128,624576131,US 624576132,624576471,NL 624576472,624576479,US -624576480,624576887,NL +624576480,624576487,NL +624576488,624576495,CA +624576496,624576887,NL 624576888,624576895,GB -624576896,624577135,NL -624577136,624577139,GB -624577140,624577151,NL +624576896,624577151,NL 624577152,624577215,GB 624577216,624577307,NL 624577308,624577311,US 624577312,624577483,NL 624577484,624577487,US -624577488,624577863,NL -624577864,624577871,DK -624577872,624578415,NL -624578416,624578423,US -624578424,624578719,NL -624578720,624578723,GB -624578724,624578887,NL +624577488,624578887,NL 624578888,624578895,US 624578896,624578951,NL 624578952,624578955,US -624578956,624579075,NL +624578956,624579039,NL +624579040,624579047,US +624579048,624579075,NL 624579076,624579079,US 624579080,624579423,NL 624579424,624579455,US @@ -4023,9 +4217,7 @@ 624581072,624581087,US 624581088,624581135,NL 624581136,624581139,US -624581140,624581199,NL -624581200,624581207,GB -624581208,624581599,NL +624581140,624581599,NL 624581600,624581631,US 624581632,624582123,NL 624582124,624582127,US @@ -4035,7 +4227,11 @@ 624582288,624582295,US 624582296,624582399,NL 624582400,624582403,US -624582404,624584111,NL +624582404,624582759,NL +624582760,624582767,GB +624582768,624583239,NL +624583240,624583247,GB +624583248,624584111,NL 624584112,624584119,US 624584120,624584159,NL 624584160,624584175,US @@ -4043,13 +4239,17 @@ 624584384,624584391,US 624584392,624584415,NL 624584416,624584423,US -624584424,624586279,NL +624584424,624586183,NL +624586184,624586191,US +624586192,624586279,NL 624586280,624586287,US -624586288,624587583,NL +624586288,624586479,NL +624586480,624586487,DE +624586488,624587111,NL +624587112,624587119,US +624587120,624587583,NL 624587584,624587599,US -624587600,624587871,NL -624587872,624587903,US -624587904,624588383,NL +624587600,624588383,NL 624588384,624588391,US 624588392,624588399,GB 624588400,624588927,NL @@ -4058,14 +4258,16 @@ 624589160,624589167,IT 624589168,624589199,NL 624589200,624589215,KE -624589216,624589223,NL -624589224,624589231,US -624589232,624589719,NL +624589216,624589719,NL 624589720,624589727,US -624589728,624589967,NL +624589728,624589783,NL +624589784,624589791,US +624589792,624589967,NL 624589968,624589975,US 624589976,624590847,NL -624590848,624640527,FR +624590848,624625848,FR +624625849,624625849,CA +624625850,624640527,FR 624640528,624640543,GB 624640544,624640759,FR 624640760,624640767,NL @@ -4075,7 +4277,9 @@ 624643020,624643023,IT 624643024,624645147,FR 624645148,624645151,IT -624645152,624646343,FR +624645152,624646239,FR +624646240,624646255,DE +624646256,624646343,FR 624646344,624646347,NL 624646348,624646583,FR 624646584,624646591,NL @@ -4083,7 +4287,13 @@ 624647172,624647183,ES 624647184,624648139,FR 624648140,624648143,ES -624648144,624657711,FR +624648144,624653311,FR +624653312,624653823,GB +624653824,624656975,FR +624656976,624656979,PT +624656980,624657607,FR +624657608,624657615,BE +624657616,624657711,FR 624657712,624657715,ES 624657716,624657883,FR 624657884,624657887,ES @@ -4091,9 +4301,13 @@ 624658324,624658327,IE 624658328,624658479,FR 624658480,624658483,DE -624658484,624659031,FR +624658484,624658495,FR +624658496,624658527,IT +624658528,624659031,FR 624659032,624659039,IT -624659040,624660827,FR +624659040,624659071,FR +624659072,624659135,ES +624659136,624660827,FR 624660828,624660831,ES 624660832,624661247,FR 624661248,624661251,ES @@ -4117,13 +4331,19 @@ 624665952,624665955,NL 624665956,624667471,FR 624667472,624667475,IT -624667476,624668063,FR +624667476,624667599,FR +624667600,624667603,IT +624667604,624668063,FR 624668064,624668079,BE 624668080,624668639,FR 624668640,624668643,NL -624668644,624669795,FR +624668644,624669011,FR +624669012,624669015,DE +624669016,624669795,FR 624669796,624669799,ES -624669800,624671455,FR +624669800,624670915,FR +624670916,624670919,ES +624670920,624671455,FR 624671456,624671471,ES 624671472,624672547,FR 624672548,624672551,ES @@ -4167,19 +4387,27 @@ 624679680,624679687,NL 624679688,624679843,FR 624679844,624679847,ES -624679848,624680931,FR +624679848,624680839,FR +624680840,624680847,NL +624680848,624680931,FR 624680932,624680935,NL 624680936,624681351,FR 624681352,624681359,NL 624681360,624681807,FR 624681808,624681823,BE -624681824,624683775,FR +624681824,624682495,FR +624682496,624682527,ES +624682528,624683295,FR +624683296,624683311,DE +624683312,624683775,FR 624683776,624683779,DE 624683780,624683783,FR 624683784,624683787,DE 624683788,624683975,FR 624683976,624683983,GB -624683984,624684183,FR +624683984,624684043,FR +624684044,624684047,PT +624684048,624684183,FR 624684184,624684191,IT 624684192,624684199,FR 624684200,624684203,IT @@ -4187,7 +4415,9 @@ 624684208,624684211,ES 624684212,624684799,FR 624684800,624684803,DE -624684804,624685711,FR +624684804,624685535,FR +624685536,624685539,PT +624685540,624685711,FR 624685712,624685715,ES 624685716,624685799,FR 624685800,624685803,ES @@ -4244,7 +4474,7 @@ 624738304,624740351,NL 624740352,624742399,DE 624742400,624746495,RU -624746496,624754687,RO +624746496,624754687,BG 624754688,624787455,AZ 624787456,624791551,DE 624791552,624795647,ES @@ -4252,7 +4482,7 @@ 624799744,624801791,RU 624801792,624803839,AT 624803840,624812031,DE -624812032,624813055,BO +624812032,624813055,US 624813056,624814079,IL 624814080,624816127,GB 624816128,624818175,FR @@ -4271,7 +4501,8 @@ 625506304,625508351,PL 625508352,625512447,AZ 625512448,625514495,DE -625514496,625515263,GB +625514496,625514751,GG +625514752,625515263,GB 625515264,625516031,GG 625516032,625516543,GB 625516544,625518591,BE @@ -4284,9 +4515,7 @@ 625524480,625524735,SE 625524736,625541119,FR 625541120,625606655,UA -625606656,625621667,NL -625621668,625621671,DE -625621672,625672191,NL +625606656,625672191,NL 625672192,625674239,RU 625674240,625676287,TR 625676288,625680383,MD @@ -4331,8 +4560,9 @@ 625860608,625868799,CZ 625868800,625999871,RU 625999872,627048447,DE -627048448,627113983,DK -627113984,627145727,RO +627048448,627130367,DK +627130368,627142655,FR +627142656,627145727,RO 627145728,627146751,ES 627146752,627179519,NL 627179520,627212287,IR @@ -4344,6 +4574,7 @@ 627230720,627232767,IR 627232768,627236863,PL 627236864,627238911,IQ +627240804,627240804,US 627240960,627245055,RU 627245056,627277823,KZ 627277824,627294207,SA @@ -4371,8 +4602,7 @@ 628246528,628248575,MT 628248576,628250623,FI 628250624,628252671,NL -628252672,628259071,DE -628259072,628260863,SC +628252672,628260863,DE 628260864,628277247,AZ 628277248,628293631,IR 628293632,628359167,UA @@ -4391,7 +4621,6 @@ 628801536,628803583,GB 628803584,628805631,FR 628805632,628807679,GB -628807680,628809727,AE 628809728,628813823,TR 628813824,628815871,DK 628815872,628817919,GB @@ -4429,8 +4658,7 @@ 629196800,629198847,AZ 629198848,629202943,DK 629202944,629207039,RO -629207040,629211135,IR -629211136,629276671,RO +629207040,629276671,IR 629276672,629293055,PL 629293056,629309439,TR 629309440,629313535,DE @@ -4460,9 +4688,7 @@ 629866496,629874687,NL 629874688,629879807,RU 629879808,629880063,DE -629880064,629880831,RU -629880832,629881855,EE -629881856,629882879,DE +629880064,629882879,RU 629882880,629883135,GB 629883136,629883391,AU 629883904,629884159,AU @@ -4483,7 +4709,9 @@ 629985280,629987327,TR 629987328,629989375,SE 629989376,629991423,FR -629991424,629993471,NL +629991424,629991935,US +629991936,629992447,NL +629992448,629993471,US 629993472,629997567,JO 629997568,630063103,SA 630063104,630128639,IL @@ -4545,21 +4773,36 @@ 630806528,630808575,ES 630808576,630810623,NL 630810624,630816767,CH -630816768,630833151,RO +630816768,630818303,RO +630818304,630818559,SG +630818560,630829055,RO +630829056,630833151,IR 630833152,630849535,NL 630849536,630980607,TR 630980608,630981631,MD -630981632,630982655,RO +630981632,630982143,RO +630982144,630982399,SG +630982400,630982655,RO 630982656,630984703,MD -630984704,630998271,RO +630984704,630988799,IR +630988800,630992895,RO +630992896,630996991,IR +630996992,630998271,RO 630998272,630998783,MD 630998784,631001087,RO 631001088,631005183,MD -631005184,631006207,RO +631005184,631006207,IT 631006208,631007231,MD 631007232,631017471,RO 631017472,631018495,MD -631018496,631039999,RO +631018496,631019519,IT +631019520,631021567,IR +631021568,631023615,RO +631023616,631024639,IT +631024640,631029759,RO +631029760,631033855,SE +631033856,631034879,IT +631034880,631039999,RO 631040000,631043071,MD 631043072,631044095,RO 631044096,631045119,MD @@ -4592,7 +4835,9 @@ 632946688,632963071,AT 632963072,632979455,AM 632979456,633012223,IT -633012224,633063679,FR +633012224,633059983,FR +633059984,633059987,GB +633059988,633063679,FR 633063680,633063935,PL 633063936,633064191,FR 633064192,633064447,GB @@ -4655,9 +4900,7 @@ 634124288,634126335,CH 634126336,634191871,RU 634191872,634193919,TR -634193920,634194687,SK -634194688,634194815,CZ -634194816,634195967,SK +634193920,634195967,CZ 634195968,634198015,RU 634198016,634200063,BA 634200064,634202111,IS @@ -4713,15 +4956,11 @@ 635195392,635197439,RU 635197440,635199591,GB 635199592,635199599,IT -635199600,635199647,GB -635199648,635199655,IT -635199656,635199775,GB +635199600,635199775,GB 635199776,635199783,IT 635199784,635200167,GB 635200168,635200175,IT -635200176,635200199,GB -635200200,635200207,IT -635200208,635200263,GB +635200176,635200263,GB 635200264,635200271,IT 635200272,635200335,GB 635200336,635200343,IT @@ -4737,15 +4976,13 @@ 635200960,635200967,IT 635200968,635200991,GB 635200992,635200999,IT -635201000,635201023,GB -635201024,635201031,IT -635201032,635201087,GB +635201000,635201087,GB 635201088,635201095,IT 635201096,635201159,GB 635201160,635201167,IT -635201168,635201255,GB -635201256,635201263,IT -635201264,635201455,GB +635201168,635201407,GB +635201408,635201415,IT +635201416,635201455,GB 635201456,635201463,IT 635201464,635203583,GB 635203584,635207679,JO @@ -4760,7 +4997,9 @@ 635281408,635283455,RO 635283456,635283967,DE 635283968,635284223,RO -635284224,635284479,DE +635284224,635284418,DE +635284419,635284419,RO +635284420,635284479,DE 635284480,635284991,RO 635284992,635285503,US 635285504,635287551,ME @@ -4773,7 +5012,7 @@ 635299840,635301887,ES 635301888,635305983,CZ 635305984,635437055,NL -635437056,635502591,RO +635437056,635502591,SA 635502592,635568127,PL 635568128,635699199,IT 635699200,635715583,PL @@ -4793,9 +5032,7 @@ 635856896,635858943,TR 635858944,635860991,RU 635860992,635863039,BE -635863040,635889663,RU -635889664,635891711,NG -635891712,635895807,RU +635863040,635895807,RU 635895808,635961343,KW 635961344,635994111,GE 635994112,636026879,RU @@ -4825,7 +5062,11 @@ 636176384,636178431,TR 636178432,636180479,NL 636180480,636182527,FR -636182528,636186623,CZ +636182528,636185087,CZ +636185088,636185343,SE +636185344,636186111,US +636186112,636186367,FR +636186368,636186623,ES 636186624,636188671,NL 636188672,636190719,GB 636190720,636223487,RU @@ -4843,8 +5084,7 @@ 636966656,636966911,IT 636966912,636967167,DE 636967168,636967935,FR -636967936,636968191,IT -636968192,636968447,ES +636967936,636968447,DE 636968448,636968703,BE 636968704,636968959,DE 636968960,636974079,TR @@ -4898,15 +5138,11 @@ 637337088,637337599,RU 637337600,637403135,NO 637403136,637534207,IR -637534208,641736959,US -641736960,641737215,CA -641737216,641737471,US -641737472,641737727,CA -641737728,641761535,US +637534208,641761535,US 641761536,641761791,CA 641761792,641763071,US -641763072,641763583,CA -641763584,641765375,US +641763072,641763327,CA +641763328,641765375,US 641765376,641765887,CA 641765888,641766399,US 641766400,641767423,CA @@ -4915,92 +5151,104 @@ 641768960,641769727,US 641769728,641769983,CA 641769984,641771519,US -641771520,641771775,CA -641771776,641773055,US +641771520,641772287,CA +641772288,641773055,US 641773056,641773311,CA -641773312,642093055,US -642093056,642094591,CA -642094592,642388479,US +641773312,641828351,US +641828352,641828607,MX +641828608,641829057,US +641829058,641829058,MX +641829059,642089215,US +642089216,642089471,CA +642089472,642093055,US +642093056,642093311,CA +642093312,642093567,US +642093568,642094079,CA +642094080,642094335,US +642094336,642094591,CA +642094592,642387967,US +642387968,642388223,CA +642388224,642388479,US 642388480,642388735,CA 642388736,642793471,US 642793472,642793983,CA -642793984,642925055,US -642925056,642925311,MX -642925312,642926335,US +642793984,642926335,US 642926336,642926591,MX 642926592,643219519,US 643219520,643219523,CA 643219524,643219526,US 643219527,643219527,CA -643219528,643240447,US -643240448,643240703,CA -643240704,643242495,US -643242496,643242751,CA -643242752,643295231,US +643219528,643295231,US 643295232,643295487,PR 643295488,643295743,US -643295744,643296127,PR -643296128,643296767,US +643295744,643296383,PR +643296384,643296767,US 643296768,643297023,PR 643297024,643302911,US 643302912,643303167,CA 643303168,643317759,US 643317760,643318015,CA -643318016,643346431,US -643346432,643346687,CA -643346688,643351551,US -643351552,643351807,GB -643351808,644055039,US -644055040,644055807,CA -644055808,644056063,US +643318016,643318271,US +643318272,643318527,CA +643318528,643318847,US +643318848,643318911,CA +643318912,643346431,US +643346432,643346943,CA +643346944,644055039,US +644055040,644055295,CA +644055296,644056063,US 644056064,644056319,CA 644056320,644056575,US 644056576,644056831,CA -644056832,644057087,US -644057088,644057599,CA -644057600,644058111,US -644058112,644058879,CA -644058880,644059391,US -644059392,644059647,CA -644059648,644060927,US -644060928,644061183,CA -644061184,644063231,US -644063232,644063743,CA -644063744,644064511,US +644056832,644057343,US +644057344,644057599,CA +644057600,644058367,US +644058368,644058879,CA +644058880,644060671,US +644060672,644060927,CA +644060928,644060989,US +644060990,644060990,CA +644060991,644061439,US +644061440,644061631,CA +644061632,644061663,US +644061664,644061695,CA +644061696,644063231,US +644063232,644063487,CA +644063488,644064511,US 644064512,644064767,CA 644064768,644065055,US 644065056,644065279,CA -644065280,644067071,US -644067072,644067327,CA -644067328,644069631,US -644069632,644070143,CA -644070144,644084479,US -644084480,644084735,GU -644084736,644248831,US -644248832,644249087,CA -644249088,644323391,US +644065280,644067327,US +644067328,644067583,CA +644067584,644069631,US +644069632,644069887,CA +644069888,644070143,US +644070144,644070399,CA +644070400,644082687,US +644082688,644082943,PR +644082944,644268543,US +644268544,644268569,CA +644268570,644268570,US +644268571,644268613,CA +644268614,644268614,US +644268615,644268799,CA +644268800,644323391,US 644323392,644323407,CA -644323408,644323583,US -644323584,644323839,CA -644323840,644389631,US -644389632,644390911,CA -644390912,644403199,US +644323408,644389887,US +644389888,644390399,CA +644390400,644403199,US 644403200,644403455,CA -644403456,644408063,US -644408064,644408319,CA -644408320,644414207,US +644403456,644414207,US 644414208,644414463,CA 644414464,644422911,US 644422912,644423423,JP 644423424,644569087,US 644569088,644569343,PR 644569344,644570111,US -644570112,644570175,PR -644570176,644570623,US -644570624,644571135,PR -644571136,644582143,US -644582144,644582399,CA -644582400,644628735,US +644570112,644570367,PR +644570368,644570879,US +644570880,644571135,PR +644571136,644628735,US 644628736,644628991,CA 644628992,644634367,US 644634368,644634623,CA @@ -5008,71 +5256,47 @@ 644718848,644719103,CA 644719104,644760575,US 644760576,644760831,CA -644760832,644761343,US -644761344,644761599,CA -644761600,644762879,US -644762880,644763135,CA -644763136,644765439,US +644760832,644761439,US +644761440,644761455,CA +644761456,644763903,US +644763904,644764159,CA +644764160,644765439,US 644765440,644765695,CA -644765696,644767878,US -644767879,644767879,CA -644767880,644767999,US -644768000,644768255,CA -644768256,644833535,US -644833536,644833791,CA -644833792,644834047,US -644834048,644834303,CA -644834304,644834815,US +644765696,644767743,US +644767744,644768767,CA +644768768,644834815,US 644834816,644835327,CA 644835328,644836351,US 644836352,644836607,CA 644836608,644838655,US -644838656,644840447,CA -644840448,644840703,US -644840704,644841215,CA -644841216,644897791,US -644897792,644898047,CA -644898048,644898815,US +644838656,644840959,CA +644840960,644898815,US 644898816,644899071,CA 644899072,644899839,US 644899840,644900095,CA 644900096,644901631,US 644901632,644901887,CA -644901888,644982271,US -644982272,644982527,CA -644982528,644986111,US -644986112,644986367,CA -644986368,644987135,US -644987136,644987391,CA -644987392,645185535,US +644901888,644981759,US +644981760,644982015,CA +644982016,645185535,US 645185536,645185791,CA -645185792,645188095,US -645188096,645188351,CA -645188352,645221631,US +645185792,645187071,US +645187072,645187583,CA +645187584,645221631,US 645221632,645222399,CA -645222400,645223423,US -645223424,645223679,CA -645223680,645225471,US +645222400,645225471,US 645225472,645225727,CA 645225728,645227519,US 645227520,645228287,CA -645228288,645229311,US -645229312,645229567,CA -645229568,645482495,US -645482496,645482751,CA -645482752,645525759,US -645525760,645526271,CA -645526272,645526783,US +645228288,645482511,US +645482512,645482519,CA +645482520,645526783,US 645526784,645527039,CA -645527040,645527551,US -645527552,645527807,CA -645527808,645528063,US -645528064,645529343,CA -645529344,645540351,US +645527040,645527807,US +645527808,645528319,CA +645528320,645540351,US 645540352,645540607,CA -645540608,645547007,US -645547008,645547263,CA -645547264,645576703,US +645540608,645576703,US 645576704,645576997,CA 645576998,645576998,US 645576999,645577215,CA @@ -5083,16 +5307,18 @@ 645645056,645646591,US 645646592,645646847,MX 645646848,645704447,US -645704448,645704703,MX -645704704,645705215,US +645704448,645704959,MX +645704960,645705215,US 645705216,645705471,MX 645705472,645737983,US 645737984,645738239,PR 645738240,645873663,US -645873664,645874175,CA -645874176,645875711,US -645875712,645876735,CA -645876736,645989450,US +645873664,645874431,CA +645874432,645875967,US +645875968,645876735,CA +645876736,645984255,US +645984256,645988351,CA +645988352,645989450,US 645989451,645989451,CA 645989452,654311423,US 654311424,654311679,CN @@ -5105,7 +5331,9 @@ 655360000,656408575,KR 656408576,658505727,PK 658505728,660602879,CN -660602880,661651455,HK +660602880,661487615,HK +661487616,661520383,SG +661520384,661651455,JP 661651456,662700031,KR 662700032,666894335,CN 666894336,671088639,ID @@ -5136,7 +5364,9 @@ 692207616,692240383,ZA 692240384,692256767,GH 692256768,692260863,SD -692260864,692261887,UG +692260864,692260865,UG +692260866,692260866,SD +692260867,692261887,UG 692261888,692273151,SD 692273152,692289535,EG 692289536,692305919,NG @@ -5147,10 +5377,14 @@ 692518912,692551679,ZA 692551680,692584447,NG 692584448,692600831,AO -692600832,692609023,EG +692600832,692608255,EG +692608256,692608767,AO +692608768,692609023,EG 692609024,692617215,ZM 692617216,692625407,ZA -692625408,692641791,KE +692625408,692626687,KE +692626688,692626943,AO +692626944,692641791,KE 692641792,692649983,GA 692649984,692658175,NG 692658176,692666367,ZA @@ -5233,7 +5467,7 @@ 692946944,692948991,EG 692948992,692951039,ZM 692951040,692953087,ZA -692953088,692955135,RW +692953088,692954111,RW 692955136,692957183,NG 692957184,692959231,DZ 692959232,692961279,GN @@ -5382,7 +5616,9 @@ 693567488,693575679,MW 693575680,693583871,KE 693583872,693592063,NG -693592064,693600255,MU +693592064,693594367,MU +693594368,693594623,KE +693594624,693600255,MU 693600256,693608447,MA 693608448,693616639,BW 693616640,693633023,ZA @@ -5465,8 +5701,8 @@ 700340224,700341247,GH 700341248,700342271,MW 700342272,700350463,NA -700350464,700351231,MU -700351232,700352511,UG +700350464,700351487,MU +700351488,700352511,UG 700352512,700358655,MU 700358656,700366847,MZ 700366848,700375039,UG @@ -5515,9 +5751,7 @@ 700776448,700841983,RW 700841984,700846079,MU 700846080,700850175,NA -700850176,700851455,MU -700851456,700851711,ZA -700851712,700854271,MU +700850176,700854271,MU 700854272,700855295,NA 700855296,700866559,MU 700866560,700866815,NG @@ -5561,9 +5795,7 @@ 701308928,701317119,AO 701317120,701325311,CM 701325312,701333503,EG -701333504,701338111,NA -701338112,701338367,ZM -701338368,701341695,NA +701333504,701341695,NA 701341696,701349887,NG 701349888,701358079,MA 701358080,701366271,SL @@ -5599,9 +5831,7 @@ 701495296,701496319,NG 701496320,701497343,GH 701497344,701513727,ZA -701513728,701523711,LY -701523712,701523967,CA -701523968,701530111,LY +701513728,701530111,LY 701530112,701546495,SN 701546496,701562879,ZA 701562880,701579263,KE @@ -5625,7 +5855,9 @@ 701890560,701923327,SN 701923328,701956095,MA 701956096,701992959,KE -701992960,701997055,SZ +701992960,701994495,SZ +701994496,701994751,ZA +701994752,701997055,SZ 701997056,702001151,GH 702001152,702005247,ZM 702005248,702009343,KE @@ -5635,7 +5867,9 @@ 702017536,702018559,EG 702018560,702019583,NG 702019584,702020607,RW -702020608,702021631,CD +702020608,702021119,CD +702021120,702021375,ZA +702021376,702021631,CD 702021632,702029823,ZM 702029824,702038015,BJ 702038016,702046207,ZM @@ -5804,134 +6038,23 @@ 702542848,702543871,ZA 702543872,702544895,BJ 702544896,702545919,ZA -702545920,702721791,TN -702721792,702722047,GP -702722048,702729215,TN -702729216,702729471,GP -702729472,703070207,TN +702545920,703070207,TN 703070208,703594495,EG -703594496,703595775,SD -703595776,703596031,ZA -703596032,703600383,SD -703600384,703600639,ZA -703600640,703601151,SD -703601152,703601407,ZA -703601408,703603455,SD -703603456,703603711,ZA -703603712,703604991,SD -703604992,703605247,ZA -703605248,703609087,SD -703609088,703609343,ZA -703609344,703613695,SD -703613696,703613951,ZA -703613952,703618559,SD -703618560,703619071,ZA -703619072,703619839,SD -703619840,703620095,ZA -703620096,703621887,SD -703621888,703622143,ZA -703622144,703622655,SD -703622656,703622911,ZA -703622912,703625215,SD -703625216,703625471,ZA -703625472,703627263,SD -703627264,703627519,ZA -703627520,703631871,SD -703631872,703632127,ZA -703632128,703633151,SD -703633152,703633407,ZA -703633408,703638271,SD -703638272,703638527,ZA -703638528,703639551,SD -703639552,703639807,ZA -703639808,703642367,SD -703642368,703642623,ZA -703642624,703643903,SD -703643904,703644415,ZA -703644416,703645439,SD -703645440,703645695,ZA -703645696,703646719,SD -703646720,703647231,ZA -703647232,703648767,SD -703648768,703649023,ZA -703649024,703649279,SD -703649280,703650047,ZA -703650048,703650815,SD -703650816,703651071,ZA -703651072,703665663,SD -703665664,703665919,ZA -703665920,703678463,SD -703678464,703678719,ZA -703678720,703682559,SD -703682560,703682815,ZA -703682816,703685119,SD -703685120,703685631,ZA -703685632,703685887,SD -703685888,703686143,ZA -703686144,703688447,SD -703688448,703688703,ZA -703688704,703689215,SD -703689216,703689471,ZA -703689472,703689727,SD -703689728,703689983,ZA -703689984,703690239,SD -703690240,703690751,ZA -703690752,703696127,SD -703696128,703696383,ZA -703696384,703696895,SD -703696896,703697151,ZA -703697152,703699199,SD -703699200,703699455,ZA -703699456,703702527,SD -703702528,703703039,ZA -703703040,703705599,SD -703705600,703705855,ZA -703705856,703706111,SD -703706112,703706367,ZA -703706368,703709695,SD -703709696,703709951,ZA -703709952,703710719,SD -703710720,703710975,ZA -703710976,703711487,SD -703711488,703711743,ZA -703711744,703713791,SD -703713792,703714047,ZA -703714048,703714303,SD -703714304,703714559,ZA -703714560,703724031,SD -703724032,703724287,ZA -703724288,703724543,SD -703724544,703724799,ZA -703724800,703725567,SD -703725568,703725589,ZA -703725590,703725590,KE -703725591,703726591,ZA -703726592,703727615,KE -703727616,703728383,TZ -703728384,703728639,ZA +703594496,703725567,SD +703725568,703727615,KE +703727616,703728639,TZ 703728640,703733759,LY -703733760,703734527,CM -703734528,703734783,ZA -703734784,703735807,CM +703733760,703735807,CI 703735808,703737855,ZA 703737856,703746047,NG 703746048,703747071,ZA 703747072,703748095,CD -703748096,703748351,ZA -703748352,703749119,GN +703748096,703749119,GN 703749120,703750143,NG -703750144,703750655,ZA -703750656,703750911,MG -703750912,703751167,ZA -703751168,703751679,MG -703751680,703751935,ZA -703751936,703752447,MG -703752448,703752703,ZA -703752704,703753215,MG -703753216,703753471,ZA -703753472,703754239,MG +703750144,703754239,MG 703754240,703755263,GH -703755264,703755899,ZA +703755264,703755519,YT +703755520,703755899,ZA 703755900,703755900,YT 703755901,703757311,ZA 703757312,703758335,RE @@ -5939,125 +6062,8 @@ 703759360,703760383,ZA 703760384,703761407,GH 703761408,703791103,ZA -703791104,703791359,CD -703791360,703791871,ZA -703791872,703792895,CD -703792896,703793151,ZA -703793152,703794175,CD -703794176,703794687,ZA -703794688,703795199,CD -703795200,703795455,ZA -703795456,703798527,CD -703798528,703799039,ZA -703799040,703799807,CD -703799808,703800063,ZA -703800064,703800575,CD -703800576,703800831,ZA -703800832,703801855,CD -703801856,703802111,ZA -703802112,703804159,CD -703804160,703804415,ZA -703804416,703806719,CD -703806720,703806975,ZA -703806976,703809023,CD -703809024,703809279,ZA -703809280,703810559,CD -703810560,703810815,ZA -703810816,703811839,CD -703811840,703812351,ZA -703812352,703813119,CD -703813120,703813375,ZA -703813376,703817471,CD -703817472,703817727,ZA -703817728,703817983,CD -703817984,703818239,ZA -703818240,703822335,CD -703822336,703822591,ZA -703822592,703825407,CD -703825408,703825663,ZA -703825664,703827967,CD -703827968,703828223,ZA -703828224,703831295,CD -703831296,703831551,ZA -703831552,703832319,CD -703832320,703832575,ZA -703832576,703838207,CD -703838208,703838463,ZA -703838464,703838719,CD -703838720,703838975,ZA -703838976,703839743,CD -703839744,703839999,ZA -703840000,703841279,CD -703841280,703841535,ZA -703841536,703842559,CD -703842560,703842815,ZA -703842816,703845375,CD -703845376,703845631,ZA -703845632,703846911,CD -703846912,703847167,ZA -703847168,703847423,CD -703847424,703847679,ZA -703847680,703849215,CD -703849216,703849471,ZA -703849472,703856639,CD -703856640,703856895,ZA -703856896,703857919,CM -703857920,703858431,ZA -703858432,703858943,CM -703858944,703859199,ZA -703859200,703864063,CM -703864064,703864319,ZA -703864320,703864575,CM -703864576,703865855,ZA -703865856,703866623,CM -703866624,703867135,ZA -703867136,703867391,CM -703867392,703867647,ZA -703867648,703869439,CM -703869440,703869951,ZA -703869952,703870975,CM -703870976,703871487,ZA -703871488,703871743,CM -703871744,703871999,ZA -703872000,703876607,CM -703876608,703876863,ZA -703876864,703884287,CM -703884288,703884799,ZA -703884800,703885055,CM -703885056,703885311,ZA -703885312,703886079,CM -703886080,703886335,ZA -703886336,703888639,CM -703888640,703888895,ZA -703888896,703889151,CM -703889152,703889407,ZA -703889408,703889663,CM -703889664,703890175,ZA -703890176,703891455,CM -703891456,703892223,ZA -703892224,703897343,CM -703897344,703897599,ZA -703897600,703901183,CM -703901184,703901695,ZA -703901696,703902975,CM -703902976,703903231,ZA -703903232,703903487,CM -703903488,703903743,ZA -703903744,703905535,CM -703905536,703905791,ZA -703905792,703912447,CM -703912448,703912703,ZA -703912704,703912959,CM -703912960,703913215,ZA -703913216,703913727,CM -703913728,703913983,ZA -703913984,703914239,CM -703914240,703914495,ZA -703914496,703914751,CM -703914752,703915519,ZA -703915520,703919359,CM -703919360,703919615,ZA -703919616,703922175,CM +703791104,703856639,CD +703856640,703922175,CM 703922176,704118783,ZA 704118784,704380927,MA 704380928,704643071,LY @@ -6102,7 +6108,9 @@ 711166464,711166591,HK 711166592,711169311,JP 711169312,711169327,IN -711169328,711196671,JP +711169328,711173119,JP +711173120,711173375,SG +711173376,711196671,JP 711196672,711458815,CN 711458816,711983103,IN 711983104,712507391,VN @@ -6126,38 +6134,723 @@ 717881344,720437247,CN 720437248,720502783,AU 720502784,721420287,CN -721420288,737479679,JP +721420288,736100351,JP +736100352,736101375,IN +736101376,736102399,HK +736102400,736103423,IN +736103424,736104447,CN +736104448,736105471,ID +736105472,736106495,TW +736106496,736107519,CN +736107520,736108543,HK +736108544,736109567,JP +736109568,736110591,LA +736110592,736111615,MM +736111616,736112639,CN +736112640,736113663,HK +736113664,736115711,CN +736115712,736116735,AU +736116736,736119807,CN +736119808,736120831,AU +736120832,736121855,CN +736121856,736122879,MM +736122880,736123903,MY +736123904,736124927,HK +736124928,736125951,IN +736125952,736126975,CN +736126976,736127999,KR +736128000,736131071,BD +736131072,736132095,NZ +736132096,736133119,LK +736133120,736136191,IN +736136192,736138239,CN +736138240,736139263,HK +736139264,736140287,SG +736140288,736141311,IN +736141312,736142335,CN +736142336,736143359,IN +736143360,736144383,ID +736144384,736145407,IN +736145408,736146431,CN +736146432,736147455,IN +736147456,736148479,CN +736148480,736149503,NZ +736149504,736150527,NC +736150528,736151551,HK +736151552,736156671,CN +736156672,736157695,IN +736157696,736158719,CN +736158720,736160767,HK +736160768,736161791,PK +736161792,736162815,CN +736162816,736163839,HK +736163840,736164351,TW +736164352,736164863,NZ +736164864,736166911,IN +736166912,736167935,SG +736167936,736168959,HK +736168960,736169983,AU +736169984,736173055,IN +736173056,736174079,HK +736174080,736175103,AU +736175104,736176127,MY +736176128,736177151,BN +736177152,736178175,HK +736178176,736179199,AU +736179200,736180223,IN +736180224,736181247,HK +736181248,736182271,AU +736182272,736183295,ID +736183296,736185343,IN +736185344,736186367,CN +736186368,736187391,IN +736187392,736188415,CN +736188416,736189439,JP +736189440,736190463,IN +736190464,736191487,PK +736191488,736193535,HK +736193536,736194559,MY +736194560,736195583,AU +736195584,736196607,IN +736196608,736198655,CN +736198656,736199679,AU +736199680,736200703,HK +736200704,736201727,BN +736201728,736202751,CN +736202752,736203775,AU +736203776,736204799,BD +736204800,736205823,SG +736205824,736206847,JP +736206848,736209919,IN +736209920,736210943,CN +736210944,736211967,AU +736211968,736214015,CN +736214016,736216063,IN +736216064,736217087,HK +736217088,736218111,NZ +736218112,736219135,BD +736219136,736220159,CN +736220160,736221183,IN +736221184,736229375,CN +736229376,736230399,IN +736230400,736231423,CN +736231424,736231935,AU +736232448,736233471,HK +736233472,736234495,NZ +736234496,736235519,KH +736235520,736237567,HK +736237568,736239615,IN +736239616,736263167,CN +736263168,736264191,HK +736264192,736286719,CN +736286720,736287743,NZ +736287744,736288767,MV +736288768,736289791,MY +736289792,736290815,HK +736290816,736291839,TW +736291840,736300031,CN +736300032,736301055,HK +736301056,736303103,IN +736303104,736304127,TW +736304128,736324607,CN +736324608,736325631,AU +736325632,736326655,HK +736326656,736328703,KR +736328704,736329727,AU +736329728,736331775,IN +736331776,736334847,CN +736334848,736335871,ID +736335872,736344063,CN +736344064,736345087,IN +736345088,736354303,CN +736354304,736355327,IN +736355328,736356351,SG +736356352,736357375,CN +736357376,736358399,HK +736358400,736359423,SG +736359424,736360447,IN +736360448,736380927,CN +736380928,736381951,IN +736381952,736382975,CN +736382976,736383999,TH +736384000,736385023,LA +736385024,736386047,HK +736386048,736388095,IN +736388096,736389119,CN +736389120,736390143,JP +736390144,736391167,LK +736391168,736392191,IN +736392192,736394239,CN +736394240,736395263,HK +736395264,736396287,MN +736396288,736398335,CN +736398336,736400383,IN +736400384,736402431,CN +736402432,736403455,PK +736403456,736404479,KR +736404480,736408575,IN +736624640,736886783,JP +736886784,737096703,CN +737148928,737149951,CN +737149952,737151999,IN +737152000,737154047,HK +737154048,737155071,MY +737155072,737156095,TW +737156096,737157119,HK +737157120,737158143,NZ +737158144,737159167,HK +737159168,737160191,AU +737160192,737161215,TW +737161216,737162239,CN +737162240,737163263,BD +737163264,737165311,CN +737165312,737166335,IN +737166336,737169407,CN +737169408,737170431,ID +737170432,737171455,CN +737171456,737172479,GU +737172480,737173503,HK +737173504,737174527,AU +737174528,737175551,BD +737175552,737177599,TW +737177600,737178623,IN +737178624,737179647,HK +737179648,737180671,AU +737180672,737184767,CN +737184768,737185791,VU +737185792,737186815,AU +737186816,737187839,ID +737187840,737188863,TW +737188864,737206271,CN +737206272,737208319,ID +737208320,737209343,AU +737209344,737220607,CN +737220608,737222655,IN +737222656,737223679,TW +737223680,737225727,IN +737225728,737226751,HK +737226752,737227775,CN +737227776,737228799,AU +737228800,737229823,TH +737229824,737232895,IN +737232896,737233919,HK +737233920,737239039,CN +737239040,737240063,MY +737240064,737241087,HK +737241088,737243135,KR +737243136,737244159,CN +737244160,737249279,IN +737249280,737250303,BT +737250304,737253375,IN +737253376,737255423,HK +737255424,737256447,TW +737256448,737257471,WS +737257472,737262591,CN +737262592,737263615,AU +737263616,737264639,IN +737264640,737265663,CN +737265664,737266687,AU +737266688,737267711,HK +737267712,737276927,CN +737276928,737277951,IN +737277952,737279999,CN +737280000,737281023,HK +737281024,737282047,SG +737282048,737289215,CN +737289216,737290239,IN +737290240,737291263,AU +737291264,737297407,CN +737297408,737298431,AU +737298432,737305599,CN +737305600,737306623,PK +737306624,737307647,IN +737307648,737308671,HK +737308672,737309695,KR +737309696,737312767,IN +737312768,737313791,HK +737313792,737315839,JP +737315840,737316863,HK +737316864,737324031,CN +737324032,737325055,HK +737325056,737326079,PK +737326080,737327103,CN +737327104,737328127,SG +737328128,737331199,CN +737331200,737332223,HK +737332224,737333247,CN +737333248,737335295,IN +737335296,737337343,CN +737337344,737339391,IN +737339392,737341439,HK +737341440,737342463,MN +737342464,737344511,IN +737344512,737345535,CN +737345536,737346559,AU +737346560,737350655,CN +737350656,737350911,AU +737350912,737351679,NZ +737351680,737352703,CN +737352704,737354751,HK +737354752,737355775,IN +737355776,737359871,HK +737359872,737361919,NZ +737361920,737364991,HK +737364992,737368063,IN +737368064,737369087,CN +737369088,737370111,HK +737370112,737371135,NP +737371136,737375231,HK +737375232,737376255,AU +737376256,737377279,HK +737377280,737378303,PH +737378304,737379327,CN +737380352,737381375,CN +737381376,737382399,ID +737382400,737384447,CN +737384448,737385471,ID +737385472,737386495,CN +737386496,737387519,MN +737387520,737388543,HK +737388544,737389567,CN +737389568,737390591,IN +737390592,737391615,HK +737391616,737392639,CN +737392640,737393663,ID +737393664,737394687,CN +737394688,737395711,HK +737395712,737396735,NZ +737396736,737397759,AU +737397760,737398783,BD +737398784,737399807,HK +737399808,737400831,IN +737400832,737401855,KR +737401856,737403903,HK +737403904,737405951,CN +737405952,737406975,AU +737406976,737407999,HK +737408000,737409023,CN +737409024,737410047,HK +737410048,737411071,TW +737411072,737476607,JP +737476608,737478655,IN +737478656,737479679,PK 737479680,737480703,IN -737480704,737490943,JP +737480704,737481727,SG +737481728,737482751,IN +737482752,737484799,AU +737484800,737485823,KH +737485824,737487871,AU +737487872,737488895,MM +737488896,737489151,AU +737489152,737489919,HK +737489920,737490943,NZ 737490944,737491967,FJ -737491968,737511423,JP +737491968,737492447,SG +737492448,737492479,MY +737492480,737492735,SG +737492736,737492991,HK +737492992,737497087,AU +737497088,737498111,NZ +737498112,737499135,NP +737499136,737500159,IN +737500160,737501183,NP +737501184,737502207,SG +737502208,737503231,IN +737503232,737505279,SG +737505280,737506303,AU +737506304,737507327,BD +737507328,737508351,AU +737508352,737509375,MY +737509376,737510399,PK +737510400,737511423,AU 737511424,737512447,IN -737512448,737514495,JP +737512448,737513471,BD +737513472,737514495,TH 737514496,737515519,IN -737515520,737516543,JP +737515520,737516543,AU 737516544,737517567,IN -737517568,737526783,JP +737517568,737517823,AU +737517824,737518079,NZ +737518080,737520639,AU +737520640,737521663,NZ +737521664,737522687,AU +737522688,737525759,ID +737525760,737526783,BD 737526784,737527295,US -737527296,737529855,JP +737527296,737527551,SG +737527552,737527807,ID +737527808,737528831,KH +737528832,737529855,PK 737529856,737530879,IN -737530880,737941503,JP +737530880,737531903,NC +737531904,737532927,KH +737532928,737533951,PK +737533952,737534975,AU +737534976,737535999,SG +737536000,737537023,BD +737537024,737538047,NP +737538048,737539071,NZ +737539072,737540095,BD +737540096,737541119,ID +737541120,737542143,SG +737542144,737574911,CN +737607680,737608703,HK +737608704,737610751,CN +737610752,737611775,ID +737611776,737612799,PH +737612800,737613823,ID +737613824,737614847,MO +737614848,737615871,IN +737615872,737617919,ID +737617920,737618943,IN +737618944,737620991,CN +737620992,737622015,IN +737622016,737623039,TH +737623040,737624063,GU +737624064,737625087,AU +737625088,737626111,CN +737626112,737627135,JP +737627136,737628159,CN +737628160,737629183,AU +737629184,737634303,CN +737634304,737635327,KR +737635328,737637375,CN +737637376,737638399,AU +737638400,737639423,PK +737639424,737640447,NZ +737640448,737641471,AU +737641472,737642495,HK +737642496,737645567,IN +737645568,737647615,CN +737647616,737649663,IN +737649664,737650687,HK +737650688,737651711,JP +737651712,737652735,NZ +737652736,737656831,CN +737656832,737657855,KR +737657856,737675263,CN +737675264,737676287,HK +737676288,737677311,PK +737677312,737678335,TW +737678336,737679359,CN +737679360,737680383,ID +737680384,737681407,CN +737681408,737683455,IN +737683456,737685503,JP +737685504,737686527,CN +737686528,737687551,AU +737687552,737688575,CN +737688576,737690623,HK +737690624,737692671,IN +737692672,737712127,CN +737712128,737713151,IN +737713152,737714175,FM +737714176,737715199,JP +737715200,737718271,HK +737718272,737727487,CN +737727488,737728511,AU +737728512,737729535,JP +737729536,737730559,IN +737730560,737731583,HK +737731584,737733631,CN +737733632,737735679,IN +737735680,737736703,CN +737736704,737737727,HK +737737728,737738751,IN +737738752,737741823,CN +737741824,737742847,SG +737742848,737744895,HK +737744896,737745919,CN +737745920,737746943,HK +737746944,737747967,TH +737747968,737748991,SG +737748992,737750015,AF +737750016,737751039,JP +737751040,737753087,IN +737753088,737757183,TH +737757184,737758207,NZ +737758208,737760255,HK +737760256,737761279,IN +737761280,737762303,HK +737762304,737763327,AU +737763328,737765375,HK +737765376,737768447,TH +737768448,737769471,AU +737769472,737770495,CN +737770496,737771519,HK +737771520,737771647,KR +737771648,737771775,JP +737771776,737771903,KR +737771904,737772159,JP +737772160,737772287,KR +737772288,737772415,JP +737772416,737772543,KR +737772544,737774591,CN +737774592,737775615,ID +737775616,737782783,CN +737782784,737783807,HK +737783808,737784831,PF +737784832,737787903,IN +737787904,737788927,CN +737788928,737790975,NZ +737790976,737791999,HK +737792000,737793023,ID +737793024,737794047,SG +737794048,737795071,IN +737795072,737796095,HK +737796096,737799167,IN +737799168,737800191,CN +737800192,737802239,JP +737802240,737803263,SG +737803264,737804287,HK +737804288,737805311,SG +737805312,737806335,CN +737806336,737807359,HK +737807360,737810431,CN +737810432,737811455,AU +737811456,737814527,CN +737814528,737815551,IN +737815552,737816575,TW +737816576,737817599,HK +737817600,737818623,AU +737818624,737821695,HK +737821696,737822719,AU +737822720,737823743,CN +737823744,737824767,IN +737824768,737825791,BD +737825792,737826815,PK +737826816,737827839,JP +737827840,737828863,AU +737828864,737835007,CN +737835008,737836031,IN +737836032,737837055,MN +737837056,737838079,CN +737838080,737839103,IN +737839104,737840127,AF +737840128,737841151,AU +737841152,737843199,CN +737843200,737844223,KR +737844224,737845247,IN +737845248,737846271,CN +737846272,737847295,IN +737847296,737850367,CN +737850368,737851391,IN +737851392,737853439,HK +737853440,737854463,SG +737854464,737855487,JP +737855488,737856511,CN +737856512,737857535,AU +737857536,737858559,IN +737858560,737861631,CN +737861632,737862655,PH +737862656,737863679,JP +737863680,737864703,AU +737864704,737865727,CN +737865728,737866751,LK +737866752,737867775,CN +737867776,737868799,AU +737868800,737870847,IN +737870848,737874431,CN +737874432,737874943,IN +737874944,737876991,HK +737876992,737878015,KR +737878016,737879039,HK +737879040,737880063,CN +737880064,737881087,AU +737881088,737882111,HK +737882112,737883135,JP +737883136,737884159,AU +737884160,737886207,TW +737886208,737887231,SG +737887232,737888255,KR +737888256,737889279,IN +737889280,737890303,HK +737890304,737894399,IN +737894400,737895423,ID +737895424,737896447,IN +737896448,737897471,HK +737897472,737898495,AU +737898496,737899519,MY +737899520,737900543,CN +737900544,737901567,KR +737901568,737902591,IN +737902592,737903615,BN +737903616,737904639,HK +737904640,737905663,MY +737905664,737906687,HK +737906688,737908735,IN +737908736,737909759,AU +737909760,737910783,MY +737910784,737911807,HK +737911808,737912831,AU +737912832,737915903,IN +737915904,737916927,TW +737916928,737917951,JP +737917952,737918975,IN +737918976,737919999,CN +737920000,737921023,HK +737921024,737922047,AU +737922048,737923071,KR +737923072,737924095,MY +737924096,737927167,IN +737927168,737929215,HK +737929216,737931263,CN +737931264,737932287,AU +737932288,737933311,CN +737933312,737934335,HK +737934336,737935359,TH +737935360,737936383,AU +737936384,737937407,IN +737937408,737938431,ID +737938432,737939455,LK +737939456,737940479,KH +737940480,737941503,AU 737941504,737944575,IN -737944576,737950719,JP +737944576,737945599,MY +737945600,737946623,HK +737946624,737947647,MY +737947648,737948671,CN +737948672,737949695,HK +737949696,737950719,CN 737950720,737951743,IN -737951744,737958911,JP -737958912,737959935,IN -737959936,737965055,JP +737951744,737953791,NZ +737953792,737954815,ID +737954816,737955839,AU +737955840,737956863,IN +737956864,737957887,HK +737957888,737959935,IN +737959936,737960959,AU +737960960,737961983,IN +737961984,737963007,ID +737963008,737965055,AU 737965056,737966079,IN -737966080,737967103,JP -737967104,737967359,AU -737967360,737991679,JP +737966080,737967103,TH +737967104,737969151,AU +737969152,737970175,HK +737970176,737971199,ID +737971200,737972223,IN +737972224,737973247,ID +737973248,737974271,HK +737974272,737975295,IN +737975296,737976319,ID +737976320,737981439,HK +737981440,737982463,IN +737982464,737983487,ID +737983488,737986559,IN +737986560,737987583,HK +737987584,737988607,IN +737988608,737989631,HK +737989632,737991679,MY 737991680,737992191,IN -737992192,737999320,JP -737999321,737999321,IN -737999322,738197503,JP +737992192,737992703,ID +737992704,737993727,CN +737993728,737994751,HK +737994752,737995775,MY +737995776,737996799,ID +737996800,737997823,IN +737997824,737998847,LA +737998848,737999871,IN +737999872,738000895,AU +738000896,738066431,JP +738066432,738069503,CN +738069504,738070527,PK +738070528,738071551,TW +738071552,738072575,NZ +738072576,738073599,CN +738073600,738075647,IN +738075648,738076671,CN +738076672,738077695,IN +738077696,738078719,CN +738078720,738079743,IN +738079744,738080767,CN +738080768,738081791,TL +738081792,738082815,WS +738082816,738083839,CN +738083840,738084863,ID +738084864,738085887,CN +738085888,738086911,MY +738086912,738087935,ID +738087936,738091007,CN +738091008,738092031,BD +738092032,738094079,CN +738094080,738095103,IN +738095104,738097151,CN +738097152,738098175,MY +738098176,738099199,ID +738099200,738100223,CN +738100224,738101247,TH +738101248,738107391,CN +738107392,738108415,IN +738108416,738109439,HK +738109440,738111487,CN +738111488,738112511,IN +738112512,738118655,CN +738118656,738119679,IN +738119680,738120703,CN +738120704,738121727,IN +738121728,738122751,HK +738122752,738128895,CN +738128896,738129919,KR +738129920,738135039,CN +738135040,738136063,TW +738136064,738137087,CN +738137088,738138111,BD +738138112,738139135,NZ +738139136,738140159,SG +738140160,738141183,AU +738141184,738142207,HK +738142208,738143231,JP +738143232,738144255,AU +738144256,738145279,CN +738145280,738146303,HK +738146304,738147327,IN +738147328,738152447,CN +738152448,738153471,HK +738153472,738154495,CN +738154496,738156543,TW +738156544,738157567,CN +738157568,738158591,SG +738158592,738159615,HK +738159616,738160639,CN +738160640,738161663,KH +738161664,738163711,HK +738163712,738164735,SG +738164736,738165759,AU +738165760,738166783,IN +738166784,738167807,AU +738167808,738168831,IN +738168832,738169855,CN +738169856,738170879,TO +738170880,738171903,SG +738171904,738172927,HK +738172928,738173951,NZ +738173952,738174975,IN +738174976,738175999,CN +738176000,738177023,MY +738177024,738178047,CN +738178048,738179071,TW +738179072,738180095,CN +738180096,738181119,HK +738181120,738182143,CN +738182144,738183167,ID +738183168,738187263,CN +738187264,738188287,PH +738188288,738189311,IN +738189312,738192383,CN +738192384,738193407,NC +738193408,738194431,TH +738194432,738195455,CN +738195456,738197503,KR 738197504,746717183,US 746717184,746782719,DE -746782720,755105791,US +746782720,747175935,US +747175936,747241471,NL +747241472,757071871,US +758972416,758976511,CA +758976512,758980607,US +758984704,758988799,CA +758988800,759021567,US +759103488,759136255,US 759169024,759171071,ID 759171072,759174143,IN 759174144,759175167,MO @@ -6177,7 +6870,9 @@ 759188480,759189503,TH 759189504,759190527,PH 759190528,759193599,IN -759193600,759195647,ID +759193600,759193855,ID +759193856,759194111,SG +759194112,759195647,ID 759195648,759196671,IN 759196672,759197695,HK 759197696,759198207,CN @@ -6210,7 +6905,8 @@ 759235584,759236607,NZ 759236608,759237631,IN 759237632,759238655,AU -765460480,767557631,UY +761266176,761790463,EG +767557632,768606207,SC 771751936,771817471,RU 771817472,771948543,TR 771948544,772014079,RU @@ -6232,7 +6928,9 @@ 772538368,772603903,GR 772603904,772669439,CZ 772669440,772734975,CH -772734976,772800511,NO +772734976,772753663,NO +772753664,772753919,RU +772753920,772800511,NO 772800512,772802559,GB 772802560,772804607,RU 772804608,772806655,GL @@ -6262,9 +6960,7 @@ 772848192,772848223,US 772848224,772848871,NL 772848872,772848879,US -772848880,772849231,NL -772849232,772849247,MY -772849248,772849255,NL +772848880,772849255,NL 772849256,772849263,US 772849264,772849271,NL 772849272,772849279,US @@ -6303,16 +6999,11 @@ 772917248,772919295,RU 772919296,772923391,GB 772923392,772925439,AT -772925440,772926463,GB -772926464,772926719,ZW -772926720,772927231,GB -772927232,772927487,ZW +772925440,772927487,GB 772927488,772929535,UA 772929536,772931583,RU 772931584,772933631,UA -772933632,772933887,GB -772933888,772934143,IE -772934144,772935679,GB +772933632,772935679,GB 772935680,772937727,PS 772937728,772939775,IT 772939776,772941823,BE @@ -6368,8 +7059,8 @@ 773050368,773052415,IE 773052416,773054463,NL 773054464,773055231,AL -773055232,773055359,XK -773055360,773055871,AL +773055232,773055487,XK +773055488,773055871,AL 773055872,773055999,RS 773056000,773056255,XK 773056256,773056511,AL @@ -6400,9 +7091,7 @@ 773140480,773144575,CY 773144576,773148671,RU 773148672,773152767,IR -773152768,773153791,SE -773153792,773154815,US -773154816,773156863,SE +773152768,773156863,SE 773156864,773165055,FR 773165056,773166463,NL 773166464,773166591,PL @@ -6410,7 +7099,9 @@ 773167200,773167207,NL 773167208,773167359,US 773167360,773167615,NL -773167616,773168127,US +773167616,773167655,US +773167656,773167663,NL +773167664,773168127,US 773168128,773168415,NL 773168416,773168639,US 773168640,773168895,NL @@ -6494,8 +7185,7 @@ 773646336,773648383,TR 773648384,773650431,PL 773650432,773652479,GB -773652480,773652735,TR -773652736,773653503,SK +773652480,773653503,SK 773653504,773654527,TR 773654528,773656575,RU 773656576,773658623,PL @@ -6580,13 +7270,11 @@ 773828608,773830655,HU 773830656,773832703,NO 773832704,773834751,FR -773834752,773835007,GB -773835008,773835263,IM -773835264,773835519,GB +773834752,773835519,GB 773835520,773835775,IM 773835776,773836031,GB -773836032,773836287,IM -773836288,773836799,GB +773836032,773836543,IM +773836544,773836799,GB 773836800,773838847,FR 773838848,773840895,DE 773840896,773842943,GB @@ -6606,7 +7294,11 @@ 773906432,773922815,GB 773922816,773931007,UA 773931008,773934591,DE -773934592,773939199,FR +773934592,773935352,FR +773935353,773935353,US +773935354,773938231,FR +773938232,773938239,GB +773938240,773939199,FR 773939200,773947391,CZ 773947392,773955583,GB 773955584,773963775,FR @@ -6636,13 +7328,7 @@ 774078464,774086655,BA 774086656,774094847,BG 774094848,774103039,HU -774103040,774104831,RU -774104832,774105087,UA -774105088,774105343,RU -774105344,774105599,UA -774105600,774109695,RU -774109696,774109951,UA -774109952,774119423,RU +774103040,774119423,RU 774119424,774127615,CZ 774127616,774135807,LT 774135808,774143999,IR @@ -6752,7 +7438,8 @@ 774161569,774161578,LC 774161579,774161588,VE 774161589,774161598,TC -774161599,774161628,US +774161599,774161618,US +774161619,774161628,VA 774161629,774161638,PA 774161639,774161648,RU 774161649,774161658,HK @@ -6845,9 +7532,7 @@ 774162563,774162572,MQ 774162573,774162582,YT 774162583,774162592,NC -774162593,774162593,NG -774162594,774162601,CA -774162602,774162602,NG +774162593,774162602,CA 774162603,774162622,US 774162623,774162627,MX 774162628,774162637,GB @@ -6868,7 +7553,8 @@ 774162704,774162738,US 774162739,774162743,VA 774162744,774162778,US -774162779,774162787,CA +774162779,774162784,CA +774162785,774162787,UA 774162788,774162788,VA 774162789,774162798,CA 774162799,774162803,BN @@ -7052,40 +7738,54 @@ 778043392,778108927,UA 778108928,778174463,RO 778174464,778239999,UA -778240000,778244095,AL -778244096,778244351,RS +778240000,778242815,AL +778242816,778243071,XK +778243072,778243327,RS +778243328,778244095,AL +778244096,778244351,XK 778244352,778245119,AL -778245120,778245375,RS -778245376,778247679,AL -778247680,778247935,XK -778247936,778248191,RS -778248192,778249727,AL +778245120,778245375,XK +778245376,778249727,AL 778249728,778249983,RS 778249984,778304305,AL 778304306,778304306,SI 778304307,778305535,AL 778305536,778371071,IR -778371072,778436607,RU -778436608,778476031,RO +778371072,778403839,GB +778403840,778436607,DE +778436608,778469375,RO +778469376,778473471,IR +778473472,778476031,RO 778476032,778476287,MD -778476288,778493951,RO +778476288,778485759,RO +778485760,778493951,GB 778493952,778495999,NL -778496000,778498047,RO -778498048,778500095,NL -778500096,778502143,RO +778496000,778497791,RO +778497792,778500095,NL +778500096,778500863,RO +778500864,778501119,SG +778501120,778502143,RO 778502144,778567679,GR 778567680,778633215,TR -778633216,778666259,FR +778633216,778640127,FR +778640128,778640383,GB +778640384,778666259,FR 778666260,778666263,ES 778666264,778666479,FR 778666480,778666495,DE 778666496,778666879,FR 778666880,778666943,GB -778666944,778667391,FR +778666944,778667327,FR +778667328,778667331,DE +778667332,778667391,FR 778667392,778667395,IT -778667396,778668863,FR +778667396,778668623,FR +778668624,778668627,NL +778668628,778668863,FR 778668864,778668895,DE -778668896,778670975,FR +778668896,778669935,FR +778669936,778669951,ES +778669952,778670975,FR 778670976,778670976,DE 778670977,778671201,FR 778671202,778671202,ES @@ -7095,7 +7795,9 @@ 778673208,778673211,ES 778673212,778673383,FR 778673384,778673387,IT -778673388,778673883,FR +778673388,778673751,FR +778673752,778673759,DE +778673760,778673883,FR 778673884,778673887,ES 778673888,778675763,FR 778675764,778675767,PL @@ -7108,10 +7810,11 @@ 778677076,778677471,FR 778677472,778677475,DE 778677476,778677503,FR -778677504,778677507,GB -778677508,778677519,FR -778677520,778677523,ES -778677524,778679212,FR +778677504,778677505,GB +778677506,778677506,ES +778677507,778677507,GB +778677508,778677759,ES +778677760,778679212,FR 778679213,778679214,FI 778679215,778679491,FR 778679492,778679495,ES @@ -7127,15 +7830,21 @@ 778681520,778681523,ES 778681524,778681823,FR 778681824,778681827,IT -778681828,778691619,FR +778681828,778682103,FR +778682104,778682111,DE +778682112,778691619,FR 778691620,778691623,IT 778691624,778691711,FR 778691712,778691727,GB 778691728,778692499,FR 778692500,778692503,ES -778692504,778692535,FR +778692504,778692519,FR +778692520,778692527,NL +778692528,778692535,FR 778692536,778692539,IT -778692540,778692743,FR +778692540,778692619,FR +778692620,778692623,ES +778692624,778692743,FR 778692744,778692747,ES 778692748,778693095,FR 778693096,778693099,ES @@ -7147,7 +7856,11 @@ 778695472,778695475,ES 778695476,778695487,FR 778695488,778695503,BE -778695504,778696495,FR +778695504,778695839,FR +778695840,778695871,DE +778695872,778696439,FR +778696440,778696447,IT +778696448,778696495,FR 778696496,778696499,ES 778696500,778696991,FR 778696992,778696995,ES @@ -7298,8 +8011,12 @@ 782667776,782671871,NL 782671872,782672871,LT 782672872,782672879,IL -782672880,782675967,LT -782675968,782680063,NL +782672880,782672927,LT +782672928,782672959,US +782672960,782675967,LT +782675968,782676735,NL +782676736,782676991,DE +782676992,782680063,NL 782680064,782696447,RU 782696448,782712831,DE 782712832,782729215,RU @@ -7424,7 +8141,9 @@ 783775744,783777791,AL 783777792,783779839,RU 783779840,783781887,DK -783781888,783783935,NL +783781888,783782655,NL +783782656,783782911,RU +783782912,783783935,NL 783783936,783785983,DE 783785984,783788031,RU 783788032,783790079,NO @@ -7445,7 +8164,15 @@ 784039936,784072703,PL 784072704,784105471,RU 784105472,784138239,HR -784138240,784169215,DE +784138240,784155495,DE +784155496,784155503,AT +784155504,784155511,GB +784155512,784155519,CZ +784155520,784155623,DE +784155624,784155631,AT +784155632,784155639,GB +784155640,784155640,CZ +784155641,784169215,DE 784169216,784169231,AL 784169232,784169247,BG 784169248,784169263,CZ @@ -7456,13 +8183,11 @@ 784169472,784171007,DE 784171008,784203775,PT 784203776,784236543,GR -784236544,784269311,RO +784236544,784269311,GB 784269312,784302079,BY 784302080,784334847,RU 784334848,784465919,FR -784465920,784524287,SE -784524288,784524543,PL -784524544,784596991,SE +784465920,784596991,SE 784596992,784728063,TR 784728064,784793599,GR 784793600,784859135,CY @@ -7592,25 +8317,25 @@ 786915328,786917375,SK 786917376,786919423,RO 786919424,786919431,IT -786919432,786919639,GB +786919432,786919535,GB +786919536,786919543,IT +786919544,786919639,GB 786919640,786919647,IT 786919648,786919799,GB 786919800,786919807,IT 786919808,786919879,GB 786919880,786919887,IT -786919888,786919967,GB -786919968,786919975,IT -786919976,786920191,GB +786919888,786920191,GB 786920192,786920199,IT 786920200,786920343,GB 786920344,786920351,IT -786920352,786920631,GB -786920632,786920639,IT -786920640,786920839,GB +786920352,786920839,GB 786920840,786920847,IT 786920848,786920855,GB 786920856,786920863,IT -786920864,786921303,GB +786920864,786921287,GB +786921288,786921295,IT +786921296,786921303,GB 786921304,786921311,IT 786921312,786921455,GB 786921456,786921463,IT @@ -7654,16 +8379,20 @@ 787038976,787039231,FR 787039232,787039247,AR 787039248,787039263,PE -787039264,787054591,GB +787039264,787039279,VE +787039280,787054591,GB 787054592,787070975,IT 787070976,787087359,RU 787087360,787095551,TR 787095680,787095711,CH 787096576,787097855,CH +787098112,787098623,CH 787099392,787100671,CH 787101696,787102719,CH 787103744,787111935,HR -787111936,787120127,CZ +787111936,787116287,CZ +787116288,787116543,US +787116544,787120127,CZ 787120128,787128319,ES 787128320,787136511,CZ 787136512,787152895,IT @@ -7713,28 +8442,15 @@ 787333120,787349503,DE 787349504,787365887,BG 787365888,787382271,PL -787382272,787387647,GP -787387648,787388671,MQ -787388672,787388927,GP -787388928,787390207,MQ -787390208,787390463,GP -787390464,787391231,FR -787391232,787391487,MQ -787391488,787391743,FR -787391744,787392255,MQ -787392256,787392511,FR -787392512,787392767,GP -787392768,787393791,FR -787393792,787394303,GP -787394304,787394559,FR +787382272,787383039,GP +787383040,787383295,MF +787383296,787389951,GP +787389952,787390207,MQ +787390208,787394559,GP 787394560,787394815,GF -787394816,787395071,FR -787395072,787395327,GF -787395328,787395583,FR -787395584,787396095,GF -787396096,787396351,FR -787396352,787396607,GF -787396608,787398399,FR +787394816,787396095,GP +787396096,787396351,GF +787396352,787398399,GP 787398400,787398655,MQ 787398656,787415039,PL 787415040,787431423,BA @@ -7761,11 +8477,28 @@ 787703808,787705855,AT 787705856,787707903,RO 787707904,787709951,DE -787709952,787718143,NL -787718144,787724287,RU -787724288,787726335,UA -787726336,787742719,RU -787742720,787759103,NL +787709952,787711487,IE +787711488,787711999,GB +787712000,787712255,MT +787712256,787712511,MA +787712512,787712767,DE +787712768,787713023,IT +787713024,787713279,LV +787713280,787713535,SE +787713536,787713791,BG +787713792,787714047,GR +787714048,787714303,IM +787714304,787714559,SY +787714560,787714815,LB +787714816,787715071,QA +787715072,787715327,OM +787715328,787715583,YE +787715584,787715839,BH +787715840,787718143,NL +787718144,787742719,RU +787742720,787750911,NL +787750912,787755007,GB +787755008,787759103,NL 787759104,787767295,PS 787767296,787775487,NL 787775488,787808255,DE @@ -7786,7 +8519,9 @@ 787869696,787873791,GB 787873792,787881745,SE 787881746,787881747,FR -787881748,787891247,SE +787881748,787883391,SE +787883392,787883519,GB +787883520,787891247,SE 787891248,787891251,ES 787891252,787906559,SE 787906560,787939327,GR @@ -7802,9 +8537,9 @@ 788070400,788078591,RU 788078592,788086783,NL 788086784,788094975,BG -788094976,788100095,IR -788100096,788101119,BG -788101120,788103167,IR +788094976,788095231,IR +788095232,788095487,DE +788095488,788103167,IR 788103168,788111359,HU 788111360,788119551,LT 788119552,788127743,GB @@ -7908,12 +8643,9 @@ 788502528,788504575,IE 788504576,788506623,FR 788506624,788508671,CH -788508672,788508927,AT -788508928,788509183,FR -788509184,788509439,AT -788509440,788509951,FR -788509952,788510463,AT -788510464,788510719,FR +788508672,788509439,AT +788509440,788510207,FR +788510208,788510719,AT 788510720,788512767,ES 788512768,788514815,FI 788514816,788516863,FR @@ -7927,9 +8659,9 @@ 789577728,790102015,US 790102016,792002559,CA 792002560,792068095,US -792068096,792096767,CA -792096768,792097279,US -792097280,792330239,CA +792068096,792095999,CA +792096000,792096255,US +792096256,792330239,CA 792330240,792723455,ES 792723456,793247743,DE 793247744,793313279,NZ @@ -8015,9 +8747,10 @@ 831519744,831520767,IN 831520768,832045055,PH 832045056,832307199,CN -832307200,832308223,MN +832307456,832307711,MN 832308224,832311295,JP -832311296,832315391,AU +832311296,832312319,AU +832313344,832315391,AU 832315392,832319487,KH 832319488,832320511,NU 832320512,832321535,VN @@ -8067,8 +8800,8 @@ 838467584,838729727,JP 838729728,838795263,KR 838795264,838860799,AU -838860800,838995455,US -838995456,838995967,CA +838860800,838995711,US +838995712,838995967,CA 838995968,838996991,US 838996992,838997247,CA 838997248,839016191,US @@ -8089,9 +8822,16 @@ 839104256,839104511,CA 839104512,839112191,US 839112192,839112703,CA -839112704,839352319,US -839352320,839356415,NL -839356416,839357439,US +839112704,839348223,US +839348224,839348479,DE +839348480,839348735,AT +839348736,839348991,GB +839348992,839349247,AT +839349248,839350271,DE +839350272,839351807,US +839351808,839352063,DE +839352064,839352319,US +839352320,839357439,NL 839357440,839358463,FR 839358464,839359487,GB 839359488,839360511,DE @@ -8110,7 +8850,9 @@ 840838509,840838509,UA 840838510,840838510,US 840838511,840838512,UA -840838513,840898047,US +840838513,840865791,US +840865792,840866047,CA +840866048,840898047,US 840898048,840898559,CA 840898560,840909055,US 840909056,840909311,CA @@ -8118,32 +8860,53 @@ 840953856,840954367,JP 840954368,840956927,US 840956928,840957951,JP -840957952,843055103,US +840957952,842019071,US +842019072,842019199,AS +842019200,843055103,US 843055104,843644927,CA 843644928,844890111,US 844890112,844988415,CA -844988416,845283327,US +844988416,845089407,US +845089408,845089535,PR +845089536,845283327,US 845283328,845545471,CA 845545472,846442495,US 846442496,846446591,CA -846446592,846537351,US -846537352,846537352,CA -846537353,846561279,US +846446592,846561279,US 846561280,846594047,CA 846594048,846626815,US 846626816,846627071,CN -846627072,855638015,US +846627072,850506751,US +850506752,850507007,CA +850507008,855638015,US 855638016,872415231,GB 872415232,889192447,US 889192448,905969663,DE -905969664,910688255,US +905969664,910163967,US +910163968,910197237,JP +910197238,910197238,US +910197239,910295039,JP +910295040,910360575,AU +910360576,910688255,US 910688256,911147007,IE 911147008,911212543,AU 911212544,911998975,US 911998976,912031743,JP -912031744,912195583,US +912031744,912064511,US +912064512,912130047,DE +912130048,912195583,BR 912195584,912261119,JP -912261120,917635071,US +912261120,915800063,US +915800064,915865599,JP +915865600,915898367,US +915898368,915931135,SG +915931136,916062207,US +916062208,916193279,IE +916193280,916979711,US +916979712,917045247,JP +917045248,917110783,SG +917110784,917241855,IE +917241856,917635071,US 917635072,917700607,JP 917700608,917766143,SG 917766144,918683647,US @@ -8172,30 +8935,36 @@ 922205776,922205776,DE 922205777,922222591,IE 922222592,922419199,JP -922419200,922484735,SG +922419200,922427633,SG +922427634,922427634,US +922427635,922427703,SG +922427704,922427704,US +922427705,922484735,SG 922484736,922615807,AU 922615808,922746879,SG 922746880,956301311,US -956301312,959447039,FR +956301312,959447039,BE 959447040,959512575,US -959512576,960626687,FR +959512576,960626687,BE 960626688,960641023,GB -960641024,960641279,FR +960641024,960641279,BE 960641280,960643330,GB -960643331,960643331,FR +960643331,960643331,BE 960643332,960644351,GB -960644352,960644863,FR +960644352,960644863,BE 960644864,960646399,GB -960646400,960646911,FR +960646400,960646911,BE 960646912,960654335,GB -960654336,960654591,FR +960654336,960654374,BE +960654375,960654375,GB +960654376,960654591,BE 960654592,960659455,GB 960659456,960662015,DE -960662016,960662271,FR +960662016,960662271,BE 960662272,960662783,DE 960662784,960663039,FR 960663040,960671487,DE -960671488,960671743,FR +960671488,960671743,BE 960671744,960676607,DE 960676608,960676863,PL 960676864,960692223,DE @@ -8204,18 +8973,12 @@ 960726784,960727039,ZA 960727040,960727295,US 960727296,960728319,NL -960728320,960728575,FR +960728320,960728575,BE 960728576,960729343,NL 960729344,960729599,ZA -960729600,960729855,FR +960729600,960729855,BE 960729856,960733183,NL -960733184,960733439,BE -960733440,960733695,FR -960733696,960733951,BE -960733952,960734463,FR -960734464,960737535,BE -960737536,960737791,FR -960737792,960741375,BE +960733184,960741375,BE 960741376,960749567,NL 960749568,960757759,LU 960757760,960888831,US @@ -8234,36 +8997,38 @@ 960970752,960974847,TV 960974848,960978943,VU 960978944,960983039,NC -960983040,961019903,FR +960983040,961019903,BE 961019904,961021439,HK -961021440,961021695,FR +961021440,961021695,BE 961021696,961021951,HK -961021952,961022079,FR +961021952,961022079,BE 961022080,961022095,SG -961022096,961022207,FR +961022096,961022207,BE 961022208,961022719,HK -961022720,961022975,FR +961022720,961022975,BE 961022976,961025535,HK -961025536,961025791,FR +961025536,961025791,BE 961025792,961036799,HK -961036800,961037055,FR +961036800,961037055,BE 961037056,961052671,HK 961052672,961085439,JP 961085440,961087231,SG -961087232,961087487,FR +961087232,961087487,BE 961087488,961089023,SG -961089024,961089535,FR +961089024,961089535,BE 961089536,961090047,SG -961090048,961090303,FR +961090048,961090303,BE 961090304,961091839,SG -961091840,961092095,FR +961091840,961092095,BE 961092096,961092351,IN -961092352,961092607,FR +961092352,961092607,BE 961092608,961093887,SG -961093888,961094143,FR +961093888,961094143,BE 961094144,961118207,SG 961118208,961119487,MY -961119488,961119743,FR +961119488,961119508,BE +961119509,961119509,MY +961119510,961119743,BE 961119744,961126399,MY 961126400,961134591,TW 961134592,961142783,KR @@ -8277,7 +9042,7 @@ 961224704,961228799,EC 961228800,961232895,BO 961232896,961236991,PY -961236992,961241087,FR +961236992,961241087,BE 961241088,961245183,GF 961245184,961247231,GY 961247232,961249279,SR @@ -8288,7 +9053,7 @@ 961265664,961269759,SV 961269760,961273855,PA 961273856,961277951,CR -961277952,961282047,FR +961277952,961282047,BE 961282048,961314815,MX 961314816,961380351,US 961380352,961413119,CA @@ -8316,36 +9081,36 @@ 961716224,961720319,CF 961720320,961724415,TD 961724416,961740799,ZA -961740800,961806335,FR +961740800,961806335,BE 961806336,961810431,MR -961810432,961826815,FR +961810432,961826815,BE 961826816,961830911,NE -961830912,961892351,FR +961830912,961892351,BE 961892352,961896447,ZW 961896448,961900543,NG -961900544,961937407,FR +961900544,961937407,BE 961937408,961945599,IS 961945600,961950463,FI -961950464,961950719,FR +961950464,961950719,BE 961950720,961953791,FI 961953792,961961983,DK 961961984,961970175,NO -961970176,962002943,FR +961970176,962002943,BE 962002944,962035711,RU 962035712,962039807,EE 962039808,962043903,LV 962043904,962047999,LT -962048000,962076671,FR +962048000,962076671,BE 962076672,962080767,BH -962080768,962084863,FR +962080768,962084863,BE 962084864,962088959,GE -962088960,962097151,FR +962088960,962097151,BE 962097152,962101247,IL -962101248,962134015,FR +962101248,962134015,BE 962134016,962138111,AE -962138112,962203647,FR +962138112,962203647,BE 962203648,962207999,AT -962208000,962208255,FR +962208000,962208255,BE 962208256,962211839,AT 962211840,962215935,BG 962215936,962217983,HR @@ -8353,53 +9118,55 @@ 962220032,962224127,CZ 962224128,962228223,GR 962228224,962232319,HU -962232320,962244607,FR +962232320,962244607,BE 962244608,962248703,RO -962248704,962252799,FR +962248704,962252799,BE 962252800,962256895,SK 962256896,962260991,SI 962260992,962265087,TR -962265088,962281471,FR +962265088,962281471,BE 962281472,962285567,DO -962285568,962359295,FR +962285568,962359295,BE 962359296,962363391,IN -962363392,962392063,FR +962363392,962392063,BE 962392064,962396159,PK -962396160,962408447,FR +962396160,962408447,BE 962408448,962412543,TH 962412544,962416639,UZ -962416640,962461695,FR +962416640,962461695,BE 962461696,962469887,IE 962469888,962527231,TR -962527232,962592767,FR +962527232,962592767,BE 962592768,962594815,IN -962594816,962596863,FR +962594816,962596863,BE 962596864,962598911,SG -962598912,962600959,FR +962598912,962600959,BE 962600960,962609151,HK 962609152,962613247,JP -962613248,962617343,FR +962613248,962617343,BE 962617344,962621439,AU -962621440,962674687,FR +962621440,962674687,BE 962674688,962676735,BR -962676736,962680831,FR +962676736,962680831,BE 962680832,962689023,US -962689024,962723839,FR +962689024,962723839,BE 962723840,962732031,GB 962732032,962740223,DE 962740224,962744319,SE -962744320,962748415,FR +962744320,962748415,BE 962748416,962752511,BH 962752512,962756607,ZA -962756608,968818687,FR +962756608,968818687,BE 968818688,968819711,DE -968819712,968851455,FR +968819712,968851455,BE 968851456,968852479,US -968852480,972744447,FR +968852480,972743935,BE +972743936,972744191,GB +972744192,972744447,BE 972744448,972744703,IN -972744704,972747263,FR +972744704,972747263,BE 972747264,972747519,US -972747520,973078527,FR +972747520,973078527,BE 973078528,973209599,JP 973209600,973275135,IN 973275136,973471743,JP @@ -8433,7 +9200,7 @@ 978321408,978452479,JP 978452480,978485247,CN 978485248,978501631,TH -978501632,978518015,SG +978501632,978518015,HK 978518016,978583551,CN 978599936,978640895,AU 978640896,978644991,NZ @@ -8447,9 +9214,7 @@ 979369984,979410943,AU 979410944,979419135,HK 979419136,979435519,AU -979435520,979436799,TH -979436800,979437055,OM -979437056,979468287,TH +979435520,979468287,TH 979468288,979501055,BD 979501056,979566591,JP 979566592,979599359,TW @@ -8530,11 +9295,7 @@ 999817216,999821311,BD 999839744,999845887,BD 999849984,999866367,KR -999866368,999873919,HK -999873920,999873941,VN -999873942,999873943,HK -999873944,999874047,VN -999874048,999882751,HK +999866368,999882751,HK 999948288,1000013823,AU 1000013824,1000079359,CN 1000079360,1000341503,JP @@ -8551,7 +9312,9 @@ 1002373120,1002405887,CN 1002405888,1002422271,JP 1002422272,1002434559,AU -1002434560,1008730111,CN +1002434560,1002438399,CN +1002438400,1002438655,HK +1002438656,1008730111,CN 1008730112,1009778687,JP 1009778688,1010237439,MY 1010237440,1010302975,CN @@ -8581,11 +9344,11 @@ 1023238144,1023246335,ID 1023246336,1023279103,CN 1023279104,1023311871,IN -1023311872,1023315711,US -1023315712,1023315967,AU -1023315968,1023316991,US +1023311872,1023316991,US 1023316992,1023317247,AU -1023317248,1023328255,US +1023317248,1023317759,US +1023317760,1023318015,IN +1023318016,1023328255,US 1023328256,1023344639,JP 1023344640,1023410175,CN 1023410176,1023672319,IN @@ -8608,7 +9371,9 @@ 1023901696,1023934463,TH 1023934464,1023942719,AU 1023942720,1023942751,MY -1023942752,1023950847,AU +1023942752,1023946879,AU +1023946880,1023946911,SG +1023946912,1023950847,AU 1023950848,1023954943,ID 1023954944,1023959039,JP 1023959040,1023967231,AU @@ -8633,15 +9398,13 @@ 1024361168,1024361183,HK 1024361184,1024362911,JP 1024362912,1024362943,SG -1024362944,1024363263,JP -1024363264,1024363519,SG -1024363520,1024363775,JP -1024363776,1024364031,AU +1024362944,1024363519,JP +1024363520,1024364031,AU 1024364032,1024364063,JP 1024364064,1024364079,AU -1024364080,1024365727,JP -1024365728,1024365759,SG -1024365760,1024368639,JP +1024364080,1024365567,JP +1024365568,1024365823,SG +1024365824,1024368639,JP 1024368640,1024369407,MY 1024369408,1024371199,JP 1024371200,1024371455,PH @@ -8717,12 +9480,10 @@ 1029636096,1029668863,AU 1029668864,1029701631,IN 1029701632,1030674431,KR -1030674432,1030676223,JP -1030676224,1030750207,KR +1030674432,1030676479,JP +1030676480,1030750207,KR 1030750208,1031798783,JP -1031798784,1032668159,CN -1032668160,1032668415,HK -1032668416,1035993087,CN +1031798784,1035993087,CN 1035993088,1037565951,JP 1037565952,1038614527,TW 1038614528,1039007743,CN @@ -8756,6 +9517,7 @@ 1040449536,1040457727,FR 1040457728,1040465919,ME 1040467072,1040467087,FR +1040473344,1040473599,DE 1040474112,1040482303,CZ 1040482304,1040515071,BE 1040515072,1040547839,GB @@ -8787,119 +9549,19 @@ 1041268736,1041301503,NO 1041301504,1041310975,IE 1041310976,1041311231,GB -1041311232,1041367039,IE +1041311232,1041335295,IE +1041335296,1041335551,GB +1041335552,1041338879,IE +1041338880,1041339135,GB +1041339136,1041367039,IE 1041367040,1041498111,IT 1041498112,1041563647,SE 1041563648,1041596415,PL 1041596416,1041629183,NL 1041629184,1041694719,ES -1041694720,1041700959,GB -1041700960,1041700975,FR -1041700976,1041701783,GB -1041701784,1041701791,FR -1041701792,1041701823,GB -1041701824,1041701831,FR -1041701832,1041703479,GB -1041703480,1041703487,FR -1041703488,1041703631,GB -1041703632,1041703639,FR -1041703640,1041704415,GB -1041704416,1041704423,FR -1041704424,1041706551,GB -1041706552,1041706559,FR -1041706560,1041706751,GB -1041706752,1041707263,FR -1041707264,1041708543,GB -1041708544,1041708799,FR -1041708800,1041709823,GB -1041709824,1041710079,FR -1041710080,1041710423,GB -1041710424,1041710431,FR -1041710432,1041710671,GB -1041710672,1041710687,FR -1041710688,1041711551,GB -1041711552,1041711559,FR -1041711560,1041711943,GB -1041711944,1041711951,FR -1041711952,1041712631,GB -1041712632,1041712639,FR -1041712640,1041715071,GB -1041715072,1041715079,FR -1041715080,1041715567,GB -1041715568,1041715583,FR -1041715584,1041716039,GB -1041716040,1041716047,FR -1041716048,1041716223,GB -1041716224,1041716231,FR -1041716232,1041716455,GB -1041716456,1041716463,FR -1041716464,1041718015,GB -1041718016,1041718271,FR -1041718272,1041719223,GB -1041719224,1041719224,FR -1041719225,1041719227,GB -1041719228,1041719228,FR -1041719229,1041719407,GB -1041719408,1041719423,FR -1041719424,1041720575,GB -1041720576,1041720831,FR -1041720832,1041721599,GB -1041721600,1041721727,FR -1041721728,1041721759,GB -1041721760,1041721775,FR -1041721776,1041722951,GB -1041722952,1041722959,FR -1041722960,1041723263,GB -1041723264,1041723279,FR -1041723280,1041723775,GB -1041723776,1041723839,FR -1041723840,1041729559,GB -1041729560,1041729561,FR -1041729562,1041729564,GB -1041729565,1041729566,FR -1041729567,1041729935,GB -1041729936,1041729951,FR -1041729952,1041731071,GB -1041731072,1041731327,FR -1041731328,1041732031,GB -1041732032,1041732047,FR -1041732048,1041736381,GB -1041736382,1041736382,FR -1041736383,1041736675,GB -1041736676,1041736676,FR -1041736677,1041737583,GB -1041737584,1041737591,FR -1041737592,1041737839,GB -1041737840,1041737855,FR -1041737856,1041739031,GB -1041739032,1041739039,FR -1041739040,1041740279,GB -1041740280,1041740287,FR -1041740288,1041742415,GB -1041742416,1041742423,FR -1041742424,1041743103,GB -1041743104,1041743111,FR -1041743112,1041743247,GB -1041743248,1041743255,FR -1041743256,1041745783,GB -1041745784,1041745791,FR -1041745792,1041746903,GB -1041746904,1041746919,FR -1041746920,1041749639,GB -1041749640,1041749643,FR -1041749644,1041749659,GB -1041749660,1041749663,FR -1041749664,1041751679,GB -1041751680,1041751687,FR -1041751688,1041753231,GB -1041753232,1041753239,FR -1041753240,1041756839,GB -1041756840,1041756855,FR -1041756856,1041757615,GB -1041757616,1041757623,FR -1041757624,1041758175,GB -1041758176,1041758183,FR -1041758184,1041760255,GB +1041694720,1041748991,FR +1041748992,1041749247,GB +1041749248,1041760255,FR 1041760256,1041768447,DE 1041768448,1041776639,NO 1041776640,1041784831,CZ @@ -8941,9 +9603,7 @@ 1042875136,1042875391,FR 1042875392,1042879999,NL 1042880000,1042880255,GB -1042880256,1042889983,NL -1042889984,1042890239,GB -1042890240,1042939903,NL +1042880256,1042939903,NL 1042939904,1043070975,ES 1043070976,1043079167,CZ 1043079168,1043087359,DE @@ -8952,19 +9612,17 @@ 1043103744,1043120127,DK 1043120128,1043136511,FI 1043136512,1043202047,NL -1043202048,1043249919,AT -1043249920,1043250175,HU -1043250176,1043257087,AT -1043257088,1043257343,DE -1043257344,1043281151,AT -1043281152,1043281407,DE -1043281408,1043333119,AT +1043202048,1043242495,AT +1043242496,1043242751,DE +1043242752,1043333119,AT 1043333120,1043341311,CH 1043341312,1043349503,IT 1043349504,1043357695,DE 1043357696,1043365887,CH 1043365888,1043398655,PT -1043398656,1043470127,GB +1043398656,1043465839,GB +1043465840,1043465847,NL +1043465848,1043470127,GB 1043470128,1043470223,NL 1043470224,1043475871,GB 1043475872,1043475887,DE @@ -8987,16 +9645,16 @@ 1043595264,1043661567,DE 1043661568,1043661823,GB 1043661824,1043857407,DE -1043857408,1043892735,GB -1043892736,1043892991,CD -1043892992,1043897343,GB +1043857408,1043897343,GB 1043897344,1043897855,KE 1043897856,1043919442,GB 1043919443,1043919443,SS 1043919444,1043921919,GB 1043921920,1043922943,IL 1043922944,1043988479,ES -1043988480,1044118295,NL +1043988480,1044020223,NL +1044020224,1044020479,BE +1044020480,1044118295,NL 1044118296,1044118303,BE 1044118304,1044118423,NL 1044118424,1044118431,BE @@ -9010,6 +9668,7 @@ 1044201472,1044217855,FI 1044217856,1044226047,DK 1044226048,1044234239,OM +1044234240,1044250623,RE 1044283392,1044316159,FR 1044316160,1044332543,NO 1044332544,1044348927,RU @@ -9084,9 +9743,13 @@ 1044936116,1044936119,BE 1044936120,1044936487,GB 1044936488,1044936495,BE -1044936496,1044937247,GB +1044936496,1044936735,GB +1044936736,1044936743,BE +1044936744,1044937247,GB 1044937248,1044937255,BE -1044937256,1044946943,GB +1044937256,1044938503,GB +1044938504,1044938511,LU +1044938512,1044946943,GB 1044946944,1044955135,UA 1044955136,1044963327,NL 1044963328,1044971519,FI @@ -9102,10 +9765,8 @@ 1045154630,1045154630,SG 1045154631,1045158306,DE 1045158307,1045158307,SG -1045158308,1045159711,DE -1045159712,1045159712,EG -1045159713,1045163508,DE -1045163509,1045163511,SG +1045158308,1045163509,DE +1045163510,1045163511,SG 1045163512,1045168127,DE 1045168128,1045233663,RU 1045233664,1045241855,GB @@ -9173,7 +9834,9 @@ 1046320128,1046321151,GB 1046321152,1046323199,NL 1046323200,1046331391,ES -1046347776,1046413311,IT +1046347776,1046360319,IT +1046360320,1046360575,SM +1046360576,1046413311,IT 1046413312,1046446079,SE 1046446080,1046478879,DE 1046478880,1046479839,GB @@ -9194,9 +9857,9 @@ 1046487290,1046487290,DE 1046487291,1046487551,GB 1046487552,1046487807,DE -1046487808,1046488319,GB -1046488320,1046488575,DE -1046488576,1046489087,GB +1046487808,1046488063,GB +1046488064,1046488319,DE +1046488320,1046489087,GB 1046489088,1046489119,DE 1046489120,1046489311,GB 1046489312,1046489327,ES @@ -9250,12 +9913,22 @@ 1046503096,1046503103,DE 1046503104,1046504447,GB 1046504448,1046508543,DE -1046508544,1046511615,GB -1046511616,1046515711,DE +1046508544,1046511815,GB +1046511816,1046511823,DE +1046511824,1046512583,GB +1046512584,1046512599,DE +1046512600,1046514687,GB +1046514688,1046515711,DE 1046515712,1046518783,GB 1046518784,1046519807,DE -1046519808,1046525183,GB -1046525184,1046525695,DE +1046519808,1046524215,GB +1046524216,1046524223,DE +1046524224,1046524615,GB +1046524616,1046524623,DE +1046524624,1046525351,GB +1046525352,1046525359,DE +1046525360,1046525439,GB +1046525440,1046525695,DE 1046525696,1046529023,GB 1046529024,1046530047,DE 1046530048,1046530973,GB @@ -9270,12 +9943,8 @@ 1046535440,1046535447,DE 1046535448,1046537023,GB 1046537024,1046537039,DE -1046537040,1046538751,GB -1046538752,1046539007,DE -1046539008,1046543209,GB -1046543210,1046543210,DE -1046543211,1046543343,GB -1046543344,1046543359,DE +1046537040,1046543103,GB +1046543104,1046543359,DE 1046543360,1046544383,GB 1046544384,1046560767,IT 1046560768,1046585343,ES @@ -9322,9 +9991,11 @@ 1047314432,1047322623,SE 1047322624,1047330815,IT 1047330816,1047339007,RU -1047339008,1047346175,SE -1047346176,1047346431,FI -1047346432,1047347199,SE +1047339008,1047340863,SE +1047340864,1047340927,NO +1047340928,1047342879,SE +1047342880,1047342887,FI +1047342888,1047347199,SE 1047347200,1047363583,DE 1047363584,1047371775,CZ 1047371776,1047373559,RU @@ -9349,9 +10020,7 @@ 1047658496,1047724031,EG 1047728128,1047732223,SE 1047787520,1047787775,ES -1047789568,1047805439,AT -1047805440,1047805695,DE -1047805696,1047822335,AT +1047789568,1047822335,AT 1047822336,1047838719,DE 1047838720,1047846911,DK 1047846912,1047855103,SE @@ -9373,7 +10042,6 @@ 1048193024,1048195071,RO 1048195072,1048197119,RU 1048197120,1048201215,UA -1048201216,1048203263,PL 1048203264,1048205311,DE 1048205312,1048209407,RU 1048209408,1048211455,UA @@ -9396,7 +10064,10 @@ 1048576000,1048584191,DE 1048584192,1048592383,IL 1048592384,1048600575,IT -1048600576,1048603391,UA +1048600576,1048602111,UA +1048602112,1048602623,PL +1048602624,1048603135,RU +1048603136,1048603391,UA 1048603392,1048603647,LV 1048603648,1048608767,UA 1048608768,1048616959,GB @@ -9424,7 +10095,9 @@ 1049006080,1049006335,DE 1049008128,1049009151,DE 1049016320,1049018367,DE -1049018624,1049022463,DE +1049018624,1049021439,DE +1049021440,1049021695,GB +1049021696,1049022463,DE 1049026816,1049029375,DE 1049030656,1049031679,DE 1049031744,1049031871,DE @@ -9546,19 +10219,19 @@ 1051922432,1051924479,CH 1051924480,1051948031,AT 1051948032,1051949055,CH -1051949056,1051949823,AT -1051949824,1051950079,NL -1051950080,1051983871,AT +1051949056,1051983871,AT 1051990016,1051991039,DE 1052001280,1052002303,DE 1052003584,1052003839,DE 1052011264,1052012031,DE -1052017536,1052017663,DE +1052017536,1052017567,DE 1052019712,1052019967,GB 1052045312,1052046079,DE 1052049408,1052057599,PL 1052057600,1052065791,RU -1052065792,1052081151,SE +1052065792,1052076031,SE +1052076032,1052077055,NL +1052077056,1052081151,SE 1052081152,1052082175,NL 1052082176,1052090367,DE 1052090368,1052098559,PL @@ -9589,7 +10262,7 @@ 1052170240,1052172287,SE 1052172288,1052174335,PL 1052174336,1052176383,CZ -1052176384,1052178431,NL +1052176384,1052178431,GB 1052178432,1052180479,DK 1052180480,1052213247,RU 1052213248,1052246015,FI @@ -9631,7 +10304,9 @@ 1052488704,1052489727,GB 1052494336,1052494591,NL 1052498432,1052498463,RO -1052508160,1052704767,GB +1052508160,1052593663,GB +1052593664,1052593919,US +1052593920,1052704767,GB 1052704768,1052712959,NL 1052712960,1052770303,GB 1052770304,1052778495,CH @@ -9657,19 +10332,24 @@ 1053138944,1053147135,FI 1053147136,1053163519,SK 1053163520,1053294591,DK -1053295616,1053296639,AT -1053307904,1053308159,GB +1053294616,1053294623,AT +1053294656,1053294679,AT +1053295104,1053296639,AT +1053297152,1053297663,IT +1053301056,1053301071,FR +1053312872,1053312887,DK +1053312912,1053312927,DK 1053313280,1053313535,GB -1053316688,1053316695,GB +1053318912,1053318943,FI 1053320224,1053320239,DE -1053327616,1053327871,ZA -1053329440,1053329471,ES +1053325824,1053326335,DE +1053326504,1053326527,BE +1053326544,1053326551,BE 1053332992,1053334015,BE 1053335552,1053336575,ZA 1053339904,1053340159,AT -1053340928,1053341183,GB -1053345280,1053345375,PK 1053349376,1053349631,NL +1053349952,1053349967,IE 1053353408,1053353423,GB 1053353984,1053354239,IL 1053354912,1053355007,IL @@ -9696,9 +10376,7 @@ 1053663232,1053671423,RU 1053671424,1053687807,LV 1053687808,1053753343,DE -1053753344,1053788687,NL -1053788688,1053788695,DE -1053788696,1053818879,NL +1053753344,1053818879,NL 1053818880,1053819391,DE 1053819424,1053819439,DE 1053819520,1053819563,DE @@ -9725,6 +10403,7 @@ 1053837568,1053837823,GB 1053837824,1053838335,FK 1053838336,1053838591,DE +1053839360,1053840383,DE 1053840400,1053840415,DE 1053840448,1053840511,DE 1053843200,1053843231,DK @@ -9791,13 +10470,13 @@ 1053927160,1053927167,FI 1053927168,1053933567,SE 1053933568,1053949951,CZ -1053949952,1054015487,FR +1053949952,1053968188,FR +1053968189,1053968189,PT +1053968190,1054015487,FR 1054015488,1054089215,IT 1054089216,1054097407,GE 1054097408,1054105599,NL -1054105600,1054107135,FR -1054107136,1054107391,GB -1054107392,1054113791,FR +1054105600,1054113791,FR 1054113792,1054121983,NL 1054121984,1054130175,AT 1054130176,1054138367,LT @@ -9814,10 +10493,7 @@ 1054186241,1054186495,GB 1054186496,1054187264,DE 1054187265,1054187519,GB -1054187520,1054192639,FR -1054192640,1054192895,BG -1054192896,1054195455,FR -1054195456,1054195711,BG +1054187520,1054195711,FR 1054195712,1054212095,BE 1054212096,1054277631,DE 1054277632,1054343167,KW @@ -9825,7 +10501,9 @@ 1054351360,1054359551,UA 1054359552,1054367743,RO 1054367744,1054375935,FI -1054375936,1054384127,GB +1054375936,1054381567,GB +1054381568,1054381823,US +1054381824,1054384127,GB 1054384128,1054400511,DE 1054400512,1054408703,GB 1054408704,1054416895,FR @@ -9929,8 +10607,7 @@ 1056473088,1056505855,FI 1056505856,1056514047,PT 1056514048,1056522239,IT -1056522240,1056523007,DE -1056523008,1056538623,AT +1056522240,1056538623,AT 1056538624,1056546815,RU 1056546816,1056555007,NO 1056555008,1056571391,GB @@ -9951,9 +10628,7 @@ 1061853696,1061854207,GB 1061854208,1061939711,US 1061939712,1061940223,JM -1061940224,1061987839,US -1061987840,1061988095,CA -1061988096,1062069247,US +1061940224,1062069247,US 1062069248,1062070271,PR 1062070272,1062219519,US 1062219520,1062219775,IN @@ -9967,11 +10642,19 @@ 1062530048,1062531071,EC 1062531072,1062545919,US 1062545920,1062546431,BM -1062546432,1062597375,US +1062546432,1062587135,US +1062587136,1062587391,CA +1062587392,1062597375,US 1062597376,1062597631,PR 1062597632,1062871551,US 1062871552,1062872063,PR -1062872064,1063057432,US +1062872064,1063053567,US +1063053568,1063053647,CA +1063053648,1063053663,US +1063053664,1063053743,CA +1063053744,1063053759,US +1063053760,1063053823,CA +1063053824,1063057432,US 1063057433,1063057433,CA 1063057434,1063305727,US 1063305728,1063305983,CA @@ -10003,7 +10686,9 @@ 1064221952,1064222207,MX 1064222208,1064445183,US 1064445184,1064445439,PK -1064445440,1065519871,US +1064445440,1065372927,US +1065372928,1065373183,PR +1065373184,1065519871,US 1065519872,1065520127,GB 1065520128,1065525791,US 1065525792,1065525807,IN @@ -10022,12 +10707,12 @@ 1065873408,1065877503,PR 1065877504,1065906175,US 1065906176,1065908223,KY -1065908224,1066311679,US +1065908224,1066254975,US +1066254976,1066255103,GB +1066255104,1066311679,US 1066311680,1066315775,CA 1066315776,1066352639,US -1066352640,1066354943,JM -1066354944,1066355199,BB -1066355200,1066355711,JM +1066352640,1066355711,JM 1066355712,1066355967,BB 1066355968,1066369023,JM 1066369024,1067238143,US @@ -10064,7 +10749,9 @@ 1068123136,1068123391,BB 1068123392,1068175871,US 1068175872,1068176383,YE -1068176384,1068199935,US +1068176384,1068179455,US +1068179456,1068179711,PR +1068179712,1068199935,US 1068199936,1068204031,CA 1068204032,1068230655,US 1068230656,1068230911,CO @@ -10091,7 +10778,9 @@ 1070729472,1070729727,CA 1070729728,1071100927,US 1071100928,1071101951,PR -1071101952,1071134719,US +1071101952,1071106559,US +1071106560,1071106815,NL +1071106816,1071134719,US 1071134720,1071136767,HK 1071136768,1071141887,US 1071141888,1071142911,HK @@ -10116,7 +10805,9 @@ 1071255296,1071255525,LB 1071255526,1071255526,DE 1071255527,1071255551,LB -1071255552,1071256319,US +1071255552,1071255839,US +1071255840,1071255847,TW +1071255848,1071256319,US 1071256320,1071256575,HK 1071256576,1071258879,US 1071258880,1071259135,HK @@ -10291,7 +10982,9 @@ 1072941056,1072942079,CA 1072942080,1072943103,US 1072943104,1072945151,CA -1072945152,1073022975,US +1072945152,1072953599,US +1072953600,1072953607,IE +1072953608,1073022975,US 1073022976,1073025791,HN 1073025792,1073026047,NI 1073026048,1073026303,US @@ -10301,8 +10994,8 @@ 1073028352,1073028607,US 1073028608,1073029119,GD 1073029120,1073031423,US -1073031424,1073031679,CW -1073031680,1073034239,US +1073031424,1073031935,CW +1073031936,1073034239,US 1073034240,1073034495,BB 1073034496,1073035263,US 1073035264,1073036032,GD @@ -10469,13 +11162,16 @@ 1075494912,1075558143,US 1075558144,1075558911,VI 1075558912,1075576831,US -1075576832,1075577087,GB -1075577088,1075579391,NO +1075576832,1075576895,NO +1075576896,1075576896,SE +1075576897,1075579391,NO 1075579392,1075579903,GB 1075579904,1075585023,NO 1075585024,1075609599,US 1075609600,1075613695,TT -1075613696,1075769343,US +1075613696,1075717887,US +1075717888,1075718143,CA +1075718144,1075769343,US 1075769344,1075773439,CA 1075773440,1075855359,US 1075855360,1075871743,DO @@ -10488,17 +11184,15 @@ 1075975168,1075975679,CA 1075975680,1075976191,US 1075976192,1075976447,CA -1075976448,1075976959,US -1075976960,1075977215,CA -1075977216,1075977983,US -1075977984,1075978239,CA -1075978240,1075982335,US +1075976448,1075977055,US +1075977056,1075977071,CA +1075977072,1075982335,US 1075982336,1075982591,CA 1075982592,1075982847,US 1075982848,1075983103,CA 1075983104,1075983359,US -1075983360,1075984383,CA -1075984384,1075985919,US +1075983360,1075984127,CA +1075984128,1075985919,US 1075985920,1075986687,CA 1075986688,1075986943,US 1075986944,1075987199,CA @@ -10507,10 +11201,8 @@ 1075988224,1075988319,US 1075988320,1075988351,CA 1075988352,1075988479,US -1075988480,1075988991,CA -1075988992,1075989231,US -1075989232,1075989239,CA -1075989240,1075989503,US +1075988480,1075989247,CA +1075989248,1075989503,US 1075989504,1075989759,CA 1075989760,1075990015,US 1075990016,1075990527,CA @@ -10522,7 +11214,9 @@ 1075995648,1075996671,CA 1075996672,1075997183,US 1075997184,1075997439,CA -1075997440,1075998207,US +1075997440,1075998119,US +1075998120,1075998127,CA +1075998128,1075998207,US 1075998208,1075998271,CA 1075998272,1075998463,US 1075998464,1075999231,CA @@ -10552,7 +11246,9 @@ 1076009728,1076009983,CA 1076009984,1076026623,US 1076026624,1076026879,CA -1076026880,1076028159,US +1076026880,1076027019,US +1076027020,1076027023,CA +1076027024,1076028159,US 1076028160,1076028415,CA 1076028416,1076028927,US 1076028928,1076029183,BZ @@ -10677,7 +11373,9 @@ 1078284864,1078284991,CA 1078284992,1078285151,US 1078285152,1078285167,CA -1078285168,1078285311,US +1078285168,1078285255,US +1078285256,1078285259,CA +1078285260,1078285311,US 1078285312,1078285567,CA 1078285568,1078286351,US 1078286352,1078286367,CA @@ -10792,8 +11490,8 @@ 1079403264,1079403519,US 1079403520,1079403775,CA 1079403776,1079405567,US -1079405568,1079406079,CA -1079406080,1079408895,US +1079405568,1079406111,CA +1079406112,1079408895,US 1079408896,1079409407,PK 1079409408,1079409919,US 1079409920,1079410175,CA @@ -10840,17 +11538,15 @@ 1080024576,1080033279,US 1080033280,1080164351,KY 1080164352,1080295423,CA -1080295424,1080496639,US -1080496640,1080496895,ES -1080496896,1080498431,US +1080295424,1080498431,US 1080498432,1080498664,GB 1080498665,1080498665,US 1080498666,1080498687,GB -1080498688,1080513535,US +1080498688,1080512511,US +1080512512,1080512767,GB +1080512768,1080513535,US 1080513536,1080513791,GB -1080513792,1080550399,US -1080550400,1080550655,IN -1080550656,1080552447,US +1080513792,1080552447,US 1080552448,1080552703,IN 1080552704,1080569343,US 1080569344,1080569599,JP @@ -10860,7 +11556,9 @@ 1080589568,1080589823,CN 1080589824,1080610559,US 1080610560,1080610815,AU -1080610816,1080621055,US +1080610816,1080613631,US +1080613632,1080613887,AU +1080613888,1080621055,US 1080621056,1080621567,AU 1080621568,1080622079,US 1080622080,1080622335,AU @@ -10892,8 +11590,7 @@ 1081037312,1081037567,CA 1081037568,1081038335,US 1081038336,1081040895,CA -1081040896,1081057535,US -1081061376,1081122559,US +1081040896,1081122559,US 1081122560,1081122815,VI 1081122816,1081212927,US 1081212928,1081278463,CA @@ -10908,8 +11605,8 @@ 1081379840,1081385215,US 1081385216,1081385471,PA 1081385472,1081387519,US -1081387520,1081388031,PA -1081388032,1081391103,US +1081387520,1081387775,PA +1081387776,1081391103,US 1081391104,1081393151,PA 1081393152,1081393407,US 1081393408,1081393663,CL @@ -10948,7 +11645,9 @@ 1081573376,1081589759,US 1081589760,1081593855,BB 1081593856,1081597951,CA -1081597952,1082139409,US +1081597952,1081639423,US +1081639424,1081639679,DE +1081639680,1082139409,US 1082139410,1082139410,ZA 1082139411,1082314751,US 1082314752,1082318847,CA @@ -10960,7 +11659,8 @@ 1082786592,1082786623,HK 1082786624,1082790143,US 1082790144,1082790399,IN -1082790400,1082791167,US +1082790400,1082790911,US +1082790912,1082791167,AU 1082791168,1082791423,IN 1082791424,1082819839,US 1082819840,1082820351,IN @@ -10982,7 +11682,9 @@ 1083738112,1083740159,PR 1083740160,1084067583,US 1084067584,1084067839,CA -1084067840,1085439999,US +1084067840,1084153599,US +1084153600,1084153855,NL +1084153856,1085439999,US 1085440000,1085448191,CA 1085448192,1085456383,US 1085456384,1085457919,PR @@ -11015,31 +11717,33 @@ 1086955520,1086971903,CA 1086971904,1087016959,US 1087016960,1087021055,CA -1087021056,1087395327,US -1087395328,1087395455,GB -1087395456,1087399167,US +1087021056,1087399167,US 1087399168,1087399423,GB 1087399424,1087405407,US 1087405408,1087405423,MX 1087405424,1087413895,US 1087413896,1087413903,DE -1087413904,1087419135,US +1087413904,1087414271,US +1087414272,1087414527,GB +1087414528,1087419135,US 1087419136,1087419391,GB 1087419392,1087419903,US 1087419904,1087420159,CA -1087420160,1087432447,US -1087432448,1087432607,FR -1087432608,1087432639,US -1087432640,1087432703,FR -1087432704,1087436159,US +1087420160,1087432599,US +1087432600,1087432607,FR +1087432608,1087436031,US +1087436032,1087436159,NL 1087436160,1087436167,CH -1087436168,1087440895,US +1087436168,1087436287,NL +1087436288,1087440895,US 1087440896,1087442943,PR 1087442944,1087443551,US 1087443552,1087443583,DE 1087443584,1087444223,US 1087444224,1087444479,GB -1087444480,1087464945,US +1087444480,1087460863,US +1087460864,1087461119,CA +1087461120,1087464945,US 1087464946,1087464949,GB 1087464950,1087466489,US 1087466490,1087466493,GB @@ -11047,13 +11751,29 @@ 1087467292,1087467295,BR 1087467296,1087496703,US 1087496704,1087496959,CA -1087496960,1087508161,US +1087496960,1087501567,US +1087501568,1087501695,HK +1087501696,1087508161,US 1087508162,1087508162,JP -1087508163,1087593983,US +1087508163,1087510271,US +1087510272,1087510463,CA +1087510464,1087510495,US +1087510496,1087510527,CA +1087510528,1087514623,US +1087514624,1087515391,BB +1087515392,1087515647,US +1087515648,1087516159,BB +1087516160,1087516415,US +1087516416,1087516671,BB +1087516672,1087580927,US +1087580928,1087581183,BR +1087581184,1087593983,US 1087593984,1087594239,MX 1087594240,1087608319,US 1087608320,1087608575,GB -1087608576,1087643723,US +1087608576,1087626111,US +1087626112,1087626239,VI +1087626240,1087643723,US 1087643724,1087643727,FR 1087643728,1087654143,US 1087654144,1087654399,VE @@ -11061,13 +11781,9 @@ 1087678624,1087678655,GB 1087678656,1087686655,US 1087686656,1087686911,PR -1087686912,1087689215,US -1087689216,1087689471,AR -1087689472,1087695319,US +1087686912,1087695319,US 1087695320,1087695323,GB -1087695324,1087708685,US -1087708686,1087708686,AU -1087708687,1087714335,US +1087695324,1087714335,US 1087714336,1087714367,NL 1087714368,1087715327,US 1087715328,1087717375,PA @@ -11080,38 +11796,38 @@ 1087735648,1087746079,US 1087746080,1087746083,HK 1087746084,1087758335,US -1087758336,1087761919,PR -1087761920,1087762431,US -1087762432,1087766527,PR +1087758336,1087762175,PR +1087762176,1087762431,US +1087762432,1087763967,PR +1087763968,1087764223,US +1087764224,1087766527,PR 1087766528,1087798943,US 1087798944,1087798975,CA -1087798976,1087799413,US -1087799414,1087799414,DE -1087799415,1087799787,US +1087798976,1087799295,US +1087799296,1087799372,DE +1087799373,1087799374,US +1087799375,1087799551,DE +1087799552,1087799787,US 1087799788,1087799791,CH 1087799792,1087825663,US 1087825664,1087825919,SA -1087825920,1087836415,US -1087836416,1087836671,FR -1087836672,1087837359,US -1087837360,1087837367,BR -1087837368,1087839231,US -1087839232,1087839487,GB -1087839488,1087862783,US +1087825920,1087837183,US +1087837184,1087837439,BR +1087837440,1087839231,US +1087839232,1087839359,GB +1087839360,1087862783,US 1087862784,1087864831,PA 1087864832,1087873023,US 1087873024,1087873279,CA 1087873280,1087883263,US 1087883264,1087883519,AR -1087883520,1087884001,US -1087884002,1087884002,GB -1087884003,1087950111,US +1087883520,1087950111,US 1087950112,1087950119,PR 1087950120,1088012767,US 1088012768,1088012775,PR -1088012776,1088398591,US -1088398592,1088398719,CA -1088398720,1088684031,US +1088012776,1088319103,US +1088319104,1088319231,CA +1088319232,1088684031,US 1088684032,1088946175,CA 1088946176,1089053183,US 1089053184,1089053439,BR @@ -11165,9 +11881,9 @@ 1089526784,1089527039,VE 1089527040,1089579519,US 1089579520,1089580031,VE -1089580032,1089598975,US -1089598976,1089599231,HK -1089599232,1089881599,US +1089580032,1089824767,US +1089824768,1089825023,VI +1089825024,1089881599,US 1089881600,1089882111,GB 1089882112,1089882623,US 1089882624,1089883135,GB @@ -11195,8 +11911,8 @@ 1091803392,1091807231,US 1091807232,1091807487,CA 1091807488,1091807999,US -1091808000,1091808511,CA -1091808512,1091812351,US +1091808000,1091808255,CA +1091808256,1091812351,US 1091812352,1091812607,CN 1091812608,1091960831,US 1091960832,1092026367,CA @@ -11216,8 +11932,8 @@ 1093074944,1093091327,CA 1093091328,1093107967,US 1093107968,1093108479,CA -1093108480,1093108735,US -1093108736,1093109247,CA +1093108480,1093108991,US +1093108992,1093109247,CA 1093109248,1093109503,US 1093109504,1093109759,CA 1093109760,1093109871,US @@ -11261,9 +11977,7 @@ 1093122816,1093123839,CA 1093123840,1093123951,US 1093123952,1093123967,CA -1093123968,1093124607,US -1093124608,1093124863,CA -1093124864,1093126143,US +1093123968,1093126143,US 1093126144,1093126399,CA 1093126400,1093126911,US 1093126912,1093127167,CA @@ -11320,7 +12034,6 @@ 1094670800,1095450623,US 1095450624,1095467007,BS 1095467008,1095483391,US -1095484416,1095484671,US 1095491584,1095627775,US 1095627776,1095628287,CA 1095628288,1096278015,US @@ -11350,14 +12063,10 @@ 1097837199,1097896191,US 1097896192,1097897215,VI 1097897216,1097947135,US -1097947136,1097947735,VI -1097947736,1097947743,US -1097947744,1097949183,VI +1097947136,1097949183,VI 1097949184,1097951231,US 1097951232,1097953279,VI -1097953280,1098507263,US -1098507264,1098507519,CA -1098507520,1101121535,US +1097953280,1101121535,US 1101121536,1101121791,EC 1101121792,1101182975,US 1101182976,1101183487,YE @@ -11387,8 +12096,8 @@ 1101475840,1101479935,CO 1101479936,1101484031,US 1101484032,1101488127,CO -1101488128,1101521407,US -1101521408,1101521919,AS +1101488128,1101521663,US +1101521664,1101521919,AS 1101521920,1101542399,US 1101542400,1101542911,CO 1101542912,1101574655,US @@ -11405,8 +12114,8 @@ 1101681408,1101681663,NL 1101681664,1101750783,US 1101750784,1101751295,BM -1101751296,1101767935,US -1101767936,1101768191,CW +1101751296,1101767679,US +1101767680,1101768191,CW 1101768192,1101797375,US 1101797376,1101798399,BB 1101798400,1101803519,US @@ -11472,9 +12181,7 @@ 1104842752,1104844799,PR 1104844800,1104924415,US 1104924416,1104924671,IN -1104924672,1105034495,US -1105034496,1105034751,IT -1105034752,1105099519,US +1104924672,1105099519,US 1105099520,1105099775,EC 1105099776,1106381199,US 1106381200,1106381207,UM @@ -11602,24 +12309,22 @@ 1110573056,1110587391,PR 1110587392,1110587903,US 1110587904,1110588159,PR -1110588160,1110588671,US -1110588672,1110589183,PR -1110589184,1110589439,US +1110588160,1110588415,US +1110588416,1110588671,PR +1110588672,1110589439,US 1110589440,1110590207,PR 1110590208,1110590463,US -1110590464,1110591231,PR -1110591232,1110591487,US -1110591488,1110592255,PR +1110590464,1110590975,PR +1110590976,1110591743,US +1110591744,1110592255,PR 1110592256,1110592511,US 1110592512,1110593023,PR -1110593024,1110593279,US -1110593280,1110593535,PR -1110593536,1110593791,US +1110593024,1110593791,US 1110593792,1110594047,PR 1110594048,1110594303,US 1110594304,1110594815,PR -1110594816,1110595583,US -1110595584,1110598655,PR +1110594816,1110595776,US +1110595777,1110598655,PR 1110598656,1110598911,US 1110598912,1110638591,PR 1110638592,1110654463,US @@ -11634,7 +12339,9 @@ 1110853632,1110854655,GB 1110854656,1110855679,US 1110855680,1110856703,CN -1110856704,1110857727,IN +1110856704,1110857215,IN +1110857216,1110857471,DE +1110857472,1110857727,IN 1110857728,1110858751,SG 1110858752,1110859007,US 1110859008,1110859263,AU @@ -11644,7 +12351,7 @@ 1110867456,1110867967,JM 1110867968,1110887423,US 1110887424,1110887679,IE -1110887680,1110925311,US +1110887680,1110929407,US 1110929408,1110933503,BM 1110933504,1111195647,US 1111195648,1111212031,CA @@ -11677,7 +12384,9 @@ 1113603328,1113603583,GT 1113603584,1113603839,US 1113603840,1113604095,CA -1113604096,1113657343,US +1113604096,1113643202,US +1113643203,1113643237,CH +1113643238,1113657343,US 1113657344,1113661439,CA 1113661440,1113669631,US 1113669632,1113677823,CA @@ -11705,9 +12414,13 @@ 1114511872,1114512127,CA 1114512128,1114513407,US 1114513408,1114513471,SA -1114513472,1114513535,US -1114513536,1114515455,SA -1114515456,1114517503,US +1114513472,1114513551,US +1114513552,1114513663,SA +1114513664,1114514175,US +1114514176,1114515455,SA +1114515456,1114515463,US +1114515464,1114515471,CA +1114515472,1114517503,US 1114517504,1114518015,CA 1114518016,1114520063,US 1114520064,1114520319,PH @@ -11763,8 +12476,8 @@ 1116016128,1116021247,US 1116021248,1116021503,CI 1116021504,1116024063,US -1116024064,1116024127,PG -1116024128,1116027135,US +1116024064,1116024319,PG +1116024320,1116027135,US 1116027136,1116027903,DE 1116027904,1116168191,US 1116168192,1116176383,CA @@ -11788,9 +12501,13 @@ 1117420032,1117420415,CA 1117420416,1117420447,US 1117420448,1117421567,CA -1117421568,1117460223,US +1117421568,1117458911,US +1117458912,1117458943,GB +1117458944,1117460223,US 1117460224,1117460287,GB -1117460288,1117683711,US +1117460288,1117480191,US +1117480192,1117480255,CA +1117480256,1117683711,US 1117683712,1117691903,CA 1117691904,1117724671,US 1117724672,1117728767,CA @@ -11872,7 +12589,9 @@ 1118975488,1118975743,KE 1118975744,1118975999,US 1118976000,1118976255,GB -1118976256,1118980607,US +1118976256,1118980095,US +1118980096,1118980351,GF +1118980352,1118980607,US 1118980608,1118980863,TZ 1118980864,1118983423,US 1118983424,1118983679,NI @@ -11931,9 +12650,7 @@ 1119558144,1119558655,PR 1119558656,1119568383,US 1119568384,1119568639,GB -1119568640,1119570175,US -1119570176,1119570303,GB -1119570304,1119571967,US +1119568640,1119571967,US 1119571968,1119576063,CA 1119576064,1119580159,US 1119580160,1119584255,CA @@ -11962,18 +12679,24 @@ 1120312064,1120312319,PH 1120312320,1120312575,US 1120312576,1120312831,PH -1120312832,1120346111,US +1120312832,1120315391,US +1120315392,1120317439,SG +1120317440,1120346111,US 1120346112,1120350207,CA 1120350208,1120370687,US 1120370688,1120371199,CA -1120371200,1120372223,US +1120371200,1120371567,US +1120371568,1120371583,CA +1120371584,1120372223,US 1120372224,1120372479,CA 1120372480,1120372991,US 1120372992,1120373247,CA 1120373248,1120373503,US 1120373504,1120374015,CA -1120374016,1120374527,US -1120374528,1120375039,CA +1120374016,1120374519,US +1120374520,1120374523,CA +1120374524,1120374783,US +1120374784,1120375039,CA 1120375040,1120375551,US 1120375552,1120376063,CA 1120376064,1120376303,US @@ -12059,8 +12782,12 @@ 1120743680,1120744447,US 1120744448,1120744703,KN 1120744704,1120788479,US -1120793856,1120794111,US -1120796672,1120854015,US +1120793088,1120793343,US +1120796672,1120826367,US +1120826368,1120826370,CA +1120826371,1120826371,US +1120826372,1120826623,CA +1120826624,1120854015,US 1120854016,1120862207,CA 1120862208,1120875007,US 1120875008,1120875263,AS @@ -12086,7 +12813,9 @@ 1121254144,1121255423,CA 1121255424,1121714998,US 1121714999,1121714999,KW -1121715000,1121878015,US +1121715000,1121763327,US +1121763328,1121767423,CA +1121767424,1121878015,US 1121878016,1121910783,CA 1121910784,1122074623,US 1122074624,1122087935,CA @@ -12109,11 +12838,9 @@ 1122451456,1122455551,CO 1122455552,1122476031,US 1122476032,1122480127,PR -1122480128,1122494975,US -1122494976,1122495231,PR -1122495232,1122497791,US -1122497792,1122498047,PR -1122498048,1122533375,US +1122480128,1122497327,US +1122497328,1122497343,BR +1122497344,1122533375,US 1122533376,1122535423,GB 1122535424,1122538495,KR 1122538496,1122635775,US @@ -12132,17 +12859,13 @@ 1123589632,1123589887,DE 1123589888,1123590143,US 1123590144,1123598335,VI -1123598336,1123606527,CA -1123606528,1123635199,US +1123598336,1123635199,US 1123635200,1123635455,AU -1123635456,1123635639,GB +1123635456,1123635639,US 1123635640,1123635640,RU -1123635641,1123635670,GB +1123635641,1123635670,US 1123635671,1123635671,RU -1123635672,1123635711,GB -1123635712,1123638527,US -1123638528,1123638783,FR -1123638784,1123651583,US +1123635672,1123651583,US 1123651584,1123651839,JM 1123651840,1123652095,BB 1123652096,1123652863,JM @@ -12164,7 +12887,9 @@ 1123801088,1123801343,RU 1123801344,1123848191,US 1123848192,1123852287,CA -1123852288,1123950591,US +1123852288,1123929599,US +1123929600,1123929855,CA +1123929856,1123950591,US 1123950592,1123958783,CA 1123958784,1125064703,US 1125064704,1125065215,GB @@ -12201,9 +12926,7 @@ 1125481728,1125489151,US 1125489152,1125490687,CA 1125490688,1125498879,US -1125498880,1125501439,CA -1125501440,1125501695,US -1125501696,1125508095,CA +1125498880,1125508095,CA 1125508096,1125508351,PA 1125508352,1125514239,CA 1125514240,1125514495,CY @@ -12235,13 +12958,17 @@ 1128529920,1128641023,CA 1128641024,1128641535,US 1128641536,1128792063,CA -1128792064,1130537215,US +1128792064,1128817407,US +1128817408,1128817663,NL +1128817664,1130537215,US 1130537216,1130537471,GU 1130537472,1130537727,US 1130537728,1130537983,GU 1130537984,1130538751,US 1130538752,1130539007,GU -1130539008,1133461247,US +1130539008,1133226239,US +1133226240,1133226495,AS +1133226496,1133461247,US 1133461248,1133461503,CA 1133461504,1133785439,US 1133785440,1133785471,GB @@ -12252,8 +12979,10 @@ 1134448640,1134546943,US 1134546944,1134551039,CA 1134551040,1136523263,US -1136523264,1136523775,CA -1136523776,1136721919,US +1136523264,1136523391,CA +1136523392,1136523519,US +1136523520,1136523647,CA +1136523648,1136721919,US 1136721920,1136787455,CA 1136787456,1137195519,US 1137195520,1137195775,JP @@ -12286,8 +13015,12 @@ 1137524736,1137541119,CA 1137541120,1137623039,US 1137623040,1137639423,PR -1137639424,1137704959,US -1137704960,1137712383,CA +1137639424,1137680959,US +1137680960,1137680975,UA +1137680976,1137704959,US +1137704960,1137706239,CA +1137706240,1137706495,US +1137706496,1137712383,CA 1137712384,1137712639,US 1137712640,1137713151,CA 1137713152,1137758207,US @@ -12303,9 +13036,7 @@ 1137893376,1137917951,US 1137917952,1137922047,CA 1137922048,1137926143,US -1137926144,1137926655,CA -1137926656,1137926911,AW -1137926912,1137929727,CA +1137926144,1137929727,CA 1137929728,1137929983,IE 1137929984,1137934335,CA 1137934336,1137950719,US @@ -12318,7 +13049,9 @@ 1137975296,1137983487,US 1137983488,1137991679,CA 1137991680,1138049023,US -1138049024,1138061311,CA +1138049024,1138053631,CA +1138053632,1138053887,US +1138053888,1138061311,CA 1138061312,1138069503,US 1138069504,1138073599,JM 1138073600,1138163711,US @@ -12336,12 +13069,10 @@ 1138196480,1138204671,CA 1138204672,1138212863,US 1138212864,1138216959,CA -1138216960,1138372863,US -1138372864,1138373119,AS -1138373120,1138373887,US -1138373888,1138374655,AS -1138374656,1138374911,US -1138374912,1138375679,AS +1138216960,1138374143,US +1138374144,1138374399,AS +1138374400,1138375167,US +1138375168,1138375679,AS 1138375680,1138419711,US 1138419712,1138419967,DE 1138419968,1138499583,US @@ -12366,7 +13097,9 @@ 1138774016,1138778111,CA 1138778112,1138780671,US 1138780672,1138780679,CA -1138780680,1138786303,US +1138780680,1138781183,US +1138781184,1138781439,CA +1138781440,1138786303,US 1138786304,1138819071,PR 1138819072,1138851839,CA 1138851840,1138917375,US @@ -12379,25 +13112,23 @@ 1139167232,1139167743,US 1139167744,1139168767,PR 1139168768,1139169279,US -1139169280,1139170303,PR -1139170304,1139171071,US +1139169280,1139170175,PR +1139170176,1139170815,US +1139170816,1139170943,PR +1139170944,1139171071,US 1139171072,1139171327,PR -1139171328,1139175679,US -1139175680,1139175807,PR -1139175808,1139179519,US +1139171328,1139179519,US 1139179520,1139195903,CA 1139195904,1139216383,US 1139216384,1139220479,CA 1139220480,1139265535,US 1139265536,1139269631,CA -1139269632,1144796671,US -1144796672,1144796799,CA -1144796800,1144796927,US -1144796928,1144797055,CA -1144797056,1145141247,US -1145142784,1145158143,US -1145158144,1145158655,CA -1145158656,1145188351,US +1139269632,1143726207,US +1143726208,1143726335,CA +1143726336,1144796671,US +1144796672,1144796927,CA +1144796928,1145141247,US +1145142784,1145188351,US 1145188352,1145192447,CA 1145192448,1145242111,US 1145242112,1145242367,NO @@ -12424,9 +13155,7 @@ 1145430016,1145475071,US 1145475072,1145479167,CA 1145479168,1145503743,US -1145503744,1145506815,CA -1145506816,1145507071,US -1145507072,1145520127,CA +1145503744,1145520127,CA 1145520128,1145552895,US 1145552896,1145556991,CA 1145556992,1150043135,US @@ -12461,23 +13190,25 @@ 1151946240,1151946751,GB 1151946752,1152073727,US 1152073728,1152077823,CA -1152077824,1152083455,US -1152083456,1152083711,MO -1152083712,1152116479,US +1152077824,1152116479,US 1152116480,1152116735,CA 1152116736,1152117759,US 1152117760,1152117952,IL 1152117953,1152117953,CA 1152117954,1152118015,IL -1152118016,1152121855,US -1152121856,1152122111,ID -1152122112,1152581631,US +1152118016,1152120319,US +1152120320,1152120575,CA +1152120576,1152581631,US 1152581632,1152614399,CA 1152614400,1152778239,US 1152778240,1152843775,CA 1152843776,1156071423,US 1156071424,1156079615,CA -1156079616,1156263935,US +1156079616,1156243455,US +1156243456,1156245503,CA +1156245504,1156249599,US +1156249600,1156250623,CA +1156250624,1156263935,US 1156263936,1156265983,CA 1156265984,1156296703,US 1156296704,1156300799,CA @@ -12489,7 +13220,13 @@ 1157912704,1157912831,CA 1157912832,1157913215,US 1157913216,1157913279,CA -1157913280,1157931007,US +1157913280,1157914194,US +1157914195,1157914202,IN +1157914203,1157914234,US +1157914235,1157914242,IN +1157914243,1157914258,US +1157914259,1157914266,IN +1157914267,1157931007,US 1157931008,1157935103,BS 1157935104,1157943295,US 1157943296,1157947391,CA @@ -12511,17 +13248,14 @@ 1158340608,1158344703,CA 1158344704,1158348799,US 1158348800,1158381567,CA -1158381568,1158414591,US -1158416336,1158416351,US -1158416896,1158417151,US -1158420480,1158439167,US -1158439296,1158439423,US -1158439680,1158439935,US +1158381568,1158438911,US 1158441216,1158441471,US 1158443008,1158724607,US 1158724608,1158724863,NL 1158724864,1158774783,US -1158774784,1158791167,CA +1158774784,1158784703,CA +1158784704,1158784767,US +1158784768,1158791167,CA 1158791168,1158794239,BM 1158794240,1158794495,US 1158794496,1158799359,BM @@ -12532,7 +13266,11 @@ 1159213056,1159217151,CA 1159217152,1159249919,US 1159249920,1159254015,PR -1159254016,1159269119,US +1159254016,1159262475,US +1159262476,1159262479,SA +1159262480,1159262487,US +1159262488,1159262491,SA +1159262492,1159269119,US 1159269120,1159269375,AR 1159269376,1159274495,US 1159274496,1159274751,GB @@ -12546,7 +13284,11 @@ 1159348224,1159356415,CA 1159356416,1159421951,US 1159421952,1159430143,CA -1159430144,1159512575,US +1159430144,1159480063,US +1159480064,1159480319,CA +1159480320,1159483903,US +1159483904,1159484415,CA +1159484416,1159512575,US 1159512576,1159512831,CA 1159512832,1159513599,US 1159513600,1159514879,CA @@ -12566,7 +13308,9 @@ 1159519744,1159520255,CA 1159520256,1159521535,US 1159521536,1159521791,CA -1159521792,1159522815,US +1159521792,1159522223,US +1159522224,1159522239,CA +1159522240,1159522815,US 1159522816,1159523071,CA 1159523072,1159523583,US 1159523584,1159524351,CA @@ -12574,20 +13318,22 @@ 1159525376,1159526399,CA 1159526400,1159527935,US 1159527936,1159528191,CA -1159528192,1159694591,US +1159528192,1159668479,US +1159668480,1159668735,CA +1159668736,1159694591,US 1159694592,1159694847,CA 1159694848,1159700479,US 1159700480,1159725055,CA 1159725056,1160011775,US 1160011776,1160019967,CA -1160019968,1160202239,US -1160202240,1160202495,CA -1160202496,1160364031,US +1160019968,1160364031,US 1160364032,1160368127,CA 1160368128,1160373247,US 1160373248,1160373503,AE 1160373504,1160392703,US -1160392704,1160396799,CA +1160392704,1160393215,CA +1160393216,1160393727,US +1160393728,1160396799,CA 1160396800,1160405759,US 1160405760,1160406015,DO 1160406016,1160406319,US @@ -12615,9 +13361,7 @@ 1160610816,1160665599,US 1160665600,1160665855,CH 1160665856,1160667135,US -1160667136,1160667903,CA -1160667904,1160668159,US -1160668160,1160675327,CA +1160667136,1160675327,CA 1160675328,1160678399,US 1160678400,1160678655,MX 1160678656,1160683519,US @@ -12669,23 +13413,19 @@ 1161428224,1161428991,KN 1161428992,1161429247,US 1161429248,1161429503,CA -1161429504,1161429759,US -1161429760,1161431039,CA +1161429504,1161429951,US +1161429952,1161430015,CA +1161430016,1161430783,US +1161430784,1161431039,CA 1161431040,1161433087,US 1161433088,1161437183,CA 1161437184,1161453567,US 1161453568,1161457663,CA 1161457664,1161576447,US -1161576448,1161578111,CA -1161578112,1161578239,US -1161578240,1161580543,CA -1161580544,1161586687,US -1161586688,1161586943,PA -1161586944,1161617407,US +1161576448,1161580543,CA +1161580544,1161617407,US 1161617408,1161625599,CA -1161625600,1161627703,US -1161627704,1161627711,DE -1161627712,1161631623,US +1161625600,1161631623,US 1161631624,1161631631,KW 1161631632,1161649407,US 1161649408,1161649663,AR @@ -12698,7 +13438,11 @@ 1161830426,1161830426,UA 1161830427,1161830596,US 1161830597,1161830597,UA -1161830598,1161831384,US +1161830598,1161831090,US +1161831091,1161831091,DE +1161831092,1161831305,US +1161831306,1161831306,DE +1161831307,1161831384,US 1161831385,1161831385,UA 1161831386,1161832483,US 1161832484,1161832484,UA @@ -12706,7 +13450,9 @@ 1161835226,1161835226,UA 1161835227,1161835230,US 1161835231,1161835231,PH -1161835232,1161837567,US +1161835232,1161835338,US +1161835339,1161835339,DE +1161835340,1161837567,US 1161837568,1161837823,JP 1161837824,1161885695,US 1161885696,1161886207,JP @@ -12795,9 +13541,7 @@ 1163472896,1163479295,US 1163479296,1163479551,CA 1163479552,1163526143,US -1163526144,1163526399,CA -1163526400,1163526655,US -1163526656,1163526911,CA +1163526144,1163526911,CA 1163526912,1163527167,US 1163527168,1163527679,CA 1163527680,1163527935,US @@ -12821,8 +13565,8 @@ 1163540480,1163540735,US 1163540736,1163541503,CA 1163541504,1163542015,US -1163542016,1163542783,CA -1163542784,1163543295,US +1163542016,1163542527,CA +1163542528,1163543295,US 1163543296,1163543551,CA 1163543552,1163544063,US 1163544064,1163544319,CA @@ -12889,7 +13633,9 @@ 1163580928,1163581183,CA 1163581184,1163581695,US 1163581696,1163581951,CA -1163581952,1163582031,US +1163581952,1163582003,US +1163582004,1163582007,CA +1163582008,1163582031,US 1163582032,1163582039,CA 1163582040,1163582079,US 1163582080,1163582111,CA @@ -12921,8 +13667,14 @@ 1168393664,1168393983,CA 1168393984,1168394143,US 1168394144,1168394151,CA -1168394152,1168394239,US -1168394240,1168394495,CA +1168394152,1168394279,US +1168394280,1168394303,CA +1168394304,1168394399,US +1168394400,1168394407,CA +1168394408,1168394431,US +1168394432,1168394447,CA +1168394448,1168394479,US +1168394480,1168394495,CA 1168394496,1168394575,US 1168394576,1168394591,CA 1168394592,1168394719,US @@ -12944,7 +13696,8 @@ 1168687104,1168697599,US 1168697600,1168697855,GB 1168697856,1168698111,NL -1168698112,1168727551,US +1168698112,1168698367,GB +1168698368,1168727551,US 1168727552,1168727807,ES 1168727808,1168859135,US 1168859136,1168863231,CA @@ -12997,7 +13750,8 @@ 1169203200,1169211391,CA 1169211392,1170190335,US 1170190336,1170190847,GB -1170190848,1170227199,US +1170190848,1170191103,JP +1170191104,1170227199,US 1170227200,1170231295,NL 1170231296,1170461183,US 1170461184,1170461695,CO @@ -13017,7 +13771,11 @@ 1170522112,1175728639,US 1175728640,1175728895,CA 1175728896,1175977983,US -1175977984,1176502271,CA +1175977984,1176068167,CA +1176068168,1176068175,US +1176068176,1176068191,CA +1176068192,1176068207,US +1176068208,1176502271,CA 1176502272,1176616959,US 1176616960,1176620031,CA 1176620032,1176620447,US @@ -13039,7 +13797,9 @@ 1176702976,1176707071,CA 1176707072,1176731647,US 1176731648,1176735743,PR -1176735744,1176738303,US +1176735744,1176736767,US +1176736768,1176737023,NG +1176737024,1176738303,US 1176738304,1176739071,CO 1176739072,1176739583,US 1176739584,1176739839,CO @@ -13086,13 +13846,13 @@ 1177075456,1177164863,US 1177164864,1177164895,CA 1177164896,1177165055,US -1177165056,1177165311,CA +1177165056,1177165061,CA +1177165062,1177165062,US +1177165063,1177165311,CA 1177165312,1177354239,US -1177354240,1177357311,PR -1177357312,1177357567,US -1177357568,1177405695,PR -1177405696,1177405951,US -1177405952,1177419775,PR +1177354240,1177356799,PR +1177356800,1177357055,US +1177357056,1177419775,PR 1177419776,1177505401,US 1177505402,1177505402,BB 1177505403,1177550847,US @@ -13115,9 +13875,9 @@ 1192468480,1192476671,CA 1192476672,1192488959,US 1192488960,1192493055,CA -1192493056,1207932159,US -1207932160,1207932415,CA -1207932416,1207975935,US +1192493056,1207032703,US +1207032704,1207032831,CA +1207032832,1207975935,US 1207975936,1207980031,CA 1207980032,1208008703,US 1208008704,1208016895,CA @@ -13216,15 +13976,15 @@ 1209867520,1209917439,US 1209917440,1209925631,CA 1209925632,1210253311,US -1210253312,1210258431,CA -1210258432,1210258687,US -1210258688,1210261503,CA +1210253312,1210261503,CA 1210261504,1210420223,US 1210420224,1210420479,IT 1210420480,1210421503,US 1210421504,1210421551,CA 1210421552,1210449919,US -1210449920,1210580991,CA +1210449920,1210554367,CA +1210554368,1210554623,US +1210554624,1210580991,CA 1210580992,1210847231,US 1210851328,1210925055,US 1210925056,1210941439,CA @@ -13296,9 +14056,11 @@ 1224473600,1224474623,US 1224474624,1224475647,GT 1224475648,1224476671,US -1224476672,1224476927,CW -1224476928,1224477183,US -1224477184,1224478719,CW +1224476672,1224476927,SX +1224476928,1224477439,US +1224477440,1224477695,SX +1224477696,1224477951,US +1224477952,1224478719,SX 1224478720,1224480767,US 1224480768,1224484863,JM 1224484864,1224493055,GT @@ -13341,7 +14103,9 @@ 1246923520,1246923775,AU 1246923776,1246937087,US 1246937088,1246945279,CA -1246945280,1247119439,US +1246945280,1247060479,US +1247060480,1247060735,CA +1247060736,1247119439,US 1247119440,1247119447,KW 1247119448,1247119967,US 1247119968,1247119975,KW @@ -13350,7 +14114,9 @@ 1247123712,1247123967,US 1247123968,1247124223,LU 1247124224,1247490047,US -1247494144,1248864255,US +1247494144,1247556640,US +1247556641,1247556641,CA +1247556642,1248864255,US 1248864256,1248866303,CA 1248866304,1248879615,US 1248880640,1248885759,US @@ -13409,7 +14175,9 @@ 1249139712,1249140735,MF 1249140736,1249142015,US 1249142016,1249142271,GB -1249142272,1249163263,US +1249142272,1249146879,US +1249146880,1249147903,CA +1249147904,1249163263,US 1249163264,1249165311,CA 1249165312,1249165823,US 1249165824,1249166335,CA @@ -13437,7 +14205,9 @@ 1249256448,1249257471,CA 1249257472,1249260543,US 1249260544,1249261567,CA -1249261568,1249272831,US +1249261568,1249267711,US +1249267712,1249268735,AF +1249268736,1249272831,US 1249272832,1249273855,CA 1249273856,1249281023,US 1249282048,1249310719,US @@ -13459,7 +14229,6 @@ 1249397760,1249409023,US 1249409024,1249410047,CA 1249410048,1249432575,US -1249433088,1249433343,US 1249433600,1249434623,US 1249434624,1249435647,CA 1249435648,1249449983,US @@ -13496,7 +14265,8 @@ 1249592320,1249593343,CA 1249593344,1249598463,US 1249598464,1249599487,CA -1249599488,1249637887,US +1249599488,1249609983,US +1249611776,1249637887,US 1249637888,1249638143,CA 1249638144,1249710143,US 1249710144,1249710207,CN @@ -13505,19 +14275,23 @@ 1249710592,1249710847,DE 1249710848,1249715711,US 1249715712,1249715967,DE -1249715968,1249716735,US +1249715968,1249716479,US +1249716480,1249716735,TW 1249716736,1249716991,DE -1249716992,1249720319,US -1249720320,1249720511,AU +1249716992,1249718015,US +1249718016,1249718271,BE +1249718272,1249720319,US +1249720320,1249720351,AU +1249720352,1249720367,JP +1249720368,1249720383,SG +1249720384,1249720511,AU 1249720512,1249720527,IN 1249720528,1249720575,AU 1249720576,1249720591,FR 1249720592,1249720599,GB 1249720600,1249720607,IT 1249720608,1249720831,GB -1249720832,1249721119,US -1249721120,1249721135,CA -1249721136,1249721343,US +1249720832,1249721343,US 1249721344,1249721351,AT 1249721352,1249721359,BE 1249721360,1249721367,CH @@ -13539,7 +14313,8 @@ 1249721512,1249721519,TR 1249721520,1249721527,ZA 1249721528,1249721535,DK -1249721536,1249721543,US +1249721536,1249721539,PL +1249721540,1249721543,US 1249721544,1249721551,GB 1249721552,1249721599,US 1249721600,1249721607,AT @@ -13568,9 +14343,16 @@ 1249721792,1249721799,KE 1249721800,1249721807,TR 1249721808,1249721815,ZA -1249721816,1249722111,US +1249721816,1249721833,US +1249721834,1249721835,GB +1249721836,1249722111,US 1249722112,1249722367,IN -1249722368,1249725439,US +1249722368,1249724671,US +1249724672,1249724694,BE +1249724695,1249724695,US +1249724696,1249724927,BE +1249724928,1249725183,FI +1249725184,1249725439,US 1249725440,1249725695,NL 1249725696,1249725951,US 1249725952,1249726207,NL @@ -13578,9 +14360,15 @@ 1249728000,1249728255,HU 1249728256,1249744895,US 1249744896,1249745151,TW -1249745152,1249754390,US +1249745152,1249752319,US +1249752320,1249752575,BE +1249752576,1249754111,US +1249754112,1249754367,IE +1249754368,1249754390,US 1249754391,1249754391,DE -1249754392,1249796095,US +1249754392,1249754623,US +1249754624,1249754879,SG +1249754880,1249796095,US 1249796096,1249804287,CA 1249804288,1249851903,US 1249851904,1249852159,FR @@ -13597,7 +14385,9 @@ 1254704640,1254978751,US 1254978752,1254978767,LB 1254978768,1254989823,US -1254989824,1254998015,CA +1254989824,1254990335,CA +1254990336,1254990591,US +1254990592,1254998015,CA 1254998016,1255002111,US 1255002112,1255006207,CA 1255006208,1255011583,US @@ -13622,7 +14412,9 @@ 1255514112,1255522303,CA 1255522304,1255571455,US 1255571456,1255579647,CA -1255579648,1255669759,US +1255579648,1255588351,US +1255588352,1255588607,NL +1255588608,1255669759,US 1255669760,1255735295,CA 1255735296,1255770367,US 1255770368,1255770623,CA @@ -13643,8 +14435,8 @@ 1262783744,1262783871,US 1262783872,1262783999,CA 1262784000,1262784127,US -1262784128,1262784255,CA -1262784256,1263271423,US +1262784128,1262784511,CA +1262784512,1263271423,US 1263271424,1263271679,CA 1263271680,1264717823,US 1264717824,1264718079,CA @@ -13658,11 +14450,17 @@ 1264763648,1264766975,CA 1264766976,1264990975,US 1264990976,1264991231,NL -1264991232,1266147327,US +1264991232,1264991311,US +1264991312,1264991319,JP +1264991320,1266147327,US 1266147328,1266155519,CA 1266155520,1267934968,US 1267934969,1267934969,CA -1267934970,1268252671,US +1267934970,1268152737,US +1268152738,1268152738,CA +1268152739,1268200732,US +1268200733,1268200733,VI +1268200734,1268252671,US 1268252672,1268776959,CA 1268776960,1275600895,US 1275600896,1275604991,BM @@ -13692,8 +14490,8 @@ 1279262720,1279787007,CA 1279787008,1279848447,US 1279848448,1279851519,PR -1279851520,1279852031,VI -1279852032,1279852543,PR +1279851520,1279851775,VI +1279851776,1279852543,PR 1279852544,1279950847,US 1279950848,1279951103,CA 1279951104,1279951231,US @@ -13702,7 +14500,9 @@ 1279952384,1279952895,CA 1279952896,1279953151,US 1279953152,1279953663,CA -1279953664,1279959551,US +1279953664,1279953759,US +1279953760,1279953791,CA +1279953792,1279959551,US 1279959552,1279959807,CA 1279959808,1279960479,US 1279960480,1279960511,CA @@ -13757,9 +14557,12 @@ 1280097280,1280097791,LC 1280097792,1280098303,AG 1280098304,1280102399,PR -1280102400,1280131071,US +1280102400,1280126975,US +1280126976,1280131071,JP 1280131072,1280139263,CA -1280139264,1291845631,US +1280139264,1285866305,US +1285866306,1285866306,GB +1285866307,1291845631,US 1291845632,1292894207,DE 1292894208,1293156351,NO 1293156352,1293549567,DE @@ -13811,7 +14614,9 @@ 1296236672,1296236799,US 1296236800,1296237439,FR 1296237440,1296237567,IT -1296237568,1296238591,FR +1296237568,1296237823,FR +1296237824,1296237824,GB +1296237825,1296238591,FR 1296238592,1296239103,NL 1296239104,1296239231,FR 1296239232,1296239359,NL @@ -13833,7 +14638,9 @@ 1296247296,1296248959,FR 1296248960,1296249023,DE 1296249024,1296249087,GB -1296249088,1296250367,FR +1296249088,1296249279,FR +1296249280,1296249343,DE +1296249344,1296250367,FR 1296250368,1296250399,CZ 1296250400,1296250431,DE 1296250432,1296250463,PL @@ -13868,7 +14675,8 @@ 1296256848,1296258303,FR 1296258304,1296259071,NL 1296259072,1296259839,FR -1296259840,1296260351,NL +1296259840,1296260095,NL +1296260096,1296260351,US 1296260352,1296261119,FR 1296261120,1296262143,DE 1296262144,1296262399,FR @@ -13889,13 +14697,11 @@ 1296367616,1296400383,GR 1296400384,1296433151,BH 1296433152,1296465919,BG -1296465920,1296470015,LT -1296470016,1296473087,NO -1296473088,1296475135,LT -1296475136,1296476159,US -1296476160,1296479743,LT +1296465920,1296474111,FR +1296474112,1296476159,US +1296476160,1296479743,FR 1296479744,1296482303,NO -1296482304,1296498687,LT +1296482304,1296498687,FR 1296498688,1296531455,BG 1296531456,1296564223,MT 1296564224,1296566271,GB @@ -13952,7 +14758,9 @@ 1296677640,1296677647,NG 1296677648,1296677727,JE 1296677728,1296677735,NG -1296677736,1296678903,JE +1296677736,1296678791,JE +1296678792,1296678799,NG +1296678800,1296678903,JE 1296678904,1296678911,NG 1296678912,1296680959,SA 1296680960,1296683007,ES @@ -14038,9 +14846,17 @@ 1297072128,1297088511,PL 1297088512,1297121279,AT 1297121280,1297154047,SE -1297154048,1297178623,RO +1297154048,1297173503,RO +1297173504,1297173759,IR +1297173760,1297173775,IQ +1297173776,1297175551,IR +1297175552,1297178623,RO 1297178624,1297178879,NL -1297178880,1297215487,RO +1297178880,1297182719,RO +1297182720,1297184767,ES +1297184768,1297203199,RO +1297203200,1297211391,IR +1297211392,1297215487,RO 1297215488,1297217535,NL 1297217536,1297219583,RO 1297219584,1297285119,RU @@ -14161,7 +14977,7 @@ 1298137088,1298661375,GB 1298661376,1298677759,FR 1298677760,1298694143,IR -1298694144,1298710527,RO +1298694144,1298710527,BG 1298710528,1298726911,CZ 1298726912,1298743295,RS 1298743296,1298759679,FI @@ -14199,22 +15015,21 @@ 1299120128,1299136511,SI 1299136512,1299169279,HU 1299169280,1299174399,FR -1299174400,1299176447,GB -1299176448,1299177471,FR -1299177472,1299179519,DE -1299179520,1299185663,FR +1299174400,1299178495,GB +1299178496,1299185663,FR 1299185664,1299447807,PL 1299447808,1299709951,AT 1299709952,1299972095,UA 1299972096,1300234239,IL 1300234240,1302331391,FR -1302331392,1303379967,NL +1302331392,1303359999,NL +1303360000,1303360255,DE +1303360256,1303379967,NL 1303379968,1304428543,DE 1304428544,1305477119,FR 1305477120,1305739263,ES 1305739264,1306001407,DK -1306001408,1306132479,RU -1306132480,1306198015,SE +1306001408,1306198015,SE 1306198016,1306206207,LV 1306206208,1306214399,HR 1306214400,1306222591,LT @@ -14342,10 +15157,8 @@ 1307623424,1307627519,FR 1307627520,1307631615,SE 1307631616,1307635711,IT -1307635712,1307636991,EE -1307636992,1307637247,LV -1307637248,1307637503,EE -1307637504,1307637759,LV +1307635712,1307636735,EE +1307636736,1307637759,LV 1307637760,1307639807,LT 1307639808,1307643903,IT 1307643904,1307652095,RU @@ -14374,9 +15187,9 @@ 1307742208,1307746303,HU 1307746304,1307750399,UA 1307750400,1307754495,IT -1307754496,1307757289,GB -1307757290,1307757293,FR -1307757294,1307758591,GB +1307754496,1307757055,GB +1307757056,1307757311,FR +1307757312,1307758591,GB 1307758592,1307762687,SM 1307762688,1307766783,PL 1307766784,1307770879,GB @@ -14389,6 +15202,7 @@ 1307807744,1307811839,SE 1307811840,1307815935,NL 1307816192,1307816447,GB +1307817286,1307817286,DE 1307817984,1307818048,GB 1307818049,1307818049,BE 1307818050,1307818239,GB @@ -14423,7 +15237,7 @@ 1307926528,1307930623,KZ 1307930624,1307934719,RU 1307934720,1307938815,FR -1307938816,1307942911,US +1307938816,1307942911,TR 1307942912,1307947007,RU 1307947008,1307951103,CH 1307951104,1307959295,RU @@ -14469,7 +15283,11 @@ 1308360704,1308622847,PL 1308622848,1308884991,HR 1308884992,1309147135,IT -1309147136,1309409279,PL +1309147136,1309154303,PL +1309154304,1309154815,DE +1309154816,1309203967,PL +1309203968,1309204479,DE +1309204480,1309409279,PL 1309409280,1309671423,IT 1309671424,1309933567,IE 1309933568,1310195711,BE @@ -14521,19 +15339,7 @@ 1310588928,1310605311,RU 1310605312,1310621695,PL 1310621696,1310638079,RS -1310638080,1310639615,RU -1310639616,1310639871,UA -1310639872,1310640639,RU -1310640640,1310641407,UA -1310641408,1310642175,RU -1310642176,1310642431,UA -1310642432,1310643711,RU -1310643712,1310644223,UA -1310644224,1310648063,RU -1310648064,1310648319,UA -1310648320,1310650623,RU -1310650624,1310650879,UA -1310650880,1310656511,RU +1310638080,1310656511,RU 1310656512,1310657535,GB 1310657536,1310658559,SE 1310658560,1310660607,RU @@ -14583,9 +15389,7 @@ 1311250432,1311252479,RU 1311252480,1311253447,GB 1311253448,1311253455,IT -1311253456,1311254447,GB -1311254448,1311254455,IT -1311254456,1311254527,GB +1311253456,1311254527,GB 1311254528,1311256575,SE 1311256576,1311258623,FR 1311258624,1311262719,GB @@ -14611,11 +15415,13 @@ 1311301632,1311303679,TR 1311303680,1311307775,GB 1311307776,1311309823,IS -1311309824,1311310591,GB -1311310592,1311310847,GG +1311309824,1311310335,GB +1311310336,1311310847,GG 1311310848,1311310857,GB 1311310858,1311310858,GG -1311310859,1311311871,GB +1311310859,1311311103,GB +1311311104,1311311359,GG +1311311360,1311311871,GB 1311311872,1311315967,CZ 1311315968,1311318015,PL 1311318016,1311320063,RU @@ -14646,9 +15452,11 @@ 1311506432,1311637503,CZ 1311637504,1312292863,DE 1312292864,1312817151,LT -1312817152,1313183103,SE -1313183104,1313183231,DK -1313183232,1313865727,SE +1312817152,1313144959,SE +1313144960,1313145087,DK +1313145088,1313391615,SE +1313391616,1313391871,DK +1313391872,1313865727,SE 1313865728,1313931263,CZ 1313931264,1313996799,RU 1313996800,1314062335,SE @@ -14664,7 +15472,8 @@ 1314652160,1314717695,HU 1314717696,1314783231,SA 1314783232,1314848767,DE -1314848768,1315045375,RO +1314848768,1314914303,SA +1314914304,1315045375,RO 1315045376,1315176447,SK 1315176448,1315307519,QA 1315307520,1315438591,CZ @@ -14682,10 +15491,9 @@ 1315741696,1315745791,LB 1315745792,1315749887,CZ 1315749888,1315753983,RU -1315758080,1315758847,RE -1315758848,1315760639,FR -1315760640,1315760895,RE -1315760896,1315761407,FR +1315758080,1315760383,FR +1315760384,1315761151,RE +1315761152,1315761407,FR 1315761408,1315761663,RE 1315761664,1315761919,FR 1315761920,1315762175,RE @@ -14723,7 +15531,7 @@ 1315893248,1315897343,RU 1315897344,1315901439,IR 1315901440,1315905535,UA -1315905536,1315909631,SI +1315905536,1315909631,BA 1315909632,1315913727,AZ 1315913728,1315917823,DE 1315917824,1315921919,RU @@ -14771,7 +15579,9 @@ 1317636096,1317637119,IE 1317637120,1317642239,GB 1317642240,1317642495,IE -1317642496,1317646551,GB +1317642496,1317643316,GB +1317643317,1317643317,IE +1317643318,1317646551,GB 1317646552,1317646559,IE 1317646560,1317647015,GB 1317647016,1317647023,IE @@ -14790,7 +15600,9 @@ 1317765120,1317781503,GE 1317781504,1317814271,RU 1317814272,1317830655,DE -1317830656,1317847039,NL +1317830656,1317831167,NL +1317831168,1317831423,RU +1317831424,1317847039,NL 1317847040,1317863423,RU 1317863424,1317879807,GB 1317879808,1317896191,SK @@ -14819,10 +15631,7 @@ 1318682624,1318690815,RU 1318690816,1318699007,DK 1318699008,1318707199,IE -1318707200,1318707455,FR -1318707456,1318713023,GB -1318713024,1318713087,FR -1318713088,1318715391,GB +1318707200,1318715391,FR 1318715392,1318723583,BG 1318723584,1318731775,IR 1318731776,1318739967,PL @@ -14845,7 +15654,9 @@ 1318871040,1318879231,DK 1318879232,1318887423,CZ 1318887424,1318895615,PL -1318895616,1318903807,DK +1318895616,1318900735,DK +1318900736,1318900991,SE +1318900992,1318903807,DK 1318903808,1318911999,RU 1318912000,1318920191,MK 1318920192,1318928383,IR @@ -14900,8 +15711,7 @@ 1331836928,1331838975,FR 1331838976,1331841023,ES 1331841024,1331843071,CZ -1331843072,1331844863,GB -1331844864,1331845119,FR +1331843072,1331845119,GB 1331845120,1331847167,RU 1331847168,1331849215,FR 1331849216,1331851263,BG @@ -14913,7 +15723,6 @@ 1331861504,1331863551,CZ 1331863552,1331865599,GB 1331865600,1331869695,NL -1331869696,1331871743,SA 1331871744,1331873791,DK 1331873792,1331877887,RU 1331877888,1331879935,ES @@ -14942,12 +15751,17 @@ 1331931136,1331933183,SE 1331933184,1331935231,TR 1331935232,1331937279,NL -1331937280,1331939327,GB +1331937280,1331938063,NG +1331938064,1331938079,GB +1331938080,1331938431,NG +1331938432,1331938559,GB +1331938560,1331939071,NG +1331939072,1331939327,GB 1331939328,1331941375,BE 1331941376,1331943423,ES 1331943424,1331945471,RU 1331945472,1331947519,SE -1331947520,1331949567,CH +1331947520,1331949567,DE 1331949568,1331951615,RU 1331951616,1331953663,GE 1331953664,1332019199,BG @@ -15037,15 +15851,28 @@ 1334479360,1334479871,SE 1334479872,1334480639,DK 1334480640,1334484991,SE -1334484992,1334487039,DK +1334484992,1334485503,DK +1334485504,1334485759,SE +1334485760,1334486015,DK +1334486016,1334486527,SE +1334486528,1334487039,DK 1334487040,1334487295,SE -1334487296,1334489087,DK +1334487296,1334487551,DK +1334487552,1334487807,SE +1334487808,1334489087,DK 1334489088,1334501631,SE -1334501632,1334508031,DK -1334508032,1334508415,SE -1334508416,1334509055,DK -1334509056,1334509311,SE -1334509312,1334509567,DK +1334501632,1334501887,DK +1334501888,1334502143,SE +1334502144,1334502911,DK +1334502912,1334503423,SE +1334503424,1334505855,DK +1334505856,1334506239,SE +1334506240,1334507007,DK +1334507008,1334507519,SE +1334507520,1334508031,DK +1334508032,1334508543,SE +1334508544,1334508799,DK +1334508800,1334509567,SE 1334509568,1334542335,PL 1334542336,1334575103,RU 1334575104,1334579199,UA @@ -15059,7 +15886,9 @@ 1334611968,1334616063,ME 1334616064,1334620159,MD 1334620160,1334624255,DE -1334624256,1334628351,GB +1334624256,1334625791,GB +1334625792,1334626047,AU +1334626048,1334628351,GB 1334628352,1334632447,IE 1334632448,1334636543,KZ 1334636544,1334640639,RU @@ -15078,8 +15907,8 @@ 1334681856,1334682111,GB 1334682112,1334682367,IE 1334682368,1334682623,FR -1334682624,1334683135,DE -1334683136,1334683391,GB +1334682624,1334683135,GB +1334683136,1334683391,CZ 1334683392,1334683647,CH 1334683648,1334683903,GB 1334683904,1334684031,DE @@ -15108,7 +15937,9 @@ 1334724352,1334724863,US 1334724864,1334725631,NL 1334725632,1334725887,SE -1334725888,1334726143,NL +1334725888,1334725900,NL +1334725901,1334725901,SE +1334725902,1334726143,NL 1334726144,1334726399,LU 1334726400,1334726655,SE 1334726656,1334734847,RU @@ -15179,14 +16010,14 @@ 1336619008,1336621055,AL 1336621056,1336623103,DE 1336623104,1336625151,BE -1336625152,1336626286,GB +1336625152,1336625407,IE +1336625408,1336626286,GB 1336626287,1336626287,IE 1336626288,1336627199,GB 1336627200,1336629247,NO 1336629248,1336631295,DE 1336631296,1336633343,IS -1336633344,1336634879,ES -1336634880,1336635391,PT +1336633344,1336635391,PT 1336635392,1336637439,RU 1336637440,1336639487,UA 1336639488,1336643583,HU @@ -15227,111 +16058,78 @@ 1336934400,1337241562,IL 1337241563,1337241563,RO 1337241564,1337458687,IL -1337458688,1337982975,PL +1337458688,1337516031,PL +1337516032,1337516287,DE +1337516288,1337631231,PL +1337631232,1337631487,DE +1337631488,1337982975,PL 1337982976,1342177279,DE 1342177280,1342628207,GB 1342628208,1342628223,IE 1342628224,1342701567,GB -1342701568,1342704127,MQ -1342704128,1342704383,FR -1342704384,1342704895,MQ -1342704896,1342705151,FR -1342705152,1342705919,MQ -1342705920,1342706175,FR -1342706176,1342707711,MQ -1342707712,1342707967,FR -1342707968,1342708223,MQ -1342708224,1342708479,FR -1342708480,1342708735,MQ -1342708736,1342708991,FR -1342708992,1342711807,MQ -1342711808,1342712063,FR -1342712064,1342716159,MQ -1342716160,1342716415,FR -1342716416,1342716927,MQ -1342716928,1342717183,FR -1342717184,1342717951,MQ -1342717952,1342718207,GP -1342718208,1342718463,FR -1342718464,1342719231,GP -1342719232,1342719487,FR -1342719488,1342720255,GP -1342720256,1342720511,FR -1342720512,1342720767,GP -1342720768,1342721023,FR -1342721024,1342722303,GP -1342722304,1342722559,FR -1342722560,1342723071,GP -1342723072,1342723327,FR -1342723328,1342724095,GP -1342724096,1342724351,FR -1342724352,1342725375,GP -1342725376,1342725631,FR -1342725632,1342727423,GP -1342727424,1342727679,FR -1342727680,1342729215,GP -1342729216,1342729471,FR -1342729472,1342729727,GP -1342729728,1342729983,FR -1342729984,1342733823,GP -1342733824,1342734079,FR -1342734080,1342734335,GP -1342734336,1342734847,RE -1342734848,1342735103,FR -1342735104,1342736639,RE -1342736640,1342736895,FR -1342736896,1342738175,RE -1342738176,1342738687,FR -1342738688,1342739199,RE -1342739200,1342739455,FR -1342739456,1342741503,RE -1342741504,1342742015,FR -1342742016,1342742271,RE -1342742272,1342742783,FR -1342742784,1342743039,RE -1342743040,1342743295,FR -1342743296,1342743807,RE -1342743808,1342744063,FR -1342744064,1342749695,RE -1342749696,1342750207,FR -1342750208,1342753023,RE -1342753024,1342753279,FR -1342753280,1342756351,RE -1342756352,1342757119,FR -1342757120,1342757887,RE -1342757888,1342758399,FR -1342758400,1342759167,RE -1342759168,1342759423,FR -1342759424,1342760447,RE -1342760448,1342760703,FR -1342760704,1342763519,RE -1342763520,1342763775,FR -1342763776,1342764031,RE -1342764032,1342764287,FR -1342764288,1342766079,RE -1342766080,1342766847,FR -1342766848,1342767103,RE -1342767104,1342988287,FR +1342701568,1342750719,RE +1342750720,1342751999,FR +1342752000,1342752255,RE +1342752256,1342753023,FR +1342753024,1342753279,YT +1342753280,1342754047,FR +1342754048,1342754303,RE +1342754304,1342755583,FR +1342755584,1342756095,RE +1342756096,1342759679,FR +1342759680,1342759935,RE +1342759936,1342760703,FR +1342760704,1342760959,RE +1342760960,1342763007,FR +1342763008,1342763263,YT +1342763264,1342765055,FR +1342765056,1342765311,RE +1342765312,1342988287,FR 1342988288,1342989055,US -1342989056,1342996479,FR -1342996480,1343000575,GF -1343000576,1343001087,FR -1343001088,1343001855,GF -1343001856,1343002111,FR -1343002112,1343005695,GF -1343005696,1343005951,FR -1343005952,1343012863,GF +1342989056,1342996991,FR +1342996992,1342997247,GF +1342997248,1342997759,FR +1342997760,1342999551,GF +1342999552,1343000575,FR +1343000576,1343001087,GF +1343001088,1343001599,FR +1343001600,1343002367,GF +1343002368,1343002879,FR +1343002880,1343003135,GF +1343003136,1343003391,FR +1343003392,1343004159,GF +1343004160,1343004671,FR +1343004672,1343004927,GF +1343004928,1343005439,FR +1343005440,1343007231,GF +1343007232,1343007487,FR +1343007488,1343007999,GF +1343008000,1343008255,FR +1343008256,1343008511,GF +1343008512,1343008767,FR +1343008768,1343009023,GF +1343009024,1343010047,FR +1343010048,1343010303,GF +1343010304,1343010815,FR +1343010816,1343011071,GF +1343011072,1343011583,FR +1343011584,1343012095,GF +1343012096,1343012607,FR +1343012608,1343012863,GF 1343012864,1343017983,FR 1343017984,1343018495,RE 1343018496,1343025151,FR 1343025152,1343025663,RE -1343025664,1343220479,FR +1343025664,1343218687,FR +1343218688,1343219711,DE +1343219712,1343220479,FR 1343220480,1343220671,DE 1343220672,1343220735,FR 1343220736,1343220863,GB 1343220864,1343221055,FR 1343221056,1343221119,GB -1343221120,1343221759,FR +1343221120,1343221247,DE +1343221248,1343221759,FR 1343221760,1343222271,GB 1343222272,1343223679,FR 1343223680,1343223687,LB @@ -15398,6 +16196,7 @@ 1346589696,1346592767,US 1346592768,1346596863,ES 1346596864,1346600959,IT +1346600960,1346605055,MU 1346605056,1346609151,CH 1346609152,1346617343,FR 1346617344,1346621439,SE @@ -15425,12 +16224,7 @@ 1346740224,1346744319,FI 1346744320,1346748415,RU 1346748416,1346752511,DE -1346752512,1346753023,RE -1346753024,1346753791,FR -1346753792,1346754303,RE -1346754304,1346754559,FR -1346754560,1346755071,RE -1346755072,1346755583,FR +1346752512,1346755583,FR 1346755584,1346756095,RE 1346756096,1346756607,FR 1346756608,1346760703,SE @@ -15726,31 +16520,27 @@ 1347295217,1347295223,US 1347295224,1347295224,AO 1347295225,1347295232,NG -1347295233,1347295744,SE -1347295745,1347295745,US -1347295746,1347295748,SE -1347295749,1347295752,US +1347295233,1347295743,SE +1347295744,1347295752,US 1347295753,1347295755,BW -1347295756,1347295759,SE +1347295756,1347295759,US 1347295760,1347295775,BW 1347295776,1347295776,IQ 1347295777,1347295784,HU 1347295785,1347295791,LB -1347295792,1347295816,SE +1347295792,1347295816,US 1347295817,1347295824,OM 1347295825,1347295832,GH 1347295833,1347295840,FR 1347295841,1347295848,NG 1347295849,1347295852,LS -1347295853,1347295856,SE +1347295853,1347295856,US 1347295857,1347295864,NG -1347295865,1347295928,SE +1347295865,1347295928,US 1347295929,1347295936,NG 1347295937,1347295976,US 1347295977,1347295984,LS -1347295985,1347295992,US -1347295993,1347295999,SE -1347296000,1347296007,US +1347295985,1347296007,US 1347296008,1347296008,SE 1347296009,1347296032,US 1347296033,1347296040,SE @@ -15782,9 +16572,7 @@ 1347305472,1347309567,AL 1347309568,1347313663,DE 1347313664,1347321855,RU -1347325952,1347327743,CZ -1347327744,1347327999,SK -1347328000,1347330047,CZ +1347325952,1347330047,CZ 1347330048,1347338239,DE 1347338240,1347342335,RU 1347342336,1347346431,SE @@ -15888,8 +16676,7 @@ 1347755160,1347755175,GR 1347755176,1347756031,CY 1347756032,1347760127,NL -1347760128,1347762175,CZ -1347762176,1347764223,HU +1347760128,1347764223,HU 1347764224,1347772415,GB 1347772416,1347776511,MT 1347776512,1347780607,SE @@ -15910,8 +16697,10 @@ 1347837952,1347846143,RO 1347846144,1347850239,NO 1347850240,1347854335,IT -1347854336,1347854847,DE +1347854336,1347854591,DE +1347854600,1347854607,DE 1347857408,1347858431,DE +1347858752,1347858815,DE 1347862090,1347862090,DE 1347862272,1347862527,DE 1347862528,1347866623,CH @@ -16056,53 +16845,31 @@ 1348861952,1348993023,ES 1348993024,1349124095,IT 1349124096,1349255167,GR -1349255168,1349400575,AT -1349400576,1349401087,DE -1349401088,1349451775,AT +1349255168,1349451775,AT 1349451776,1349517311,IE 1349517312,1349763071,NL 1349763072,1349771263,RU 1349771264,1349779455,NL 1349779456,1349910527,IT 1349910528,1350041599,FR -1350041600,1350067575,AT -1350067576,1350067579,CH -1350067580,1350110335,AT -1350110336,1350110463,DE -1350110464,1350140927,AT -1350140928,1350141055,CH -1350141056,1350166015,AT -1350166016,1350166271,SK -1350166272,1350188543,AT -1350188544,1350188799,DE -1350188800,1350195231,AT -1350195232,1350195235,DE -1350195236,1350215679,AT +1350041600,1350215679,AT 1350215680,1350215935,IQ 1350215936,1350216959,AT 1350216960,1350217215,IQ 1350217216,1350217471,AT 1350217472,1350217727,IQ -1350217728,1350230015,AT -1350230016,1350230271,DE -1350230272,1350251007,AT -1350251008,1350251263,HU -1350251264,1350259447,AT -1350259448,1350259451,CZ -1350259452,1350290223,AT -1350290224,1350290227,CH -1350290228,1350303743,AT +1350217728,1350303743,AT 1350303744,1350434815,FR 1350434816,1350565887,NL 1350565888,1352299775,DE 1352299776,1352300031,US 1352300032,1352412159,DE 1352412160,1352412415,FR -1352412416,1352412799,DE -1352412800,1352412863,GB -1352412864,1352417279,DE +1352412416,1352417279,DE 1352417280,1352418303,SK -1352418304,1352663039,DE +1352418304,1352488959,DE +1352488960,1352491007,FR +1352491008,1352663039,DE 1352663040,1353187327,DK 1353187328,1353262295,GB 1353262296,1353262303,US @@ -16112,11 +16879,11 @@ 1353275248,1353275255,ES 1353275256,1353277439,GB 1353277440,1353279487,CH -1353279488,1353287959,GB +1353279488,1353279583,GB +1353279584,1353279591,IT +1353279592,1353287959,GB 1353287960,1353287967,IE -1353287968,1353288191,GB -1353288192,1353288447,IE -1353288448,1353298687,GB +1353287968,1353298687,GB 1353298688,1353299455,SE 1353299456,1353300079,GB 1353300080,1353300095,SE @@ -16126,9 +16893,7 @@ 1353308160,1353309183,FR 1353309184,1353312447,GB 1353312448,1353312479,CH -1353312480,1353313535,GB -1353313536,1353313791,IE -1353313792,1353315327,GB +1353312480,1353315327,GB 1353315328,1353316351,ES 1353316352,1353318399,GB 1353318400,1353383935,SE @@ -16161,9 +16926,7 @@ 1356070912,1356201983,NO 1356201984,1356333055,FR 1356333056,1356464127,SE -1356464128,1356539775,CH -1356539776,1356539903,DE -1356539904,1356595199,CH +1356464128,1356595199,CH 1356595200,1356857343,FI 1356857344,1356922879,ES 1356922880,1356988415,GB @@ -16173,45 +16936,56 @@ 1357185024,1357250559,GB 1357250560,1357316095,IL 1357317120,1357317375,GB +1357318400,1357318655,FR 1357321024,1357321087,KE 1357321984,1357322239,GB 1357322240,1357322255,DE 1357322496,1357322751,DE +1357322752,1357323007,GB +1357323008,1357323015,CG 1357323520,1357323775,GB 1357323776,1357323779,FI 1357324288,1357325311,GB 1357326336,1357326337,ES 1357327360,1357327615,FR -1357328384,1357328639,GB +1357328384,1357328671,GB +1357328896,1357329159,NL 1357329408,1357329415,BE +1357330944,1357331199,GB 1357335808,1357336063,IT +1357337600,1357337615,NL 1357340672,1357341695,GB 1357342976,1357343231,GB 1357343488,1357343503,GB -1357344260,1357344263,FR +1357344260,1357344271,FR 1357344512,1357344767,FR 1357346816,1357346835,FR 1357346848,1357346863,FR 1357347336,1357347375,FR 1357347456,1357347583,FR -1357347616,1357347647,FR +1357347616,1357347655,FR 1357347840,1357348095,PL 1357348384,1357348415,ES +1357348480,1357348607,ES 1357351168,1357351423,PL 1357359872,1357360383,GB 1357361152,1357363199,GB 1357363200,1357364223,QA 1357364224,1357365247,ES -1357366784,1357366959,FR +1357366784,1357366959,GB 1357366960,1357366967,BE -1357366968,1357366975,FR -1357366976,1357367039,GB +1357366968,1357367039,GB +1357368352,1357368383,NL 1357368576,1357368831,NL +1357371392,1357371647,GB 1357372160,1357372927,GB 1357373468,1357373471,GB 1357373480,1357373483,GB 1357373488,1357373519,GB -1357373952,1357374463,GB +1357373520,1357373535,FI +1357373952,1357374975,GB +1357377536,1357377671,FR +1357377792,1357378047,FR 1357381632,1357414399,NO 1357414400,1357447167,LV 1357447168,1357479935,IE @@ -16232,7 +17006,9 @@ 1357877248,1357877311,DE 1357877376,1357877439,DE 1357879936,1357880063,GB +1357883392,1357883647,FR 1357883648,1357883903,SE +1357885200,1357885215,AT 1357885952,1357886207,SE 1357889024,1357889279,GB 1357889280,1357889535,SE @@ -16241,14 +17017,12 @@ 1357891840,1357892095,GB 1357892608,1357892735,NL 1357892864,1357893119,NL +1357896192,1357896447,DE 1357898752,1357898879,DE 1357899584,1357899615,NL 1357899648,1357899775,GB 1357900416,1357900543,SE -1357902336,1357902365,GB 1357902366,1357902366,NO -1357902367,1357902591,GB -1357902592,1357902847,RU 1357902848,1357903359,GB 1357904896,1357905407,GB 1357905920,1357910015,LT @@ -16281,21 +17055,15 @@ 1357984528,1357984551,IT 1357984552,1357984591,GB 1357984592,1357984599,IT -1357984600,1357984671,GB -1357984672,1357984679,IT -1357984680,1357984831,GB +1357984600,1357984831,GB 1357984832,1357984839,IT 1357984840,1357984911,GB 1357984912,1357984919,IT 1357984920,1357985015,GB 1357985016,1357985023,IT -1357985024,1357985575,GB -1357985576,1357985583,IT -1357985584,1357985791,GB +1357985024,1357985791,GB 1357985792,1357987839,DE -1357987840,1357989631,GB -1357989632,1357989887,FR -1357989888,1357991935,GB +1357987840,1357991935,GB 1357991936,1357996031,NO 1357996032,1358000127,CH 1358000128,1358004223,LI @@ -16329,22 +17097,16 @@ 1358147584,1358151679,GB 1358151680,1358155775,DE 1358155776,1358159871,CH -1358163968,1358164223,FR -1358164224,1358164479,MQ -1358164480,1358164991,FR -1358164992,1358165503,MQ -1358165504,1358166015,FR -1358166016,1358166783,MQ -1358166784,1358167551,FR -1358167552,1358167807,MQ -1358167808,1358168063,FR +1358163968,1358165503,FR +1358165504,1358165759,MQ +1358165760,1358166015,FR +1358166016,1358166527,MQ +1358166528,1358168063,FR 1358168064,1358172159,GB 1358172160,1358176255,CY 1358176256,1358180351,RU 1358180352,1358184447,ES -1358184448,1358186607,SE -1358186608,1358186623,NO -1358186624,1358187775,SE +1358184448,1358187775,SE 1358187776,1358187839,NO 1358187840,1358192639,SE 1358192640,1358196735,HU @@ -16427,9 +17189,7 @@ 1358553088,1358557183,UA 1358557184,1358557951,GB 1358557952,1358558207,IE -1358558208,1358560255,GB -1358560256,1358560511,IE -1358560512,1358561279,GB +1358558208,1358561279,GB 1358561280,1358569471,CZ 1358569472,1358573567,NG 1358573568,1358577663,LV @@ -16453,7 +17213,9 @@ 1358668160,1358668167,PT 1358668168,1358668447,GB 1358668448,1358668455,PT -1358668456,1358670943,GB +1358668456,1358668623,GB +1358668624,1358668631,PT +1358668632,1358670943,GB 1358670944,1358670951,FR 1358670952,1358670975,GB 1358670976,1358670991,PT @@ -16517,13 +17279,10 @@ 1358861568,1358861823,DE 1358861824,1358862335,FR 1358862336,1358862847,US -1358862848,1358862898,GB -1358862899,1358862899,NO -1358862900,1358863359,GB +1358862848,1358863103,DK +1358863104,1358863359,GB 1358863360,1358863615,US -1358863616,1358863903,GB -1358863904,1358863919,SA -1358863920,1358864383,GB +1358863616,1358864383,GB 1358864384,1358872575,CH 1358872576,1358876671,IT 1358876672,1358880767,LV @@ -16586,7 +17345,9 @@ 1359413248,1359429631,DE 1359429632,1359446015,LT 1359446016,1359462399,DK -1359462400,1359467775,DE +1359462400,1359467007,DE +1359467008,1359467263,US +1359467264,1359467775,DE 1359467776,1359468031,US 1359468032,1359470591,DE 1359470592,1359478783,CH @@ -16633,7 +17394,13 @@ 1360113664,1360117759,HU 1360117760,1360121855,FI 1360121856,1360125951,DE -1360125952,1360130047,SI +1360125952,1360127487,SI +1360127488,1360127999,RS +1360128000,1360128511,MK +1360128512,1360128767,ME +1360128768,1360129023,SI +1360129024,1360129535,BA +1360129536,1360130047,SI 1360130048,1360134143,IE 1360134144,1360138239,NL 1360138240,1360142335,CH @@ -16831,9 +17598,7 @@ 1361018880,1361022975,AT 1361022976,1361027071,IT 1361027072,1361035263,IR -1361035264,1361035627,NL 1361035628,1361035631,DZ -1361035632,1361039359,NL 1361039360,1361041407,IE 1361041408,1361042431,NL 1361042432,1361043455,PL @@ -16875,9 +17640,7 @@ 1363410944,1363673087,NL 1363673088,1363935231,IT 1363935232,1364197375,GB -1364197376,1364212991,FR -1364212992,1364213247,GF -1364213248,1364262911,FR +1364197376,1364262911,FR 1364262912,1364328447,IT 1364328448,1364459519,BE 1364459520,1364525055,PT @@ -16950,7 +17713,9 @@ 1364963328,1364967423,RU 1364967424,1364971519,GB 1364971520,1364975615,CZ -1364975616,1364979711,BJ +1364975616,1364979199,BJ +1364979200,1364979455,NG +1364979456,1364979711,BJ 1364979712,1364983039,GB 1364983040,1364983295,CH 1364983296,1364983807,GB @@ -16975,7 +17740,8 @@ 1365044800,1365044927,FR 1365044928,1365044935,GR 1365044936,1365044943,LU -1365044944,1365045247,FR +1365044944,1365044991,FR +1365044992,1365045247,LU 1365045248,1365047295,AT 1365047296,1365049343,SK 1365049344,1365057535,FR @@ -17016,13 +17782,11 @@ 1365218192,1365218199,US 1365218200,1365219167,NL 1365219168,1365219168,GB -1365219169,1365219391,NL -1365219392,1365219407,MY -1365219408,1365219703,NL -1365219704,1365219711,US -1365219712,1365220231,NL +1365219169,1365220231,NL 1365220232,1365220239,IE -1365220240,1365221239,NL +1365220240,1365220503,NL +1365220504,1365220507,IE +1365220508,1365221239,NL 1365221240,1365221247,US 1365221248,1365221375,NL 1365221376,1365225471,GE @@ -17034,7 +17798,11 @@ 1365245952,1366294527,GB 1366294528,1366405831,IT 1366405832,1366405835,SI -1366405836,1367343103,IT +1366405836,1366465791,IT +1366465792,1366465873,NL +1366465874,1366465874,IT +1366465875,1366466047,NL +1366466048,1367343103,IT 1367343104,1369440255,GB 1369440256,1369473023,DE 1369473024,1369505791,HU @@ -17061,7 +17829,8 @@ 1369571328,1369585663,RU 1369585664,1369591807,UA 1369591808,1369595903,SK -1369595904,1369604095,UA +1369595904,1369603839,RU +1369603840,1369604095,UA 1369604096,1369620479,MD 1369620480,1369624575,CZ 1369624576,1369626623,PL @@ -17211,6 +17980,7 @@ 1372698880,1372699391,DE 1372699904,1372700159,DE 1372702720,1372703231,DE +1372703616,1372703743,DE 1372704768,1372713983,DE 1372715008,1372717055,DE 1372717056,1372749823,PL @@ -17226,95 +17996,121 @@ 1373437952,1373503487,CH 1373503488,1373569023,RU 1373569024,1373634559,AT -1373634560,1374683135,SE +1373634560,1373854975,SE +1373854976,1373855180,RU +1373855181,1373855181,SE +1373855182,1373855220,RU +1373855221,1373855221,SE +1373855222,1373855231,RU +1373855232,1374683135,SE 1374683136,1375207423,BE -1375207424,1375207935,FR -1375207936,1375208447,MQ -1375208448,1375208703,GP -1375208704,1375210239,MQ -1375210240,1375210495,GP -1375210496,1375211519,MQ -1375211520,1375211775,GP -1375211776,1375212031,FR -1375212032,1375212799,GP -1375212800,1375213055,FR -1375213056,1375215615,GP -1375215616,1375215871,GF -1375215872,1375216383,FR -1375216384,1375218175,GF -1375218176,1375218687,FR -1375218688,1375219455,GF -1375219456,1375219711,FR -1375219712,1375221247,GF -1375221248,1375221503,FR -1375221504,1375221759,GF -1375221760,1375222783,FR -1375222784,1375223807,GF -1375223808,1375227135,MQ -1375227136,1375227647,FR -1375227648,1375230463,MQ -1375230464,1375230719,FR -1375230720,1375233023,MQ -1375233024,1375233279,FR -1375233280,1375233791,MQ -1375233792,1375235071,FR -1375235072,1375235583,MQ -1375235584,1375236095,FR -1375236096,1375236351,MQ -1375236352,1375236863,FR -1375236864,1375237631,MQ -1375237632,1375237887,FR -1375237888,1375239679,MQ -1375239680,1375239935,FR -1375239936,1375240191,MQ -1375240192,1375240447,FR -1375240448,1375240959,GP -1375240960,1375241215,FR -1375241216,1375241983,GP -1375241984,1375242239,FR +1375207424,1375207679,MQ +1375207680,1375208703,FR +1375208704,1375209215,MQ +1375209216,1375209471,FR +1375209472,1375209983,MQ +1375209984,1375210751,FR +1375210752,1375211519,MQ +1375211520,1375211775,FR +1375211776,1375213311,GP +1375213312,1375213567,FR +1375213568,1375215103,GP +1375215104,1375215359,FR +1375215360,1375215615,GP +1375215616,1375215871,FR +1375215872,1375216127,GF +1375216128,1375217663,FR +1375217664,1375218175,GF +1375218176,1375218431,FR +1375218432,1375219711,GF +1375219712,1375219967,FR +1375219968,1375220479,GF +1375220480,1375220735,FR +1375220736,1375220991,GF +1375220992,1375221247,FR +1375221248,1375221503,GF +1375221504,1375223039,FR +1375223040,1375223551,GF +1375223552,1375224831,FR +1375224832,1375225087,MQ +1375225088,1375225599,FR +1375225600,1375225855,MQ +1375225856,1375226111,FR +1375226112,1375227903,MQ +1375227904,1375228671,FR +1375228672,1375228927,MQ +1375228928,1375229439,FR +1375229440,1375230719,MQ +1375230720,1375231231,FR +1375231232,1375231487,MQ +1375231488,1375231999,FR +1375232000,1375232255,MQ +1375232256,1375233023,FR +1375233024,1375233279,MQ +1375233280,1375233791,FR +1375233792,1375234303,MQ +1375234304,1375236351,FR +1375236352,1375236863,MQ +1375236864,1375237631,FR +1375237632,1375237887,MQ +1375237888,1375239679,FR +1375239680,1375239935,MQ +1375239936,1375240191,FR +1375240192,1375240959,GP +1375240960,1375242239,FR 1375242240,1375242495,MF -1375242496,1375242751,GP -1375242752,1375243263,FR -1375243264,1375245311,GP -1375245312,1375246079,FR -1375246080,1375246335,GP -1375246336,1375246591,FR -1375246592,1375247359,GP -1375247360,1375247615,FR -1375247616,1375249919,GP -1375249920,1375250175,FR -1375250176,1375250431,GP -1375250432,1375251455,FR -1375251456,1375252223,GP -1375252224,1375253247,FR -1375253248,1375253759,GP -1375253760,1375254527,FR -1375254528,1375256063,GP -1375256064,1375256319,FR -1375256320,1375256575,GP +1375242496,1375243263,GP +1375243264,1375243519,FR +1375243520,1375243775,GP +1375243776,1375244031,FR +1375244032,1375244287,GP +1375244288,1375244799,FR +1375244800,1375246591,GP +1375246592,1375246847,FR +1375246848,1375247615,GP +1375247616,1375247871,FR +1375247872,1375248383,GP +1375248384,1375248639,FR +1375248640,1375248895,GP +1375248896,1375249919,FR +1375249920,1375250175,GP +1375250176,1375251967,FR +1375251968,1375252479,GP +1375252480,1375252991,FR +1375252992,1375254015,GP +1375254016,1375254527,FR +1375254528,1375255039,GP +1375255040,1375255295,FR +1375255296,1375255551,GP +1375255552,1375256063,FR +1375256064,1375256575,GP 1375256576,1375257087,RE -1375257088,1375257343,FR -1375257344,1375257855,RE -1375257856,1375258111,FR -1375258112,1375258879,RE -1375258880,1375261183,FR -1375261184,1375261695,RE -1375261696,1375262207,FR -1375262208,1375265535,RE -1375265536,1375266047,FR -1375266048,1375266303,RE -1375266304,1375268095,FR +1375257088,1375257855,FR +1375257856,1375258111,RE +1375258112,1375259135,FR +1375259136,1375259647,RE +1375259648,1375260671,FR +1375260672,1375260927,RE +1375260928,1375261951,FR +1375261952,1375262463,RE +1375262464,1375262719,FR +1375262720,1375263231,RE +1375263232,1375264511,FR +1375264512,1375265279,RE +1375265280,1375265535,FR +1375265536,1375266047,RE +1375266048,1375266559,FR +1375266560,1375267839,RE +1375267840,1375268095,FR 1375268096,1375268351,RE -1375268352,1375268863,FR -1375268864,1375269119,RE -1375269120,1375269631,FR -1375269632,1375270143,RE -1375270144,1375270655,FR -1375270656,1375271423,RE -1375271424,1375271679,FR -1375271680,1375271935,RE -1375271936,1375272191,FR -1375272192,1375272959,RE +1375268352,1375269119,FR +1375269120,1375269631,RE +1375269632,1375270143,FR +1375270144,1375270399,RE +1375270400,1375271167,FR +1375271168,1375272191,RE +1375272192,1375272703,FR +1375272704,1375272959,RE 1375272960,1375731711,FR 1375731712,1378877439,GB 1378877440,1379926015,IT @@ -17340,11 +18136,11 @@ 1382187008,1382203391,ES 1382203392,1382205439,GB 1382213632,1382219775,GB -1382219776,1382222847,SE +1382219776,1382222807,SE +1382222808,1382222815,FI +1382222816,1382222847,SE 1382222848,1382223103,FI -1382223104,1382226943,SE -1382226944,1382227199,NO -1382227200,1382252543,SE +1382223104,1382252543,SE 1382252544,1382268927,CZ 1382268928,1382285311,IR 1382285312,1382301695,CZ @@ -17361,7 +18157,9 @@ 1382465536,1382481919,PS 1382481920,1382498303,AT 1382498304,1382514687,BG -1382514688,1382531071,DK +1382514688,1382518783,DK +1382518784,1382522879,DE +1382522880,1382531071,DK 1382531072,1382547455,FI 1382547456,1382809599,IT 1382809600,1383071743,GB @@ -17396,8 +18194,12 @@ 1383243776,1383251967,YE 1383251968,1383260159,CZ 1383260160,1383268351,RU -1383268352,1383273983,IR -1383273984,1383275775,KW +1383268352,1383272191,IR +1383272192,1383272447,NL +1383272448,1383273983,IR +1383273984,1383274248,KW +1383274249,1383274249,IR +1383274250,1383275775,KW 1383275776,1383276543,IR 1383276544,1383284735,KZ 1383284736,1383292927,PL @@ -17554,11 +18356,7 @@ 1385496576,1385504767,SI 1385504768,1385512959,IT 1385512960,1385521151,DE -1385521152,1385523711,AT -1385523712,1385523967,HU -1385523968,1385524479,AT -1385524480,1385524735,HU -1385524736,1385529343,AT +1385521152,1385529343,AT 1385529344,1385537535,RU 1385537536,1385545727,DE 1385545728,1385553919,RU @@ -17637,6 +18435,7 @@ 1388587520,1388587775,GB 1388588288,1388588543,GB 1388588800,1388589823,GB +1388590080,1388590335,GB 1388591104,1388591359,AU 1388593152,1388601343,RU 1388601344,1388609535,SE @@ -17647,13 +18446,13 @@ 1388642304,1388650495,FI 1388650496,1388658687,PL 1388658688,1388666879,GB -1388666880,1388667135,FR -1388667136,1388667391,RE -1388667392,1388668671,FR -1388668672,1388668927,RE -1388668928,1388669183,FR -1388669184,1388669439,RE -1388669440,1388675071,FR +1388666880,1388671097,FR +1388671098,1388671098,RE +1388671099,1388671763,FR +1388671764,1388671764,RE +1388671765,1388672244,FR +1388672245,1388672245,RE +1388672246,1388675071,FR 1388677632,1388677887,NL 1388678144,1388679167,DE 1388681216,1388683263,DE @@ -17696,11 +18495,13 @@ 1388744760,1388744767,IE 1388744768,1388744831,GB 1388744832,1388744847,IE -1388744848,1388745971,GB +1388744848,1388744959,GB +1388744960,1388745215,IE +1388745216,1388745971,GB 1388745972,1388745975,IE 1388745976,1388746495,GB -1388746496,1388746751,IE -1388746752,1388746911,GB +1388746496,1388746559,IE +1388746560,1388746911,GB 1388746912,1388746927,IE 1388746928,1388748799,GB 1388748800,1388756991,RU @@ -17763,7 +18564,9 @@ 1389477888,1389494271,BY 1389494272,1389510655,DE 1389510656,1389527039,NL -1389527040,1389543423,PL +1389527040,1389528551,RO +1389528552,1389528552,PL +1389528553,1389543423,RO 1389543424,1389576191,DE 1389576192,1389592575,GB 1389592576,1389598719,GE @@ -17780,14 +18583,15 @@ 1389707264,1389723647,IT 1389723648,1389756415,ES 1389756416,1389772799,SE -1389772800,1389783039,SI +1389772800,1389778431,SI +1389778432,1389780991,RS +1389780992,1389783039,HR 1389783040,1389785087,BA 1389785088,1389787135,MK -1389787136,1389789183,SI +1389787136,1389788671,SI +1389788672,1389789183,RS 1389789184,1389805567,PL -1389805568,1389805823,DE -1389805824,1389806079,US -1389806080,1389806591,DE +1389805568,1389806591,DE 1389806592,1389806847,SA 1389806848,1389821951,DE 1389821952,1389838335,NL @@ -17796,9 +18600,7 @@ 1389871104,1389887487,FI 1389887488,1389953023,FR 1389953024,1390018559,NL -1390018560,1390074879,AT -1390074880,1390075135,HU -1390075136,1390084095,AT +1390018560,1390084095,AT 1390084096,1390149631,GB 1390149632,1390215167,CH 1390215168,1390280703,IS @@ -17827,11 +18629,7 @@ 1397071872,1397096447,RU 1397096448,1397227519,IE 1397227520,1397489663,DK -1397489664,1397582847,CH -1397582848,1397583103,DE -1397583104,1397583615,CH -1397583616,1397583871,DE -1397583872,1397751807,CH +1397489664,1397751807,CH 1397751808,1398276095,NL 1398276096,1398800383,DK 1398800384,1398833151,KW @@ -17875,6 +18673,7 @@ 1400713216,1400718335,DE 1400719360,1400721407,DE 1400723456,1400727551,DE +1400727808,1400727935,DE 1400729600,1400730623,DE 1400731648,1400733695,DE 1400897536,1400963071,NL @@ -17947,7 +18746,9 @@ 1401546752,1401548799,IT 1401548800,1401550847,FR 1401550848,1401551103,GB -1401551104,1401552639,JE +1401551104,1401551359,JE +1401551360,1401551615,GB +1401551616,1401552639,JE 1401552640,1401552895,GB 1401552896,1401554943,NL 1401554944,1401556991,IE @@ -17962,7 +18763,11 @@ 1401634816,1401651199,HR 1401651200,1401667583,RU 1401667584,1401683967,IT -1401683968,1401749503,SE +1401683968,1401708287,SE +1401708288,1401708543,DE +1401708544,1401712895,SE +1401712896,1401713151,DE +1401713152,1401749503,SE 1401749504,1401765887,DE 1401765888,1401782271,IE 1401782272,1401815039,FR @@ -18018,6 +18823,7 @@ 1401935872,1401937919,FI 1401937920,1401939967,GB 1401939968,1401942015,UA +1401942784,1401943039,GB 1401944064,1401946111,BG 1401946112,1401962495,FR 1401962496,1401978879,PL @@ -18161,21 +18967,16 @@ 1404215296,1404219391,LV 1404219392,1404220415,SE 1404220416,1404221439,EE -1404221440,1404222463,RU -1404222464,1404225535,SE -1404225536,1404227071,RU -1404227072,1404227583,SE +1404221440,1404227583,SE 1404227584,1404231679,LV 1404231680,1404232191,SE 1404232192,1404232703,NO 1404232704,1404234751,SE 1404234752,1404239871,HR -1404239872,1404256255,SE -1404256256,1404305407,RU +1404239872,1404305407,SE 1404305408,1404313599,EE 1404313600,1404321791,HR -1404321792,1404338175,RU -1404338176,1404340223,SE +1404321792,1404340223,SE 1404340224,1404342271,HR 1404342272,1404379135,SE 1404379136,1404383231,AT @@ -18183,30 +18984,11 @@ 1404385280,1404386047,LT 1404386048,1404387327,SE 1404387328,1404420095,LT -1404420096,1404436479,RU -1404436480,1404444671,SE -1404444672,1404445951,NO -1404445952,1404446207,SE -1404446208,1404446719,NO -1404446720,1404446975,SE -1404446976,1404447999,NO -1404448000,1404448255,SE -1404448256,1404452863,NO +1404420096,1404444671,SE +1404444672,1404452863,NO 1404452864,1404510207,SE -1404510208,1404510975,HR -1404510976,1404511231,SE -1404511232,1404512255,HR -1404512256,1404512767,SE -1404512768,1404513023,HR -1404513024,1404514303,SE -1404514304,1404514559,HR -1404514560,1404514815,SE -1404514816,1404515071,HR -1404515072,1404515327,SE -1404515328,1404515839,HR -1404515840,1404516095,SE -1404516096,1404518143,HR -1404518144,1404522495,SE +1404510208,1404518399,HR +1404518400,1404522495,SE 1404522496,1404526591,LV 1404526592,1404538879,SE 1404538880,1404542975,LV @@ -18215,94 +18997,32 @@ 1404563456,1404567551,SE 1404567552,1404583935,HR 1404583936,1404600319,NO -1404600320,1404678143,SE +1404600320,1404633087,SE +1404633088,1404633599,HR +1404633600,1404633855,SE +1404633856,1404635647,HR +1404635648,1404635903,SE +1404635904,1404637439,HR +1404637440,1404637695,SE +1404637696,1404638207,HR +1404638208,1404638463,SE +1404638464,1404641279,HR +1404641280,1404678143,SE 1404678144,1404680191,HR 1404680192,1404731391,SE -1404731392,1404732159,HR -1404732160,1404732671,SE -1404732672,1404733951,HR -1404733952,1404734207,SE -1404734208,1404736511,HR -1404736512,1404736767,SE -1404736768,1404740095,HR -1404740096,1404740351,SE -1404740352,1404740863,HR -1404740864,1404741119,SE -1404741120,1404742911,HR -1404742912,1404743679,SE -1404743680,1404744959,HR -1404744960,1404745215,SE -1404745216,1404745983,HR -1404745984,1404746495,SE -1404746496,1404748031,HR -1404748032,1404748287,SE -1404748288,1404748799,HR -1404748800,1404749311,SE -1404749312,1404749567,HR -1404749568,1404750079,SE -1404750080,1404752639,HR -1404752640,1404752895,SE -1404752896,1404754943,HR -1404754944,1404755199,SE -1404755200,1404755967,HR -1404755968,1404756223,SE -1404756224,1404756479,HR -1404756480,1404756735,SE -1404756736,1404757247,HR -1404757248,1404757503,SE -1404757504,1404759551,HR -1404759552,1404759807,SE -1404759808,1404760063,HR -1404760064,1404760319,SE -1404760320,1404760831,HR -1404760832,1404761087,SE -1404761088,1404762111,HR -1404762112,1404762367,SE -1404762368,1404762623,HR -1404762624,1404763135,SE -1404763136,1404763647,HR -1404763648,1404763903,SE -1404763904,1404764159,HR +1404731392,1404764159,HR 1404764160,1404780543,NL 1404780544,1404788735,SE -1404788736,1404790527,NL -1404790528,1404790783,SE -1404790784,1404791039,NL -1404791040,1404791295,SE -1404791296,1404791807,NL -1404791808,1404792063,SE -1404792064,1404792575,NL -1404792576,1404792831,SE -1404792832,1404793599,NL -1404793600,1404793855,SE -1404793856,1404795135,NL -1404795136,1404795391,SE -1404795392,1404795647,NL -1404795648,1404795903,SE -1404795904,1404796927,NL +1404788736,1404796927,NL 1404796928,1404801023,EE -1404801024,1404803071,SE -1404803072,1404803327,LV -1404803328,1404803583,SE +1404801024,1404803583,SE 1404803584,1404804095,LV 1404804096,1404805119,SE 1404805120,1404813311,AT 1404813312,1404815871,EE 1404815872,1404816383,LT -1404816384,1404821503,NL -1404821504,1404821759,SE -1404821760,1404822271,NL -1404822272,1404822527,SE -1404822528,1404822783,NL -1404822784,1404823039,SE -1404823040,1404825087,NL -1404825088,1404825343,SE -1404825344,1404826367,NL -1404826368,1404826623,SE -1404826624,1404827135,NL -1404827136,1404827903,SE -1404827904,1404829695,NL -1404829696,1404870655,RU +1404816384,1404829695,NL +1404829696,1404870655,SE 1404870656,1404872703,LT 1404872704,1404874751,SE 1404874752,1404875775,LV @@ -18310,21 +19030,44 @@ 1404887040,1404927999,NL 1404928000,1404944383,SE 1404944384,1404960767,LT -1404960768,1405009919,SE -1405009920,1405010687,LT -1405010688,1405010943,SE -1405010944,1405011199,LT -1405011200,1405011711,SE -1405011712,1405013759,LT -1405013760,1405014015,SE -1405014016,1405020159,LT -1405020160,1405020415,SE -1405020416,1405020927,LT -1405020928,1405021183,SE -1405021184,1405021439,LT -1405021440,1405021951,SE -1405021952,1405022207,LT -1405022208,1405026303,SE +1404960768,1404977151,SE +1404977152,1404977919,LT +1404977920,1404978175,SE +1404978176,1404980223,LT +1404980224,1404980479,SE +1404980480,1404981247,LT +1404981248,1404981503,SE +1404981504,1404983551,LT +1404983552,1404983807,SE +1404983808,1404985087,LT +1404985088,1404985343,SE +1404985344,1404986623,LT +1404986624,1404986879,SE +1404986880,1404987135,LT +1404987136,1404987311,SE +1404987312,1404987312,LT +1404987313,1404987647,SE +1404987648,1404988415,LT +1404988416,1404988469,SE +1404988470,1404988470,LT +1404988471,1404988671,SE +1404988672,1404989695,LT +1404989696,1404989951,SE +1404989952,1404990463,LT +1404990464,1404990719,SE +1404990720,1404990975,LT +1404990976,1404991231,SE +1404991232,1404992511,LT +1404992512,1404992767,SE +1404992768,1404993535,LT +1404993536,1405009919,SE +1405009920,1405022207,LT +1405022208,1405022463,SE +1405022464,1405022975,LT +1405022976,1405023231,SE +1405023232,1405025023,LT +1405025024,1405025279,SE +1405025280,1405026303,LT 1405026304,1405042687,NO 1405042688,1405048831,SE 1405048832,1405050879,HR @@ -18333,21 +19076,133 @@ 1405063168,1405067263,NO 1405067264,1405083647,EE 1405083648,1405091839,SE -1405091840,1405815295,FR -1405815296,1405815551,MQ -1405815552,1405820927,FR -1405820928,1405821183,MQ -1405821184,1405822719,FR -1405822720,1405822975,MQ -1405822976,1405834751,FR -1405834752,1405835007,MQ -1405835008,1405850879,FR -1405850880,1405851135,MQ -1405851136,1405858815,FR +1405091840,1405813759,FR +1405813760,1405814015,MQ +1405814016,1405815807,FR +1405815808,1405816063,MQ +1405816064,1405816319,FR +1405816320,1405816575,MQ +1405816576,1405816831,FR +1405816832,1405817087,MQ +1405817088,1405817343,FR +1405817344,1405817599,MQ +1405817600,1405818111,FR +1405818112,1405818367,MQ +1405818368,1405818623,FR +1405818624,1405818879,MQ +1405818880,1405819135,FR +1405819136,1405819391,MQ +1405819392,1405819903,FR +1405819904,1405820159,MQ +1405820160,1405820671,FR +1405820672,1405820927,MQ +1405820928,1405821439,FR +1405821440,1405821695,MQ +1405821696,1405822207,FR +1405822208,1405822719,MQ +1405822720,1405823231,FR +1405823232,1405823743,MQ +1405823744,1405824255,FR +1405824256,1405824511,MQ +1405824512,1405824767,FR +1405824768,1405825279,MQ +1405825280,1405825535,FR +1405825536,1405826303,MQ +1405826304,1405826559,FR +1405826560,1405826815,MQ +1405826816,1405827071,FR +1405827072,1405827583,MQ +1405827584,1405827839,FR +1405827840,1405828095,MQ +1405828096,1405828607,FR +1405828608,1405829119,MQ +1405829120,1405829375,FR +1405829376,1405829631,MQ +1405829632,1405830143,FR +1405830144,1405830399,MQ +1405830400,1405830655,FR +1405830656,1405831167,MQ +1405831168,1405831423,FR +1405831424,1405831679,MQ +1405831680,1405833727,FR +1405833728,1405833983,MQ +1405833984,1405834495,FR +1405834496,1405835263,MQ +1405835264,1405835775,FR +1405835776,1405836031,MQ +1405836032,1405836543,FR +1405836544,1405837055,MQ +1405837056,1405837311,FR +1405837312,1405837567,MQ +1405837568,1405838079,FR +1405838080,1405838591,MQ +1405838592,1405839103,FR +1405839104,1405839359,MQ +1405839360,1405839615,FR +1405839616,1405839871,MQ +1405839872,1405840127,FR +1405840128,1405840639,MQ +1405840640,1405845503,FR +1405845504,1405845759,MQ +1405845760,1405846015,FR +1405846016,1405846527,MQ +1405846528,1405846783,FR +1405846784,1405847039,MQ +1405847040,1405847551,FR +1405847552,1405847807,MQ +1405847808,1405848063,FR +1405848064,1405848319,MQ +1405848320,1405848575,FR +1405848576,1405848831,MQ +1405848832,1405849087,FR +1405849088,1405849599,MQ +1405849600,1405849855,FR +1405849856,1405850111,MQ +1405850112,1405850623,FR +1405850624,1405850879,MQ +1405850880,1405851135,FR +1405851136,1405851903,MQ +1405851904,1405852159,FR +1405852160,1405853439,MQ +1405853440,1405854463,FR +1405854464,1405854975,MQ +1405854976,1405856255,FR +1405856256,1405856511,MQ +1405856512,1405857791,FR +1405857792,1405858559,MQ +1405858560,1405858815,FR 1405858816,1405859071,MQ -1405859072,1405871103,FR -1405871104,1405871359,MQ -1405871360,1406140415,FR +1405859072,1405859327,FR +1405859328,1405860351,MQ +1405860352,1405860607,FR +1405860608,1405861119,MQ +1405861120,1405861375,FR +1405861376,1405861631,MQ +1405861632,1405862143,FR +1405862144,1405862399,MQ +1405862400,1405862911,FR +1405862912,1405863423,MQ +1405863424,1405864447,FR +1405864448,1405864703,MQ +1405864704,1405864959,FR +1405864960,1405865983,MQ +1405865984,1405866239,FR +1405866240,1405866495,MQ +1405866496,1405867519,FR +1405867520,1405867775,MQ +1405867776,1405868287,FR +1405868288,1405868799,MQ +1405868800,1405870335,FR +1405870336,1405870591,MQ +1405870592,1405871359,FR +1405871360,1405871615,MQ +1405871616,1405871871,FR +1405871872,1405872127,MQ +1405872128,1405872383,FR +1405872384,1405872895,MQ +1405872896,1405873663,FR +1405873664,1405873919,MQ +1405873920,1406140415,FR 1406140416,1406205951,CZ 1406205952,1406271487,SE 1406271488,1406337023,IE @@ -18369,35 +19224,23 @@ 1406730240,1406746623,RU 1406746624,1406754815,BE 1406754816,1406763007,GB -1406763008,1406763263,BE -1406763264,1406764799,LU -1406764800,1406765055,BE -1406765056,1406765311,LU -1406765312,1406765823,BE -1406765824,1406766335,LU -1406766336,1406767103,BE -1406767104,1406767615,LU -1406767616,1406767871,BE -1406767872,1406768127,LU -1406768128,1406768383,BE -1406768384,1406769407,LU -1406769408,1406769663,BE -1406769664,1406770431,LU -1406770432,1406770687,BE -1406770688,1406770943,LU -1406770944,1406771199,BE +1406763008,1406771199,LU 1406771200,1406779391,GB 1406779392,1406787583,RU -1406787584,1406791167,ES -1406791168,1406791295,GB +1406787584,1406791159,ES +1406791160,1406791295,GB 1406791296,1406793843,ES 1406793844,1406793847,GB 1406793848,1406794751,ES 1406794752,1406795775,NL 1406795776,1406796543,GB 1406796544,1406796799,IM -1406796800,1406803455,GB -1406803456,1406803967,IM +1406796800,1406802175,GB +1406802176,1406802431,IM +1406802432,1406803199,GB +1406803200,1406803455,IM +1406803456,1406803711,GB +1406803712,1406803967,IM 1406803968,1406812159,DE 1406812160,1406820351,SE 1406820352,1406828543,PL @@ -18452,9 +19295,7 @@ 1407320064,1407451135,SE 1407451136,1407483903,BG 1407483904,1407516671,CH -1407516672,1407522719,GB -1407522720,1407522727,CD -1407522728,1407526231,GB +1407516672,1407526231,GB 1407526232,1407526239,CD 1407526240,1407529178,GB 1407529179,1407529180,NG @@ -18572,9 +19413,7 @@ 1410514944,1410523135,GB 1410523136,1410531327,PT 1410531328,1410539519,DE -1410539520,1410540671,GB -1410540672,1410540799,US -1410540800,1410547711,GB +1410539520,1410547711,GB 1410547712,1410555903,CZ 1410555904,1410564095,GB 1410564096,1410572287,SE @@ -18600,9 +19439,9 @@ 1410711552,1410719743,BG 1410719744,1410727935,RU 1410727936,1410736127,BG -1410736128,1410738687,RS -1410738688,1410738943,XK -1410738944,1410744319,RS +1410736128,1410739967,RS +1410739968,1410740479,XK +1410740480,1410744319,RS 1410744320,1410752511,FR 1410752512,1410760703,NL 1410760704,1410768895,RU @@ -18617,15 +19456,7 @@ 1410834432,1410842623,PL 1410842624,1410850815,PT 1410850816,1410859007,DE -1410859008,1410972159,NL -1410972160,1410972415,DE -1410972416,1410972671,NL -1410972672,1410972927,DE -1410972928,1410973439,NL -1410973440,1410973695,DE -1410973696,1410975487,NL -1410975488,1410975743,DE -1410975744,1411383295,NL +1410859008,1411383295,NL 1411383296,1411448831,LT 1411448832,1411449727,IT 1411449728,1411449791,DE @@ -18672,8 +19503,11 @@ 1411899392,1411901439,ES 1411901440,1411903487,IE 1411903488,1411907583,RU +1411907584,1411911679,GB 1411911680,1411915775,US +1411915776,1411919871,GB 1411919872,1411921919,DE +1411922432,1411923967,GB 1411923968,1411940351,BG 1411940352,1411973119,PL 1411973120,1411999743,SI @@ -18729,11 +19563,9 @@ 1412939776,1412956159,CH 1412956160,1413480447,DE 1413480448,1414004735,IN -1414004736,1414036607,CH -1414036608,1414036991,DE -1414036992,1414039551,CH -1414039552,1414040575,DE -1414040576,1414069218,CH +1414004736,1414039551,CH +1414039552,1414040191,DE +1414040192,1414069218,CH 1414069219,1414069219,AT 1414069220,1414094847,CH 1414094848,1414095615,DE @@ -18747,9 +19579,7 @@ 1415577600,1416101887,FR 1416101888,1416364031,NL 1416364032,1416626175,IL -1416626176,1416876287,AT -1416876288,1416876543,CH -1416876544,1416941567,AT +1416626176,1416941567,AT 1416941568,1416943615,CH 1416943616,1416944639,AT 1416944640,1416945663,CZ @@ -18758,61 +19588,7 @@ 1417019392,1417150463,DE 1417150464,1417674751,ES 1417674752,1421869055,DE -1421869056,1421886975,BE -1421886976,1421887743,NL -1421887744,1421888511,BE -1421888512,1421888767,NL -1421888768,1421889279,BE -1421889280,1421889791,NL -1421889792,1421890047,BE -1421890048,1421890303,NL -1421890304,1421893119,BE -1421893120,1421893631,NL -1421893632,1421894143,BE -1421894144,1421894399,NL -1421894400,1421894783,BE -1421894784,1421894911,NL -1421894912,1421896063,BE -1421896064,1421896703,NL -1421896704,1421896831,BE -1421896832,1421896959,NL -1421896960,1421897727,BE -1421897728,1421898239,NL -1421898240,1421899263,BE -1421899264,1421899519,NL -1421899520,1421900543,BE -1421900544,1421900799,NL -1421900800,1421959679,BE -1421959680,1421959807,NL -1421959808,1421959935,BE -1421959936,1421960191,NL -1421960192,1422022143,BE -1422022144,1422022399,NL -1422022400,1422082559,BE -1422082560,1422083071,NL -1422083072,1422084223,BE -1422084224,1422084351,NL -1422084352,1422085119,BE -1422085120,1422085375,NL -1422085376,1422085887,BE -1422085888,1422086143,NL -1422086144,1422087679,BE -1422087680,1422088191,NL -1422088192,1422088447,BE -1422088448,1422088703,NL -1422088704,1422088959,BE -1422088960,1422089215,NL -1422089216,1422089471,BE -1422089472,1422089727,NL -1422089728,1422095743,BE -1422095744,1422095871,NL -1422095872,1422128639,BE -1422128640,1422129151,NL -1422129152,1422132479,BE -1422132480,1422132735,NL -1422132736,1422289663,BE -1422289664,1422289791,NL -1422289792,1422393343,BE +1421869056,1422393343,BE 1422393344,1422413567,DE 1422413568,1422413695,AT 1422413696,1422413727,US @@ -18838,10 +19614,10 @@ 1422786560,1422852095,HU 1422857088,1422857151,FR 1422910208,1422910463,NL +1422911232,1422911487,NL 1422916608,1422916863,GB 1422917120,1422917343,GB 1422917344,1422917375,NL -1422917376,1422917631,GB 1422917632,1423441919,NO 1423441920,1423704063,SE 1423704064,1423966207,IT @@ -18858,23 +19634,39 @@ 1424503716,1424523263,ES 1424523264,1424556031,RO 1424556032,1424588799,EG -1424588800,1424592639,GB -1424592640,1424592895,FR -1424592896,1424595711,GB -1424595712,1424595967,IT -1424595968,1424597069,GB +1424588800,1424595726,GB +1424595727,1424595727,IT +1424595728,1424595743,GB +1424595744,1424595751,IT +1424595752,1424597069,GB 1424597070,1424597070,CZ -1424597071,1424600575,GB -1424600576,1424600831,FR -1424600832,1424602879,GB -1424602880,1424603135,US -1424603136,1424604975,GB -1424604976,1424604983,NL -1424604984,1424607743,GB +1424597071,1424601887,GB +1424601888,1424601903,NL +1424601904,1424603023,GB +1424603024,1424603039,US +1424603040,1424604975,GB +1424604976,1424604991,NL +1424604992,1424607743,GB 1424607744,1424607775,DE -1424607776,1424617215,GB +1424607776,1424608083,GB +1424608084,1424608087,FR +1424608088,1424609247,GB +1424609248,1424609255,DE +1424609256,1424610643,GB +1424610644,1424610644,PL +1424610645,1424610992,GB +1424610993,1424610993,FR +1424610994,1424611002,GB +1424611003,1424611003,FR +1424611004,1424611005,GB +1424611006,1424611006,FR +1424611007,1424611295,GB +1424611296,1424611311,BE +1424611312,1424617215,GB 1424617216,1424617231,IT -1424617232,1424621567,GB +1424617232,1424619855,GB +1424619856,1424619863,BE +1424619864,1424621567,GB 1424621568,1424625663,PL 1424625664,1424629759,GB 1424629760,1424633855,PL @@ -18963,17 +19755,12 @@ 1425485312,1425489407,RO 1425489408,1425489663,NL 1425489664,1425506303,RO -1425506304,1425518847,NO -1425518848,1425518975,RU -1425518976,1425522687,NO +1425506304,1425522687,NO 1425522688,1425539071,IT 1425539072,1425801215,FI -1425801216,1425813759,BG -1425813760,1425814015,MK -1425814016,1425814271,BG -1425814272,1425814527,MK +1425801216,1425813503,BG +1425813504,1425814527,MK 1425814528,1425817599,BG -1425820160,1425820415,DE 1425833984,1425850367,RU 1425850368,1425866751,GB 1425866752,1425883135,CH @@ -18984,7 +19771,10 @@ 1425948672,1425965055,DE 1425965056,1425970175,IT 1425970176,1425970431,FR -1425970432,1425980415,IT +1425970432,1425974271,IT +1425974272,1425974783,GB +1425974784,1425977343,IT +1425977344,1425980415,FR 1425980416,1425980671,IQ 1425980672,1425981439,IT 1425981440,1425997823,RU @@ -18992,21 +19782,13 @@ 1426014208,1426030591,DK 1426030592,1426046975,BH 1426046976,1426063359,SI -1426063360,1426094335,CH -1426094336,1426094591,DE -1426094592,1426112511,CH -1426112512,1426112767,DE -1426112768,1426118271,CH -1426118272,1426118399,DE -1426118400,1426168575,CH -1426168576,1426168831,DE -1426168832,1426175999,CH -1426176000,1426176255,DE -1426176256,1426587647,CH +1426063360,1426587647,CH 1426587648,1426604031,SE 1426604032,1426620415,DE 1426636800,1426653183,GB -1426653184,1426669567,RO +1426653184,1426660657,RO +1426660658,1426660658,US +1426660659,1426669567,RO 1426669568,1426685951,IR 1426685952,1426702335,TJ 1426702336,1426718719,LV @@ -19026,9 +19808,7 @@ 1426915328,1426931711,AT 1426931712,1426948095,CZ 1426948096,1426964479,DE -1426964480,1426967287,GB -1426967288,1426967295,ES -1426967296,1426980863,GB +1426964480,1426980863,GB 1426980864,1426997247,BG 1426997248,1427013631,PL 1427013632,1427030015,FR @@ -19068,7 +19848,9 @@ 1427722028,1427722030,SG 1427722031,1427722031,DE 1427722032,1427722033,SG -1427722034,1427728088,DE +1427722034,1427722093,DE +1427722094,1427722094,EE +1427722095,1427728088,DE 1427728089,1427728100,SG 1427728101,1427728599,DE 1427728600,1427728600,SK @@ -19082,7 +19864,9 @@ 1427832832,1427865599,BE 1427865600,1427898367,DK 1427898368,1427914751,RU -1427914752,1427931135,BE +1427914752,1427930965,BE +1427930966,1427930966,LU +1427930967,1427931135,BE 1427931136,1427947519,PL 1427947520,1427963903,RU 1427963904,1427980287,TR @@ -19142,7 +19926,9 @@ 1431953408,1431961599,DK 1431961600,1431969791,CH 1431969792,1431977983,GB -1431977984,1431986175,NL +1431977984,1431980719,NL +1431980720,1431980727,SA +1431980728,1431986175,NL 1431986176,1431994367,RU 1431994368,1432002559,AT 1432002560,1432010751,HU @@ -19219,12 +20005,8 @@ 1433615028,1433615028,GB 1433615029,1433615359,DE 1433615360,1433615615,FR -1433615616,1433615871,GB -1433615872,1433616127,CH -1433616128,1433616383,GB -1433616384,1433621759,AE -1433621760,1433622015,IN -1433622016,1433624575,AE +1433615616,1433616383,GB +1433616384,1433624575,AE 1433624576,1433632767,LV 1433632768,1433640959,GI 1433640960,1433649151,RU @@ -19266,9 +20048,9 @@ 1433860096,1433862143,DE 1433862144,1433864191,CH 1433864192,1433866239,HU -1433866240,1433867519,NL -1433867520,1433867775,GB -1433867776,1433868287,NL +1433866240,1433867521,NL +1433867522,1433867522,GB +1433867523,1433868287,NL 1433868288,1433870335,GB 1433870336,1433872383,TR 1433872384,1433874431,IT @@ -19290,8 +20072,7 @@ 1433907200,1433909247,IT 1433909248,1433911295,BE 1433911296,1433913343,ES -1433913344,1433915391,NL -1433915392,1433917439,DE +1433913344,1433917439,DE 1433917440,1433919487,BE 1433919488,1433921535,GB 1433921536,1433923583,CH @@ -19310,9 +20091,7 @@ 1434615808,1434648575,IL 1434648576,1434681343,FI 1434681344,1434714111,DE -1434714112,1434717951,AZ -1434717952,1434718207,GB -1434718208,1434746879,AZ +1434714112,1434746879,AZ 1434746880,1434779647,CZ 1434779648,1434812415,GB 1434812416,1434845183,IR @@ -19354,9 +20133,7 @@ 1436464384,1436464639,AT 1436464640,1436465151,DE 1436465152,1436467199,RU -1436467200,1436468223,DE -1436468224,1436468479,AT -1436468480,1436469247,DE +1436467200,1436469247,DE 1436469248,1436471295,NL 1436471296,1436473343,BE 1436473344,1436475391,RO @@ -19391,7 +20168,23 @@ 1436542976,1436545023,NL 1436545024,1436547071,DE 1436547072,1436549119,GB -1436549120,1436680191,CZ +1436549120,1436549887,CZ +1436549888,1436552447,SK +1436552448,1436552703,CZ +1436552704,1436553727,SK +1436553728,1436553983,CZ +1436553984,1436554751,SK +1436554752,1436555007,CZ +1436555008,1436557055,SK +1436557056,1436557311,CZ +1436557312,1436559359,SK +1436559360,1436559615,CZ +1436559616,1436560127,SK +1436560128,1436560383,CZ +1436560384,1436564479,SK +1436564480,1436564735,CZ +1436564736,1436614655,SK +1436614656,1436680191,CZ 1436680192,1436811263,SK 1436811264,1437073407,NO 1437073408,1437335551,FR @@ -19453,15 +20246,15 @@ 1439055872,1439072255,RU 1439072256,1439088639,UA 1439088640,1439105023,PL -1439105024,1439121407,AT +1439105024,1439106559,AT +1439106560,1439106815,DE +1439106816,1439121407,AT 1439121408,1439154175,DE 1439154176,1439156106,GB 1439156107,1439156108,LB 1439156109,1439170559,GB 1439170560,1439236095,NO -1439236096,1439261439,BE -1439261440,1439261695,FR -1439261696,1439301631,BE +1439236096,1439301631,BE 1439301632,1439305727,RU 1439305728,1439309823,DK 1439309824,1439318015,PL @@ -19475,9 +20268,14 @@ 1439358976,1439367167,RU 1439367168,1439373311,NL 1439373312,1439373567,SE -1439373568,1439399935,NL +1439373568,1439383551,NL +1439383552,1439399935,FR 1439399936,1439432703,DK -1439432704,1439477759,RO +1439432704,1439441919,RO +1439441920,1439442943,ES +1439442944,1439460607,RO +1439460608,1439460863,MD +1439460864,1439477759,RO 1439477760,1439479807,MD 1439479808,1439498239,RO 1439498240,1439513599,DE @@ -19511,7 +20309,7 @@ 1439561728,1439562239,GB 1439562240,1439562751,IE 1439562752,1439563007,DE -1439563008,1439563263,IT +1439563008,1439563263,GB 1439563264,1439563775,DE 1439563776,1439629311,LT 1439629312,1439694847,CZ @@ -19529,11 +20327,11 @@ 1440514048,1440546815,DE 1440546816,1440579583,NO 1440579584,1440645119,PL -1440645120,1440669695,RS +1440645120,1440653311,GB +1440653312,1440669695,RS 1440669696,1440671743,NL 1440671744,1440672767,EE -1440672768,1440673791,RS -1440673792,1440710655,NL +1440672768,1440710655,NL 1440710656,1440743423,UA 1440743424,1441267711,SE 1441267712,1441275903,DE @@ -19558,9 +20356,9 @@ 1441439744,1441447935,LV 1441447936,1441456127,BE 1441456128,1441464319,NL -1441464320,1441468927,SE -1441468928,1441469183,DK -1441469184,1441472511,SE +1441464320,1441470463,SE +1441470464,1441470719,DK +1441470720,1441472511,SE 1441472512,1441480703,RU 1441480704,1441488895,TR 1441488896,1441497087,GB @@ -19570,9 +20368,7 @@ 1441529856,1441538047,RU 1441538048,1441546239,DE 1441546240,1441554431,DK -1441554432,1441554687,GB -1441554688,1441554943,NL -1441554944,1441556991,GB +1441554432,1441556991,GB 1441556992,1441557503,SE 1441557504,1441564671,GB 1441564672,1441566719,IQ @@ -19620,9 +20416,7 @@ 1442709504,1442775039,LV 1442775040,1442779135,PL 1442779136,1442783231,DE -1442783232,1442786559,NO -1442786560,1442786815,LV -1442786816,1442787327,NO +1442783232,1442787327,NO 1442787328,1442791423,LT 1442791424,1442795519,LV 1442799616,1442803711,LT @@ -19637,11 +20431,7 @@ 1442832384,1442836479,GB 1442836480,1442840575,PL 1442840576,1444937727,GB -1444937728,1444985599,AT -1444985600,1444985855,DE -1444985856,1445061631,AT -1445061632,1445061887,DE -1445061888,1445068799,AT +1444937728,1445068799,AT 1445068800,1445199871,RO 1445199872,1445330943,QA 1445330944,1445396479,LT @@ -19653,14 +20443,13 @@ 1446182912,1446248447,SA 1446248448,1446313983,DK 1446313984,1446445055,GB -1446445056,1446510591,RO +1446445056,1446510591,IR 1446510592,1446543359,DE 1446543360,1446576127,AT 1446576128,1446608895,IR 1446608896,1446641663,BY 1446641664,1446674431,SI -1446674432,1446707135,DK -1446707136,1446707199,NO +1446674432,1446707199,DK 1446707200,1446739967,AT 1446739968,1446772735,HU 1446772736,1446805503,SA @@ -19683,29 +20472,49 @@ 1449459712,1449525247,HU 1449525248,1449590783,RU 1449590784,1449656319,DE -1449656320,1449706495,RO +1449656320,1449664511,RO +1449664512,1449668607,IR +1449668608,1449670743,SE +1449670744,1449670744,RO +1449670745,1449672703,SE +1449672704,1449695231,RO +1449695232,1449697279,SE +1449697280,1449706495,RO 1449706496,1449707519,MD -1449707520,1449736191,RO +1449707520,1449709567,SE +1449709568,1449715711,RO +1449715712,1449717759,IR +1449717760,1449734143,RO +1449734144,1449736191,IT 1449736192,1449738239,MD 1449738240,1449742335,RO 1449742336,1449744383,MD -1449744384,1449765887,RO +1449744384,1449750527,RO +1449750528,1449752575,SE +1449752576,1449765887,RO 1449765888,1449766911,MD 1449766912,1449775103,RO 1449775104,1449776127,MD -1449776128,1449819135,RO -1449819136,1449820159,MD -1449820160,1449824255,RO +1449776128,1449793279,RO +1449793280,1449793535,NL +1449793536,1449824255,RO 1449824256,1449826303,MD -1449826304,1449840639,RO +1449826304,1449828351,RO +1449828352,1449830399,SE +1449830400,1449840639,RO 1449840640,1449852927,MD -1449852928,1449869311,RO +1449852928,1449857023,IR +1449857024,1449869311,RO 1449869312,1449870335,MD -1449870336,1449883647,RO +1449870336,1449879039,RO +1449879040,1449879295,SG +1449879296,1449883647,RO 1449883648,1449885695,BE 1449885696,1449893887,RO 1449893888,1449895935,MD -1449895936,1449918463,RO +1449895936,1449906175,RO +1449906176,1449910271,IR +1449910272,1449918463,RO 1449918464,1449951231,JO 1449951232,1449983999,TR 1449984000,1449992191,NL @@ -19769,19 +20578,13 @@ 1466097664,1466099711,ES 1466099712,1466101759,PL 1466101760,1466103807,DE -1466103808,1466104116,FR -1466104117,1466104117,GB -1466104118,1466104442,FR -1466104443,1466104443,GB -1466104444,1466104467,FR -1466104468,1466104468,GB -1466104469,1466104942,FR +1466103808,1466104575,GB +1466104576,1466104942,FR 1466104943,1466104943,BE 1466104944,1466105173,FR 1466105174,1466105174,BE 1466105175,1466105343,FR -1466105344,1466105599,GB -1466105600,1466105855,FR +1466105344,1466105855,GB 1466105856,1466122239,PL 1466122240,1466130431,LV 1466130432,1466138623,PL @@ -19803,7 +20606,9 @@ 1466499072,1466564607,PL 1466564608,1466571894,DE 1466571895,1466571895,AE -1466571896,1466589183,DE +1466571896,1466588785,DE +1466588786,1466588786,FR +1466588787,1466589183,DE 1466589184,1466590207,FR 1466590208,1466591999,GB 1466592000,1466613759,DE @@ -19946,12 +20751,7 @@ 1475211264,1475213311,DE 1475213312,1475215359,FR 1475215360,1475223551,IT -1475223552,1475226239,SE -1475226240,1475226367,NO -1475226368,1475226495,SE -1475226496,1475227647,NO -1475227648,1475231743,SE -1475231744,1475233791,NO +1475223552,1475233791,NO 1475233792,1475235839,GB 1475235840,1475237887,IE 1475237888,1475239935,ES @@ -19969,7 +20769,9 @@ 1475260416,1475262463,FR 1475262464,1475266559,DE 1475266560,1475268607,GB -1475268608,1475270655,RS +1475268608,1475268863,RS +1475268864,1475269119,XK +1475269120,1475270655,RS 1475270656,1475272703,GB 1475272704,1475274751,BE 1475274752,1475276799,RU @@ -20022,23 +20824,13 @@ 1475575808,1475592191,AT 1475592192,1475608575,GB 1475608576,1475624959,RU -1475624960,1475637303,JE -1475637304,1475637311,GB -1475637312,1475637471,JE -1475637472,1475637479,GB -1475637480,1475638783,JE +1475624960,1475638783,JE 1475638784,1475639039,GB 1475639040,1475639391,JE 1475639392,1475639399,GB 1475639400,1475639479,JE 1475639480,1475639487,GB -1475639488,1475639559,JE -1475639560,1475639567,GB -1475639568,1475639583,JE -1475639584,1475639591,GB -1475639592,1475639695,JE -1475639696,1475639703,GB -1475639704,1475641343,JE +1475639488,1475641343,JE 1475641344,1475657727,UA 1475657728,1475674111,SK 1475674112,1475690495,DE @@ -20049,10 +20841,8 @@ 1475724868,1475724869,GB 1475724870,1475724870,RU 1475724871,1475725055,GB -1475725056,1475725311,RU -1475725312,1475726079,GB -1475726080,1475726335,RU -1475726336,1475729663,GB +1475725056,1475725183,RU +1475725184,1475729663,GB 1475729664,1475729671,UA 1475729672,1475731007,GB 1475731008,1475731071,UA @@ -20184,7 +20974,8 @@ 1481741568,1481741568,GG 1481741569,1481741823,GB 1481741824,1481742079,GG -1481742080,1481744383,GB +1481742080,1481744127,GB +1481744128,1481744383,GG 1481744384,1481752575,IT 1481752576,1481760767,RU 1481760768,1481768959,UA @@ -20244,19 +21035,7 @@ 1482948608,1483210751,CZ 1483210752,1483735039,GB 1483735040,1483997183,FI -1483997184,1484044287,AT -1484044288,1484044543,DE -1484044544,1484049911,AT -1484049912,1484049915,DE -1484049916,1484049921,AT -1484049922,1484049922,DE -1484049923,1484084607,AT -1484084608,1484084735,DE -1484084736,1484084991,AT -1484084992,1484085119,DE -1484085120,1484088831,AT -1484088832,1484089087,DE -1484089088,1484128255,AT +1483997184,1484128255,AT 1484128256,1484259327,LT 1484259328,1484783615,FR 1484783616,1484849151,DE @@ -20270,9 +21049,7 @@ 1485250560,1485254655,IR 1485254656,1485259007,RU 1485259008,1485262847,UA -1485262848,1485263615,RU -1485263616,1485263871,UA -1485263872,1485266943,RU +1485262848,1485266943,RU 1485266944,1485271039,RO 1485271040,1485275135,UA 1485275136,1485283327,LV @@ -20356,13 +21133,18 @@ 1489644032,1489644287,IT 1489644288,1489644543,FR 1489644544,1489644799,IQ -1489644800,1489648383,IT +1489644800,1489647615,IT +1489647616,1489648383,FR 1489648384,1489648639,GR 1489648640,1489649663,IT 1489649664,1489650687,FR -1489650688,1489660159,IT -1489660160,1489660415,LY -1489660416,1489666047,IT +1489650688,1489651199,IT +1489651200,1489653247,FR +1489653248,1489655295,IT +1489655296,1489655551,GR +1489655552,1489659647,IT +1489659648,1489661951,FR +1489661952,1489666047,IT 1489666048,1489674239,GB 1489674240,1489676287,NL 1489676288,1489698815,GB @@ -20375,39 +21157,31 @@ 1489928192,1489960959,SE 1489960960,1489993727,HR 1489993728,1490026495,LU -1490026496,1490028543,US -1490028544,1490029055,UA -1490029056,1490042879,NL +1490026496,1490028543,NL +1490028544,1490028671,GB +1490028672,1490028799,DE +1490028800,1490042879,NL 1490042880,1490053375,CZ -1490053376,1490053631,PL -1490053632,1490059263,CZ +1490053376,1490054143,PL +1490054144,1490059263,CZ 1490059264,1490075647,DE 1490075648,1490092031,GB 1490092032,1490108415,DE 1490108416,1490124799,MC 1490124800,1490141183,HU 1490141184,1490142719,CZ -1490142720,1490143231,HU -1490143232,1490143999,CZ -1490144000,1490144255,HU -1490144256,1490146559,CZ -1490146560,1490146815,HU -1490146816,1490148863,CZ -1490148864,1490149119,HU -1490149120,1490151679,CZ -1490151680,1490151935,HU -1490151936,1490153983,CZ -1490153984,1490154239,HU -1490154240,1490154495,CZ -1490154496,1490154751,HU -1490154752,1490157567,CZ +1490142720,1490142975,HU +1490142976,1490145279,CZ +1490145280,1490147327,HU +1490147328,1490149375,CZ +1490149376,1490150399,HU +1490150400,1490155519,CZ +1490155520,1490157567,HU 1490157568,1490173951,RU 1490173952,1490190335,PT 1490190336,1490196991,GB 1490196992,1490197247,IE -1490197248,1490205183,GB -1490205184,1490205439,LY -1490205440,1490206719,GB +1490197248,1490206719,GB 1490206720,1490223103,GE 1490223104,1490255871,GB 1490255872,1490272255,NL @@ -20451,32 +21225,32 @@ 1491075072,1493172223,TR 1493172224,1493303295,DE 1493303296,1493430527,FR -1493430528,1493430783,GP -1493430784,1493431039,FR -1493431040,1493431551,GP -1493431552,1493431807,FR -1493431808,1493432319,GP -1493432320,1493434111,MQ -1493434112,1493434367,FR +1493430528,1493431039,GP +1493431040,1493431807,FR +1493431808,1493432063,GP +1493432064,1493433087,FR +1493433088,1493433855,MQ +1493433856,1493434111,FR +1493434112,1493434367,MQ 1493434368,1493565439,SA 1493565440,1493696511,ES 1493696512,1493958655,NO 1493958656,1494220799,DE -1494220800,1494221823,FR -1494221824,1494222335,RE +1494220800,1494222079,FR +1494222080,1494222335,RE 1494222336,1494222591,FR 1494222592,1494222847,RE -1494222848,1494223615,FR -1494223616,1494223871,RE -1494223872,1494225407,FR +1494222848,1494223359,FR +1494223360,1494223615,RE +1494223616,1494223871,FR +1494223872,1494224127,RE +1494224128,1494224895,FR +1494224896,1494225151,GP +1494225152,1494225407,FR 1494225408,1494225663,GP -1494225664,1494226687,FR -1494226688,1494226943,GP -1494226944,1494227455,FR -1494227456,1494227967,GP -1494227968,1494228479,FR -1494228480,1494228735,GP -1494228736,1494228991,FR +1494225664,1494227711,FR +1494227712,1494227967,GP +1494227968,1494228991,FR 1494228992,1494237183,RU 1494237184,1494245375,IE 1494245376,1494253567,RU @@ -20536,9 +21310,11 @@ 1494663168,1494665215,PL 1494665216,1494667263,UA 1494667264,1494669311,PL -1494669312,1494675455,RU -1494675456,1494679551,UA -1494679552,1494695935,RU +1494669312,1494676735,RU +1494676736,1494676991,UA +1494676992,1494678527,RU +1494678528,1494678783,UA +1494678784,1494695935,RU 1494695936,1494704127,RS 1494704128,1494736895,RU 1494736896,1494745087,DK @@ -20584,7 +21360,8 @@ 1495207936,1495209983,RU 1495212032,1495214079,RU 1495214080,1495216127,CZ -1495216128,1495220223,IT +1495216128,1495218175,IT +1495218176,1495220223,NL 1495220224,1495222271,PL 1495222272,1495224319,IT 1495224320,1495228415,RU @@ -20606,9 +21383,15 @@ 1495263232,1495265279,GB 1495265280,1495267327,US 1495267328,1495269375,SE -1495269376,1495283711,RO -1495283712,1495287807,MD -1495287808,1495304191,RO +1495269376,1495277567,IR +1495277568,1495279615,SE +1495279616,1495283711,RO +1495283712,1495285759,MD +1495285760,1495287807,RO +1495287808,1495289855,SE +1495289856,1495293951,RO +1495293952,1495298047,IR +1495298048,1495304191,RO 1495304192,1495306239,MD 1495306240,1495306573,GB 1495306574,1495306574,RO @@ -20616,42 +21399,60 @@ 1495308288,1495313407,RO 1495313408,1495314431,MD 1495314432,1495326719,RO -1495326720,1495335935,MD -1495335936,1495416831,RO +1495326720,1495332863,MD +1495332864,1495333887,RO +1495333888,1495335935,MD +1495335936,1495369727,RO +1495369728,1495371775,SE +1495371776,1495408639,RO +1495408640,1495416831,IR 1495416832,1495418879,MD 1495418880,1495429119,RO 1495429120,1495431167,MD -1495431168,1495442431,RO -1495442432,1495443455,MD -1495443456,1495446527,RO -1495446528,1495447551,MD -1495447552,1495449599,RO +1495431168,1495433215,RO +1495433216,1495441407,IR +1495441408,1495444479,RO +1495444480,1495444735,SG +1495444736,1495447551,RO +1495447552,1495449599,SE 1495449600,1495451647,MD 1495451648,1495452671,RO 1495452672,1495453695,MD 1495453696,1495459839,RO 1495459840,1495460863,MD -1495460864,1495468031,RO +1495460864,1495461887,RO +1495461888,1495463935,SE +1495463936,1495468031,RO 1495468032,1495470079,MD 1495470080,1495476223,RO 1495476224,1495478271,MD 1495478272,1495487487,RO 1495487488,1495488511,MD -1495488512,1495492607,RO -1495492608,1495494655,MD -1495494656,1495508991,RO -1495508992,1495510015,MD +1495488512,1495489279,RO +1495489280,1495489535,MD +1495489536,1495498239,RO +1495498240,1495498495,SG +1495498496,1495508991,RO +1495508992,1495510015,IT 1495510016,1495517183,RO 1495517184,1495518207,MD 1495518208,1495571455,RO 1495571456,1495572479,MD -1495572480,1495608319,RO +1495572480,1495597055,RO +1495597056,1495601151,IR +1495601152,1495608319,RO 1495608320,1495609343,MD 1495609344,1495623679,RO 1495623680,1495623935,MD -1495623936,1495670783,RO +1495623936,1495632127,RO +1495632128,1495632639,MD +1495632640,1495642111,RO +1495642112,1495644159,SE +1495644160,1495670783,RO 1495670784,1495671807,MD -1495671808,1495678975,RO +1495671808,1495672831,RO +1495672832,1495674879,ES +1495674880,1495678975,RO 1495678976,1495679999,MD 1495680000,1495682047,RO 1495682048,1495683071,MD @@ -20662,26 +21463,38 @@ 1495749120,1495749631,RO 1495749632,1495750655,MD 1495750656,1495752703,RO -1495752704,1495755775,MD -1495755776,1495756799,RO +1495752704,1495754751,MD +1495754752,1495756799,RO 1495756800,1495758847,MD -1495758848,1495759871,RO +1495758848,1495759359,RO +1495759360,1495759615,SG +1495759616,1495759871,RO 1495759872,1495760127,MD -1495760128,1495762943,RO -1495762944,1495764991,MD -1495764992,1495782655,RO +1495760128,1495760895,RO +1495760896,1495762943,DE +1495762944,1495765759,RO +1495765760,1495766015,NL +1495766016,1495771135,RO +1495771136,1495772159,PL +1495772160,1495782655,RO 1495782656,1495782911,GB 1495782912,1495790079,RO 1495790080,1495790335,MD -1495790336,1495793663,RO -1495793664,1495795711,MD -1495795712,1495845631,RO +1495790336,1495845631,RO 1495845632,1495845887,GB 1495845888,1495852031,RO 1495852032,1495853055,MD -1495853056,1495875583,RO +1495853056,1495861247,RO +1495861248,1495865343,IR +1495865344,1495875583,RO 1495875584,1495891967,MD -1495891968,1495941119,RO +1495891968,1495900159,RO +1495900160,1495902207,SE +1495902208,1495908351,RO +1495908352,1495922687,IR +1495922688,1495926783,RO +1495926784,1495927039,SG +1495927040,1495941119,RO 1495941120,1495942143,MD 1495942144,1495943167,RO 1495943168,1495945215,MD @@ -20689,46 +21502,69 @@ 1495951360,1495952383,MD 1495952384,1495957503,RO 1495957504,1495958527,MD -1495958528,1495966719,RO -1495966720,1495967743,MD -1495967744,1495970815,RO +1495958528,1495967743,RO +1495967744,1495968767,NL +1495968768,1495970815,RO 1495970816,1495971839,MD 1495971840,1495982079,RO 1495982080,1495983103,MD -1495983104,1495986175,RO -1495986176,1495988223,MD -1495988224,1496004607,RO -1496004608,1496005631,MD -1496005632,1496018943,RO -1496018944,1496020991,MD -1496020992,1496023039,RO +1495983104,1495990271,RO +1495990272,1495994367,IR +1495994368,1495998463,RO +1495998464,1495998719,SG +1495998720,1496012799,RO +1496012800,1496016895,IR +1496016896,1496023039,RO 1496023040,1496024063,MD 1496024064,1496033279,RO 1496033280,1496034303,MD -1496034304,1496053759,RO -1496053760,1496055807,MD -1496055808,1496078335,RO +1496034304,1496049663,RO +1496049664,1496051711,SE +1496051712,1496055807,RO +1496055808,1496057855,SE +1496057856,1496078335,RO 1496078336,1496079359,MD 1496079360,1496084991,RO 1496084992,1496085247,MD 1496085248,1496094719,RO 1496094720,1496095743,MD -1496095744,1496121343,RO +1496095744,1496119295,RO +1496119296,1496121343,SE 1496121344,1496122367,MD 1496122368,1496131583,RO 1496131584,1496132607,MD -1496132608,1496197119,RO +1496132608,1496133631,RO +1496133632,1496137727,IR +1496137728,1496180735,RO +1496180736,1496182783,SE +1496182784,1496188927,RO +1496188928,1496189951,ES +1496189952,1496190975,RO +1496190976,1496191999,SE +1496192000,1496192255,RO +1496192256,1496193023,SE +1496193024,1496197119,RO 1496197120,1496197631,MD -1496197632,1496228863,RO +1496197632,1496203263,RO +1496203264,1496205311,IT +1496205312,1496213503,RO +1496213504,1496215551,IT +1496215552,1496228863,RO 1496228864,1496229887,MD -1496229888,1496238079,RO -1496238080,1496240127,MD -1496240128,1496276735,RO +1496229888,1496236031,RO +1496236032,1496238079,IT +1496238080,1496240127,IQ +1496240128,1496268799,RO +1496268800,1496272895,IR +1496272896,1496276735,RO 1496276736,1496276991,MD -1496276992,1496295423,RO +1496276992,1496285183,RO +1496285184,1496293375,IR +1496293376,1496295423,RO 1496295424,1496297471,GB 1496297472,1496299519,MD -1496299520,1496317951,RO +1496299520,1496301567,SE +1496301568,1496317951,RO 1496317952,1497366527,DE 1497366528,1498415103,PL 1498415104,1499463679,FR @@ -20736,13 +21572,7 @@ 1499594752,1499725823,NL 1499725824,1499856895,IE 1499856896,1499987967,CZ -1499987968,1499989247,AT -1499989248,1499989503,HU -1499989504,1499990911,AT -1499990912,1499991039,HU -1499991040,1499992575,AT -1499992576,1499992831,HU -1499992832,1499996159,AT +1499987968,1499996159,AT 1499996160,1500004351,GB 1500004352,1500020735,RU 1500020736,1500028927,IS @@ -20818,11 +21648,7 @@ 1500479488,1500495871,RU 1500495872,1500512255,BA 1500512256,1500643327,RU -1500643328,1500661247,PT -1500661248,1500661503,RO -1500661504,1500667647,PT -1500667648,1500667903,RO -1500667904,1500774399,PT +1500643328,1500774399,PT 1500774400,1500905471,LT 1500905472,1501036543,IT 1501036544,1501298687,RO @@ -20862,11 +21688,15 @@ 1502920704,1502937087,RU 1502937088,1502953471,RO 1502953472,1502969855,MD -1502969856,1502975231,FR -1502975232,1502975487,GB -1502975488,1502975743,FR -1502975744,1502975999,DE -1502976000,1502978047,FR +1502969856,1502973951,FR +1502973952,1502974975,DE +1502974976,1502975231,FR +1502975232,1502975247,GB +1502975248,1502975327,FR +1502975328,1502975359,GB +1502975360,1502975743,FR +1502975744,1502977023,DE +1502977024,1502978047,FR 1502978048,1502979071,US 1502979072,1502979135,FR 1502979136,1502979199,GB @@ -20874,7 +21704,11 @@ 1502979216,1502979231,CZ 1502979232,1502980351,FR 1502980352,1502980607,US -1502980608,1502981887,FR +1502980608,1502980879,FR +1502980880,1502980895,DE +1502980896,1502980991,FR +1502980992,1502981119,DE +1502981120,1502981887,FR 1502981888,1502982143,NL 1502982144,1502986239,FR 1502986240,1502999734,DE @@ -20895,7 +21729,9 @@ 1503084544,1503100927,GB 1503100928,1503117311,RU 1503117312,1503133695,NO -1503133696,1503395839,PT +1503133696,1503370138,PT +1503370139,1503370139,GB +1503370140,1503395839,PT 1503395840,1503657983,FR 1503657984,1503690751,SE 1503690752,1503723519,IS @@ -21074,10 +21910,23 @@ 1503905624,1503905647,DE 1503905648,1503905655,IT 1503905656,1503905663,AT -1503905664,1503920127,DE -1503920128,1503985151,HR -1503985152,1503985407,DE -1503985408,1503985663,HR +1503905664,1503905863,DE +1503905864,1503905871,FI +1503905872,1503905895,DE +1503905896,1503905903,GB +1503905904,1503905983,DE +1503905984,1503905991,UA +1503905992,1503906015,DE +1503906016,1503906023,AT +1503906024,1503906031,DE +1503906032,1503906039,SK +1503906040,1503906055,DE +1503906056,1503906063,CH +1503906064,1503906071,TR +1503906072,1503906111,DE +1503906112,1503906175,TR +1503906176,1503920127,DE +1503920128,1503985663,HR 1503985664,1504018431,IR 1504018432,1504051199,RO 1504051200,1504083967,FI @@ -21085,7 +21934,9 @@ 1504116736,1504149503,PL 1504149504,1504149759,GB 1504149760,1504150015,ES -1504150016,1504154623,GB +1504150016,1504151039,GB +1504151040,1504151295,FR +1504151296,1504154623,GB 1504154624,1504155647,IE 1504155648,1504247807,GB 1504247808,1504313343,RU @@ -21111,9 +21962,7 @@ 1505304576,1505312767,FR 1505312768,1505320959,RU 1505320960,1505329151,AT -1505329152,1505335807,IE -1505335808,1505336063,GB -1505336064,1505336575,IE +1505329152,1505336575,IE 1505336576,1505336831,GB 1505336832,1505337343,IE 1505337344,1505345535,FR @@ -21164,32 +22013,12 @@ 1505705984,1505714175,DE 1505714176,1505722367,LV 1505722368,1505738751,PL -1505738752,1505740543,GB -1505740544,1505740607,IL -1505740608,1505740631,GB -1505740632,1505740799,IL -1505740800,1505746943,GB +1505738752,1505746943,GB 1505746944,1505755135,RU 1505755136,1506017279,GB 1506017280,1506082815,IR 1506082816,1506148351,GB -1506148352,1506218751,IR -1506218752,1506219007,DE -1506219008,1506219263,IR -1506219264,1506219519,DE -1506219520,1506219775,IR -1506219776,1506220031,DE -1506220032,1506261759,IR -1506261760,1506262783,DE -1506262784,1506265343,IR -1506265344,1506267135,DE -1506267136,1506270207,IR -1506270208,1506271231,DE -1506271232,1506274303,IR -1506274304,1506274559,DE -1506274560,1506274815,IR -1506274816,1506275071,DE -1506275072,1506279423,IR +1506148352,1506279423,IR 1506279424,1506312191,NL 1506312192,1506316287,GB 1506316288,1506322431,PL @@ -21218,21 +22047,33 @@ 1506446824,1506446831,NL 1506446832,1506448319,GB 1506448320,1506448383,IT -1506448384,1506450047,GB +1506448384,1506449263,GB +1506449264,1506449279,BE +1506449280,1506450047,GB 1506450048,1506450111,CH 1506450112,1506450863,GB 1506450864,1506450879,CZ 1506450880,1506453311,GB 1506453312,1506453319,SE -1506453320,1506456831,GB -1506456832,1506457087,IT -1506457088,1506458244,GB +1506453320,1506456533,GB +1506456534,1506456534,IT +1506456535,1506458244,GB 1506458245,1506458245,CH -1506458246,1506460151,GB +1506458246,1506459207,GB +1506459208,1506459247,BE +1506459248,1506459295,GB +1506459296,1506459327,BE +1506459328,1506459968,GB +1506459969,1506459969,FR +1506459970,1506460151,GB 1506460152,1506460159,FR -1506460160,1506462719,GB +1506460160,1506462511,GB +1506462512,1506462527,FR +1506462528,1506462719,GB 1506462720,1506462975,IT -1506462976,1506463679,GB +1506462976,1506463551,GB +1506463552,1506463615,DE +1506463616,1506463679,GB 1506463680,1506463695,DE 1506463696,1506464895,GB 1506464896,1506464911,NL @@ -21241,8 +22082,8 @@ 1506465189,1506466383,GB 1506466384,1506466391,DE 1506466392,1506466399,GB -1506466400,1506466431,DE -1506466432,1506469663,GB +1506466400,1506466559,DE +1506466560,1506469663,GB 1506469664,1506469695,IT 1506469696,1506469759,GB 1506469760,1506469775,IT @@ -21250,11 +22091,7 @@ 1506471984,1506471999,NL 1506472000,1506472031,GB 1506472032,1506472047,NL -1506472048,1506473471,GB -1506473472,1506473727,IT -1506473728,1506474239,GB -1506474240,1506474495,IT -1506474496,1506476031,GB +1506472048,1506476031,GB 1506476032,1506508799,KW 1506508800,1506541567,CZ 1506541568,1506574335,RU @@ -21289,9 +22126,7 @@ 1506793472,1506795519,RU 1506795520,1506799615,CH 1506799616,1506801663,LV -1506801664,1506803135,DE -1506803136,1506803151,CH -1506803152,1506803711,DE +1506801664,1506803711,DE 1506803712,1506869247,RU 1506869248,1506934783,UA 1506934784,1507000319,GR @@ -21302,10 +22137,12 @@ 1507262464,1507327999,BG 1507328000,1507393535,RS 1507393536,1507459071,CH -1507459072,1507502847,KZ -1507502848,1507503103,GB -1507503104,1507524607,KZ -1507524608,1507590143,EE +1507459072,1507483903,KZ +1507483904,1507484159,NZ +1507484160,1507524607,KZ +1507524608,1507525631,EE +1507525632,1507529727,KZ +1507529728,1507590143,EE 1507590144,1507655679,NL 1507655680,1507659775,DE 1507659776,1507663871,RU @@ -21346,15 +22183,13 @@ 1508589568,1508605951,IR 1508605952,1508622335,RU 1508622336,1508638719,EE -1508638720,1508639999,SE -1508640000,1508640255,DK -1508640256,1508642175,SE +1508638720,1508642175,SE 1508642176,1508642303,DK 1508642304,1508642559,SE 1508642560,1508642815,DK -1508642816,1508650751,SE -1508650752,1508651007,DK -1508651008,1508655103,SE +1508642816,1508647691,SE +1508647692,1508647692,DK +1508647693,1508655103,SE 1508655104,1508671487,FI 1508671488,1508687871,CH 1508687872,1508704255,UZ @@ -21365,9 +22200,7 @@ 1508769792,1508786175,PL 1508786176,1508802559,DE 1508802560,1508818943,GB -1508818944,1508819711,RO -1508819712,1508819967,DE -1508819968,1508830719,RO +1508818944,1508830719,RO 1508830720,1508831487,SK 1508831488,1508835327,RO 1508835328,1508851711,CZ @@ -21385,9 +22218,7 @@ 1509449728,1509453823,ES 1509453824,1509457919,RU 1509457920,1509462015,NL -1509462016,1509465599,LI -1509465600,1509465855,CH -1509465856,1509466111,LI +1509462016,1509466111,LI 1509466112,1509470207,NL 1509470208,1509478399,RU 1509478400,1509482495,FR @@ -21448,230 +22279,354 @@ 1509883904,1509900287,NL 1509900288,1509916671,RU 1509916672,1509933055,GB -1509933056,1509949439,US -1509949440,1510663167,FR -1510663168,1510663423,RE -1510663424,1511981055,FR -1511981056,1511981567,RE -1511981568,1511982591,FR -1511982592,1511983615,RE -1511983616,1511984639,FR -1511984640,1511985151,RE -1511985152,1511985407,FR -1511985408,1511986175,RE -1511986176,1511986431,FR -1511986432,1511986687,RE -1511986688,1511986943,FR -1511986944,1511987199,RE -1511987200,1511987967,FR -1511987968,1511988479,RE -1511988480,1511988735,FR -1511988736,1511989247,RE -1511989248,1511989503,FR -1511989504,1511990271,RE -1511990272,1511990527,FR -1511990528,1511991295,RE -1511991296,1511991551,FR -1511991552,1511992575,RE -1511992576,1511993087,FR -1511993088,1511994367,RE -1511994368,1511995135,FR -1511995136,1511995391,RE -1511995392,1511995647,FR -1511995648,1511996415,RE -1511996416,1511996671,FR -1511996672,1511996927,RE -1511996928,1511997439,FR -1511997440,1511998207,MQ -1511998208,1511998463,FR -1511998464,1511998719,MQ -1511998720,1511998975,FR -1511998976,1511999487,MQ -1511999488,1511999743,FR -1511999744,1512001023,MQ -1512001024,1512001535,FR -1512001536,1512003583,MQ -1512003584,1512003839,FR -1512003840,1512004095,MQ -1512004096,1512004351,FR -1512004352,1512005631,MQ -1512005632,1512006143,BL -1512006144,1512006399,FR -1512006400,1512006911,BL -1512006912,1512007167,MF -1512007168,1512007423,FR -1512007424,1512007935,BL -1512007936,1512008191,FR -1512008192,1512008447,BL -1512008448,1512008703,MF -1512008704,1512009215,BL -1512009216,1512009471,MF -1512009472,1512010239,BL -1512010240,1512010495,GP -1512010496,1512010751,BL -1512010752,1512011263,MF -1512011264,1512012287,BL -1512012288,1512012543,FR -1512012544,1512013055,BL -1512013056,1512013311,FR -1512013312,1512013567,BL -1512013568,1512013823,FR -1512013824,1512016639,GF -1512016640,1512016895,FR -1512016896,1512018943,GF -1512018944,1512019199,FR -1512019200,1512020479,GF -1512020480,1512022015,FR -1512022016,1512022271,GF -1512022272,1512022527,FR -1512022528,1512028415,GF -1512028416,1512030207,FR +1509933056,1509949439,NL +1509949440,1510605311,FR +1510605312,1510605823,RE +1510605824,1510608383,FR +1510608384,1510608639,RE +1510608640,1510609407,FR +1510609408,1510610175,RE +1510610176,1510614015,FR +1510614016,1510614783,RE +1510614784,1510615039,FR +1510615040,1510615295,RE +1510615296,1510615551,FR +1510615552,1510616319,RE +1510616320,1510616575,FR +1510616576,1510616831,RE +1510616832,1510617087,FR +1510617088,1510617599,RE +1510617600,1510617855,FR +1510617856,1510619135,RE +1510619136,1510619391,FR +1510619392,1510620159,RE +1510620160,1510621695,FR +1510621696,1510621951,RE +1510621952,1510622463,FR +1510622464,1510622719,RE +1510622720,1510624511,FR +1510624512,1510624767,RE +1510624768,1510625791,FR +1510625792,1510626303,RE +1510626304,1510626815,FR +1510626816,1510627071,RE +1510627072,1510628351,FR +1510628352,1510628607,RE +1510628608,1510628863,FR +1510628864,1510629119,RE +1510629120,1510629631,FR +1510629632,1510629887,RE +1510629888,1510630399,FR +1510630400,1510630655,RE +1510630656,1510631167,FR +1510631168,1510631423,RE +1510631424,1510631935,FR +1510631936,1510632703,RE +1510632704,1510632959,FR +1510632960,1510633727,RE +1510633728,1510633983,FR +1510633984,1510635263,RE +1510635264,1510637567,FR +1510637568,1510638079,RE +1510638080,1510638335,FR +1510638336,1510638591,RE +1510638592,1510638847,FR +1510638848,1510639359,RE +1510639360,1510639871,FR +1510639872,1510640127,RE +1510640128,1510640383,FR +1510640384,1510641151,RE +1510641152,1510641407,FR +1510641408,1510641919,RE +1510641920,1510642431,FR +1510642432,1510642943,RE +1510642944,1510643455,FR +1510643456,1510643711,RE +1510643712,1510644479,FR +1510644480,1510645759,RE +1510645760,1510646015,FR +1510646016,1510646271,RE +1510646272,1510646783,FR +1510646784,1510647295,RE +1510647296,1510647807,FR +1510647808,1510648319,RE +1510648320,1510649343,FR +1510649344,1510649599,RE +1510649600,1510650623,FR +1510650624,1510650879,RE +1510650880,1510651135,FR +1510651136,1510651391,RE +1510651392,1510651647,FR +1510651648,1510652159,RE +1510652160,1510652927,FR +1510652928,1510653439,RE +1510653440,1510654719,FR +1510654720,1510654975,RE +1510654976,1510655487,FR +1510655488,1510656255,RE +1510656256,1510656511,FR +1510656512,1510657023,RE +1510657024,1510658303,FR +1510658304,1510658559,RE +1510658560,1510658815,FR +1510658816,1510659071,RE +1510659072,1510659839,FR +1510659840,1510660095,RE +1510660096,1510660863,FR +1510660864,1510661119,RE +1510661120,1510661375,FR +1510661376,1510661631,RE +1510661632,1510662399,FR +1510662400,1510663423,RE +1510663424,1510663679,FR +1510663680,1510663935,RE +1510663936,1510664447,FR +1510664448,1510664703,RE +1510664704,1510664959,FR +1510664960,1510665215,RE +1510665216,1510665983,FR +1510665984,1510667775,RE +1510667776,1511981567,FR +1511981568,1511982079,RE +1511982080,1511982335,FR +1511982336,1511982591,RE +1511982592,1511984383,FR +1511984384,1511984639,RE +1511984640,1511985151,FR +1511985152,1511985407,RE +1511985408,1511987199,FR +1511987200,1511987711,RE +1511987712,1511990271,FR +1511990272,1511990527,RE +1511990528,1511992575,FR +1511992576,1511992831,RE +1511992832,1511995391,FR +1511995392,1511995647,RE +1511995648,1511996415,FR +1511996416,1511996671,RE +1511996672,1511997183,FR +1511997184,1511997439,RE +1511997440,1511997695,FR +1511997696,1511998463,MQ +1511998464,1512001279,FR +1512001280,1512002047,MQ +1512002048,1512002303,FR +1512002304,1512002559,MQ +1512002560,1512006143,FR +1512006144,1512006399,MF +1512006400,1512006655,FR +1512006656,1512008191,BL +1512008192,1512008703,FR +1512008704,1512008959,BL +1512008960,1512010495,FR +1512010496,1512010751,MF +1512010752,1512011263,FR +1512011264,1512011775,BL +1512011776,1512012287,FR +1512012288,1512012543,BL +1512012544,1512012799,MF +1512012800,1512013055,FR +1512013056,1512013311,BL +1512013312,1512013567,FR +1512013568,1512013823,BL +1512013824,1512014335,FR +1512014336,1512015103,GF +1512015104,1512015615,FR +1512015616,1512016127,GF +1512016128,1512016383,FR +1512016384,1512018175,GF +1512018176,1512018431,FR +1512018432,1512018687,GF +1512018688,1512019711,FR +1512019712,1512019967,GF +1512019968,1512020479,FR +1512020480,1512021503,GF +1512021504,1512021759,FR +1512021760,1512023295,GF +1512023296,1512023551,FR +1512023552,1512023807,GF +1512023808,1512024831,FR +1512024832,1512025087,GF +1512025088,1512025599,FR +1512025600,1512026879,GF +1512026880,1512028159,FR +1512028160,1512030207,GF 1512030208,1512046591,YT -1512046592,1512767487,FR -1512767488,1512767743,RE -1512767744,1512767999,FR -1512768000,1512768255,RE -1512768256,1512768511,FR -1512768512,1512770047,RE -1512770048,1512770303,FR -1512770304,1512770815,RE -1512770816,1512771583,FR -1512771584,1512772351,RE -1512772352,1512772863,FR -1512772864,1512777215,RE -1512777216,1512777471,FR -1512777472,1512778495,RE -1512778496,1512779007,FR -1512779008,1512779519,RE -1512779520,1512780031,FR -1512780032,1512780287,RE -1512780288,1512780543,FR -1512780544,1512781567,RE -1512781568,1512782847,FR -1512782848,1512783103,RE -1512783104,1512783359,FR -1512783360,1512785919,RE -1512785920,1512787199,FR -1512787200,1512787967,RE -1512787968,1512788223,FR -1512788224,1512791807,RE -1512791808,1512793087,FR -1512793088,1512794111,RE -1512794112,1512794367,FR -1512794368,1512794623,RE -1512794624,1512794879,FR -1512794880,1512795135,RE -1512795136,1512795391,FR -1512795392,1512796415,RE -1512796416,1512796671,FR -1512796672,1512797183,RE -1512797184,1512797439,FR -1512797440,1512797695,RE -1512797696,1512797951,FR -1512797952,1512798207,RE -1512798208,1512799231,FR -1512799232,1512799487,RE -1512799488,1512800511,FR -1512800512,1512801023,MQ -1512801024,1512801535,FR -1512801536,1512802303,MQ -1512802304,1512802815,FR -1512802816,1512803071,MQ -1512803072,1512803327,FR -1512803328,1512803839,MQ -1512803840,1512804607,FR -1512804608,1512805375,MQ -1512805376,1512805631,FR -1512805632,1512806399,MQ -1512806400,1512806655,FR -1512806656,1512807423,MQ -1512807424,1512807679,FR -1512807680,1512807935,MQ -1512807936,1512808447,FR -1512808448,1512808959,MQ -1512808960,1512809215,FR -1512809216,1512810495,MQ -1512810496,1512810751,FR -1512810752,1512812543,MQ -1512812544,1512812799,FR -1512812800,1512813311,MQ -1512813312,1512813567,FR -1512813568,1512813823,MQ -1512813824,1512814079,FR -1512814080,1512815615,MQ -1512815616,1512815871,FR -1512815872,1512816639,MQ -1512816640,1512818431,GP -1512818432,1512818687,FR -1512818688,1512819967,GP -1512819968,1512820223,FR -1512820224,1512822271,GP -1512822272,1512822527,FR -1512822528,1512824319,GP -1512824320,1512824831,FR -1512824832,1512826367,GP -1512826368,1512826623,FR -1512826624,1512828671,GP -1512828672,1512828927,FR -1512828928,1512830463,GP -1512830464,1512830719,FR -1512830720,1512831999,GP -1512832000,1512832255,FR -1512832256,1512832767,GP -1512832768,1514110975,FR -1514110976,1514111487,GP -1514111488,1514111743,FR -1514111744,1514112255,GP -1514112256,1514112767,FR -1514112768,1514114047,GP -1514114048,1514114559,FR -1514114560,1514116863,GP -1514116864,1514117119,FR -1514117120,1514117887,GP -1514117888,1514118143,FR -1514118144,1514119423,GP -1514119424,1514119679,FR -1514119680,1514119935,GP -1514119936,1514120191,FR -1514120192,1514121215,GP -1514121216,1514121471,FR -1514121472,1514123007,GP -1514123008,1514123263,FR -1514123264,1514125055,GP -1514125056,1514125823,FR -1514125824,1514126079,GP -1514126080,1514126335,FR -1514126336,1514126591,GP -1514126592,1514127359,FR -1514127360,1514127871,RE -1514127872,1514128127,FR -1514128128,1514128895,RE -1514128896,1514129151,FR -1514129152,1514129919,RE -1514129920,1514130175,FR -1514130176,1514130687,RE -1514130688,1514130943,FR -1514130944,1514131455,RE -1514131456,1514131711,FR -1514131712,1514131967,RE -1514131968,1514132223,FR -1514132224,1514132735,RE -1514132736,1514132991,FR -1514132992,1514134015,RE -1514134016,1514134271,FR -1514134272,1514135295,RE -1514135296,1514135551,FR -1514135552,1514135807,RE -1514135808,1514136063,FR -1514136064,1514136831,RE -1514136832,1514137855,FR -1514137856,1514139391,RE -1514139392,1514139647,FR -1514139648,1514140415,RE -1514140416,1514140671,FR -1514140672,1514142207,RE -1514142208,1514142463,FR -1514142464,1514143743,RE +1512046592,1512308991,FR +1512308992,1512309247,GP +1512309248,1512310271,FR +1512310272,1512310527,GP +1512310528,1512310783,FR +1512310784,1512311295,GP +1512311296,1512311551,FR +1512311552,1512312063,GP +1512312064,1512314367,FR +1512314368,1512314623,GP +1512314624,1512314879,FR +1512314880,1512315391,GP +1512315392,1512315647,FR +1512315648,1512316159,GP +1512316160,1512316415,FR +1512316416,1512316927,GP +1512316928,1512317439,FR +1512317440,1512317951,GP +1512317952,1512318207,FR +1512318208,1512318463,GP +1512318464,1512319231,FR +1512319232,1512319487,GP +1512319488,1512319743,FR +1512319744,1512319999,GP +1512320000,1512320511,FR +1512320512,1512320767,GP +1512320768,1512322047,FR +1512322048,1512322303,GP +1512322304,1512322559,FR +1512322560,1512322815,GP +1512322816,1512323327,FR +1512323328,1512323583,GP +1512323584,1512324095,FR +1512324096,1512324351,GP +1512324352,1512324863,FR +1512324864,1512325119,GP +1512325120,1512325631,FR +1512325632,1512325887,GP +1512325888,1512326399,FR +1512326400,1512326655,GP +1512326656,1512327423,FR +1512327424,1512328191,GP +1512328192,1512329727,FR +1512329728,1512330239,GP +1512330240,1512330495,FR +1512330496,1512332287,GP +1512332288,1512332799,FR +1512332800,1512333311,GP +1512333312,1512334079,FR +1512334080,1512334335,GP +1512334336,1512334847,FR +1512334848,1512335103,GP +1512335104,1512335359,FR +1512335360,1512335871,GP +1512335872,1512336383,FR +1512336384,1512337151,GP +1512337152,1512338175,FR +1512338176,1512338431,GP +1512338432,1512338943,FR +1512338944,1512339199,GP +1512339200,1512339455,FR +1512339456,1512339711,GP +1512339712,1512340735,FR +1512340736,1512341247,GP +1512341248,1512341503,FR +1512341504,1512341759,GP +1512341760,1512342271,FR +1512342272,1512342527,GP +1512342528,1512343295,FR +1512343296,1512343551,GP +1512343552,1512344063,FR +1512344064,1512344575,GP +1512344576,1512344831,FR +1512344832,1512345087,GP +1512345088,1512345855,FR +1512345856,1512346111,GP +1512346112,1512346367,FR +1512346368,1512346623,GP +1512346624,1512347391,FR +1512347392,1512347903,GP +1512347904,1512348159,FR +1512348160,1512348927,GP +1512348928,1512349439,FR +1512349440,1512349951,GP +1512349952,1512350463,FR +1512350464,1512350719,GP +1512350720,1512351231,FR +1512351232,1512351487,GP +1512351488,1512351999,FR +1512352000,1512352767,GP +1512352768,1512353535,FR +1512353536,1512354047,GP +1512354048,1512354303,FR +1512354304,1512354559,GP +1512354560,1512354815,FR +1512354816,1512355327,GP +1512355328,1512356095,FR +1512356096,1512356351,GP +1512356352,1512356607,FR +1512356608,1512356863,GP +1512356864,1512357119,FR +1512357120,1512357375,GP +1512357376,1512357631,FR +1512357632,1512357887,GP +1512357888,1512358655,FR +1512358656,1512359167,GP +1512359168,1512359423,FR +1512359424,1512360191,GP +1512360192,1512360447,FR +1512360448,1512361471,GP +1512361472,1512361727,FR +1512361728,1512361983,GP +1512361984,1512362239,FR +1512362240,1512362495,GP +1512362496,1512363007,FR +1512363008,1512363263,GP +1512363264,1512363519,FR +1512363520,1512363775,GP +1512363776,1512364031,FR +1512364032,1512364287,GP +1512364288,1512364543,FR +1512364544,1512366847,GP +1512366848,1512367359,FR +1512367360,1512367615,GP +1512367616,1512368127,FR +1512368128,1512368383,GP +1512368384,1512368639,FR +1512368640,1512368895,GP +1512368896,1512370431,FR +1512370432,1512370441,GP +1512370442,1512370442,FR +1512370443,1512370687,GP +1512370688,1512370943,FR +1512370944,1512372223,GP +1512372224,1512372735,FR +1512372736,1512372991,GP +1512372992,1514111231,FR +1514111232,1514111743,GP +1514111744,1514111999,FR +1514112000,1514112255,GP +1514112256,1514113791,FR +1514113792,1514114047,GP +1514114048,1514114815,FR +1514114816,1514115071,GP +1514115072,1514115583,FR +1514115584,1514115839,GP +1514115840,1514116351,FR +1514116352,1514116607,GP +1514116608,1514119935,FR +1514119936,1514120191,GP +1514120192,1514121215,FR +1514121216,1514121471,GP +1514121472,1514123007,FR +1514123008,1514123263,GP +1514123264,1514124287,FR +1514124288,1514124543,GP +1514124544,1514127871,FR +1514127872,1514128127,RE +1514128128,1514128895,FR +1514128896,1514129407,RE +1514129408,1514131967,FR +1514131968,1514132223,RE +1514132224,1514132735,FR +1514132736,1514132991,RE +1514132992,1514134271,FR +1514134272,1514134527,RE +1514134528,1514136063,FR +1514136064,1514136319,RE +1514136320,1514137599,FR +1514137600,1514137855,RE +1514137856,1514142207,FR +1514142208,1514142719,RE +1514142720,1514142975,FR +1514142976,1514143231,RE +1514143232,1514143743,FR 1514143744,1514176511,SK 1514176512,1515467007,FR 1515467008,1515467263,ES @@ -21688,103 +22643,97 @@ 1515488512,1515488895,US 1515488896,1515489023,FR 1515489024,1515489039,DE -1515489040,1515489151,FR +1515489040,1515489055,FR +1515489056,1515489087,DE +1515489088,1515489151,FR 1515489152,1515489167,ES -1515489168,1518338047,FR +1515489168,1515489791,FR +1515489792,1515491007,NL +1515491008,1518338047,FR 1518338048,1518370815,DE -1518370816,1518403839,NL -1518403840,1518404095,SE -1518404096,1518404351,NL -1518404352,1518404863,SE -1518404864,1518405119,NL -1518405120,1518405375,SE -1518405376,1518406655,NL -1518406656,1518406911,SE -1518406912,1518407935,NL -1518407936,1518408191,SE -1518408192,1518409727,NL -1518409728,1518436351,SE +1518370816,1518409727,NL +1518409728,1518412031,SE +1518412032,1518413567,NO +1518413568,1518413823,SE +1518413824,1518418943,NO +1518418944,1518419199,SE +1518419200,1518419967,NO +1518419968,1518436351,SE 1518436352,1518452735,NO 1518452736,1518460927,AT -1518460928,1518470143,NL -1518470144,1518472191,SE +1518460928,1518471167,NL +1518471168,1518472191,SE 1518472192,1518475263,LT 1518475264,1518476287,SE 1518476288,1518476799,EE 1518476800,1518477311,SE 1518477312,1518481407,EE 1518481408,1518489599,SE -1518489600,1518490623,NL -1518490624,1518493695,SE -1518493696,1518501887,NL +1518489600,1518501887,NL 1518501888,1518503935,EE 1518503936,1518510079,LT 1518510080,1518516223,LV 1518516224,1518517247,SE 1518517248,1518518271,LV -1518518272,1518540543,SE +1518518272,1518532351,SE +1518532352,1518532607,NO +1518532608,1518532863,SE +1518532864,1518533375,NO +1518533376,1518533887,SE +1518533888,1518534143,NO +1518534144,1518540543,SE 1518540544,1518540799,LT -1518540800,1518542847,SE +1518540800,1518541479,SE +1518541480,1518541480,DE +1518541481,1518542847,SE 1518542848,1518551039,LT 1518551040,1518565375,NL 1518565376,1518567423,SE -1518567424,1518568703,LV -1518568704,1518568959,SE -1518568960,1518570239,LV -1518570240,1518570495,SE -1518570496,1518572543,LV -1518572544,1518572799,SE -1518572800,1518573311,LV -1518573312,1518573823,SE -1518573824,1518574335,LV -1518574336,1518574591,SE -1518574592,1518576127,LV -1518576128,1518576383,SE -1518576384,1518577407,LV -1518577408,1518577919,SE -1518577920,1518578687,LV -1518578688,1518578943,SE -1518578944,1518580479,LV -1518580480,1518580735,SE -1518580736,1518582271,LV -1518582272,1518582527,SE -1518582528,1518583039,LV -1518583040,1518583295,SE -1518583296,1518585343,LV -1518585344,1518585599,SE -1518585600,1518585855,LV -1518585856,1518586111,SE -1518586112,1518586623,LV -1518586624,1518586879,SE -1518586880,1518587647,LV -1518587648,1518587903,SE -1518587904,1518591743,LV -1518591744,1518591999,SE -1518592000,1518592255,LV -1518592256,1518592511,SE -1518592512,1518594047,LV -1518594048,1518594303,SE -1518594304,1518594815,LV -1518594816,1518595071,SE -1518595072,1518595327,LV -1518595328,1518595583,SE -1518595584,1518600191,LV +1518567424,1518600191,LV 1518600192,1518633215,SE 1518633216,1518633471,NL 1518633472,1518635007,SE 1518635008,1518637055,NL 1518637056,1518641151,SE 1518641152,1518649343,NL -1518649344,1518665727,SE -1518665728,1518727167,RU -1518727168,1518731263,SE +1518649344,1518682879,SE +1518682880,1518683135,RU +1518683136,1518731263,SE 1518731264,1518747647,DE 1518747648,1518772223,LT 1518772224,1518780415,NL 1518780416,1518796799,HR 1518796800,1518927871,DE -1518927872,1518944255,RU -1518944256,1518960639,SE +1518927872,1518944255,SE +1518944256,1518945023,NL +1518945024,1518945535,SE +1518945536,1518946303,NL +1518946304,1518946815,SE +1518946816,1518947327,NL +1518947328,1518948095,SE +1518948096,1518948351,NL +1518948352,1518948863,SE +1518948864,1518949119,NL +1518949120,1518949631,SE +1518949632,1518950911,NL +1518950912,1518951167,SE +1518951168,1518951679,NL +1518951680,1518952191,SE +1518952192,1518954751,NL +1518954752,1518955007,SE +1518955008,1518955775,NL +1518955776,1518956031,SE +1518956032,1518956543,NL +1518956544,1518957311,SE +1518957312,1518957823,NL +1518957824,1518958079,SE +1518958080,1518958591,NL +1518958592,1518958847,SE +1518958848,1518959103,NL +1518959104,1518959359,SE +1518959360,1518959871,NL +1518959872,1518960127,SE +1518960128,1518960639,NL 1518960640,1518961663,LT 1518961664,1518962175,EE 1518962176,1518962687,SE @@ -21792,51 +22741,79 @@ 1518964736,1518966783,HR 1518966784,1518967807,SE 1518967808,1518977023,HR -1518977024,1518993407,SE -1518993408,1519190015,RU -1519190016,1519206399,SE +1518977024,1518977791,SE +1518977792,1518978559,NL +1518978560,1518979071,SE +1518979072,1518980095,NL +1518980096,1518980607,SE +1518980608,1518980863,NL +1518980864,1518981631,SE +1518981632,1518982143,NL +1518982144,1518982399,SE +1518982400,1518982655,NL +1518982656,1518983935,SE +1518983936,1518984191,NL +1518984192,1518989311,SE +1518989312,1518992127,NL +1518992128,1518992383,SE +1518992384,1518992639,NL +1518992640,1518992895,SE +1518992896,1518993152,NL +1518993153,1519190271,SE +1519190272,1519190783,NL +1519190784,1519191551,SE +1519191552,1519192063,NL +1519192064,1519193343,SE +1519193344,1519194111,NL +1519194112,1519194623,SE +1519194624,1519194879,NL +1519194880,1519195135,SE +1519195136,1519196671,NL +1519196672,1519197183,SE +1519197184,1519197951,NL +1519197952,1519200255,SE +1519200256,1519200511,EE +1519200512,1519201023,SE +1519201024,1519201279,EE +1519201280,1519202303,SE +1519202304,1519202815,EE +1519202816,1519203071,SE +1519203072,1519203327,EE +1519203328,1519203583,SE +1519203584,1519204351,EE +1519204352,1519204607,SE +1519204608,1519204863,EE +1519204864,1519205631,SE +1519205632,1519206143,EE +1519206144,1519206399,SE 1519206400,1519208447,LV 1519208448,1519214591,SE -1519214592,1519214847,LV -1519214848,1519215359,SE -1519215360,1519215615,LV -1519215616,1519215871,SE -1519215872,1519219455,LV +1519214592,1519219455,LV 1519219456,1519219711,SE 1519219712,1519222783,LV 1519222784,1519259647,SE 1519259648,1519260671,NL 1519260672,1519263743,SE -1519263744,1519289343,NL -1519289344,1519292415,SE +1519263744,1519290367,NL +1519290368,1519292415,SE 1519292416,1519293951,LT -1519293952,1519297023,SE -1519297024,1519297279,LT -1519297280,1519297535,SE -1519297536,1519297791,LT -1519297792,1519298559,SE -1519298560,1519298815,LT -1519298816,1519300607,SE +1519293952,1519296511,SE +1519296512,1519299583,LT +1519299584,1519300607,SE 1519300608,1519304703,LT -1519304704,1519313151,SE -1519313152,1519313407,LT -1519313408,1519313663,SE -1519313664,1519313919,LT -1519313920,1519314175,SE -1519314176,1519318271,LT -1519318272,1519318527,SE -1519318528,1519321087,LT -1519321088,1519386623,RU -1519386624,1519394815,SE +1519304704,1519305983,NL +1519305984,1519306239,SE +1519306240,1519307775,NL +1519307776,1519308031,SE +1519308032,1519308287,NL +1519308288,1519308543,SE +1519308544,1519308799,NL +1519308800,1519312895,SE +1519312896,1519321087,LT +1519321088,1519394815,SE 1519394816,1519398911,HR 1519398912,1519403007,SE -1519403008,1519411711,NL -1519411712,1519411967,SE -1519411968,1519415295,NL -1519415296,1519415551,SE -1519415552,1519416575,NL -1519416576,1519416831,SE -1519416832,1519419391,NL +1519403008,1519419391,NL 1519419392,1519452159,SE 1519452160,1519517695,NL 1519517696,1519583231,AT @@ -21867,19 +22844,13 @@ 1520271360,1520304127,SI 1520304128,1520435199,TR 1520435200,1521483775,ES -1521483776,1521531391,CZ -1521531392,1521531647,PL -1521531648,1522008063,CZ +1521483776,1522008063,CZ 1522008064,1522139135,DK 1522139136,1522270207,DE 1522270208,1522401279,RU 1522401280,1522532351,EE 1522532352,1524629503,GB -1524629504,1525092351,SE -1525092352,1525092479,DK -1525092480,1525122047,SE -1525122048,1525122175,DK -1525122176,1525678079,SE +1524629504,1525678079,SE 1525678080,1526726655,GB 1526726656,1531183103,DE 1531183104,1531445247,FR @@ -21890,9 +22861,7 @@ 1532199936,1532200959,RS 1532200960,1532231679,HU 1532231680,1532362751,GB -1532362752,1532408063,BE -1532408064,1532408319,DE -1532408320,1532493823,BE +1532362752,1532493823,BE 1532493824,1532559359,FR 1532559360,1532624895,DE 1532624896,1532626943,ES @@ -21953,13 +22922,13 @@ 1533472768,1533474815,ES 1533474816,1533476863,FR 1533476864,1533478911,IE -1533478912,1533480959,RS 1533480960,1533483007,NL 1533483008,1533485055,AM 1533485056,1533486079,GB 1533486080,1533486335,SE 1533486336,1533486591,NO -1533486592,1533487103,GB +1533486592,1533486847,DK +1533486848,1533487103,GB 1533487104,1533489151,FR 1533489152,1533491199,ES 1533491200,1533493247,AM @@ -22037,29 +23006,7 @@ 1533929472,1533932799,GB 1533932800,1533933055,DE 1533933056,1534066687,GB -1534066688,1534135295,AT -1534135296,1534135423,HU -1534135424,1534145279,AT -1534145280,1534145407,DE -1534145408,1534147711,AT -1534147712,1534147839,CZ -1534147840,1534156543,AT -1534156544,1534156671,SK -1534156672,1534241535,AT -1534241536,1534241663,DE -1534241664,1534268671,AT -1534268672,1534268927,HU -1534268928,1534279423,AT -1534279424,1534279551,SK -1534279552,1534298751,AT -1534298752,1534298879,HU -1534298880,1534299903,AT -1534299904,1534300159,HU -1534300160,1534302975,AT -1534302976,1534303231,HU -1534303232,1534303999,AT -1534304000,1534304255,SK -1534304256,1534328831,AT +1534066688,1534328831,AT 1534328832,1534459903,ES 1534459904,1534590975,AT 1534590976,1534656511,HU @@ -22067,7 +23014,9 @@ 1534711808,1534712831,BE 1534712832,1534714415,FR 1534714416,1534714431,ES -1534714432,1534714751,FR +1534714432,1534714639,FR +1534714640,1534714655,IE +1534714656,1534714751,FR 1534714752,1534714767,DE 1534714768,1534715263,FR 1534715264,1534715267,IT @@ -22122,14 +23071,14 @@ 1534849024,1534853119,NL 1534853120,1534918655,UA 1534918656,1534984191,GB -1534984192,1534985215,NO -1534985216,1535049727,ES +1534984192,1534988287,NO +1534988288,1535049727,ES 1535049728,1535115263,SK -1535115264,1535146495,AT -1535146496,1535146751,CH -1535146752,1535197183,AT -1535197184,1535203071,EE -1535203072,1535246335,SE +1535115264,1535197183,AT +1535197184,1535203359,EE +1535203360,1535205375,SE +1535205376,1535213567,EE +1535213568,1535246335,SE 1535246336,1535311871,AT 1535311872,1535344639,NO 1535344640,1535350783,LV @@ -22137,8 +23086,7 @@ 1535352832,1535361023,EE 1535361024,1535377407,NL 1535377408,1535442943,GR -1535442944,1535450879,RU -1535450880,1535451135,FI +1535442944,1535451135,RU 1535451136,1535459327,DK 1535459328,1535475711,AT 1535475712,1535508479,IR @@ -22165,17 +23113,13 @@ 1535631360,1535635455,GB 1535635456,1535639551,AZ 1535639552,1535672319,GB -1535672320,1535706111,DE -1535706112,1535707135,CH -1535707136,1535709183,DE -1535709184,1535715327,CH -1535715328,1535717375,DE -1535717376,1535721471,CH -1535721472,1535721727,DE -1535721728,1535737855,CH -1535737856,1535746815,HU -1535746816,1535747071,RS -1535747072,1535770623,HU +1535672320,1535721727,DE +1535721728,1535727871,CH +1535727872,1535728127,DE +1535728128,1535732735,CH +1535732736,1535735807,DE +1535735808,1535737855,CH +1535737856,1535770623,HU 1535770624,1535803391,CH 1535803392,1535836159,GR 1535836160,1535868927,CZ @@ -22277,9 +23221,7 @@ 1536684032,1536688127,GB 1536688128,1537212415,FI 1537212416,1538260991,FR -1538260992,1538628607,BE -1538628608,1538629119,FR -1538629120,1538785279,BE +1538260992,1538785279,BE 1538785280,1538793471,NL 1538793472,1538797567,DE 1538797568,1538801663,NL @@ -22358,7 +23300,11 @@ 1539211264,1539213311,CZ 1539213312,1539215359,SE 1539215360,1539219455,DE -1539219456,1539221247,GG +1539219456,1539219967,GG +1539219968,1539220223,GB +1539220224,1539220479,GG +1539220480,1539220991,GB +1539220992,1539221247,GG 1539221248,1539221503,GB 1539221504,1539223551,FR 1539223552,1539225599,RU @@ -22374,8 +23320,7 @@ 1539260416,1539276799,SK 1539276800,1539280895,SE 1539280896,1539284991,FR -1539284992,1539287039,DE -1539287040,1539289087,TR +1539284992,1539289087,TR 1539289088,1539293183,RU 1539293184,1539297279,AZ 1539297280,1539301375,BG @@ -22484,7 +23429,7 @@ 1539427328,1539428351,UA 1539428352,1539429375,PL 1539429376,1539434495,RU -1539434496,1539435519,UA +1539434496,1539435519,GB 1539435520,1539437567,RU 1539437568,1539438591,GB 1539439616,1539440639,UA @@ -23266,8 +24211,7 @@ 1539865600,1539866623,UA 1539866624,1539867647,IT 1539867648,1539868671,RO -1539868672,1539868927,UA -1539868928,1539869695,RU +1539868672,1539869695,RU 1539869696,1539870719,ES 1539870720,1539871743,IL 1539872768,1539873791,SE @@ -23407,7 +24351,6 @@ 1540050944,1540052991,RU 1540052992,1540054015,UA 1540055040,1540056063,NO -1540056064,1540057087,NL 1540057088,1540057343,PL 1540057344,1540057599,RU 1540057600,1540057855,US @@ -23432,7 +24375,7 @@ 1540081664,1540082687,DE 1540082688,1540083711,NO 1540083712,1540084735,RU -1540084736,1540085759,NL +1540084736,1540085759,DE 1540085760,1540087807,PL 1540087808,1540088831,RU 1540089856,1540092927,RU @@ -23519,8 +24462,8 @@ 1540199424,1540200447,CH 1540200448,1540201471,IL 1540201472,1540202495,UA -1540202496,1540203519,RU -1540203520,1540204543,UA +1540202496,1540204287,RU +1540204288,1540204543,UA 1540204544,1540205567,RU 1540205568,1540206591,DE 1540206592,1540208639,RU @@ -23566,7 +24509,6 @@ 1540242944,1540243455,RU 1540243456,1540243967,PL 1540243968,1540244479,RU -1540244480,1540244735,CH 1540244992,1540245503,DE 1540245504,1540246015,RU 1540246016,1540246527,IT @@ -23641,7 +24583,8 @@ 1540284928,1540285439,UA 1540285440,1540285951,DE 1540285952,1540286463,RU -1540286464,1540286975,NL +1540286464,1540286719,GB +1540286720,1540286975,NL 1540286976,1540287487,GB 1540287488,1540288511,AT 1540288512,1540289535,RU @@ -23764,7 +24707,7 @@ 1540361472,1540361727,DE 1540361728,1540361983,IT 1540361984,1540362239,EE -1540362240,1540363263,DE +1540362496,1540363007,DE 1540363264,1540363519,RU 1540363776,1540364031,IS 1540364032,1540364287,RU @@ -24252,7 +25195,6 @@ 1540588544,1540589567,UA 1540589568,1540593663,RU 1540594688,1540595711,IT -1540595712,1540596735,UZ 1540596736,1540597759,FR 1540597760,1540598783,SE 1540598784,1540600831,UA @@ -24291,7 +25233,6 @@ 1540624384,1540624639,IR 1540624640,1540624895,BG 1540624896,1540625151,GB -1540625152,1540625407,IR 1540625664,1540625919,FR 1540625920,1540626175,UA 1540626176,1540626431,RO @@ -24313,7 +25254,6 @@ 1540631040,1540631295,NL 1540631296,1540631551,CH 1540631552,1540631807,HR -1540631808,1540632063,LV 1540632064,1540632319,AT 1540632320,1540632575,RU 1540632576,1540632831,DK @@ -24358,7 +25298,6 @@ 1540645120,1540645375,RU 1540645376,1540645631,BE 1540645632,1540645887,NL -1540645888,1540646143,PL 1540646144,1540646399,RO 1540646400,1540646655,PS 1540646656,1540646911,SE @@ -24386,7 +25325,7 @@ 1540653056,1540653311,FR 1540653312,1540653567,DK 1540653568,1540653823,DE -1540653824,1540654335,GB +1540653824,1540654079,GB 1540654336,1540654591,RU 1540654592,1540654847,SI 1540654848,1540655103,RU @@ -24470,7 +25409,6 @@ 1540678656,1540678911,SE 1540678912,1540679167,GB 1540679168,1540679423,RU -1540679424,1540679679,PL 1540679680,1540679935,LT 1540679936,1540680191,BG 1540680192,1540680447,CH @@ -24525,7 +25463,7 @@ 1540693760,1540694015,UZ 1540694016,1540694271,CH 1540694272,1540694527,UA -1540694528,1540695039,RO +1540694528,1540694783,RO 1540695040,1540695295,DE 1540695296,1540695551,NL 1540695552,1540695807,PL @@ -24560,7 +25498,6 @@ 1540703488,1540703743,NL 1540703744,1540703999,DK 1540704000,1540704255,PL -1540704256,1540704511,KZ 1540704512,1540704767,IE 1540705280,1540705535,RO 1540705536,1540705791,AT @@ -24579,7 +25516,6 @@ 1540708864,1540709119,FR 1540709120,1540709375,DE 1540709376,1540709631,UA -1540709632,1540709887,KZ 1540709888,1540710143,UA 1540710144,1540710399,NL 1540710400,1540710655,PL @@ -24624,7 +25560,6 @@ 1540722688,1540722943,RU 1540722944,1540723455,FR 1540723456,1540723711,SI -1540723712,1540723967,RU 1540723968,1540724223,UA 1540724224,1540724479,HU 1540724736,1540724991,CH @@ -24690,7 +25625,6 @@ 1540742144,1540742399,RU 1540742400,1540742655,DE 1540742656,1540742911,AT -1540742912,1540743167,RU 1540743168,1540743423,NO 1540743424,1540743679,GB 1540743680,1540743935,PL @@ -24726,7 +25660,6 @@ 1540756480,1540757503,DK 1540757504,1540758527,PL 1540758528,1540759551,UA -1540760064,1540760319,UA 1540760576,1540761599,PL 1540761600,1540762623,RU 1540762624,1540763647,LU @@ -24745,9 +25678,9 @@ 1540779008,1540780031,NL 1540780032,1540781055,UA 1540781056,1540783103,RU -1540783104,1540784639,UA -1540784640,1540784895,RU -1540784896,1540787199,UA +1540783104,1540784383,UA +1540784384,1540785151,RU +1540785152,1540787199,UA 1540787200,1540788223,KZ 1540788224,1540790271,RU 1540790272,1540791295,KW @@ -24799,11 +25732,10 @@ 1540848640,1540849663,UA 1540849664,1540850687,RU 1540850688,1540851711,FI -1540851712,1540852735,UA -1540852736,1540853759,RU +1540851712,1540853759,RU 1540853760,1540854783,UA 1540854784,1540855807,NL -1540855808,1540856831,RU +1540855808,1540856831,UA 1540856832,1540857855,NL 1540857856,1540858879,DK 1540858880,1540859903,GB @@ -24811,7 +25743,9 @@ 1540860928,1540861951,KZ 1540861952,1540862975,BY 1540862976,1540865023,GB -1540865024,1540872191,RU +1540865024,1540867071,RU +1540867072,1540868095,KZ +1540868096,1540872191,RU 1540872192,1540873215,BG 1540873216,1540875263,RU 1540875264,1540876287,PL @@ -25265,7 +26199,7 @@ 1541070848,1541071871,IT 1541071872,1541072895,RU 1541072896,1541073919,CZ -1541073920,1541074943,RO +1541073920,1541074943,GB 1541074944,1541075967,PL 1541075968,1541078015,RU 1541078016,1541079039,RO @@ -25316,8 +26250,7 @@ 1541133312,1541134335,RO 1541134336,1541135359,SE 1541135360,1541136383,UA -1541136384,1541138431,RU -1541138432,1541139455,UA +1541136384,1541139455,RU 1541139456,1541140479,HU 1541140480,1541142527,CZ 1541142528,1541143551,RU @@ -25399,13 +26332,11 @@ 1541165312,1541165567,RU 1541165568,1541165823,NL 1541165824,1541166079,GB -1541166080,1541166335,RU 1541166336,1541166591,FR 1541166592,1541166847,RO 1541166848,1541167103,RU 1541167104,1541167359,NL 1541167360,1541167615,AT -1541167616,1541167871,RU 1541167872,1541168127,UA 1541168128,1541168639,RU 1541168640,1541168895,MD @@ -25439,7 +26370,6 @@ 1541176064,1541176319,NL 1541176320,1541176575,AM 1541176576,1541176831,DE -1541176832,1541177087,RU 1541177088,1541177343,GB 1541177344,1541177599,CH 1541177600,1541177855,DE @@ -25510,7 +26440,6 @@ 1541195520,1541195775,GB 1541195776,1541196031,FR 1541196032,1541196287,CZ -1541196288,1541196543,RU 1541196800,1541197055,UA 1541197056,1541197311,PL 1541197312,1541197567,RU @@ -25592,7 +26521,6 @@ 1541228032,1541228543,RU 1541228544,1541229055,CZ 1541229056,1541229567,UA -1541229568,1541230079,RU 1541230080,1541230591,RO 1541230592,1541231103,RU 1541231104,1541231615,GB @@ -25729,7 +26657,7 @@ 1541338112,1541341183,UA 1541341184,1541341439,TR 1541341440,1541341695,RU -1541341696,1541341951,HU +1541341696,1541341951,DE 1541341952,1541342463,PL 1541342464,1541342719,FR 1541342720,1541342975,PL @@ -25993,7 +26921,7 @@ 1541420032,1541420543,RU 1541420544,1541421055,NL 1541421056,1541421567,PL -1541421568,1541422079,GB +1541421568,1541422079,CZ 1541422080,1541422591,PL 1541422592,1541423103,RU 1541423616,1541424127,AT @@ -26004,8 +26932,8 @@ 1541426176,1541426687,RU 1541426688,1541427199,UA 1541427200,1541428223,RU -1541428224,1541428991,UA -1541428992,1541429247,RU +1541428224,1541428735,UA +1541428736,1541429247,RU 1541429248,1541429759,FI 1541429760,1541430271,CZ 1541430272,1541430783,LT @@ -26116,7 +27044,9 @@ 1541532672,1541533695,RU 1541533696,1541534719,PL 1541534720,1541535743,IT -1541535744,1541536767,US +1541535744,1541536255,US +1541536256,1541536511,IE +1541536512,1541536767,US 1541536768,1541537791,RU 1541537792,1541538303,GB 1541538304,1541538815,RO @@ -26145,15 +27075,14 @@ 1541552128,1541553151,UA 1541553152,1541555199,RU 1541555200,1541556223,PL -1541556224,1541556479,UA 1541556480,1541556735,RU 1541556736,1541557247,IT 1541557504,1541557759,SI -1541557760,1541558015,RU 1541558016,1541558271,HU 1541558272,1541559295,RU 1541560320,1541561343,DE -1541561344,1541562879,RU +1541561344,1541562367,RU +1541562624,1541562879,RU 1541562880,1541563135,FR 1541563136,1541563391,NL 1541563392,1541564415,PL @@ -26386,7 +27315,7 @@ 1541700864,1541701119,PL 1541701120,1541701631,IL 1541701632,1541702655,RO -1541702656,1541703679,RU +1541703424,1541703679,RU 1541703680,1541704703,PL 1541704704,1541706239,RO 1541706240,1541706751,UA @@ -26401,7 +27330,6 @@ 1541711872,1541712127,FR 1541712128,1541712383,TR 1541712384,1541712895,DE -1541712896,1541713919,RU 1541713920,1541714175,NL 1541714176,1541716223,RU 1541716224,1541716479,PL @@ -26454,7 +27382,6 @@ 1541740032,1541740287,PL 1541740288,1541740543,NL 1541740544,1541740799,CZ -1541740800,1541741055,RU 1541741056,1541741567,PL 1541741568,1541742079,SK 1541742080,1541742591,RO @@ -26467,7 +27394,6 @@ 1541746944,1541747199,NL 1541747200,1541747711,RU 1541747712,1541748735,UA -1541748736,1541748991,RU 1541748992,1541749247,AT 1541749248,1541749503,ES 1541749504,1541749759,RU @@ -26557,7 +27483,7 @@ 1541795584,1541795839,ES 1541795840,1541796863,UA 1541796864,1541797375,RU -1541797376,1541798143,GB +1541797376,1541797887,GB 1541798144,1541798911,PL 1541798912,1541799935,CZ 1541799936,1541800447,FR @@ -26738,7 +27664,6 @@ 1541893632,1541894143,PL 1541894144,1541895167,RU 1541895168,1541897727,PL -1541897728,1541897983,RU 1541897984,1541898239,UA 1541898240,1541900799,RU 1541900800,1541901055,RO @@ -27170,7 +28095,7 @@ 1542163456,1542163711,GB 1542163712,1542163967,FR 1542163968,1542164479,UA -1542164480,1542165759,RU +1542164480,1542165503,RU 1542165760,1542166015,PL 1542166016,1542166527,IL 1542166528,1542167551,PL @@ -27472,7 +28397,6 @@ 1542344448,1542345215,RU 1542345216,1542345471,UA 1542345472,1542345727,RU -1542345728,1542345983,UA 1542345984,1542346239,PL 1542346240,1542348287,RU 1542348288,1542348799,MD @@ -27558,7 +28482,7 @@ 1542392832,1542393087,RO 1542393088,1542393343,BG 1542393344,1542393599,IR -1542393600,1542394879,RU +1542393856,1542394879,RU 1542394880,1542395135,DE 1542395136,1542395391,ES 1542395392,1542395647,RU @@ -27754,7 +28678,6 @@ 1542498304,1542499583,RU 1542499584,1542499839,ES 1542499840,1542500095,GB -1542500096,1542500351,UA 1542500352,1542500607,GB 1542500608,1542500863,RO 1542500864,1542501119,GB @@ -27870,7 +28793,6 @@ 1542641664,1542641919,RO 1542641920,1542642175,AE 1542642176,1542642431,PL -1542642432,1542642687,RU 1542642688,1542643199,PL 1542643200,1542643455,UA 1542643456,1542643711,NL @@ -27882,7 +28804,8 @@ 1542669568,1542669823,NO 1542669824,1542670079,DE 1542670080,1542670335,CH -1542670336,1542671359,ES +1542670336,1542670591,US +1542670592,1542671359,ES 1542671360,1542671871,FR 1542671872,1542672383,RS 1542672384,1542681087,RU @@ -27963,7 +28886,6 @@ 1542849536,1542850559,UA 1542850560,1542851583,GB 1542851584,1542851839,BG -1542851840,1542852095,LU 1542852096,1542852351,KW 1542852352,1542852607,PL 1542852608,1542855167,RU @@ -28015,9 +28937,11 @@ 1542979584,1543110655,DE 1543110656,1543127039,UA 1543127040,1543143423,DE -1543143424,1543167999,RO +1543143424,1543159807,RO +1543159808,1543167999,SE 1543168000,1543172095,MD -1543172096,1543241727,RO +1543172096,1543176191,RO +1543176192,1543241727,IR 1543241728,1543503871,IT 1543503872,1545601023,GB 1545601024,1545674495,SE @@ -28026,8 +28950,8 @@ 1545863168,1545895935,RU 1545895936,1545928703,BA 1545928704,1545961471,SI -1545961472,1545994239,RU -1545994240,1545995263,CZ +1545961472,1545994751,RU +1545994752,1545995263,CZ 1545995264,1545995519,RU 1545995520,1545996287,CZ 1545996288,1545998335,RU @@ -28035,14 +28959,13 @@ 1546000384,1546001407,UZ 1546001408,1546002943,RU 1546002944,1546003199,UA -1546003200,1546003455,RU -1546003456,1546004479,CZ +1546003200,1546003967,RU +1546003968,1546004479,CZ 1546004480,1546004735,UA 1546004736,1546005247,CZ 1546005248,1546006527,RU 1546006528,1546008575,UA -1546008576,1546010623,BY -1546010624,1546014719,CZ +1546008576,1546014719,BY 1546014720,1546015743,RU 1546015744,1546027007,CZ 1546027008,1546059775,RU @@ -28056,7 +28979,7 @@ 1546088448,1546092543,GB 1546092544,1546096639,RU 1546096640,1546100735,IT -1546100736,1546104831,DE +1546100736,1546104831,AT 1546104832,1546108927,IE 1546108928,1546113023,IM 1546113024,1546121215,RU @@ -28067,7 +28990,9 @@ 1546122464,1546122479,DZ 1546122480,1546122649,FR 1546122650,1546122650,PT -1546122651,1546125311,FR +1546122651,1546122696,FR +1546122697,1546122697,ES +1546122698,1546125311,FR 1546125312,1546256383,GB 1546256384,1546264575,RU 1546264576,1546266623,TR @@ -28137,20 +29062,25 @@ 1546682368,1546698751,BE 1546698752,1546715135,NL 1546715136,1546731519,LV -1546731520,1546731775,RE -1546731776,1546735103,FR +1546731520,1546735103,FR 1546735104,1546735359,RE -1546735360,1546739711,FR -1546739712,1546739967,GP -1546739968,1546741503,FR -1546741504,1546742015,GP -1546742016,1546742527,FR -1546742528,1546743295,GF -1546743296,1546743551,FR -1546743552,1546743807,GF -1546743808,1546745087,FR -1546745088,1546745855,MQ -1546745856,1546747903,FR +1546735360,1546735871,FR +1546735872,1546736127,RE +1546736128,1546736639,FR +1546736640,1546736895,RE +1546736896,1546740223,FR +1546740224,1546740479,GP +1546740480,1546741503,FR +1546741504,1546741759,GP +1546741760,1546742527,FR +1546742528,1546743039,GF +1546743040,1546743295,FR +1546743296,1546743551,GF +1546743552,1546745599,FR +1546745600,1546745855,MQ +1546745856,1546746111,FR +1546746112,1546746367,MQ +1546746368,1546747903,FR 1546747904,1546764287,RU 1546764288,1546780671,UA 1546780672,1546797055,IR @@ -28162,7 +29092,9 @@ 1546911744,1546928127,SK 1546928128,1546944511,GB 1546944512,1546960895,UA -1546960896,1546977279,HU +1546960896,1546964991,HU +1546964992,1546966015,US +1546966016,1546977279,HU 1546977280,1546993663,MK 1546993664,1547010047,RU 1547010048,1547026431,SI @@ -28206,19 +29138,13 @@ 1547542528,1547546623,FR 1547546624,1547550719,IR 1547550720,1547554815,IE -1547554816,1547555071,AT -1547555072,1547555078,DE -1547555079,1547555079,AT -1547555080,1547555327,DE -1547555328,1547558911,AT +1547554816,1547558911,AT 1547558912,1547563007,IL 1547563008,1547565311,NL 1547565312,1547565823,US 1547565824,1547567103,NL 1547567104,1547571199,GB -1547571200,1547572991,AT -1547572992,1547573247,HU -1547573248,1547575295,AT +1547571200,1547575295,AT 1547575296,1547579391,NO 1547579392,1547583487,RU 1547583488,1547587583,KG @@ -28280,20 +29206,14 @@ 1547685888,1547689983,AT 1547689984,1547694079,IT 1547694080,1547698175,HU -1547698176,1547925783,NL -1547925784,1547925791,DE -1547925792,1548130303,NL -1548130304,1548130559,BE -1548130560,1548158599,NL +1547698176,1548158599,NL 1548158600,1548158607,GB 1548158608,1548159231,NL 1548159232,1548159235,ES 1548159236,1548159487,NL 1548159488,1548159999,GB -1548160000,1548160255,NL -1548160256,1548160511,PL -1548160512,1548162479,NL -1548162480,1548162495,FR +1548160000,1548162463,NL +1548162464,1548162495,FR 1548162496,1548169215,NL 1548169216,1548171263,DE 1548171264,1548172287,FR @@ -28322,10 +29242,14 @@ 1549795328,1550057471,AE 1550057472,1550188543,RU 1550188544,1550319615,FR -1550319616,1550581759,CH +1550319616,1550519551,CH +1550519552,1550519807,DE +1550519808,1550581759,CH 1550581760,1550843903,NL 1550843904,1550974975,UA -1550974976,1551007743,RO +1550974976,1550979071,RO +1550979072,1550983167,IR +1550983168,1551007743,RO 1551007744,1551106047,MD 1551106048,1551237119,DE 1551237120,1551368191,GR @@ -28346,101 +29270,32 @@ 1551577088,1551580159,NL 1551604480,1551604735,SE 1551630336,1551892479,RU -1551892480,1553989887,FR -1553989888,1553990911,MQ -1553990912,1553991167,FR -1553991168,1553992703,MQ -1553992704,1553993215,FR -1553993216,1553996031,MQ -1553996032,1553996543,FR -1553996544,1553997311,MQ -1553997312,1553997567,FR -1553997568,1554001407,MQ -1554001408,1554001663,FR -1554001664,1554001919,MQ -1554001920,1554002175,FR -1554002176,1554005247,MQ -1554005248,1554005503,FR -1554005504,1554006015,MQ -1554006016,1554006783,GP -1554006784,1554007295,FR -1554007296,1554007807,GP -1554007808,1554008063,FR -1554008064,1554009343,GP -1554009344,1554009855,FR -1554009856,1554011647,GP -1554011648,1554011903,FR -1554011904,1554013695,GP -1554013696,1554014207,FR -1554014208,1554015231,GP -1554015232,1554015487,FR -1554015488,1554016767,GP -1554016768,1554017279,FR -1554017280,1554018047,GP -1554018048,1554018303,FR -1554018304,1554019583,GP -1554019584,1554019839,FR -1554019840,1554021119,GP -1554021120,1554021375,FR -1554021376,1554021887,GP -1554021888,1554022399,FR -1554022400,1554023423,GP -1554023424,1554023679,FR -1554023680,1554024959,GP -1554024960,1554025215,FR -1554025216,1554025471,GP -1554025472,1554025727,FR -1554025728,1554026751,GP -1554026752,1554027007,FR -1554027008,1554027519,GP -1554027520,1554027775,FR -1554027776,1554029055,GP -1554029056,1554029311,FR -1554029312,1554030079,GP -1554030080,1554030335,FR -1554030336,1554030591,GP -1554030592,1554031615,MQ -1554031616,1554032127,FR -1554032128,1554032383,MQ -1554032384,1554032639,FR -1554032640,1554035455,MQ -1554035456,1554035967,FR -1554035968,1554037503,MQ -1554037504,1554037759,FR -1554037760,1554038271,MQ -1554038272,1554038783,FR -1554038784,1554039295,RE -1554039296,1554039807,FR -1554039808,1554040063,RE -1554040064,1554040319,FR -1554040320,1554041343,RE -1554041344,1554041599,FR -1554041600,1554042367,RE -1554042368,1554042879,FR -1554042880,1554043903,RE -1554043904,1554044159,FR -1554044160,1554046463,RE -1554046464,1554046719,FR -1554046720,1554047231,RE -1554047232,1554048255,FR -1554048256,1554048767,RE -1554048768,1554049279,FR -1554049280,1554049535,RE -1554049536,1554049791,FR -1554049792,1554052351,RE -1554052352,1554052607,FR -1554052608,1554053887,RE -1554053888,1554054143,FR -1554054144,1554054655,RE -1554054656,1556086783,FR -1556086784,1557921791,DE +1551892480,1556086783,FR +1556086784,1557069823,DE +1557069824,1557135359,GB +1557135360,1557921791,DE 1557921792,1558052863,NO 1558052864,1558054399,FR 1558054400,1558054655,DE -1558054656,1558118399,FR +1558054656,1558056102,FR +1558056103,1558056103,ES +1558056104,1558079407,FR +1558079408,1558079415,PL +1558079416,1558079423,GB +1558079424,1558081175,FR +1558081176,1558081183,BE +1558081184,1558084655,FR +1558084656,1558084659,BE +1558084660,1558085055,FR +1558085056,1558085071,GB +1558085072,1558093531,FR +1558093532,1558093532,HR +1558093533,1558118399,FR 1558118400,1558119423,DE 1558119424,1558122495,RU -1558122496,1558151167,AT +1558122496,1558123519,AT +1558123520,1558124543,LU +1558124544,1558151167,AT 1558151168,1558183935,IT 1558183936,1558708223,DE 1558708224,1559236607,GB @@ -28493,7 +29348,7 @@ 1559633920,1559642111,IT 1559650304,1559658495,IT 1559658496,1559683071,RU -1559683072,1559691263,CH +1559683072,1559691263,NL 1559691264,1559756799,BG 1559756800,1559789567,AT 1559789568,1559822335,RU @@ -28502,14 +29357,19 @@ 1559887872,1559920639,PT 1559920640,1559924693,LU 1559924694,1559924694,GB -1559924695,1559932927,LU +1559924695,1559929599,LU +1559929600,1559929855,LV +1559929856,1559932927,LU 1559932928,1559943167,DE 1559943168,1559944191,LU 1559944192,1559945727,FR 1559945728,1559946751,LU 1559946752,1559950335,DE -1559950336,1559950847,LU -1559950848,1559953407,DE +1559950336,1559951359,LU +1559951360,1559952383,DE +1559952384,1559952895,LU +1559952896,1559953151,DE +1559953152,1559953407,LU 1559953408,1559986175,MT 1559986176,1560018943,IE 1560018944,1560051711,DE @@ -28528,17 +29388,7 @@ 1562378240,1564999679,IT 1564999680,1565523967,UA 1565523968,1565655039,RU -1565655040,1565673215,AT -1565673216,1565673471,DE -1565673472,1565675263,AT -1565675264,1565675391,DE -1565675392,1565713295,AT -1565713296,1565713299,CH -1565713300,1565718919,AT -1565718920,1565718927,DE -1565718928,1565723135,AT -1565723136,1565723391,HU -1565723392,1565786111,AT +1565655040,1565786111,AT 1565786112,1565917183,BY 1565917184,1566048255,RS 1566048256,1566056447,RU @@ -28622,7 +29472,7 @@ 1566359552,1566363647,RU 1566363648,1566365695,GB 1566365696,1566367743,RU -1566367744,1566371839,ES +1566369792,1566371839,ES 1566371840,1566373887,IT 1566373888,1566375935,RS 1566375936,1566377983,DE @@ -28661,7 +29511,6 @@ 1566425088,1566427135,RS 1566427136,1566429183,IT 1566429184,1566437375,GB -1566437376,1566439423,BE 1566439424,1566443519,DE 1566443520,1566445567,NO 1566445568,1566447615,PL @@ -28721,9 +29570,9 @@ 1566558208,1566560255,JO 1566560256,1566560767,IT 1566560768,1566561015,SM -1566561016,1566561017,IT -1566561018,1566561023,SM -1566561024,1566564351,IT +1566561016,1566561019,IT +1566561020,1566561279,SM +1566561280,1566564351,IT 1566564352,1566566399,IS 1566566400,1566568447,FR 1566568448,1566570495,KZ @@ -28746,42 +29595,44 @@ 1567621120,1567696383,RO 1567696384,1567696895,MD 1567696896,1567703039,RO -1567703040,1567707391,MD -1567707392,1567707647,RO -1567707648,1567707903,MD -1567707904,1567708671,RO -1567708672,1567709183,MD +1567703040,1567709183,MD 1567709184,1567710207,RO 1567710208,1567711231,MD -1567711232,1567713279,RO -1567713280,1567714303,MD -1567714304,1567715327,RO +1567711232,1567715327,RO 1567715328,1567717375,MD 1567717376,1567727359,RO 1567727360,1567727615,GB 1567727616,1567742975,RO 1567742976,1567743487,MD -1567743488,1567749119,RO +1567743488,1567743999,RO +1567744000,1567748095,IR +1567748096,1567749119,RO 1567749120,1567750143,MD 1567750144,1567752191,RO 1567752192,1567756287,MD -1567756288,1567775743,RO +1567756288,1567760383,IR +1567760384,1567767551,RO +1567767552,1567768575,ES +1567768576,1567775743,RO 1567775744,1567776767,MD 1567776768,1567830015,RO 1567830016,1567831039,MD 1567831040,1567852543,RO 1567852544,1567856639,MD -1567856640,1567873023,RO +1567856640,1567858687,RO +1567858688,1567860735,SE +1567860736,1567873023,RO 1567873024,1567879167,MD 1567879168,1567880191,RO 1567880192,1567881215,SE 1567881216,1567883263,RO 1567883264,1567948799,MD -1567948800,1567961087,RO +1567948800,1567961087,IR 1567961088,1567965183,MD 1567965184,1567966207,RO 1567966208,1567969279,MD -1567969280,1567981567,RO +1567969280,1567973375,RO +1567973376,1567981567,IR 1567981568,1567983615,MD 1567983616,1567984639,RO 1567984640,1567987711,MD @@ -28789,16 +29640,20 @@ 1567988736,1567992831,MD 1567992832,1567993343,RO 1567993344,1567993599,GB -1567993600,1567997951,RO +1567993600,1567993855,RO +1567993856,1567997951,IR 1567997952,1568014335,NL 1568014336,1568022527,DE -1568022528,1568026623,RO +1568022528,1568024063,RO +1568024064,1568024319,SG +1568024320,1568026623,RO 1568026624,1568030719,MD -1568030720,1568059391,RO -1568059392,1568063487,MD -1568063488,1568083967,RO -1568083968,1568086015,MD -1568086016,1568104447,RO +1568030720,1568038911,RO +1568038912,1568059391,IR +1568059392,1568060415,RO +1568060416,1568062463,MD +1568062464,1568088063,RO +1568088064,1568104447,IR 1568104448,1568106495,MD 1568106496,1568107519,RO 1568107520,1568108543,MD @@ -28810,79 +29665,35 @@ 1568120832,1568122879,MD 1568122880,1568130047,RO 1568130048,1568133119,MD -1568133120,1568138239,RO +1568133120,1568137215,IR +1568137216,1568138239,RO 1568138240,1568141311,MD -1568141312,1568178175,RO +1568141312,1568145407,DE +1568145408,1568178175,RO 1568178176,1568210943,RU 1568210944,1568243711,GB -1568243712,1568243967,FR -1568243968,1568244735,GP -1568244736,1568244991,FR -1568244992,1568245759,GP -1568245760,1568246271,FR -1568246272,1568246527,GF -1568246528,1568247039,GP -1568247040,1568247295,FR +1568243712,1568247295,GP 1568247296,1568247551,GF 1568247552,1568247807,MF -1568247808,1568248063,FR -1568248064,1568248831,GP -1568248832,1568249087,MQ -1568249088,1568249599,GP -1568249600,1568249855,MQ -1568249856,1568250111,FR -1568250112,1568250879,GP -1568250880,1568251135,FR -1568251136,1568251647,GP +1568247808,1568251647,GP 1568251648,1568251903,MF -1568251904,1568252159,MQ -1568252160,1568252415,GP -1568252416,1568252671,MQ -1568252672,1568252927,GP +1568251904,1568252927,GP 1568252928,1568253183,GF -1568253184,1568253951,GP -1568253952,1568255743,FR -1568255744,1568255999,GF -1568256000,1568256511,GP -1568256512,1568259071,FR -1568259072,1568259327,MQ -1568259328,1568260095,GP -1568260096,1568260351,FR -1568260352,1568260607,MF -1568260608,1568261119,GP -1568261120,1568261375,FR -1568261376,1568262143,GP -1568262144,1568262655,MQ -1568262656,1568262911,GP -1568262912,1568263167,MQ -1568263168,1568263423,FR -1568263424,1568263679,MQ -1568263680,1568264447,FR -1568264448,1568264703,GP -1568264704,1568265215,MF -1568265216,1568265471,FR -1568265472,1568266239,GP -1568266240,1568266495,FR -1568266496,1568267263,GP -1568267264,1568268543,FR -1568268544,1568269311,GP -1568269312,1568269567,MQ -1568269568,1568270079,GP +1568253184,1568260351,GP +1568260352,1568260863,MF +1568260864,1568262143,GP +1568262144,1568262399,MQ +1568262400,1568264959,GP +1568264960,1568265215,MF +1568265216,1568267263,GP +1568267264,1568267775,MF +1568267776,1568270079,GP 1568270080,1568270335,MQ -1568270336,1568271359,GP -1568271360,1568271615,FR -1568271616,1568272383,GP -1568272384,1568273151,FR +1568270336,1568273151,GP 1568273152,1568273407,GF -1568273408,1568274175,FR -1568274176,1568274687,MQ -1568274688,1568274943,GP -1568274944,1568275199,MQ -1568275200,1568275455,GP -1568275456,1568275711,FR +1568273408,1568275711,GP 1568275712,1568275967,MQ -1568275968,1568276223,FR -1568276224,1568276479,MQ +1568275968,1568276479,GP 1568276480,1568309247,DE 1568309248,1568342015,RO 1568342016,1568374783,BG @@ -28895,9 +29706,7 @@ 1568571392,1568604159,LB 1568604160,1568636927,UA 1568636928,1569193983,DE -1569193984,1569438463,HR -1569438464,1569438719,BR -1569438720,1569718271,HR +1569193984,1569718271,HR 1569718272,1570242559,IT 1570242560,1570275327,GB 1570275328,1570308095,BG @@ -28919,14 +29728,13 @@ 1570586624,1570590719,PL 1570590720,1570592767,IL 1570592768,1570596863,PL -1570596864,1570598911,UA 1570598912,1570600959,PL 1570600960,1570603007,RU 1570603008,1570605055,CZ 1570605056,1570607103,NL 1570607104,1570609151,RU 1570609152,1570611199,PL -1570611200,1570619391,RU +1570611200,1570617343,RU 1570619392,1570621439,BA 1570621440,1570625535,RU 1570625536,1570627583,GB @@ -28936,7 +29744,9 @@ 1570644776,1570644991,FR 1570644992,1570645247,GB 1570645248,1570652159,FR -1570652160,1570668543,SE +1570652160,1570660863,SE +1570660864,1570661375,NO +1570661376,1570668543,SE 1570668544,1570686975,RU 1570686976,1570693119,NL 1570693120,1570695167,RU @@ -28953,7 +29763,7 @@ 1570756608,1570764799,RU 1570764800,1570766847,DE 1570766848,1571291135,DK -1571291136,1571422207,RO +1571291136,1571422207,SA 1571422208,1571422463,CZ 1571422464,1571422719,UA 1571422720,1571423231,RU @@ -28971,14 +29781,16 @@ 1571425233,1571425279,CZ 1571425280,1571425535,RU 1571425536,1571425791,NL -1571425792,1571428607,CZ +1571425792,1571426047,CZ +1571426048,1571426303,UA +1571426304,1571428607,CZ 1571428608,1571428863,UA 1571428864,1571429375,CZ 1571429376,1571435519,UA 1571435520,1571435775,RU 1571435776,1571436287,CZ 1571436288,1571436543,UA -1571436544,1571438591,RU +1571436544,1571438591,BA 1571438592,1571440639,UA 1571440640,1571440895,RU 1571440896,1571441407,CZ @@ -28991,9 +29803,9 @@ 1571443712,1571444991,CZ 1571444992,1571445247,UA 1571445248,1571446271,NL -1571446272,1571446783,CZ +1571446272,1571446783,RU 1571446784,1571447039,GB -1571447040,1571447295,CZ +1571447040,1571447295,UA 1571447296,1571447807,RU 1571447808,1571448063,CZ 1571448064,1571448319,RU @@ -29002,7 +29814,9 @@ 1571449344,1571449855,CZ 1571449856,1571450879,RU 1571450880,1571452927,UA -1571452928,1571453951,CZ +1571452928,1571453183,CZ +1571453184,1571453695,RU +1571453696,1571453951,CZ 1571453952,1571455999,RU 1571456000,1571456511,UA 1571456512,1571456767,CZ @@ -29018,10 +29832,15 @@ 1571471104,1571471359,CZ 1571471360,1571475455,RU 1571475456,1571476479,CZ -1571476480,1571478527,RU -1571478528,1571487743,CZ +1571476480,1571479551,RU +1571479552,1571483647,CZ +1571483648,1571484159,RU +1571484160,1571487743,CZ 1571487744,1571495935,SK -1571495936,1571504127,CZ +1571495936,1571496447,RU +1571496448,1571497983,BY +1571497984,1571500031,RU +1571500032,1571504127,BY 1571504128,1571508223,UA 1571508224,1571514367,CZ 1571514368,1571520511,BY @@ -29034,8 +29853,11 @@ 1571529216,1571529727,CZ 1571529728,1571530239,RU 1571530240,1571531263,CZ -1571531264,1571531775,UA -1571531776,1571534079,CZ +1571531264,1571532031,UA +1571532032,1571532287,RU +1571532288,1571532543,CZ +1571532544,1571532799,RU +1571532800,1571534079,CZ 1571534080,1571534847,RU 1571534848,1571535103,LV 1571535104,1571535617,CZ @@ -29045,7 +29867,8 @@ 1571538944,1571540991,CZ 1571540992,1571541247,RU 1571541248,1571541503,UA -1571541504,1571542527,CZ +1571541504,1571542271,CZ +1571542272,1571542527,RU 1571542528,1571542783,SK 1571542784,1571543039,CZ 1571543040,1571543551,NL @@ -29105,30 +29928,24 @@ 1571815424,1571815679,FR 1571815680,1571815935,RE 1571815936,1571816959,FR -1571816960,1571817727,RE -1571817728,1571818495,FR +1571816960,1571817215,RE +1571817216,1571818495,FR 1571818496,1571818751,RE 1571818752,1571819007,FR 1571819008,1571819263,RE 1571819264,1571819519,FR 1571819520,1571819775,RE -1571819776,1571820287,FR -1571820288,1571820543,RE -1571820544,1571820799,FR -1571820800,1571821055,RE -1571821056,1571822591,FR -1571822592,1571823103,RE -1571823104,1571823871,FR -1571823872,1571824127,RE -1571824128,1571824895,FR -1571824896,1571825151,RE -1571825152,1571826687,FR -1571826688,1571827199,RE -1571827200,1571827711,FR -1571827712,1571827967,RE -1571827968,1571828991,FR -1571828992,1571829247,RE -1571829248,1571831807,FR +1571819776,1571821055,FR +1571821056,1571821823,RE +1571821824,1571822847,FR +1571822848,1571823615,RE +1571823616,1571825407,FR +1571825408,1571825663,RE +1571825664,1571827455,FR +1571827456,1571827967,RE +1571827968,1571830783,FR +1571830784,1571831039,RE +1571831040,1571831807,FR 1571831808,1571848191,DK 1571848192,1571864575,RU 1571864576,1571880959,PL @@ -29227,12 +30044,11 @@ 1572524032,1572528127,GE 1572528128,1572532223,RU 1572532224,1572536319,IT -1572536320,1572538367,JE +1572536320,1572538367,GB 1572538368,1572540415,NL 1572540416,1572542463,GB 1572542464,1572544511,IT -1572544512,1572544767,FR -1572544768,1572546559,IQ +1572544512,1572546559,IQ 1572546560,1572548607,FR 1572548608,1572550655,NL 1572550656,1572552703,DE @@ -29244,11 +30060,12 @@ 1572562944,1572564991,CZ 1572564992,1572567039,DE 1572567040,1572569087,RU -1572571136,1572573183,RO -1572573184,1572574463,GG -1572574464,1572574719,GB -1572574720,1572574975,GG -1572574976,1572575231,GB +1572571136,1572572159,RO +1572572160,1572573183,BG +1572573184,1572573951,GG +1572573952,1572574207,GB +1572574208,1572574463,GG +1572574464,1572575231,GB 1572575232,1572577279,RU 1572577280,1572579327,AM 1572579328,1572581375,GB @@ -29314,8 +30131,9 @@ 1572706304,1572708351,DE 1572708352,1572708607,GB 1572708608,1572709375,GG -1572709376,1572710143,GB -1572710144,1572710399,GG +1572709376,1572709887,GB +1572709888,1572710143,GG +1572710144,1572710399,GB 1572710400,1572712447,DE 1572712448,1572714495,ES 1572714496,1572714943,NG @@ -29412,7 +30230,9 @@ 1578590852,1578590855,ES 1578590856,1578590863,FR 1578590864,1578590879,BE -1578590880,1578591695,FR +1578590880,1578591087,FR +1578591088,1578591103,IT +1578591104,1578591695,FR 1578591696,1578591699,ES 1578591700,1578592167,FR 1578592168,1578592171,IT @@ -29425,19 +30245,29 @@ 1578592296,1578592303,NL 1578592304,1578593023,FR 1578593024,1578593279,DE -1578593280,1578593439,FR +1578593280,1578593415,FR +1578593416,1578593423,IT +1578593424,1578593439,FR 1578593440,1578593443,ES 1578593444,1578593551,FR 1578593552,1578593559,NL 1578593560,1578593955,FR 1578593956,1578593959,ES -1578593960,1578595367,FR +1578593960,1578594559,FR +1578594560,1578594815,ES +1578594816,1578595295,FR +1578595296,1578595327,DE +1578595328,1578595367,FR 1578595368,1578595371,IT 1578595372,1578595419,FR 1578595420,1578595423,GB -1578595424,1578595987,FR +1578595424,1578595807,FR +1578595808,1578595823,ES +1578595824,1578595987,FR 1578595988,1578595991,ES -1578595992,1578602495,FR +1578595992,1578596351,FR +1578596352,1578596863,GB +1578596864,1578602495,FR 1578602496,1578604543,NL 1578604544,1578606591,GB 1578606592,1578607725,DE @@ -29453,7 +30283,8 @@ 1578613936,1578614271,FR 1578614272,1578614527,ES 1578614528,1578631167,FR -1578631168,1578663935,RO +1578631168,1578659839,RO +1578659840,1578663935,ES 1578663936,1578762239,RU 1578762240,1578795007,BG 1578795008,1578827775,RU @@ -29475,29 +30306,17 @@ 1580007424,1580015615,RU 1580015616,1580048383,UA 1580048384,1580064767,RU -1580064768,1580072959,DE +1580064768,1580072959,GB 1580072960,1580134399,PT 1580134400,1580136447,ES 1580136448,1580138495,PT 1580138496,1580204031,IT -1580204032,1580335103,RO +1580204032,1580335103,SA 1580335104,1580466175,RU 1580466176,1580597247,RO 1580597248,1580728319,TR 1580728320,1580990463,AE -1580990464,1580999679,PT -1580999680,1580999935,RO -1580999936,1581001215,PT -1581001216,1581001471,RO -1581001472,1581118463,PT -1581118464,1581118719,RO -1581118720,1581126655,PT -1581126656,1581127167,RO -1581127168,1581132031,PT -1581132032,1581132287,RO -1581132288,1581208575,PT -1581208576,1581208831,RO -1581208832,1581252607,PT +1580990464,1581252607,PT 1581252608,1581776895,GR 1581776896,1581793279,RU 1581793280,1581809663,PL @@ -29548,7 +30367,9 @@ 1583616000,1583620095,NL 1583620096,1583624191,IT 1583624192,1583624447,XK -1583624448,1583628287,RS +1583624448,1583626751,RS +1583626752,1583627007,XK +1583627008,1583628287,RS 1583628288,1583632383,DE 1583632384,1583636479,RU 1583636480,1583640575,MK @@ -29559,7 +30380,9 @@ 1583656960,1583665151,RU 1583665152,1583669247,UA 1583669248,1583673343,GE -1583673344,1583677439,DE +1583673344,1583675647,DE +1583675648,1583675903,US +1583675904,1583677439,DE 1583677440,1583681535,FI 1583681536,1583685631,PL 1583685632,1583689727,DE @@ -29567,6 +30390,7 @@ 1583693824,1583697919,RU 1583697920,1583702015,TR 1583702016,1583706111,RU +1583706624,1583706879,RU 1583710208,1583714303,IR 1583714304,1583722495,GB 1583722496,1583726591,IR @@ -29589,23 +30413,27 @@ 1583780336,1583780343,IT 1583780344,1583780423,GB 1583780424,1583780431,IT -1583780432,1583780767,GB +1583780432,1583780727,GB +1583780728,1583780735,IT +1583780736,1583780767,GB 1583780768,1583780775,IT 1583780776,1583780791,GB 1583780792,1583780799,IT -1583780800,1583781359,GB +1583780800,1583780815,GB +1583780816,1583780823,IT +1583780824,1583781359,GB 1583781360,1583781367,IT 1583781368,1583781863,GB 1583781864,1583781871,IT -1583781872,1583782223,GB -1583782224,1583782231,IT -1583782232,1583782415,GB +1583781872,1583782415,GB 1583782416,1583782423,IT 1583782424,1583782431,GB 1583782432,1583782439,IT 1583782440,1583782703,GB 1583782704,1583782711,IT -1583782712,1583782975,GB +1583782712,1583782783,GB +1583782784,1583782791,IT +1583782792,1583782975,GB 1583782976,1583782983,IT 1583782984,1583783495,GB 1583783496,1583783503,IT @@ -29630,9 +30458,7 @@ 1583861760,1583865855,LU 1583865856,1583869951,RU 1583869952,1583874047,KZ -1583874048,1584119935,BE -1584119936,1584120063,FR -1584120064,1584398335,BE +1583874048,1584398335,BE 1584398336,1584529407,CZ 1584529408,1584660479,DE 1584660480,1584857087,GB @@ -29655,9 +30481,8 @@ 1585219584,1585221631,NL 1585221632,1585223679,SK 1585223680,1585224959,FR -1585224960,1585225215,RE -1585225216,1585225471,FR -1585225472,1585225727,YT +1585224960,1585225471,RE +1585225472,1585225727,FR 1585225728,1585227007,UA 1585227008,1585227263,RU 1585227264,1585227775,UA @@ -29665,9 +30490,11 @@ 1585231872,1585233919,CZ 1585233920,1585238015,RU 1585238016,1585240063,DE -1585240064,1585240575,FR -1585240576,1585241855,MQ -1585241856,1585242111,GP +1585240064,1585240319,FR +1585240320,1585240575,GP +1585240576,1585240831,MQ +1585240832,1585241087,FR +1585241088,1585242111,MQ 1585242112,1585244159,RU 1585244160,1585246207,FR 1585246208,1585248255,RU @@ -29713,7 +30540,8 @@ 1585334272,1585336319,DE 1585336320,1585338367,SE 1585338368,1585340415,RU -1585340416,1585342463,AT +1585340416,1585340671,DE +1585340672,1585342463,AT 1585342464,1585344511,GB 1585344512,1585346559,FR 1585346560,1585348607,GB @@ -29791,9 +30619,7 @@ 1586151424,1586159615,TR 1586159616,1586167807,MT 1586167808,1586175999,DE -1586176000,1586177151,BE -1586177152,1586177279,DE -1586177280,1586184191,BE +1586176000,1586184191,BE 1586184192,1586192383,NO 1586192384,1586200575,RU 1586200576,1586208767,MD @@ -29896,17 +30722,25 @@ 1588068352,1588592639,GB 1588592640,1588593663,RO 1588593664,1588593919,MD -1588593920,1588609023,RO +1588593920,1588596735,RO +1588596736,1588602879,IR +1588602880,1588604927,RO +1588604928,1588609023,IR 1588609024,1588613119,MD -1588613120,1588621311,RO +1588613120,1588617215,IR +1588617216,1588619775,RO +1588619776,1588620031,SG +1588620032,1588621311,RO 1588621312,1588625407,MD 1588625408,1588641791,RO 1588641792,1588643839,ES -1588643840,1588653055,RO -1588653056,1588654079,MD -1588654080,1588673535,RO +1588643840,1588649983,RO +1588649984,1588652031,SE +1588652032,1588673535,RO 1588673536,1588674559,MD -1588674560,1588723711,RO +1588674560,1588676607,RO +1588676608,1588678655,IR +1588678656,1588723711,RO 1588723712,1588854783,UA 1588854784,1588985855,RU 1588985856,1589182463,IR @@ -29934,11 +30768,17 @@ 1589608448,1589608703,SE 1589608704,1589608959,DK 1589608960,1589609215,SE -1589609216,1589611519,DK +1589609216,1589609983,DK +1589609984,1589610239,SE +1589610240,1589610495,DK +1589610496,1589611263,SE +1589611264,1589611519,DK 1589611520,1589611775,SE -1589611776,1589612287,DK -1589612288,1589620735,SE -1589620736,1589641215,DK +1589611776,1589612031,DK +1589612032,1589620991,SE +1589620992,1589621247,DK +1589621248,1589621503,SE +1589621504,1589641215,DK 1589641216,1590034431,GB 1590034432,1590036479,RU 1590036480,1590038527,GB @@ -30001,9 +30841,7 @@ 1590165504,1590689791,AE 1590689792,1591214079,NL 1591214080,1591738367,DE -1591738368,1591977471,BE -1591977472,1591977599,NL -1591977600,1592000511,BE +1591738368,1592000511,BE 1592000512,1592004607,ES 1592004608,1592008703,AM 1592008704,1592012799,GB @@ -30121,7 +30959,9 @@ 1593147392,1593163775,RU 1593163776,1593180159,AT 1593180160,1593196543,NO -1593196544,1593212927,SE +1593196544,1593203103,SE +1593203104,1593203135,FI +1593203136,1593212927,SE 1593212928,1593229311,PL 1593229312,1593245695,EE 1593245696,1593247743,NL @@ -30164,7 +31004,15 @@ 1593421568,1593421823,GB 1593421824,1593422591,DE 1593422592,1593422847,GB -1593422848,1593442303,DE +1593422848,1593423359,DE +1593423360,1593423615,US +1593423616,1593431167,DE +1593431168,1593431295,GB +1593431296,1593438719,DE +1593438720,1593438975,US +1593438976,1593440511,DE +1593440512,1593440767,GB +1593440768,1593442303,DE 1593442304,1593475071,BA 1593475072,1593491455,HR 1593491456,1593499647,DE @@ -30194,30 +31042,30 @@ 1596588032,1596719103,BG 1596719104,1596850175,IE 1596850176,1596866559,CZ -1596866560,1596887039,RU -1596887040,1596889087,UA +1596866560,1596887295,RU +1596887296,1596887551,KZ +1596887552,1596889087,CZ 1596889088,1596889599,KZ 1596889600,1596889855,CZ 1596889856,1596890111,UA 1596890112,1596890623,RU -1596890624,1596891135,CZ -1596891136,1596900351,RU +1596890624,1596890879,CZ +1596890880,1596900351,RU 1596900352,1596907519,BY 1596907520,1596909567,RU 1596909568,1596911615,KZ 1596911616,1596915711,RU -1596915712,1596925951,CZ +1596915712,1596923903,UA +1596923904,1596925951,CZ 1596925952,1596932095,RU 1596932096,1596940543,CZ 1596940544,1596940799,RU 1596940800,1596941055,UA -1596941056,1596941311,CZ +1596941056,1596941311,BY 1596941312,1596942335,RU 1596942336,1596945407,UA 1596945408,1596945919,CZ -1596945920,1596946175,RU -1596946176,1596946431,NL -1596946432,1596947455,RU +1596945920,1596947455,RU 1596947456,1596948479,UA 1596948480,1596950527,BY 1596950528,1596950783,UA @@ -30231,8 +31079,8 @@ 1596954624,1596954879,RU 1596954880,1596955391,CZ 1596955392,1596955647,RU -1596955648,1596956415,CZ -1596956416,1596956671,RU +1596955648,1596956159,CZ +1596956160,1596956671,RU 1596956672,1596956927,CZ 1596956928,1596956963,DE 1596956964,1596956964,RU @@ -30250,9 +31098,7 @@ 1596963328,1596963839,CZ 1596963840,1596964095,KZ 1596964096,1596964607,CZ -1596964608,1596965887,RU -1596965888,1596966911,KG -1596966912,1596967167,RU +1596964608,1596967167,RU 1596967168,1596967423,CZ 1596967424,1596967935,RU 1596967936,1596968959,UA @@ -30303,7 +31149,8 @@ 1599356928,1599373311,BH 1599373312,1599406079,RU 1599406080,1599422463,NL -1599422464,1599438847,RU +1599422464,1599430655,RU +1599430656,1599438847,TM 1599438848,1599455231,RS 1599455232,1599471615,CZ 1599471616,1599487999,MK @@ -30348,7 +31195,9 @@ 1602230271,1602230271,DE 1602230272,1602232319,DK 1602232320,1602234367,CH -1602234368,1602236415,FR +1602234368,1602235967,FR +1602235968,1602235999,ES +1602236000,1602236415,FR 1602236416,1602238463,GB 1602238464,1602240511,TR 1602240512,1602242559,BY @@ -30469,25 +31318,9 @@ 1602781184,1602813951,FR 1602813952,1602846719,RU 1602846720,1602879487,GE -1602879488,1602879488,MQ -1602879489,1602879743,RE -1602879744,1602882303,MQ -1602882304,1602882559,RE -1602882560,1602885631,MQ -1602885632,1602885887,RE -1602885888,1602891775,MQ -1602891776,1602892031,RE -1602892032,1602894847,MQ -1602894848,1602895103,RE -1602895104,1602896383,MQ -1602896384,1602896639,RE -1602896640,1602896924,MQ +1602879488,1602896924,MQ 1602896925,1602896925,RE -1602896926,1602897407,MQ -1602897408,1602897663,RE -1602897664,1602907135,MQ -1602907136,1602907391,RE -1602907392,1602912255,MQ +1602896926,1602912255,MQ 1602912256,1602928639,GB 1602928640,1602930687,HU 1602930688,1602932735,GB @@ -30520,8 +31353,7 @@ 1603081256,1603081263,FI 1603081264,1603081279,GB 1603081280,1603081295,US -1603081296,1603081407,GB -1603081408,1603081471,ES +1603081296,1603081471,ES 1603081472,1603082239,GB 1603082240,1603082495,DE 1603082496,1603082751,GT @@ -30570,9 +31402,8 @@ 1603207168,1603215359,RU 1603215360,1603219455,DE 1603219456,1603223551,CH -1603223552,1603225087,GB -1603225088,1603225343,FR -1603225344,1603227647,GB +1603223552,1603223807,FR +1603223808,1603227647,GB 1603227648,1603231743,AT 1603231744,1603235839,IT 1603235840,1603239935,RU @@ -30582,11 +31413,7 @@ 1603252224,1603256319,RU 1603256320,1603260415,SE 1603260416,1603264511,RU -1603264512,1603266559,AT -1603266560,1603266815,HU -1603266816,1603267711,AT -1603267712,1603267839,SK -1603267840,1603268607,AT +1603264512,1603268607,AT 1603268608,1603272703,PL 1603272704,1603796991,GB 1603796992,1603813375,RU @@ -30655,8 +31482,8 @@ 1605091328,1605099519,PL 1605099520,1605107711,RU 1605107712,1605108247,GB -1605108248,1605108263,IT -1605108264,1605108407,GB +1605108248,1605108255,IT +1605108256,1605108407,GB 1605108408,1605108415,IT 1605108416,1605108567,GB 1605108568,1605108575,IT @@ -30666,15 +31493,11 @@ 1605109432,1605109439,IT 1605109440,1605109495,GB 1605109496,1605109503,IT -1605109504,1605109599,GB -1605109600,1605109607,IT -1605109608,1605109639,GB +1605109504,1605109639,GB 1605109640,1605109647,IT 1605109648,1605110111,GB 1605110112,1605110119,IT -1605110120,1605110167,GB -1605110168,1605110175,IT -1605110176,1605110263,GB +1605110120,1605110263,GB 1605110264,1605110271,IT 1605110272,1605111023,GB 1605111024,1605111031,IT @@ -30686,44 +31509,44 @@ 1605111920,1605111927,IT 1605111928,1605111935,GB 1605111936,1605111943,IT -1605111944,1605112647,GB -1605112648,1605112655,IT -1605112656,1605112847,GB +1605111944,1605112847,GB 1605112848,1605112855,IT -1605112856,1605112983,GB -1605112984,1605112991,IT -1605112992,1605113087,GB +1605112856,1605113087,GB 1605113088,1605113095,IT 1605113096,1605113383,GB 1605113384,1605113391,IT 1605113392,1605113407,GB 1605113408,1605113415,IT -1605113416,1605113503,GB -1605113504,1605113511,IT -1605113512,1605114199,GB +1605113416,1605113567,GB +1605113568,1605113575,IT +1605113576,1605113839,GB +1605113840,1605113847,IT +1605113848,1605114031,GB +1605114032,1605114039,IT +1605114040,1605114199,GB 1605114200,1605114207,IT -1605114208,1605114263,GB -1605114264,1605114271,IT -1605114272,1605114295,GB +1605114208,1605114295,GB 1605114296,1605114303,IT 1605114304,1605114327,GB 1605114328,1605114335,IT 1605114336,1605114871,GB 1605114872,1605114879,IT -1605114880,1605115007,GB +1605114880,1605114975,GB +1605114976,1605114983,IT +1605114984,1605115007,GB 1605115008,1605115015,IT -1605115016,1605115599,GB +1605115016,1605115583,GB +1605115584,1605115591,IT +1605115592,1605115599,GB 1605115600,1605115607,IT -1605115608,1605115863,GB -1605115864,1605115871,IT -1605115872,1605115879,GB -1605115880,1605115887,IT -1605115888,1605115903,GB +1605115608,1605115903,GB 1605115904,1605124095,RU 1605124096,1605125263,GB 1605125264,1605125267,DE 1605125268,1605125269,GB -1605125270,1605125279,DE +1605125270,1605125275,DE +1605125276,1605125276,GB +1605125277,1605125279,DE 1605125280,1605125903,GB 1605125904,1605125919,DE 1605125920,1605130239,GB @@ -30772,43 +31595,29 @@ 1605599232,1605631999,GR 1605632000,1605664767,RS 1605664768,1605697535,MK -1605697536,1605734399,RU -1605734400,1605734535,GB -1605734536,1605734536,RU -1605734537,1605735423,GB -1605735424,1605742591,RU -1605742592,1605744639,GB -1605744640,1605750783,RU -1605750784,1605751807,GB -1605751808,1605763071,RU -1605763072,1605765119,KZ -1605765120,1605795839,RU +1605697536,1605763071,RU +1605763072,1605769215,KZ +1605769216,1605771263,PL +1605771264,1605795839,RU 1605795840,1605828607,BE 1605828608,1605828863,GB -1605828864,1605830399,IL +1605828864,1605829375,US +1605829376,1605830399,IL 1605830400,1605830655,US 1605830656,1605840895,RU 1605840896,1605844991,CH 1605844992,1605861375,RU 1605861376,1605894143,TR -1605894144,1606156287,RO +1605894144,1606156287,SA 1606156288,1606418431,RU -1606418432,1606636287,SE -1606636288,1606636543,GB -1606636544,1607467007,SE +1606418432,1607467007,SE 1607467008,1607532543,DE -1607532544,1607562495,SE -1607562496,1607562751,DK -1607562752,1607569407,SE +1607532544,1607569407,SE 1607569408,1607572479,DK 1607572480,1607575551,SE 1607575552,1607577599,GB 1607577600,1607581695,SE -1607581696,1607584511,DK -1607584512,1607584767,SE -1607584768,1607585023,DK -1607585024,1607585279,SE -1607585280,1607595263,DK +1607581696,1607595263,DK 1607595264,1607595519,SE 1607595520,1607598079,DK 1607598080,1607601919,IT @@ -30835,14 +31644,13 @@ 1607640807,1607647231,IT 1607647232,1607651327,DE 1607651328,1607655423,FR -1607655424,1607660287,IT -1607660288,1607660543,PT -1607660544,1607663615,IT +1607655424,1607663615,IT 1607663616,1607729151,NL 1607729152,1607737343,SY -1607737344,1607761919,EG -1607761920,1607766015,SY -1607766016,1607794687,EG +1607737344,1607745535,EG +1607745536,1607766015,SY +1607766016,1607778303,EG +1607778304,1607794687,SY 1607794688,1607860223,RU 1607860224,1607892991,ES 1607892992,1607893055,GB @@ -30876,8 +31684,9 @@ 1607949312,1607950335,UA 1607950336,1607952383,RU 1607952384,1607953407,UA -1607953408,1607954431,RU -1607954432,1607956479,UA +1607953408,1607955711,RU +1607955712,1607955967,UA +1607955968,1607956479,RU 1607956480,1607957503,ES 1607957504,1607958527,UA 1607958528,1607959551,PS @@ -30909,7 +31718,7 @@ 1607988224,1607989247,KG 1607989248,1607991295,RU 1607991296,1608122367,UA -1608122368,1608253439,RO +1608122368,1608253439,SA 1608253440,1608384511,RU 1608384512,1608515583,DE 1608515584,1610612735,IT @@ -30923,15 +31732,17 @@ 1611923456,1612185599,CA 1612185600,1612611327,US 1612611328,1612636159,CA -1612636160,1613405695,US -1613405696,1613405951,CA -1613405952,1613471743,US +1612636160,1613405183,US +1613405184,1613405311,CA +1613405312,1613471743,US 1613471744,1613479935,JM 1613479936,1613480191,CA 1613480192,1613488127,US 1613488128,1613492223,CA 1613492224,1613504511,US -1613504512,1613529087,CA +1613504512,1613522431,CA +1613522432,1613522687,US +1613522688,1613529087,CA 1613529088,1613545471,US 1613545472,1613565951,CA 1613565952,1613606911,US @@ -30951,15 +31762,13 @@ 1613742080,1613758463,US 1613758464,1614282751,CA 1614282752,1614741503,US -1614741504,1614743039,CA -1614743040,1614743295,US -1614743296,1614757887,CA +1614741504,1614743295,CA +1614743296,1614743551,US +1614743552,1614757887,CA 1614757888,1614774271,US 1614774272,1614786559,CA 1614786560,1618837503,US -1618837504,1618840319,CA -1618840320,1618840575,US -1618840576,1618841599,CA +1618837504,1618841599,CA 1618841600,1618849791,US 1618849792,1618850303,CA 1618850304,1618850559,US @@ -30974,9 +31783,9 @@ 1632354304,1632362495,CA 1632362496,1632978303,US 1632978304,1632978431,CA -1632978432,1632979583,US -1632979584,1632979711,CA -1632979712,1634414591,US +1632978432,1632979071,US +1632979072,1632979199,CA +1632979200,1634414591,US 1634414592,1634418687,CA 1634418688,1634447359,US 1634447360,1634451455,CA @@ -30986,9 +31795,11 @@ 1634467840,1634729983,CA 1634729984,1652293631,US 1652293632,1652310015,CA -1652310016,1652447849,US -1652447850,1652447850,CN -1652447851,1652481279,US +1652310016,1652447743,US +1652447744,1652447999,CN +1652448000,1652461823,US +1652461824,1652462079,CN +1652462080,1652481279,US 1652481280,1652481791,CN 1652481792,1653500927,US 1653500928,1653501439,IL @@ -31010,9 +31821,7 @@ 1654554624,1654558719,CA 1654558720,1654648831,US 1654648832,1654652927,CA -1654652928,1656731007,US -1656731008,1656731135,VI -1656731136,1673527295,US +1654652928,1673527295,US 1673527296,1673560063,CA 1673560064,1673580287,US 1673580288,1673580543,CA @@ -31024,7 +31833,35 @@ 1680535552,1680539647,CA 1680539648,1680564223,US 1680564224,1680572415,CA -1680572416,1681915903,US +1680572416,1680627199,US +1680627200,1680627263,CA +1680627264,1680646399,US +1680646400,1680646655,CA +1680646656,1680646911,US +1680646912,1680647423,CA +1680647424,1680651775,US +1680651776,1680652031,CA +1680652032,1680652351,US +1680652352,1680652543,CA +1680652544,1680732927,US +1680732928,1680733183,CA +1680733184,1680734719,US +1680734720,1680734975,CA +1680734976,1680749567,US +1680749568,1680749695,CA +1680749696,1680780927,US +1680780928,1680781055,CA +1680781056,1680781439,US +1680781440,1680781567,CA +1680781568,1680798591,US +1680798592,1680798719,CA +1680798720,1680801023,US +1680801024,1680801151,CA +1680801152,1680808703,US +1680808704,1680808831,CA +1680808832,1680814399,US +1680814400,1680814463,PR +1680814464,1681915903,US 1686110208,1694498815,US 1694498816,1694499839,CN 1694499840,1694500863,ID @@ -31091,8 +31928,8 @@ 1701003264,1701011455,MY 1701011456,1701019647,CN 1701019648,1701052415,GU -1701052416,1701101567,NZ -1701101568,1701117951,SG +1701052416,1701093375,NZ +1701093376,1701117951,SG 1701117952,1701134335,NC 1701134336,1701142527,CN 1701142528,1701143551,HK @@ -31127,8 +31964,13 @@ 1703411712,1703673855,TW 1703673856,1703935999,JP 1703936000,1704984575,CN -1704984576,1705498623,AU -1705498624,1705500671,GB +1704984576,1705488383,AU +1705488384,1705489407,HK +1705489408,1705490431,SG +1705490432,1705491455,GB +1705491456,1705494527,HK +1705494528,1705497599,SG +1705497600,1705500671,GB 1705500672,1707081727,AU 1707081728,1707737087,CN 1707737088,1707802623,KR @@ -31170,7 +32012,8 @@ 1728140288,1728141311,SG 1728141312,1728142335,CN 1728142336,1728143359,NP -1728143360,1728144383,MP +1728143360,1728143615,GU +1728143616,1728144383,MP 1728144384,1728145407,IN 1728145408,1728146431,MY 1728146432,1728147455,AU @@ -31270,7 +32113,6 @@ 1728316416,1728317439,MY 1728317440,1728319487,JP 1728319488,1728320511,AU -1728321536,1728322559,JP 1728322560,1728323583,MY 1728323584,1728324607,JP 1728324608,1728325631,SG @@ -31297,7 +32139,11 @@ 1728346112,1728346367,AU 1728346368,1728346623,NZ 1728346624,1728347135,AU -1728347136,1728348159,SG +1728347136,1728347391,SG +1728347392,1728347421,AU +1728347422,1728347422,SG +1728347423,1728347647,AU +1728347648,1728348159,SG 1728348160,1728349183,VN 1728349184,1728349951,AU 1728349952,1728350207,NP @@ -31633,19 +32479,17 @@ 1728673792,1728674815,JP 1728674816,1728675839,ID 1728675840,1728676863,KR -1728676864,1728677887,IN 1728677888,1728678911,BD +1728678912,1728679935,PG 1728679936,1728680959,ID 1728680960,1728681983,MY 1728681984,1728683007,CN -1728683008,1728684031,BD 1728684032,1728685055,AU 1728685056,1728686079,JP 1728686080,1728687103,AU 1728687104,1728689407,JP 1728689408,1728689663,BD 1728689664,1728689919,PK -1728689920,1728690175,SG 1728690176,1728691199,BD 1728691200,1728692223,KH 1728692224,1728693247,JP @@ -31710,7 +32554,6 @@ 1728750592,1728751615,JP 1728751616,1728751871,IN 1728751872,1728752639,ID -1728752640,1728753663,LK 1728753664,1728754687,PH 1728754688,1728755711,IN 1728755712,1728756735,ID @@ -31726,7 +32569,6 @@ 1728762880,1728763903,VN 1728763904,1728764927,KR 1728764928,1728765439,SG -1728765440,1728765695,IN 1728765696,1728765951,ID 1728765952,1728766975,IN 1728766976,1728767999,TH @@ -31826,7 +32668,7 @@ 1728855040,1728856063,HK 1728856064,1728857087,MY 1728857088,1728858111,CN -1728858112,1728860159,BD +1728858112,1728859135,BD 1728860160,1728860671,ID 1728860672,1728861183,BD 1728861184,1728861439,ID @@ -31849,7 +32691,6 @@ 1728878592,1728879615,MY 1728879616,1728880127,IN 1728880128,1728880383,JP -1728880384,1728880639,MY 1728880640,1728881663,KH 1728881664,1728881919,ID 1728881920,1728882175,AU @@ -31879,7 +32720,6 @@ 1728901632,1728902143,ID 1728902144,1728902399,SG 1728902400,1728902655,IN -1728902656,1728902911,MY 1728902912,1728903167,BD 1728903168,1728905215,KR 1728905472,1728905727,PK @@ -31910,7 +32750,6 @@ 1728935936,1728936959,MY 1728936960,1728937983,CN 1728937984,1728939007,SG -1728939008,1728939519,MY 1728939520,1728939775,PH 1728939776,1728940031,IN 1728940032,1728942079,JP @@ -31952,7 +32791,6 @@ 1728974848,1728976383,ID 1728976384,1728976895,AU 1728976896,1728977151,AF -1728977664,1728977919,BD 1728977920,1728978943,MY 1728978944,1728979967,JP 1728979968,1728980991,MN @@ -31967,12 +32805,11 @@ 1728988160,1728988191,NZ 1728988192,1728988199,US 1728988200,1728989183,NZ -1728989184,1728990207,BD +1728989184,1728989695,BD 1728990208,1728990335,MY 1728990336,1728990463,ID 1728990464,1728990975,KR 1728990976,1728991231,SG -1728991232,1728992255,BD 1728992256,1728993279,CN 1728993280,1728994303,PG 1728994304,1728995327,AU @@ -32013,15 +32850,13 @@ 1729029120,1729029375,AU 1729029376,1729029631,ID 1729029632,1729029887,AU -1729029888,1729030143,PK 1729030144,1729031167,IN 1729031168,1729032191,SG 1729032192,1729033215,CN 1729033216,1729033727,SG 1729033728,1729034239,GB 1729034240,1729035263,KH -1729035264,1729035519,SG -1729035520,1729036287,AU +1729035264,1729036287,AU 1729036288,1729037311,JP 1729037312,1729039359,CN 1729039360,1729040383,JP @@ -32035,7 +32870,6 @@ 1729047552,1729048575,AU 1729048576,1729049599,VN 1729049600,1729050623,IN -1729050624,1729051647,JP 1729051648,1729053695,IN 1729053696,1729054719,JP 1729054720,1729055231,AU @@ -32045,7 +32879,6 @@ 1729056768,1729057791,IN 1729057792,1729058815,HK 1729058816,1729059839,TH -1729059840,1729060863,JP 1729060864,1729061887,CN 1729061888,1729062911,SG 1729062912,1729063935,MY @@ -32084,7 +32917,7 @@ 1729090560,1729091583,JP 1729091584,1729092607,HK 1729092608,1729094143,BD -1729094144,1729094655,IN +1729094400,1729094655,IN 1729094656,1729095167,AU 1729095680,1729096703,SG 1729096704,1729097215,AU @@ -32100,11 +32933,8 @@ 1729105664,1729105919,VU 1729105920,1729106943,SG 1729106944,1729107967,NZ -1729107968,1729108479,IN -1729108480,1729108616,KR -1729108617,1729108617,HK -1729108618,1729108735,KR -1729108736,1729108991,HK +1729108480,1729108607,KR +1729108608,1729108991,HK 1729108992,1729111039,IN 1729111040,1729112063,JP 1729112064,1729113087,MY @@ -32200,7 +33030,6 @@ 1729190912,1729191935,HK 1729191936,1729195007,IN 1729195008,1729195519,MN -1729195520,1729196031,BD 1729196032,1729197055,GU 1729197056,1729198079,HK 1729198080,1729199103,CN @@ -32259,7 +33088,7 @@ 1729248256,1729249279,JP 1729249280,1729252351,IN 1729254400,1729255423,AU -1729255424,1729256447,MY +1729255424,1729257471,MY 1729257472,1729258495,ID 1729258496,1729259519,JP 1729259520,1729260543,IN @@ -32375,7 +33204,7 @@ 1729376768,1729377023,SG 1729377024,1729377279,ID 1729377280,1729378303,BD -1729378304,1729378815,IN +1729378560,1729378815,IN 1729379072,1729379327,SG 1729379328,1729380351,HK 1729380352,1729381375,IN @@ -32388,14 +33217,13 @@ 1729387008,1729387519,ID 1729387520,1729388543,SG 1729388544,1729389567,HK -1729389568,1729389823,IN 1729390592,1729391103,IN 1729391104,1729391615,ID 1729391616,1729392639,JP 1729392640,1729393663,CN 1729393664,1729394687,KR 1729394688,1729395711,TH -1729395712,1729395967,NR +1729395712,1729395967,AU 1729395968,1729396735,IN 1729396736,1729397759,CN 1729397760,1729398783,PK @@ -32422,7 +33250,6 @@ 1729419264,1729419519,AU 1729419520,1729419775,SG 1729419776,1729420031,IN -1729420032,1729420287,AU 1729420288,1729421311,HK 1729421312,1729422335,MY 1729422336,1729423359,HK @@ -32433,7 +33260,6 @@ 1729426432,1729427455,AU 1729427456,1729428479,CN 1729428480,1729430527,AU -1729431552,1729432575,JP 1729432576,1729433599,PH 1729433600,1729433855,IN 1729433856,1729434111,AU @@ -32570,14 +33396,12 @@ 1729596672,1729596927,ID 1729596928,1729597439,NZ 1729597440,1729598463,VN -1729598464,1729598975,AU 1729598976,1729599231,IN 1729599232,1729599487,ID 1729599488,1729600511,AU 1729600512,1729601535,VN 1729601536,1729603583,CN 1729603584,1729604607,HK -1729604608,1729605119,AU 1729605376,1729605631,ID 1729605632,1729606655,CN 1729606656,1729607679,ID @@ -32693,7 +33517,6 @@ 1729718272,1729719295,HK 1729719296,1729720319,ID 1729720320,1729721087,AU -1729721088,1729721343,IN 1729721344,1729722367,NZ 1729723392,1729726463,IN 1729726464,1729727487,PK @@ -32745,7 +33568,6 @@ 1729774592,1729775615,AU 1729775616,1729776127,IN 1729776128,1729776639,MY -1729776640,1729777663,IN 1729777664,1729779711,PK 1729779712,1729780735,AU 1729780736,1729781759,HK @@ -32754,7 +33576,6 @@ 1729783552,1729783807,NZ 1729783808,1729785855,IN 1729785856,1729786879,BD -1729786880,1729787903,JP 1729787904,1729789951,HK 1729789952,1729790975,ID 1729792000,1729793023,BD @@ -32803,13 +33624,11 @@ 1729832448,1729832959,AU 1729832960,1729833983,JP 1729833984,1729835007,SG -1729835008,1729836031,IN 1729836032,1729837055,NZ 1729837056,1729838079,CN 1729838080,1729840127,VN 1729840128,1729841151,JP 1729841152,1729842175,MY -1729842176,1729843199,HK 1729843200,1729844223,JP 1729844224,1729845247,IN 1729845248,1729846271,NZ @@ -32828,7 +33647,6 @@ 1729856512,1729857535,AU 1729857536,1729858559,JP 1729858560,1729859583,IN -1729859584,1729860607,HK 1729860608,1729861631,KR 1729861632,1729862655,AU 1729862656,1729863679,JP @@ -32868,7 +33686,6 @@ 1729884160,1729885183,CN 1729885184,1729886207,JP 1729886208,1729887743,ID -1729887744,1729887999,VU 1729888000,1729888255,IN 1729888256,1729889279,KH 1729889280,1729891327,CN @@ -33042,7 +33859,6 @@ 1730066432,1730067455,AU 1730067456,1730068479,BD 1730068480,1730069503,IN -1730069504,1730070527,JP 1730070528,1730071551,CN 1730071552,1730072575,KR 1730072576,1730073599,SG @@ -33059,9 +33875,7 @@ 1730082816,1730083839,PW 1730083840,1730084863,JP 1730084864,1730085887,CN -1730085888,1730086143,AU -1730086144,1730086399,ID -1730086400,1730086911,AU +1730085888,1730086911,AU 1730086912,1730087935,HK 1730087936,1730088959,JP 1730088960,1730091007,HK @@ -33074,7 +33888,8 @@ 1730094080,1730095103,ID 1730095104,1730096127,JP 1730096128,1730097151,ID -1730097152,1730104319,CN +1730097152,1730103295,CN +1730103296,1730104319,HK 1730104320,1730105343,JP 1730105344,1730106367,PK 1730106368,1730107391,MV @@ -33118,11 +33933,580 @@ 1730147328,1730148351,JP 1730148352,1730149375,ID 1730149376,1730150399,JP +1730150400,1730360319,CN +1730412544,1730414591,AU +1730414592,1730415615,ID +1730415616,1730416127,AU +1730416128,1730416639,ID +1730416640,1730417663,PH +1730417664,1730418687,CN +1730418688,1730419711,BD +1730419712,1730420735,CN +1730420736,1730421759,ID +1730421760,1730422783,CN +1730422784,1730423807,ID +1730423808,1730425855,IN +1730425856,1730426879,HK +1730426880,1730429951,CN +1730429952,1730430207,ID +1730430208,1730430463,AU +1730430464,1730430719,HK +1730430720,1730430975,IN +1730430976,1730431999,CN +1730432000,1730435071,IN +1730435072,1730436095,HK +1730436096,1730437119,SG +1730437120,1730438143,CN +1730438144,1730439167,BD +1730439168,1730440191,IN +1730440192,1730442239,HK +1730442240,1730443263,TW +1730443264,1730445311,IN +1730445312,1730445567,NZ +1730445568,1730446335,AU +1730446336,1730448383,CN +1730448384,1730449407,JP +1730449408,1730450431,VU +1730450432,1730450687,AU +1730450688,1730450943,IN +1730450944,1730451455,PH +1730451456,1730452479,AU +1730452480,1730453503,ID +1730453504,1730476031,CN +1730476032,1730476543,AU +1730476544,1730476799,NZ +1730476800,1730477055,IN +1730477056,1730478079,AU +1730478080,1730479103,CN +1730479104,1730480127,HK +1730480128,1730480639,AU +1730480640,1730481151,JP +1730481152,1730483199,CN +1730483200,1730483711,IN +1730483712,1730484223,AU +1730484224,1730485247,CN +1730485248,1730487295,VN +1730487296,1730488319,TW +1730488320,1730489343,HK +1730489344,1730490367,CN +1730490368,1730491391,PH +1730491392,1730493439,CN +1730493440,1730494463,HK +1730494464,1730495487,JP +1730495488,1730496511,AU +1730496512,1730497535,CN +1730497536,1730499583,IN +1730499584,1730500607,HK +1730500608,1730501631,IN +1730501632,1730502655,JP +1730502656,1730503167,MY +1730503168,1730503423,ID +1730503424,1730503679,AU +1730503680,1730505727,CN +1730505728,1730508799,JP +1730508800,1730509823,AU +1730509824,1730510847,CN +1730510848,1730511871,AU +1730511872,1730512895,JP +1730512896,1730521087,CN +1730521088,1730522111,ID +1730522112,1730524159,CN +1730524160,1730525183,IN +1730525184,1730526207,HK +1730526208,1730528255,JP +1730528256,1730529279,SG +1730529280,1730529791,IN +1730529792,1730530303,AU +1730530304,1730531327,NZ +1730531328,1730535423,CN +1730535424,1730536447,ID +1730536448,1730536703,AU +1730536704,1730537471,ID +1730537472,1730538495,HK +1730538496,1730540543,JP +1730540544,1730541567,ID +1730541568,1730544639,CN +1730544640,1730545919,IN +1730545920,1730546687,AU +1730546688,1730547711,IN +1730547712,1730548735,BD +1730548736,1730549759,HK +1730549760,1730550783,KR +1730550784,1730551807,HK +1730551808,1730552831,CN +1730552832,1730553855,IN +1730553856,1730555903,CN +1730555904,1730556415,IN +1730556416,1730556927,HK +1730556928,1730557951,JP +1730557952,1730558975,CN +1730558976,1730559999,MY +1730560000,1730561023,HK +1730561024,1730562047,IN +1730562048,1730563071,SG +1730563072,1730564095,CN +1730564096,1730565119,HK +1730565120,1730566143,CN +1730566144,1730566655,IN +1730566656,1730567167,HK +1730567168,1730569215,CN +1730569216,1730570239,ID +1730570240,1730571263,HK +1730571264,1730572287,IN +1730572288,1730573311,KH +1730573312,1730574335,CN +1730574336,1730575359,AU +1730575360,1730577407,IN +1730577408,1730578431,CN +1730578432,1730579455,VN +1730579456,1730580479,CN +1730580480,1730580735,HK +1730580736,1730580991,AU +1730580992,1730581503,TW +1730581504,1730582015,AU +1730582016,1730582271,IN +1730582272,1730582527,PH +1730582528,1730585599,HK +1730585600,1730586623,NZ +1730586624,1730587647,HK +1730587648,1730588671,PH +1730588672,1730589695,IN +1730589696,1730590719,JP +1730590720,1730591743,SG +1730591744,1730591999,PH +1730592000,1730592767,IN +1730592768,1730593791,MY +1730593792,1730594815,NP +1730594816,1730596863,IN +1730596864,1730597887,JP +1730597888,1730598911,PH +1730598912,1730599423,AU +1730599424,1730599935,VU +1730599936,1730604031,CN +1730605056,1730607103,IN +1730607104,1730608127,JP +1730608128,1730609151,CN +1730609152,1730610687,IN +1730610688,1730610943,MY +1730610944,1730611199,SG +1730611200,1730612223,IN +1730612224,1730613247,ID +1730613248,1730614271,CN +1730614272,1730615295,NZ +1730615296,1730616319,HK +1730616320,1730617343,IN +1730617344,1730618367,TW +1730618368,1730619391,KR +1730619392,1730619903,HK +1730619904,1730620415,SG +1730620416,1730621439,NZ +1730621440,1730622719,ID +1730622720,1730622975,AU +1730622976,1730623231,IN +1730623232,1730623487,AU +1730623488,1730624511,HK +1730624512,1730625535,AU +1730625536,1730626559,CN +1730626560,1730629631,HK +1730629632,1730630655,PK +1730630656,1730631679,AU +1730631680,1730632703,CN +1730632704,1730634751,VN +1730634752,1730637823,CN +1730637824,1730638079,AU +1730638080,1730638335,JP +1730638336,1730638847,NZ +1730638848,1730639871,IN +1730639872,1730640383,AU +1730640384,1730640895,MY +1730640896,1730641919,JP +1730641920,1730643967,IN +1730643968,1730644735,AU +1730644736,1730644991,IN +1730644992,1730646015,MY +1730646016,1730647039,CN +1730647040,1730649087,HK +1730649088,1730650111,IN +1730650112,1730658303,CN +1730658304,1730660351,JP +1730660352,1730669567,CN +1730669568,1730670079,IN +1730670080,1730670591,AU +1730670592,1730672639,IN +1730672640,1730673407,AU +1730673408,1730673663,IN +1730673664,1730674687,FM +1730674688,1730675711,AU +1730675712,1730677759,HK +1730677760,1730686975,CN +1730686976,1730687999,IN +1730688000,1730688511,AU +1730688512,1730689023,ID +1730689024,1730692095,IN +1730692096,1730692607,ID +1730692608,1730693119,AU +1730693120,1730694143,IN +1730694144,1730695167,BD +1730695168,1730695423,IN +1730695424,1730695679,NZ +1730695680,1730696191,BD +1730696192,1730697215,HK +1730697216,1730698239,CN +1730698240,1730699263,ID +1730699264,1730700287,JP +1730700288,1730701311,CN +1730701312,1730702335,JP +1730702336,1730702591,ID +1730702592,1730702847,AU +1730702848,1730703359,HK +1730703360,1730704383,CN +1730704384,1730705407,TH +1730705408,1730706431,ID +1730706432,1730708479,JP +1730708480,1730713599,TH +1730713600,1730714623,HK +1730714624,1730715647,JP +1730715648,1730716671,HK +1730716672,1730717183,PH +1730717184,1730717695,AU +1730717696,1730718719,IN +1730718720,1730720767,HK +1730720768,1730723839,TH +1730723840,1730724863,CN +1730724864,1730727935,IN +1730727936,1730728959,HK +1730728960,1730729983,CN +1730729984,1730731007,JP +1730731008,1730732031,CN +1730732032,1730732287,AU +1730732288,1730732543,HK +1730732544,1730733055,BD +1730733056,1730741247,CN +1730741248,1730742271,HK +1730742272,1730742783,AF +1730742784,1730743295,IN +1730743296,1730744319,SG +1730744320,1730745343,CN +1730745344,1730752511,IN +1730752512,1730753535,HK +1730753536,1730754559,CN +1730754560,1730755071,IN +1730755072,1730755583,TH +1730755584,1730756607,JP +1730756608,1730757631,HK +1730757632,1730758655,SG +1730758656,1730759679,JP +1730759680,1730760703,SG +1730760704,1730761727,HK +1730761728,1730762751,TH +1730762752,1730766847,IN +1730766848,1730767871,HK +1730767872,1730768127,AU +1730768128,1730768639,ID +1730768640,1730768895,BD +1730768896,1730769919,JP +1730769920,1730770943,CN +1730770944,1730771967,ID +1730771968,1730772991,HK +1730772992,1730774015,SG +1730774016,1730775039,HK +1730775040,1730776063,JP +1730776064,1730777087,CN +1730777088,1730778111,IN +1730778112,1730780159,CN +1730780160,1730781183,AU +1730781184,1730783231,CN +1730783232,1730783487,IN +1730783488,1730783743,ID +1730783744,1730783999,IN +1730784000,1730784255,ID +1730784256,1730785279,HK +1730785280,1730785535,NL +1730785536,1730786303,AU +1730786304,1730788351,HK +1730788352,1730790399,ID +1730790400,1730791423,IN +1730791424,1730794495,ID +1730794496,1730795007,BD +1730795008,1730795519,IN +1730795520,1730796543,AU +1730796544,1730800639,CN +1730800640,1730801663,IN +1730801664,1730802687,JP +1730802688,1730803199,BD +1730803200,1730803711,ID +1730803712,1730804735,HK +1730804736,1730805759,JP +1730805760,1730806783,AF +1730806784,1730807807,JP +1730807808,1730808831,CN +1730808832,1730809855,HK +1730809856,1730810623,IN +1730810624,1730811903,AU +1730811904,1730814975,CN +1730814976,1730815999,HK +1730816000,1730817023,ID +1730817024,1730818047,JP +1730818048,1730818815,AU +1730818816,1730819071,IN +1730819072,1730820095,JP +1730820096,1730821119,VN +1730821120,1730822143,HK +1730822144,1730824191,CN +1730824192,1730825215,IN +1730825216,1730826239,CN +1730826240,1730827263,JP +1730827264,1730829311,IN +1730829312,1730831359,PH +1730831360,1730832383,HK +1730832384,1730833407,CN +1730833408,1730834431,AU +1730834432,1730834943,TW +1730834944,1730835455,IN +1730835456,1730837503,ID +1730837504,1730838527,IN +1730838528,1730839551,TH +1730839552,1730840575,AU +1730840576,1730841599,SG +1730841600,1730842623,AU +1730842624,1730844671,TW +1730844672,1730845695,BD +1730845696,1730848767,IN +1730848768,1730849791,JP +1730849792,1730850815,IN +1730850816,1730851839,HK +1730851840,1730852863,CN +1730852864,1730853887,KR +1730853888,1730854143,IN +1730854144,1730854399,AU +1730854400,1730854655,NZ +1730854656,1730854911,HK +1730854912,1730856959,IN +1730856960,1730857983,JP +1730857984,1730858239,AU +1730858240,1730858495,ID +1730858496,1730859007,IN +1730859008,1730860031,BN +1730860032,1730861055,MY +1730861056,1730862079,MM +1730862080,1730863103,JP +1730863104,1730864127,AU +1730864128,1730865151,TW +1730865152,1730866175,CN +1730866176,1730867199,AU +1730867200,1730868223,JP +1730868224,1730869247,KR +1730869248,1730870271,IN +1730870272,1730871807,ID +1730871808,1730873343,IN +1730873344,1730875391,HK +1730875392,1730876415,CN +1730876416,1730877439,AU +1730877440,1730878463,CN +1730878464,1730879487,HK +1730879488,1730881023,IN +1730881024,1730881535,AU +1730881536,1730882559,IN +1730882560,1730883583,ID +1730883584,1730884607,TW +1730884608,1730885631,BD +1730885632,1730886655,AU +1730886656,1730887679,HK +1730887680,1730887935,KR +1730887936,1730888191,IN +1730888192,1730888703,ID +1730888704,1730889727,HK +1730889728,1730889743,AU +1730889744,1730890751,JP +1730890752,1730891775,LA +1730891776,1730892799,IN +1730892800,1730893823,CN +1730893824,1730895103,AU +1730895104,1730895359,BD +1730895360,1730895871,IN +1730895872,1730898943,CN +1730898944,1730899967,MY +1730899968,1730900991,IN +1730900992,1730901503,AU +1730901504,1730901759,DE +1730901760,1730902015,AU +1730902016,1730903039,KR +1730903040,1730904063,CN +1730904064,1730905087,ID +1730905088,1730906111,CN +1730906112,1730906367,TH +1730906368,1730907135,AU +1730907136,1730908159,JP +1730908160,1730909183,PG +1730909184,1730910207,BD +1730910208,1730911231,IN +1730911232,1730912255,NC +1730912256,1730913279,IN +1730913280,1730914303,CN +1730914304,1730915327,NP +1730915328,1730916351,HK +1730916352,1730918399,AU +1730918400,1730919423,CN +1730919424,1730920447,SG +1730920448,1730922495,CN +1730922496,1730923519,IN +1730923520,1730924031,NF +1730924032,1730924543,NZ +1730924544,1730925567,CN +1730925568,1730926591,NZ +1730926592,1730927615,HK +1730927616,1730929663,CN +1730929664,1730929919,IN +1730929920,1730930175,TH +1730930176,1730930431,BD +1730930432,1730930687,IN +1730930688,1730931711,CN +1730931712,1730932735,HK +1730932736,1730933759,CN +1730933760,1730934783,HK +1730934784,1730936063,IN +1730936064,1730936831,AU +1730936832,1730937855,IN +1730937856,1730938879,SG +1730938880,1730939903,JP +1730939904,1730940927,IN +1730940928,1730941439,JP +1730941440,1730941951,IN +1730941952,1730942975,HK +1730942976,1730943487,AU +1730943488,1730943999,ID +1730944000,1730945023,HK +1730945024,1730946047,AU +1730946048,1730947071,ID +1730947072,1730948095,AU +1730948096,1730948351,TH +1730948352,1730948607,NZ +1730948608,1730949119,AU +1730949120,1730951167,IN +1730951168,1730952191,CN +1730952192,1730954239,HK +1730954240,1730955263,SG +1730955264,1730957311,BD +1730957312,1730958335,CN +1730958336,1730959359,JP +1730959360,1730960383,CN +1730960384,1730961407,AU +1730961408,1730962431,IN +1730962432,1730962687,ID +1730962688,1730962943,AU +1730962944,1730963455,JP +1730963456,1730964479,IN +1730964480,1730964735,MY +1730964736,1730964991,HK +1730964992,1730965503,NZ +1730965504,1730966527,SG +1730966528,1730967551,IN +1730967552,1730969599,CN +1730969600,1730970623,JP +1730970624,1730971647,CN +1730971648,1730973695,IN +1730973696,1730974719,CN +1730974720,1730974975,AU +1730974976,1730975231,ID +1730975232,1730975743,BD +1730975744,1730976767,CN +1730976768,1730977791,IN +1730977792,1730978815,HK +1730978816,1730979839,NZ +1730979840,1730980863,CN +1730980864,1730981887,IN +1730981888,1730990079,CN +1730990080,1730992127,JP +1730992128,1730993151,TH +1730993152,1730993407,SG +1730993408,1730993663,IN +1730993664,1730993919,NZ +1730993920,1730994175,PK +1730994176,1730995199,CN +1730995200,1730996223,AU +1730996224,1730997247,HK +1730997248,1731018751,CN +1731018752,1731020799,HK +1731020800,1731060735,CN +1731060736,1731063807,VN +1731063808,1731064831,NZ +1731064832,1731065855,JP +1731065856,1731066879,CN +1731066880,1731067391,PH +1731067392,1731067903,AU +1731067904,1731068927,CN +1731068928,1731070975,JP +1731070976,1731103743,CN +1731103744,1731103871,TH +1731103872,1731103999,FR +1731104000,1731104127,KR +1731104128,1731104767,HK +1731104768,1731105791,TW +1731105792,1731106815,BD +1731106816,1731115007,CN +1731115008,1731116031,HK +1731116032,1731117055,TW +1731117056,1731118847,IN +1731118848,1731119103,AU +1731119104,1731120127,IN +1731120128,1731121151,JP +1731121152,1731122175,AF +1731122176,1731123199,AU +1731123200,1731124223,PF +1731124224,1731125247,AU +1731125248,1731126271,HK +1731126272,1731127295,AU +1731127296,1731130367,IN +1731130368,1731132415,CN +1731132416,1731133439,SG +1731133440,1731133951,AU +1731133952,1731134207,JP +1731134208,1731134463,NZ +1731134464,1731135487,CN +1731135488,1731136511,JP +1731136512,1731138559,IN +1731138560,1731139583,CN +1731139584,1731140607,HK +1731140608,1731141631,SG +1731141632,1731142655,IN +1731142656,1731144703,CN +1731144704,1731145727,IN +1731145728,1731146751,CN +1731146752,1731148799,IN +1731148800,1731149055,ID +1731149056,1731149311,HK +1731149312,1731149823,AU +1731149824,1731152895,IN +1731152896,1731153407,SG +1731153408,1731153919,IN +1731153920,1731154943,CN +1731154944,1731155967,TH +1731155968,1731156479,HK +1731156480,1731158015,IN +1731158016,1731159039,CN +1731159040,1731160063,JP +1731160064,1731161087,IN +1731161088,1731162111,CN +1731162112,1731163135,HK +1731163136,1731165183,CN +1731165184,1731167231,IN +1731167232,1731168255,ID +1731168256,1731170303,CN +1731170304,1731171327,PK +1731171328,1731172863,IN +1731172864,1731173375,MY +1731173376,1731178495,IN +1731178496,1731179519,HK +1731179520,1731180543,JP +1731180544,1731181055,MM +1731181056,1731181311,IN +1731181568,1731182591,KH +1731182592,1731183615,VN +1731183616,1731184639,IN 1742733312,1742734335,HK 1742734336,1742735359,IN 1742735360,1742736383,JP 1742736384,1742737407,PK -1742737408,1742738431,SG 1742738432,1742738687,HK 1742738688,1742738943,AU 1742738944,1742739199,HK @@ -33404,7 +34788,7 @@ 1743026176,1743027199,BD 1743027200,1743028223,AU 1743028224,1743029247,CN -1743029248,1743030271,AU +1743029248,1743029503,AU 1743030272,1743031295,HK 1743031296,1743035391,IN 1743035392,1743036415,PK @@ -33544,7 +34928,7 @@ 1743163392,1743166463,IN 1743166464,1743167487,AU 1743167488,1743168511,HK -1743168512,1743169535,IN +1743169024,1743169535,IN 1743169536,1743170559,JP 1743170560,1743171583,KR 1743171584,1743172607,AU @@ -33625,15 +35009,13 @@ 1743252480,1743253503,JP 1743253504,1743254527,PH 1743254528,1743255551,CN -1743255552,1743256319,SG -1743256320,1743256575,MY +1743255552,1743256575,SG 1743256576,1743258623,HK 1743258624,1743259647,CN 1743259648,1743260671,IN 1743260672,1743261695,JP 1743261696,1743262719,HK 1743262720,1743264767,IN -1743264768,1743265279,MY 1743265280,1743265535,ID 1743265536,1743265791,AU 1743265792,1743266303,ID @@ -33871,7 +35253,7 @@ 1743506944,1743507455,IN 1743507456,1743509503,VN 1743509504,1743510527,HK -1743510528,1743545343,CN +1743510528,1743552511,CN 1743585280,1743589375,CN 1743589376,1743590399,AU 1743590400,1743591423,KR @@ -33931,7 +35313,9 @@ 1743681536,1743682559,AU 1743682560,1743683583,MY 1743683584,1743683839,JP -1743683840,1743684607,HK +1743683840,1743684095,AU +1743684096,1743684351,HK +1743684352,1743684607,AU 1743684608,1743685631,CN 1743685632,1743686655,ID 1743686656,1743688703,CN @@ -33982,6 +35366,38 @@ 1743740928,1743741951,CN 1743741952,1743742975,HK 1743742976,1743743487,NZ +1743743488,1743743999,AU +1743744000,1743745023,JP +1743745024,1743746047,KR +1743746048,1743748095,VN +1743748096,1743748607,IN +1743748608,1743748863,HK +1743748864,1743749119,MY +1743749120,1743751167,AU +1743751168,1743755263,IN +1743755264,1743757311,CN +1743757312,1743758335,TO +1743758336,1743758591,HK +1743758592,1743758847,ID +1743758848,1743759359,AU +1743759360,1743761407,IN +1743761408,1743764479,CN +1743764480,1743765503,ID +1743765504,1743767551,CN +1743767552,1743768575,PH +1743768576,1743770623,CN +1743770624,1743770879,AU +1743770880,1743771135,PH +1743771136,1743771647,NZ +1743771648,1743772671,JP +1743772672,1743773695,SG +1743773696,1743774719,CN +1743774720,1743775743,NZ +1743775744,1743776767,IN +1743776768,1743778815,KR +1743778816,1743779839,CN +1743779840,1743780863,MY +1743780864,1743781887,BD 1743781888,1743783935,JP 1743783936,1743784959,IN 1743784960,1743785983,JP @@ -34057,7 +35473,6 @@ 1743864832,1743865855,TW 1743865856,1743866879,CN 1743866880,1743867903,KR -1743867904,1743868927,JP 1743868928,1743870975,NZ 1743870976,1743873023,CN 1743873024,1743874047,AU @@ -34086,7 +35501,6 @@ 1743897600,1743899647,AU 1743899648,1743900671,ID 1743900672,1743901695,JP -1743901696,1743902719,IN 1743902720,1743903743,AU 1743903744,1743904767,CN 1743904768,1743908863,IN @@ -34117,7 +35531,7 @@ 1743931392,1743932415,HK 1743932416,1743933439,IN 1743933440,1743934463,AU -1743934464,1743936511,SG +1743935488,1743936511,SG 1743936512,1743937535,AU 1743937536,1743938559,MM 1743938560,1743939583,HK @@ -34128,7 +35542,6 @@ 1743944704,1743945215,ID 1743945216,1743945727,TO 1743945728,1743947775,CN -1743947776,1743948799,JP 1743948800,1743949823,HK 1743949824,1743950847,TH 1743950848,1743951359,HK @@ -34158,7 +35571,6 @@ 1743976448,1743977471,AU 1743977472,1743978495,JP 1743978496,1743979519,HK -1743979520,1743980543,JP 1743980544,1743981567,IN 1743981568,1743982591,SG 1743982592,1743983359,AU @@ -34166,8 +35578,9 @@ 1743983616,1743984639,KR 1743984640,1743985663,CN 1743985664,1743994879,IN -1743994880,1743995903,AU -1743995904,1743997951,IN +1743994880,1743995135,PG +1743995136,1743995903,AU +1743995904,1743996927,IN 1743997952,1743999999,BD 1744000000,1744001023,AU 1744001024,1744001535,IN @@ -34181,7 +35594,6 @@ 1744006656,1744006911,AU 1744006912,1744009215,IN 1744009216,1744010239,JP -1744010240,1744011263,ID 1744011264,1744012287,HK 1744012288,1744013311,IN 1744013312,1744014335,CN @@ -34199,7 +35611,6 @@ 1744024320,1744024575,AF 1744024576,1744025599,HK 1744025600,1744026623,IN -1744026624,1744027647,JP 1744027648,1744028671,MY 1744028672,1744029695,JP 1744029696,1744030719,KR @@ -34223,7 +35634,6 @@ 1744049152,1744050175,BD 1744050176,1744051199,HK 1744051200,1744052223,PH -1744052224,1744053247,MN 1744053248,1744054271,ID 1744054272,1744055295,KR 1744055296,1744056319,HK @@ -34231,15 +35641,15 @@ 1744056576,1744056831,MY 1744056832,1744057087,NZ 1744057088,1744057343,ID -1744057344,1744059391,HK -1744059392,1744066559,CN +1744057344,1744058879,HK +1744058880,1744066559,CN 1744066560,1744067583,HK 1744067584,1744068607,JP 1744068608,1744069631,ID 1744069632,1744070655,SG 1744070656,1744071679,JP 1744071680,1744072703,KR -1744072704,1744074751,JP +1744072704,1744073727,JP 1744074752,1744076799,IN 1744076800,1744077823,AU 1744077824,1744078847,PK @@ -34268,6 +35678,7 @@ 1744101376,1744102399,HK 1744102400,1744103423,FJ 1744103424,1744104447,CN +1744104448,1744105471,AU 1744105472,1744106751,IN 1744106752,1744107007,ID 1744107008,1744107519,SG @@ -34354,7 +35765,7 @@ 1744192512,1744194559,JP 1744194560,1744194815,ID 1744194816,1744195071,HK -1744195072,1744195327,AU +1744195072,1744195327,SG 1744195328,1744195583,HK 1744195584,1744196607,JP 1744196608,1744197631,IN @@ -34388,7 +35799,7 @@ 1744220928,1744221183,JP 1744221184,1744222207,NZ 1744222208,1744222719,ID -1744222720,1744223231,AU +1744222720,1744222975,AU 1744223232,1744224255,TH 1744225280,1744226303,IN 1744226304,1744227327,SG @@ -34514,7 +35925,7 @@ 1744349184,1744350207,CN 1744350208,1744351231,IN 1744351232,1744352255,NZ -1744352256,1744354303,HK +1744353280,1744354303,HK 1744354304,1744355327,AU 1744355328,1744356351,CN 1744356352,1744357375,JP @@ -34535,7 +35946,6 @@ 1744370688,1744371711,HK 1744371712,1744372735,BD 1744372736,1744373759,IN -1744373760,1744374783,JP 1744374784,1744375807,CN 1744375808,1744376831,IN 1744376832,1744377855,VN @@ -34543,7 +35953,9 @@ 1744378880,1744379903,KR 1744379904,1744380927,HK 1744380928,1744383999,IN -1744384000,1744384039,AU +1744384000,1744384000,AU +1744384001,1744384031,GU +1744384032,1744384039,AU 1744384040,1744384047,GU 1744384048,1744385023,AU 1744385024,1744386047,CN @@ -34560,7 +35972,7 @@ 1744395264,1744396287,MY 1744396288,1744397311,IN 1744397312,1744398335,VN -1744398336,1744400383,HK +1744399360,1744400383,HK 1744400384,1744402431,JP 1744402432,1744403455,IN 1744403456,1744404479,AU @@ -34582,7 +35994,6 @@ 1744425472,1744425727,ID 1744425728,1744425983,IN 1744425984,1744427007,JP -1744427008,1744428031,PG 1744428032,1744429567,AU 1744429568,1744429823,IN 1744429824,1744430079,ID @@ -34591,7 +36002,7 @@ 1744434176,1744435199,CN 1744435200,1744436223,IN 1744436224,1744437247,CN -1744437248,1744439295,JP +1744438272,1744439295,JP 1744439296,1744439807,AU 1744439808,1744440319,IN 1744440320,1744441343,HK @@ -34600,7 +36011,6 @@ 1744443392,1744444415,VN 1744444416,1744445439,IN 1744445440,1744446463,CN -1744446464,1744447487,JP 1744447488,1744447743,IN 1744447744,1744447999,HK 1744448000,1744448511,BD @@ -34631,7 +36041,6 @@ 1744473344,1744474111,SG 1744474112,1744481279,IN 1744481280,1744482303,JP -1744482304,1744483327,IN 1744483328,1744484351,CN 1744484352,1744485119,IN 1744485120,1744485375,MY @@ -34668,7 +36077,6 @@ 1744514560,1744514815,IN 1744514816,1744515071,AU 1744515072,1744516095,IN -1744516096,1744517119,HK 1744517120,1744519167,IN 1744519168,1744520191,AU 1744520192,1744521215,TH @@ -34688,7 +36096,6 @@ 1744534528,1744536575,CN 1744536576,1744537087,PW 1744537088,1744538623,AU -1744538624,1744539647,HK 1744539648,1744540671,AU 1744540672,1744541695,IN 1744541696,1744542719,ID @@ -34700,7 +36107,6 @@ 1744547840,1744548863,AF 1744548864,1744549887,ID 1744549888,1744551935,IN -1744551936,1744552959,JP 1744552960,1744553471,SG 1744553472,1744553983,HK 1744553984,1744555007,MY @@ -34709,12 +36115,10 @@ 1744562176,1744563199,BD 1744563200,1744564223,HK 1744564224,1744565247,CN -1744565248,1744566271,HK 1744566272,1744567295,IN 1744567296,1744568319,JP 1744568320,1744569343,VN 1744569344,1744570367,IN -1744570368,1744570879,JP 1744570880,1744571391,AU 1744571392,1744571903,ID 1744571904,1744572415,AU @@ -34728,7 +36132,6 @@ 1744580608,1744580863,PH 1744580864,1744581119,SG 1744581120,1744581631,ID -1744581632,1744582655,JP 1744582656,1744583679,AU 1744583680,1744584703,IN 1744584704,1744585727,CN @@ -34746,7 +36149,7 @@ 1744594944,1744595967,CN 1744595968,1744596991,IN 1744596992,1744598015,SG -1744598016,1744602111,JP +1744599040,1744601087,JP 1744602112,1744603135,HK 1744603136,1744604159,JP 1744604160,1744607231,IN @@ -34762,11 +36165,9 @@ 1744616448,1744616959,ID 1744616960,1744617471,AU 1744617472,1744618495,IN -1744618496,1744619519,JP 1744619520,1744620543,SG 1744620544,1744622591,CN 1744622592,1744625663,IN -1744625664,1744626687,SG 1744626688,1744627711,KR 1744627712,1744628735,CN 1744628736,1744629759,IN @@ -34788,7 +36189,6 @@ 1744643584,1744644095,BD 1744644096,1744645119,HK 1744645120,1744646143,BD -1744646144,1744647167,PH 1744647168,1744648191,IN 1744648192,1744649215,KR 1744649216,1744650239,CN @@ -34803,7 +36203,6 @@ 1744658432,1744659455,HK 1744659456,1744660479,JP 1744660480,1744660735,IN -1744660736,1744660991,MY 1744660992,1744661503,ID 1744661504,1744662527,MY 1744662528,1744663551,ID @@ -34815,7 +36214,6 @@ 1744665856,1744666111,IN 1744666112,1744666367,AU 1744666368,1744666623,PH -1744666624,1744667647,JP 1744667648,1744668671,TH 1744668672,1744669695,NZ 1744669696,1744670719,HK @@ -34877,7 +36275,8 @@ 1744733184,1744734207,NZ 1744734208,1744736255,AU 1744736256,1744737279,JP -1744737280,1744738303,CN +1744737280,1744738047,HK +1744738048,1744738303,CN 1744738304,1744739327,SG 1744739328,1744740351,NZ 1744740352,1744741375,IN @@ -34889,7 +36288,6 @@ 1744744448,1744745471,CN 1744745472,1744747519,NP 1744747520,1744748543,CN -1744748544,1744749055,JP 1744749056,1744749567,NZ 1744749568,1744749823,CN 1744749824,1744750591,AU @@ -34973,7 +36371,11 @@ 1747219456,1747220479,CA 1747220480,1747227647,US 1747227648,1747228671,CA -1747228672,1747256319,US +1747228672,1747235839,US +1747235840,1747236863,CA +1747236864,1747255807,US +1747255808,1747256063,CN +1747256064,1747256319,US 1747256320,1747256575,IE 1747256576,1747256831,AU 1747256832,1747257087,AE @@ -34989,11 +36391,30 @@ 1747276800,1747283967,US 1747283968,1747284991,CA 1747284992,1747293183,US +1747293184,1747294207,CA 1747294208,1747304447,US 1747304448,1747308543,CA 1747308544,1747316735,US 1747316736,1747317759,CA -1747317760,1753251839,US +1747317760,1747801855,US +1747801856,1747802111,IE +1747802112,1749061631,US +1749061632,1749069823,NL +1749069824,1749094399,US +1749094400,1749098495,NL +1749098496,1749172223,US +1749172224,1749188607,NL +1749188608,1749196799,US +1749196800,1749204991,NL +1749204992,1749213183,US +1749213184,1749229567,NL +1749229568,1749327871,US +1749327872,1749344255,NL +1749344256,1749372927,US +1749372928,1749381119,NL +1749381120,1749590015,US +1749590016,1749598207,NL +1749598208,1753251839,US 1753251840,1753252095,MN 1753252096,1753252351,SY 1753252352,1753252607,BY @@ -35021,7 +36442,9 @@ 1753483264,1753483519,IE 1753483520,1753486335,US 1753486336,1753486591,IN -1753486592,1754136575,US +1753486592,1753735167,US +1753735168,1753743359,IE +1753743360,1754136575,US 1754136576,1754169343,CA 1754169344,1754206719,US 1754206720,1754206975,GW @@ -35030,7 +36453,11 @@ 1754207488,1754207743,KI 1754207744,1754207999,MM 1754208000,1754208255,VU -1754208256,1754208511,NA +1754208256,1754208326,NA +1754208327,1754208327,AO +1754208328,1754208353,NA +1754208354,1754208354,AO +1754208355,1754208511,NA 1754208512,1754208767,DJ 1754208768,1754209023,BF 1754209024,1754209279,BW @@ -35038,9 +36465,12 @@ 1754209536,1754209791,BR 1754209792,1754210047,AR 1754210048,1754210303,BJ -1754210304,1754251519,US +1754210304,1754230783,US +1754234880,1754251519,US 1754251520,1754251775,LY -1754251776,1754252543,US +1754251776,1754252031,US +1754252032,1754252287,MR +1754252288,1754252543,US 1754252544,1754252799,MZ 1754252800,1754253055,US 1754253056,1754253311,GN @@ -35067,18 +36497,19 @@ 1754258432,1754258687,MG 1754258688,1754258943,US 1754258944,1754259199,TN -1754259200,1754792959,US +1754259200,1754333183,US +1754333184,1754337279,CA +1754337280,1754792959,US 1754792960,1754793983,CA 1754793984,1754799103,US 1754799104,1754800127,CA -1754800128,1754804223,US -1754805248,1754822655,US +1754800128,1754822655,US 1754822656,1754823679,CA 1754823680,1754830847,US 1754830848,1754831871,CA 1754831872,1754832895,US -1754832896,1754836991,CA -1754836992,1754845183,US +1754832896,1754835967,CA +1754835968,1754845183,US 1754845184,1754846207,CA 1754846208,1754849279,US 1754849280,1754850303,CA @@ -35088,9 +36519,18 @@ 1754863616,1754864639,CA 1754864640,1754869759,US 1754869760,1754870783,CA +1754870784,1754871807,US +1754871808,1754872831,CA 1754872832,1754890239,US 1754890240,1754892287,BB -1754923008,1755062271,US +1754892288,1754894335,CA +1754894336,1754899455,US +1754899456,1754900479,CA +1754900480,1754911743,US +1754911744,1754912767,CA +1754912768,1754920959,US +1754920960,1754921983,DM +1754921984,1755062271,US 1755062272,1755066367,CA 1755066368,1755070463,US 1755070464,1755074559,CA @@ -35126,14 +36566,458 @@ 1755111168,1755111423,SD 1755111424,1755119615,US 1755119616,1755283455,CA -1755283456,1755324415,US -1755324416,1755328511,CA -1755340800,1755348991,US -1755357184,1755365375,US -1755381760,1755512831,US -1755512832,1755545599,CA -1755578368,1755709439,US -1762656256,1763704831,MU +1755283456,1755365375,US +1755365376,1755373567,CA +1755373568,1755512831,US +1755512832,1755578367,CA +1755578368,1755717631,US +1755717632,1755721727,BS +1755721728,1755734271,US +1755734272,1755734527,LB +1755734528,1755734783,BS +1755734784,1755735295,US +1755735296,1755735551,KE +1755735552,1755735807,MA +1755735808,1755736063,CN +1755736064,1755736319,US +1755736320,1755736575,MX +1755736576,1755736831,AW +1755736832,1755737087,US +1755737088,1755737343,GH +1755737344,1755737599,IN +1755737600,1755737855,MO +1755737856,1755738111,MT +1755738112,1755738367,QA +1755738368,1755738623,YE +1755738624,1755738879,GR +1755738880,1755739135,US +1755739136,1755739391,BH +1755739392,1755739647,CO +1755739648,1755739903,OM +1755739904,1755740159,BN +1755740160,1755740415,SC +1755740416,1755740671,SY +1755740672,1755741183,US +1755741184,1755741439,PA +1755741440,1755741695,BZ +1755741696,1755741951,IM +1755741952,1755742207,NG +1755742208,1755799551,US +1755799552,1755807743,CA +1755807744,1755824127,US +1755824128,1755824383,TV +1755824384,1755824639,SY +1755824640,1755824895,ZW +1755824896,1755825151,TG +1755825152,1755825407,GM +1755825408,1755825663,AO +1755825664,1755825919,LB +1755825920,1755826175,MW +1755826176,1755826431,CV +1755826432,1755826687,TZ +1755826688,1755826943,KM +1755826944,1755827199,MN +1755827200,1755827455,CG +1755827456,1755827711,FM +1755827712,1755827967,SB +1755827968,1755828223,BI +1755828224,1755828479,CD +1755828480,1755828735,NE +1755828736,1755828991,NP +1755828992,1755829247,PK +1755829248,1755829503,KZ +1755829504,1755829759,OM +1755829760,1755830015,CN +1755830016,1755830271,ST +1755830272,1755830527,LR +1755830528,1755830783,JP +1755830784,1755831039,SD +1755831040,1755831295,MU +1755831296,1755831551,GQ +1755831552,1755831807,MK +1755831808,1755832063,TL +1755832064,1755832319,ML +1755832320,1755832575,DZ +1755832576,1755832831,MM +1755832832,1755833087,NR +1755833088,1755833343,SA +1755833344,1755833599,IN +1755833600,1755833855,BY +1755833856,1755834111,SZ +1755834112,1755834367,CN +1755834368,1755834623,TN +1755834624,1755834879,AS +1755834880,1755835135,PG +1755835136,1755835391,PR +1755835392,1755835647,BA +1755835648,1755835903,LS +1755835904,1755836159,GN +1755836160,1755836415,FJ +1755836416,1755836671,MH +1755836672,1755836927,SL +1755836928,1755837183,LK +1755837184,1755837439,MG +1755837440,1755837695,ME +1755837696,1755837951,MR +1755837952,1755838207,SO +1755838208,1755838463,UA +1755838464,1755838719,LY +1755838720,1755838975,TO +1755838976,1755839231,TD +1755839232,1755839487,MZ +1755839488,1755839743,ZM +1755839744,1755839999,ER +1755840000,1755840255,AL +1755840256,1755840511,RU +1755840512,1756049407,US +1756049408,1756053503,CA +1756053504,1756066719,US +1756066720,1756066751,RO +1756066752,1756086271,US +1756086272,1756090367,CA +1756090368,1757417471,US +1757417472,1757419519,CA +1757419520,1757424639,US +1757424640,1757425663,CA +1757425664,1757426687,US +1757426688,1757427711,CA +1757427712,1757432831,US +1757433856,1757443071,US +1757443072,1757446143,CA +1757446144,1757447167,US +1757447168,1757448191,CA +1757448192,1757450239,US +1757450240,1757451263,CA +1757451264,1757452287,US +1757452288,1757453311,CA +1757453312,1757457407,US +1757457408,1757458431,CA +1757458432,1757460479,US +1757460480,1757462527,VI +1757462528,1757472767,US +1757472768,1757473791,CA +1757473792,1757487103,US +1757487104,1757489151,CA +1757489152,1757491199,US +1757491200,1757497343,CA +1757497344,1757502463,US +1757502464,1757503487,CA +1757503488,1757505535,US +1757505536,1757506559,CA +1757506560,1757512703,US +1757512704,1757513727,CA +1757513728,1757522943,US +1757522944,1757523967,CA +1757523968,1757529087,US +1757529088,1757530111,AI +1757530112,1757532159,US +1757532160,1757534207,CA +1757534208,1757543295,US +1757543296,1757543327,AU +1757543328,1757552639,US +1757552640,1757560831,CA +1757560832,1757597695,US +1757597696,1757599743,GB +1757599744,1757642751,US +1757642752,1757675519,CA +1757675520,1757937663,US +1757937664,1757941759,CA +1757941760,1757958143,US +1757958144,1757962239,CA +1757962240,1757966335,BB +1757966336,1758265343,US +1758265344,1758330879,CA +1758330880,1758412799,US +1758412800,1758413055,BG +1758413056,1758413311,SE +1758413312,1758413567,PS +1758413568,1758414335,US +1758414336,1758414591,LV +1758414592,1758414847,IN +1758414848,1758415103,GD +1758415104,1758415359,GB +1758415360,1758415615,FR +1758415616,1758415871,CY +1758415872,1758416127,IT +1758416128,1758416383,US +1758416384,1758416639,CF +1758416640,1758416895,IL +1758416896,1758417151,VC +1758417152,1758417407,ID +1758417408,1758417663,CL +1758417664,1758417919,HK +1758417920,1758418175,DE +1758418176,1758418431,RU +1758418432,1758418687,CN +1758418688,1758418943,BL +1758418944,1758419199,US +1758419200,1758419455,CR +1758419456,1758419711,EG +1758419712,1758419967,VE +1758419968,1758420223,US +1758420224,1758420479,HU +1758420480,1758420735,CH +1758420736,1758420991,MM +1758420992,1759128575,US +1759128576,1759129599,CA +1759129600,1759131647,US +1759131648,1759133695,CA +1759133696,1759138815,US +1759138816,1759139839,CA +1759139840,1759140863,US +1759140864,1759141887,CA +1759141888,1759149055,US +1759149056,1759150079,CA +1759150080,1759160319,US +1759160320,1759162367,BM +1759162368,1759163391,BB +1759163392,1759166463,US +1759166464,1759167487,CA +1759167488,1759172607,US +1759172608,1759173631,VC +1759173632,1759178751,US +1759178752,1759179775,PR +1759179776,1759184895,US +1759184896,1759186943,CA +1759186944,1759188991,US +1759188992,1759190015,VC +1759190016,1759191039,PR +1759191040,1759201279,US +1759201280,1759202303,VG +1759202304,1759208447,US +1759208448,1759209471,CA +1759209472,1759212543,US +1759212544,1759217663,CA +1759217664,1759222783,US +1759222784,1759223807,CA +1759223808,1759230975,US +1759230976,1759233023,CA +1759233024,1759234047,US +1759234048,1759236095,CA +1759236096,1759239167,US +1759239168,1759240191,CA +1759240192,1759313919,US +1759313920,1759346687,CA +1759346688,1759408127,US +1759408128,1759412223,CA +1759412224,1759412991,US +1759412992,1759413247,AU +1759413248,1759414271,US +1759414272,1759414527,SE +1759414528,1759415295,US +1759415296,1759415551,SG +1759415552,1759416575,US +1759416576,1759416831,HK +1759416832,1759417599,US +1759417600,1759417855,FR +1759417856,1759419391,US +1759419392,1759419647,MX +1759419648,1759428607,US +1759428608,1759428863,LB +1759428864,1759429119,US +1759429120,1759429375,LK +1759429376,1759429631,MO +1759429632,1759429887,CN +1759429888,1759430143,DK +1759430144,1759430399,QA +1759430400,1759430655,BA +1759430656,1759430911,AR +1759430912,1759431167,MX +1759431168,1759431423,AW +1759431424,1759431679,BZ +1759431680,1759431935,BS +1759431936,1759432191,IN +1759432192,1759432447,HR +1759432448,1759432703,OM +1759432704,1759432959,PK +1759432960,1759433215,PS +1759433216,1759433471,SA +1759433472,1759433983,US +1759433984,1759434239,MA +1759434240,1759434495,DE +1759434496,1759434751,JP +1759434752,1759435007,SY +1759435008,1759435263,US +1759435264,1759435519,HK +1759435520,1759435775,IQ +1759435776,1759436031,KE +1759436032,1759436287,AE +1759436288,1759510527,US +1759510528,1759510783,VE +1759510784,1759511039,AG +1759511040,1759511295,GT +1759511296,1759511551,VC +1759511552,1759511807,PY +1759511808,1759512063,JM +1759512064,1759512319,MS +1759512320,1759512575,GD +1759512576,1759512831,LC +1759512832,1759513087,HT +1759513088,1759513343,EC +1759513344,1759513599,KN +1759513600,1759513855,SR +1759513856,1759514111,NI +1759514112,1759514367,BB +1759514368,1759514623,PE +1759514624,1759514879,KY +1759514880,1759515135,TT +1759515136,1759515391,GY +1759515392,1759515647,BO +1759515648,1759515903,CU +1759515904,1759516159,DM +1759516160,1759516415,SH +1759516416,1759516671,BM +1759516672,1759516927,FJ +1759516928,1759517183,HN +1759517184,1759517439,GL +1759517440,1759517695,MQ +1759517696,1759517951,GF +1759517952,1759518207,MF +1759518208,1759518463,BZ +1759518464,1759518719,GP +1759518720,1759518975,AW +1759518976,1759519231,AI +1759519232,1759519487,BL +1759519488,1759519743,CO +1759519744,1759519999,TC +1759520000,1759520255,VG +1759520256,1759520511,AX +1759520512,1759520767,UM +1759520768,1759521023,SV +1759521024,1759521279,TK +1759521280,1759521535,SJ +1759521536,1759521791,PM +1759521792,1759522047,GS +1759522048,1759522303,DO +1759522304,1759522559,RE +1759522560,1759522815,PN +1759522816,1759523071,MP +1759523072,1759523327,NF +1759523328,1759523583,US +1759523584,1759523839,NU +1759523840,1759524095,NC +1759524096,1759524351,NL +1759524352,1759524607,CX +1759524608,1759524863,BS +1759524864,1759525119,PF +1759525120,1759525375,CK +1759525376,1759525631,TF +1759525632,1759525887,FK +1759525888,1759526143,GG +1759526144,1759526399,CC +1759526400,1759526655,JE +1759526656,1759526911,FO +1759526912,1759535103,US +1759535104,1759543295,CA +1759543296,1759547391,US +1759547392,1759549439,NL +1759549440,1759552511,US +1759552512,1759555583,CA +1759555584,1760047103,US +1760047104,1760051199,CA +1760051200,1760063487,US +1760067584,1760092159,US +1760100352,1760116735,US +1760116736,1760133119,CA +1760133120,1760165887,US +1760165888,1760231423,CA +1760231424,1760383743,US +1760383744,1760383999,MO +1760384000,1760384255,GB +1760384256,1760384511,BZ +1760384512,1760384767,US +1760384768,1760385023,KE +1760385024,1760385279,US +1760385280,1760385535,SG +1760385536,1760385791,US +1760385792,1760386047,HK +1760386048,1760386303,US +1760386304,1760386559,GB +1760386560,1760386815,US +1760386816,1760387071,HK +1760387072,1760391167,US +1760395264,1760657407,US +1760657408,1760673791,CA +1760673792,1760690175,US +1760690176,1760755711,CA +1760755712,1760776191,US +1760776192,1760784383,CA +1760784384,1760817151,US +1760817152,1760817407,MO +1760817408,1760817663,BZ +1760817664,1760817919,BS +1760817920,1760818175,PA +1760818176,1760818431,AR +1760818432,1760818687,MX +1760818688,1760818943,AW +1760818944,1760819199,SE +1760819200,1760819455,ES +1760819456,1760819711,GB +1760819712,1760819967,MA +1760819968,1760820223,HK +1760820224,1760820479,JP +1760820480,1760820735,CA +1760820736,1760837631,US +1760837632,1760839679,CA +1760839680,1760867327,US +1760867328,1760868351,PR +1760868352,1760869375,US +1760869376,1760870399,CA +1760870400,1760871423,US +1760871424,1760872447,CA +1760874496,1760878591,US +1760878592,1760880639,JM +1760880640,1760883711,US +1760883712,1760884735,CA +1760884736,1760886783,US +1760886784,1760888831,CA +1760888832,1760899071,US +1760899072,1760900095,GD +1760900096,1760901119,US +1760903168,1760904191,CA +1760904192,1760909311,US +1760909312,1760910335,VG +1760910336,1760911359,GD +1760911360,1760923647,US +1760923648,1760924671,CA +1760924672,1760925695,US +1760925696,1760929791,CA +1760929792,1760937983,US +1760937984,1760939007,CA +1760939008,1760940031,DM +1760940032,1760944127,US +1760944128,1760945151,CA +1760945152,1760985087,US +1760985088,1761017855,CA +1761017856,1761075199,US +1761075200,1761083391,CA +1761083392,1761181695,US +1761181696,1761181951,MX +1761181952,1761198079,US +1761198080,1761214463,CA +1761214464,1761222655,GP +1761222656,1761230847,US +1761230848,1761239039,CA +1761239040,1761279999,US +1761284096,1761288191,US +1761288192,1761292287,CA +1761292288,1761304575,US +1761304576,1761308671,CA +1761308672,1761478655,US +1761478656,1761479679,CA +1761479680,1761484799,US +1761484800,1761485823,CA +1761485824,1761488895,US +1761488896,1761489919,CA +1761489920,1761495039,US +1761497088,1761499135,US +1761499136,1761501183,CA +1761501184,1761502207,VG +1761502208,1761509375,US +1761607680,1762656255,ZA +1762656256,1763000335,MU +1763000336,1763000339,UG +1763000340,1763704831,MU 1763704832,1764753407,EG 1764753408,1765801983,KE 1765801984,1766850559,MA @@ -35194,8 +37078,8 @@ 1793064960,1794113535,CN 1794113536,1795162111,KR 1795162112,1795387903,US -1795387904,1795388159,CA -1795388160,1795555839,US +1795387904,1795388287,CA +1795388288,1795555839,US 1795555840,1795555855,CA 1795555856,1795556351,US 1795556352,1795556607,CA @@ -35229,7 +37113,27 @@ 1795593728,1795595775,NL 1795595776,1795596287,US 1795596288,1795603455,NL -1795603456,1805049855,US +1795603456,1796253695,US +1796253696,1796253951,CA +1796253952,1796257919,US +1796257920,1796258047,PR +1796258048,1796262911,US +1796262912,1796263167,PR +1796263168,1796325375,US +1796325376,1796325631,PR +1796325632,1796402431,US +1796402432,1796402559,CA +1796402560,1796403199,US +1796403200,1796403327,CA +1796403328,1796404095,US +1796404096,1796404223,CA +1796404224,1796404735,US +1796404736,1796404863,CA +1796404864,1796406655,US +1796406656,1796406783,CA +1796406784,1805000058,US +1805000059,1805000059,CA +1805000060,1805049855,US 1805049856,1805058047,CA 1805058048,1805144063,US 1805144064,1805148159,CA @@ -35243,7 +37147,20 @@ 1805190400,1805190655,ES 1805190656,1805210623,US 1805210624,1805210879,EG -1805210880,1805582335,US +1805210880,1805251583,US +1805251584,1805251839,DE +1805251840,1805252095,GB +1805252096,1805252351,DE +1805252352,1805252607,GB +1805252608,1805252863,DE +1805252864,1805253119,GB +1805253120,1805253375,DE +1805253376,1805253631,GB +1805253632,1805253887,DE +1805253888,1805254143,GB +1805254144,1805254399,DE +1805254400,1805254655,GB +1805254656,1805582335,US 1805582336,1805647871,CA 1805647872,1805713407,US 1805713408,1805717503,CA @@ -35257,7 +37174,12 @@ 1805752576,1805753087,CA 1805753088,1805754111,US 1805754112,1805754367,CA -1805754368,1806174207,US +1805754368,1806172159,US +1806172160,1806172415,DE +1806172416,1806172671,GB +1806172672,1806172927,DE +1806172928,1806173183,GB +1806173184,1806174207,US 1806174208,1806174463,BR 1806174464,1806205183,US 1806205184,1806205439,CA @@ -35271,18 +37193,21 @@ 1807056896,1807057151,AU 1807057152,1807057663,US 1807057664,1807057919,GB -1807057920,1807597567,US +1807057920,1807548415,US +1807548416,1807548927,LU +1807548928,1807597567,US 1807597568,1807646719,CA 1807646720,1807655679,US 1807655680,1807655935,IE -1807655936,1807656191,LR -1807656192,1807656447,CZ +1807655936,1807656447,US 1807656448,1807656703,NL 1807656704,1807657983,US 1807657984,1807658239,SG 1807658240,1807658495,GB 1807658496,1807658751,BS -1807658752,1807695871,US +1807658752,1807691263,US +1807691264,1807691519,CA +1807691520,1807695871,US 1807695872,1807699967,VI 1807699968,1807707311,US 1807707312,1807707312,JP @@ -35312,12 +37237,20 @@ 1815966976,1815967231,US 1815967232,1815967487,CA 1815967488,1815968255,US -1815968256,1815968511,FR -1815968512,1815968639,US -1815968640,1815968767,FR +1815968256,1815968767,FR 1815968768,1815969279,US 1815969280,1815969791,JP -1815969792,1815987199,US +1815969792,1815977983,US +1815977984,1815979007,JP +1815979008,1815980031,NL +1815980032,1815980543,AU +1815980544,1815981055,DE +1815981056,1815982079,GB +1815982080,1815982591,FR +1815982592,1815983103,DE +1815983104,1815984127,JP +1815984128,1815984639,AU +1815984640,1815987199,US 1815987200,1815987711,GB 1815987712,1815988223,NL 1815988224,1815988735,JP @@ -35336,7 +37269,9 @@ 1815996160,1815996415,CA 1815996416,1815997695,US 1815997696,1815997951,FR -1815997952,1816001791,US +1815997952,1816001279,US +1816001280,1816001535,AU +1816001536,1816001791,US 1816001792,1816002559,NL 1816002560,1816068095,US 1816068096,1816133631,CA @@ -35360,23 +37295,26 @@ 1822553856,1822554111,HK 1822554112,1822572543,US 1822572544,1822605311,CA -1822605312,1822609407,US -1822609408,1822609535,SG -1822609536,1822611487,US -1822611488,1822611551,CA -1822611552,1822611967,US -1822611968,1822612479,CA -1822612480,1822614015,US +1822605312,1822611514,US +1822611515,1822611515,CA +1822611516,1822614015,US 1822614016,1822614271,JP 1822614272,1822614783,US 1822614784,1822615039,FR -1822615040,1822617855,US +1822615040,1822615295,NO +1822615296,1822617855,US 1822617856,1822618367,CA -1822618368,1822618879,US -1822618880,1822619391,CA -1822619392,1822619903,US -1822619904,1822620415,AU -1822620416,1822654463,US +1822618368,1822619135,US +1822619136,1822619391,CA +1822619392,1822619647,US +1822619648,1822620415,AU +1822620416,1822620927,US +1822620928,1822621247,NO +1822621248,1822621249,US +1822621250,1822621250,NO +1822621251,1822621263,US +1822621264,1822621264,NO +1822621265,1822654463,US 1822654464,1822662143,CA 1822662144,1822662399,US 1822662400,1822670847,CA @@ -35389,7 +37327,9 @@ 1823170560,1823178751,US 1823178752,1823179007,GB 1823179008,1823179263,DE -1823179264,1823186687,US +1823179264,1823180287,US +1823180288,1823180543,AU +1823180544,1823186687,US 1823186688,1823186943,IN 1823186944,1823211519,US 1823211520,1823342591,CA @@ -35422,9 +37362,7 @@ 1831862272,1832124415,PT 1832124416,1832386559,IT 1832386560,1832517631,DK -1832517632,1832582655,SE -1832582656,1832582911,DK -1832582912,1832583167,SE +1832517632,1832583167,SE 1832583168,1832648703,DK 1832648704,1832681471,HR 1832681472,1832714239,RU @@ -35433,26 +37371,12 @@ 1832779776,1832780031,FR 1832780032,1832780287,MQ 1832780288,1832780799,FR -1832780800,1832781567,MQ -1832781568,1832782335,FR -1832782336,1832783103,MQ -1832783104,1832783359,FR -1832783360,1832783615,MQ -1832783616,1832783871,FR +1832780800,1832781311,MQ +1832781312,1832783871,FR 1832783872,1832784639,GP -1832784640,1832785151,FR -1832785152,1832785407,GP -1832785408,1832785663,FR -1832785664,1832785919,GP -1832785920,1832787199,FR -1832787200,1832787455,GF -1832787456,1832788735,FR -1832788736,1832788991,RE -1832788992,1832789503,FR -1832789504,1832790015,RE -1832790016,1832791039,FR -1832791040,1832791295,YT -1832791296,1832791551,FR +1832784640,1832786943,FR +1832786944,1832787455,GF +1832787456,1832791551,FR 1832791552,1832791807,YT 1832791808,1832794879,FR 1832794880,1832795135,GP @@ -35460,15 +37384,17 @@ 1832796416,1832796671,RE 1832796672,1832796927,FR 1832796928,1832797183,GP -1832797184,1832798975,FR -1832798976,1832799743,GP -1832799744,1832801535,FR -1832801536,1832802047,MQ -1832802048,1832802559,FR +1832797184,1832798463,FR +1832798464,1832798719,GP +1832798720,1832798975,FR +1832798976,1832799231,GP +1832799232,1832799743,FR +1832799744,1832799999,GP +1832800000,1832802559,FR 1832802560,1832802815,MQ -1832802816,1832803839,FR -1832803840,1832804351,MQ -1832804352,1832812543,FR +1832802816,1832803327,FR +1832803328,1832803839,MQ +1832803840,1832812543,FR 1832812544,1832845311,RU 1832845312,1832878079,BH 1832878080,1832878412,RU @@ -35561,8 +37487,8 @@ 1833357312,1833357587,GB 1833357588,1833357631,IE 1833357632,1833357823,GB -1833357824,1833358079,IE -1833358080,1833359359,GB +1833357824,1833357903,IE +1833357904,1833359359,GB 1833359360,1833361407,DE 1833361408,1833363455,GB 1833363456,1833365503,RU @@ -35583,9 +37509,7 @@ 1833398272,1833400319,DE 1833400320,1833402367,GB 1833402368,1833406463,FR -1833406464,1833406719,GB -1833406720,1833406975,LV -1833406976,1833408511,GB +1833406464,1833408511,GB 1833410560,1833412607,LU 1833412608,1833414655,GB 1833414656,1833416703,RU @@ -35605,7 +37529,9 @@ 1833455616,1833459711,NL 1833459712,1833463807,ME 1833463808,1833467903,UA -1833467904,1833471999,CH +1833467904,1833468579,CH +1833468580,1833468580,RU +1833468581,1833471999,CH 1833472000,1833473023,NL 1833474048,1833475071,UA 1833476096,1833484287,NL @@ -35628,14 +37554,16 @@ 1833542912,1833543167,GB 1833543168,1833543423,IN 1833543424,1833544959,GB -1833544960,1833545087,IN +1833544960,1833545001,IN +1833545002,1833545002,GB +1833545003,1833545087,IN 1833545088,1833545215,GB 1833545216,1833545471,NL 1833545472,1833545727,GB 1833545728,1833549823,IT 1833549824,1833553919,RU 1833553920,1833558015,CZ -1833558016,1833562111,RO +1833558016,1833562111,US 1833562112,1833566207,PS 1833566208,1833570303,SE 1833570304,1833571583,NL @@ -35758,7 +37686,9 @@ 1835909120,1835911167,RS 1835911168,1835913215,DE 1835913216,1835917311,RU -1835917312,1835917855,GB +1835917312,1835917783,GB +1835917784,1835917791,IT +1835917792,1835917855,GB 1835917856,1835917863,IT 1835917864,1835917919,GB 1835917920,1835917935,IT @@ -35766,9 +37696,9 @@ 1835918440,1835918447,IT 1835918448,1835918519,GB 1835918520,1835918527,IT -1835918528,1835918599,GB -1835918600,1835918607,IT -1835918608,1835918711,GB +1835918528,1835918679,GB +1835918680,1835918687,IT +1835918688,1835918711,GB 1835918712,1835918719,IT 1835918720,1835918735,GB 1835918736,1835918743,IT @@ -35776,9 +37706,7 @@ 1835918824,1835918831,IT 1835918832,1835918847,GB 1835918848,1835918855,IT -1835918856,1835919095,GB -1835919096,1835919103,IT -1835919104,1835919127,GB +1835918856,1835919127,GB 1835919128,1835919135,IT 1835919136,1835919151,GB 1835919152,1835919159,IT @@ -35786,41 +37714,39 @@ 1835919752,1835919759,IT 1835919760,1835920479,GB 1835920480,1835920487,IT -1835920488,1835921047,GB -1835921048,1835921055,IT -1835921056,1835921119,GB +1835920488,1835920519,GB +1835920520,1835920527,IT +1835920528,1835920991,GB +1835920992,1835920999,IT +1835921000,1835921119,GB 1835921120,1835921127,IT 1835921128,1835921343,GB 1835921344,1835921351,IT -1835921352,1835921463,GB -1835921464,1835921471,IT -1835921472,1835921711,GB +1835921352,1835921711,GB 1835921712,1835921719,IT 1835921720,1835922415,GB 1835922416,1835922423,IT -1835922424,1835922455,GB -1835922456,1835922463,IT -1835922464,1835922559,GB +1835922424,1835922559,GB 1835922560,1835922567,IT 1835922568,1835922647,GB 1835922648,1835922655,IT -1835922656,1835923351,GB +1835922656,1835922671,GB +1835922672,1835922679,IT +1835922680,1835923007,GB +1835923008,1835923015,IT +1835923016,1835923351,GB 1835923352,1835923359,IT -1835923360,1835923487,GB -1835923488,1835923495,IT -1835923496,1835923863,GB -1835923864,1835923871,IT -1835923872,1835924375,GB +1835923360,1835923879,GB +1835923880,1835923887,IT +1835923888,1835924375,GB 1835924376,1835924383,IT -1835924384,1835925503,GB +1835924384,1835925159,GB +1835925160,1835925167,IT +1835925168,1835925503,GB 1835925504,1835933695,LV 1835933696,1835942399,RU 1835942400,1835942655,UA -1835942656,1835947775,RU -1835947776,1835948031,UA -1835948032,1835949055,RU -1835949056,1835949311,UA -1835949312,1835950079,RU +1835942656,1835950079,RU 1835950080,1835958271,LB 1835958272,1835966463,HU 1835966464,1835974655,IR @@ -35837,51 +37763,56 @@ 1836580864,1836597247,RU 1836597248,1836598271,LU 1836598272,1836605439,FR -1836605440,1836612607,LU -1836612608,1836613631,DE +1836605440,1836611583,LU +1836611584,1836613631,DE 1836613632,1836626943,RU 1836626944,1836627967,NL 1836627968,1836630015,RU 1836630016,1836646399,BG 1836646400,1836679167,RS -1836679168,1836686335,BG -1836686336,1836687359,GR -1836687360,1836711935,BG +1836679168,1836680703,BG +1836680704,1836681215,MK +1836681216,1836711935,BG 1836711936,1836728319,UA 1836728320,1836744703,RS -1836744704,1836746495,FR +1836744704,1836745983,FR +1836745984,1836746239,RE +1836746240,1836746495,FR 1836746496,1836747007,RE -1836747008,1836747263,FR -1836747264,1836748031,RE -1836748032,1836748543,FR -1836748544,1836748799,RE -1836748800,1836749055,FR -1836749056,1836749567,RE -1836749568,1836750079,FR -1836750080,1836750591,RE +1836747008,1836750335,FR +1836750336,1836750591,RE 1836750592,1836751103,FR -1836751104,1836751615,RE -1836751616,1836753151,FR -1836753152,1836753407,RE -1836753408,1836753919,FR -1836753920,1836754687,RE -1836754688,1836755455,FR -1836755456,1836755711,RE +1836751104,1836751359,RE +1836751360,1836751871,FR +1836751872,1836752127,RE +1836752128,1836752639,FR +1836752640,1836753151,RE +1836753152,1836754175,FR +1836754176,1836754431,RE +1836754432,1836755199,FR +1836755200,1836755711,RE 1836755712,1836755967,FR 1836755968,1836756223,RE -1836756224,1836756479,FR -1836756480,1836756991,RE -1836756992,1836758015,FR -1836758016,1836758527,RE -1836758528,1836758783,FR +1836756224,1836756735,FR +1836756736,1836756991,RE +1836756992,1836758783,FR 1836758784,1836759039,RE 1836759040,1836759551,FR -1836759552,1836760575,RE -1836760576,1836760831,FR -1836760832,1836761087,RE +1836759552,1836759807,RE +1836759808,1836760063,FR +1836760064,1836760831,RE +1836760832,1836761087,FR 1836761088,1836777471,IR 1836777472,1836793855,SI -1836793856,1836810239,GB +1836793856,1836794567,GB +1836794568,1836794587,FR +1836794588,1836794588,GB +1836794589,1836794592,FR +1836794593,1836794594,GB +1836794595,1836794595,FR +1836794596,1836797951,GB +1836797952,1836798207,DE +1836798208,1836810239,GB 1836810240,1836826623,RU 1836826624,1836843007,CZ 1836843008,1836875775,RU @@ -35940,8 +37871,12 @@ 1840119808,1840152575,RU 1840152576,1840185343,GB 1840185344,1840218111,BA -1840218112,1840316415,GB -1840316416,1840381951,RO +1840218112,1840232447,GB +1840232448,1840232703,US +1840232704,1840247007,GB +1840247008,1840247023,NL +1840247024,1840316415,GB +1840316416,1840381951,AE 1840381952,1840447487,GR 1840447488,1840513023,NO 1840513024,1840644095,GB @@ -35984,8 +37919,7 @@ 1841669120,1841669375,PL 1841669376,1841669631,BE 1841669632,1841670143,UA -1841670144,1841671935,PL -1841671936,1841672191,GB +1841670144,1841672191,PL 1841672192,1841674239,FR 1841674240,1841676287,PL 1841676288,1841680383,RU @@ -36003,7 +37937,7 @@ 1841758208,1841766399,PL 1841766400,1841774591,HU 1841774592,1841782783,PL -1841782784,1841790975,RO +1841782784,1841790975,US 1841790976,1841799167,BG 1841799168,1841807359,DE 1841807360,1841815551,NO @@ -36025,7 +37959,7 @@ 1841897472,1841905663,RO 1841905664,1841922047,RU 1841922048,1841924351,NL -1841924352,1841924607,DE +1841924352,1841924607,GB 1841924608,1841925887,NL 1841925888,1841926143,DE 1841926144,1841930239,NL @@ -36044,28 +37978,23 @@ 1842017024,1842017279,BE 1842017280,1842020351,GB 1842020352,1842028543,NO -1842028544,1842036735,CH +1842028544,1842029567,CH +1842029568,1842030591,FR +1842030592,1842036735,CH 1842036736,1842042879,FR 1842042880,1842044927,LU 1842044928,1842053119,GB 1842053120,1842069503,IR 1842069504,1842077695,RU -1842077696,1842077951,FR -1842077952,1842078207,MQ -1842078208,1842078719,FR -1842078720,1842078975,MQ -1842078976,1842079487,FR -1842079488,1842080767,MQ +1842077696,1842078207,MQ +1842078208,1842078463,FR +1842078464,1842078975,MQ +1842078976,1842079743,FR +1842079744,1842080767,MQ 1842080768,1842081023,GP -1842081024,1842081279,MQ -1842081280,1842081535,GP -1842081536,1842081791,MQ -1842081792,1842082047,GP -1842082048,1842082559,MQ -1842082560,1842082815,GP -1842082816,1842083071,MQ -1842083072,1842083583,GP -1842083584,1842084607,MQ +1842081024,1842083071,MQ +1842083072,1842083327,GP +1842083328,1842084607,MQ 1842084608,1842084863,GP 1842084864,1842085887,MQ 1842085888,1842118655,GB @@ -36102,7 +38031,9 @@ 1842206720,1842208767,SE 1842208768,1842210815,GB 1842210816,1842212863,LT -1842212864,1842214911,CZ +1842212864,1842213631,CZ +1842213632,1842213887,SK +1842213888,1842214911,CZ 1842214912,1842216959,RU 1842216960,1842225151,RO 1842225152,1842233343,UA @@ -36133,9 +38064,7 @@ 1843478528,1843494911,SE 1843494912,1843511295,IR 1843511296,1843527679,RU -1843527680,1843539199,IL -1843539200,1843539455,FR -1843539456,1843544063,IL +1843527680,1843544063,IL 1843544064,1843560447,RU 1843560448,1843576831,DE 1843576832,1843593215,RU @@ -36179,7 +38108,6 @@ 1843955712,1843957759,IT 1843957760,1843959807,CZ 1843959808,1843961855,GB -1843961856,1843962111,DE 1843963904,1843965951,DE 1843965952,1843967999,GB 1843968000,1843970047,RU @@ -36224,9 +38152,7 @@ 1844068352,1844070399,ES 1844070400,1844072447,LU 1844072448,1844076543,ES -1844076544,1844077055,GB -1844077056,1844077567,IE -1844077568,1844078591,GB +1844076544,1844078591,GB 1844078592,1844080639,DE 1844080640,1844082687,GE 1844082688,1844084735,DE @@ -36282,9 +38208,7 @@ 1844174848,1844178943,DE 1844178944,1844180991,EE 1844180992,1844183039,TR -1844183040,1844185087,IT -1844185088,1844187135,CH -1844187136,1844191231,IT +1844183040,1844191231,IT 1844191232,1844195327,AL 1844199424,1844203519,RU 1844203520,1844207615,NL @@ -36348,7 +38272,8 @@ 1844772864,1844838399,RS 1844838400,1844903935,GB 1844903936,1844969471,NO -1844969472,1845035007,RU +1844969472,1845034751,RU +1845034752,1845035007,BY 1845035008,1845100543,GB 1845100544,1845166079,DE 1845166080,1845231615,UA @@ -36387,9 +38312,7 @@ 1847757824,1847758847,CN 1847758848,1847770111,TH 1847770112,1847771135,SG -1847771136,1847780351,TH -1847780352,1847780607,CN -1847780608,1847783423,TH +1847771136,1847783423,TH 1847783424,1847787519,US 1847787520,1847803903,KR 1847803904,1847807999,VN @@ -36564,7 +38487,9 @@ 1866858496,1866989567,TW 1866989568,1867513855,CN 1867513856,1867775999,TW -1867776000,1867841535,TH +1867776000,1867825151,TH +1867825152,1867825663,MM +1867825664,1867841535,TH 1867841536,1867907071,CN 1867907072,1868038143,JP 1868038144,1868103679,PK @@ -36584,10 +38509,8 @@ 1868300288,1868333055,IN 1868333056,1868341247,PK 1868341248,1868345343,ID -1868345344,1868346111,GU -1868346112,1868346367,AU +1868345344,1868346367,GU 1868346368,1868347391,TH -1868347392,1868348415,AU 1868348416,1868349439,KR 1868349440,1868357631,SG 1868357632,1868361727,HK @@ -36676,8 +38599,7 @@ 1883770880,1883783167,KR 1883783168,1883799551,VN 1883799552,1883832319,KR -1883832320,1883833855,HK -1883833856,1884028927,CN +1883832320,1884028927,CN 1884028928,1884159999,KR 1884160000,1884164095,VN 1884164096,1884168191,TW @@ -36725,9 +38647,7 @@ 1888031232,1888034815,HK 1888034816,1888038911,JP 1888038912,1888040959,CN -1888040960,1888041471,JP -1888041472,1888041727,NZ -1888041728,1888059391,JP +1888040960,1888059391,JP 1888059392,1888063487,VN 1888063488,1888067583,JP 1888067584,1888071679,MY @@ -36813,11 +38733,7 @@ 1897267200,1897365503,VN 1897365504,1897398271,MY 1897398272,1897660415,CN -1897660416,1897663487,HK -1897663488,1897663743,GB -1897663744,1897697279,HK -1897697280,1897697535,AU -1897697536,1897725951,HK +1897660416,1897725951,HK 1897725952,1897730047,JP 1897730048,1897734143,AU 1897734144,1897738239,HK @@ -36852,7 +38768,7 @@ 1899273216,1899274239,JP 1899274240,1899282431,CN 1899282432,1899290623,KR -1899290624,1899294719,AU +1899292672,1899294719,AU 1899294720,1899298815,JP 1899298816,1899364351,TH 1899364352,1899724799,CN @@ -36869,9 +38785,7 @@ 1899850752,1899851775,VN 1899851776,1899855871,JP 1899855872,1899888639,TW -1899888640,1902210559,CN -1902210560,1902210815,MO -1902210816,1904345087,CN +1899888640,1904345087,CN 1904345088,1904361471,JP 1904361472,1904369663,KR 1904369664,1904375807,CN @@ -36953,7 +38867,6 @@ 1914601472,1914634239,KR 1914634240,1914642431,BD 1914642432,1914650623,KR -1914652160,1914652415,MN 1914652672,1914654719,AU 1914654720,1914658815,JP 1914658816,1914660863,AU @@ -37000,7 +38913,9 @@ 1919918080,1919926271,CN 1919926272,1919942655,KR 1919942656,1919999999,CN -1920000000,1920008191,HK +1920000000,1920002047,HK +1920002048,1920003071,CN +1920003072,1920008191,HK 1920008192,1920057343,CN 1920057344,1920058111,HK 1920058112,1920072703,CN @@ -37073,7 +38988,10 @@ 1925640192,1925642239,ID 1925642240,1925644287,CN 1925644288,1925660671,KR -1925660672,1925664767,HK +1925660672,1925661439,TW +1925661440,1925662207,HK +1925662208,1925663743,TW +1925663744,1925664767,HK 1925664768,1925677055,ID 1925677056,1926234111,KR 1926234112,1929379839,CN @@ -37211,7 +39129,6 @@ 1941438464,1941569535,IN 1941569536,1941618687,PK 1941618688,1941635071,AU -1941635072,1941639167,IN 1941639168,1941643263,NP 1941643264,1941651455,IN 1941651456,1941655551,JP @@ -37250,7 +39167,9 @@ 1947205632,1948254207,CN 1948254208,1949302783,KR 1949302784,1949391103,HK -1949391104,1949391359,CN +1949391104,1949391116,CN +1949391117,1949391117,HK +1949391118,1949391359,CN 1949391360,1949433855,HK 1949433856,1949437951,CN 1949437952,1949439999,AU @@ -37365,8 +39284,8 @@ 1958830080,1958838271,JP 1958838272,1958842367,IN 1958842368,1958844415,NZ -1958845440,1958845951,MY -1958845952,1958846463,HK +1958845440,1958845695,MY +1958845696,1958846463,HK 1958846464,1958847487,IN 1958848512,1958850559,BD 1958850560,1958852607,CN @@ -37382,9 +39301,7 @@ 1959104512,1959106559,AU 1959106560,1959108607,JP 1959110656,1959112703,JP -1959112704,1959113215,HK -1959113216,1959113471,IN -1959113472,1959114751,HK +1959112704,1959114751,HK 1959114752,1959115007,IN 1959115008,1959116799,HK 1959116800,1959133183,SG @@ -37462,7 +39379,11 @@ 1964120064,1964122111,JP 1964122112,1964122367,SG 1964122368,1964122879,JP -1964122880,1964126207,SG +1964122880,1964123135,HK +1964123136,1964123391,GB +1964123392,1964123647,US +1964123648,1964123903,CN +1964123904,1964126207,SG 1964126208,1964126463,HK 1964126464,1964130303,SG 1964130304,1964134399,HK @@ -37694,7 +39615,7 @@ 1991442432,1991499775,BD 1991499776,1991507967,NC 1991507968,1991835647,CN -1991835648,1991901183,SG +1991835648,1991901183,IN 1991901184,1992097791,CN 1992097792,1992163327,SG 1992163328,1992818687,CN @@ -37718,14 +39639,17 @@ 1996634112,1996636159,AU 1996636160,1996644351,ID 1996644352,1996652543,BT -1996652544,1997078527,CN +1996652544,1996685311,CN +1996685312,1996750847,HK +1996750848,1997078527,CN 1997078528,1997094911,AU 1997094912,1997144063,HK 1997144064,1997176831,CN 1997176832,1997180927,AU 1997180928,1997185023,HK 1997185024,1997187071,JP -1997187072,1997189119,HK +1997187072,1997188095,HK +1997188096,1997189119,BD 1997189120,1997191167,ID 1997191168,1997209599,JP 1997209600,1997242367,AU @@ -37789,9 +39713,14 @@ 1998569472,1998577663,CN 1998577664,1998579711,AU 1998579712,1998581759,SG -1998581760,1998584319,KR +1998581760,1998584063,KR +1998584064,1998584319,IN 1998584320,1998584575,OM -1998584576,1998585855,KR +1998584576,1998584831,IN +1998584832,1998585087,ZA +1998585088,1998585343,KR +1998585344,1998585599,JP +1998585600,1998585855,KR 1998585856,1999130623,CN 1999130624,1999134719,BD 1999134720,1999136767,MN @@ -37849,19 +39778,17 @@ 2001559552,2001567743,KR 2001567744,2001600511,TW 2001600512,2001797119,CN -2001797120,2001798047,SG +2001797120,2001797647,SG +2001797648,2001797663,US +2001797664,2001798047,SG 2001798048,2001798079,US 2001798080,2001798087,SG 2001798088,2001798095,US -2001798096,2001798787,SG -2001798788,2001798791,AU -2001798792,2001799687,SG +2001798096,2001798407,SG +2001798408,2001798415,US +2001798416,2001799687,SG 2001799688,2001799695,US -2001799696,2001799711,SG -2001799712,2001799743,US -2001799744,2001799807,SG -2001799808,2001799935,US -2001799936,2001799967,SG +2001799696,2001799967,SG 2001799968,2001799971,US 2001799972,2001800391,SG 2001800392,2001800399,US @@ -37875,27 +39802,19 @@ 2001801136,2001801151,US 2001801152,2001801339,SG 2001801340,2001801343,US -2001801344,2001801615,SG -2001801616,2001801623,NL -2001801624,2001801663,SG -2001801664,2001801703,US -2001801704,2001801711,SG +2001801344,2001801711,SG 2001801712,2001801727,US 2001801728,2001801775,SG -2001801776,2001801807,US -2001801808,2001801919,SG +2001801776,2001801791,US +2001801792,2001801919,SG 2001801920,2001801935,US 2001801936,2001801983,SG 2001801984,2001801999,US 2001802000,2001802191,SG 2001802192,2001802199,US -2001802200,2001802879,SG -2001802880,2001803007,US -2001803008,2001803215,SG +2001802200,2001803215,SG 2001803216,2001803223,US -2001803224,2001803647,SG -2001803648,2001803679,US -2001803680,2001803735,SG +2001803224,2001803735,SG 2001803736,2001803743,US 2001803744,2001803839,SG 2001803840,2001803871,US @@ -37907,11 +39826,17 @@ 2001804016,2001804023,US 2001804024,2001805943,SG 2001805944,2001805951,US -2001805952,2001809383,SG +2001805952,2001806527,SG +2001806528,2001806559,SA +2001806560,2001806735,SG +2001806736,2001806739,MY +2001806740,2001807703,SG +2001807704,2001807711,CA +2001807712,2001809383,SG 2001809384,2001809391,US -2001809392,2001810495,SG -2001810496,2001810527,MY -2001810528,2001810559,SG +2001809392,2001810111,SG +2001810112,2001810143,US +2001810144,2001810559,SG 2001810560,2001810623,MY 2001810624,2001812127,SG 2001812128,2001812159,SA @@ -37919,9 +39844,7 @@ 2001812256,2001812263,US 2001812264,2001812671,SG 2001812672,2001812675,GB -2001812676,2001813655,SG -2001813656,2001813663,AU -2001813664,2001813783,SG +2001812676,2001813783,SG 2001813784,2001813791,IN 2001813792,2001814431,SG 2001814432,2001814439,US @@ -37929,390 +39852,100 @@ 2001814576,2001814583,US 2001814584,2001815191,SG 2001815192,2001815199,US -2001815200,2001817079,SG -2001817080,2001817087,US -2001817088,2001818639,SG +2001815200,2001818063,SG +2001818064,2001818071,US +2001818072,2001818215,SG +2001818216,2001818223,US +2001818224,2001818471,SG +2001818472,2001818479,CA +2001818480,2001818615,SG +2001818616,2001818623,IN +2001818624,2001818639,SG 2001818640,2001818647,US -2001818648,2001818847,SG -2001818848,2001818851,AU -2001818852,2001819495,SG -2001819496,2001819503,US -2001819504,2001819887,SG +2001818648,2001819335,SG +2001819336,2001819343,TH +2001819344,2001819703,SG +2001819704,2001819711,US +2001819712,2001819887,SG 2001819888,2001819895,IE 2001819896,2001819999,SG 2001820000,2001820031,IE 2001820032,2001820719,SG 2001820720,2001820727,CA -2001820728,2001820991,SG -2001820992,2001820999,US -2001821000,2001821191,SG -2001821192,2001821199,US -2001821200,2001821335,SG +2001820728,2001821335,SG 2001821336,2001821343,US 2001821344,2001821367,SG 2001821368,2001821375,US -2001821376,2001821423,SG -2001821424,2001821431,US -2001821432,2001821439,SG -2001821440,2001821447,US -2001821448,2001821623,SG -2001821624,2001821631,US -2001821632,2001823007,SG +2001821376,2001823007,SG 2001823008,2001823015,US -2001823016,2001823447,SG +2001823016,2001823303,SG +2001823304,2001823311,US +2001823312,2001823447,SG 2001823448,2001823455,US -2001823456,2001824175,SG +2001823456,2001823903,SG +2001823904,2001823911,US +2001823912,2001824175,SG 2001824176,2001824183,US -2001824184,2001824287,SG -2001824288,2001824295,US -2001824296,2001824479,SG -2001824480,2001824487,US -2001824488,2001824495,SG -2001824496,2001824503,KR -2001824504,2001825183,SG -2001825184,2001825215,US -2001825216,2001825647,SG -2001825648,2001825655,US -2001825656,2001829891,SG -2001829892,2001829903,US -2001829904,2001830091,SG -2001830092,2001830095,US -2001830096,2001830175,SG -2001830176,2001830191,US -2001830192,2001830207,SG -2001830208,2001830223,US -2001830224,2001830335,SG -2001830336,2001830351,US -2001830352,2001830479,SG -2001830480,2001830495,US -2001830496,2001830567,SG -2001830568,2001830575,US -2001830576,2001830673,SG -2001830674,2001830674,HK -2001830675,2001830719,SG -2001830720,2001830783,US -2001830784,2001830927,SG -2001830928,2001830935,US -2001830936,2001830943,NL -2001830944,2001830975,SG -2001830976,2001830983,US -2001830984,2001831007,SG -2001831008,2001831015,US -2001831016,2001831027,SG -2001831028,2001831031,US -2001831032,2001831163,SG -2001831164,2001831167,US -2001831168,2001831287,SG -2001831288,2001831295,US -2001831296,2001831331,SG -2001831332,2001831335,US -2001831336,2001831683,SG -2001831684,2001831687,US -2001831688,2001831691,SG -2001831692,2001831703,US -2001831704,2001831915,SG -2001831916,2001831919,US -2001831920,2001831943,SG -2001831944,2001831951,US -2001831952,2001831963,SG -2001831964,2001831967,US -2001831968,2001831992,SG -2001831993,2001831993,US -2001831994,2001832135,SG -2001832136,2001832139,US -2001832140,2001832147,SG -2001832148,2001832151,US -2001832152,2001832315,SG -2001832316,2001832319,US -2001832320,2001832443,SG -2001832444,2001832447,US -2001832448,2001832615,SG -2001832616,2001832623,AZ -2001832624,2001832751,SG -2001832752,2001832759,IE -2001832760,2001832879,SG -2001832880,2001832887,US -2001832888,2001832903,SG -2001832904,2001832911,US -2001832912,2001832951,SG -2001832952,2001832955,US -2001832956,2001833007,SG +2001824184,2001824543,SG +2001824544,2001824551,PH +2001824552,2001826607,SG +2001826608,2001826623,CA +2001826624,2001826655,SG +2001826656,2001826671,US +2001826672,2001826831,SG +2001826832,2001826863,US +2001826864,2001826911,SG +2001826912,2001826943,US +2001826944,2001827103,SG +2001827104,2001827111,CA +2001827112,2001827407,SG +2001827408,2001827415,US +2001827416,2001827551,SG +2001827552,2001827567,PH +2001827568,2001828351,SG +2001828352,2001828367,US +2001828368,2001828383,SG +2001828384,2001828399,AU +2001828400,2001828831,SG +2001828832,2001828863,US +2001828864,2001828927,SG +2001828928,2001828991,US +2001828992,2001829375,SG +2001829376,2001829439,US +2001829440,2001829535,SG +2001829536,2001829567,US +2001829568,2001829887,SG +2001829888,2001833007,HK 2001833008,2001833015,CN -2001833016,2001833071,SG -2001833072,2001833079,US -2001833080,2001833099,SG -2001833100,2001833103,US -2001833104,2001833255,SG -2001833256,2001833263,US -2001833264,2001833419,SG -2001833420,2001833421,US -2001833422,2001833439,SG -2001833440,2001833447,US -2001833448,2001833487,SG -2001833488,2001833495,US -2001833496,2001833655,SG -2001833656,2001833663,GB -2001833664,2001833679,SG -2001833680,2001833687,GB -2001833688,2001833727,SG -2001833728,2001833791,US -2001833792,2001834096,SG -2001834097,2001834097,US -2001834098,2001834239,SG -2001834240,2001834495,HK -2001834496,2001834751,SG -2001834752,2001834815,US -2001834816,2001834935,SG -2001834936,2001834943,JP -2001834944,2001834947,US -2001834948,2001835035,SG -2001835036,2001835039,US -2001835040,2001835103,SG -2001835104,2001835135,US -2001835136,2001835147,SG -2001835148,2001835151,US -2001835152,2001835231,SG -2001835232,2001835239,US -2001835240,2001835247,SG -2001835248,2001835263,US -2001835264,2001835515,SG -2001835516,2001835519,US -2001835520,2001835587,SG -2001835588,2001835591,US -2001835592,2001835711,SG -2001835712,2001835719,US -2001835720,2001835793,SG -2001835794,2001835794,US -2001835795,2001835795,SG -2001835796,2001835799,US -2001835800,2001835959,SG -2001835960,2001835983,US -2001835984,2001836107,SG -2001836108,2001836111,US -2001836112,2001836267,SG -2001836268,2001836271,US -2001836272,2001836291,SG -2001836292,2001836295,US -2001836296,2001836419,SG -2001836420,2001836423,US -2001836424,2001836427,SG -2001836428,2001836431,US -2001836432,2001836435,SG -2001836436,2001836439,US -2001836440,2001836451,SG -2001836452,2001836455,US -2001836456,2001836471,SG -2001836472,2001836487,US -2001836488,2001836506,SG -2001836507,2001836507,US -2001836508,2001836543,SG -2001836544,2001838079,US -2001838080,2001838627,SG -2001838628,2001838631,US -2001838632,2001838633,SG -2001838634,2001838634,HK -2001838635,2001838755,SG -2001838756,2001838759,US -2001838760,2001838763,SG -2001838764,2001838767,US -2001838768,2001838847,SG -2001838848,2001839103,HK -2001839104,2001839111,SG -2001839112,2001839115,US -2001839116,2001839535,SG -2001839536,2001839543,US -2001839544,2001839595,SG -2001839596,2001839599,SA -2001839600,2001839739,SG -2001839740,2001839743,US -2001839744,2001839775,SG -2001839776,2001839783,US -2001839784,2001839803,SG -2001839804,2001839807,US -2001839808,2001840057,SG -2001840058,2001840059,SA -2001840060,2001840071,SG -2001840072,2001840079,US -2001840080,2001840175,SG -2001840176,2001840183,US -2001840184,2001840767,SG -2001840768,2001840799,US -2001840800,2001841159,SG -2001841160,2001841167,US -2001841168,2001841175,SG -2001841176,2001841176,US -2001841177,2001841177,SA -2001841178,2001841179,SG -2001841180,2001841247,US -2001841248,2001841279,SA -2001841280,2001841311,SG -2001841312,2001841319,US -2001841320,2001841343,SG -2001841344,2001841407,US -2001841408,2001841639,SG -2001841640,2001841647,US -2001841648,2001842047,SG -2001842048,2001842111,US -2001842112,2001842175,SG -2001842176,2001842271,US -2001842272,2001842319,SG -2001842320,2001842327,US -2001842328,2001842343,SG -2001842344,2001842351,US -2001842352,2001842687,SG -2001842688,2001842751,US -2001842752,2001842783,SG -2001842784,2001842815,US -2001842816,2001843249,SG -2001843250,2001843251,US -2001843252,2001843471,SG -2001843472,2001843475,US -2001843476,2001843839,SG -2001843840,2001843967,US -2001843968,2001844127,SG -2001844128,2001845247,US -2001845248,2001845335,SG -2001845336,2001845343,US -2001845344,2001845359,SG -2001845360,2001845375,US -2001845376,2001845391,SG -2001845392,2001845503,US -2001845504,2001845695,SG -2001845696,2001845703,US -2001845704,2001845799,SG -2001845800,2001845807,US -2001845808,2001846015,SG -2001846016,2001846311,US -2001846312,2001846335,SG -2001846336,2001846359,US -2001846360,2001846479,SG -2001846480,2001846495,US -2001846496,2001846503,SG -2001846504,2001846511,US -2001846512,2001846519,SG -2001846520,2001846523,US -2001846524,2001846531,SG -2001846532,2001846543,US -2001846544,2001846559,SG -2001846560,2001846567,US -2001846568,2001846571,SG -2001846572,2001846607,US -2001846608,2001846615,SG -2001846616,2001846727,US +2001833016,2001846271,HK +2001846272,2001846719,SG +2001846720,2001846727,US 2001846728,2001846735,SG 2001846736,2001846755,US -2001846756,2001846847,SG -2001846848,2001846911,US -2001846912,2001846927,SG -2001846928,2001846943,US -2001846944,2001846959,SG +2001846756,2001846959,SG 2001846960,2001846975,IN -2001846976,2001847071,SG -2001847072,2001847103,US -2001847104,2001847167,SG -2001847168,2001847416,US -2001847417,2001847417,SG -2001847418,2001847429,US -2001847430,2001847439,SG -2001847440,2001847455,US -2001847456,2001847463,SG -2001847464,2001847479,US -2001847480,2001847487,SG -2001847488,2001847491,US -2001847492,2001847493,SG -2001847494,2001847495,US -2001847496,2001847519,SG -2001847520,2001847535,US -2001847536,2001847537,SG -2001847538,2001847559,US -2001847560,2001847567,SG -2001847568,2001847575,US -2001847576,2001847591,SG -2001847592,2001847599,US -2001847600,2001847623,SG -2001847624,2001847647,US -2001847648,2001847663,SG -2001847664,2001847671,US -2001847672,2001847679,SG -2001847680,2001847703,US -2001847704,2001847711,SG -2001847712,2001847727,US -2001847728,2001847743,SG -2001847744,2001847747,US -2001847748,2001847755,SG -2001847756,2001847771,US -2001847772,2001847783,SG -2001847784,2001847791,US -2001847792,2001847799,SG -2001847800,2001847839,US -2001847840,2001847855,SG -2001847856,2001847871,US -2001847872,2001847875,SG -2001847876,2001847879,US -2001847880,2001847895,SG -2001847896,2001847903,US -2001847904,2001847935,SG -2001847936,2001847951,US -2001847952,2001847955,SG -2001847956,2001847959,US -2001847960,2001847963,SG -2001847964,2001847967,US -2001847968,2001847975,SG -2001847976,2001847979,US -2001847980,2001847981,SG -2001847982,2001847991,US -2001847992,2001848007,SG -2001848008,2001848015,US -2001848016,2001848047,SG -2001848048,2001848055,US -2001848056,2001848071,SG -2001848072,2001848079,IN -2001848080,2001848103,SG -2001848104,2001848111,US -2001848112,2001848135,SG -2001848136,2001848143,US -2001848144,2001848151,SG -2001848152,2001848167,US -2001848168,2001848189,SG -2001848190,2001848199,US -2001848200,2001848207,SG -2001848208,2001848231,US -2001848232,2001848247,SG -2001848248,2001848253,US -2001848254,2001848254,SG -2001848255,2001848255,MY -2001848256,2001848279,SG -2001848280,2001848287,US -2001848288,2001848303,SG -2001848304,2001848327,US -2001848328,2001848335,SG -2001848336,2001848367,US -2001848368,2001848383,SG -2001848384,2001848407,US -2001848408,2001848415,SG -2001848416,2001848447,US -2001848448,2001848479,SG -2001848480,2001848575,US -2001848576,2001848623,SG -2001848624,2001848679,US -2001848680,2001848687,SG -2001848688,2001848767,US -2001848768,2001848863,SG -2001848864,2001848879,US -2001848880,2001848895,SG -2001848896,2001848943,US -2001848944,2001848951,SG -2001848952,2001848975,US +2001846976,2001847199,SG +2001847200,2001847231,US +2001847232,2001847455,SG +2001847456,2001847487,US +2001847488,2001847703,SG +2001847704,2001847711,US +2001847712,2001848767,SG +2001848768,2001848783,US +2001848784,2001848911,SG +2001848912,2001848919,JP +2001848920,2001848959,SG +2001848960,2001848975,US 2001848976,2001848991,SG 2001848992,2001849015,US 2001849016,2001849023,SG -2001849024,2001849167,US -2001849168,2001849183,SG -2001849184,2001849247,US -2001849248,2001849255,SG -2001849256,2001849271,US -2001849272,2001849279,SG -2001849280,2001850391,US +2001849024,2001849087,US +2001849088,2001849471,SG +2001849472,2001849503,US +2001849504,2001849631,SG +2001849632,2001849663,US +2001849664,2001849855,SG +2001849856,2001850391,US 2001850392,2001850399,SG 2001850400,2001850415,US 2001850416,2001850423,SG @@ -38731,7 +40364,9 @@ 2019049472,2019078143,AU 2019078144,2019082239,IN 2019082240,2019098623,HK -2019098624,2019115007,PH +2019098624,2019106815,PH +2019106816,2019107071,NO +2019107072,2019115007,PH 2019115008,2019117055,US 2019117056,2019119103,IN 2019119104,2019121151,NZ @@ -38914,8 +40549,10 @@ 2047506432,2047508479,US 2047508480,2047574015,CN 2047574016,2047606783,SG -2047606784,2047803391,CN -2047803392,2047868927,SG +2047606784,2047770879,CN +2047770880,2047773184,HK +2047773185,2047803391,CN +2047803392,2047868927,IN 2047868928,2048917503,JP 2048917504,2049966079,KR 2049966080,2050047999,CN @@ -38928,8 +40565,7 @@ 2050091008,2050097151,JP 2050097152,2050101247,SG 2050101248,2050113535,JP -2050113536,2050129663,SG -2050129664,2050129919,JP +2050113536,2050129919,SG 2050129920,2050162687,IN 2050162688,2050228223,CN 2050228224,2050490367,PH @@ -38963,9 +40599,7 @@ 2053534720,2053537791,IN 2053537792,2053636095,JP 2053636096,2054160383,AU -2054160384,2054189567,CN -2054189568,2054190591,HK -2054190592,2054376447,CN +2054160384,2054376447,CN 2054376448,2054377471,HK 2054377472,2054422527,CN 2054422528,2054619135,TW @@ -39064,18 +40698,13 @@ 2060451840,2061500415,JP 2061500416,2063073279,CN 2063073280,2063077375,BD -2063077376,2063077377,PH -2063077378,2063077378,HK -2063077379,2063077631,PH -2063077632,2063079423,HK +2063077376,2063079423,HK 2063079424,2063081471,CN 2063081472,2063085567,ID 2063085568,2063089663,CN 2063089664,2063097855,JP 2063097856,2063106047,MM -2063106048,2063106559,SG -2063106560,2063106815,AU -2063106816,2063107071,SG +2063106048,2063107071,SG 2063107072,2063107327,JP 2063107328,2063107623,SG 2063107624,2063107631,AU @@ -39084,19 +40713,18 @@ 2063110144,2063111167,JP 2063111168,2063114239,AU 2063114240,2063115263,IN -2063115264,2063117311,JP -2063117312,2063117567,NZ -2063117568,2063117823,JP +2063115264,2063117823,JP 2063117824,2063117839,PH 2063117840,2063117951,JP 2063117952,2063118079,PH -2063118080,2063118335,JP +2063118080,2063118159,JP +2063118160,2063118191,PH +2063118192,2063118335,JP 2063118336,2063118591,IN 2063118592,2063119871,JP 2063119872,2063120383,IN -2063120384,2063120895,JP -2063120896,2063121151,AU -2063121152,2063122431,JP +2063120384,2063121919,JP +2063121920,2063122431,IN 2063122432,2063138815,SG 2063138816,2063335423,JP 2063335424,2063341567,AU @@ -39320,7 +40948,11 @@ 2083389440,2083454975,KR 2083454976,2083471359,CN 2083471360,2083487743,JP -2083487744,2083504127,AU +2083487744,2083491583,AU +2083491584,2083491839,US +2083491840,2083492863,AU +2083492864,2083493375,US +2083493376,2083504127,AU 2083504128,2083520511,JP 2083520512,2083966719,KR 2083966720,2083966975,JP @@ -39345,7 +40977,6 @@ 2087452672,2087453695,AU 2087453696,2087454719,KH 2087454720,2087456767,CN -2087456768,2087457791,MY 2087458816,2087460863,FJ 2087460864,2087462911,JP 2087462912,2087464959,CN @@ -39481,7 +41112,9 @@ 2099216384,2099232767,KR 2099232768,2100297727,CN 2100297728,2100854783,JP -2100854784,2100887551,US +2100854784,2100874495,US +2100874496,2100874751,AU +2100874752,2100887551,US 2100887552,2100953087,KR 2100953088,2100969471,VN 2100969472,2100985855,JP @@ -39543,13 +41176,9 @@ 2112487424,2112618495,VN 2112618496,2112880639,NZ 2112880640,2113683455,KR -2113683456,2113685759,JP -2113685760,2113686015,MY -2113686016,2113687807,JP -2113687808,2113688063,AU -2113688064,2113688319,JP -2113688320,2113688575,SG -2113688576,2113693599,JP +2113683456,2113687999,JP +2113688000,2113688031,AU +2113688032,2113693599,JP 2113693600,2113693615,HK 2113693616,2113716223,JP 2113716224,2113724927,SG @@ -39571,7 +41200,11 @@ 2147489792,2147491839,RU 2147491840,2147494911,DE 2147494912,2147495167,RO -2147495168,2147498239,DE +2147495168,2147495423,DE +2147495424,2147495935,RO +2147495936,2147497215,DE +2147497216,2147497471,RO +2147497472,2147498239,DE 2147498240,2147498495,RO 2147498496,2147500031,DE 2147500032,2147501055,FR @@ -39614,7 +41247,9 @@ 2151778304,2151780351,RU 2151780352,2151782399,DE 2151782400,2151784447,ES -2151784448,2151792639,IR +2151784448,2151788479,IR +2151788480,2151788495,IQ +2151788496,2151792639,IR 2151792640,2151794687,CH 2151794688,2151796735,IT 2151796736,2151797759,DE @@ -39683,9 +41318,7 @@ 2155827200,2155831295,PL 2155831296,2155833343,RU 2155833344,2155833855,SE -2155833856,2155834084,NL -2155834085,2155834111,SE -2155834112,2155834367,NL +2155833856,2155834367,NL 2155834368,2155834464,SE 2155834465,2155834512,NL 2155834513,2155834532,SE @@ -39731,7 +41364,9 @@ 2159673344,2159869951,US 2159869952,2159935487,CA 2159935488,2160525311,US -2160525312,2160590847,SG +2160525312,2160533503,SG +2160533504,2160541695,NL +2160541696,2160590847,SG 2160590848,2160656383,US 2160721920,2160852991,US 2160852992,2160885759,RU @@ -39744,12 +41379,10 @@ 2160914432,2160918527,SA 2160918528,2161508351,US 2161508352,2161573887,FI -2161573888,2162228223,US -2162228224,2162228479,CA -2162228480,2162687999,US +2161573888,2162687999,US 2162688000,2162753535,GB 2162753536,2162819071,CA -2162819072,2162884607,RO +2162819072,2162884607,SA 2162884608,2163212287,US 2163212288,2163277823,GB 2163277824,2163408895,US @@ -39780,10 +41413,13 @@ 2166571008,2166575103,GB 2166575104,2166575359,US 2166575360,2166575615,GB -2166575616,2166607009,US +2166575616,2166594563,US +2166594564,2166594564,DE +2166594565,2166606847,US +2166606848,2166607009,GB 2166607010,2166607010,DE -2166607011,2166607011,GB -2166607012,2166613759,US +2166607011,2166607103,GB +2166607104,2166613759,US 2166613760,2166614015,DE 2166614016,2167209983,US 2167275520,2167930879,US @@ -39855,7 +41491,9 @@ 2178351104,2178416639,GB 2178416640,2178482175,US 2178482176,2178547711,DE -2178547712,2179391487,US +2178547712,2178900223,US +2178900224,2178900479,NZ +2178900480,2179391487,US 2179391488,2179391999,GB 2179392000,2179397632,US 2179397633,2179397633,GB @@ -39993,15 +41631,21 @@ 2188718582,2188718582,DE 2188718583,2188724463,US 2188724464,2188724464,NL -2188724465,2188726783,US +2188724465,2188724991,US +2188724992,2188725247,RS +2188725248,2188726783,US 2188726784,2188727039,GB 2188727040,2188728319,US 2188728320,2188728575,GB 2188728576,2188734463,US 2188734464,2188734719,FR -2188734720,2188738306,US +2188734720,2188736511,US +2188736512,2188736767,GB +2188736768,2188738306,US 2188738307,2188738307,GB -2188738308,2188768767,US +2188738308,2188749055,US +2188749056,2188749311,SL +2188749312,2188768767,US 2188768768,2188769279,YT 2188769280,2188902399,US 2188902400,2188967935,FR @@ -40074,19 +41718,21 @@ 2193707408,2193707415,IT 2193707416,2193707559,GB 2193707560,2193707567,IT -2193707568,2193707615,GB -2193707616,2193707623,IT -2193707624,2193707751,GB +2193707568,2193707655,GB +2193707656,2193707663,IT +2193707664,2193707751,GB 2193707752,2193707759,IT -2193707760,2193707831,GB -2193707832,2193707839,IT -2193707840,2193708511,GB -2193708512,2193708519,IT -2193708520,2193708735,GB +2193707760,2193708303,GB +2193708304,2193708311,IT +2193708312,2193708647,GB +2193708648,2193708655,IT +2193708656,2193708735,GB 2193708736,2193708743,IT 2193708744,2193709087,GB 2193709088,2193709095,IT -2193709096,2193711103,GB +2193709096,2193709631,GB +2193709632,2193709639,IT +2193709640,2193711103,GB 2193711104,2193713151,DE 2193713152,2193715199,ES 2193715200,2193717247,DE @@ -40140,9 +41786,7 @@ 2197780480,2197782527,DE 2197782528,2197782685,RU 2197782686,2197782686,UA -2197782687,2197782783,RU -2197782784,2197783039,UA -2197783040,2197786623,RU +2197782687,2197786623,RU 2197786624,2197788671,IT 2197788672,2197790719,PL 2197790720,2197792767,SE @@ -40168,7 +41812,7 @@ 2197859328,2197860351,CL 2197860352,2197865471,BR 2197865472,2197866495,AR -2197867520,2197869567,BR +2197866496,2197869567,BR 2197869568,2197870591,UY 2197870592,2197874687,BR 2197874688,2197875711,AR @@ -40180,24 +41824,83 @@ 2202534912,2202540031,BR 2202540032,2202541055,PY 2202541056,2202542079,AR -2202542080,2202550271,BR +2202542080,2202552319,BR 2202552320,2202553343,AR -2202554368,2202559487,BR +2202553344,2202554367,TT +2202554368,2202562559,BR 2202562560,2202563583,CW -2202565632,2202566655,BR +2202563584,2202567679,BR 2202567680,2202568703,AR -2202569728,2202570751,BR +2202568704,2202569727,NL +2202569728,2202573823,BR 2202573824,2202574847,AR -2202574848,2202578943,BR +2202574848,2202576895,BR +2202576896,2202577919,VE +2202577920,2202586111,BR +2202586112,2202587135,AR +2202587136,2202588159,HN +2202588160,2202589183,MX +2202589184,2202591231,BR +2202591232,2202592255,PA +2202592256,2202593279,MX +2202593280,2202595327,CL +2202595328,2202596351,AR +2202596352,2202599423,BR 2202599424,2204172287,US 2204172288,2204237823,SE 2204237824,2204303359,US 2204303360,2204368895,DE +2204368896,2204369919,PA +2204369920,2204376063,BR +2204376064,2204377087,CL +2204377088,2204378111,BR +2204378112,2204379135,TT +2204379136,2204385279,BR +2204385280,2204386303,AR +2204386304,2204391423,BR +2204391424,2204392447,AR +2204392448,2204394495,BR +2204394496,2204395519,AR +2204395520,2204396543,BR +2204396544,2204397567,AR +2204397568,2204404735,BR +2204404736,2204405759,SV +2204405760,2204409855,BR +2204409856,2204410879,TT +2204410880,2204414975,BR +2204414976,2204415999,AR +2204416000,2204417023,PY +2204417024,2204420095,BR +2204420096,2204421119,BO +2204421120,2204434431,BR 2204434432,2204499967,US 2204499968,2204565503,CH 2204565504,2204631039,US 2204631040,2204696575,CA 2204696576,2204893183,US +2204893184,2204894207,AR +2204894208,2204895231,PA +2204895232,2204897279,BR +2204897280,2204898303,HN +2204898304,2204899327,PA +2204899328,2204902399,BR +2204902400,2204903423,CR +2204903424,2204904447,AR +2204904448,2204910591,BR +2204910592,2204911615,CL +2204911616,2204913663,BR +2204913664,2204914687,AR +2204914688,2204929023,BR +2204929024,2204930047,AR +2204930048,2204936191,BR +2204936192,2204937215,CO +2204937216,2204942335,BR +2204942336,2204943359,PY +2204943360,2204946431,BR +2204946432,2204947455,CL +2204947456,2204952575,BR +2204952576,2204953599,HN +2204953600,2204958719,BR 2204958720,2205089791,US 2205089792,2205155327,GB 2205155328,2205286399,JP @@ -40216,12 +41919,13 @@ 2205538304,2205540351,RU 2205540352,2205548543,IQ 2205548544,2206269439,US -2206269440,2206334975,CA +2206269440,2206334975,HK 2206334976,2206400511,AT 2206400512,2206466047,US 2206466048,2207121407,CA 2207121408,2207449087,US -2207449088,2207647487,CA +2207449088,2207514623,HK +2207514624,2207647487,CA 2207647488,2207647743,US 2207647744,2207648511,CA 2207648512,2207649791,US @@ -40248,6 +41952,28 @@ 2208038912,2208235519,US 2208235520,2208301055,DE 2208301056,2208366591,FI +2208366592,2208379903,BR +2208379904,2208380927,HN +2208380928,2208381951,CL +2208381952,2208387071,BR +2208387072,2208388095,HN +2208388096,2208389119,SX +2208389120,2208390143,AR +2208390144,2208392191,BR +2208392192,2208393215,PE +2208393216,2208404479,BR +2208404480,2208405503,BZ +2208405504,2208406527,AR +2208406528,2208413695,BR +2208413696,2208414719,AR +2208414720,2208417791,BR +2208417792,2208418815,CL +2208418816,2208425983,BR +2208425984,2208428031,AR +2208428032,2208429055,BR +2208429056,2208430079,MX +2208430080,2208431103,BR +2208431104,2208432127,PY 2208432128,2208563199,CA 2208563200,2208759807,DK 2208759808,2208890879,US @@ -40272,7 +41998,54 @@ 2210594816,2210660351,CA 2210725888,2211053567,US 2211053568,2211119103,CA -2211119104,2211184639,NZ +2211119104,2211120127,AU +2211120128,2211120383,NZ +2211120384,2211121151,AU +2211121152,2211121407,NZ +2211121408,2211122431,AU +2211122432,2211122687,NZ +2211122688,2211135231,AU +2211135232,2211135999,NZ +2211136000,2211137791,AU +2211137792,2211138047,NZ +2211138048,2211138559,AU +2211138560,2211138815,NZ +2211138816,2211140351,AU +2211140352,2211140607,NZ +2211140608,2211140863,AU +2211140864,2211141119,NZ +2211141120,2211142399,AU +2211142400,2211142911,NZ +2211142912,2211144703,AU +2211144704,2211144959,NZ +2211144960,2211147007,AU +2211147008,2211147263,NZ +2211147264,2211148031,AU +2211148032,2211148543,NZ +2211148544,2211148671,AU +2211148672,2211149567,NZ +2211149568,2211149823,AU +2211149824,2211150079,NZ +2211150080,2211150847,AU +2211150848,2211151359,NZ +2211151360,2211151615,AU +2211151616,2211151871,NZ +2211151872,2211152639,AU +2211152640,2211153151,NZ +2211153152,2211153407,AU +2211153408,2211153663,NZ +2211153664,2211154175,AU +2211154176,2211154431,NZ +2211154432,2211179519,AU +2211179520,2211179775,NZ +2211179776,2211180287,AU +2211180288,2211181823,NZ +2211181824,2211182079,AU +2211182080,2211182591,NZ +2211182592,2211183103,AU +2211183104,2211184127,NZ +2211184128,2211184383,AU +2211184384,2211184639,NZ 2211184640,2211250175,US 2211250176,2211315711,SE 2211315712,2211381247,JP @@ -40280,11 +42053,33 @@ 2211446784,2211643391,US 2211643392,2211708927,NL 2211708928,2211774463,US -2211774464,2211839999,CA +2211774464,2211839999,HK 2211840000,2212036607,US 2212036608,2212102143,AU 2212102144,2212233215,US 2212233216,2212298751,DE +2212298752,2212299775,AR +2212299776,2212300799,DO +2212300800,2212301823,HN +2212301824,2212302847,BR +2212302848,2212303871,AR +2212303872,2212304895,BR +2212304896,2212305919,PA +2212305920,2212306943,TT +2212306944,2212307967,CL +2212307968,2212308991,BR +2212308992,2212310015,CO +2212310016,2212315135,BR +2212315136,2212316159,AR +2212316160,2212327423,BR +2212327424,2212328447,VE +2212328448,2212335615,BR +2212335616,2212336639,CW +2212336640,2212337663,BR +2212337664,2212338687,PE +2212338688,2212340735,BR +2212340736,2212341759,CL +2212341760,2212364287,BR 2212364288,2212495359,US 2212495360,2212560895,NL 2212560896,2212691967,US @@ -40321,13 +42116,28 @@ 2214264832,2214330367,GB 2214330368,2214461439,US 2214461440,2214526975,FR +2214526976,2214527999,BR +2214528000,2214529023,AR +2214529024,2214530047,BR +2214530048,2214531071,AR +2214531072,2214537215,BR +2214537216,2214538239,BZ +2214538240,2214542335,BR +2214542336,2214543359,AR +2214543360,2214553599,BR +2214553600,2214554623,VE +2214554624,2214561791,BR +2214561792,2214562815,PE +2214562816,2214573055,BR +2214573056,2214574079,AR +2214574080,2214576127,BR +2214576128,2214577151,PE +2214577152,2214590463,BR +2214590464,2214591487,AR +2214591488,2214592511,BR 2214592512,2218786815,US 2218786816,2219769855,IL -2219769856,2222521855,US -2222521856,2222522111,PR -2222522112,2223111679,US -2223111680,2223111935,VI -2223111936,2224160767,US +2219769856,2224160767,US 2224160768,2224226303,GB 2224226304,2224242687,US 2224242688,2224259071,SG @@ -40394,6 +42204,29 @@ 2231107584,2231173119,DE 2231173120,2231238655,US 2231238656,2231304191,MX +2231304192,2231305215,PE +2231305216,2231307263,AR +2231307264,2231309311,BR +2231309312,2231310335,CO +2231310336,2231321599,BR +2231321600,2231322623,CL +2231322624,2231332863,BR +2231332864,2231333887,AR +2231333888,2231335935,BR +2231335936,2231336959,MX +2231336960,2231337983,BR +2231337984,2231339007,HN +2231339008,2231346175,BR +2231346176,2231347199,PY +2231347200,2231355391,BR +2231355392,2231356415,AR +2231356416,2231357439,BR +2231357440,2231358463,SV +2231358464,2231361535,BR +2231361536,2231362559,AR +2231362560,2231364607,BR +2231364608,2231365631,CL +2231365632,2231369727,BR 2231369728,2248146943,JP 2248146944,2248148991,IT 2248148992,2248151039,ES @@ -40438,7 +42271,9 @@ 2250047488,2250113023,US 2250113024,2250178559,DE 2250178560,2250244095,CA -2250244096,2250375167,US +2250244096,2250282239,US +2250282240,2250282495,GB +2250282496,2250375167,US 2250375168,2250440703,DE 2250440704,2250506239,US 2250506240,2250571775,GB @@ -40532,24 +42367,11 @@ 2258580032,2258582783,TW 2258582784,2258582791,GB 2258582792,2258583551,TW -2258583552,2258583575,GB -2258583576,2258583583,TW -2258583584,2258583775,GB -2258583776,2258583807,TW -2258583808,2258583935,GB -2258583936,2258583967,TW -2258583968,2258584007,GB -2258584008,2258584351,TW -2258584352,2258584383,GB -2258584384,2258584574,TW -2258584575,2258584575,GB -2258584576,2258591575,TW -2258591576,2258591579,GB -2258591580,2258591631,TW -2258591632,2258591639,GB -2258591640,2258591935,TW +2258583552,2258591743,GB +2258591744,2258591935,TW 2258591936,2258591967,HK -2258591968,2258592271,TW +2258591968,2258591999,AU +2258592000,2258592271,TW 2258592272,2258592279,JP 2258592280,2258592287,TW 2258592288,2258592291,JP @@ -40559,16 +42381,15 @@ 2258592480,2258592495,AU 2258592496,2258592511,TW 2258592512,2258592767,AU -2258592768,2258592791,TW -2258592792,2258592803,HK -2258592804,2258593279,TW +2258592768,2258593023,HK +2258593024,2258593279,TW 2258593280,2258593535,HK 2258593536,2258594047,TW 2258594048,2258594111,HK -2258594112,2258594303,TW -2258594304,2258594319,HK -2258594320,2258594559,TW -2258594560,2258594815,HK +2258594112,2258594143,TW +2258594144,2258594175,HK +2258594176,2258594303,TW +2258594304,2258594815,HK 2258594816,2258595167,TW 2258595168,2258595199,AU 2258595200,2258595383,TW @@ -40586,13 +42407,9 @@ 2258596104,2258596159,TW 2258596160,2258596255,HK 2258596256,2258596351,TW -2258596352,2258596863,HK -2258596864,2258596887,TW -2258596888,2258596903,HK -2258596904,2258596991,TW -2258596992,2258597023,HK -2258597024,2258597115,TW -2258597116,2258597215,HK +2258596352,2258597071,HK +2258597072,2258597079,TW +2258597080,2258597215,HK 2258597216,2258597263,TW 2258597264,2258597293,HK 2258597294,2258597294,PG @@ -40647,9 +42464,11 @@ 2258599676,2258599679,JP 2258599680,2258599743,TW 2258599744,2258599747,AU -2258599748,2258600263,TW -2258600264,2258600267,HK -2258600268,2258600515,TW +2258599748,2258599935,TW +2258599936,2258599971,HK +2258599972,2258599975,AU +2258599976,2258600447,HK +2258600448,2258600515,TW 2258600516,2258600519,IN 2258600520,2258600523,TW 2258600524,2258600527,IN @@ -40674,18 +42493,10 @@ 2258601408,2258601423,AU 2258601424,2258601471,TW 2258601472,2258601983,JP -2258601984,2258602303,TW -2258602304,2258602327,HK -2258602328,2258602335,TW -2258602336,2258602367,HK -2258602368,2258602399,TW -2258602400,2258602447,HK -2258602448,2258602479,TW -2258602480,2258602495,HK -2258602496,2258602815,TW -2258602816,2258602879,HK -2258602880,2258603007,TW -2258603008,2258603071,HK +2258601984,2258602239,TW +2258602240,2258602495,HK +2258602496,2258602751,TW +2258602752,2258603071,HK 2258603072,2258603087,TW 2258603088,2258603089,HK 2258603090,2258603090,PG @@ -40705,12 +42516,11 @@ 2258603944,2258603951,TW 2258603952,2258603967,HK 2258603968,2258604031,TW -2258604032,2258604287,HK -2258604288,2258604671,TW +2258604032,2258604543,HK +2258604544,2258604671,TW 2258604672,2258604735,SG 2258604736,2258604799,AU -2258604800,2258605055,HK -2258605056,2258605311,TW +2258604800,2258605311,HK 2258605312,2258605439,SG 2258605440,2258605823,TW 2258605824,2258605951,AU @@ -40718,12 +42528,7 @@ 2258606000,2258606015,AU 2258606016,2258606047,TW 2258606048,2258606079,AU -2258606080,2258606143,TW -2258606144,2258606147,HK -2258606148,2258606151,TW -2258606152,2258606191,HK -2258606192,2258606199,TW -2258606200,2258606367,HK +2258606080,2258606367,HK 2258606368,2258606415,TW 2258606416,2258606423,HK 2258606424,2258606463,TW @@ -40743,17 +42548,17 @@ 2258607088,2258607091,AU 2258607092,2258607095,NZ 2258607096,2258607103,AU -2258607104,2258607263,TW +2258607104,2258607171,TW +2258607172,2258607172,AU +2258607173,2258607263,TW 2258607264,2258607279,AU 2258607280,2258607351,TW 2258607352,2258607359,NZ 2258607360,2258607519,AU 2258607520,2258607543,TW 2258607544,2258607551,AU -2258607552,2258607819,TW -2258607820,2258607823,HK -2258607824,2258607871,TW -2258607872,2258607879,HK +2258607552,2258607615,TW +2258607616,2258607879,HK 2258607880,2258607903,TW 2258607904,2258607999,HK 2258608000,2258608063,TW @@ -40762,7 +42567,8 @@ 2258608256,2258608259,JP 2258608260,2258608279,TW 2258608280,2258608283,JP -2258608284,2258608639,TW +2258608284,2258608383,TW +2258608384,2258608639,HK 2258608640,2258608647,AU 2258608648,2258608655,TW 2258608656,2258608663,JP @@ -40774,12 +42580,8 @@ 2258608896,2258609087,TW 2258609088,2258609119,AU 2258609120,2258609151,TW -2258609152,2258609407,AU -2258609408,2258609423,TW -2258609424,2258609471,AU -2258609472,2258609567,TW -2258609568,2258609575,AU -2258609576,2258609919,TW +2258609152,2258609663,AU +2258609664,2258609919,TW 2258609920,2258609967,AU 2258609968,2258610179,TW 2258610180,2258610183,IN @@ -40795,35 +42597,32 @@ 2258611216,2258611223,NZ 2258611224,2258611567,TW 2258611568,2258611583,AU -2258611584,2258612223,TW +2258611584,2258611967,TW +2258611968,2258612223,HK 2258612224,2258612303,AU 2258612304,2258612351,TW 2258612352,2258612367,AU 2258612368,2258612383,TW 2258612384,2258612743,AU -2258612744,2258613503,TW +2258612744,2258612767,TW +2258612768,2258612799,AU +2258612800,2258613503,TW 2258613504,2258613567,AU 2258613568,2258614783,TW 2258614784,2258614815,IN 2258614816,2258615039,TW 2258615040,2258615055,IN -2258615056,2258615347,TW -2258615348,2258615355,AU -2258615356,2258615391,TW -2258615392,2258615395,AU -2258615396,2258616191,TW +2258615056,2258615295,TW +2258615296,2258615551,AU +2258615552,2258616191,TW 2258616192,2258616203,AU 2258616204,2258616207,TW 2258616208,2258616303,AU 2258616304,2258616311,TW 2258616312,2258616319,AU -2258616320,2258620447,TW -2258620448,2258620455,HK -2258620456,2258620463,TW -2258620464,2258620467,HK -2258620468,2258620471,TW -2258620472,2258620475,HK -2258620476,2258632703,TW +2258616320,2258620415,TW +2258620416,2258621951,HK +2258621952,2258632703,TW 2258632704,2258698239,JP 2258698240,2259222527,US 2259222528,2259288063,DE @@ -40842,23 +42641,21 @@ 2260467712,2260533247,NL 2260533248,2260598783,US 2260598784,2260664319,CA -2260664320,2260720895,GB -2260720896,2260721151,DE -2260721152,2260723711,GB +2260664320,2260720639,GB +2260720640,2260720895,DE +2260720896,2260723711,GB 2260723712,2260723967,IL 2260723968,2260729343,GB 2260729344,2260729599,IL 2260729600,2260729855,GB 2260729856,2260926463,US -2260992000,2261057535,CN +2260992000,2261057535,TH 2261057536,2261188607,US 2261188608,2261254143,CA 2261254144,2261385215,US 2261385216,2261450751,PR 2261450752,2261516287,NL -2261516288,2261569535,US -2261569536,2261569791,TH -2261569792,2261647359,US +2261516288,2261647359,US 2261647360,2261712895,FR 2261712896,2261778431,US 2261778432,2261843967,TW @@ -40903,19 +42700,25 @@ 2266431488,2266497023,CA 2266497024,2266694655,US 2266694656,2266694911,SG -2266694912,2276786175,US +2266694912,2270490623,US +2270490624,2270494719,IN +2270494720,2276786175,US 2276786176,2276851711,CA 2276851712,2277769215,US 2277769216,2277834751,GB -2277834752,2281007103,US +2277834752,2280998911,US +2280998912,2280999167,FR +2280999168,2281007103,US 2281007104,2281007359,IN -2281007360,2281023487,US +2281007360,2281010159,US +2281010160,2281010175,SG +2281010176,2281023487,US 2281023488,2281023743,IN 2281023744,2281029631,US 2281029632,2281029887,FR 2281029888,2281037823,US -2281037824,2281038079,FR -2281038080,2281701375,US +2281037824,2281037951,FR +2281037952,2281701375,US 2281701376,2281705471,CH 2281705472,2282226175,US 2282226176,2282226243,AU @@ -40945,9 +42748,7 @@ 2292973568,2293039103,DE 2293039104,2293080575,LU 2293080576,2293080831,BE -2293080832,2293085183,LU -2293085184,2293085439,BE -2293085440,2293104639,LU +2293080832,2293104639,LU 2293104640,2293825535,US 2293825536,2293891071,IN 2293891072,2293956607,AU @@ -40970,7 +42771,11 @@ 2297298944,2297364479,CH 2297364480,2297626623,US 2297626624,2297692159,DE -2297692160,2299461631,US +2297692160,2298144255,US +2298144256,2298144511,GB +2298144512,2298371071,US +2298371072,2298371327,GB +2298371328,2299461631,US 2299461632,2299527167,CA 2299527168,2299592703,US 2299592704,2299658239,NL @@ -40997,7 +42802,7 @@ 2303189558,2303189558,IE 2303189559,2303262719,US 2303262720,2303328255,GB -2303328256,2303393791,CA +2303328256,2303393791,HK 2303393792,2303459327,US 2303459328,2303524863,AU 2303524864,2303852543,US @@ -41008,7 +42813,9 @@ 2304638976,2304704511,CA 2304704512,2304770047,US 2304770048,2304835583,FI -2304835584,2305097727,US +2304835584,2304901119,US +2304901120,2304966655,CZ +2304966656,2305097727,US 2305097728,2305163263,PK 2305163264,2305359871,US 2305359872,2305425407,GB @@ -41018,7 +42825,10 @@ 2305687552,2305753087,US 2305753088,2305818623,AU 2305818624,2306015231,US -2306080768,2306342911,US +2306080768,2306129919,US +2306129920,2306138111,NL +2306138112,2306146303,IE +2306146304,2306342911,US 2306342912,2306408447,NL 2306408448,2306473983,FR 2306473984,2306539519,CA @@ -41089,6 +42899,22 @@ 2314993664,2315059199,US 2315059200,2315124735,GB 2315124736,2315190271,US +2315255808,2315257855,BR +2315257856,2315258879,AR +2315258880,2315259903,CL +2315259904,2315266047,BR +2315266048,2315267071,VE +2315267072,2315270143,BR +2315270144,2315271167,AR +2315271168,2315278335,BR +2315278336,2315279359,CO +2315279360,2315282431,BR +2315282432,2315283455,AR +2315283456,2315285503,BR +2315285504,2315286527,PA +2315289600,2315290623,BR +2315294720,2315296767,AR +2315298816,2315299839,BR 2315321344,2315452415,US 2315452416,2315517951,GB 2315517952,2315583487,ES @@ -41158,17 +42984,18 @@ 2321874944,2321940479,JP 2321940480,2322006015,FR 2322006016,2322071551,US -2322071552,2322137087,GB +2322071552,2322130431,GB +2322130432,2322130687,SG +2322130688,2322137087,GB 2322137088,2322202623,US 2322202624,2322268159,SE 2322268160,2322333695,JP 2322333696,2322923519,US 2323054592,2323120127,CA 2323316736,2323382271,US -2323382272,2323406847,NO -2323406848,2323407103,DK -2323407104,2323447807,NO -2323447808,2323775487,US +2323382272,2323447807,NO +2323447808,2323693567,US +2323709952,2323775487,US 2323775488,2323841023,AU 2323841024,2323906559,CH 2323906560,2323972095,IT @@ -41214,7 +43041,13 @@ 2330525696,2330591231,SE 2330591232,2330656767,US 2330656768,2330722303,NZ -2330722304,2331181055,US +2330722304,2330956287,US +2330956288,2330956543,GB +2330956544,2330956799,US +2330956800,2330957311,NZ +2330957312,2330968063,US +2330968064,2330968319,IN +2330968320,2331181055,US 2331181056,2331246591,JP 2331246592,2331443199,DE 2331443200,2331508735,US @@ -41224,7 +43057,9 @@ 2331836416,2331901951,GB 2331901952,2331967487,US 2332033024,2332098559,ID -2332098560,2332360703,DE +2332098560,2332298751,DE +2332298752,2332298879,GB +2332298880,2332360703,DE 2332426240,2332622847,DE 2332622848,2332688383,CN 2332688384,2332753919,NL @@ -41317,8 +43152,7 @@ 2342387712,2342453247,FR 2342453248,2342518783,CN 2342518784,2342584319,FR -2342584320,2342649855,US -2342649856,2342715391,NL +2342584320,2342715391,US 2342715392,2342780927,AU 2342780928,2342846463,NO 2342846464,2342911999,BE @@ -41348,7 +43182,6 @@ 2344353792,2344419327,AU 2344419328,2344484863,CN 2344484864,2344550399,PK -2344609024,2344609279,IT 2344615936,2344878079,ID 2344878080,2346188799,CN 2346188800,2346254335,AU @@ -41488,7 +43321,9 @@ 2366149536,2366149543,UA 2366149544,2366149551,BY 2366149552,2366149559,KZ -2366149560,2366162943,RU +2366149560,2366160223,RU +2366160224,2366160255,DE +2366160256,2366162943,RU 2366162944,2366164991,AL 2366164992,2366167039,GE 2366167040,2366169087,GB @@ -41513,12 +43348,17 @@ 2372075520,2372206591,DE 2372206592,2372214783,UA 2372214784,2372218879,DE -2372218880,2372222975,FR +2372218880,2372222463,FR +2372222464,2372222975,CH 2372224512,2372224767,GB -2372227072,2372227583,NO -2372230400,2372230655,AT -2372231424,2372231679,HU +2372227072,2372227327,NO +2372227500,2372227510,NO +2372227520,2372227522,NO +2372227571,2372227571,NO +2372228352,2372228607,KR +2372230400,2372230655,RU 2372231680,2372232191,GB +2372233472,2372233727,NO 2372238730,2372238730,US 2372239360,2372240383,SK 2372240384,2372240895,NL @@ -41540,7 +43380,8 @@ 2372493312,2372497407,ES 2372497408,2372499455,IE 2372499456,2372501503,NL -2372501504,2372505599,UA +2372501504,2372503551,BG +2372503552,2372505599,UA 2372505600,2372507647,NL 2372507648,2372509695,IT 2372509696,2372510207,AE @@ -41548,7 +43389,7 @@ 2372510336,2372510336,ES 2372510337,2372510463,AO 2372510464,2372511743,AE -2372511744,2372513791,SI +2372511744,2372513791,BA 2372513792,2372534271,GB 2372534272,2372665343,US 2372665344,2372730879,IT @@ -41573,11 +43414,7 @@ 2373911042,2373911042,US 2373911043,2373976063,FI 2373976064,2374107135,US -2374107136,2374171135,DE -2374171136,2374171206,CH -2374171207,2374171207,DE -2374171208,2374171391,CH -2374171392,2374172671,DE +2374107136,2374172671,DE 2374172672,2374238207,US 2374238208,2374303743,AU 2374303744,2374369279,US @@ -41620,7 +43457,9 @@ 2375155712,2375221247,US 2375221248,2375286783,SE 2375286784,2375352319,CH -2375352320,2376269823,US +2375352320,2376079615,US +2376079616,2376079871,GB +2376079872,2376269823,US 2376269824,2376335359,GB 2376335360,2376597503,US 2376597504,2376663039,AU @@ -41642,12 +43481,18 @@ 2377449472,2377515007,FR 2377515008,2377842687,US 2377842688,2377908223,GB -2377908224,2378025983,US +2377908224,2378022911,US +2378022912,2378023423,HK +2378023424,2378025983,US 2378025984,2378026239,NL 2378026240,2378026495,US 2378026496,2378027007,FR 2378027008,2378170367,US -2378170368,2378235903,FI +2378170368,2378203135,FI +2378203136,2378203647,NO +2378203648,2378210559,FI +2378210560,2378211071,NO +2378211072,2378235903,FI 2378235904,2378301439,US 2378301440,2378366975,FR 2378366976,2378432511,US @@ -41674,9 +43519,7 @@ 2380558848,2380559103,ZA 2380559104,2380578815,GB 2380578816,2380579071,JP -2380579072,2380579327,GB -2380579328,2380579583,HK -2380579584,2380595199,GB +2380579072,2380595199,GB 2380660736,2380726271,US 2380726272,2380791807,GB 2380791808,2381119487,US @@ -41695,8 +43538,10 @@ 2382168064,2382233599,BE 2382233600,2382299135,US 2382299136,2382331903,GR -2382331904,2382335999,FR -2382336000,2382340095,NL +2382331904,2382336255,FR +2382336256,2382337791,NL +2382337792,2382338047,FR +2382338048,2382340095,NL 2382340096,2382342143,CH 2382342144,2382344191,AT 2382344192,2382346239,NL @@ -41723,7 +43568,9 @@ 2382659072,2382676479,US 2382676480,2382676991,CA 2382676992,2382677503,US -2382677504,2382677987,CA +2382677504,2382677507,CA +2382677508,2382677511,BY +2382677512,2382677987,CA 2382677988,2382677991,US 2382677992,2382678015,CA 2382678016,2382678527,US @@ -41746,15 +43593,13 @@ 2386690048,2386988287,CA 2386988288,2386988543,CH 2386988544,2386989055,CA -2386989056,2386989311,GB +2386989056,2386989311,CH 2386989312,2387003391,CA -2387003392,2387003647,GB +2387003392,2387003647,CH 2387003648,2387003903,CA -2387003904,2387004159,GB +2387003904,2387004159,CH 2387004160,2387344127,CA -2387344128,2387344895,US -2387344896,2387345151,CA -2387345152,2387345407,US +2387344128,2387345407,US 2387345408,2387410943,CA 2387410944,2387476479,US 2387476480,2387542015,CA @@ -41773,23 +43618,21 @@ 2390818816,2390884351,US 2390884352,2390995455,CA 2390995456,2391015423,US -2391015424,2391277567,CA +2391015424,2391165439,CA +2391165440,2391165695,US +2391165696,2391277567,CA 2391277568,2391343103,US -2391343104,2393044095,CA -2393044096,2393044223,US -2393044224,2394947583,CA +2391343104,2393313407,CA +2393313408,2393313535,US +2393313536,2394947583,CA 2394947584,2395013119,US 2395013120,2395209727,CA 2395209728,2395340799,US -2395340800,2395804159,CA -2395804160,2395804415,GB -2395804416,2395814911,CA +2395340800,2395814911,CA 2395814912,2395815167,US 2395815168,2395841023,CA 2395841024,2395841535,GB -2395841536,2395854079,CA -2395854080,2395854335,US -2395854336,2397700095,CA +2395841536,2397700095,CA 2397700096,2397765631,US 2397765632,2398748671,CA 2398748672,2398945279,US @@ -41914,13 +43757,13 @@ 2418312960,2418313215,IN 2418313216,2418323007,US 2418323008,2418323008,PH -2418323009,2418337023,US -2418337024,2418337279,IN -2418337280,2418338303,US -2418338304,2418338815,IN +2418323009,2418334719,US +2418334720,2418338815,IN 2418338816,2418341887,US 2418341888,2418342143,IN -2418342144,2418606079,US +2418342144,2418342399,US +2418342400,2418342911,IN +2418342912,2418606079,US 2418606080,2418671615,DE 2418671616,2418737151,US 2418737152,2418802687,NL @@ -41974,7 +43817,9 @@ 2424111104,2424242175,US 2424242176,2424307711,NO 2424307712,2424438783,US -2424438784,2425159679,AU +2424438784,2424471551,AU +2424471552,2424475647,US +2424475648,2425159679,AU 2425159680,2425421823,US 2425421824,2425487359,DE 2425487360,2426667007,US @@ -41987,7 +43832,9 @@ 2427322368,2427453439,US 2427453440,2427536895,NO 2427536896,2427537151,US -2427537152,2427584511,NO +2427537152,2427544319,NO +2427544320,2427544575,MY +2427544576,2427584511,NO 2427584512,2427650047,GB 2427650048,2427846655,NO 2427846656,2428174335,US @@ -42014,9 +43861,7 @@ 2432172032,2432237567,BE 2432237568,2432568575,US 2432568576,2432568831,BE -2432568832,2432577535,US -2432577536,2432577791,GB -2432577792,2432587263,US +2432568832,2432587263,US 2432587264,2432587519,IE 2432587520,2432616447,US 2432616448,2432617471,NL @@ -42035,7 +43880,9 @@ 2436767744,2436767874,NL 2436767875,2436767875,DE 2436767876,2436767999,NL -2436768000,2436825087,GB +2436768000,2436775935,GB +2436775936,2436784127,DE +2436784128,2436825087,GB 2436825088,2436955647,NL 2436955648,2436955903,DE 2436955904,2441150463,NL @@ -42098,7 +43945,9 @@ 2449477632,2449479679,AL 2449479680,2449481727,FR 2449481728,2449485823,DE -2449485824,2449489919,RO +2449485824,2449487871,IE +2449487872,2449488127,GB +2449488128,2449489919,RO 2449489920,2449490943,FR 2449490944,2449491199,DE 2449491200,2449491967,FR @@ -42106,7 +43955,8 @@ 2449494016,2449496063,UA 2449496064,2449498111,FR 2449498112,2449506303,DE -2449506304,2449539071,RO +2449506304,2449534975,RO +2449534976,2449539071,DE 2449539072,2449604607,US 2449604608,2449670143,NO 2449670144,2449735679,LU @@ -42119,7 +43969,9 @@ 2450849792,2450915327,SE 2450915328,2451026431,US 2451026432,2451026687,AU -2451026688,2451042815,US +2451026688,2451031807,US +2451031808,2451032063,SG +2451032064,2451042815,US 2451042816,2451043071,ZA 2451043072,2451986959,US 2451986960,2451986960,GB @@ -42143,7 +43995,7 @@ 2453803008,2453805055,KZ 2453805056,2453807103,FI 2453807104,2453815295,GB -2453815296,2453831679,RO +2453815296,2453831679,BG 2453831680,2453833727,IQ 2453833728,2453835775,ES 2453835776,2453837823,FR @@ -42164,11 +44016,14 @@ 2454585344,2454716415,US 2454716416,2454781951,GB 2454781952,2454847487,FI -2454847488,2454851583,US +2454847488,2454851327,US +2454851328,2454851583,DE 2454851584,2454851839,DK 2454851840,2454853119,US 2454853120,2454853375,DK -2454853376,2454885503,US +2454853376,2454864895,US +2454864896,2454865151,FR +2454865152,2454885503,US 2454885504,2454885631,GB 2454885632,2454887423,US 2454887424,2454887679,DK @@ -42178,9 +44033,9 @@ 2454905920,2454905951,AR 2454905952,2454906943,US 2454906944,2454906951,CL -2454906952,2454907265,US -2454907266,2454907266,CL -2454907267,2454907903,US +2454906952,2454907263,US +2454907264,2454907391,CL +2454907392,2454907903,US 2454907904,2454908159,VE 2454908160,2454913023,US 2454913024,2454978559,CL @@ -42188,17 +44043,20 @@ 2455175168,2455240703,GB 2455240704,2455244799,US 2455244800,2455245567,AU -2455245568,2455245823,US +2455245568,2455245823,SG 2455245824,2455246847,AU 2455246848,2455247871,IN 2455247872,2455248895,US 2455248896,2455257087,TH 2455257088,2455261183,PH -2455261184,2455262207,US +2455261184,2455262207,MY 2455262208,2455263231,KR -2455263232,2455273471,US +2455263232,2455265279,PH +2455265280,2455273471,US 2455273472,2455275519,AU -2455275520,2455371775,US +2455275520,2455281663,US +2455281664,2455285759,IN +2455285760,2455371775,US 2455371776,2455437311,GB 2455437312,2455830527,US 2455830528,2455896063,GB @@ -42234,7 +44092,8 @@ 2457367552,2457372671,CZ 2457372672,2457376767,RU 2457376768,2457378815,DE -2457378816,2457393151,RU +2457378816,2457379839,NL +2457379840,2457393151,RU 2457393152,2457397247,CZ 2457397248,2457403391,RU 2457403392,2457599999,US @@ -42258,9 +44117,7 @@ 2459893760,2459959295,CH 2459959296,2460024831,US 2460024832,2460090367,FI -2460090368,2460152319,GB -2460152320,2460152575,FR -2460152576,2460155903,GB +2460090368,2460155903,GB 2460155904,2460221439,US 2460221440,2460286975,BR 2460286976,2460549119,US @@ -42269,7 +44126,9 @@ 2460680192,2460745727,NZ 2460745728,2460811263,NO 2460811264,2460876799,SE -2460876800,2460942335,US +2460876800,2460920319,US +2460920320,2460920575,GB +2460920576,2460942335,US 2460942336,2461007871,BE 2461007872,2461138943,GB 2461138944,2461204479,AU @@ -42371,7 +44230,9 @@ 2466242560,2466250751,GE 2466250752,2466318335,US 2466318336,2466318591,SG -2466318592,2466323455,US +2466318592,2466319103,US +2466319104,2466319359,AU +2466319360,2466323455,US 2466323456,2466323711,SG 2466323712,2466326015,US 2466326016,2466326271,SG @@ -42409,11 +44270,15 @@ 2470248448,2470510591,US 2470510592,2470576127,BR 2470576128,2470641663,AU -2470641664,2470707199,LU +2470641664,2470703359,LU +2470703360,2470703615,BE +2470703616,2470707199,LU 2470707200,2470772735,GB 2470772736,2470838271,AU 2470838272,2471165951,US -2471165952,2471231487,CH +2471165952,2471198719,CH +2471198720,2471211007,US +2471211008,2471231487,CH 2471231488,2471297023,AU 2471297024,2471362559,GB 2471428096,2471690239,US @@ -42449,7 +44314,10 @@ 2473656320,2473721855,US 2473721856,2473730559,GB 2473730560,2473731071,HK -2473731072,2473787391,GB +2473731072,2473785707,GB +2473785708,2473785708,US +2473785709,2473785709,HK +2473785710,2473787391,GB 2473787392,2474049535,US 2474049536,2474115071,GB 2474115072,2474246143,US @@ -42529,16 +44397,22 @@ 2483027968,2483093503,DO 2483093504,2483159039,US 2483159040,2483224575,SE -2483224576,2483290111,GB +2483224576,2483290111,ES 2483290112,2483421183,US 2483421184,2483486719,HU 2483486720,2486566911,US 2486566912,2486632447,CH 2486632448,2486697983,US -2486697984,2486763519,AT +2486697984,2486763519,DE 2486763520,2486960127,US 2486960128,2487025663,FR -2487025664,2488205311,US +2487025664,2487369727,US +2487369728,2487369983,PF +2487369984,2487370495,US +2487370496,2487384319,PF +2487384320,2487384575,US +2487384576,2487386111,PF +2487386112,2488205311,US 2488205312,2488270847,GB 2488270848,2488336383,US 2488336384,2488401919,PL @@ -42550,11 +44424,7 @@ 2489712640,2489745407,PE 2489745408,2489778175,HT 2489778176,2489843711,DO -2489843712,2489995519,US -2489995520,2489995544,SG -2489995545,2489995545,US -2489995546,2489995775,SG -2489995776,2490013695,US +2489843712,2490013695,US 2490013696,2490015743,GB 2490015744,2490043391,US 2490043392,2490043647,GB @@ -42580,23 +44450,17 @@ 2492989440,2493513727,US 2493513728,2493579263,SE 2493579264,2493644799,JP -2493644800,2493755391,US -2493755904,2493756415,US -2493759488,2494103551,US +2493644800,2494103551,US 2494103552,2494169087,FR 2494169088,2494562303,US 2494562304,2494627839,GB 2494627840,2494650623,US 2494650624,2494650879,BR -2494650880,2494657535,US -2494657536,2494657791,CO -2494657792,2494677247,US +2494650880,2494677247,US 2494677248,2494677503,AU 2494677504,2494677759,US 2494677760,2494678015,AU -2494678016,2494683135,US -2494683136,2494683391,SG -2494683392,2494689791,US +2494678016,2494689791,US 2494689792,2494690047,IN 2494690048,2494889983,US 2494889984,2494955519,GB @@ -42604,13 +44468,13 @@ 2495021056,2495152127,US 2495217664,2495283199,US 2495283200,2495348735,CH -2495348736,2495410943,US -2495410944,2495411199,AU -2495411200,2495807487,US +2495348736,2495807487,US 2495807488,2495873023,AU 2495873024,2495938559,CH 2495938560,2496004095,GB -2496004096,2496069631,AT +2496004096,2496015103,AT +2496015104,2496015359,PL +2496015360,2496069631,AT 2496069632,2496135167,US 2496135168,2496200703,NL 2496200704,2497682431,MX @@ -42650,29 +44514,37 @@ 2500149504,2500149759,GB 2500149760,2500150527,US 2500150528,2500150783,GB -2500150784,2500158463,US -2500158464,2500158719,GB -2500158720,2500161023,US +2500150784,2500161023,US 2500161024,2500161535,GB -2500161536,2500162175,US -2500162176,2500162815,GB -2500162816,2500166207,US -2500166208,2500166223,GB -2500166224,2500175871,US +2500161536,2500162559,US +2500162560,2500162815,GB +2500162816,2500166143,US +2500166144,2500166399,GB +2500166400,2500175871,US 2500175872,2500175879,RO -2500175880,2500188159,US -2500188160,2500188415,CH -2500188416,2500198911,US +2500175880,2500188679,US +2500188680,2500188687,CH +2500188688,2500196351,US +2500196352,2500198399,FI +2500198400,2500198911,US 2500198912,2500199167,GB 2500199168,2500199423,US 2500199424,2500199679,IE -2500199680,2500201535,US +2500199680,2500200703,US +2500200704,2500200959,GB +2500200960,2500201535,US 2500201536,2500201543,GB 2500201544,2500202879,US 2500202880,2500203007,ES -2500203008,2500219135,US +2500203008,2500212415,US +2500212416,2500212423,CH +2500212424,2500212991,US +2500212992,2500213247,ES +2500213248,2500219135,US 2500219136,2500219391,DE -2500219392,2500225551,US +2500219392,2500221455,US +2500221456,2500221459,FR +2500221460,2500225551,US 2500225552,2500225559,ES 2500225560,2500228607,US 2500228608,2500228863,FR @@ -42694,25 +44566,27 @@ 2500245504,2500245759,GB 2500245760,2500246015,US 2500246016,2500246527,GB -2500246528,2500272127,US +2500246528,2500247551,US +2500247552,2500248063,ES +2500248064,2500272127,US 2500272128,2500272639,GB -2500272640,2500274431,US -2500274432,2500274687,GB -2500274688,2500275199,US -2500275200,2500275711,GB -2500275712,2500276223,US +2500272640,2500276223,US 2500276224,2500276735,GB 2500276736,2500276991,US 2500276992,2500277247,GB -2500277248,2500289023,US -2500289024,2500289279,FR -2500289280,2500292607,US +2500277248,2500278751,US +2500278752,2500278783,GB +2500278784,2500289023,US +2500289024,2500289151,FR +2500289152,2500292607,US 2500292608,2500292863,DE 2500292864,2500293375,US 2500293376,2500293631,DE -2500293632,2500319231,US -2500319232,2500319743,ES -2500319744,2500392959,US +2500293632,2500313855,US +2500313856,2500314111,AT +2500314112,2500319231,US +2500319232,2500321279,ES +2500321280,2500392959,US 2500392960,2500393215,IN 2500393216,2500393983,US 2500393984,2500394239,GB @@ -42720,9 +44594,13 @@ 2500532750,2500532750,GR 2500532751,2500535295,US 2500535296,2500535551,IE -2500535552,2500537687,US +2500535552,2500537343,US +2500537344,2500537599,GB +2500537600,2500537687,US 2500537688,2500537695,GB -2500537696,2500551679,US +2500537696,2500542751,US +2500542752,2500542755,NL +2500542756,2500551679,US 2500551680,2500551935,FR 2500551936,2500553759,US 2500553760,2500553767,GB @@ -42730,9 +44608,9 @@ 2500554380,2500554487,DE 2500554488,2500555263,US 2500555264,2500555519,FR -2500555520,2500558847,US -2500558848,2500559103,FR -2500559104,2500591615,US +2500555520,2500568679,US +2500568680,2500568683,GB +2500568684,2500591615,US 2500591616,2500595711,GB 2500595712,2500608511,US 2500608512,2500608767,ES @@ -42742,19 +44620,33 @@ 2500616192,2500616703,IT 2500616704,2500636735,US 2500636736,2500636799,GB -2500636800,2500638719,US +2500636800,2500637727,US +2500637728,2500637759,GB +2500637760,2500638719,US 2500638720,2500639743,GB -2500639744,2500644863,US -2500644864,2500645119,FR -2500645120,2500646911,US +2500639744,2500646911,US 2500646912,2500647935,ES -2500647936,2500687871,US +2500647936,2500666111,US +2500666112,2500666367,LU +2500666368,2500666463,US +2500666464,2500666471,LU +2500666472,2500681759,US +2500681760,2500681767,PL +2500681768,2500687871,US 2500687872,2500689919,FR 2500689920,2500694271,US -2500694272,2500694527,IT -2500694528,2500719103,US +2500694272,2500694783,IT +2500694784,2500719103,US 2500719104,2500720639,IE -2500720640,2501574655,US +2500720640,2500720652,US +2500720653,2500720653,IE +2500720654,2500723799,US +2500723800,2500723807,ES +2500723808,2500743215,US +2500743216,2500743223,GB +2500743224,2500984831,US +2500984832,2501001215,GB +2501001216,2501574655,US 2501574656,2501640191,KZ 2501640192,2503016447,US 2503016448,2503081983,IL @@ -42772,21 +44664,43 @@ 2503911424,2503915519,ES 2503915520,2503917567,IT 2503917568,2503933951,BG -2503933952,2504470527,US +2503933952,2504180735,US +2504180736,2504180991,ES +2504180992,2504470527,US 2504470528,2504470783,ES -2504470784,2504474623,US +2504470784,2504472831,US +2504472832,2504473599,ES +2504473600,2504474623,US 2504474624,2504482815,HR -2504482816,2504491007,US +2504482816,2504486911,ES +2504486912,2504491007,US 2504491008,2504499199,IT 2504499200,2504916991,US 2504916992,2504982527,IL -2504982528,2505793535,US +2504982528,2505457663,US +2505457664,2505459711,IE +2505459712,2505469439,US +2505469440,2505469951,ES +2505469952,2505474047,NL +2505474048,2505482239,US +2505482240,2505484287,NL +2505484288,2505488383,US +2505488384,2505490431,FR +2505490432,2505504767,US +2505504768,2505506815,FI +2505506816,2505572351,US +2505572352,2505637887,IL +2505637888,2505793535,US 2505793536,2505801727,ES 2505801728,2506293247,US 2506293248,2506358783,CA -2506358784,2506360831,US +2506358784,2506359039,US +2506359040,2506359295,ES +2506359296,2506360831,US 2506360832,2506361087,ES -2506361088,2507124735,US +2506361088,2506401791,US +2506401792,2506402815,IT +2506402816,2507124735,US 2507124736,2507124991,IN 2507124992,2507145215,US 2507210752,2508062719,US @@ -42816,7 +44730,9 @@ 2508324864,2508455935,US 2508455936,2508521471,IT 2508521472,2508587007,CH -2508587008,2508652543,BE +2508587008,2508631295,BE +2508631296,2508631551,US +2508631552,2508652543,BE 2508652544,2508718079,AU 2508718080,2508914687,US 2508914688,2508980223,IT @@ -43107,11 +45023,14 @@ 2533097472,2533228543,US 2533228544,2533294079,PL 2533294080,2533359615,CN -2533359616,2533373951,UA -2533373952,2533375999,BG +2533359616,2533369855,UA +2533369856,2533371903,BG +2533371904,2533375999,UA 2533376000,2533392383,HU 2533392384,2533425151,RO -2533425152,2539978751,IT +2533425152,2538602495,IT +2538602496,2538635263,FR +2538635264,2539978751,IT 2539978752,2540240895,US 2540240896,2540306431,FI 2540306432,2540896255,US @@ -43143,7 +45062,7 @@ 2545090560,2545156095,US 2545156096,2545221631,GB 2545221632,2545287167,US -2545287168,2545352703,GB +2545287168,2545352703,ES 2545352704,2545352959,SE 2545352960,2545418239,CH 2545418240,2545483775,NL @@ -43154,8 +45073,10 @@ 2545811456,2547187711,US 2547187712,2547318783,GB 2547318784,2547515391,US -2547515392,2547523583,GB +2547523584,2547535871,GB +2547540480,2547540735,SE 2547553024,2547553279,RU +2547580928,2547646463,DE 2548039680,2548563967,GB 2548563968,2548826111,IR 2548826112,2548829695,AT @@ -43198,7 +45119,8 @@ 2549612544,2549614591,SE 2549614592,2549616639,IT 2549616640,2549618687,BE -2549618688,2549620735,DE +2549618688,2549618943,US +2549618944,2549620735,DE 2549620736,2549624831,PL 2549624832,2549626879,BE 2549626880,2549628927,PL @@ -43208,7 +45130,8 @@ 2549645312,2549678079,CH 2549678080,2549698559,GB 2549698560,2549700607,PL -2549700608,2549701375,DE +2549700608,2549700863,FR +2549700864,2549701375,DE 2549701376,2549701631,SE 2549701632,2549701887,PL 2549701888,2549702143,FR @@ -43236,7 +45159,8 @@ 2549927936,2549929983,HR 2549929984,2549932031,DE 2549932032,2549940223,HR -2549940224,2550136831,RO +2549940224,2550005759,AE +2550005760,2550136831,SA 2550136832,2550202367,DO 2550202368,2553544703,US 2553544704,2553610239,IN @@ -43282,7 +45206,8 @@ 2556780032,2556780799,SG 2556780800,2556821503,HK 2556821504,2556887039,SG -2556887040,2557018111,HK +2556887040,2556985343,HK +2556985344,2557018111,CN 2557018112,2557083647,GB 2557083648,2557542399,ZA 2557542400,2557607935,US @@ -43392,7 +45317,109 @@ 2584412160,2584477695,CA 2584477696,2584608767,US 2584608768,2584739839,CH -2584739840,2584805375,MU +2584739840,2584739903,SG +2584739904,2584740351,MU +2584740352,2584740415,HK +2584740416,2584740863,MU +2584740864,2584740927,SG +2584740928,2584741375,MU +2584741376,2584741439,HK +2584741440,2584741887,MU +2584741888,2584741951,SG +2584741952,2584742399,MU +2584742400,2584742463,HK +2584742464,2584742911,MU +2584742912,2584742975,SG +2584742976,2584743423,MU +2584743424,2584743487,HK +2584743488,2584743935,MU +2584743936,2584743999,SG +2584744000,2584744447,MU +2584744448,2584744511,HK +2584744512,2584744959,MU +2584744960,2584745023,SG +2584745024,2584745471,MU +2584745472,2584745535,HK +2584745536,2584745983,MU +2584745984,2584746047,SG +2584746048,2584746495,MU +2584746496,2584746559,HK +2584746560,2584747007,MU +2584747008,2584747071,SG +2584747072,2584747519,MU +2584747520,2584747583,HK +2584747584,2584748031,MU +2584748032,2584748095,SG +2584748096,2584748543,MU +2584748544,2584748607,HK +2584748608,2584749055,MU +2584749056,2584749119,SG +2584749120,2584749567,MU +2584749568,2584749631,HK +2584749632,2584750079,MU +2584750080,2584750143,SG +2584750144,2584750591,MU +2584750592,2584750655,HK +2584750656,2584751103,MU +2584751104,2584751167,SG +2584751168,2584751615,MU +2584751616,2584751679,HK +2584751680,2584752127,MU +2584752128,2584752191,SG +2584752192,2584752639,MU +2584752640,2584752703,HK +2584752704,2584753151,MU +2584753152,2584753215,SG +2584753216,2584753663,MU +2584753664,2584753727,HK +2584753728,2584754175,MU +2584754176,2584754239,SG +2584754240,2584754687,MU +2584754688,2584754751,HK +2584754752,2584755199,MU +2584755200,2584755263,SG +2584755264,2584755711,MU +2584755712,2584755775,HK +2584755776,2584756223,MU +2584756224,2584756287,SG +2584756288,2584756735,MU +2584756736,2584756799,HK +2584756800,2584757247,MU +2584757248,2584757311,SG +2584757312,2584757759,MU +2584757760,2584757823,HK +2584757824,2584758271,MU +2584758272,2584758335,SG +2584758336,2584758783,MU +2584758784,2584758847,HK +2584758848,2584759295,MU +2584759296,2584759359,SG +2584759360,2584759807,MU +2584759808,2584759871,HK +2584759872,2584760319,MU +2584760320,2584760383,SG +2584760384,2584760831,MU +2584760832,2584760895,HK +2584760896,2584761343,MU +2584761344,2584761407,SG +2584761408,2584761855,MU +2584761856,2584761919,HK +2584761920,2584762367,MU +2584762368,2584762431,SG +2584762432,2584762879,MU +2584762880,2584762943,HK +2584762944,2584763391,MU +2584763392,2584763455,SG +2584763456,2584763903,MU +2584763904,2584763967,HK +2584763968,2584764671,MU +2584764672,2584768511,US +2584768512,2584770559,MU +2584770560,2584775423,US +2584775424,2584775679,KE +2584775680,2584777727,MU +2584777728,2584803327,US +2584803328,2584805375,MU 2584805376,2585001983,US 2585001984,2585067519,CA 2585067520,2585788415,US @@ -43409,18 +45436,27 @@ 2586610176,2586610431,ES 2586610432,2586610687,US 2586610688,2586611711,ES -2586611712,2586611967,GB -2586611968,2586619903,US +2586611712,2586619903,US 2586619904,2586620415,FR 2586620416,2586622463,US 2586622464,2586622975,ES -2586622976,2586640895,US +2586622976,2586640383,US +2586640384,2586640399,MC +2586640400,2586640895,US 2586640896,2586641407,FR 2586641408,2586650687,US 2586650688,2586650703,DE -2586650704,2586733567,US +2586650704,2586650879,US +2586650880,2586651135,NL +2586651136,2586714879,US +2586714880,2586715135,NL +2586715136,2586733567,US 2586733568,2586733823,LT -2586733824,2586804223,US +2586733824,2586734591,US +2586734592,2586735615,LT +2586735616,2586788607,US +2586788608,2586788863,GB +2586788864,2586804223,US 2586804224,2586804479,ES 2586804480,2586828799,US 2586828800,2586829055,CH @@ -43429,19 +45465,23 @@ 2586874880,2586875135,US 2586875136,2586875903,ES 2586875904,2586876927,US -2586876928,2586877951,ES -2586877952,2586952191,US +2586876928,2586879999,ES +2586880000,2586952191,US 2586952192,2586952447,FR 2586952448,2587017215,US 2587017216,2587017471,IE 2587017472,2587018239,US 2587018240,2587018495,IE -2587018496,2587021823,US +2587018496,2587018671,US +2587018672,2587018687,IE +2587018688,2587019263,US +2587019264,2587019775,IE +2587019776,2587021823,US 2587021824,2587022335,IE 2587022336,2587066879,US 2587066880,2587067135,GB -2587067136,2587067647,US -2587067648,2587067903,GB +2587067136,2587067391,US +2587067392,2587067903,GB 2587067904,2587068415,US 2587068416,2587068479,GB 2587068480,2587071759,US @@ -43454,27 +45494,45 @@ 2587240390,2587240390,FR 2587240391,2587249417,US 2587249418,2587249418,FR -2587249419,2587394047,US +2587249419,2587378175,US +2587378176,2587378431,IT +2587378432,2587379967,US +2587379968,2587380223,IT +2587380224,2587394047,US 2587394048,2587394559,ES -2587394560,2587396095,US +2587394560,2587394815,US +2587394816,2587395071,ES +2587395072,2587396095,US 2587396096,2587399167,ES -2587399168,2587443199,US +2587399168,2587412479,US +2587412480,2587414527,IT +2587414528,2587443199,US 2587443200,2587447295,CH 2587447296,2587476760,US 2587476761,2587476761,LB -2587476762,2587479119,US +2587476762,2587477759,US +2587477760,2587478015,LB +2587478016,2587479119,US 2587479120,2587479120,LB -2587479121,2587481969,US +2587479121,2587481087,US +2587481088,2587481343,LB +2587481344,2587481969,US 2587481970,2587481970,LB 2587481971,2587492351,US 2587492352,2587493375,ES 2587493376,2587508735,US 2587508736,2587525119,GB 2587525120,2587542527,US -2587542528,2587543551,ES -2587543552,2587926527,US +2587542528,2587544063,ES +2587544064,2587582463,US +2587582464,2587586559,NL +2587586560,2587926527,US 2587926528,2587930623,BG -2587930624,2587951103,US +2587930624,2587939071,US +2587939072,2587939583,PR +2587939584,2587940607,US +2587940608,2587940863,PR +2587940864,2587951103,US 2587951104,2587952127,ZA 2587952128,2587953151,NG 2587953152,2587954175,MU @@ -43483,9 +45541,10 @@ 2587959296,2587961343,SN 2587961344,2587962367,ZA 2587962368,2587963391,SS -2587963392,2587964415,SD +2587963392,2587964027,SD +2587964028,2587964028,SS +2587964029,2587964415,SD 2587964416,2587965439,ZA -2587965440,2587966463,KE 2587966464,2587967487,BF 2587967488,2587975679,ZA 2587975680,2587983871,GH @@ -43550,7 +45609,7 @@ 2588442624,2588459007,CM 2588459008,2588467199,UG 2588467200,2588471295,TN -2588471296,2588476415,ZA +2588471296,2588477439,ZA 2588477440,2588478463,NG 2588478464,2588479487,UG 2588479488,2588480511,ZA @@ -43576,7 +45635,7 @@ 2588494848,2588495871,SO 2588495872,2588496895,ZW 2588496896,2588497919,BW -2588497920,2588498943,SD +2588497920,2588498943,SS 2588498944,2588499967,DZ 2588499968,2588500991,ZA 2588500992,2588502015,CI @@ -43588,21 +45647,38 @@ 2588507136,2588508159,SO 2588508160,2588510207,LY 2588510208,2588512255,ZA -2588522496,2588526591,ZA +2588512256,2588514303,TZ +2588514304,2588516351,ZA +2588516352,2588518399,TD +2588518400,2588519423,TZ +2588519424,2588520447,SN +2588520448,2588521471,SL +2588521472,2588526591,ZA 2588526592,2588528639,CM -2588528640,2588530687,ZA -2588532736,2588534783,ZA -2588536832,2588538879,ZA +2588528640,2588534783,ZA +2588534784,2588535807,ZM +2588535808,2588536831,NG +2588536832,2588540927,ZA 2588672000,2588934143,KE 2588934144,2589982719,SC 2589982720,2590507007,SD 2590507008,2591031295,TN 2591031296,2591096831,GA 2591293440,2591326207,GA +2591326208,2591358975,AO +2591424512,2591457279,NG +2591485952,2591486975,SO +2591486976,2591487999,ZA +2591488000,2591489023,GA +2591489024,2591490047,ZA +2591490048,2591498239,BI +2591498240,2591510527,ZA +2591510528,2591514623,ZW +2591514624,2591522815,SZ 2591522816,2591526911,LR -2591531008,2591539199,ZA +2591526912,2591539199,ZA 2591539200,2591547391,GA -2591547392,2591555583,ZA +2591547392,2591571967,ZA 2591571968,2591588351,NG 2591588352,2591604735,MG 2591604736,2591612927,MU @@ -43615,21 +45691,20 @@ 2592006144,2592022527,TZ 2592022528,2592026623,BJ 2592026624,2592026879,US -2592026880,2592027391,MU +2592026880,2592027391,ZA 2592027392,2592027647,GB -2592027648,2592028159,MU +2592027648,2592028159,ZA 2592028160,2592028415,CA -2592028416,2592028671,MU +2592028416,2592028671,ZA 2592028672,2592028799,NG 2592028800,2592028927,KE -2592028928,2592029183,MU +2592028928,2592029183,ZA 2592029184,2592029311,CI -2592029312,2592029695,MU -2592029696,2592030207,ZA +2592029312,2592030207,ZA 2592030208,2592030335,GH 2592030336,2592030463,CM 2592030464,2592030591,UG -2592030592,2592030719,MU +2592030592,2592030719,ZA 2592030720,2592034815,LY 2592034816,2592038911,NE 2592038912,2592043007,DZ @@ -43678,9 +45753,7 @@ 2609119232,2609184767,FR 2609184768,2609250303,PL 2609250304,2609381375,US -2609381376,2609428479,GB -2609428480,2609428735,IN -2609428736,2609446911,GB +2609381376,2609446911,GB 2609446912,2609512447,DK 2609512448,2609643519,US 2609643520,2609709055,GB @@ -43717,9 +45790,7 @@ 2614165504,2614231039,NO 2614231040,2614296575,ES 2614296576,2614362111,BR -2614362112,2614386431,US -2614386432,2614386559,PR -2614386560,2615083007,US +2614362112,2615083007,US 2615083008,2615148543,TR 2615148544,2615345151,US 2615345152,2615410687,NO @@ -43773,7 +45844,7 @@ 2617146624,2617146879,GY 2617146880,2617147135,DE 2617147136,2617147391,AO -2617147392,2617148159,US +2617147392,2617148415,US 2617151488,2617155583,CA 2617155584,2617163775,US 2617163776,2617164031,SK @@ -43903,12 +45974,15 @@ 2625961984,2626027519,LU 2626027520,2626093055,US 2626093056,2626158591,CH -2626158592,2626879487,US +2626158592,2626224127,US +2626224128,2626289663,CZ +2626289664,2626879487,US 2626879488,2626945023,KR 2626945024,2627010559,SI 2627010560,2627076095,NZ 2627076096,2627141631,NL 2627141632,2627403775,US +2627469312,2627731455,TZ 2634022912,2634088447,CN 2634088448,2634350591,JP 2634416128,2635005951,JP @@ -44005,7 +46079,9 @@ 2647326720,2647392255,GB 2647392256,2647457791,US 2647457792,2647523327,JP -2647523328,2647687167,US +2647523328,2647605503,US +2647605504,2647605759,GB +2647605760,2647687167,US 2647687168,2647687423,CA 2647687424,2647851007,US 2647851008,2647916543,AU @@ -44064,7 +46140,9 @@ 2655125504,2655191039,PL 2655256576,2655715327,US 2655715328,2655780863,PL -2655780864,2656632831,US +2655780864,2656387071,US +2656387072,2656403455,CA +2656403456,2656632831,US 2656632832,2656698367,AU 2656698368,2656763903,FI 2656763904,2656829439,US @@ -44087,7 +46165,9 @@ 2658009088,2658074623,IT 2658074624,2658140159,US 2658140160,2658205695,NO -2658205696,2658598911,US +2658205696,2658451455,US +2658451456,2658451711,MY +2658451712,2658598911,US 2658598912,2658664447,GB 2658664448,2658926591,US 2658926592,2659057663,GB @@ -44119,9 +46199,7 @@ 2661548032,2661679103,US 2661679104,2661885951,LU 2661885952,2661886207,BE -2661886208,2661909247,LU -2661909248,2661909503,BE -2661909504,2661914111,LU +2661886208,2661914111,LU 2661914112,2661914367,BE 2661914368,2661941247,LU 2661941248,2662006783,CL @@ -44155,7 +46233,9 @@ 2665545728,2665611263,DE 2665611264,2665676799,CH 2665676800,2665742335,ES -2665742336,2665873407,US +2665742336,2665783551,US +2665783552,2665783807,GB +2665783808,2665873407,US 2665873408,2665938943,GB 2665938944,2666004479,FR 2666004480,2666070015,CH @@ -44178,8 +46258,7 @@ 2667528192,2667532287,FR 2667532288,2667534335,RU 2667534336,2667536383,PL -2667536384,2667536639,FR -2667536640,2667537087,AT +2667536384,2667537087,AT 2667537088,2667537119,FR 2667537120,2667537151,AT 2667537152,2667541503,FR @@ -44225,7 +46304,10 @@ 2668102648,2668102655,US 2668102656,2668102991,NL 2668102992,2668102999,US -2668103000,2668103743,NL +2668103000,2668103719,NL +2668103720,2668103727,US +2668103728,2668103735,NL +2668103736,2668103743,US 2668103744,2668103775,KE 2668103776,2668104127,NL 2668104128,2668104135,GB @@ -44233,8 +46315,164 @@ 2668104192,2668104207,KE 2668104208,2668104247,NL 2668104248,2668104255,US -2668104256,2668167167,NL -2668167168,2668363775,US +2668104256,2668104999,NL +2668105000,2668105015,US +2668105016,2668105063,NL +2668105064,2668105071,US +2668105072,2668105135,NL +2668105136,2668105151,US +2668105152,2668105223,NL +2668105224,2668105239,US +2668105240,2668105255,NL +2668105256,2668105271,US +2668105272,2668105287,NL +2668105288,2668105351,US +2668105352,2668105383,NL +2668105384,2668105391,US +2668105392,2668105399,NL +2668105400,2668105439,US +2668105440,2668105471,NL +2668105472,2668105479,US +2668105480,2668105727,NL +2668105728,2668105791,US +2668105792,2668106935,NL +2668106936,2668106943,US +2668106944,2668106951,NL +2668106952,2668106959,US +2668106960,2668107599,NL +2668107600,2668107607,US +2668107608,2668107711,NL +2668107712,2668107759,US +2668107760,2668107767,NL +2668107768,2668107775,US +2668107776,2668108303,NL +2668108304,2668108335,US +2668108336,2668108343,CA +2668108344,2668108359,US +2668108360,2668108383,NL +2668108384,2668108391,US +2668108392,2668108399,NL +2668108400,2668108415,US +2668108416,2668108799,NL +2668108800,2668108807,US +2668108808,2668108823,NL +2668108824,2668108831,US +2668108832,2668108855,NL +2668108856,2668108863,US +2668108864,2668108887,NL +2668108888,2668108903,US +2668108904,2668108919,NL +2668108920,2668108927,US +2668108928,2668108935,NL +2668108936,2668108951,GB +2668108952,2668108967,NL +2668108968,2668108983,US +2668108984,2668108999,NL +2668109000,2668109023,US +2668109024,2668109031,NL +2668109032,2668109047,US +2668109048,2668109063,NL +2668109064,2668109071,US +2668109072,2668109615,NL +2668109616,2668109623,US +2668109624,2668109639,NL +2668109640,2668109663,US +2668109664,2668109671,NL +2668109672,2668109687,US +2668109688,2668109695,NL +2668109696,2668109743,US +2668109744,2668109751,NL +2668109752,2668109759,US +2668109760,2668109951,NL +2668109952,2668110047,US +2668110048,2668110271,NL +2668110272,2668110303,US +2668110304,2668110335,NL +2668110336,2668110911,US +2668110912,2668110943,NL +2668110944,2668111039,US +2668111040,2668111071,NL +2668111072,2668111231,US +2668111232,2668111327,NL +2668111328,2668111359,US +2668111360,2668111471,NL +2668111472,2668111487,US +2668111488,2668111743,NL +2668111744,2668111903,US +2668111904,2668111967,NL +2668111968,2668112159,US +2668112160,2668112191,NL +2668112192,2668112223,US +2668112224,2668112303,NL +2668112304,2668112319,US +2668112320,2668112575,NL +2668112576,2668112607,US +2668112608,2668112735,NL +2668112736,2668112767,US +2668112768,2668112799,NL +2668112800,2668112895,US +2668112896,2668112959,NL +2668112960,2668112991,US +2668112992,2668113055,NL +2668113056,2668113151,US +2668113152,2668113183,NL +2668113184,2668113407,US +2668113408,2668113567,NL +2668113568,2668113585,US +2668113586,2668113586,NL +2668113587,2668113599,US +2668113600,2668113607,JO +2668113608,2668113623,US +2668113624,2668113631,JO +2668113632,2668113639,NL +2668113640,2668113647,US +2668113648,2668113759,NL +2668113760,2668113791,US +2668113792,2668113823,NL +2668113824,2668113919,US +2668113920,2668113951,NL +2668113952,2668113983,US +2668113984,2668114015,NL +2668114016,2668114271,US +2668114272,2668114335,NL +2668114336,2668114367,US +2668114368,2668114591,NL +2668114592,2668114623,US +2668114624,2668114639,NL +2668114640,2668114719,US +2668114720,2668114879,NL +2668114880,2668114943,US +2668114944,2668114959,NL +2668114960,2668114991,US +2668114992,2668115007,NL +2668115008,2668115039,US +2668115040,2668115071,NL +2668115072,2668115087,US +2668115088,2668115135,NL +2668115136,2668115151,US +2668115152,2668115279,NL +2668115280,2668115343,US +2668115344,2668115375,NL +2668115376,2668115391,US +2668115392,2668115711,NL +2668115712,2668115775,US +2668115776,2668115807,NL +2668115808,2668115839,US +2668115840,2668116319,NL +2668116320,2668116335,IT +2668116336,2668116511,NL +2668116512,2668116543,US +2668116544,2668116863,NL +2668116864,2668116895,US +2668116896,2668116927,NL +2668116928,2668116991,US +2668116992,2668118015,NL +2668118016,2668134399,FR +2668134400,2668150783,GB +2668150784,2668167167,NL +2668167168,2668286463,US +2668286464,2668286719,GB +2668286720,2668363775,US 2668363776,2668429311,CH 2668429312,2668494847,AU 2668494848,2668560383,US @@ -44253,9 +46491,14 @@ 2668916736,2668918783,TR 2668918784,2668920831,ES 2668920832,2668953599,IT -2668953600,2668989951,US +2668953600,2668969983,US +2668969984,2668971007,GB +2668971008,2668987135,US +2668987136,2668987391,AU +2668987392,2668989951,US 2668989952,2668990463,NZ -2668990464,2669019135,US +2668990464,2668991487,IN +2668991488,2669019135,US 2669019136,2669084671,CH 2669084672,2669150207,ES 2669150208,2669215743,US @@ -44280,9 +46523,11 @@ 2671378432,2671443967,NO 2671443968,2671509503,US 2671509504,2671575039,NL -2671575040,2671720191,US -2671720192,2671720447,VE -2671720448,2671749119,US +2671575040,2671711479,US +2671711480,2671711483,DE +2671711484,2671718827,US +2671718828,2671718831,GB +2671718832,2671749119,US 2671749120,2671750143,CA 2671750144,2672295935,US 2672295936,2672361471,SE @@ -44303,9 +46548,9 @@ 2673737728,2673803263,US 2673803264,2673868799,FR 2673868800,2674130943,US -2674130944,2674163711,GB -2674163712,2674171903,CA -2674171904,2674175999,GB +2674130944,2674147327,GB +2674147328,2674163711,NL +2674163712,2674175999,GB 2674176000,2674192383,US 2674192384,2674196479,CH 2674196480,2674249727,GB @@ -44324,8 +46569,24 @@ 2675048448,2675113983,GB 2675113984,2675245055,US 2675245056,2675310591,NZ -2675310592,2675572735,US -2675572736,2675638271,NL +2675310592,2675572767,US +2675572768,2675572799,NL +2675572800,2675572831,US +2675572832,2675572863,NL +2675572864,2675572895,US +2675572896,2675589551,NL +2675589552,2675589553,US +2675589554,2675589567,NL +2675589568,2675589599,US +2675589600,2675590207,NL +2675590208,2675590239,US +2675590240,2675590335,NL +2675590336,2675590351,US +2675590352,2675590367,NL +2675590368,2675590415,US +2675590416,2675590431,NL +2675590432,2675590975,US +2675590976,2675638271,NL 2675638272,2675965951,US 2675965952,2676031487,CA 2676031488,2676097023,US @@ -44337,23 +46598,25 @@ 2677080064,2677145599,US 2677145600,2677178367,TR 2677178368,2677211135,UA -2677211136,2677276671,GB +2677211136,2677276671,ES 2677276672,2677342207,LV 2677342208,2677407743,IT 2677407744,2677473279,US 2677473280,2677538815,FR 2677538816,2677604351,FI -2677604352,2677622783,US -2677622784,2677623039,IE -2677623040,2677635071,US +2677604352,2677635071,US 2677635072,2677636095,CN 2677636096,2677639679,US 2677639680,2677639935,CA 2677639936,2677642239,US 2677642240,2677642495,ES -2677642496,2677642751,US +2677642496,2677642751,CA 2677642752,2677643007,SE -2677643008,2677648383,US +2677643008,2677644287,US +2677644288,2677644347,GB +2677644348,2677644348,US +2677644349,2677644543,GB +2677644544,2677648383,US 2677648384,2677649407,JP 2677649408,2677650431,US 2677650432,2677650943,RO @@ -44368,7 +46631,9 @@ 2677669888,2677735423,DE 2677735424,2677800959,US 2677800960,2677866495,CH -2677866496,2677997567,US +2677866496,2677924863,US +2677924864,2677925119,GB +2677925120,2677997567,US 2677997568,2678063103,CA 2678063104,2678128639,UA 2678128640,2678194175,US @@ -44411,7 +46676,12 @@ 2679242752,2679308287,US 2679308288,2679373823,CH 2679373824,2679406591,GB -2679406592,2679422975,BR +2679406592,2679414783,US +2679414784,2679415307,PR +2679415308,2679415308,DE +2679415309,2679418879,PR +2679418880,2679420927,SG +2679420928,2679422975,PR 2679422976,2679431167,US 2679431168,2679439359,FR 2679439360,2679523327,US @@ -44448,7 +46718,9 @@ 2682014208,2682014719,GB 2682014720,2682015231,US 2682015232,2682015487,IN -2682015488,2682123263,US +2682015488,2682107903,US +2682107904,2682108159,GB +2682108160,2682123263,US 2682123264,2682123519,AU 2682123520,2682257407,US 2682257408,2682322943,UA @@ -44467,8 +46739,9 @@ 2683371520,2683437055,CH 2683437056,2683568127,US 2683568128,2683633663,GB -2683637760,2683637859,NL -2683637861,2683641855,NL +2683637760,2683637859,FR +2683637861,2683638015,FR +2683638016,2683641855,NL 2683641856,2683645951,US 2683646208,2683650047,SG 2683650048,2683651071,US @@ -44530,20 +46803,21 @@ 2684192980,2684192983,US 2684192984,2684193147,NL 2684193148,2684193151,US -2684193152,2684193275,NL +2684193152,2684193175,NL +2684193176,2684193183,US +2684193184,2684193275,NL 2684193276,2684193279,US -2684193280,2684193447,NL -2684193448,2684193455,AZ -2684193456,2684193583,NL +2684193280,2684193583,NL 2684193584,2684193591,IE 2684193592,2684193735,NL 2684193736,2684193743,US -2684193744,2684193887,NL +2684193744,2684193751,NL +2684193752,2684193759,US +2684193760,2684193887,NL 2684193888,2684193911,US 2684193912,2684193931,NL 2684193932,2684193935,US -2684193936,2684194002,NL -2684194003,2684194003,BH +2684193936,2684194003,NL 2684194004,2684194007,US 2684194008,2684194071,NL 2684194072,2684194079,US @@ -44551,7 +46825,9 @@ 2684194144,2684194151,US 2684194152,2684194167,NL 2684194168,2684194171,US -2684194172,2684194351,NL +2684194172,2684194319,NL +2684194320,2684194327,SA +2684194328,2684194351,NL 2684194352,2684194359,US 2684194360,2684194487,NL 2684194488,2684194495,GB @@ -44595,7 +46871,9 @@ 2684196940,2684196943,US 2684196944,2684196959,NL 2684196960,2684196963,US -2684196964,2684197099,NL +2684196964,2684197031,NL +2684197032,2684197039,IT +2684197040,2684197099,NL 2684197100,2684197103,US 2684197104,2684197115,NL 2684197116,2684197119,US @@ -44660,9 +46938,8 @@ 2687041536,2687238143,US 2687238144,2687297231,DE 2687297232,2687297239,GB -2687297240,2687301375,DE -2687301376,2687301631,NL -2687301632,2687560191,DE +2687297240,2687297247,SE +2687297248,2687560191,DE 2687560192,2687560447,ZA 2687560448,2687762431,DE 2687762432,2687827967,AT @@ -44735,6 +47012,7 @@ 2692284416,2692546559,ZA 2692546560,2694316031,US 2694381568,2694447103,US +2694840320,2696151039,MA 2696151040,2696216575,IT 2696216576,2696282111,ZA 2696413184,2696478719,ZA @@ -44744,8 +47022,8 @@ 2697854976,2697889791,AU 2697889792,2697891839,US 2697891840,2697892863,AU -2697892864,2697894143,US -2697894144,2697920511,AU +2697892864,2697894399,US +2697894400,2697920511,AU 2697920512,2698117119,US 2698117120,2698182655,IS 2698182656,2698248191,DE @@ -44759,6 +47037,7 @@ 2698838016,2698903551,BE 2698903552,2698969087,AU 2698969088,2699034623,CA +2699034624,2699165695,AO 2699231232,2699296767,US 2699296768,2699362303,FR 2699362304,2699624447,US @@ -44778,7 +47057,8 @@ 2701156352,2701160447,CW 2701160448,2701162495,TT 2701162496,2701164543,UY -2701164544,2701172735,HT +2701164544,2701170687,HT +2701170688,2701172735,TT 2701172736,2701176831,CL 2701176832,2701178879,AR 2701178880,2701180927,CL @@ -44813,7 +47093,7 @@ 2702835712,2702901247,US 2702901248,2702966783,IT 2702966784,2703032319,US -2703032320,2703097855,NZ +2703032320,2703097855,AU 2703097856,2703163391,GB 2703163392,2703556607,US 2703556608,2703622143,ES @@ -44826,9 +47106,7 @@ 2704343040,2704408575,US 2704408576,2704474111,AU 2704474112,2704476927,US -2704476928,2704476929,GB -2704476930,2704476930,US -2704476931,2704477183,GB +2704476928,2704477183,GB 2704477184,2704485119,US 2704485120,2704485375,AU 2704485376,2704539647,US @@ -44843,13 +47121,16 @@ 2705195008,2705260543,CH 2705260544,2705326079,US 2705326080,2705391615,MO -2705391616,2705522687,NZ +2705391616,2705399807,AU +2705399808,2705407999,NZ +2705408000,2705432575,AU +2705432576,2705440767,NZ +2705440768,2705456895,AU +2705456896,2705522687,NZ 2705522688,2705588223,ES 2705588224,2705596159,US 2705596160,2705596415,CA -2705596416,2705621247,US -2705621248,2705621503,CH -2705621504,2705691647,US +2705596416,2705691647,US 2705691648,2705692671,GB 2705692672,2705710079,US 2705710080,2705711103,IN @@ -44911,12 +47192,38 @@ 2713583616,2713649151,AR 2713649152,2713946367,US 2713946368,2713946623,CA -2713946624,2713976831,US +2713946624,2713946879,GB +2713946880,2713976831,US 2713976832,2714042367,VE 2714042368,2714238975,US 2714238976,2714304511,TH 2714304512,2714370047,US -2714370048,2714435583,NL +2714370048,2714386511,NL +2714386512,2714386527,US +2714386528,2714386943,NL +2714386944,2714387199,JP +2714387200,2714387455,US +2714387456,2714387471,JP +2714387472,2714387519,US +2714387520,2714387583,NL +2714387584,2714387615,US +2714387616,2714387647,NL +2714387648,2714387711,US +2714387712,2714387743,NL +2714387744,2714387775,US +2714387776,2714388607,NL +2714388608,2714388671,US +2714388672,2714401791,NL +2714401792,2714401823,US +2714401824,2714401999,NL +2714402000,2714402015,US +2714402016,2714402017,NL +2714402018,2714402019,US +2714402020,2714402047,NL +2714402048,2714402175,US +2714402176,2714402303,NL +2714402304,2714402559,JP +2714402560,2714435583,NL 2714435584,2714697727,US 2714697728,2714763263,CN 2714763264,2715025407,US @@ -45003,7 +47310,9 @@ 2731674624,2731679743,US 2731679744,2731680767,CA 2731680768,2731681791,US -2731681792,2731682815,PR +2731681792,2731682047,PR +2731682048,2731682303,VI +2731682304,2731682815,PR 2731682816,2731685887,US 2731685888,2731686911,CA 2731686912,2731688959,US @@ -45074,7 +47383,9 @@ 2732111872,2732113919,CA 2732113920,2732136447,US 2732136448,2732138495,CA -2732138496,2732189695,US +2732138496,2732159999,US +2732161024,2732170239,US +2732171264,2732189695,US 2732189696,2732192767,CA 2732192768,2732201983,US 2732201984,2732203007,VG @@ -45087,9 +47398,7 @@ 2732220416,2732227583,US 2732227584,2732228607,CA 2732228608,2732261375,US -2732261376,2732262399,CA -2732262400,2732263423,US -2732263424,2732265471,CA +2732261376,2732265471,CA 2732265472,2732273663,US 2732273664,2732275711,CA 2732275712,2732278783,US @@ -45112,7 +47421,8 @@ 2732351488,2732353535,PR 2732353536,2732361727,US 2732361728,2732363775,BB -2732363776,2732375039,US +2732363776,2732371967,US +2732372992,2732375039,US 2732375040,2732376063,CA 2732376064,2732379135,US 2732379136,2732380159,CA @@ -45231,7 +47541,9 @@ 2734200832,2734205951,CA 2734205952,2734206975,US 2734206976,2734209023,CA -2734209024,2734229503,US +2734209024,2734218239,US +2734218240,2734218751,CA +2734218752,2734229503,US 2734229504,2734230527,CA 2734230528,2734237695,US 2734237696,2734238719,CA @@ -45352,12 +47664,15 @@ 2737769472,2737770495,IN 2737770496,2737771263,AU 2737771264,2737771519,JP -2737771520,2737772031,AU -2737772544,2737774591,JP +2737771520,2737771775,AU +2737771776,2737772031,NZ +2737772288,2737774591,JP 2737774592,2737776639,BD 2737776640,2737777663,AU 2737777664,2737778175,HK -2737778432,2737785855,AU +2737778432,2737781759,AU +2737781760,2737782783,US +2737782784,2737785855,AU 2737785856,2737788927,BD 2737788928,2737789951,MY 2737789952,2737793023,AU @@ -45402,7 +47717,6 @@ 2738167808,2738168831,AU 2738168832,2738177023,CN 2738177024,2738178047,AU -2738178048,2738179071,HK 2738179072,2738182143,IN 2738182144,2738195455,CN 2738195456,2738196479,BD @@ -45449,7 +47763,7 @@ 2744844288,2744909823,CA 2744909824,2744975359,GB 2744975360,2745040895,SE -2745040896,2745106431,DE +2745040896,2745106431,NL 2745106432,2745171967,SI 2745171968,2745237503,GB 2745237504,2745303039,CH @@ -45471,7 +47785,9 @@ 2746482688,2746548223,KR 2746548224,2746824703,US 2746824704,2746824959,CA -2746824960,2747072511,US +2746824960,2746839295,US +2746839296,2746839551,CA +2746839552,2747072511,US 2747072512,2747138047,AU 2747138048,2747465727,US 2747465728,2748055551,ZA @@ -45495,7 +47811,9 @@ 2750873600,2750939135,CL 2750939136,2751070207,US 2751070208,2751135743,CL -2751135744,2751397887,US +2751135744,2751176703,US +2751176704,2751176959,GU +2751176960,2751397887,US 2751397888,2751463423,KR 2751463424,2751528959,KZ 2751528960,2751660031,FR @@ -45597,7 +47915,7 @@ 2760529920,2760531967,RU 2760534016,2760536063,BE 2760536064,2760540159,IL -2760540160,2760556543,RO +2760540160,2760556543,IR 2760556544,2760558591,DE 2760558592,2760562687,ES 2760562688,2760564735,BG @@ -45637,9 +47955,7 @@ 2765568000,2765570047,IR 2765570048,2765578239,RU 2765578240,2765580287,AZ -2765580288,2765581567,GB -2765581568,2765581823,ZA -2765581824,2765582335,GB +2765580288,2765582335,GB 2765582336,2765586431,CZ 2765586432,2765619199,IR 2765619200,2768240639,US @@ -45661,7 +47977,9 @@ 2770337792,2770993151,US 2770993152,2771124223,IN 2771124224,2771451903,US +2771517440,2771648511,TN 2771648512,2771910655,ZA +2771910656,2772434943,ZM 2772434944,2772631551,US 2772697088,2772762623,US 2772762624,2772828159,AU @@ -45717,8 +48035,8 @@ 2780561408,2780758015,US 2780758016,2780823551,AU 2780823552,2780925951,US -2780925952,2780926207,GB -2780926208,2780926975,US +2780925952,2780926463,GB +2780926464,2780926975,US 2780926976,2780927487,GB 2780927488,2780927743,US 2780927744,2780927999,GB @@ -45768,11 +48086,12 @@ 2784165888,2784296959,KR 2784296960,2784362495,US 2784362496,2784428031,KR -2784428032,2784952319,US -2785017856,2785300735,US -2785300736,2785300991,PR -2785300992,2785542143,US -2785542144,2786066431,CH +2784428032,2784952063,US +2784952064,2784952319,NL +2785017856,2785542143,US +2785542144,2785673215,CH +2785673216,2785738751,NL +2785738752,2786066431,CH 2786066432,2788163583,US 2788163584,2788229119,CA 2788229120,2788261887,US @@ -45796,6 +48115,7 @@ 2790653952,2790719487,US 2790719488,2790785023,SA 2790785024,2791112703,US +2791135872,2791135872,US 2791170304,2791170559,US 2791178240,2791571455,US 2791571456,2791636991,JP @@ -45832,13 +48152,13 @@ 2803826688,2803892223,US 2803892224,2805465087,CA 2805465088,2805989375,UY -2805989376,2806012927,US -2806012928,2806013183,HK -2806013184,2806644735,US +2805989376,2806644735,US 2806644736,2806710271,CA 2806710272,2807103487,US 2807103488,2807169023,NL -2807169024,2807566335,US +2807169024,2807271679,US +2807271680,2807271935,AU +2807271936,2807566335,US 2807566336,2807574527,CA 2807574528,2807587071,US 2807587072,2807587327,IT @@ -45867,7 +48187,11 @@ 2808872960,2808938495,UY 2808938496,2809069567,US 2809069568,2809135103,SA -2809135104,2809397247,US +2809135104,2809266175,US +2809266176,2809286975,CA +2809286976,2809286991,US +2809286992,2809331711,CA +2809331712,2809397247,US 2809397248,2809462783,UY 2809462784,2809855999,US 2809856000,2809921535,AU @@ -45943,9 +48267,11 @@ 2816264704,2816270335,US 2816270336,2816271615,SG 2816271616,2816271871,JP -2816271872,2816272383,IN +2816271872,2816272127,IN +2816272128,2816272383,AU 2816272384,2816273407,JP -2816273408,2816275455,IN +2816273408,2816274431,IN +2816274432,2816275455,AU 2816275456,2816278527,SG 2816278528,2816671743,US 2816671744,2816737279,CA @@ -45955,8 +48281,7 @@ 2817277952,2817294335,NL 2817294336,2817933055,US 2817933056,2817933311,CA -2817933312,2817933567,PR -2817933568,2818002943,US +2817933312,2818002943,US 2818002944,2818003722,GB 2818003723,2818003723,US 2818003724,2818004991,GB @@ -45964,7 +48289,9 @@ 2818244608,2818310143,US 2818310144,2818375679,AR 2818375680,2818572287,US -2818637824,2818703359,NL +2818637824,2818654207,NL +2818654208,2818670591,AU +2818670592,2818703359,NL 2818703360,2822731894,US 2822731895,2822731895,GB 2822731896,2823159807,US @@ -46050,7 +48377,9 @@ 2829844480,2829910015,ZA 2829910016,2830066431,US 2830066432,2830066687,HK -2830066688,2830106623,US +2830066688,2830085887,US +2830085888,2830086143,GB +2830086144,2830106623,US 2830106624,2830172159,CO 2830172160,2830434303,US 2830499840,2830761983,US @@ -46079,7 +48408,7 @@ 2833907712,2833973247,GT 2833973248,2834010111,US 2834010112,2834014207,CA -2834018304,2834030591,US +2834014208,2834030591,US 2834030592,2834034687,CA 2834034688,2834497535,US 2834497536,2834563071,SV @@ -46090,11 +48419,83 @@ 2835218432,2835283967,US 2835283968,2835349503,MX 2835480576,2837446655,US -2837446656,2838822911,CH -2838822912,2839019519,NL +2837446656,2837839871,CH +2837839872,2837905407,NL +2837905408,2838298623,CH +2838298624,2838495231,NL +2838495232,2838691839,CH +2838691840,2838757375,NL +2838757376,2838822911,CH +2838822912,2838823679,US +2838823680,2838823743,NL +2838823744,2838823935,US +2838823936,2838823999,NL +2838824000,2838824031,US +2838824032,2838824063,NL +2838824064,2838824095,US +2838824096,2838824127,NL +2838824128,2838824191,US +2838824192,2838824223,NL +2838824224,2838824479,US +2838824480,2838824607,NL +2838824608,2838824639,US +2838824640,2838824799,NL +2838824800,2838824815,US +2838824816,2838824879,NL +2838824880,2838824895,US +2838824896,2838824911,NL +2838824912,2838824959,US +2838824960,2838824991,NL +2838824992,2838825023,US +2838825024,2838825055,NL +2838825056,2838825087,US +2838825088,2838825119,NL +2838825120,2838825151,US +2838825152,2838825183,NL +2838825184,2838825215,US +2838825216,2838825247,NL +2838825248,2838825343,US +2838825344,2838825375,NL +2838825376,2838825471,US +2838825472,2838825599,NL +2838825600,2838825727,US +2838825728,2838826783,NL +2838826784,2838826815,US +2838826816,2838829343,NL +2838829344,2838829375,US +2838829376,2838831199,NL +2838831200,2838831231,US +2838831232,2838832159,NL +2838832160,2838832175,KR +2838832176,2838832319,NL +2838832320,2838832351,US +2838832352,2838832383,KR +2838832384,2838832735,US +2838832736,2838832767,NL +2838832768,2838833407,US +2838833408,2838856671,NL +2838856672,2838856703,US +2838856704,2838857567,NL +2838857568,2838857599,US +2838857600,2838857855,NL +2838857856,2838857887,US +2838857888,2838857919,NL +2838857920,2838857951,US +2838857952,2838857983,NL +2838857984,2838858399,US +2838858400,2838858463,NL +2838858464,2838858527,US +2838858528,2838858559,NL +2838858560,2838858623,US +2838858624,2838858687,NL +2838858688,2838858719,US +2838858720,2839019519,NL 2839019520,2839085055,CH -2839085056,2839150591,NL -2839150592,2839543807,CH +2839085056,2839117823,MX +2839117824,2839150591,NL +2839150592,2839281663,CH +2839281664,2839412735,NL +2839412736,2839543807,CH 2839543808,2843803647,US 2843803648,2843869183,ZA 2843869184,2844524543,US @@ -46112,6 +48513,7 @@ 2844912640,2844912895,JP 2844912896,2845704191,US 2845704192,2845769727,CU +2845769728,2845786111,GA 2845835264,2848212991,US 2848212992,2848215039,GB 2848215040,2848244735,US @@ -46124,6 +48526,22 @@ 2849964032,2850029567,HK 2850029568,2851012607,US 2851078144,2851995647,US +2852061184,2852062207,ZA +2852062208,2852063231,CM +2852063232,2852064255,KE +2852064256,2852065279,ZA +2852065280,2852066303,GH +2852066304,2852067327,ZA +2852067328,2852068351,SD +2852068352,2852070399,ZA +2852071424,2852072447,NG +2852072448,2852073471,ZA +2852073472,2852074495,TZ +2852074496,2852075519,MW +2852075520,2852077567,ZA +2852077568,2852078591,CD +2852078592,2852079615,TN +2852079616,2852080639,CG 2852192256,2852716653,US 2852716654,2852716654,AU 2852716655,2853306367,US @@ -46139,11 +48557,7 @@ 2855484672,2855485439,AR 2855485440,2855501823,UY 2855501824,2855534591,AR -2855534592,2855811583,US -2855811584,2855811730,DE -2855811731,2855811731,US -2855811732,2855811839,DE -2855811840,2856058879,US +2855534592,2856058879,US 2856058880,2856124415,CH 2856124416,2856184831,US 2856184832,2856185855,GB @@ -46157,9 +48571,7 @@ 2857697280,2858352639,US 2858418176,2859007999,US 2859008000,2859073535,JP -2859073536,2861069055,US -2861069056,2861069311,GB -2861069312,2861850879,US +2859073536,2861850879,US 2861850880,2861851391,HK 2861851392,2861851647,US 2861851648,2861861375,HK @@ -46185,26 +48597,32 @@ 2864844800,2864845055,NL 2864845056,2864848895,US 2864848896,2864849151,GB -2864849152,2865417215,US -2865417216,2865417471,GB -2865417472,2865577983,US +2864849152,2865417457,US +2865417458,2865417458,GB +2865417459,2865577983,US 2865577984,2865610751,BE 2865610752,2865889279,US 2865889280,2865954815,AR -2865954816,2867265535,US +2865954816,2866953215,US +2866953216,2866953471,AU +2866953472,2867265535,US 2867331072,2867396607,US 2867462144,2867593215,US 2867593216,2867724287,CH 2867855360,2868117503,US -2868379648,2868605183,US -2868605184,2868605439,NO -2868605440,2868658175,US +2868379648,2868420607,US +2868420608,2868423679,IN +2868423680,2868586495,US +2868586496,2868588543,IN +2868588544,2868605376,US +2868605377,2868605377,NO +2868605378,2868658175,US 2868658176,2868658431,GB -2868658432,2868676607,US +2868658432,2868673023,US +2868673024,2868673279,FR +2868673280,2868676607,US 2868676608,2868676863,AU -2868676864,2868689407,US -2868689408,2868689663,AU -2868689664,2868772863,US +2868676864,2868772863,US 2868838400,2868903935,BE 2868903936,2869035007,SG 2869035008,2869166079,JP @@ -46213,7 +48631,9 @@ 2869952512,2870018047,FR 2870018048,2870083583,DE 2870083584,2870089727,FR -2870089728,2870091775,DE +2870089728,2870090495,DE +2870090496,2870090751,BE +2870090752,2870091775,DE 2870091776,2870149119,FR 2870149120,2870214655,HU 2870214656,2870280191,DK @@ -46307,15 +48727,17 @@ 2895708160,2896035839,US 2896035840,2896101375,DE 2896101376,2896166911,GB -2896166912,2897018879,US +2896166912,2896429280,US +2896429281,2896429281,CA +2896429282,2897018879,US 2897018880,2897149951,DE 2897149952,2897215487,US 2897215488,2897739775,DE 2897739776,2898001919,FR 2898001920,2898132991,GB 2898132992,2898264063,US -2898264064,2898264064,AU -2898264065,2898788351,US +2898264064,2898526207,AU +2898526208,2898788351,US 2898788352,2899050495,GB 2899050496,2899116031,FR 2899116032,2899148799,VN @@ -46363,19 +48785,15 @@ 2905446656,2905446911,DE 2905446912,2905473023,US 2905473024,2905481215,CA -2905481216,2913086719,US -2913086720,2913086812,CA -2913086813,2913086813,US -2913086814,2913086816,CA -2913086817,2913086817,US -2913086818,2913086819,CA -2913086820,2913086820,US -2913086821,2913086975,CA -2913086976,2913992703,US +2905481216,2913992703,US 2913992704,2914516991,CA -2914516992,2915092135,US -2915092136,2915092143,SA -2915092144,2915250175,US +2914516992,2915195647,US +2915195648,2915195903,CL +2915195904,2915196927,US +2915196928,2915197183,IE +2915197184,2915197439,US +2915197440,2915197695,FI +2915197696,2915250175,US 2915250176,2915254271,CA 2915254272,2915516415,US 2915516416,2915516671,NL @@ -46409,7 +48827,9 @@ 2916319232,2916335615,PR 2916335616,2916368383,US 2916368384,2916401151,CA -2916401152,2916515839,US +2916401152,2916410879,US +2916410880,2916411135,GB +2916411136,2916515839,US 2916515840,2916519935,CA 2916519936,2916581375,US 2916581376,2916614143,PR @@ -46432,7 +48852,10 @@ 2917267712,2917267967,AG 2917267968,2917268223,JM 2917268224,2917268479,BB -2917268480,2917269503,JM +2917268480,2917268735,TC +2917268736,2917269113,JM +2917269114,2917269114,TC +2917269115,2917269503,JM 2917269504,2917449727,US 2917449728,2917466111,PR 2917466112,2917572607,US @@ -46488,11 +48911,7 @@ 2918023168,2918043647,US 2918043648,2918047743,CA 2918047744,2918051839,US -2918051840,2918111999,CA -2918112000,2918112127,US -2918112128,2918112895,CA -2918112896,2918113023,US -2918113024,2918121471,CA +2918051840,2918121471,CA 2918121472,2918154239,US 2918154240,2918170623,CA 2918170624,2918187775,US @@ -46517,9 +48936,7 @@ 2918395904,2918404095,US 2918404096,2918406911,PR 2918406912,2918407167,US -2918407168,2918407295,PR -2918407296,2918407423,US -2918407424,2918408191,PR +2918407168,2918408191,PR 2918408192,2918432767,US 2918432768,2918436863,CA 2918436864,2918469631,US @@ -46530,17 +48947,13 @@ 2918473216,2918473727,CA 2918473728,2918477823,US 2918477824,2918481919,CA -2918481920,2918528255,US -2918528256,2918528511,NO -2918528512,2918528767,US -2918528768,2918528863,CA -2918528864,2918528883,US -2918528884,2918528885,CA -2918528886,2918530559,US -2918530560,2918530815,PH -2918530816,2918536719,US +2918481920,2918527743,US +2918527744,2918527999,NO +2918528000,2918536719,US 2918536720,2918536727,CA -2918536728,2918570239,US +2918536728,2918568191,US +2918568192,2918568319,AU +2918568320,2918570239,US 2918570240,2918570495,JP 2918570496,2918580223,US 2918580224,2918588415,CA @@ -46607,42 +49020,49 @@ 2919759872,2921512703,US 2921512704,2921512959,CA 2921512960,2921530367,US -2921530368,2921531391,DE -2921531392,2921541119,US +2921530368,2921530879,DE +2921530880,2921541119,US 2921541120,2921541375,DE 2921541376,2921542143,US 2921542144,2921542399,CA -2921542400,2921545727,US +2921542400,2921545215,US +2921545216,2921545727,DE 2921545728,2921545983,NL -2921545984,2921546495,US +2921545984,2921546239,US +2921546240,2921546495,FR 2921546496,2921546751,NL -2921546752,2921547519,US +2921546752,2921547007,US +2921547008,2921547263,FR +2921547264,2921547519,US 2921547520,2921547775,DE 2921547776,2921548031,GB -2921548032,2921548799,US -2921548800,2921549055,FR +2921548032,2921548831,US +2921548832,2921549055,FR 2921549056,2921550335,US 2921550336,2921550591,IT -2921550592,2921552895,US +2921550592,2921551615,US +2921551616,2921551871,BR +2921551872,2921552127,AR +2921552128,2921552383,US +2921552384,2921552639,MX +2921552640,2921552895,US 2921552896,2921553151,CL 2921553152,2921553407,BR 2921553408,2921553663,CO 2921553664,2921562111,US 2921562112,2921594879,CA -2921594880,2925002751,US +2921594880,2921681631,US +2921681632,2921681639,JP +2921681640,2925002751,US 2925002752,2925527039,CA 2925527040,2926575615,US -2926575616,2926777343,CA -2926777344,2926777855,US -2926777856,2926778111,CA -2926778112,2926778239,US -2926778240,2926779391,CA -2926779392,2926779519,US -2926779520,2927084799,CA -2927084800,2927085055,US -2927085056,2927085567,CA -2927085568,2927085823,US -2927085824,2927099903,CA +2926575616,2926777727,CA +2926777728,2926777983,US +2926777984,2927084543,CA +2927084544,2927085055,US +2927085056,2927085311,CA +2927085312,2927085567,US +2927085568,2927099903,CA 2927099904,2927242751,US 2927242752,2927243263,AE 2927243264,2927254783,US @@ -46687,16 +49107,15 @@ 2938634240,2938699775,IN 2938699776,2938700031,PH 2938700032,2938700287,ID -2938700288,2938700543,KR +2938700288,2938700543,AE 2938700544,2938701055,SG 2938701056,2938701311,IQ 2938701312,2938701567,AU -2938701568,2938701823,KR -2938701824,2938702079,IN +2938701568,2938702079,IN 2938702080,2938703103,HK 2938703104,2938703359,IL 2938703360,2938703615,ZA -2938703616,2938703871,KR +2938703616,2938703871,IN 2938703872,2938707967,HK 2938707968,2938710015,JP 2938710016,2938712063,AU @@ -46786,9 +49205,9 @@ 2947598336,2947602431,AU 2947602432,2947603455,NZ 2947603456,2947604479,TH -2947604480,2947609599,HK -2947609600,2947609855,GB -2947609856,2947612671,HK +2947604480,2947611135,HK +2947611136,2947611391,AU +2947611392,2947612671,HK 2947612672,2947678207,JP 2947678208,2947743743,CN 2947743744,2947809279,JP @@ -46815,9 +49234,7 @@ 2953466368,2953466879,GB 2953467392,2953467647,GB 2953467904,2953469951,BE -2953469952,2953474815,CH -2953474816,2953475071,DE -2953475072,2953478143,CH +2953469952,2953478143,CH 2953478144,2953503551,SE 2953503552,2953503559,NO 2953503560,2953510911,SE @@ -46827,9 +49244,7 @@ 2953596928,2953598975,ES 2953598976,2953601023,IT 2953601024,2953603071,RU -2953603072,2953603977,GB -2953603978,2953603979,IE -2953603980,2953605119,GB +2953603072,2953605119,GB 2953605120,2953609215,CZ 2953609216,2953707519,IL 2953707520,2953838591,RU @@ -46843,15 +49258,21 @@ 2954647552,2954657791,ES 2954657792,2954756095,JO 2954756096,2954821631,TR -2954821632,2954822927,FR +2954821632,2954822079,FR +2954822080,2954822143,ES +2954822144,2954822927,FR 2954822928,2954822931,DE 2954822932,2954823395,FR 2954823396,2954823399,GB -2954823400,2954824255,FR +2954823400,2954823999,FR +2954824000,2954824015,ES +2954824016,2954824255,FR 2954824256,2954824259,ES 2954824260,2954825063,FR 2954825064,2954825067,ES -2954825068,2954825315,FR +2954825068,2954825151,FR +2954825152,2954825159,NL +2954825160,2954825315,FR 2954825316,2954825319,ES 2954825320,2954825403,FR 2954825404,2954825407,ES @@ -46868,19 +49289,35 @@ 2954826776,2954826779,ES 2954826780,2954827799,FR 2954827800,2954827807,DE -2954827808,2954829395,FR +2954827808,2954828159,FR +2954828160,2954828191,IT +2954828192,2954829135,FR +2954829136,2954829139,DE +2954829140,2954829395,FR 2954829396,2954829399,IT -2954829400,2954829751,FR +2954829400,2954829427,FR +2954829428,2954829431,NL +2954829432,2954829751,FR 2954829752,2954829752,ES 2954829753,2954829759,FR 2954829760,2954829823,ES 2954829824,2954829843,FR 2954829844,2954829847,DE -2954829848,2954830395,FR +2954829848,2954829875,FR +2954829876,2954829879,DE +2954829880,2954830183,FR +2954830184,2954830191,IT +2954830192,2954830395,FR 2954830396,2954830399,ES -2954830400,2954831247,FR +2954830400,2954830735,FR +2954830736,2954830751,NL +2954830752,2954831247,FR 2954831248,2954831251,ES -2954831252,2954832343,FR +2954831252,2954831807,FR +2954831808,2954831823,ES +2954831824,2954832159,FR +2954832160,2954832167,PT +2954832168,2954832343,FR 2954832344,2954832347,CH 2954832348,2954832891,FR 2954832892,2954832895,ES @@ -46896,7 +49333,11 @@ 2954834520,2954834523,ES 2954834524,2954834671,FR 2954834672,2954834675,ES -2954834676,2954835295,FR +2954834676,2954834983,FR +2954834984,2954834991,IT +2954834992,2954835039,FR +2954835040,2954835043,DE +2954835044,2954835295,FR 2954835296,2954835299,ES 2954835300,2954835443,FR 2954835444,2954835447,ES @@ -46912,10 +49353,16 @@ 2954837828,2954837831,DE 2954837832,2954837867,FR 2954837868,2954837871,ES -2954837872,2954838599,FR +2954837872,2954838103,FR +2954838104,2954838107,DE +2954838108,2954838599,FR 2954838600,2954838607,GB 2954838608,2954838615,NL -2954838616,2954839239,FR +2954838616,2954838911,FR +2954838912,2954838915,DE +2954838916,2954839063,FR +2954839064,2954839067,IT +2954839068,2954839239,FR 2954839240,2954839243,IT 2954839244,2954839267,FR 2954839268,2954839271,ES @@ -46925,7 +49372,9 @@ 2954840256,2954840447,GB 2954840448,2954840515,FR 2954840516,2954840519,NL -2954840520,2954840927,FR +2954840520,2954840731,FR +2954840732,2954840735,IT +2954840736,2954840927,FR 2954840928,2954840931,DE 2954840932,2954841567,FR 2954841568,2954841583,ES @@ -46935,8 +49384,8 @@ 2954841808,2954841815,NL 2954841816,2954843503,FR 2954843504,2954843507,ES -2954843508,2954843767,FR -2954843768,2954843771,ES +2954843508,2954843759,FR +2954843760,2954843771,ES 2954843772,2954844147,FR 2954844148,2954844151,DE 2954844152,2954844999,FR @@ -46947,7 +49396,9 @@ 2954846108,2954846111,ES 2954846112,2954846139,FR 2954846140,2954846143,ES -2954846144,2954855075,FR +2954846144,2954854871,FR +2954854872,2954854875,IT +2954854876,2954855075,FR 2954855076,2954855079,ES 2954855080,2954855507,FR 2954855508,2954855511,DE @@ -46957,9 +49408,21 @@ 2954855528,2954855531,ES 2954855532,2954856179,FR 2954856180,2954856183,ES -2954856184,2954859323,FR +2954856184,2954857115,FR +2954857116,2954857119,NL +2954857120,2954858819,FR +2954858820,2954858823,IT +2954858824,2954858911,FR +2954858912,2954858943,ES +2954858944,2954859043,FR +2954859044,2954859047,ES +2954859048,2954859323,FR 2954859324,2954859327,ES -2954859328,2954861875,FR +2954859328,2954859871,FR +2954859872,2954859903,ES +2954859904,2954861623,FR +2954861624,2954861631,IT +2954861632,2954861875,FR 2954861876,2954861879,CH 2954861880,2954862415,FR 2954862416,2954862419,ES @@ -46967,9 +49430,12 @@ 2954863616,2954864639,DE 2954864640,2954865663,IT 2954865664,2954866687,ES -2954866688,2954870799,FR +2954866688,2954867041,FR +2954867042,2954867043,PT +2954867044,2954870799,FR 2954870800,2954870803,ES -2954870804,2954870843,FR +2954870804,2954870839,FR +2954870840,2954870843,IT 2954870844,2954870847,ES 2954870848,2954870903,FR 2954870904,2954870907,ES @@ -47022,11 +49488,11 @@ 2955837440,2955845631,IR 2955845632,2955853823,GB 2955853824,2955870207,CH -2955870208,2955935743,UA +2955870208,2955935743,SA 2955935744,2956230655,RU 2956230656,2956238847,SI 2956238848,2956242943,ES -2956242944,2956244991,SE +2956242944,2956244991,JO 2956244992,2956245247,FR 2956245248,2956245503,RO 2956245504,2956245759,GB @@ -47163,9 +49629,7 @@ 2957240320,2957242367,BG 2957242368,2957244415,RU 2957244416,2957246463,HU -2957246464,2957311999,SE -2957312000,2957377535,RU -2957377536,2957508607,SE +2957246464,2957508607,SE 2957508608,2957574143,FI 2957574144,2957639679,GE 2957639680,2957641727,GB @@ -47319,7 +49783,7 @@ 2959753216,2959761407,RU 2959761408,2959763455,LV 2959763456,2959765503,PL -2959765504,2959767551,RU +2959765504,2959767551,GB 2959767552,2959769599,RS 2959769600,2959777791,RU 2959777792,2959783935,LV @@ -47348,9 +49812,7 @@ 2959884288,2959892479,KZ 2959892480,2959900671,UA 2959900672,2959902719,PL -2959902720,2959915007,RU -2959915008,2959917055,UA -2959917056,2959925247,RU +2959902720,2959925247,RU 2959925248,2959927295,RO 2959927296,2959929343,UA 2959929344,2959935487,RU @@ -47406,8 +49868,7 @@ 2960152576,2960158719,RU 2960158720,2960160767,PL 2960160768,2960162815,UA -2960162816,2960171007,CZ -2960171008,2960175103,RU +2960162816,2960175103,RU 2960175104,2960179199,SK 2960179200,2960205823,RU 2960207872,2960211967,RU @@ -47593,10 +50054,17 @@ 2961088512,2961088767,SE 2961088768,2961089535,UA 2961089536,2961090559,KG -2961090560,2961108991,RO +2961090560,2961102847,RO +2961102848,2961103871,DE +2961103872,2961104895,RO +2961104896,2961106943,GB +2961106944,2961108991,RO 2961108992,2961111039,GB -2961111040,2961113087,RO -2961113088,2961178623,CH +2961111040,2961112063,PL +2961112064,2961113087,RO +2961113088,2961166079,CH +2961166080,2961166335,DE +2961166336,2961178623,CH 2961178624,2965372927,FR 2965372928,2965766143,RU 2965766144,2965897215,DE @@ -47605,12 +50073,14 @@ 2966159360,2966290431,AE 2966290432,2966421503,IT 2966421504,2966945791,RU -2966945792,2967273471,TR +2966945792,2967268351,TR +2967268352,2967269375,IN +2967269376,2967273471,TR 2967273472,2967277567,RU 2967277568,2967281663,IR 2967281664,2967283711,PT 2967283712,2967285759,DE -2967285760,2967287807,UA +2967285760,2967287807,IT 2967287808,2967289855,GB 2967289856,2967291903,IR 2967291904,2967293951,RS @@ -47738,11 +50208,7 @@ 2987552768,2987556863,GB 2987556864,2987560959,NL 2987560960,2987565055,DE -2987565056,2987566591,AT -2987566592,2987566847,HU -2987566848,2987568383,AT -2987568384,2987568639,HU -2987568640,2987569151,AT +2987565056,2987569151,AT 2987569152,2987573247,FR 2987573248,2987577343,TR 2987577344,2987585535,RU @@ -47762,8 +50228,7 @@ 2987642880,2987651071,DE 2987651072,2987655167,RU 2987655168,2987659263,DE -2987659264,2987661311,SI -2987661312,2987663359,GB +2987659264,2987661311,BA 2987663360,2987665407,IT 2987665408,2987667455,RU 2987667456,2987669503,FR @@ -47817,7 +50282,9 @@ 2987771904,2987773951,IT 2987773952,2987775999,FR 2987776000,2987778047,NL -2987778048,2987780095,CH +2987778048,2987779071,CH +2987779072,2987779583,LI +2987779584,2987780095,CH 2987780096,2987782143,GB 2987782144,2987784191,EE 2987784192,2987786239,DK @@ -47896,11 +50363,15 @@ 2988444209,2988444209,FI 2988444210,2988444671,FR 2988444672,2988444679,ES -2988444680,2988449207,FR +2988444680,2988448799,FR +2988448800,2988448815,ES +2988448816,2988449207,FR 2988449208,2988449215,ES 2988449216,2988451839,FR 2988451840,2988453887,BE -2988453888,2988457983,GB +2988453888,2988454399,GB +2988454400,2988454655,FR +2988454656,2988457983,GB 2988457984,2988458319,FR 2988458320,2988458327,NL 2988458328,2988459119,FR @@ -47922,12 +50393,16 @@ 2988461704,2988461707,NL 2988461708,2988462603,FR 2988462604,2988462607,ES -2988462608,2988463915,FR +2988462608,2988462747,FR +2988462748,2988462751,ES +2988462752,2988463915,FR 2988463916,2988463919,ES 2988463920,2988463999,FR 2988464000,2988464007,IE 2988464008,2988464015,LT -2988464016,2988464611,FR +2988464016,2988464359,FR +2988464360,2988464360,NL +2988464361,2988464611,FR 2988464612,2988464615,IT 2988464616,2988464623,FR 2988464624,2988464627,ES @@ -47943,7 +50418,9 @@ 2988478580,2988478583,DE 2988478584,2988478587,FR 2988478588,2988478591,DE -2988478592,2988479791,FR +2988478592,2988479003,FR +2988479004,2988479007,ES +2988479008,2988479791,FR 2988479792,2988479807,GB 2988479808,2988482111,FR 2988482112,2988482143,DE @@ -47957,15 +50434,23 @@ 2988484832,2988484847,GB 2988484848,2988485683,FR 2988485684,2988485687,PL -2988485688,2988486311,FR +2988485688,2988486075,FR +2988486076,2988486079,DE +2988486080,2988486083,FR +2988486084,2988486087,PT +2988486088,2988486311,FR 2988486312,2988486319,NL 2988486320,2988487071,FR 2988487072,2988487075,ES 2988487076,2988487095,FR 2988487096,2988487099,ES -2988487100,2988489119,FR -2988489120,2988489127,DE -2988489128,2988489479,FR +2988487100,2988487235,FR +2988487236,2988487239,NL +2988487240,2988487303,FR +2988487304,2988487311,NL +2988487312,2988487883,FR +2988487884,2988487887,NL +2988487888,2988489479,FR 2988489480,2988489483,DE 2988489484,2988489675,FR 2988489676,2988489679,ES @@ -47974,7 +50459,8 @@ 2988490184,2988490683,FR 2988490684,2988490686,IT 2988490687,2988490687,BE -2988490688,2988492799,FR +2988490688,2988490719,ES +2988490720,2988492799,FR 2988492800,2988494847,PL 2988494848,2988499663,FR 2988499664,2988499671,NL @@ -47988,7 +50474,9 @@ 2988500856,2988500859,ES 2988500860,2988501127,FR 2988501128,2988501131,IT -2988501132,2988502051,FR +2988501132,2988501415,FR +2988501416,2988501423,IT +2988501424,2988502051,FR 2988502052,2988502055,PL 2988502056,2988502479,FR 2988502480,2988502483,ES @@ -47998,57 +50486,98 @@ 2988502882,2988502882,IT 2988502883,2988504371,FR 2988504372,2988504375,PL -2988504376,2988505391,FR +2988504376,2988505151,FR +2988505152,2988505167,GB +2988505168,2988505391,FR 2988505392,2988505395,ES -2988505396,2988507163,FR +2988505396,2988506235,FR +2988506236,2988506239,NL +2988506240,2988506943,FR +2988506944,2988506975,DE +2988506976,2988507163,FR 2988507164,2988507167,ES -2988507168,2988507975,FR +2988507168,2988507531,FR +2988507532,2988507535,NL +2988507536,2988507807,FR +2988507808,2988507823,NL +2988507824,2988507975,FR 2988507976,2988507979,IT -2988507980,2988509511,FR +2988507980,2988508607,FR +2988508608,2988508639,ES +2988508640,2988509511,FR 2988509512,2988509515,PL 2988509516,2988509747,FR 2988509748,2988509751,LT -2988509752,2988512903,FR +2988509752,2988510175,FR +2988510176,2988510191,DE +2988510192,2988512903,FR 2988512904,2988512907,GB 2988512908,2988513003,FR 2988513004,2988513007,ES 2988513008,2988513747,FR 2988513748,2988513751,IT -2988513752,2988515327,FR +2988513752,2988514207,FR +2988514208,2988514215,PT +2988514216,2988514399,FR +2988514400,2988514431,NL +2988514432,2988515327,FR 2988515328,2988517375,DE 2988517376,2988519423,FR 2988519424,2988521471,PL -2988521472,2988524075,FR +2988521472,2988523743,FR +2988523744,2988523759,DE +2988523760,2988524075,FR 2988524076,2988524079,ES 2988524080,2988524271,FR 2988524272,2988524287,DE -2988524288,2988525887,FR +2988524288,2988525579,FR +2988525580,2988525583,IT +2988525584,2988525887,FR 2988525888,2988525951,GB 2988525952,2988526415,FR 2988526416,2988526423,ES 2988526424,2988527527,FR 2988527528,2988527531,NL -2988527532,2988527831,FR +2988527532,2988527723,FR +2988527724,2988527727,ES +2988527728,2988527831,FR 2988527832,2988527839,ES 2988527840,2988527887,FR 2988527888,2988527891,ES -2988527892,2988529351,FR +2988527892,2988528699,FR +2988528700,2988528703,CZ +2988528704,2988529351,FR 2988529352,2988529359,GB 2988529360,2988529375,FR 2988529376,2988529383,GB 2988529384,2988529387,ES -2988529388,2988535807,FR +2988529388,2988531275,FR +2988531276,2988531279,PT +2988531280,2988535807,FR 2988535808,2988537855,ES 2988537856,2988539971,FR 2988539972,2988539975,ES -2988539976,2988540503,FR +2988539976,2988540199,FR +2988540200,2988540207,BE +2988540208,2988540503,FR 2988540504,2988540507,NL -2988540508,2988544671,FR +2988540508,2988540563,FR +2988540564,2988540567,CZ +2988540568,2988542627,FR +2988542628,2988542631,NL +2988542632,2988544671,FR 2988544672,2988544687,GB -2988544688,2988544691,NL -2988544692,2988546727,FR +2988544688,2988546687,FR +2988546688,2988546691,CH +2988546692,2988546703,FR +2988546704,2988546719,DE +2988546720,2988546727,FR 2988546728,2988546731,ES -2988546732,2988547067,FR +2988546732,2988547019,FR +2988547020,2988547023,NL +2988547024,2988547055,FR +2988547056,2988547059,NL +2988547060,2988547067,FR 2988547068,2988547071,ES 2988547072,2988547095,FR 2988547096,2988547099,ES @@ -48070,34 +50599,52 @@ 2988551444,2988551447,ES 2988551448,2988551535,FR 2988551536,2988551551,DE -2988551552,2988553531,FR +2988551552,2988552883,FR +2988552884,2988552887,IT +2988552888,2988553399,FR +2988553400,2988553407,NL +2988553408,2988553531,FR 2988553532,2988553535,ES 2988553536,2988554035,FR 2988554036,2988554039,ES 2988554040,2988555527,FR 2988555528,2988555531,ES -2988555532,2988556207,FR +2988555532,2988555551,FR +2988555552,2988555559,PT +2988555560,2988556207,FR 2988556208,2988556211,DE 2988556212,2988556359,FR 2988556360,2988556363,ES -2988556364,2988557507,FR +2988556364,2988557103,FR +2988557104,2988557111,PT +2988557112,2988557507,FR 2988557508,2988557511,ES 2988557512,2988557539,FR 2988557540,2988557543,ES 2988557544,2988558203,FR 2988558204,2988558207,DE -2988558208,2988558803,FR +2988558208,2988558623,FR +2988558624,2988558655,NL +2988558656,2988558803,FR 2988558804,2988558807,ES 2988558808,2988558815,NL -2988558816,2988561583,FR +2988558816,2988560639,FR +2988560640,2988560703,ES +2988560704,2988561583,FR 2988561584,2988561591,GB 2988561592,2988561763,FR 2988561764,2988561767,IT 2988561768,2988562847,FR 2988562848,2988562863,GB -2988562864,2988564143,FR +2988562864,2988563559,FR +2988563560,2988563567,NL +2988563568,2988564023,FR +2988564024,2988564027,IE +2988564028,2988564143,FR 2988564144,2988564159,ES -2988564160,2988572671,FR +2988564160,2988564367,FR +2988564368,2988564383,GB +2988564384,2988572671,FR 2988572672,2988703743,RU 2988703744,2988834815,PL 2988834816,2988965887,CH @@ -48114,18 +50661,25 @@ 2989883392,2989948927,UA 2989948928,2990014463,FI 2990014464,2990079999,PL -2990080000,2990096383,GB -2990096384,2990104575,RU -2990104576,2990112767,GB -2990112768,2990145535,RU +2990080000,2990145535,RU 2990145536,2990211071,SI 2990211072,2990276607,GR 2990276608,2990342143,ES 2990342144,2990407679,KW -2990407680,2990421728,US +2990407680,2990407935,US +2990407936,2990408191,GB +2990408192,2990417663,US +2990417664,2990417919,GB +2990417920,2990421728,US 2990421729,2990421729,GB -2990421730,2990440447,US -2990440448,2990473215,NL +2990421730,2990423525,US +2990423526,2990423526,GB +2990423527,2990432440,US +2990432441,2990432441,GB +2990432442,2990440447,US +2990440448,2990472492,GB +2990472493,2990472493,NL +2990472494,2990473215,GB 2990473216,2990475674,DE 2990475675,2990475675,HR 2990475676,2990500113,DE @@ -48143,7 +50697,9 @@ 2991161344,2991177727,FR 2991177728,2991179503,SE 2991179504,2991179507,ES -2991179508,2991194111,SE +2991179508,2991191807,SE +2991191808,2991192063,FI +2991192064,2991194111,SE 2991194112,2991210495,NO 2991210496,2991243263,RU 2991243264,2991259647,UA @@ -48286,7 +50842,10 @@ 2997515684,2997515684,GB 2997515685,2997518335,FR 2997518336,2997520383,DE -2997520384,2997526527,NL +2997520384,2997520895,NL +2997520896,2997521151,MT +2997521152,2997521407,US +2997521408,2997526527,NL 2997526528,2997583871,RU 2997583872,2997616639,SY 2997616640,2997649407,SI @@ -48305,28 +50864,12 @@ 2997878784,2998140927,RU 2998140928,2998403071,PL 2998403072,2998665215,RU -2998665216,2998710451,AT -2998710452,2998710455,DE -2998710456,2998712975,AT -2998712976,2998712979,DE -2998712980,2998720227,AT -2998720228,2998720231,CZ -2998720232,2998820735,AT -2998820736,2998820863,CZ -2998820864,2998834559,AT -2998834560,2998834687,HU -2998834688,2998841343,AT -2998841344,2998841599,DE -2998841600,2998875391,AT -2998875392,2998875519,CZ -2998875520,2998927359,AT -2998927360,2998991615,CH -2998991616,2998991871,DE -2998991872,2999026943,CH -2999026944,2999027071,DE -2999027072,2999380223,CH -2999380224,2999380479,DE -2999380480,2999451647,CH +2998665216,2998679039,AT +2998679040,2998679295,SI +2998679296,2998902527,AT +2998902528,2998902783,SI +2998902784,2998927359,AT +2998927360,2999451647,CH 2999451648,2999713791,DE 2999713792,2999975935,RU 2999975936,2999984127,FR @@ -48365,8 +50908,7 @@ 3000246272,3000248319,RO 3000248320,3000252415,PL 3000252416,3000254463,RO -3000254464,3000256511,UA -3000256512,3000260607,RU +3000254464,3000260607,RU 3000260608,3000262655,RS 3000262656,3000266751,UA 3000266752,3000268799,DE @@ -48490,7 +51032,9 @@ 3000709120,3000713215,AM 3000713216,3000717311,IT 3000717312,3000721407,UA -3000721408,3000733695,PL +3000721408,3000727551,PL +3000727552,3000727807,CZ +3000727808,3000733695,PL 3000733696,3000737791,RU 3000737792,3000741887,UA 3000741888,3000745983,RU @@ -48537,7 +51081,9 @@ 3001901056,3001905151,FR 3001905152,3001909247,GB 3001909248,3001917439,ES -3001917440,3001921535,GB +3001917440,3001919743,GB +3001919744,3001919999,AU +3001920000,3001921535,GB 3001921536,3001929727,RU 3001929728,3001933823,RS 3001933824,3001937919,ES @@ -48622,7 +51168,7 @@ 3002697728,3002699775,DE 3002699776,3002701823,SE 3002701824,3002703871,NL -3002703872,3002705919,DE +3002703872,3002705919,FR 3002705920,3002707967,MK 3002707968,3002710015,KW 3002710016,3002712063,IT @@ -48639,9 +51185,7 @@ 3002736640,3002738687,LT 3002738688,3002740735,PL 3002740736,3002742783,GB -3002742784,3002743039,LI -3002743040,3002743047,GR -3002743048,3002744831,LI +3002742784,3002744831,LI 3002744832,3002746879,IT 3002746880,3002748927,GB 3002748928,3002750975,DE @@ -48720,7 +51264,8 @@ 3003076608,3003078143,GB 3003078144,3003078151,US 3003078152,3003078155,IN -3003078156,3003080703,GB +3003078156,3003078399,US +3003078400,3003080703,GB 3003080704,3003082751,FR 3003082752,3003084799,ES 3003086848,3003088895,RU @@ -48762,29 +51307,43 @@ 3003129088,3003129343,CO 3003129344,3003129599,BO 3003129600,3003129855,HN -3003129856,3003138559,CR +3003129856,3003130111,MX +3003130112,3003130367,CR +3003130368,3003130623,MX +3003130624,3003131647,CR +3003131648,3003133183,MX +3003133184,3003133695,CR +3003133696,3003134719,MX +3003134720,3003134975,CR +3003134976,3003135487,MX +3003135488,3003136255,CR +3003136256,3003137279,MX +3003137280,3003137791,CR +3003137792,3003138047,MX +3003138048,3003138559,HN 3003138560,3003139071,PA -3003139072,3003139583,CR +3003139072,3003139583,HN 3003139584,3003140351,PA -3003140352,3003140607,CR +3003140352,3003140607,HN 3003140608,3003141375,PA -3003141376,3003141631,CR +3003141376,3003141631,HN 3003141632,3003141887,PA -3003141888,3003143679,CR +3003141888,3003143679,HN 3003143680,3003144447,PA -3003144448,3003146239,CR +3003144448,3003146239,HN 3003146240,3003146495,PA -3003146496,3003147007,CR +3003146496,3003147007,GT 3003147008,3003147263,PA -3003147264,3003148031,CR +3003147264,3003148031,GT 3003148032,3003148543,PA -3003148544,3003148799,CR +3003148544,3003148799,GT 3003148800,3003149311,PA -3003149312,3003151871,CR +3003149312,3003150335,GT +3003150336,3003151871,SV 3003151872,3003152383,PA -3003152384,3003152639,CR +3003152384,3003152639,SV 3003152640,3003152895,PA -3003152896,3003154431,CR +3003152896,3003154431,SV 3003154432,3003154687,CL 3003154688,3003154943,EC 3003154944,3003159039,AR @@ -48833,37 +51392,41 @@ 3005888000,3005888255,CO 3005888256,3005890047,PA 3005890048,3005890303,CO -3005890304,3005891071,PA -3005891072,3005891327,CO +3005890304,3005890559,PA +3005890560,3005891327,CO 3005891328,3005893119,PA 3005893120,3005893631,CO 3005893632,3005893887,PA -3005893888,3005894143,CO -3005894144,3005894655,PA -3005894656,3005894911,CO -3005894912,3005896703,PA +3005893888,3005894911,CO +3005894912,3005895167,PA +3005895168,3005895423,CO +3005895424,3005896703,PA 3005896704,3005896959,CO -3005896960,3005899263,PA -3005899264,3005899519,CO -3005899520,3005900031,PA -3005900032,3005900287,CO -3005900288,3005902591,PA -3005902592,3005902847,CO -3005902848,3005903359,PA -3005903360,3005903871,CO -3005903872,3005905151,PA -3005905152,3005905407,CO -3005905408,3005905919,PA -3005905920,3005906943,CO +3005896960,3005897215,PA +3005897216,3005897727,CO +3005897728,3005897983,PA +3005897984,3005898239,CO +3005898240,3005899007,PA +3005899008,3005900543,CO +3005900544,3005901055,PA +3005901056,3005901311,CO +3005901312,3005902591,PA +3005902592,3005903871,CO +3005903872,3005904895,PA +3005904896,3005905407,CO +3005905408,3005905663,PA +3005905664,3005906943,CO 3005906944,3005911039,PA 3005911040,3005911295,CO 3005911296,3005911551,PA 3005911552,3005911807,CO -3005911808,3005913343,PA +3005911808,3005912831,PA +3005912832,3005913087,CO +3005913088,3005913343,PA 3005913344,3005913599,CO 3005913600,3005913855,PA -3005913856,3005914623,CO -3005914624,3005915135,PA +3005913856,3005914879,CO +3005914880,3005915135,PA 3005915136,3005918207,AR 3005918208,3005919231,CO 3005919232,3005923327,AR @@ -48895,42 +51458,42 @@ 3006279168,3006279423,NI 3006279424,3006283519,PA 3006283520,3006283775,NI -3006283776,3006284287,CR -3006284288,3006284799,PA +3006283776,3006284543,CR +3006284544,3006284799,PA 3006284800,3006285055,CR 3006285056,3006285311,PA -3006285312,3006285567,CR -3006285568,3006285823,PA -3006285824,3006286079,CR -3006286080,3006287103,PA -3006287104,3006287359,CR -3006287360,3006288639,PA +3006285312,3006286079,CR +3006286080,3006286847,PA +3006286848,3006287359,CR +3006287360,3006287871,PA +3006287872,3006288127,CR +3006288128,3006288639,PA 3006288640,3006289151,CR -3006289152,3006289663,PA -3006289664,3006289919,CR -3006289920,3006291455,PA -3006291456,3006291711,CR -3006291712,3006292991,PA -3006292992,3006293247,CR -3006293248,3006296575,PA +3006289152,3006289407,PA +3006289408,3006289919,CR +3006289920,3006291199,PA +3006291200,3006291967,CR +3006291968,3006296575,PA 3006296576,3006296831,CR 3006296832,3006308351,PA 3006308352,3006308863,CR -3006308864,3006310143,PA -3006310144,3006310399,CR -3006310400,3006311167,PA +3006308864,3006309631,PA +3006309632,3006309887,CR +3006309888,3006310143,PA +3006310144,3006310655,CR +3006310656,3006311167,PA 3006311168,3006311423,CR 3006311424,3006311679,PA -3006311680,3006312191,CR -3006312192,3006312703,PA -3006312704,3006312959,CR -3006312960,3006313727,PA -3006313728,3006313983,CR -3006313984,3006314239,PA -3006314240,3006314495,CR +3006311680,3006312447,CR +3006312448,3006312703,PA +3006312704,3006313471,CR +3006313472,3006313727,PA +3006313728,3006314495,CR 3006314496,3006315263,PA 3006315264,3006315775,CR -3006315776,3006320895,PA +3006315776,3006316031,PA +3006316032,3006316287,CR +3006316288,3006320895,PA 3006320896,3006321151,CR 3006321152,3006321663,PA 3006321664,3006322175,CR @@ -48938,10 +51501,10 @@ 3006322432,3006323199,CR 3006323200,3006323455,PA 3006323456,3006323711,CR -3006323712,3006329343,PA -3006329344,3006329855,NI -3006329856,3006330367,PA -3006330368,3006330623,NI +3006323712,3006324223,PA +3006324224,3006324479,CR +3006324480,3006328831,PA +3006328832,3006330623,NI 3006330624,3006330879,PA 3006330880,3006331903,CR 3006331904,3006332927,AR @@ -48971,11 +51534,13 @@ 3006513152,3006513663,PA 3006513664,3006514431,CR 3006514432,3006514687,PA -3006514688,3006517503,CR +3006514688,3006516479,CR +3006516480,3006516735,PA +3006516736,3006517503,CR 3006517504,3006517759,NI 3006517760,3006518527,CR -3006518528,3006519039,NI -3006519040,3006521343,CR +3006518528,3006519295,NI +3006519296,3006521343,CR 3006521344,3006528511,AR 3006528512,3006529535,BZ 3006529536,3006660607,DO @@ -49014,85 +51579,225 @@ 3007123456,3007143935,AR 3007143936,3007148031,CL 3007148032,3007152127,CO -3007152128,3007152383,CL +3007152128,3007152143,CL +3007152144,3007152159,DE +3007152160,3007152383,CL 3007152384,3007152639,US -3007152640,3007152895,CL +3007152640,3007152655,CL +3007152656,3007152671,DE +3007152672,3007152895,CL 3007152896,3007153151,US -3007153152,3007153407,CL -3007153408,3007153663,US -3007153664,3007153919,CL +3007153152,3007153167,CL +3007153168,3007153183,DE +3007153184,3007153279,CL +3007153280,3007153663,US +3007153664,3007153679,CL +3007153680,3007153695,DE +3007153696,3007153919,CL 3007153920,3007154175,US -3007154176,3007154431,CL -3007154432,3007154687,US -3007154688,3007154943,CL +3007154176,3007154191,CL +3007154192,3007154207,DE +3007154208,3007154303,CL +3007154304,3007154687,US +3007154688,3007154703,CL +3007154704,3007154719,DE +3007154720,3007154943,CL 3007154944,3007155199,US -3007155200,3007155455,CL +3007155200,3007155215,CL +3007155216,3007155231,DE +3007155232,3007155327,CL +3007155328,3007155455,US 3007155456,3007155711,GB -3007155712,3007155967,CL +3007155712,3007155727,CL +3007155728,3007155743,DE +3007155744,3007155967,CL 3007155968,3007156223,DE -3007156224,3007156479,CL +3007156224,3007156239,CL +3007156240,3007156255,DE +3007156256,3007156351,CL +3007156352,3007156479,US 3007156480,3007156495,ES -3007156496,3007156991,CL +3007156496,3007156511,DE +3007156512,3007156543,CL +3007156544,3007156607,GB +3007156608,3007156751,CL +3007156752,3007156767,DE +3007156768,3007156991,CL 3007156992,3007157007,HR -3007157008,3007157503,CL +3007157008,3007157055,CL +3007157056,3007157119,GB +3007157120,3007157247,DE +3007157248,3007157263,CL +3007157264,3007157279,DE +3007157280,3007157375,CL +3007157376,3007157503,US 3007157504,3007157519,IE -3007157520,3007158015,CL +3007157520,3007157567,CL +3007157568,3007157631,GB +3007157632,3007157759,US +3007157760,3007157775,CL +3007157776,3007157791,DE +3007157792,3007158015,CL 3007158016,3007158031,BE -3007158032,3007158527,CL +3007158032,3007158079,CL +3007158080,3007158143,GB +3007158144,3007158271,DE +3007158272,3007158287,CL +3007158288,3007158303,DE +3007158304,3007158399,CL +3007158400,3007158527,US 3007158528,3007158543,GB -3007158544,3007159039,CL +3007158544,3007158591,CL +3007158592,3007158655,GB +3007158656,3007158783,DE +3007158784,3007158799,CL +3007158800,3007158815,DE +3007158816,3007159039,CL 3007159040,3007159055,GB -3007159056,3007159551,CL +3007159056,3007159103,CL +3007159104,3007159167,GB +3007159168,3007159295,US +3007159296,3007159311,CL +3007159312,3007159327,DE +3007159328,3007159423,CL +3007159424,3007159551,US 3007159552,3007159567,RU -3007159568,3007160063,CL +3007159568,3007159615,CL +3007159616,3007159679,GB +3007159680,3007159807,DE +3007159808,3007159823,CL +3007159824,3007159839,DE +3007159840,3007160063,CL 3007160064,3007160079,HR -3007160080,3007160575,CL +3007160080,3007160127,CL +3007160128,3007160191,GB +3007160192,3007160319,DE +3007160320,3007160335,CL +3007160336,3007160351,DE +3007160352,3007160447,CL +3007160448,3007160575,US 3007160576,3007160591,IE 3007160592,3007160607,US -3007160608,3007161087,CL +3007160608,3007160703,CL +3007160704,3007160831,US +3007160832,3007160847,CL +3007160848,3007160863,DE +3007160864,3007161087,CL 3007161088,3007161103,GB -3007161104,3007161599,CL +3007161104,3007161215,CL +3007161216,3007161343,DE +3007161344,3007161359,CL +3007161360,3007161375,DE +3007161376,3007161471,CL +3007161472,3007161599,US 3007161600,3007161615,GB -3007161616,3007162111,CL +3007161616,3007161727,CL +3007161728,3007161855,DE +3007161856,3007161871,CL +3007161872,3007161887,DE +3007161888,3007162111,CL 3007162112,3007162127,ES -3007162128,3007162623,CL +3007162128,3007162239,CL +3007162240,3007162367,US +3007162368,3007162383,CL +3007162384,3007162399,DE +3007162400,3007162495,CL +3007162496,3007162623,US 3007162624,3007162639,NL -3007162640,3007163135,CL +3007162640,3007162751,CL +3007162752,3007162879,DE +3007162880,3007162895,CL +3007162896,3007162911,DE +3007162912,3007163135,CL 3007163136,3007163151,GB -3007163152,3007163647,CL +3007163152,3007163199,CL +3007163200,3007163263,DE +3007163264,3007163407,CL +3007163408,3007163423,DE +3007163424,3007163519,CL +3007163520,3007163647,US 3007163648,3007163663,ES -3007163664,3007164159,CL +3007163664,3007163711,CL +3007163712,3007163775,DE +3007163776,3007163903,US +3007163904,3007163919,CL +3007163920,3007163935,DE +3007163936,3007164159,CL 3007164160,3007164175,SK -3007164176,3007164671,CL +3007164176,3007164223,CL +3007164224,3007164287,DE +3007164288,3007164431,CL +3007164432,3007164447,DE +3007164448,3007164543,CL +3007164544,3007164671,US 3007164672,3007164687,SE -3007164688,3007165183,CL +3007164688,3007164735,CL +3007164736,3007164799,DE +3007164800,3007164943,CL +3007164944,3007164959,DE +3007164960,3007165183,CL 3007165184,3007165199,GB -3007165200,3007165695,CL +3007165200,3007165247,CL +3007165248,3007165311,DE +3007165312,3007165439,US +3007165440,3007165455,CL +3007165456,3007165471,DE +3007165472,3007165567,CL +3007165568,3007165695,US 3007165696,3007165711,DK -3007165712,3007166207,CL +3007165712,3007165759,CL +3007165760,3007165823,DE +3007165824,3007165967,CL +3007165968,3007165983,DE +3007165984,3007166207,CL 3007166208,3007166223,TR -3007166224,3007166719,CL +3007166224,3007166271,CL +3007166272,3007166335,DE +3007166336,3007166479,CL +3007166480,3007166495,DE +3007166496,3007166591,CL +3007166592,3007166719,US 3007166720,3007166735,GB -3007166736,3007167231,CL +3007166736,3007166751,DE +3007166752,3007166847,CL +3007166848,3007166975,US +3007166976,3007166991,CL +3007166992,3007167007,DE +3007167008,3007167231,CL 3007167232,3007167247,ES -3007167248,3007167743,CL +3007167248,3007167263,DE +3007167264,3007167503,CL +3007167504,3007167519,DE +3007167520,3007167615,CL +3007167616,3007167743,US 3007167744,3007167759,AU -3007167760,3007168255,CL +3007167760,3007167775,DE +3007167776,3007168015,CL +3007168016,3007168031,DE +3007168032,3007168127,CL +3007168128,3007168255,US 3007168256,3007168271,GR -3007168272,3007168511,CL +3007168272,3007168287,DE +3007168288,3007168383,CL +3007168384,3007168511,US 3007168512,3007168767,QA 3007168768,3007169023,CL 3007169024,3007169151,US -3007169152,3007171855,CL +3007169152,3007169279,CL +3007169280,3007169535,US +3007169536,3007170559,CL +3007170560,3007171071,DE +3007171072,3007171855,CL 3007171856,3007171871,US -3007171872,3007175679,CL +3007171872,3007172607,CL +3007172608,3007175679,BR 3007175680,3007175935,GB -3007175936,3007183359,CL +3007175936,3007183359,BR 3007183360,3007183615,AU 3007183616,3007183871,IE 3007183872,3007184127,JO 3007184128,3007184383,KW -3007184384,3007184895,CL +3007184384,3007184895,BR 3007184896,3007250431,AR 3007250432,3007268095,CR 3007268096,3007268607,PA @@ -49117,9 +51822,9 @@ 3007281920,3007283455,CR 3007283456,3007283711,PA 3007283712,3007283967,CR -3007283968,3007284223,PA -3007284224,3007286015,CR -3007286016,3007286271,PA +3007283968,3007284479,PA +3007284480,3007285759,CR +3007285760,3007286271,PA 3007286272,3007286783,CR 3007286784,3007287295,PA 3007287296,3007287551,CR @@ -49160,7 +51865,9 @@ 3025403904,3025600511,CN 3025600512,3025603071,IN 3025603072,3025603087,HK -3025603088,3025603839,IN +3025603088,3025603103,IN +3025603104,3025603199,HK +3025603200,3025603839,IN 3025603840,3025604095,HK 3025604096,3025604381,IN 3025604382,3025606655,SG @@ -49173,7 +51880,9 @@ 3025608192,3025608203,JP 3025608204,3025610751,IN 3025610752,3025612799,SG -3025612800,3025616895,IN +3025612800,3025612895,IN +3025612896,3025612927,SG +3025612928,3025616895,IN 3025616896,3025617407,SG 3025617408,3025618943,IN 3025618944,3025619487,SG @@ -49191,7 +51900,8 @@ 3025625400,3025625407,TH 3025625408,3025625471,SG 3025625472,3025625503,MY -3025625504,3025625535,IN +3025625504,3025625519,SG +3025625520,3025625535,IN 3025625536,3025625599,CA 3025625600,3025625855,SG 3025625856,3025629439,IN @@ -49205,7 +51915,11 @@ 3025631240,3025631247,AU 3025631248,3025632255,IN 3025632256,3025632271,SG -3025632272,3025633535,IN +3025632272,3025632287,IN +3025632288,3025632351,SG +3025632352,3025632511,IN +3025632512,3025632767,SG +3025632768,3025633535,IN 3025633536,3025633791,HK 3025633792,3025633807,AU 3025633808,3025637151,IN @@ -49224,18 +51938,27 @@ 3025639176,3025639423,IN 3025639424,3025639679,SG 3025639680,3025639935,HK -3025639936,3025640447,IN +3025639936,3025640191,IN +3025640192,3025640447,JP 3025640448,3025640799,MY 3025640800,3025641727,IN 3025641728,3025641743,HK 3025641744,3025641759,IN 3025641760,3025641775,HK -3025641776,3025647103,IN +3025641776,3025641983,IN +3025641984,3025642495,HK +3025642496,3025642751,SG +3025642752,3025647103,IN 3025647104,3025647359,SG 3025647360,3025647615,AU 3025647616,3025647775,IN 3025647776,3025647791,SG -3025647792,3025648079,IN +3025647792,3025647839,IN +3025647840,3025647871,SG +3025647872,3025647903,HK +3025647904,3025647935,IN +3025647936,3025647967,SG +3025647968,3025648079,IN 3025648080,3025648087,SG 3025648088,3025648091,US 3025648092,3025649151,IN @@ -49352,15 +52075,15 @@ 3031695360,3031760895,TH 3031760896,3031826431,AU 3031826432,3031891967,KR -3031891968,3031913983,TH -3031913984,3031914239,SG -3031914240,3031957503,TH +3031891968,3031957503,TH 3031957504,3032252415,CN 3032252416,3032271871,HK 3032271872,3032272895,AU 3032272896,3032276991,JP 3032276992,3032285183,IN -3032285184,3032301567,JP +3032285184,3032289279,JP +3032289280,3032293375,AU +3032293376,3032301567,JP 3032301568,3032317951,KR 3032317952,3032319999,JP 3032320000,3032323071,AU @@ -49452,7 +52175,8 @@ 3035324416,3035326463,JP 3035326464,3035328511,AU 3035332608,3035333631,AU -3035333632,3035334655,HK +3035333632,3035333887,JP +3035333888,3035334655,HK 3035335680,3035337727,JP 3035337728,3035338751,ID 3035338752,3035339007,SG @@ -49478,28 +52202,26 @@ 3039166464,3039231999,PA 3039232000,3039297535,EC 3039297536,3039363071,PY -3039363072,3039412223,BZ -3039412224,3039412991,CL -3039412992,3039413247,BR +3039363072,3039411199,BZ +3039411200,3039412223,US +3039412224,3039412735,CL +3039412736,3039413247,BR 3039413248,3039413503,CL 3039413504,3039414015,BR 3039414016,3039414271,CL 3039414272,3039414527,BR 3039414528,3039415295,CL -3039415296,3039415807,BR -3039415808,3039416713,CL +3039415296,3039416319,BR +3039416320,3039416713,CL 3039416714,3039416715,US 3039416716,3039416735,CL 3039416736,3039416739,US 3039416740,3039416831,CL -3039416832,3039417343,BR -3039417344,3039417855,CL -3039417856,3039418111,BR -3039418112,3039418367,CL -3039418368,3039418879,BR +3039416832,3039417599,BR +3039417600,3039417855,CL +3039417856,3039418879,BR 3039418880,3039419135,CL -3039419136,3039420159,BR -3039420160,3039420415,CL +3039419136,3039420415,BR 3039420416,3039428607,AR 3039428608,3039559679,CL 3039559680,3039821823,AR @@ -49544,7 +52266,7 @@ 3048121344,3048122367,PA 3048122368,3048123391,CR 3048123392,3048126463,AR -3048126464,3048128511,VE +3048126464,3048128511,ES 3048128512,3048132607,AR 3048132608,3048135935,CR 3048135936,3048136447,PA @@ -49631,11 +52353,14 @@ 3050708480,3050708495,FR 3050708496,3050708991,CL 3050708992,3050709007,AT -3050709008,3050709503,CL +3050709008,3050709247,CL +3050709248,3050709375,DE +3050709376,3050709503,CL 3050709504,3050709519,TH 3050709520,3050710015,CL 3050710016,3050710031,ES -3050710032,3050710527,CL +3050710032,3050710271,CL +3050710272,3050710527,US 3050710528,3050710543,FR 3050710544,3050711039,CL 3050711040,3050711055,AU @@ -49647,7 +52372,14 @@ 3050712576,3050712591,PL 3050712592,3050713087,CL 3050713088,3050713103,LV -3050713104,3050766335,CL +3050713104,3050714367,CL +3050714368,3050714623,GB +3050714624,3050715647,CL +3050715648,3050718719,US +3050718720,3050733567,CL +3050733568,3050749951,US +3050749952,3050764287,CL +3050764288,3050766335,US 3050766336,3050766351,NO 3050766352,3050766847,CL 3050766848,3050766863,KR @@ -49697,9 +52429,15 @@ 3050778112,3050778127,KR 3050778128,3050778623,CL 3050778624,3050778639,TR -3050778640,3050831871,CL +3050778640,3050786815,CL +3050786816,3050788863,US +3050788864,3050790911,CL +3050790912,3050807295,US +3050807296,3050831871,CL 3050831872,3051356159,BR -3051356160,3051373055,CR +3051356160,3051372543,CR +3051372544,3051372799,PA +3051372800,3051373055,CR 3051373056,3051373311,PA 3051373312,3051374335,CR 3051374336,3051374591,PA @@ -49899,7 +52637,6 @@ 3068986368,3068987391,AU 3068987392,3068990463,IN 3068990464,3068991487,VN -3068991488,3068991743,IN 3068993536,3069018111,KR 3069018112,3069034495,IN 3069034496,3069050879,KR @@ -49974,7 +52711,8 @@ 3078619136,3081437183,CN 3081437184,3081502719,MY 3081502720,3081764863,CN -3081764864,3081846783,JP +3081764864,3081844735,JP +3081844736,3081846783,AU 3081846784,3081847807,TW 3081847808,3081848831,KR 3081848832,3081850879,SG @@ -49991,7 +52729,9 @@ 3082158080,3082166271,CN 3082166272,3082174463,JP 3082174464,3082178559,BZ -3082178560,3082179583,HK +3082178560,3082178823,HK +3082178824,3082178824,SG +3082178825,3082179583,HK 3082179584,3082181631,IN 3082181632,3082182655,ID 3082182656,3082190847,LA @@ -50001,9 +52741,7 @@ 3088605184,3088609279,NL 3088609280,3088629759,US 3088629760,3088633855,NL -3088633856,3088924671,US -3088924672,3088925695,NL -3088925696,3088998399,US +3088633856,3088998399,US 3088998400,3089002495,NL 3089002496,3089027071,US 3089027072,3089031167,NL @@ -50019,9 +52757,7 @@ 3091955712,3091959807,CA 3091959808,3091976191,US 3091976192,3091980287,CA -3091980288,3092569343,US -3092569344,3092569599,AU -3092569600,3092578303,US +3091980288,3092578303,US 3092578304,3092582399,NL 3092582400,3092615167,US 3092615168,3092619263,NL @@ -50107,11 +52843,11 @@ 3098263552,3098271743,CA 3098271744,3098278847,US 3098278848,3098278911,CA -3098278912,3098411007,US +3098278912,3098350383,US +3098350384,3098350391,BR +3098350392,3098411007,US 3098411008,3098415103,PK -3098415104,3098439679,US -3098439680,3098443775,CA -3098443776,3098476543,US +3098415104,3098476543,US 3098476544,3098492927,CA 3098492928,3098494719,US 3098494720,3098495743,CA @@ -50145,6 +52881,12 @@ 3103857408,3103857663,RS 3103857664,3103857919,FR 3103857920,3103858175,PL +3103858176,3103858431,BG +3103858432,3103858687,AT +3103858688,3103858943,NL +3103858944,3103859199,GB +3103859200,3103859455,SK +3103859456,3103859711,DE 3103916032,3103917055,CH 3103917056,3103918079,IT 3103918080,3103919103,DE @@ -50206,8 +52948,8 @@ 3103974400,3103974911,SE 3103974912,3103974919,LT 3103974920,3103974943,SE -3103974944,3103975039,LT -3103975040,3103975423,SE +3103974944,3103975071,LT +3103975072,3103975423,SE 3103975424,3103976447,SA 3103976448,3103977471,GB 3103977472,3103978495,NL @@ -50239,7 +52981,9 @@ 3104009216,3104010239,IT 3104010240,3104011263,PL 3104011264,3104012287,ES -3104012288,3104013311,BH +3104012288,3104012799,BH +3104012800,3104013055,SA +3104013056,3104013311,BH 3104013312,3104014335,IR 3104014336,3104015359,FR 3104015360,3104016383,SE @@ -50302,7 +53046,7 @@ 3104075776,3104076799,NL 3104076800,3104077823,GB 3104077824,3104078847,AT -3104078848,3104079871,LU +3104078848,3104079871,FR 3104079872,3104080895,GB 3104080896,3104081919,GR 3104081920,3104082943,DK @@ -50329,7 +53073,6 @@ 3104103424,3104104447,IR 3104104448,3104105471,TR 3104105472,3104106495,FI -3104106496,3104107519,CH 3104107520,3104108543,UA 3104108544,3104109567,GB 3104109568,3104110591,ES @@ -50394,6 +53137,7 @@ 3104173056,3104174079,ES 3104174080,3104175103,IE 3104175104,3104176127,IT +3104176128,3104177151,RU 3104177152,3104178175,UA 3104178176,3104179199,PL 3104179200,3104180223,ES @@ -50415,7 +53159,7 @@ 3104195584,3104196607,DE 3104196608,3104197631,IT 3104197632,3104198655,GR -3104198656,3104199679,GB +3104198656,3104199679,RU 3104199680,3104200703,NL 3104200704,3104201727,IT 3104201728,3104202751,FR @@ -50542,9 +53286,7 @@ 3104331776,3104333823,GB 3104333824,3104334847,ES 3104334848,3104335871,SE -3104335872,3104336359,LT -3104336360,3104336367,BE -3104336368,3104336407,LT +3104335872,3104336407,LT 3104336408,3104336415,CH 3104336416,3104336895,LT 3104336896,3104337919,GB @@ -50650,7 +53392,15 @@ 3104451584,3104452607,RU 3104452608,3104453631,NL 3104453632,3104454655,CH -3104454656,3104455679,NL +3104454656,3104454660,NL +3104454661,3104454782,SE +3104454783,3104455050,NL +3104455051,3104455082,SE +3104455083,3104455146,NL +3104455147,3104455162,SE +3104455163,3104455294,NL +3104455295,3104455423,SE +3104455424,3104455679,NL 3104455680,3104456703,RU 3104456704,3104457727,IL 3104457728,3104458751,DE @@ -50675,7 +53425,6 @@ 3104478208,3104479231,DE 3104479232,3104480255,RU 3104480256,3104483327,NL -3104483328,3104484351,SA 3104484352,3104485375,RU 3104485376,3104486399,FR 3104486400,3104488447,RU @@ -50725,7 +53474,6 @@ 3104533504,3104534527,PL 3104534528,3104535551,SE 3104535552,3104536575,ES -3104536576,3104537599,RO 3104537600,3104538623,US 3104538624,3104539647,PL 3104539648,3104540671,RU @@ -50828,7 +53576,7 @@ 3104642048,3104643071,KZ 3104643072,3104644095,RU 3104644096,3104645119,DE -3104645120,3104646143,GB +3104645120,3104646143,RU 3104646144,3104647167,FR 3104647168,3104648191,GB 3104648192,3104649215,RU @@ -50922,7 +53670,9 @@ 3104747520,3104749567,FR 3104749568,3104750591,NL 3104750592,3104751615,CZ -3104751616,3104752639,UA +3104751616,3104751871,UA +3104751872,3104752127,CA +3104752128,3104752639,UA 3104752640,3104753663,SA 3104753664,3104754687,GR 3104754688,3104755711,MK @@ -50980,7 +53730,7 @@ 3104809984,3104811007,NL 3104811008,3104812031,IT 3104812032,3104813055,RU -3104814080,3104816127,DE +3104813056,3104816127,DE 3104816128,3104817151,RU 3104817152,3104818175,DE 3104818176,3104819199,TR @@ -50994,7 +53744,6 @@ 3104826368,3104827391,CH 3104827392,3104828415,PL 3104828416,3104829439,AT -3104829440,3104830463,DK 3104830464,3104831487,DE 3104831488,3104832511,NL 3104832512,3104833535,CZ @@ -51014,7 +53763,9 @@ 3104848896,3104849919,DE 3104849920,3104850943,RU 3104850944,3104851199,JE -3104851200,3104851967,GB +3104851200,3104851455,GB +3104851456,3104851711,GG +3104851712,3104851967,GB 3104851968,3104852991,DE 3104852992,3104854015,AT 3104854016,3104855039,GI @@ -51147,7 +53898,7 @@ 3104988160,3104989183,DE 3104989184,3104990207,FR 3104990208,3104991231,DE -3104991232,3104992255,SK +3104991232,3104992255,BE 3104992256,3104995327,RU 3104995328,3104996351,GB 3104996352,3104997375,RU @@ -51196,6 +53947,7 @@ 3105042432,3105043455,FR 3105043456,3105044479,DE 3105044480,3105045503,NL +3105045504,3105046527,DE 3105046528,3105047551,NO 3105047552,3105048575,ES 3105048576,3105049599,SK @@ -51222,6 +53974,7 @@ 3105072128,3105073151,IT 3105073152,3105074175,RU 3105074176,3105075199,DE +3105075200,3105076223,RU 3105076224,3105077247,BE 3105077248,3105078271,IT 3105078272,3105079295,ES @@ -51236,7 +53989,7 @@ 3105087488,3105088511,FR 3105088512,3105089535,JO 3105089536,3105090559,DE -3105090560,3105091583,GB +3105090560,3105091583,NL 3105091584,3105092607,FR 3105092608,3105093631,UA 3105093632,3105094655,SE @@ -51420,7 +54173,6 @@ 3105289216,3105290239,AT 3105290240,3105291263,TR 3105291264,3105292287,CH -3105292288,3105293311,DE 3105293312,3105294335,GB 3105294336,3105295359,RU 3105295360,3105296383,PL @@ -51448,8 +54200,7 @@ 3105320960,3105321983,SK 3105321984,3105323007,GB 3105323008,3105324031,ES -3105324032,3105324287,SA -3105324288,3105325055,BH +3105324032,3105325055,SA 3105325056,3105326079,IR 3105326080,3105328127,FR 3105328128,3105329151,NL @@ -51458,6 +54209,7 @@ 3105331200,3105332223,IQ 3105332224,3105333247,DE 3105333248,3105334271,LV +3105334272,3105335295,UA 3105335296,3105336319,GR 3105336320,3105337343,IL 3105337344,3105339391,GB @@ -51504,11 +54256,10 @@ 3105383680,3105383935,SK 3105383936,3105384447,AT 3105384448,3105385471,IT -3105386496,3105387519,RU +3105385472,3105387519,RU 3105387520,3105388543,IT 3105388544,3105389567,GB -3105389568,3105389823,LB -3105389824,3105390591,TR +3105389568,3105390591,TR 3105390592,3105391615,JO 3105391616,3105392639,NL 3105392640,3105393663,IR @@ -51556,7 +54307,9 @@ 3105441792,3105442815,IT 3105442816,3105443839,FI 3105443840,3105444863,NL -3105444864,3105445887,GB +3105444864,3105445119,GB +3105445120,3105445631,US +3105445632,3105445887,GB 3105445888,3105446911,RU 3105446912,3105447935,CH 3105447936,3105448959,DE @@ -51624,6 +54377,7 @@ 3105515520,3105516543,FR 3105516544,3105517567,NL 3105517568,3105518591,RU +3105518592,3105519615,RS 3105519616,3105520639,RU 3105520640,3105521663,FR 3105521664,3105522687,NO @@ -51640,9 +54394,7 @@ 3105532928,3105533951,RS 3105533952,3105534975,BA 3105534976,3105535231,GB -3105535232,3105535773,NO -3105535774,3105535774,RU -3105535775,3105535999,NO +3105535232,3105535999,NO 3105536000,3105537023,AZ 3105537024,3105538047,AT 3105538048,3105539071,RU @@ -51659,6 +54411,7 @@ 3105549312,3105549823,AT 3105549824,3105550079,NL 3105550080,3105550335,FR +3105550336,3105551359,GB 3105551360,3105552383,US 3105552384,3105553407,FR 3105553408,3105554431,DE @@ -51720,7 +54473,10 @@ 3105614848,3105615871,NL 3105615872,3105616895,SE 3105616896,3105617919,GB -3105617920,3105618943,NL +3105617920,3105617953,US +3105617954,3105617954,NL +3105617955,3105618175,US +3105618176,3105618943,NL 3105618944,3105619967,DE 3105619968,3105620991,TR 3105620992,3105622015,DE @@ -51763,7 +54519,8 @@ 3105655808,3105656831,ES 3105656832,3105657855,SK 3105657856,3105658879,NL -3105658880,3105659903,IL +3105658880,3105659135,GB +3105659136,3105659903,IL 3105659904,3105660927,DE 3105660928,3105661951,TR 3105661952,3105662975,GB @@ -51771,7 +54528,13 @@ 3105664000,3105665023,DE 3105665024,3105666047,PL 3105667072,3105668095,DE -3105668096,3105669119,NL +3105668096,3105668131,US +3105668132,3105668159,NL +3105668160,3105668191,US +3105668192,3105668351,NL +3105668352,3105668863,US +3105668864,3105668879,NL +3105668880,3105669119,US 3105669120,3105670143,CZ 3105670144,3105671167,IE 3105671168,3105673215,GB @@ -51796,9 +54559,9 @@ 3105692672,3105693695,DE 3105693696,3105696767,FR 3105696768,3105697791,GB -3105697792,3105698815,FR +3105697792,3105698815,GP 3105698816,3105700863,RU -3105700864,3105701887,NL +3105700864,3105701887,BE 3105701888,3105702911,FR 3105702912,3105703935,ES 3105703936,3105704959,IT @@ -51816,7 +54579,7 @@ 3105716224,3105717247,TR 3105717248,3105719295,RU 3105719296,3105721343,GB -3105721344,3105722367,SI +3105721344,3105722367,BA 3105722368,3105723391,IT 3105723392,3105724415,FR 3105724416,3105725439,CH @@ -51904,7 +54667,7 @@ 3105807360,3105808383,RU 3105808384,3105809407,NO 3105809408,3105810431,RU -3105810432,3105811455,IL +3105810432,3105811455,FR 3105811456,3105812479,NL 3105812480,3105814527,ES 3105814528,3105815551,JO @@ -52002,6 +54765,7 @@ 3105916928,3105917951,ES 3105917952,3105918975,NL 3105918976,3105919999,PL +3105920000,3105921023,IQ 3105921024,3105922047,IE 3105922048,3105923071,PL 3105923072,3105924095,CZ @@ -52014,17 +54778,22 @@ 3105929216,3105930239,RU 3105930240,3105931263,PT 3105932288,3105933311,SE -3105933312,3105933343,GB -3105933344,3105933359,IT +3105933312,3105933351,GB +3105933352,3105933359,IT 3105933360,3105933463,GB 3105933464,3105933471,IT -3105933472,3105934127,GB -3105934128,3105934135,IT -3105934136,3105934215,GB +3105933472,3105933743,GB +3105933744,3105933751,IT +3105933752,3105933831,GB +3105933832,3105933839,IT +3105933840,3105933871,GB +3105933872,3105933879,IT +3105933880,3105934215,GB 3105934216,3105934223,IT 3105934224,3105934231,GB 3105934232,3105934239,IT -3105934240,3105934335,GB +3105934240,3105934327,GB +3105934328,3105934335,IT 3105934336,3105935359,SE 3105935360,3105936383,FR 3105936384,3105937407,CH @@ -52033,11 +54802,14 @@ 3105939456,3105940479,BY 3105940480,3105941503,GR 3105941504,3105942527,NL -3105942528,3105943551,LU +3105942528,3105943039,LU +3105943040,3105943295,BE +3105943296,3105943551,LU 3105943552,3105944575,NL 3105944576,3105945599,DE 3105945600,3105946623,RU 3105946624,3105947647,IE +3105947648,3105948671,RU 3105948672,3105949695,GB 3105949696,3105950719,AT 3105950720,3105951743,FR @@ -52058,7 +54830,9 @@ 3105966080,3105967103,FI 3105967104,3105968127,GB 3105968128,3105969151,HU -3105969152,3105970175,GB +3105969152,3105969663,GB +3105969664,3105969695,DE +3105969696,3105970175,GB 3105970176,3105971199,FR 3105971200,3105972223,GB 3105972224,3105973247,FI @@ -52080,7 +54854,8 @@ 3105987584,3105988607,CZ 3105988608,3105989631,RU 3105989632,3105990655,NL -3105990656,3105991679,US +3105990656,3105990911,PS +3105990912,3105991679,US 3105991680,3105992703,SA 3105992704,3105993727,BH 3105993728,3105994751,DE @@ -52163,7 +54938,9 @@ 3106067456,3106068479,DE 3106068480,3106070527,NL 3106070528,3106071551,UA -3106071552,3106072575,BH +3106071552,3106072063,BH +3106072064,3106072319,US +3106072320,3106072575,BH 3106072576,3106073599,GB 3106073600,3106074623,PL 3106074624,3106076671,RU @@ -52290,7 +55067,8 @@ 3106202624,3106203647,RU 3106203648,3106204671,GR 3106204672,3106205695,MT -3106205696,3106206719,NO +3106205696,3106205951,SE +3106205952,3106206719,NO 3106206720,3106207743,GE 3106207744,3106208767,GB 3106208768,3106209791,RO @@ -52327,9 +55105,11 @@ 3106239488,3106240511,IT 3106240512,3106241535,IE 3106241536,3106242559,NL +3106242560,3106243583,RU 3106243584,3106244607,FI 3106244608,3106245631,DE -3106245632,3106246655,SE +3106245632,3106245887,DK +3106245888,3106246655,SE 3106246656,3106247679,DE 3106247680,3106248703,NO 3106248704,3106249727,DE @@ -52355,7 +55135,7 @@ 3106271232,3106272255,SK 3106272256,3106273279,NL 3106273280,3106274303,DE -3106274304,3106275327,FR +3106274304,3106275327,CH 3106275328,3106276351,FI 3106276352,3106277375,AT 3106277376,3106278399,DE @@ -52404,7 +55184,9 @@ 3106324480,3106325503,AL 3106325504,3106326527,FR 3106326528,3106326783,NL -3106326784,3106327551,IL +3106326784,3106327039,US +3106327040,3106327295,GB +3106327296,3106327551,NL 3106327552,3106328575,RU 3106328576,3106329599,UA 3106329600,3106330623,IQ @@ -52477,7 +55259,7 @@ 3106403328,3106405375,GB 3106405376,3106406399,DE 3106406400,3106407423,RU -3106407424,3106409471,GB +3106408448,3106409471,GB 3106409472,3106411519,IT 3106411520,3106412543,HU 3106412544,3106413567,GB @@ -52511,6 +55293,7 @@ 3106442240,3106443263,GB 3106443264,3106445311,ES 3106445312,3106446335,RU +3106446336,3106447359,AZ 3106447360,3106448383,DE 3106448384,3106449407,BG 3106449408,3106450431,AT @@ -52551,7 +55334,17 @@ 3106483426,3106483426,FR 3106483427,3106483429,GB 3106483430,3106483430,IE -3106483431,3106484223,GB +3106483431,3106483766,GB +3106483767,3106483767,DE +3106483768,3106483768,CZ +3106483769,3106483769,BE +3106483770,3106483770,DE +3106483771,3106483771,FR +3106483772,3106483772,DE +3106483773,3106483773,IT +3106483774,3106483774,PL +3106483775,3106483775,IE +3106483776,3106484223,GB 3106484224,3106485247,NL 3106485248,3106486271,CZ 3106486272,3106488319,DE @@ -52706,12 +55499,14 @@ 3106656256,3106657279,GB 3106657280,3106658303,NL 3106658304,3106659327,GB -3106659328,3106660351,NL +3106659328,3106660351,CZ 3106660352,3106661375,UA 3106661376,3106662399,TR 3106662400,3106663423,IE 3106663424,3106664447,UA -3106664448,3106666495,FR +3106664448,3106665727,FR +3106665728,3106665983,CH +3106665984,3106666495,FR 3106666496,3106667519,UA 3106667520,3106668543,ES 3106668544,3106669567,RU @@ -52817,8 +55612,7 @@ 3106780160,3106781183,FR 3106781184,3106782207,DK 3106782208,3106783231,IR -3106783232,3106783743,NL -3106783744,3106784255,AE +3106783232,3106784255,NL 3106784256,3106785279,HU 3106785280,3106786303,CZ 3106786304,3106787327,DE @@ -52850,7 +55644,11 @@ 3106817024,3106818047,IT 3106818048,3106819071,IE 3106819072,3106820095,BE -3106820096,3106824191,CH +3106820096,3106821375,CH +3106821376,3106821631,US +3106821632,3106821887,HK +3106821888,3106822143,RU +3106822144,3106824191,CH 3106824192,3106825215,RU 3106825216,3106826239,IT 3106826240,3106827263,PL @@ -52881,7 +55679,9 @@ 3106850816,3106851839,GB 3106851840,3106852863,PL 3106852864,3106853887,GB -3106853888,3106854911,CH +3106853888,3106854015,CH +3106854016,3106854143,NL +3106854144,3106854911,CH 3106854912,3106855935,IR 3106855936,3106856959,UA 3106856960,3106857983,NO @@ -52901,12 +55701,12 @@ 3106872320,3106873343,BE 3106873344,3106874367,ES 3106874368,3106875391,RU -3106875392,3106876415,SE +3106875392,3106876415,NO 3106876416,3106877439,CZ 3106877440,3106878463,IR 3106878464,3106879487,RU 3106879488,3106880511,MK -3106880512,3106881535,GB +3106880512,3106881535,NL 3106881536,3106882559,PL 3106882560,3106883583,BE 3106883584,3106884607,GB @@ -52966,7 +55766,7 @@ 3106940928,3106941951,HU 3106941952,3106943999,FR 3106944000,3106945023,IT -3106945024,3106946047,DE +3106945024,3106946047,NL 3106946048,3106947071,GB 3106947072,3106948095,AE 3106948096,3106949119,NL @@ -53185,7 +55985,6 @@ 3107183616,3107184639,IQ 3107184640,3107185663,SE 3107185664,3107186687,CZ -3107186688,3107187711,GB 3107187712,3107188735,MT 3107188736,3107189759,CZ 3107189760,3107190783,NL @@ -53303,7 +56102,8 @@ 3107315712,3107316735,GB 3107316736,3107317759,KG 3107317760,3107318783,RU -3107318784,3107319807,NL +3107318784,3107318799,IE +3107318800,3107319807,NL 3107319808,3107320831,OM 3107320832,3107321855,SA 3107321856,3107322879,NL @@ -53355,6 +56155,7 @@ 3107371008,3107372031,PL 3107372032,3107373055,DE 3107373056,3107374079,ES +3107374080,3107374080,SE 3107374081,3107374100,MT 3107374101,3107374120,CR 3107374121,3107374140,IT @@ -53365,8 +56166,13 @@ 3107374221,3107374240,CA 3107374241,3107374260,BO 3107374261,3107374280,US +3107374281,3107374320,SE 3107374321,3107374332,MX +3107374333,3107374333,SE 3107374334,3107374335,MX +3107374336,3107374336,SE +3107374337,3107374340,US +3107374341,3107375103,SE 3107375104,3107376127,GB 3107376128,3107377151,NL 3107377152,3107378175,AT @@ -53479,8 +56285,12 @@ 3107496064,3107496191,FR 3107496192,3107496255,DE 3107496256,3107496287,BS -3107496288,3107496319,FR -3107496320,3107496703,NL +3107496288,3107496319,VG +3107496320,3107496447,NL +3107496448,3107496463,CL +3107496464,3107496479,ES +3107496480,3107496511,GB +3107496512,3107496703,NL 3107496704,3107496719,PE 3107496720,3107496735,KP 3107496736,3107496751,FJ @@ -53492,7 +56302,8 @@ 3107496832,3107496847,BR 3107496848,3107496863,KP 3107496864,3107496879,HK -3107496880,3107496911,IS +3107496880,3107496895,IS +3107496896,3107496911,US 3107496912,3107496927,PL 3107496928,3107496959,FR 3107496960,3107497983,DK @@ -53509,7 +56320,8 @@ 3107508224,3107509247,PL 3107509248,3107510271,SE 3107510272,3107511295,IT -3107511296,3107512319,SI +3107511296,3107511807,RS +3107511808,3107512319,SI 3107512320,3107513343,NL 3107513344,3107514367,DE 3107514368,3107515391,US @@ -53538,7 +56350,7 @@ 3107540992,3107542015,RO 3107542016,3107543039,SE 3107543040,3107544063,DE -3107544064,3107545087,IR +3107544064,3107545087,GB 3107545088,3107546111,NL 3107546112,3107547135,GB 3107547136,3107548159,SE @@ -53688,7 +56500,10 @@ 3107704832,3107705855,CZ 3107705856,3107706879,NO 3107706880,3107707903,RU -3107707904,3107708927,GB +3107707904,3107708159,DE +3107708160,3107708415,GB +3107708416,3107708671,NL +3107708672,3107708927,US 3107708928,3107709951,PL 3107709952,3107710975,DK 3107710976,3107711999,RU @@ -53777,7 +56592,7 @@ 3107802112,3107803135,RU 3107803136,3107804159,ES 3107804160,3107805183,CZ -3107805184,3107806207,ES +3107805184,3107806207,GB 3107806208,3107807231,RU 3107807232,3107808255,GB 3107808256,3107809279,DE @@ -53837,7 +56652,7 @@ 3107867648,3107868671,GB 3107868672,3107869695,CH 3107869696,3107870719,GB -3107870720,3107871743,CH +3107870720,3107871743,DE 3107871744,3107872767,PL 3107872768,3107873791,LV 3107873792,3107874815,RU @@ -53893,7 +56708,8 @@ 3107929088,3107930111,RU 3107930112,3107931135,CH 3107931136,3107932159,NL -3107932160,3107934207,MT +3107932160,3107932415,SE +3107932416,3107934207,MT 3107934208,3107935231,GB 3107935232,3107936255,PL 3107936256,3107937279,IT @@ -53923,7 +56739,7 @@ 3107961856,3107962879,RU 3107962880,3107963903,FR 3107963904,3107964927,RU -3107964928,3107965951,ES +3107964928,3107965951,PL 3107965952,3107966975,DE 3107966976,3107967999,NO 3107968000,3107969023,DE @@ -53951,7 +56767,7 @@ 3107991552,3107992575,AT 3107992576,3107993599,RU 3107993600,3107994623,RO -3107994624,3107995647,DE +3107994624,3107995647,AT 3107995648,3107996671,BE 3107996672,3107997695,IT 3107997696,3107998719,SE @@ -53962,7 +56778,7 @@ 3108002816,3108003839,RO 3108003840,3108004863,DE 3108004864,3108005887,RU -3108005888,3108006911,RO +3108005888,3108006911,LT 3108006912,3108007935,NL 3108007936,3108008959,DE 3108008960,3108009983,CH @@ -53996,17 +56812,13 @@ 3108038656,3108039679,ES 3108039680,3108040703,MD 3108040704,3108041727,ES -3108041728,3108042751,DE -3108042752,3108044799,GB +3108041728,3108044799,GB 3108044800,3108045823,LU 3108045824,3108046847,DE 3108046848,3108047871,HU -3108047872,3108048895,RU -3108048896,3108049919,UA -3108049920,3108050943,RU +3108047872,3108050943,RU 3108050944,3108051967,GB 3108051968,3108052991,FR -3108052992,3108054015,IR 3108054016,3108055039,LV 3108055040,3108056063,GB 3108056064,3108057087,IT @@ -54030,7 +56842,7 @@ 3108076544,3108077567,NL 3108077568,3108078591,GB 3108078592,3108079615,SE -3108079616,3108080639,MD +3108079616,3108080639,RU 3108080640,3108081663,SE 3108081664,3108082687,GB 3108082688,3108083711,RU @@ -54039,13 +56851,15 @@ 3108085760,3108086783,LV 3108086784,3108087807,GB 3108087808,3108088831,CH -3108088832,3108089855,NL +3108088832,3108089855,RU 3108089856,3108090879,SE 3108090880,3108091903,BE 3108091904,3108092927,ES 3108092928,3108093951,SE 3108093952,3108095999,DE -3108096000,3108097023,RU +3108096000,3108096511,LT +3108096512,3108096767,RU +3108096768,3108097023,ES 3108097024,3108098047,TR 3108098048,3108099071,DE 3108099072,3108100095,NL @@ -54061,10 +56875,1013 @@ 3108109312,3108110335,IQ 3108110336,3108111359,DK 3108111360,3108112383,GB -3108112384,3108113407,UA +3108112384,3108113407,US 3108113408,3108114431,RU 3108114432,3108115455,AE 3108115456,3108116479,GB +3108116480,3108117503,IT +3108117504,3108118527,RU +3108118528,3108119551,GB +3108119552,3108120575,CZ +3108120576,3108122623,ES +3108122624,3108123647,AT +3108123648,3108124671,HU +3108124672,3108125695,ES +3108125696,3108126719,CH +3108126720,3108127743,DE +3108127744,3108128767,BY +3108128768,3108129791,ES +3108129792,3108130815,DE +3108130816,3108131839,NL +3108131840,3108132863,RU +3108132864,3108133887,GB +3108133888,3108134911,NL +3108134912,3108135935,LU +3108135936,3108136959,FR +3108136960,3108137983,NL +3108137984,3108139007,CH +3108139008,3108141055,GB +3108141056,3108142079,PL +3108142080,3108143103,TR +3108143104,3108144127,AL +3108144128,3108145151,DE +3108145152,3108146175,RO +3108146176,3108147199,NL +3108147200,3108148223,RU +3108148224,3108149247,SI +3108149248,3108150271,FR +3108150272,3108151295,CH +3108151296,3108152319,CY +3108152320,3108153343,GB +3108153344,3108154367,NL +3108154368,3108155391,ES +3108155392,3108156415,DE +3108156416,3108157439,GB +3108157440,3108158463,DK +3108158464,3108159487,CZ +3108159488,3108161535,DE +3108161536,3108162559,SK +3108162560,3108164607,GB +3108164608,3108165631,PL +3108165632,3108166655,RU +3108166656,3108167679,DE +3108167680,3108169727,IR +3108169728,3108170751,FR +3108170752,3108171775,DE +3108171776,3108172799,GB +3108172800,3108173823,DE +3108173824,3108174847,NL +3108174848,3108175871,KG +3108175872,3108176127,NL +3108176128,3108176895,UA +3108176896,3108177919,NL +3108177920,3108178943,PL +3108178944,3108179967,IR +3108179968,3108180991,NO +3108180992,3108182015,IE +3108182016,3108183039,DE +3108183040,3108184063,ES +3108184064,3108185087,TR +3108185088,3108186111,DE +3108186112,3108187135,NO +3108187136,3108188159,NL +3108188160,3108189183,GB +3108189184,3108190207,RU +3108191232,3108193279,NL +3108193280,3108194303,PL +3108194304,3108195327,FR +3108195328,3108196351,ES +3108196352,3108197375,FI +3108197376,3108198399,IS +3108198400,3108199423,FR +3108199424,3108200447,RU +3108200448,3108201471,ES +3108201472,3108202495,IR +3108202496,3108203519,ES +3108203520,3108204543,AT +3108204544,3108205567,ES +3108205568,3108206591,NO +3108206592,3108208639,TR +3108208640,3108209663,DK +3108209664,3108210687,CZ +3108210688,3108211711,BR +3108211712,3108212735,GB +3108212736,3108215807,FR +3108215808,3108216831,DE +3108216832,3108217855,RU +3108217856,3108218879,GB +3108218880,3108219903,RU +3108219904,3108220927,AT +3108220928,3108221951,AL +3108221952,3108222975,IS +3108222976,3108223999,GB +3108224000,3108225023,CZ +3108225024,3108227071,CH +3108227072,3108228095,NL +3108228096,3108229119,TR +3108229120,3108230143,ES +3108230144,3108231167,IR +3108231168,3108232191,PL +3108232192,3108233215,DE +3108233216,3108234239,NL +3108234240,3108235263,AT +3108235264,3108236287,GB +3108236288,3108237311,IT +3108237312,3108238335,LT +3108238336,3108239359,RU +3108239360,3108240383,GB +3108240384,3108241407,CZ +3108241408,3108242431,GB +3108242432,3108243455,AT +3108243456,3108244479,GE +3108244480,3108245503,PL +3108245504,3108246527,UA +3108246528,3108247551,RU +3108247552,3108248575,PL +3108248576,3108249599,CZ +3108249600,3108250623,CH +3108250624,3108251647,LT +3108251648,3108252671,DE +3108252672,3108253695,LU +3108253696,3108254719,ME +3108254720,3108255743,CH +3108255744,3108256767,FI +3108256768,3108257791,RS +3108257792,3108258815,CH +3108258816,3108259839,CZ +3108259840,3108260863,HU +3108260864,3108261887,DE +3108261888,3108262911,AE +3108262912,3108263935,GB +3108263936,3108264959,NL +3108264960,3108265983,RU +3108265984,3108267007,NL +3108267008,3108268031,RU +3108268032,3108269055,GB +3108269056,3108270079,ES +3108270080,3108271103,GB +3108271104,3108272127,RU +3108272128,3108273151,RO +3108273152,3108274175,DE +3108274176,3108275199,CY +3108275200,3108276223,HR +3108276224,3108277247,DE +3108277248,3108278271,GB +3108278272,3108279295,RU +3108279296,3108280319,FR +3108280320,3108281343,RU +3108281344,3108282367,CZ +3108282368,3108283391,NL +3108283392,3108284415,CZ +3108284416,3108285439,NO +3108285440,3108286463,NL +3108286464,3108287487,IT +3108287488,3108288511,NL +3108288512,3108289535,RU +3108289536,3108290559,RO +3108290560,3108291583,IT +3108291584,3108292607,NL +3108292608,3108293631,GB +3108293632,3108294655,CH +3108294656,3108295679,EE +3108295680,3108297727,CZ +3108297728,3108298751,TR +3108298752,3108300799,FR +3108300800,3108301823,GB +3108301824,3108302847,CH +3108302848,3108303871,NL +3108303872,3108304895,RU +3108304896,3108305919,GB +3108305920,3108306943,DE +3108306944,3108307967,PL +3108307968,3108308991,IQ +3108308992,3108310015,ES +3108310016,3108312063,GB +3108312064,3108313087,PL +3108313088,3108314111,LV +3108314112,3108315135,BA +3108315136,3108316159,NL +3108316160,3108317183,FI +3108317184,3108318207,CH +3108318208,3108319231,SE +3108319232,3108320255,SK +3108320256,3108321279,LT +3108321280,3108322303,RO +3108322304,3108323327,NL +3108323328,3108324351,GB +3108324352,3108325375,CZ +3108325376,3108326399,FI +3108326400,3108327423,FR +3108327424,3108328447,RU +3108328448,3108329471,GB +3108329472,3108330495,NL +3108330496,3108331519,CH +3108331520,3108332543,HU +3108332544,3108333567,NL +3108333568,3108334591,SK +3108334592,3108335615,IR +3108335616,3108336639,NL +3108336640,3108337663,GB +3108337664,3108338687,IR +3108338688,3108339711,RU +3108339712,3108340735,NL +3108340736,3108341759,RU +3108341760,3108342783,CH +3108342784,3108343807,FI +3108343808,3108344831,GB +3108344832,3108345855,SI +3108345856,3108346879,UA +3108346880,3108347903,NL +3108347904,3108348927,AT +3108348928,3108349951,BE +3108349952,3108350975,SE +3108350976,3108351999,GE +3108352000,3108354047,DE +3108354048,3108355071,TM +3108355072,3108356095,IT +3108356096,3108358143,PL +3108358144,3108359167,DE +3108359168,3108360191,NL +3108360192,3108361215,RU +3108361216,3108362239,IE +3108362240,3108363263,LU +3108363264,3108364287,RU +3108364288,3108365311,LU +3108365312,3108366335,FR +3108366336,3108367359,NL +3108367360,3108368383,AT +3108368384,3108369407,RO +3108369408,3108370431,AT +3108370432,3108371455,FR +3108371456,3108372479,ES +3108372480,3108373503,SK +3108373504,3108374527,NL +3108374528,3108375551,GB +3108375552,3108376575,BY +3108376576,3108377599,UA +3108377600,3108378623,DE +3108378624,3108379647,CZ +3108379648,3108380671,IE +3108380672,3108381695,GB +3108381696,3108382719,PL +3108382720,3108383743,CH +3108383744,3108384767,BE +3108384768,3108385791,CH +3108385792,3108386815,GE +3108386816,3108387839,GB +3108387840,3108388863,IR +3108388864,3108389887,NL +3108389888,3108390911,CH +3108390912,3108391935,BE +3108391936,3108392959,GR +3108392960,3108393983,LI +3108393984,3108395007,TR +3108395008,3108396031,GB +3108396032,3108397055,ES +3108397056,3108398079,TR +3108398080,3108399103,PT +3108399104,3108400127,RU +3108400128,3108401151,UA +3108401152,3108402175,NL +3108402176,3108403199,KZ +3108403200,3108404223,DE +3108404224,3108405247,SE +3108405248,3108406271,UA +3108406272,3108407295,GB +3108407296,3108408319,ES +3108408320,3108409343,TR +3108409344,3108410367,DE +3108410368,3108411391,IT +3108411392,3108412415,ES +3108412416,3108414463,GB +3108414464,3108415487,RU +3108415488,3108416511,GB +3108416512,3108417535,ES +3108417536,3108418559,FR +3108418560,3108419583,PL +3108419584,3108420607,NL +3108420608,3108421631,MD +3108421632,3108422655,GB +3108422656,3108423679,IR +3108423680,3108424703,IT +3108424704,3108425727,DE +3108425728,3108427775,NL +3108427776,3108428799,CZ +3108428800,3108429823,DE +3108429824,3108430847,LB +3108430848,3108433919,NL +3108433920,3108434943,GB +3108434944,3108435967,CH +3108435968,3108436991,IL +3108436992,3108438015,GB +3108438016,3108439039,US +3108439040,3108440063,DE +3108440064,3108441087,IT +3108441088,3108443135,CH +3108443136,3108444159,PL +3108444160,3108445183,GB +3108445184,3108446207,ES +3108446208,3108447231,DE +3108447232,3108448255,GB +3108448256,3108449279,CZ +3108449280,3108450303,IT +3108450304,3108451327,GB +3108451328,3108452351,RU +3108452352,3108453375,LU +3108453376,3108454399,NL +3108454400,3108456447,RU +3108456448,3108457471,GB +3108457472,3108459519,RU +3108459520,3108460543,DE +3108460544,3108461567,RO +3108461568,3108462591,GB +3108462592,3108463615,RU +3108463616,3108464639,GB +3108464640,3108465663,HU +3108465664,3108466687,GB +3108466688,3108467711,CH +3108467712,3108468735,TR +3108468736,3108470783,DE +3108470784,3108471807,LV +3108471808,3108472831,YE +3108472832,3108473855,GB +3108473856,3108474879,PS +3108474880,3108475903,RU +3108475904,3108476927,FR +3108476928,3108477951,IR +3108477952,3108478975,FR +3108478976,3108479999,IE +3108480000,3108481023,AT +3108481024,3108482047,DE +3108482048,3108483071,SI +3108483072,3108484095,SE +3108484096,3108485119,AL +3108485120,3108486143,GB +3108486144,3108487167,FR +3108487168,3108488191,IR +3108488192,3108489215,RU +3108489216,3108490239,ES +3108490240,3108491263,AE +3108491264,3108492287,NO +3108492288,3108493311,RU +3108493312,3108494335,CY +3108494336,3108496383,NL +3108496384,3108497407,DE +3108497408,3108498431,CZ +3108498432,3108499455,HR +3108499456,3108500479,PL +3108500480,3108501503,IT +3108501504,3108502527,DE +3108502528,3108503551,AT +3108503552,3108504575,CH +3108504576,3108505599,FR +3108505600,3108506623,RU +3108506624,3108507647,ES +3108507648,3108508671,HU +3108508672,3108509695,CH +3108509696,3108510719,IR +3108510720,3108511743,SI +3108511744,3108512767,PL +3108512768,3108513791,DK +3108513792,3108514815,IT +3108514816,3108515839,ES +3108515840,3108516863,UA +3108516864,3108517887,ES +3108517888,3108518911,BG +3108518912,3108519935,SI +3108519936,3108520959,CH +3108520960,3108521983,CZ +3108521984,3108523007,AT +3108523008,3108524031,IT +3108524032,3108525055,FR +3108525056,3108526079,LV +3108526080,3108527103,FR +3108527104,3108528127,GB +3108528128,3108529151,NO +3108529152,3108530175,JO +3108530176,3108531199,SI +3108531200,3108532223,GB +3108532224,3108533247,ES +3108533248,3108534271,FI +3108534272,3108536319,NL +3108536320,3108537343,GB +3108537344,3108538367,NL +3108538368,3108539391,AT +3108539392,3108540415,DK +3108540416,3108541439,RU +3108541440,3108542463,GR +3108542464,3108543487,PT +3108543488,3108544511,US +3108544512,3108546559,NL +3108546560,3108547583,BE +3108547584,3108548607,GB +3108548608,3108549631,RO +3108549632,3108550655,NL +3108550656,3108551679,PL +3108551680,3108552703,RU +3108552704,3108553727,CH +3108553728,3108554751,PL +3108554752,3108555775,DE +3108555776,3108556799,LV +3108556800,3108557823,DK +3108557824,3108558847,ES +3108558848,3108559871,LB +3108559872,3108560895,NO +3108560896,3108562943,RU +3108562944,3108563967,DE +3108563968,3108564991,CH +3108564992,3108566015,RO +3108566016,3108567039,DE +3108567040,3108568063,FR +3108568064,3108569087,TR +3108569088,3108570111,IR +3108570112,3108571135,SI +3108571136,3108572159,GB +3108572160,3108573183,NO +3108573184,3108574207,RU +3108574208,3108575231,DE +3108575232,3108576255,NO +3108576256,3108578303,NL +3108578304,3108579327,GB +3108579328,3108580351,GR +3108580352,3108581375,GB +3108581376,3108582399,DE +3108582400,3108583423,FR +3108583424,3108584447,BG +3108584448,3108585471,PL +3108585472,3108586495,GB +3108586496,3108587519,EE +3108587520,3108588543,DK +3108588544,3108589567,IR +3108589568,3108590591,DE +3108590592,3108591615,GB +3108591616,3108592639,PL +3108592640,3108593663,NL +3108593664,3108594687,ES +3108594688,3108597759,CZ +3108597760,3108598783,IR +3108598784,3108600831,CH +3108600832,3108601855,NL +3108601856,3108602879,TR +3108602880,3108603903,EE +3108603904,3108604927,IT +3108604928,3108605951,GB +3108605952,3108606975,NL +3108606976,3108609023,GB +3108609024,3108610047,LI +3108610048,3108611071,CZ +3108611072,3108612095,IT +3108612096,3108615167,ES +3108615168,3108616191,RU +3108616192,3108617215,GB +3108617216,3108618239,ES +3108618240,3108619263,RU +3108619264,3108620287,DK +3108620288,3108621311,TR +3108621312,3108622335,FR +3108622336,3108623359,PL +3108623360,3108625407,RU +3108625408,3108626431,NL +3108626432,3108627455,CZ +3108627456,3108628479,PL +3108628480,3108629503,FR +3108629504,3108630527,BG +3108630528,3108631551,CH +3108631552,3108633599,IT +3108633600,3108634623,FR +3108634624,3108635647,AT +3108635648,3108636671,UZ +3108636672,3108637695,FR +3108637696,3108638719,DE +3108638720,3108639743,ES +3108639744,3108640767,TR +3108640768,3108641791,GB +3108641792,3108642815,CH +3108642816,3108643839,FR +3108643840,3108644863,IT +3108644864,3108645887,FR +3108645888,3108646911,US +3108646912,3108647935,DK +3108647936,3108648959,FR +3108648960,3108649983,IM +3108649984,3108651007,CZ +3108651008,3108652031,DE +3108652032,3108653055,CH +3108653056,3108654079,GI +3108654080,3108655103,NL +3108655104,3108656127,ES +3108656128,3108657151,PL +3108657152,3108658175,RS +3108658176,3108659199,GE +3108659200,3108660223,FR +3108660224,3108661247,UZ +3108661248,3108662271,RU +3108662272,3108676607,CH +3108676608,3108677631,IR +3108677632,3108678655,GB +3108678656,3108679679,RU +3108679680,3108680703,GB +3108680704,3108681727,DE +3108681728,3108682751,RU +3108682752,3108683775,IT +3108683776,3108684799,ES +3108684800,3108685823,SK +3108685824,3108686847,FR +3108686848,3108687871,CZ +3108687872,3108688895,FO +3108688896,3108689919,CH +3108689920,3108690943,DE +3108690944,3108691967,RU +3108691968,3108692991,DE +3108692992,3108694015,RU +3108694016,3108696063,GB +3108696064,3108697087,ES +3108697088,3108698111,DE +3108698112,3108699135,IT +3108699136,3108700159,CZ +3108700160,3108701183,PL +3108701184,3108702207,RU +3108702208,3108703231,AT +3108703232,3108704255,ES +3108704256,3108705279,SA +3108705280,3108706303,GB +3108706304,3108707327,DE +3108707328,3108708351,GB +3108708352,3108709375,CH +3108709376,3108710399,PL +3108710400,3108711423,SE +3108711424,3108712447,RU +3108712448,3108713471,BG +3108713472,3108714495,RO +3108714496,3108715519,RS +3108715520,3108716543,GB +3108716544,3108717567,RU +3108717568,3108718591,FR +3108718592,3108719615,DE +3108719616,3108720639,IT +3108720640,3108721663,MD +3108721664,3108723711,RU +3108723712,3108724735,GB +3108724736,3108725759,IQ +3108725760,3108726783,DE +3108726784,3108727807,GB +3108727808,3108728831,IT +3108728832,3108729855,NL +3108729856,3108730879,CZ +3108730880,3108731903,GB +3108731904,3108732927,FR +3108732928,3108733951,FI +3108733952,3108734975,RU +3108734976,3108735999,CZ +3108736000,3108737023,FR +3108737024,3108738047,IE +3108738048,3108739071,DE +3108739072,3108740095,CH +3108740096,3108741119,NL +3108741120,3108742143,PL +3108742144,3108743167,DE +3108743168,3108744191,NL +3108744192,3108745215,GB +3108745216,3108746239,ES +3108746240,3108747263,RU +3108747264,3108748287,DE +3108748288,3108749311,RU +3108749312,3108750335,HU +3108750336,3108751359,IR +3108751360,3108752383,RU +3108752384,3108753407,IR +3108753408,3108754431,NL +3108754432,3108755455,GB +3108755456,3108756479,AT +3108756480,3108757503,NL +3108757504,3108758527,FR +3108758528,3108759551,DE +3108759552,3108760575,CZ +3108760576,3108761599,LV +3108761600,3108762623,GB +3108762624,3108763647,NL +3108763648,3108764671,RU +3108764672,3108765695,NL +3108765696,3108766719,FR +3108766720,3108767743,PT +3108767744,3108768767,CZ +3108768768,3108769791,UA +3108769792,3108770815,NL +3108770816,3108772863,FR +3108772864,3108773887,RO +3108773888,3108774911,IQ +3108774912,3108775935,GB +3108775936,3108776959,DE +3108776960,3108779007,GB +3108779008,3108780031,RO +3108780032,3108781055,IT +3108781056,3108782079,RO +3108782080,3108783103,SE +3108783104,3108784127,UA +3108784128,3108785151,NL +3108785152,3108786175,ES +3108786176,3108787199,RU +3108787200,3108788223,NO +3108788224,3108789247,NL +3108789248,3108790271,GB +3108790272,3108791295,RU +3108791296,3108792319,IT +3108792320,3108793343,PL +3108793344,3108794367,RU +3108794368,3108795391,FR +3108795392,3108796415,DE +3108796416,3108797439,FR +3108797440,3108798463,NL +3108798464,3108799487,AE +3108799488,3108800511,NL +3108800512,3108801535,RO +3108801536,3108802559,TR +3108802560,3108803583,RU +3108803584,3108804607,GB +3108804608,3108805631,TR +3108805632,3108808703,DE +3108808704,3108809727,NL +3108809728,3108810751,DE +3108810752,3108811775,LB +3108811776,3108812799,CH +3108812800,3108813823,GB +3108813824,3108814847,DE +3108814848,3108815871,FR +3108815872,3108817919,TR +3108817920,3108818943,AE +3108818944,3108819967,GB +3108819968,3108822015,ES +3108822016,3108823039,RU +3108823040,3108825087,IE +3108825088,3108826111,RU +3108826112,3108827135,NL +3108827136,3108828159,RU +3108828160,3108829183,MT +3108829184,3108830207,IR +3108830208,3108831231,RU +3108831232,3108832255,TR +3108832256,3108833279,GB +3108833280,3108834303,RU +3108834304,3108835327,BE +3108835328,3108836351,RU +3108836352,3108837375,GB +3108837376,3108838399,NL +3108838400,3108839423,GE +3108839424,3108840447,IT +3108840448,3108841471,GR +3108841472,3108842495,TR +3108842496,3108843519,LI +3108843520,3108844543,IT +3108844544,3108845567,LI +3108845568,3108846591,GB +3108846592,3108847615,BE +3108847616,3108848639,GB +3108848640,3108849663,CH +3108849664,3108850687,GB +3108850688,3108851711,PL +3108851712,3108852735,GB +3108852736,3108853759,IT +3108853760,3108854783,TR +3108854784,3108855807,CH +3108855808,3108856831,LT +3108856832,3108857855,UA +3108857856,3108858879,DE +3108858880,3108859903,AT +3108859904,3108860927,FR +3108860928,3108861951,NO +3108861952,3108862975,NL +3108862976,3108863999,BG +3108864000,3108865023,NL +3108865024,3108866047,ES +3108866048,3108867071,RU +3108867072,3108868095,GB +3108868096,3108869119,SK +3108869120,3108870143,RU +3108870144,3108871167,GB +3108871168,3108872191,ES +3108872192,3108873215,IT +3108873216,3108874239,SG +3108874240,3108875263,ES +3108875264,3108876287,GB +3108876288,3108877311,ES +3108877312,3108878335,FR +3108878336,3108879359,ES +3108879360,3108880383,NL +3108880384,3108881407,AM +3108881408,3108882431,BE +3108882432,3108883455,GB +3108883456,3108884479,RU +3108884480,3108885503,NL +3108885504,3108886527,BE +3108886528,3108888575,RU +3108888576,3108889599,VA +3108889600,3108893695,RU +3108893696,3108894719,FI +3108894720,3108895743,RO +3108895744,3108896767,AT +3108896768,3108897791,ES +3108897792,3108899839,GB +3108899840,3108900863,CZ +3108900864,3108901887,IT +3108901888,3108902911,IR +3108902912,3108903935,ES +3108903936,3108905983,RU +3108905984,3108907007,BG +3108907008,3108908031,DE +3108908032,3108909055,EE +3108909056,3108910079,IT +3108910080,3108911103,GB +3108911104,3108912127,CZ +3108912128,3108913151,DE +3108913152,3108914175,IT +3108914176,3108915199,NO +3108915200,3108916223,PL +3108916224,3108917247,RU +3108917248,3108918271,FR +3108918272,3108919295,TR +3108919296,3108920319,GB +3108920320,3108921343,RU +3108921344,3108922367,NL +3108922368,3108923391,CZ +3108923392,3108924415,IR +3108924416,3108927487,RU +3108927488,3108929535,CH +3108929536,3108930559,CY +3108930560,3108931583,PL +3108931584,3108932607,UZ +3108932608,3108933631,FR +3108933632,3108934655,AM +3108934656,3108935679,PL +3108935680,3108936703,SK +3108936704,3108937727,FR +3108937728,3108938751,NL +3108938752,3108940799,GB +3108940800,3108941823,SE +3108941824,3108942847,DE +3108942848,3108943871,BE +3108943872,3108944895,DE +3108944896,3108945919,CH +3108945920,3108946943,GB +3108946944,3108947967,NL +3108947968,3108948991,RU +3108948992,3108950015,GB +3108950016,3108951039,NO +3108951040,3108952063,ES +3108952064,3108953087,GB +3108953088,3108954111,GR +3108954112,3108955135,AL +3108955136,3108956159,NO +3108956160,3108956671,UA +3108956672,3108957183,CZ +3108957184,3108958207,RU +3108958208,3108959231,SI +3108959232,3108960255,AE +3108960256,3108961279,NL +3108961280,3108962303,DE +3108962304,3108963327,AM +3108963328,3108964351,ES +3108964352,3108965375,NL +3108965376,3108966399,TR +3108966400,3108967423,BY +3108967424,3108968447,ES +3108968448,3108969471,DE +3108969472,3108970495,ES +3108970496,3108971519,PL +3108971520,3108972543,ES +3108972544,3108973567,MD +3108973568,3108974591,DE +3108974592,3108975615,RU +3108975616,3108976639,IT +3108976640,3108977663,GB +3108977664,3108978687,IR +3108978688,3108979711,DE +3108979712,3108980735,RU +3108980736,3108981759,DE +3108981760,3108982783,RU +3108982784,3108983807,NL +3108983808,3108984831,NO +3108984832,3108985855,CH +3108985856,3108986879,HU +3108986880,3108987903,IR +3108987904,3108988927,RU +3108988928,3108989951,CH +3108989952,3108991999,GB +3108992000,3108993023,RU +3108993024,3108994047,BG +3108994048,3108995071,DE +3108995072,3108996095,ES +3108996096,3108998143,RU +3108998144,3108999167,GB +3108999168,3109000191,ES +3109000192,3109001215,FR +3109001216,3109002239,NL +3109002240,3109003263,IR +3109003264,3109004287,NL +3109004288,3109005311,SE +3109005312,3109006335,DE +3109006336,3109007359,ES +3109007360,3109008383,GB +3109008384,3109009407,CH +3109009408,3109010431,GB +3109010432,3109011455,GR +3109011456,3109012479,FR +3109012480,3109013503,DE +3109013504,3109015551,CH +3109015552,3109016575,DE +3109016576,3109017599,KZ +3109017600,3109018623,DE +3109018624,3109019647,FR +3109019648,3109020671,PT +3109020672,3109021695,SI +3109021696,3109022719,CH +3109022720,3109023743,RU +3109023744,3109024767,PL +3109024768,3109025791,LT +3109025792,3109026815,SA +3109026816,3109027839,CH +3109027840,3109028863,BG +3109028864,3109029887,ES +3109029888,3109030911,NL +3109030912,3109031935,GB +3109031936,3109032959,FR +3109032960,3109033983,TR +3109033984,3109035007,JO +3109035008,3109036031,RU +3109036032,3109037055,PL +3109037056,3109038079,NL +3109038080,3109039103,IQ +3109039104,3109040127,YE +3109040128,3109041151,HU +3109041152,3109043199,RU +3109043200,3109044223,NO +3109044224,3109045247,CH +3109045248,3109046271,RS +3109046272,3109047295,TR +3109047296,3109048319,PT +3109048320,3109050367,GB +3109050368,3109051391,CH +3109051392,3109052415,DE +3109052416,3109053439,ME +3109053440,3109054463,RU +3109054464,3109055487,JO +3109055488,3109056511,IL +3109056512,3109058559,GB +3109058560,3109059583,DE +3109059584,3109060607,LU +3109060608,3109061631,LT +3109061632,3109062655,GB +3109062656,3109063679,TR +3109063680,3109064703,YE +3109064704,3109065727,DE +3109065728,3109066751,RU +3109066752,3109067775,UA +3109067776,3109068799,NO +3109068800,3109069823,PL +3109069824,3109070847,MK +3109070848,3109071871,DE +3109071872,3109072895,AZ +3109072896,3109073919,GB +3109073920,3109074943,NO +3109074944,3109075967,DE +3109075968,3109076991,AT +3109076992,3109078015,HR +3109078016,3109079039,IR +3109079040,3109080063,CZ +3109080064,3109081087,RU +3109081088,3109082111,SE +3109082112,3109083135,PL +3109083136,3109084159,SE +3109084160,3109085183,GB +3109085184,3109086207,AL +3109086208,3109087231,RU +3109087232,3109088255,NL +3109088256,3109089279,LV +3109089280,3109090303,AT +3109090304,3109091327,NL +3109091328,3109092351,RU +3109092352,3109093375,SE +3109093376,3109095423,RU +3109095424,3109096447,NL +3109096448,3109097471,NO +3109097472,3109098495,GB +3109098496,3109099519,HU +3109099520,3109100543,RU +3109100544,3109101567,SI +3109101568,3109102591,CY +3109102592,3109103615,DK +3109103616,3109104639,IR +3109104640,3109105663,FR +3109105664,3109106687,LV +3109106688,3109107711,FR +3109107712,3109108735,PL +3109108736,3109109759,RS +3109109760,3109110783,RU +3109110784,3109111807,FI +3109111808,3109112831,IE +3109112832,3109113855,ES +3109113856,3109115903,AZ +3109115904,3109116927,AU +3109116928,3109117951,GE +3109117952,3109118975,IR +3109118976,3109119999,DE +3109120000,3109121023,PL +3109121024,3109122047,SE +3109122048,3109123071,RU +3109123072,3109124095,DK +3109124096,3109126143,ES +3109126144,3109127167,LV +3109127168,3109128191,ES +3109128192,3109129215,RU +3109129216,3109130239,LB +3109130240,3109131263,RU +3109131264,3109132287,DE +3109132288,3109133311,TR +3109133312,3109134335,FR +3109134336,3109135359,GB +3109135360,3109136383,RO +3109136384,3109137407,GB +3109137408,3109138431,RU +3109138432,3109139455,GB +3109139456,3109140479,ES +3109140480,3109141503,RU +3109141504,3109143551,GB +3109143552,3109144575,GR +3109144576,3109145599,FR +3109145600,3109148671,AT +3109148672,3109149695,AZ +3109149696,3109150719,RU +3109150720,3109151743,BE +3109151744,3109152767,HR +3109152768,3109153791,GB +3109153792,3109154815,TR +3109154816,3109155839,AT +3109155840,3109156863,GB +3109156864,3109157887,RU +3109157888,3109158911,GB +3109158912,3109159935,IT +3109159936,3109160959,DE +3109160960,3109161983,GB +3109161984,3109163007,RU +3109163008,3109164031,AT +3109164032,3109165055,DE +3109165056,3109166079,RU +3109166080,3109167103,IR +3109167104,3109168127,LB +3109168128,3109169151,BG +3109169152,3109170175,DE +3109170176,3109171199,IE +3109171200,3109172223,GI +3109172224,3109173247,IL +3109173248,3109174271,ES +3109174272,3109175295,GB +3109175296,3109176319,IR +3109176320,3109177343,IL +3109177344,3109178367,IE +3109178368,3109179391,GB +3109179392,3109180415,ES +3109180416,3109181439,DE +3109181440,3109182463,NL +3109182464,3109183487,LT +3109183488,3109184511,LB +3109184512,3109185535,CH +3109185536,3109187583,RS +3109187584,3109188607,IT +3109188608,3109189631,SA +3109189632,3109190655,AT +3109190656,3109191679,NL +3109191680,3109192703,CH +3109192704,3109193727,IT +3109193728,3109194751,IR +3109194752,3109195775,NL +3109195776,3109196799,FI +3109196800,3109197823,FR +3109197824,3109198847,NL +3109198848,3109199871,GB +3109199872,3109200895,DE +3109200896,3109201919,IR +3109201920,3109202943,IT +3109202944,3109203967,RO +3109203968,3109204991,RU +3109204992,3109206015,IR +3109206016,3109209087,NL +3109209088,3109210111,GB +3109210112,3109211135,NL +3109211136,3109212159,CH +3109212160,3109213183,NL +3109213184,3109214207,CZ +3109214208,3109215231,BG +3109215232,3109216255,TR +3109216256,3109217279,IT +3109217280,3109218303,DK +3109218304,3109219327,HU +3109219328,3109220351,CZ +3109220352,3109221375,IE +3109221376,3109222399,GB +3109222400,3109223423,PL +3109223424,3109224447,TR +3109224448,3109225471,RU +3109225472,3109226495,EE +3109226496,3109227519,NL 3120562176,3120594943,CO 3120594944,3120599039,AR 3120599040,3120601087,EC @@ -54084,11 +57901,13 @@ 3120691200,3120693247,CO 3120693248,3120726015,BO 3120726016,3120734207,HN -3120734208,3120738303,BZ +3120734208,3120735743,BZ +3120735744,3120735999,RU +3120736000,3120738303,BZ 3120738304,3120742399,CW 3120742400,3120754687,PY 3120754688,3120755711,CR -3120755712,3120756735,GY +3120755712,3120756735,GF 3120757504,3120757759,BZ 3120757760,3120758783,CL 3120758784,3120824319,EC @@ -54164,7 +57983,9 @@ 3123707904,3124232191,UY 3124232192,3124760751,AR 3124760752,3124760759,MX -3124760760,3124783103,AR +3124760760,3124765183,AR +3124765184,3124765439,MX +3124765440,3124783103,AR 3124783104,3124785151,GT 3124785152,3124788223,CL 3124788224,3124789247,PE @@ -54178,7 +57999,13 @@ 3124846592,3124848639,AR 3124848640,3124849663,PA 3124849664,3124850687,AR -3124850688,3124853887,HN +3124850688,3124851471,HN +3124851472,3124851487,CM +3124851488,3124852175,HN +3124852176,3124852191,PH +3124852192,3124853103,HN +3124853104,3124853119,VN +3124853120,3124853887,HN 3124853888,3124853903,FR 3124853904,3124854783,HN 3124854784,3124887551,CL @@ -54186,9 +58013,7 @@ 3124953088,3125018623,CL 3125018624,3125280767,EC 3125280768,3125542911,PA -3125542912,3125658111,NI -3125658112,3125658367,MX -3125658368,3125673983,NI +3125542912,3125673983,NI 3125673984,3125805055,CL 3125805056,3126329343,CO 3126329344,3126853631,VE @@ -54198,7 +58023,11 @@ 3126857856,3126857983,US 3126857984,3126858495,AR 3126858496,3126858623,US -3126858624,3126870015,AR +3126858624,3126861311,AR +3126861312,3126861439,US +3126861440,3126862591,AR +3126862592,3126862719,US +3126862720,3126870015,AR 3126870016,3126874111,VE 3126874112,3126878207,CR 3126878208,3126882303,PA @@ -54229,7 +58058,8 @@ 3130315776,3130316799,CR 3130316800,3130318847,CW 3130318848,3130319871,AR -3130319872,3130320895,RU +3130319872,3130320639,RU +3130320640,3130320895,BR 3130320896,3130327039,AR 3130327040,3130458111,DO 3130458112,3130523647,GT @@ -54282,7 +58112,8 @@ 3154124800,3154126847,PL 3154126848,3154128895,RU 3154128896,3154132991,EE -3154132992,3154157567,UA +3154132992,3154149375,UA +3154149376,3154157567,KZ 3154157568,3154173951,RU 3154173952,3154182143,MD 3154182144,3154247679,DE @@ -54294,31 +58125,7 @@ 3154575360,3154640895,FR 3154640896,3155165183,IT 3155165184,3155427327,RU -3155427328,3155536647,AT -3155536648,3155536655,DE -3155536656,3155540735,AT -3155540736,3155540991,HU -3155540992,3155542323,AT -3155542324,3155542327,CH -3155542328,3155598079,AT -3155598080,3155598335,DE -3155598336,3155628031,AT -3155628032,3155628287,HU -3155628288,3155663743,AT -3155663744,3155663871,CH -3155663872,3155675647,AT -3155675648,3155675775,DE -3155675776,3155676415,AT -3155676416,3155676671,HU -3155676672,3155681791,AT -3155681792,3155682047,HU -3155682048,3155684095,AT -3155684096,3155684223,HU -3155684224,3155685119,AT -3155685120,3155685247,HU -3155685248,3155685375,AT -3155685376,3155685631,CZ -3155685632,3155689471,AT +3155427328,3155689471,AT 3155689472,3155951615,RO 3155951616,3156213759,GB 3156213760,3156279295,RU @@ -54333,7 +58140,9 @@ 3156759432,3156759432,GB 3156759433,3156803583,DE 3156803584,3156869119,TR -3156869120,3156930559,LU +3156869120,3156926463,LU +3156926464,3156928511,NL +3156928512,3156930559,LU 3156930560,3156933631,US 3156933632,3156934655,SG 3156934656,3157000191,RU @@ -54347,9 +58156,11 @@ 3157196800,3157262335,PL 3157262336,3157786623,SA 3157786624,3158048767,TR -3158048768,3158214911,CH -3158214912,3158215167,DE -3158215168,3158310911,CH +3158048768,3158070548,CH +3158070549,3158070549,SE +3158070550,3158092031,CH +3158092032,3158092287,DE +3158092288,3158310911,CH 3158310912,3158312959,FI 3158312960,3158315007,AZ 3158315008,3158317055,DE @@ -54421,13 +58232,23 @@ 3158458368,3158474751,GB 3158474752,3158507519,OM 3158507520,3158573055,FI -3158573056,3158630399,RU +3158573056,3158581247,RU +3158581248,3158589439,DE +3158589440,3158615039,RU +3158615040,3158616063,GB +3158616064,3158630399,RU 3158630400,3158638591,PL 3158638592,3158704127,LT 3158704128,3158835199,KW 3158835200,3158851583,IQ 3158851584,3158859775,RU -3158859776,3158861567,NL +3158859776,3158860031,NL +3158860032,3158860287,GB +3158860288,3158860543,NL +3158860544,3158860799,GB +3158860800,3158861055,NL +3158861056,3158861311,UA +3158861312,3158861567,IE 3158861568,3158861823,AE 3158861824,3158862079,IN 3158862080,3158862335,GB @@ -54446,7 +58267,8 @@ 3158865408,3158865663,AL 3158865664,3158865919,CY 3158865920,3158866943,IT -3158866944,3158867455,NL +3158866944,3158867199,DE +3158867200,3158867455,HU 3158867456,3158867711,DE 3158867712,3158867967,NL 3158867968,3158884351,AZ @@ -54614,38 +58436,27 @@ 3161620480,3161636863,DK 3161636864,3161653247,RU 3161653248,3161669631,LU -3161669632,3161669887,FR -3161669888,3161670143,RE -3161670144,3161670399,FR -3161670400,3161670655,RE -3161670656,3161671167,FR +3161669632,3161669887,RE +3161669888,3161671167,FR 3161671168,3161671423,RE -3161671424,3161672063,FR -3161672064,3161672191,RE -3161672192,3161672703,FR -3161672704,3161672959,RE -3161672960,3161673471,FR -3161673472,3161673983,RE -3161673984,3161675775,FR -3161675776,3161676031,RE -3161676032,3161677823,FR +3161671424,3161672959,FR +3161672960,3161673215,RE +3161673216,3161673471,FR +3161673472,3161673727,RE +3161673728,3161677823,FR 3161677824,3161678079,MQ -3161678080,3161678335,FR -3161678336,3161679359,MQ -3161679360,3161679615,FR -3161679616,3161679871,MQ +3161678080,3161678847,FR +3161678848,3161679103,MQ +3161679104,3161679871,FR 3161679872,3161680639,GP 3161680640,3161681151,FR -3161681152,3161681919,GP -3161681920,3161682175,GF -3161682176,3161682431,FR +3161681152,3161681663,GP +3161681664,3161682431,FR 3161682432,3161682943,GF -3161682944,3161683967,MQ -3161683968,3161684223,FR -3161684224,3161684479,MQ -3161684480,3161685503,FR -3161685504,3161685759,MQ -3161685760,3161686015,FR +3161682944,3161683711,MQ +3161683712,3161684735,FR +3161684736,3161684991,MQ +3161684992,3161686015,FR 3161686016,3161702399,UA 3161702400,3161718783,AM 3161718784,3161735167,PL @@ -54655,15 +58466,17 @@ 3161784320,3161800703,FI 3161800704,3161817087,SA 3161817088,3161833471,PL -3161833472,3161846015,AT -3161846016,3161847039,MK -3161847040,3161849855,AT +3161833472,3161835519,RS +3161835520,3161841663,AT +3161841664,3161845759,RS +3161845760,3161846015,AT +3161846016,3161846783,MK +3161846784,3161849855,AT 3161849856,3161866239,BE 3161866240,3161882623,IR 3161882624,3161899007,DE 3161899008,3161915391,AT 3161915392,3161931775,TR -3161931776,3161948159,SA 3161948160,3161964543,RO 3161964544,3161980927,ES 3161980928,3161989119,SK @@ -54680,18 +58493,14 @@ 3162071040,3162087423,IR 3162087424,3162095615,SK 3162095616,3162103807,GE -3162103808,3162105087,FR -3162105088,3162105855,NL -3162105856,3162106111,FR -3162106112,3162106367,NL -3162106368,3162106623,FR -3162106624,3162107391,NL +3162103808,3162104831,FR +3162104832,3162105343,NL +3162105344,3162105599,FR +3162105600,3162107391,NL 3162107392,3162107647,FR 3162107648,3162108415,NL 3162108416,3162108671,FR -3162108672,3162108927,NL -3162108928,3162109183,FR -3162109184,3162111103,NL +3162108672,3162111103,NL 3162111104,3162111167,FR 3162111168,3162111999,NL 3162112000,3162120191,PL @@ -54734,7 +58543,8 @@ 3162374144,3162382335,BG 3162382336,3162390527,RU 3162390528,3162398719,SE -3162398720,3162406911,BE +3162398720,3162404863,NL +3162404864,3162406911,BE 3162406912,3162415103,IR 3162415104,3162423295,DE 3162423296,3162431487,NO @@ -54754,7 +58564,7 @@ 3162669056,3162681343,RU 3162681344,3162682367,UA 3162682368,3162682879,RU -3162682880,3162683135,CZ +3162682880,3162683135,IE 3162683136,3162683391,ES 3162683392,3162685439,RU 3162685440,3162693631,UA @@ -54778,7 +58588,9 @@ 3163166976,3163167231,FR 3163167232,3163170527,DE 3163170528,3163170559,AE -3163170560,3163186534,DE +3163170560,3163184739,DE +3163184740,3163184740,GR +3163184741,3163186534,DE 3163186535,3163186535,FR 3163186536,3163186673,DE 3163186674,3163186674,FR @@ -54826,7 +58638,9 @@ 3164936192,3164937749,LT 3164937750,3164937750,FR 3164937751,3164938239,LT -3164938240,3164947579,FR +3164938240,3164946727,FR +3164946728,3164946731,NL +3164946732,3164947579,FR 3164947580,3164947583,IT 3164947584,3164949135,FR 3164949136,3164949151,NL @@ -54848,24 +58662,30 @@ 3164953584,3164953599,ES 3164953600,3164954511,FR 3164954512,3164954515,IT -3164954516,3164960439,FR +3164954516,3164959551,FR +3164959552,3164959583,DE +3164959584,3164960263,FR +3164960264,3164960267,ES +3164960268,3164960439,FR 3164960440,3164960443,DE 3164960444,3164960715,FR 3164960716,3164960719,NL -3164960720,3164960843,FR +3164960720,3164960799,FR +3164960800,3164960831,PT +3164960832,3164960843,FR 3164960844,3164960847,NL 3164960848,3164961391,FR 3164961392,3164961395,ES -3164961396,3164961511,FR -3164961512,3164961519,GB -3164961520,3164961551,FR +3164961396,3164961551,FR 3164961552,3164961555,ES 3164961556,3164962471,FR 3164962472,3164962475,ES 3164962476,3164962815,FR 3164962816,3164964863,ES 3164964864,3164966911,FI -3164966912,3164968319,FR +3164966912,3164967231,FR +3164967232,3164967239,ES +3164967240,3164968319,FR 3164968320,3164968447,GB 3164968448,3164968455,FR 3164968456,3164968459,NL @@ -54889,22 +58709,37 @@ 3164974336,3164974463,GB 3164974464,3164974527,FR 3164974528,3164974559,ES -3164974560,3164976143,FR +3164974560,3164974651,FR +3164974652,3164974655,DE +3164974656,3164976143,FR 3164976144,3164976159,BE 3164976160,3164976295,FR 3164976296,3164976303,IT 3164976304,3164995583,FR -3164995584,3165061119,RU +3164995584,3165061119,NL 3165061120,3165126655,SK 3165126656,3165192191,RU 3165192192,3165257727,GE -3165257728,3165323263,RO +3165257728,3165323263,RU 3165323264,3165388799,ES -3165388800,3165417471,RO +3165388800,3165417471,MT 3165417472,3165421567,DE 3165421568,3165425663,IE -3165425664,3165437951,RO -3165437952,3165454335,AT +3165425664,3165429759,GB +3165429760,3165437951,RO +3165437952,3165438207,DK +3165438208,3165439487,AT +3165439488,3165439743,GB +3165439744,3165439999,AT +3165440000,3165440255,JP +3165440256,3165440511,HK +3165440512,3165440767,JP +3165440768,3165442047,AT +3165442048,3165442303,TW +3165442304,3165442559,AU +3165442560,3165442815,KR +3165442816,3165443071,HK +3165443072,3165454335,AT 3165454336,3165519871,RO 3165519872,3165585407,DE 3165585408,3165650943,CZ @@ -54915,8 +58750,10 @@ 3166568448,3166601215,UA 3166601216,3166609407,RU 3166609408,3166633983,UA -3166633984,3166638079,RU -3166638080,3166646271,UA +3166633984,3166639103,RU +3166639104,3166639359,UA +3166639360,3166642175,RU +3166642176,3166646271,UA 3166646272,3166650367,CZ 3166650368,3166654463,UA 3166654464,3166658559,RU @@ -54940,42 +58777,73 @@ 3166697472,3166699519,RO 3166699520,3166961663,DE 3166961664,3167223807,SI -3167223808,3167321095,NL -3167321096,3167321099,DE -3167321100,3167476583,NL -3167476584,3167476591,DE -3167476592,3167748095,NL +3167223808,3167748095,NL 3167748096,3167762431,RO 3167762432,3167764479,MD -3167764480,3167772671,RO +3167764480,3167772671,IR 3167772672,3167773695,MD -3167773696,3167774719,RO +3167773696,3167774207,RO +3167774208,3167774463,SG +3167774464,3167774719,RO 3167774720,3167775743,MD 3167775744,3167776511,RO 3167776512,3167776767,GB 3167776768,3167777791,MD 3167777792,3167778815,RO 3167778816,3167780863,MD -3167780864,3167797247,RO +3167780864,3167784959,RO +3167784960,3167797247,IR 3167797248,3167798271,MD 3167798272,3167799295,RO -3167799296,3167803391,MD -3167803392,3167813631,RO +3167799296,3167800319,MD +3167800320,3167801343,RO +3167801344,3167803391,MD +3167803392,3167805439,RO +3167805440,3167813631,IR 3167813632,3167815679,MD -3167815680,3167868927,RO +3167815680,3167825919,RO +3167825920,3167830015,NL +3167830016,3167834111,RO +3167834112,3167838207,IT +3167838208,3167842303,RO +3167842304,3167843327,ES +3167843328,3167846399,RO +3167846400,3167852543,IR +3167852544,3167853055,RO +3167853056,3167853567,IR +3167853568,3167854591,RO +3167854592,3167866879,IR +3167866880,3167868927,RO 3167868928,3167879167,MD 3167879168,3167895551,DE -3167895552,3167938559,RO +3167895552,3167899647,IR +3167899648,3167902719,RO +3167902720,3167902975,BE +3167902976,3167903231,NL +3167903232,3167911935,RO +3167911936,3167932415,IR +3167932416,3167934463,RO +3167934464,3167935487,ES +3167935488,3167936511,PL +3167936512,3167938559,RO 3167938560,3167939583,MD 3167939584,3167940607,RO 3167940608,3167943679,MD 3167943680,3167944447,RO 3167944448,3167944703,GB -3167944704,3167987711,RO +3167944704,3167948799,IR +3167948800,3167951359,RO +3167951360,3167951615,SG +3167951616,3167961087,RO +3167961088,3167985663,IR +3167985664,3167987711,RO 3167987712,3167989759,MD -3167989760,3168005887,RO +3167989760,3167993855,RO +3167993856,3168002047,IR +3168002048,3168005887,RO 3168005888,3168006143,NL -3168006144,3168010239,RO +3168006144,3168008191,SE +3168008192,3168010239,RO 3168010240,3168011263,MD 3168011264,3168012287,RO 3168012288,3168014335,MD @@ -54983,12 +58851,17 @@ 3168016384,3168018431,MD 3168018432,3168020479,RO 3168020480,3168022527,MD -3168022528,3168038911,RO +3168022528,3168034815,IR +3168034816,3168038911,RO 3168038912,3168039935,MD 3168039936,3168040959,BE 3168040960,3168050431,RO 3168050432,3168050687,MD -3168050688,3168081919,RO +3168050688,3168063487,RO +3168063488,3168073727,IR +3168073728,3168077823,RO +3168077824,3168079871,ES +3168079872,3168081919,RO 3168081920,3168083967,FR 3168083968,3168084991,RO 3168084992,3168086015,MD @@ -54996,35 +58869,50 @@ 3168088064,3168089087,RO 3168089088,3168090111,MD 3168090112,3168092159,ES -3168092160,3168096255,RO +3168092160,3168096255,IR 3168096256,3168100351,MD -3168100352,3168129023,RO +3168100352,3168111615,RO +3168111616,3168112639,FR +3168112640,3168124927,RO +3168124928,3168126975,IR +3168126976,3168129023,RO 3168129024,3168130047,MD -3168130048,3168132095,RO +3168130048,3168131583,RO +3168131584,3168131839,SG +3168131840,3168132095,RO 3168132096,3168133119,MD 3168133120,3168136191,RO 3168136192,3168137215,MD -3168137216,3168138239,RO +3168137216,3168137983,RO +3168137984,3168138239,NL 3168138240,3168139263,MD 3168139264,3168156671,RO 3168156672,3168157695,MD -3168157696,3168165887,RO +3168157696,3168161791,IR +3168161792,3168165119,RO +3168165120,3168165375,DE +3168165376,3168165887,RO 3168165888,3168166911,MD -3168166912,3168169983,RO +3168166912,3168167935,FR +3168167936,3168169983,RO 3168169984,3168172031,ES 3168172032,3168176127,RO 3168176128,3168177151,MD 3168177152,3168178175,RO 3168178176,3168179199,MD -3168179200,3168191999,RO +3168179200,3168182271,RO +3168182272,3168190463,IR +3168190464,3168191999,RO 3168192000,3168192255,GB 3168192256,3168192511,RO 3168192512,3168194559,MD 3168194560,3168199679,RO 3168199680,3168200703,MD -3168200704,3168202751,RO +3168200704,3168202751,IR 3168202752,3168203775,ES -3168203776,3168267263,RO +3168203776,3168215551,RO +3168215552,3168215807,SG +3168215808,3168267263,RO 3168267264,3168269311,MD 3168269312,3168271359,RO 3168271360,3168272383,MD @@ -55060,9 +58948,7 @@ 3169648640,3169714175,MD 3169714176,3169779711,FI 3169779712,3169845247,UA -3169845248,3169851391,RO -3169851392,3169853439,MD -3169853440,3169854463,RO +3169845248,3169854463,RO 3169854464,3169855487,IR 3169855488,3169863167,RO 3169863168,3169863423,MD @@ -55071,14 +58957,20 @@ 3169864704,3169869823,RO 3169869824,3169878015,MD 3169878016,3169882111,RO -3169882112,3169886207,MD -3169886208,3169894399,RO -3169894400,3169895423,MD +3169882112,3169886207,SE +3169886208,3169894399,GB +3169894400,3169895423,ES 3169895424,3169896447,RO 3169896448,3169898495,ES -3169898496,3169927423,RO +3169898496,3169899263,RO +3169899264,3169899519,SG +3169899520,3169927423,RO 3169927424,3169927679,NL -3169927680,3169976319,RO +3169927680,3169951743,RO +3169951744,3169955839,SE +3169955840,3169960191,RO +3169960192,3169960447,NL +3169960448,3169976319,RO 3169976320,3170111487,RU 3170111488,3170115583,MD 3170115584,3170119679,RU @@ -55099,14 +58991,22 @@ 3170295808,3170303999,RU 3170304000,3170312191,SY 3170312192,3170320383,RU -3170320384,3170328575,JO +3170320384,3170327593,JO +3170327594,3170327594,US +3170327595,3170328575,JO 3170328576,3170336767,UA -3170336768,3170369535,RO +3170336768,3170338815,RO +3170338816,3170344959,ES +3170344960,3170347007,RO +3170347008,3170349055,ES +3170349056,3170369535,RO 3170369536,3170500607,SA 3170500608,3170631679,PT 3170631680,3170664447,PL 3170664448,3170697215,HR -3170697216,3170729983,IR +3170697216,3170717695,IR +3170717696,3170720767,BG +3170720768,3170729983,IR 3170729984,3170762751,AZ 3170762752,3170795519,RU 3170795520,3170828287,BG @@ -55153,7 +59053,10 @@ 3187910656,3187914751,CL 3187914752,3187916799,BO 3187916800,3187933183,CO -3187933184,3187935519,GT +3187933184,3187933311,HN +3187933312,3187933341,GT +3187933342,3187933342,HN +3187933343,3187935519,GT 3187935520,3187935527,HN 3187935528,3187935607,GT 3187935608,3187935615,HN @@ -55161,23 +59064,41 @@ 3187936048,3187936063,HN 3187936064,3187936711,GT 3187936712,3187936719,HN -3187936720,3187940351,GT -3187940352,3187940607,HN -3187940608,3187940963,GT +3187936720,3187937799,GT +3187937800,3187937807,HN +3187937808,3187939847,GT +3187939848,3187939855,HN +3187939856,3187940479,GT +3187940480,3187940543,HN +3187940544,3187940963,GT 3187940964,3187940967,HN -3187940968,3187943055,GT +3187940968,3187941207,GT +3187941208,3187941215,HN +3187941216,3187943055,GT 3187943056,3187943063,HN 3187943064,3187943127,GT 3187943128,3187943135,HN -3187943136,3187945971,GT +3187943136,3187943399,GT +3187943400,3187943403,HN +3187943404,3187944671,GT +3187944672,3187944679,HN +3187944680,3187944773,GT +3187944774,3187944774,HN +3187944775,3187945971,GT 3187945972,3187945975,HN 3187945976,3187946111,GT 3187946112,3187946239,HN -3187946240,3187946639,GT +3187946240,3187946495,GT +3187946496,3187946511,HN +3187946512,3187946639,GT 3187946640,3187946647,HN 3187946648,3187947983,GT 3187947984,3187947987,HN -3187947988,3187948799,GT +3187947988,3187948031,GT +3187948032,3187948159,HN +3187948160,3187948479,GT +3187948480,3187948543,HN +3187948544,3187948799,GT 3187948800,3187948927,HN 3187948928,3187949567,GT 3187949568,3187950126,BQ @@ -55212,7 +59133,7 @@ 3188137184,3188146175,AR 3188146176,3188170751,CO 3188170752,3188174847,CR -3188174848,3188178943,AR +3188174848,3188178943,BR 3188178944,3188187135,CR 3188187136,3188203519,AR 3188203520,3188207615,DO @@ -55221,14 +59142,14 @@ 3188228096,3188236287,PE 3188236288,3188237311,PA 3188237312,3188239359,VE -3188239360,3188240383,PE +3188239360,3188239615,BR +3188239616,3188240383,PE 3188240384,3188241407,CO 3188241408,3188242431,EC 3188242432,3188244479,AR 3188244480,3188260863,CO 3188260864,3188269055,AR -3188269056,3188269183,VE -3188269184,3188269311,MX +3188269056,3188269311,MX 3188269312,3188269439,VE 3188269440,3188269567,CO 3188269568,3188269823,MX @@ -55236,7 +59157,7 @@ 3188270080,3188270335,MX 3188270336,3188270847,VE 3188270848,3188271103,BR -3188271104,3188273151,VE +3188271104,3188273151,MX 3188273152,3188275199,PA 3188275200,3188277247,CL 3188277248,3188293631,CO @@ -55254,11 +59175,17 @@ 3188473856,3188482047,PE 3188482048,3188490239,AR 3188490240,3188498431,CO -3188498432,3188513407,AR +3188498432,3188512127,AR +3188512128,3188512255,US +3188512256,3188513407,AR 3188513408,3188513535,US -3188513536,3188517119,AR +3188513536,3188516095,AR +3188516096,3188516223,US +3188516224,3188517119,AR 3188517120,3188517247,US -3188517248,3188518271,AR +3188517248,3188517759,AR +3188517760,3188517887,US +3188517888,3188518271,AR 3188518272,3188518399,US 3188518400,3188523007,AR 3188523008,3188539391,CO @@ -55313,42 +59240,43 @@ 3191108960,3191108991,CO 3191108992,3191109119,PE 3191109120,3191109631,MX -3191109632,3191111679,PE +3191109632,3191110655,PE +3191110656,3191111167,MX +3191111168,3191111679,PE 3191111680,3191128063,PY 3191128064,3191132159,EC 3191132160,3191136255,AR 3191136256,3191144447,DO 3191144448,3191152639,SV 3191152640,3191155711,NI -3191155712,3191156735,SV +3191155712,3191156223,SV +3191156224,3191156735,NI 3191156736,3191169023,HN 3191169024,3191193599,SV 3191193600,3191209983,HN 3191209984,3191275519,CL 3191275520,3191341055,AR -3191341056,3191405951,GT -3191405952,3191406335,SV +3191341056,3191406079,GT +3191406080,3191406335,SV 3191406336,3191406591,GT 3191406592,3191439359,SV 3191439360,3191455743,EC 3191455744,3191472127,AR 3191472128,3191603199,TT -3191603200,3191607807,CO +3191603200,3191603519,CO +3191603520,3191603583,PR +3191603584,3191607807,CO 3191607808,3191608319,CL 3191608320,3191610623,CO -3191610624,3191610879,PE -3191610880,3191611391,CO +3191610624,3191611135,PE +3191611136,3191611391,CO 3191611392,3191619583,VE -3191619584,3191624703,CL -3191624704,3191624959,CO -3191624960,3191626239,CL -3191626240,3191626495,CO -3191626496,3191633663,CL -3191633664,3191633919,CO -3191633920,3191635967,CL -3191635968,3191647743,CO -3191647744,3191647807,AR -3191647808,3191648255,CO +3191619584,3191635967,CL +3191635968,3191637759,CO +3191637760,3191638015,AR +3191638016,3191647743,CO +3191647744,3191647935,AR +3191647936,3191648255,CO 3191648256,3191649791,US 3191649792,3191650303,CO 3191650304,3191650815,US @@ -55358,27 +59286,25 @@ 3191670016,3191670271,AR 3191670272,3191670783,CO 3191670784,3191672831,CL -3191672832,3191674879,CO -3191674880,3191676927,CL +3191672832,3191673855,CO +3191673856,3191676927,CL 3191676928,3191677951,US 3191677952,3191678207,AR 3191678208,3191678719,US 3191678720,3191678975,AR -3191678976,3191680255,US -3191680256,3191680511,AR -3191680512,3191680767,US +3191678976,3191680767,US 3191680768,3191681279,AR 3191681280,3191681535,US -3191681536,3191683327,AR -3191683328,3191684607,US -3191684608,3191684863,AR -3191684864,3191685119,US +3191681536,3191682303,AR +3191682304,3191682559,US +3191682560,3191683071,AR +3191683072,3191685119,US 3191685120,3191685631,AR 3191685632,3191685887,US 3191685888,3191687167,AR 3191687168,3191688703,CO 3191688704,3191693311,US -3191693312,3191695871,CO +3191693312,3191695871,CL 3191695872,3191696127,US 3191696128,3191696383,CO 3191696384,3191701503,US @@ -55389,26 +59315,28 @@ 3191704576,3191704831,CO 3191704832,3191705343,US 3191705344,3191705599,CO -3191705600,3191705855,US -3191705856,3191706111,CO -3191706112,3191706623,US -3191706624,3191719935,CO -3191719936,3191721215,AR -3191721216,3191721471,CO -3191721472,3191722495,AR -3191722496,3191725055,CO +3191705600,3191706623,US +3191706624,3191707647,CO +3191707648,3191719935,CL +3191719936,3191722495,AR +3191722496,3191725055,CL 3191725056,3191725311,AR -3191725312,3191726079,CO +3191725312,3191725567,CL +3191725568,3191726079,CO 3191726080,3191726335,AR -3191726336,3191726591,CO +3191726336,3191726591,CL 3191726592,3191726847,AR -3191726848,3191727103,CO +3191726848,3191727103,CL 3191727104,3191727359,AR -3191727360,3191730431,CO +3191727360,3191729919,CO +3191729920,3191730431,CL 3191730432,3191730687,AR 3191730688,3191730943,CO 3191730944,3191731199,AR -3191731200,3191732479,CO +3191731200,3191731711,CO +3191731712,3191731967,AR +3191731968,3191732223,CO +3191732224,3191732479,CL 3191732480,3191732735,AR 3191732736,3191734079,CO 3191734080,3191734143,US @@ -55428,31 +59356,39 @@ 3193438208,3193450495,CW 3193450496,3193450751,SR 3193450752,3193569279,CW -3193569280,3193579263,CO +3193569280,3193573087,CO +3193573088,3193573095,US +3193573096,3193579263,CO 3193579264,3193579519,EC 3193579520,3193582591,CO 3193582592,3193583103,EC -3193583104,3193595391,CO +3193583104,3193592319,CO +3193592320,3193592575,EC +3193592576,3193595391,CO 3193595392,3193595647,EC -3193595648,3193599999,CO -3193600000,3193600255,EC -3193600256,3193605375,CO -3193605376,3193605631,EC +3193595648,3193599743,CO +3193599744,3193600255,EC +3193600256,3193604351,CO +3193604352,3193605631,EC 3193605632,3193606143,CO 3193606144,3193606399,EC 3193606400,3193606655,CO 3193606656,3193607167,EC 3193607168,3193617151,CO 3193617152,3193617407,EC -3193617408,3193622527,CO +3193617408,3193621759,CO +3193621760,3193622015,EC +3193622016,3193622527,CO 3193622528,3193623551,EC 3193623552,3193625599,CO 3193625600,3193625855,EC 3193625856,3193626111,CO 3193626112,3193626623,US -3193626624,3193629439,CO -3193629440,3193629695,EC -3193629696,3193634815,CO +3193626624,3193628927,CO +3193628928,3193629695,EC +3193629696,3193630975,CO +3193630976,3193631231,EC +3193631232,3193634815,CO 3193634816,3193700351,CL 3193700352,3193722751,HN 3193722752,3193722879,GT @@ -55463,16 +59399,12 @@ 3193735168,3193735679,US 3193735680,3193736191,AR 3193736192,3193736447,US -3193736448,3193737471,AR -3193737472,3193739007,US +3193736448,3193737215,AR +3193737216,3193739007,US 3193739008,3193739263,AR -3193739264,3193739519,US -3193739520,3193739775,AR -3193739776,3193740287,US -3193740288,3193741311,AR -3193741312,3193741823,US -3193741824,3193742079,AR -3193742080,3193742335,US +3193739264,3193740543,US +3193740544,3193741311,AR +3193741312,3193742335,US 3193742336,3193742591,AR 3193742592,3193742847,US 3193742848,3193743231,AR @@ -55481,39 +59413,43 @@ 3193743744,3193743871,US 3193743872,3193743999,AR 3193744000,3193744127,US -3193744128,3193745279,AR -3193745280,3193745407,US +3193744128,3193744639,AR +3193744640,3193744895,US +3193744896,3193745151,AR +3193745152,3193745407,US 3193745408,3193746431,AR 3193746432,3193746687,US 3193746688,3193746751,AR 3193746752,3193746815,US 3193746816,3193746879,AR -3193746880,3193746943,US -3193746944,3193747199,AR -3193747200,3193747455,US +3193746880,3193747455,US 3193747456,3193747583,AR -3193747584,3193748223,US -3193748224,3193748863,AR -3193748864,3193748991,US -3193748992,3193749247,AR -3193749248,3193749759,US -3193749760,3193750015,AR -3193750016,3193750271,US +3193747584,3193748479,US +3193748480,3193748863,AR +3193748864,3193750271,US 3193750272,3193750527,AR 3193750528,3193750783,US -3193750784,3193751807,AR -3193751808,3193752319,US -3193752320,3193752831,AR +3193750784,3193751039,AR +3193751040,3193751295,US +3193751296,3193751807,AR +3193751808,3193752703,US +3193752704,3193752831,AR 3193752832,3193752959,US 3193752960,3193753087,AR 3193753088,3193753343,US -3193753344,3193754623,AR +3193753344,3193753471,AR +3193753472,3193753599,US +3193753600,3193754623,AR 3193754624,3193754751,US 3193754752,3193755135,AR 3193755136,3193755263,US -3193755264,3193756415,AR +3193755264,3193755647,AR +3193755648,3193755775,US +3193755776,3193756415,AR 3193756416,3193756543,US -3193756544,3193757055,AR +3193756544,3193756799,AR +3193756800,3193756927,US +3193756928,3193757055,AR 3193757056,3193757183,US 3193757184,3193765887,AR 3193765888,3193774079,TT @@ -55544,8 +59480,9 @@ 3194028032,3194044415,AR 3194044416,3194052607,CO 3194052608,3194056703,TT -3194056704,3194058495,CW -3194058496,3194058751,CA +3194056704,3194057727,CW +3194057728,3194057983,CA +3194057984,3194058751,CW 3194058752,3194060799,AR 3194060800,3194068991,CO 3194068992,3194071039,PA @@ -55557,11 +59494,13 @@ 3194126336,3194127359,GT 3194127360,3194129407,PE 3194129408,3194129663,AR -3194129664,3194129671,BR -3194129672,3194130431,AR +3194129664,3194129919,BR +3194129920,3194130431,AR 3194130432,3194134527,BR 3194134528,3194135551,AR -3194135552,3194136575,GT +3194135552,3194136063,GT +3194136064,3194136319,BR +3194136320,3194136575,GT 3194136576,3194137087,BR 3194137088,3194140159,AR 3194140160,3194142719,CR @@ -55621,7 +59560,10 @@ 3194596352,3194597375,HT 3194597376,3194601471,AR 3194601472,3194602495,CW -3194602496,3194613759,AR +3194602496,3194610943,AR +3194610944,3194611199,CO +3194611200,3194613503,AR +3194613504,3194613759,CL 3194613760,3194617855,PE 3194617856,3194626047,NI 3194626048,3194630143,AR @@ -55639,8 +59581,8 @@ 3194659840,3194660351,US 3194660352,3194661119,AR 3194661120,3194661375,US -3194661376,3194662143,AR -3194662144,3194662399,US +3194661376,3194661887,AR +3194661888,3194662399,US 3194662400,3194663167,AR 3194663168,3194664447,US 3194664448,3194664959,AR @@ -55699,7 +59641,9 @@ 3194925056,3194929151,AR 3194929152,3194937343,EC 3194937344,3194945535,AR -3194945536,3194953727,GT +3194945536,3194953215,GT +3194953216,3194953343,NI +3194953344,3194953727,GT 3194953728,3194959871,AR 3194959872,3194961919,US 3194961920,3194970111,EC @@ -55735,7 +59679,22 @@ 3195067392,3195068415,CR 3195068416,3195076607,CW 3195076608,3195084799,CL -3195084800,3195092991,CR +3195084800,3195085055,CR +3195085056,3195086335,NI +3195086336,3195087359,CR +3195087360,3195087615,NI +3195087616,3195088127,CR +3195088128,3195088639,NI +3195088640,3195088895,CR +3195088896,3195089919,NI +3195089920,3195090431,CR +3195090432,3195090687,NI +3195090688,3195091199,CR +3195091200,3195091455,NI +3195091456,3195092223,CR +3195092224,3195092479,NI +3195092480,3195092735,CR +3195092736,3195092991,NI 3195092992,3195097087,DO 3195097088,3195099135,CR 3195099136,3195100159,GT @@ -55747,7 +59706,8 @@ 3195138048,3195139071,DO 3195139072,3195140095,CL 3195140096,3195142143,CR -3195142144,3195150335,VE +3195142144,3195142399,MX +3195142400,3195150335,VE 3195150336,3195158527,CL 3195158528,3195199487,AR 3195199488,3195201535,PY @@ -55769,9 +59729,7 @@ 3195256832,3195265023,AR 3195265024,3195273215,CO 3195273216,3195535359,PE -3195535360,3195536639,SV -3195536640,3195536895,FR -3195536896,3195543551,SV +3195535360,3195543551,SV 3195547648,3195551743,AR 3195551744,3195559935,EC 3195559936,3195568127,AR @@ -55804,12 +59762,16 @@ 3195721728,3195723775,VE 3195723776,3195731967,AR 3195731968,3195736063,EC -3195736064,3195737087,BQ +3195736064,3195736575,BQ +3195736576,3195736831,AI +3195736832,3195737087,BQ 3195737088,3195738111,CW 3195738112,3195740159,HN 3195740160,3195740415,US 3195740416,3195740927,PA -3195740928,3195741951,US +3195740928,3195741055,US +3195741056,3195741087,HN +3195741088,3195741951,US 3195741952,3195744255,PA 3195744256,3195748351,EC 3195748352,3195752447,CL @@ -55828,7 +59790,9 @@ 3195805696,3195807743,NI 3195807744,3195808639,BZ 3195808640,3195808767,CO -3195808768,3195809791,BZ +3195808768,3195809151,BZ +3195809152,3195809279,US +3195809280,3195809791,BZ 3195809792,3195811839,PE 3195811840,3195813887,AR 3195813888,3195822079,DO @@ -55898,7 +59862,8 @@ 3199729664,3199762431,NI 3199762432,3199778815,CO 3199778816,3199779839,AR -3199779840,3199780863,CR +3199779840,3199780735,CR +3199780736,3199780863,US 3199780864,3199782911,CO 3199782912,3199784959,AR 3199784960,3199785983,EC @@ -55921,7 +59886,9 @@ 3200614400,3200647167,AR 3200647168,3201302527,VE 3201302528,3201433599,CL -3201433600,3201441791,AR +3201433600,3201435135,AR +3201435136,3201435263,US +3201435264,3201441791,AR 3201441792,3201442047,US 3201442048,3201499135,AR 3201499136,3201515519,CL @@ -55954,14 +59921,18 @@ 3201867776,3201869823,PE 3201869824,3201869855,AR 3201869856,3201869871,PE -3201869872,3201871743,AR +3201869872,3201869919,AR +3201869920,3201869935,PE +3201869936,3201871743,AR 3201871744,3201871807,PE -3201871808,3201871871,AR +3201871808,3201871811,AR +3201871812,3201871815,PE +3201871816,3201871871,AR 3201871872,3201875967,PE 3201875968,3201880063,CO 3201880064,3201884159,EC -3201884160,3201892351,VE -3201892352,3201925119,AR +3201884160,3201894399,VE +3201894400,3201925119,AR 3201925120,3201957887,CL 3201957888,3202088959,PA 3202088960,3202220031,AR @@ -55997,9 +59968,11 @@ 3203556864,3203557119,DO 3203557120,3203561471,CO 3203561472,3203562495,SV -3203562496,3203564031,CO -3203564032,3203564287,PA -3203564288,3203566591,CO +3203562496,3203563775,CO +3203563776,3203564287,PA +3203564288,3203564799,CO +3203564800,3203565055,DO +3203565056,3203566591,CO 3203566592,3203566847,PA 3203566848,3203568639,CO 3203568640,3203569663,SV @@ -56018,12 +59991,18 @@ 3210740736,3210742015,BR 3210742016,3210742031,IT 3210742032,3210742047,US -3210742048,3210742271,BR +3210742048,3210742063,BR +3210742064,3210742079,US +3210742080,3210742271,BR 3210742272,3210742527,CL 3210742528,3210742543,KR -3210742544,3210743039,CL +3210742544,3210742567,CL +3210742568,3210742575,US +3210742576,3210743039,CL 3210743040,3210743055,GR -3210743056,3210743295,CL +3210743056,3210743079,CL +3210743080,3210743087,US +3210743088,3210743295,CL 3210743296,3210743551,US 3210743552,3210743567,TH 3210743568,3210743583,US @@ -56036,7 +60015,7 @@ 3210745360,3210745375,US 3210745376,3210745855,CL 3210745856,3210745871,IT -3210745872,3210746367,CL +3210745872,3210746367,BR 3210746368,3210746383,SE 3210746384,3210746879,CL 3210746880,3210746895,CH @@ -56045,8 +60024,8 @@ 3210747904,3210748159,BR 3210748160,3210748175,JP 3210748176,3210748415,BR -3210748416,3210751999,CL -3210752000,3210752255,US +3210748416,3210749951,CL +3210749952,3210752255,US 3210752256,3210755839,CL 3210755840,3210755855,MY 3210755856,3210755871,US @@ -56059,21 +60038,24 @@ 3210764048,3210764063,US 3210764064,3210765055,CL 3210765056,3210765071,SE -3210765072,3210769919,CL +3210765072,3210765311,BR +3210765312,3210769919,CL 3210769920,3210770175,US 3210770176,3210771199,CL 3210771200,3210771215,TH 3210771216,3210772991,CL 3210772992,3210773247,US -3210773248,3210773503,CL +3210773248,3210773503,BR 3210773504,3210773519,PL -3210773520,3210774271,CL +3210773520,3210774015,CL +3210774016,3210774271,BR 3210774272,3210774287,NO -3210774288,3210774783,CL +3210774288,3210774783,BR 3210774784,3210774799,IT -3210774800,3210775295,CL +3210774800,3210775295,BR 3210775296,3210775311,CH -3210775312,3210776319,CL +3210775312,3210775551,BR +3210775552,3210776319,CL 3210776320,3210776575,US 3210776576,3210776831,CL 3210776832,3210777087,US @@ -56093,7 +60075,9 @@ 3210786560,3210786575,GR 3210786576,3210803071,CL 3210803072,3210803087,US -3210803088,3210803327,CL +3210803088,3210803199,CL +3210803200,3210803201,US +3210803202,3210803327,CL 3210803328,3210803455,BR 3210803456,3210805247,CL 3210805248,3210809343,PA @@ -56120,78 +60104,214 @@ 3210926080,3210928127,AR 3210928128,3210936319,NI 3210936320,3211067391,EC -3211067392,3211073023,US +3211067392,3211071487,US +3211071488,3211071999,DE +3211072000,3211073023,US 3211073024,3211073279,CA -3211073280,3211073535,US -3211073536,3211075583,CL +3211073280,3211073791,US +3211073792,3211074047,LT +3211074048,3211075583,NL 3211075584,3211075839,US -3211075840,3211080703,CL +3211075840,3211076095,CL +3211076096,3211076863,LT +3211076864,3211079167,CL +3211079168,3211079423,NL +3211079424,3211079679,CL +3211079680,3211079935,GB +3211079936,3211080703,CL 3211080704,3211080959,NL 3211080960,3211081215,CL 3211081216,3211081727,CH -3211081728,3211083775,CL +3211081728,3211082239,US +3211082240,3211082751,GB +3211082752,3211083007,SG +3211083008,3211083519,US +3211083520,3211083775,HK 3211083776,3211083791,RU -3211083792,3211084287,CL +3211083792,3211083855,CL +3211083856,3211083871,DE +3211083872,3211084031,CL +3211084032,3211084287,DE 3211084288,3211084303,NL -3211084304,3211084671,CL +3211084304,3211084367,CL +3211084368,3211084383,DE +3211084384,3211084559,CL +3211084560,3211084575,DE +3211084576,3211084671,CL 3211084672,3211084799,BY 3211084800,3211084815,AT -3211084816,3211085311,CL +3211084816,3211084879,CL +3211084880,3211084895,DE +3211084896,3211084927,CL +3211084928,3211085055,US +3211085056,3211085071,CL +3211085072,3211085087,DE +3211085088,3211085311,CL 3211085312,3211085327,GB -3211085328,3211085695,CL +3211085328,3211085391,CL +3211085392,3211085407,DE +3211085408,3211085583,CL +3211085584,3211085599,DE +3211085600,3211085695,CL 3211085696,3211085823,GE 3211085824,3211085839,TH -3211085840,3211086095,CL +3211085840,3211085903,CL +3211085904,3211085919,DE +3211085920,3211086095,CL 3211086096,3211086111,US 3211086112,3211086335,CL 3211086336,3211086351,FR -3211086352,3211086847,CL +3211086352,3211086367,DE +3211086368,3211086463,CL +3211086464,3211086591,US +3211086592,3211086607,CL +3211086608,3211086623,DE +3211086624,3211086847,CL 3211086848,3211086863,PL -3211086864,3211087359,CL +3211086864,3211086879,DE +3211086880,3211087119,CL +3211087120,3211087135,DE +3211087136,3211087359,CL 3211087360,3211087375,GB -3211087376,3211087871,CL +3211087376,3211087391,DE +3211087392,3211087631,CL +3211087632,3211087647,DE +3211087648,3211087871,CL 3211087872,3211087887,ES -3211087888,3211088383,CL +3211087888,3211087903,DE +3211087904,3211087999,CL +3211088000,3211088127,US +3211088128,3211088143,CL +3211088144,3211088159,DE +3211088160,3211088383,CL 3211088384,3211088399,BE -3211088400,3211088895,CL +3211088400,3211088415,DE +3211088416,3211088655,CL +3211088656,3211088671,DE +3211088672,3211088895,CL 3211088896,3211088911,DK -3211088912,3211089407,CL +3211088912,3211089407,DE 3211089408,3211089423,GB -3211089424,3211089919,CL +3211089424,3211089439,DE +3211089440,3211089535,CL +3211089536,3211089663,US +3211089664,3211089919,DE 3211089920,3211089935,GB -3211089936,3211090431,CL +3211089936,3211090431,DE 3211090432,3211090447,GR -3211090448,3211090943,CL +3211090448,3211090943,DE 3211090944,3211090959,TR -3211090960,3211091455,CL +3211090960,3211091071,DE +3211091072,3211091199,US +3211091200,3211091215,CL +3211091216,3211091231,DE +3211091232,3211091455,CL 3211091456,3211091471,FI -3211091472,3211091967,CL +3211091472,3211091487,DE +3211091488,3211091727,CL +3211091728,3211091743,DE +3211091744,3211091967,CL 3211091968,3211091983,RU -3211091984,3211092479,CL +3211091984,3211091999,DE +3211092000,3211092239,CL +3211092240,3211092255,DE +3211092256,3211092479,CL 3211092480,3211092495,BE -3211092496,3211092991,CL +3211092496,3211092511,DE +3211092512,3211092607,CL +3211092608,3211092735,US +3211092736,3211092751,CL +3211092752,3211092767,DE +3211092768,3211092991,CL 3211092992,3211093007,SK -3211093008,3211093503,CL +3211093008,3211093023,DE +3211093024,3211093263,CL +3211093264,3211093279,DE +3211093280,3211093503,CL 3211093504,3211093519,HR -3211093520,3211094015,CL +3211093520,3211093535,DE +3211093536,3211093775,CL +3211093776,3211093791,DE +3211093792,3211094015,CL 3211094016,3211094031,CZ -3211094032,3211094527,CL +3211094032,3211094047,DE +3211094048,3211094143,CL +3211094144,3211094271,US +3211094272,3211094287,CL +3211094288,3211094303,DE +3211094304,3211094527,CL 3211094528,3211094543,HR -3211094544,3211095039,CL +3211094544,3211095039,DE 3211095040,3211095055,ES -3211095056,3211095551,CL +3211095056,3211095071,DE +3211095072,3211095311,CL +3211095312,3211095327,DE +3211095328,3211095551,CL 3211095552,3211095567,GB -3211095568,3211096063,CL +3211095568,3211095583,DE +3211095584,3211095679,CL +3211095680,3211095807,US +3211095808,3211096063,DE 3211096064,3211096079,GB -3211096080,3211096575,CL +3211096080,3211096095,DE +3211096096,3211096335,CL +3211096336,3211096351,DE +3211096352,3211096575,CL 3211096576,3211096831,GB -3211096832,3211097087,CL +3211096832,3211096847,CL +3211096848,3211096863,DE +3211096864,3211097087,CL 3211097088,3211097103,DE -3211097104,3211099647,CL +3211097104,3211097151,GB +3211097152,3211097215,CL +3211097216,3211097343,GB +3211097344,3211097359,CL +3211097360,3211097375,DE +3211097376,3211097599,CL +3211097600,3211097855,US +3211097856,3211097871,CL +3211097872,3211097887,DE +3211097888,3211098111,CL +3211098112,3211098367,US +3211098368,3211098383,CL +3211098384,3211098399,DE +3211098400,3211098623,CL +3211098624,3211098879,US +3211098880,3211098895,CL +3211098896,3211098911,DE +3211098912,3211099135,CL +3211099136,3211099391,DE +3211099392,3211099407,CL +3211099408,3211099423,DE +3211099424,3211099647,CL 3211099648,3211099663,DE -3211099664,3211129599,CL -3211129600,3211129855,BR -3211129856,3211132927,CL +3211099664,3211099711,GB +3211099712,3211099775,DE +3211099776,3211099903,GB +3211099904,3211099919,CL +3211099920,3211099935,DE +3211099936,3211101951,CL +3211101952,3211102207,AR +3211102208,3211104767,AU +3211104768,3211106303,CL +3211106304,3211108351,US +3211108352,3211113983,CL +3211113984,3211114239,LU +3211114240,3211114495,SE +3211114496,3211114751,IT +3211114752,3211115007,US +3211115008,3211115263,NO +3211115264,3211115519,BE +3211115520,3211115775,DK +3211115776,3211116287,RU +3211116288,3211116543,ES +3211116544,3211124735,CL +3211124736,3211128831,US +3211128832,3211129343,CL +3211129344,3211129599,SG +3211129600,3211129855,NL +3211129856,3211130879,CL +3211130880,3211132927,US 3211132928,3211137023,CO 3211137024,3211141119,AR 3211141120,3211142143,CL @@ -56307,7 +60427,7 @@ 3220164608,3220168703,IE 3220168704,3220172799,US 3220172800,3221225471,BR -3221225480,3221225727,GB +3221225480,3221225727,US 3221226240,3221226495,US 3221226496,3221227519,KY 3221227520,3221242879,US @@ -56318,7 +60438,9 @@ 3221258240,3221291007,CA 3221291008,3221334269,US 3221334270,3221334270,DZ -3221334271,3221560319,US +3221334271,3221469175,US +3221469176,3221469183,CA +3221469184,3221560319,US 3221560320,3221561087,GB 3221561088,3221562367,US 3221562368,3221562623,SE @@ -56367,7 +60489,18 @@ 3221806080,3221806335,IN 3221806336,3221806591,US 3221806592,3221806847,IN -3221806848,3222011903,US +3221806848,3221808383,US +3221808384,3221808639,IN +3221808640,3221810431,US +3221810432,3221810687,IN +3221810688,3221813759,US +3221813760,3221814015,IN +3221814016,3221815039,US +3221815040,3221815295,IN +3221815296,3221946367,US +3221946368,3221991167,FR +3221991168,3221991423,NZ +3221991424,3222011903,FR 3222011904,3222012159,CA 3222012160,3222012415,NL 3222012416,3222023935,US @@ -56475,8 +60608,7 @@ 3223223296,3223223551,AI 3223223552,3223227903,US 3223227904,3223228159,CA -3223228160,3223228415,US -3223228928,3223229695,US +3223228160,3223229695,US 3223229696,3223229951,CA 3223229952,3223236607,US 3223236608,3223237631,GB @@ -56494,9 +60626,7 @@ 3223262976,3223263231,BE 3223263232,3223263743,US 3223263744,3223264255,NL -3223264256,3223264511,US -3223264512,3223264767,CA -3223264768,3223265023,US +3223264256,3223265023,US 3223265024,3223265279,NL 3223265280,3223266559,US 3223266560,3223266815,AU @@ -56579,16 +60709,12 @@ 3223473232,3223474175,CA 3223474176,3223477247,US 3223477248,3223478271,CA -3223478272,3223480319,US -3223480832,3223481087,US +3223478272,3223481087,US 3223481088,3223481343,SE 3223481344,3223483391,US 3223483392,3223483647,NL -3223483648,3223483903,US -3223484416,3223491071,US -3223491584,3223497215,US -3223497728,3223498751,US -3223499264,3223499519,US +3223483904,3223491071,US +3223491584,3223499519,US 3223499520,3223499775,FI 3223499776,3223500031,US 3223500032,3223503871,CA @@ -56620,8 +60746,7 @@ 3223556608,3223556863,NL 3223556864,3223557375,US 3223557376,3223558655,DE -3223558656,3223559679,US -3223559936,3223563263,US +3223558656,3223563263,US 3223563264,3223563519,NL 3223563520,3223566079,US 3223566080,3223568639,NL @@ -56635,7 +60760,9 @@ 3223578112,3223580671,US 3223580672,3223581951,AT 3223581952,3223582207,US -3223582208,3223582719,NL +3223582208,3223582212,NL +3223582213,3223582213,PT +3223582214,3223582719,NL 3223582720,3223582975,AU 3223582976,3223584767,US 3223584768,3223585023,GB @@ -56684,7 +60811,9 @@ 3223638272,3223638527,GB 3223638528,3223640831,SE 3223640832,3223641087,GB -3223641088,3223646207,SE +3223641088,3223644415,SE +3223644416,3223644671,DE +3223644672,3223646207,SE 3223646208,3223646463,IT 3223646464,3223646975,SE 3223646976,3223647231,IT @@ -56694,38 +60823,36 @@ 3223650048,3223650303,GB 3223650304,3223715839,CH 3223715840,3223781375,DK -3223781376,3223847935,US -3223848448,3223855103,US +3223781376,3223855103,US 3223855104,3223857151,CA -3223857152,3223862783,US -3223863296,3223863807,US +3223857152,3223863807,US +3223863808,3223864319,CA 3223864320,3223864575,US 3223864576,3223864831,AE 3223864832,3223865343,HR 3223865344,3223867391,FI 3223867392,3223867647,GB 3223867648,3223867903,CA +3223867904,3223868415,US 3223868416,3223869439,BM 3223869440,3223871487,US 3223871488,3223873535,CA -3223873536,3223875071,US -3223875584,3223877119,US -3223877632,3223881727,US +3223873536,3223881727,US 3223881728,3223882751,CA +3223882752,3223883263,US 3223883264,3223883519,CA -3223883520,3223898623,US -3223899136,3223902207,US +3223883520,3223902463,US 3223902464,3223902719,CA -3223903232,3223905279,US +3223902720,3223905279,US 3223905280,3223905535,FI 3223905536,3223905791,US 3223906304,3223909375,CA -3223909376,3223910911,US +3223909376,3223911935,US 3223911936,3223912191,CA -3223912192,3223938815,US +3223912448,3223938815,US 3223938816,3223946239,GB 3223946240,3223947519,CH -3223947520,3223947775,US +3223947520,3223948287,US 3223948288,3223948543,NL 3223948544,3223949823,CH 3223949824,3223950079,AU @@ -56734,10 +60861,10 @@ 3223950592,3223953663,CH 3223953664,3223955967,US 3223955968,3223956223,AU -3223956224,3223957759,US +3223956224,3223958015,US 3223958016,3223963135,JP 3223963136,3223963647,US -3223963904,3223964159,CA +3223963648,3223964159,CA 3223964160,3223964415,US 3223964416,3223964671,AU 3223964672,3223965183,US @@ -56765,7 +60892,9 @@ 3223994112,3223994623,DE 3223994880,3223995391,US 3223995392,3223995647,CA -3223995648,3223999487,US +3223995648,3223996415,US +3223996416,3223996927,CA +3223996928,3223999487,US 3224000256,3224000511,NL 3224000512,3224001023,US 3224001024,3224001279,CA @@ -56779,8 +60908,7 @@ 3224006912,3224012031,NL 3224012032,3224014591,US 3224014592,3224014847,NL -3224014848,3224015615,US -3224015872,3224016639,US +3224014848,3224016639,US 3224016640,3224016895,AU 3224016896,3224024063,US 3224024064,3224029695,CH @@ -56789,8 +60917,7 @@ 3224030720,3224030975,CA 3224030976,3224038655,US 3224038656,3224038911,AU -3224038912,3224039679,US -3224039936,3224042751,US +3224038912,3224042751,US 3224042752,3224043007,DE 3224043008,3224084991,US 3224084992,3224087551,SE @@ -56798,7 +60925,7 @@ 3224088064,3224088319,AU 3224088320,3224090879,US 3224090880,3224091135,AU -3224091648,3224091903,US +3224091136,3224091903,US 3224091904,3224092159,AU 3224092160,3224092415,CA 3224092416,3224092671,US @@ -56814,25 +60941,22 @@ 3224097792,3224098047,NL 3224098048,3224099583,US 3224099584,3224099839,CA -3224099840,3224100863,US -3224101120,3224101375,US +3224099840,3224101375,US 3224101376,3224102399,AU +3224102400,3224103423,US 3224103424,3224103679,NL 3224103680,3224104703,US 3224104704,3224104959,AU -3224104960,3224105471,US -3224105728,3224106495,US -3224106752,3224109055,US +3224104960,3224109055,US 3224109056,3224109311,NL 3224109312,3224119551,DE 3224119552,3224126463,FR -3224126976,3224127231,US +3224126464,3224127231,US 3224127232,3224129791,FR 3224129792,3224132351,DE 3224132352,3224170495,US 3224170496,3224173567,SE -3224173568,3224174335,US -3224174592,3224288255,US +3224173568,3224288255,US 3224288256,3224289023,DE 3224289024,3224302335,US 3224302336,3224302591,CA @@ -56840,54 +60964,57 @@ 3224305664,3224367615,JP 3224367616,3224368127,US 3224368128,3224369663,CH -3224369664,3224373247,US +3224369664,3224370431,US +3224370432,3224370687,CA +3224370688,3224370943,US +3224370944,3224371199,CA +3224371200,3224373247,US 3224373248,3224373503,AU -3224373504,3224379135,US +3224373504,3224373759,US +3224373760,3224374015,AU +3224374016,3224379135,US 3224379136,3224379391,NL -3224379392,3224392191,US -3224392704,3224398079,US -3224398336,3224398591,US +3224379392,3224398591,US 3224398592,3224398847,DE 3224398848,3224399103,US 3224399104,3224399615,AU -3224399616,3224407039,US +3224399616,3224407295,US 3224407296,3224407551,CA -3224407808,3224408319,US +3224407552,3224408319,US 3224408320,3224408575,NL -3224408576,3224424959,US -3224425216,3224427007,US -3224427520,3224428543,US +3224408576,3224427519,US +3224427520,3224427775,CA +3224427776,3224428543,US 3224428544,3224428799,NL -3224428800,3224430079,US +3224428800,3224430335,US 3224430336,3224430591,NL -3224430592,3224430847,US +3224430592,3224431103,US 3224431104,3224431359,CA -3224431360,3224431615,US -3224432128,3224432383,US -3224433152,3224433407,US -3224433664,3224434687,US +3224431360,3224434687,US 3224434688,3224434943,AU 3224434944,3224435967,US 3224435968,3224436223,MU -3224436224,3224436479,US +3224436224,3224436735,US 3224436736,3224502271,FI 3224502272,3224567807,JP 3224567808,3224571903,NO -3224571904,3224633343,JP +3224571904,3224580095,JP +3224580096,3224580351,US +3224580352,3224616959,JP +3224616960,3224617471,US +3224617472,3224633343,JP 3224633344,3224646399,DE 3224646400,3224651775,US 3224651776,3224652287,AU -3224652800,3224660991,US +3224652288,3224660991,US 3224660992,3224661247,CA -3224661504,3224662527,US -3224663040,3224663551,US +3224661248,3224663807,US 3224672000,3224672255,US 3224672256,3224672511,NL -3224672512,3224673791,US +3224672512,3224674047,US 3224674048,3224674559,DE 3224674560,3224674815,GB -3224675072,3224675839,US -3224676864,3224677119,US +3224674816,3224677119,US 3224677120,3224678655,AU 3224678656,3224680703,US 3224680704,3224680959,AU @@ -56900,22 +61027,21 @@ 3224692736,3224692991,NL 3224692992,3224694527,US 3224694528,3224694783,CA -3224694784,3224695039,US -3224695808,3224697343,US -3224697856,3224698111,US +3224694784,3224698111,US 3224698112,3224698623,NL -3224698880,3224699135,US +3224698624,3224699135,US 3224699136,3224699647,BE 3224699648,3224725247,US -3224725248,3224725503,DE -3224725504,3224725759,NL +3224725248,3224725759,NL 3224725760,3224739071,US 3224739072,3224739327,FI 3224739328,3224772351,US -3224772352,3224778751,DE +3224772352,3224776447,DE +3224776448,3224776703,GB +3224776704,3224777983,DE +3224777984,3224778239,US 3224779776,3224785151,DE -3224785152,3224787967,US -3224788480,3224791039,US +3224785152,3224791039,US 3224791040,3224791295,NL 3224791296,3224791807,AU 3224791808,3224793343,US @@ -56924,7 +61050,7 @@ 3224793856,3224795391,DK 3224795392,3224795647,CA 3224795648,3224795903,CH -3224796160,3224796415,US +3224795904,3224796415,US 3224796416,3224797439,DE 3224797440,3224797695,US 3224797696,3224797951,AU @@ -56932,9 +61058,11 @@ 3224798208,3224798463,NL 3224798464,3224798975,US 3224798976,3224799231,AU +3224799232,3224799487,US 3224799488,3224799743,AU 3224799744,3224799999,US 3224800000,3224800255,NL +3224800256,3224800511,US 3224800512,3224816639,FR 3224816640,3224816895,IL 3224816896,3224820735,FR @@ -56942,8 +61070,7 @@ 3224820992,3224821247,DE 3224821248,3224822015,US 3224822016,3224822271,NL -3224822272,3224822527,US -3224822784,3224823039,US +3224822272,3224823039,US 3224823296,3224826367,US 3224826368,3224826623,CA 3224826624,3224826879,US @@ -56952,25 +61079,23 @@ 3224827648,3224827903,AU 3224827904,3224828671,US 3224828672,3224828927,AU -3224829184,3224829439,US +3224828928,3224829439,US 3224829440,3224829695,NL -3224829952,3224834047,US +3224829696,3224834047,US 3224834048,3224834303,SG 3224834304,3224834559,US 3224834560,3224834815,TH 3224834816,3224850175,US 3224850176,3224850431,IN -3224850432,3224850943,US -3224851200,3224851455,US +3224850432,3224851455,US 3224851456,3224851711,NL -3224851968,3224852735,US +3224851712,3224852735,US 3224852736,3224852991,NL -3224852992,3224854527,US -3224854784,3224855039,US +3224852992,3224855039,US 3224855040,3224855551,AU 3224855552,3224855807,US 3224855808,3224856063,IT -3224856064,3224856575,US +3224856064,3224856831,US 3224856832,3224857087,NL 3224857088,3224857855,US 3224857856,3224858111,PL @@ -56981,8 +61106,10 @@ 3224859392,3224859647,NL 3224859648,3224860159,US 3224860160,3224860415,AU -3224860928,3224862719,US +3224860416,3224860671,CA +3224860672,3224862975,US 3224862976,3224863231,NL +3224863232,3224863487,CA 3224863488,3224863743,US 3224863744,3224863999,NL 3224864000,3224870655,US @@ -56991,33 +61118,31 @@ 3224878080,3224878335,NL 3224878336,3224878591,US 3224878592,3224878847,AU +3224878848,3224879359,US 3224879360,3224879615,NL 3224879616,3224879871,CA 3224879872,3224880383,US 3224880384,3224880639,NL 3224880640,3224880895,AU -3224880896,3224882431,US +3224880896,3224882687,US 3224882688,3224882943,CA 3224882944,3224883455,US 3224883456,3224883711,AU 3224883712,3224884223,US 3224884224,3224884479,NL -3224884480,3224884991,US +3224884480,3224885247,US 3224885248,3224885503,CA -3224885760,3224886015,US +3224885504,3224886015,US 3224886016,3224886527,AU 3224886528,3224887295,US 3224887296,3224887551,CA -3224887808,3224889087,US +3224887552,3224889343,US 3224889344,3224889599,AU 3224889600,3224890879,US 3224890880,3224891135,AU -3224891136,3224891647,US -3224892160,3224892415,CA +3224891136,3224892415,US 3224892416,3224892671,NL -3224892928,3224893183,US -3224893440,3224893951,US -3224894464,3224899071,US +3224892672,3224899071,US 3224899072,3224899327,AT 3224899328,3224908543,US 3224908544,3224908799,CA @@ -57034,64 +61159,61 @@ 3225034752,3225035775,BG 3225035776,3225037055,US 3225037056,3225049599,FI -3225050112,3225051135,US -3225052672,3225056767,US -3225057024,3225057535,US +3225049600,3225057535,US 3225057536,3225057791,CA -3225057792,3225060351,US -3225060352,3225061631,AU +3225057792,3225060607,US +3225060608,3225061631,AU +3225061632,3225062399,US 3225062400,3225063423,VC -3225063424,3225064447,US -3225064704,3225075967,US +3225063424,3225076223,US 3225076224,3225076479,CA 3225076480,3225076991,US 3225076992,3225077247,SE -3225077504,3225081087,US +3225077248,3225081087,US 3225081088,3225081343,CA -3225081600,3225082367,US +3225081344,3225082367,US 3225082368,3225082623,NL -3225082880,3225084671,US +3225082624,3225084671,US 3225084672,3225085183,NL 3225085184,3225085439,ES 3225085440,3225089279,US 3225089280,3225089535,CA -3225089536,3225091071,US -3225091584,3225091839,US -3225092096,3225314303,US +3225089536,3225314303,US 3225314304,3225314559,GB -3225314560,3225419775,US -3225420032,3225420287,US +3225314560,3225420799,US 3225420800,3225423871,CA -3225423872,3225424383,US -3225424896,3225426943,US +3225423872,3225426943,US 3225426944,3225427199,NL +3225427200,3225427455,US +3225427456,3225427967,CA 3225427968,3225428991,US -3225429504,3225429759,CA -3225430016,3225431039,CA +3225428992,3225431039,CA 3225431040,3225431551,NL 3225431552,3225434111,US 3225434112,3225436159,CA -3225436160,3225437695,US -3225438208,3225442559,US -3225443328,3225444607,US +3225436160,3225445375,US 3225445376,3225446399,BE 3225446400,3225450495,US 3225450496,3225451263,AG 3225451264,3225451519,MS +3225451520,3225451775,US 3225451776,3225452031,NL +3225452032,3225452543,US 3225452544,3225456639,CA 3225456640,3225459711,US +3225459712,3225459967,CA 3225459968,3225460479,US -3225460480,3225462783,CA -3225462784,3225468927,US -3225468928,3225469951,CA -3225470464,3225470719,US +3225460480,3225460735,CA +3225460736,3225460991,US +3225460992,3225462015,CA +3225462016,3225468927,US +3225468928,3225470463,CA +3225470464,3225471487,US 3225471488,3225471743,NL -3225471744,3225472511,US -3225473024,3225498111,US +3225471744,3225472255,HK +3225472256,3225498367,US 3225498368,3225503487,NL -3225503488,3225505535,US -3225505792,3225506047,US +3225503488,3225506303,US 3225506304,3225508863,AU 3225508864,3225509631,CH 3225509632,3225509887,US @@ -57099,44 +61221,47 @@ 3225510144,3225518591,US 3225518592,3225518847,AU 3225518848,3225519359,NL -3225519872,3225520639,US +3225519360,3225520895,US 3225520896,3225521151,NL 3225521152,3225522175,US 3225522176,3225522943,GB 3225522944,3225524223,US 3225524224,3225524479,VE 3225524480,3225524735,GB -3225525248,3225526271,US +3225524736,3225526271,US 3225526272,3225528319,BB -3225529088,3225529343,US -3225529600,3225530367,US +3225528320,3225528831,US +3225528832,3225529087,VI +3225529088,3225530367,US 3225530368,3225530623,PR -3225530624,3225530879,US -3225531136,3225531647,US +3225530624,3225531903,US 3225531904,3225532159,AU 3225532160,3225535999,CH 3225536000,3225540863,US 3225540864,3225541119,AU 3225541120,3225541375,US -3225541376,3225544703,GB +3225541376,3225543935,GB +3225543936,3225544703,US 3225544704,3225546751,CA -3225546752,3225548543,US +3225546752,3225548799,US 3225548800,3225549055,AU 3225549056,3225549311,US 3225549312,3225549567,AU -3225549568,3225550591,US +3225549568,3225550847,US 3225550848,3225616383,DK +3225616384,3225616639,US 3225616640,3225616895,AU +3225616896,3225617151,US 3225617152,3225617663,NL -3225617920,3225618175,US -3225618432,3225618687,US +3225617664,3225618687,US 3225618688,3225618943,CA -3225619200,3225619455,US +3225618944,3225619455,US 3225619456,3225619711,AU 3225619712,3225624575,US 3225624576,3225625599,CA +3225625600,3225626367,US 3225626368,3225626623,GB -3225626880,3225627391,US +3225626624,3225627391,US 3225627392,3225627647,NL 3225627648,3225627903,US 3225627904,3225628159,CA @@ -57146,14 +61271,11 @@ 3225629184,3225629439,NL 3225629440,3225629695,US 3225629696,3225629951,NL -3225629952,3225630207,US +3225629952,3225630463,US 3225630464,3225630719,NL 3225630720,3225631231,US 3225631232,3225631487,NL -3225631488,3225632767,US -3225633536,3225633791,US -3225634048,3225634815,US -3225635072,3225635583,US +3225631488,3225635839,US 3225635840,3225636095,NL 3225636096,3225636607,US 3225636608,3225636863,NL @@ -57161,40 +61283,40 @@ 3225637888,3225638399,AU 3225638400,3225638655,US 3225638656,3225638911,GB -3225639424,3225640447,US +3225638912,3225640447,US 3225640448,3225640703,NL 3225640704,3225641983,US 3225641984,3225643263,GB 3225643264,3225643775,CA -3225643776,3225649919,US -3225650176,3225650943,US +3225643776,3225650943,US 3225650944,3225651199,GB -3225651200,3225658367,US -3225658624,3225658879,US +3225651200,3225659135,US 3225659136,3225659391,DE 3225659392,3225659647,AU +3225659648,3225659903,US 3225659904,3225660159,DE 3225660160,3225660415,AU -3225660416,3225664511,US -3225664512,3225669887,DE +3225660416,3225664767,US +3225664768,3225669887,DE 3225669888,3225671935,US 3225671936,3225672191,AU 3225672192,3225672447,DE 3225672448,3225672703,US 3225672704,3225673215,NL +3225673216,3225673471,CA 3225673472,3225673727,IE 3225673728,3225679871,US 3225679872,3225680127,AU 3225680128,3225680383,GR -3225680640,3225681151,US -3225681408,3225681663,US +3225680384,3225680639,CA +3225680640,3225681663,US +3225681664,3225681919,CA 3225681920,3225682943,DE 3225682944,3225683199,AT 3225683200,3225687039,DE 3225687040,3225687807,US 3225687808,3225688063,NL -3225688064,3225689343,US -3225689600,3225689855,US +3225688064,3225689855,US 3225689856,3225694975,NL 3225694976,3225695231,PL 3225695232,3225695487,US @@ -57203,26 +61325,26 @@ 3225701376,3225709567,NO 3225709568,3225710079,US 3225710080,3225710591,AU -3225710592,3225711615,US -3225712128,3225715455,US +3225710592,3225715455,US 3225715456,3225715711,CA 3225715712,3225715967,AU 3225715968,3225716991,US 3225716992,3225717247,CA 3225717248,3225717503,MU 3225717504,3225717759,AU -3225717760,3225720063,US +3225717760,3225720575,US 3225720576,3225721343,GB -3225721344,3225722111,US -3225722624,3225723903,US -3225723904,3225725439,DE +3225721344,3225723647,US +3225723648,3225723903,CA +3225723904,3225724159,US +3225724160,3225725439,DE 3225725440,3225725695,GB 3225725696,3225726207,AU 3225726208,3225726463,US 3225726464,3225726719,NL 3225726720,3225726975,US 3225726976,3225727231,NL -3225727232,3225727487,US +3225727232,3225727743,US 3225727744,3225727999,AU 3225728000,3225728511,US 3225728512,3225728767,NL @@ -57230,8 +61352,9 @@ 3225729024,3225729279,CA 3225729280,3225729535,US 3225729536,3225729791,NL -3225729792,3225733887,US -3225734144,3225735167,US +3225729792,3225730047,US +3225730048,3225730303,CA +3225730304,3225735423,US 3225735424,3225735679,PT 3225735680,3225735935,US 3225735936,3225737215,DE @@ -57243,36 +61366,35 @@ 3225739520,3225740543,US 3225740544,3225740799,CA 3225740800,3225741055,NL -3225741056,3225741823,US +3225741056,3225742079,US 3225742080,3225745919,JP 3225745920,3225746687,NL 3225746688,3225746943,US 3225746944,3225747199,NL -3225747456,3225747711,US -3225748480,3225752575,US -3225752832,3225753087,US -3225753600,3225757695,US +3225747200,3225747711,US +3225747712,3225747967,CA +3225747968,3225757695,US 3225757696,3225758719,CA -3225759232,3225759487,US -3225759744,3225763839,US +3225759232,3225763839,US 3225763840,3225764095,BE +3225764096,3225764863,US 3225764864,3225765887,CA +3225765888,3225766399,US 3225766400,3225766655,CA -3225766912,3225773055,US +3225766656,3225769471,US +3225769472,3225769983,CA +3225769984,3225773311,US 3225773312,3225773567,CA -3225774080,3225776383,US +3225773568,3225776639,US +3225776640,3225777151,CA 3225777152,3225777407,AU -3225777408,3225777663,US -3225778176,3225780479,US +3225777408,3225781247,US 3225781248,3225782271,CA -3225782272,3225785343,US -3225785344,3225788415,CA -3225788416,3225795583,US -3225796096,3225796351,US -3225796608,3225806847,US +3225782272,3225785599,US +3225785600,3225788159,CA +3225788160,3225807359,US 3225807360,3225807615,DE -3225807872,3225809919,US -3225810688,3225812991,US +3225807616,3225812991,US 3225812992,3225843711,FR 3225843712,3225847039,US 3225847040,3225847551,NL @@ -57280,8 +61402,7 @@ 3225847808,3225848063,NL 3225848064,3225848831,US 3225848832,3225853951,DE -3225853952,3225854719,US -3225854976,3225857023,US +3225853952,3225857023,US 3225857024,3225857279,CA 3225857280,3225857535,US 3225857536,3225857791,AU @@ -57289,26 +61410,33 @@ 3225858048,3225858559,CA 3225858560,3225858815,US 3225858816,3225859583,JP -3225860096,3225861887,US -3225862144,3225868287,US +3225860096,3225868287,US 3225868288,3225868543,AU 3225868544,3225869055,US 3225869056,3225869311,AU -3225869312,3225870335,US +3225869312,3225869567,CA +3225869568,3225870335,US 3225870336,3225870591,CA 3225870592,3225873663,US 3225873664,3225873919,ZA 3225873920,3225874943,US 3225874944,3225875199,GB -3225875456,3225875967,US -3225876480,3225878271,US -3225878528,3225881343,SE +3225875200,3225878527,US +3225878528,3225880319,SE +3225880320,3225880575,US +3225880576,3225881343,SE 3225881344,3225881599,IT -3225881600,3225885183,SE +3225881600,3225882367,SE +3225882368,3225882623,DE +3225882624,3225882879,SE +3225882880,3225883391,DE +3225883392,3225885183,SE 3225885184,3225885695,AT 3225885696,3225887999,SE 3225888000,3225888255,GB -3225888256,3225905407,SE +3225888256,3225894399,SE +3225894400,3225895423,GB +3225895424,3225905407,SE 3225905408,3225905663,IT 3225905664,3225913855,SE 3225913856,3225914111,DE @@ -57347,72 +61475,73 @@ 3225940992,3225941247,IL 3225941248,3225941503,IT 3225941504,3225942271,SE -3225942272,3225942527,HU +3225942272,3225942527,BE 3225942528,3225944063,SE -3225944064,3226008831,TW -3226008832,3226009343,US -3226009856,3226010879,US +3225944064,3225944831,US +3225944832,3226008831,TW +3226008832,3226010879,US 3226010880,3226011135,CA 3226011136,3226012671,US 3226012672,3226012927,AU -3226012928,3226014207,US +3226012928,3226014463,US 3226014464,3226014975,NL 3226014976,3226015487,AU +3226015488,3226015743,US 3226015744,3226016255,AU 3226016256,3226018303,US 3226018304,3226018559,DE 3226018560,3226021119,CH -3226021376,3226023423,US +3226021120,3226023423,US 3226023680,3226026495,US 3226026496,3226026751,AU -3226026752,3226064383,US -3226064640,3226067455,US +3226026752,3226067455,US 3226067456,3226067711,BE 3226067712,3226068223,US 3226068224,3226068479,NL 3226068480,3226074879,US 3226074880,3226075135,AT -3226075136,3226109951,US -3226110208,3226110719,US +3226075136,3226110719,US 3226110720,3226128639,AU -3226128640,3226140671,US +3226128640,3226140927,US 3226140928,3226141695,CA 3226141696,3226141951,US 3226141952,3226143487,CA +3226143488,3226143743,US 3226143744,3226156543,CA +3226156544,3226156799,US 3226156800,3226157567,CA 3226157568,3226157823,US 3226157824,3226167807,CA -3226168064,3226175487,CA -3226175744,3226175999,US +3226168064,3226175231,CA +3226175232,3226175999,US 3226176000,3226177535,CA 3226177536,3226178559,US 3226178560,3226188543,CA -3226189056,3226189311,CA -3226189568,3226189823,CA -3226189824,3226190847,US -3226191360,3226191615,US +3226188544,3226188799,PR +3226189056,3226189823,CA +3226189824,3226191871,US 3226191872,3226194175,CA +3226194176,3226194431,US 3226194432,3226194687,CA +3226194688,3226194943,US 3226194944,3226201087,CA 3226201088,3226201343,US 3226201344,3226201855,CA -3226201856,3226202111,US 3226202112,3226205439,CA 3226205440,3226205695,AE 3226205696,3226205951,CA -3226206208,3226207231,US +3226205952,3226207743,US 3226207744,3226215423,GB -3226215424,3226236159,US -3226237184,3226237439,US +3226215424,3226237439,US 3226237440,3226237695,AU -3226237696,3226241535,DE +3226237696,3226240255,DE +3226240256,3226240511,US +3226240512,3226241535,DE 3226241536,3226241791,LI 3226241792,3226250495,DE 3226250496,3226251263,US 3226251264,3226251519,DE -3226251520,3226252287,US -3226252544,3226267903,US +3226251520,3226267903,US 3226267904,3226268159,DE 3226268160,3226268415,PT 3226268416,3226268927,AT @@ -57424,8 +61553,7 @@ 3226274560,3226274815,NL 3226274816,3226276095,US 3226276096,3226276351,AU -3226276352,3226276863,US -3226277632,3226283519,US +3226276352,3226283519,US 3226283520,3226291199,CA 3226291200,3226300159,US 3226300416,3226300927,US @@ -57436,10 +61564,8 @@ 3226305536,3226307327,GB 3226307328,3226307583,US 3226307584,3226308095,NL -3226308096,3226317823,US -3226318080,3226318335,US -3226319360,3226319615,US -3226319872,3226366975,US +3226308096,3226308863,US +3226309120,3226366975,US 3226366976,3226367231,CA 3226367232,3226374143,US 3226374144,3226375423,DE @@ -57451,52 +61577,47 @@ 3226393600,3226393855,DE 3226393856,3226397695,US 3226397696,3226400255,DE -3226400256,3226470399,US -3226470656,3226473471,US +3226400256,3226473471,US 3226473472,3226473727,NL 3226473728,3226473983,PT 3226473984,3226474495,US 3226474496,3226474751,CL -3226475264,3226475519,US -3226475776,3226476287,US +3226474752,3226476287,US 3226476288,3226479359,CH -3226479360,3226479871,US +3226479360,3226480127,US 3226480128,3226480383,NL 3226480384,3226481407,US 3226481408,3226481663,NL 3226481664,3226483199,US -3226483968,3226484479,US -3226484736,3226488831,US -3226489088,3226520575,US -3226521344,3226521855,US +3226483968,3226488831,US +3226489088,3226521855,US 3226521856,3226522111,BR 3226522112,3226523135,US -3226523392,3226536191,US +3226523392,3226536959,US 3226536960,3226542079,CA -3226542080,3226546431,US -3226547200,3226548223,CA +3226542080,3226547199,US +3226547200,3226548735,CA 3226548992,3226549247,BE -3226549248,3226550271,NL +3226549504,3226550015,NL +3226550016,3226550783,US 3226551040,3226551807,US +3226551808,3226552319,CA +3226552320,3226552831,VI 3226552832,3226553087,US 3226553344,3226555391,US -3226555648,3226555903,CA -3226556416,3226556671,US -3226557440,3226558463,US -3226558720,3226558975,US -3226559488,3226561535,US +3226555392,3226555903,CA +3226555904,3226561535,US 3226561792,3226562047,NL -3226563072,3226563327,US -3226563584,3226564607,US +3226562048,3226564607,US 3226564864,3226565119,NL 3226565376,3226565631,FI -3226565632,3226569727,US -3226569984,3226570239,US -3226570752,3226574847,US +3226565632,3226574847,US 3226574848,3226575103,FI -3226576384,3226576639,US +3226575104,3226575359,US +3226575360,3226576383,CA +3226576384,3226576895,US 3226576896,3226578943,CA -3226578944,3226579967,US +3226578944,3226580479,US 3226580480,3226581247,FI 3226581248,3226583295,US 3226583552,3226583807,NL @@ -57504,10 +61625,11 @@ 3226584416,3226584447,AU 3226584448,3226591231,US 3226591232,3226592255,CA +3226592256,3226592767,US 3226592768,3226593023,NL +3226593280,3226593791,US 3226593792,3226594047,NL -3226594304,3226598911,US -3226599424,3226625535,US +3226594304,3226625535,US 3226625792,3226626047,US 3226626048,3226626303,CA 3226626304,3226627327,US @@ -57526,6 +61648,7 @@ 3226635520,3226635775,US 3226635776,3226636031,ZA 3226636032,3226636287,AU +3226636288,3226636799,US 3226637056,3226637823,US 3226637824,3226638079,CA 3226638080,3226638335,US @@ -57534,8 +61657,7 @@ 3226639616,3226640127,AT 3226640128,3226640639,US 3226640640,3226640895,AU -3226640896,3226652927,US -3226653696,3226654207,US +3226640896,3226654207,US 3226654208,3226654463,NL 3226654464,3226655743,US 3226655744,3226656255,NL @@ -57550,15 +61672,12 @@ 3226690816,3226691071,CA 3226691072,3226691327,NL 3226691584,3226691839,AU -3226691840,3226693631,US -3226694144,3226695167,US +3226691840,3226695167,US 3226695168,3226695679,AU 3226695680,3226695935,US 3226695936,3226696191,CA 3226696192,3226696703,AU -3226696704,3226698495,US -3226698496,3226698751,CA -3226698752,3226704895,US +3226696704,3226704895,US 3226705152,3226705407,AU 3226705408,3226705919,US 3226705920,3226706175,FR @@ -57584,7 +61703,7 @@ 3226726144,3226727679,US 3226727936,3226728191,US 3226728192,3226728447,CA -3226728448,3226729983,US +3226728448,3226730495,US 3226731008,3226731519,US 3226731776,3226732031,GB 3226732288,3226733567,US @@ -57592,14 +61711,15 @@ 3226733824,3226734079,NL 3226734080,3226734335,US 3226734336,3226734591,NL -3226734592,3226736383,US +3226734592,3226735615,US +3226735872,3226736383,US 3226736896,3226737407,US 3226737408,3226737663,AT 3226737664,3226738175,US 3226738176,3226738431,NL 3226738432,3226738687,US 3226738688,3226739199,NL -3226739712,3226743807,US +3226739200,3226743807,US 3226744576,3226746367,US 3226746368,3226746623,NL 3226746624,3226748927,US @@ -57623,8 +61743,7 @@ 3226775040,3226775295,US 3226775552,3226782463,FI 3226782720,3226783743,FI -3226783744,3226783999,US -3226784256,3226784767,US +3226783744,3226784767,US 3226784768,3226785023,GB 3226785024,3226786559,US 3226786560,3226786815,AU @@ -57696,6 +61815,7 @@ 3226994944,3226995455,NL 3226995456,3226996479,US 3226996992,3226997247,NL +3226997248,3226997759,US 3226998016,3226998527,US 3226998528,3226999039,NL 3226999040,3227005439,US @@ -57703,7 +61823,7 @@ 3227013120,3227013375,AU 3227013376,3227013887,US 3227013888,3227014399,NL -3227014400,3227014655,NZ +3227014400,3227014655,AU 3227014656,3227014911,NL 3227014912,3227017215,US 3227017472,3227017983,NL @@ -57750,7 +61870,7 @@ 3227237120,3227237631,US 3227237632,3227237887,NO 3227237888,3227238143,US -3227238144,3227238399,GB +3227238144,3227238399,NL 3227238400,3227239935,US 3227240192,3227240447,GB 3227240704,3227240959,GB @@ -57841,7 +61961,7 @@ 3227425792,3227427583,DK 3227427584,3227427839,ES 3227427840,3227429119,US -3227429120,3227429375,NZ +3227429120,3227429375,AU 3227429376,3227429887,US 3227429888,3227430143,NL 3227430144,3227430399,US @@ -57921,9 +62041,7 @@ 3227526656,3227526911,ZA 3227526912,3227533311,MU 3227533312,3227534335,US -3227534336,3227539455,MU -3227539456,3227539711,ZA -3227539712,3227541503,MU +3227534336,3227541503,MU 3227541504,3227541759,ZA 3227541760,3227557887,MU 3227557888,3227558911,US @@ -57944,13 +62062,19 @@ 3227722522,3227722522,US 3227722523,3227724031,CA 3227724032,3227724287,US -3227724288,3227748035,CA +3227724288,3227738879,CA +3227738880,3227739135,US +3227739136,3227748035,CA 3227748036,3227748039,US 3227748040,3227751868,CA 3227751869,3227751869,US -3227751870,3227756505,CA +3227751870,3227755775,CA +3227755776,3227756031,US +3227756032,3227756505,CA 3227756506,3227756506,US -3227756507,3227765503,CA +3227756507,3227762655,CA +3227762656,3227762671,US +3227762672,3227765503,CA 3227765504,3227765759,US 3227765760,3227777759,CA 3227777760,3227777763,US @@ -58017,11 +62141,11 @@ 3227834368,3227837439,MX 3227837440,3227837951,BR 3227837952,3227842303,MX -3227842560,3227842815,BR +3227842304,3227842815,BR 3227842816,3227843327,MX -3227843328,3227843583,BR +3227843328,3227844095,BR 3227844096,3227844351,AR -3227844864,3227845119,ES +3227844864,3227845119,NL 3227845120,3227845631,US 3227845632,3227845887,NL 3227846144,3227846655,US @@ -58091,7 +62215,7 @@ 3227934720,3227947519,US 3227947520,3227955711,DE 3227955712,3227964927,US -3227964928,3227965183,GB +3227964928,3227965183,NL 3227965184,3227966975,US 3227967232,3227967487,US 3227967488,3227967999,NL @@ -58163,7 +62287,8 @@ 3228061696,3228061951,AU 3228061952,3228062207,US 3228062208,3228062463,GB -3228062464,3228077055,US +3228062464,3228069631,US +3228069888,3228077055,US 3228077056,3228077311,NL 3228077312,3228077567,US 3228077568,3228077823,NL @@ -58171,7 +62296,7 @@ 3228078848,3228079103,GR 3228079104,3228080639,US 3228080640,3228081151,NL -3228081152,3228081919,US +3228081152,3228082175,US 3228082944,3228083967,US 3228083968,3228084479,NL 3228084480,3228085247,US @@ -58281,8 +62406,7 @@ 3228347392,3228348159,SK 3228348160,3228353279,US 3228353280,3228358399,SE -3228358400,3228361471,US -3228361728,3228362239,US +3228358400,3228362239,US 3228362240,3228362495,AU 3228362496,3228362751,US 3228363008,3228363263,US @@ -58298,7 +62422,8 @@ 3228405504,3228405759,SG 3228405760,3228406015,IN 3228406016,3228406271,US -3228406272,3228407039,FR +3228406272,3228406527,IN +3228406528,3228407039,FR 3228407040,3228420095,DE 3228420608,3228424703,DE 3228424704,3228424959,US @@ -58342,7 +62467,9 @@ 3228531712,3228532223,NO 3228532224,3228532479,US 3228532480,3228532735,NL -3228532736,3228554751,US +3228532736,3228539247,US +3228539248,3228539251,AT +3228539252,3228554751,US 3228555008,3228558591,US 3228558592,3228559103,BR 3228559104,3228564479,US @@ -58380,20 +62507,16 @@ 3228628992,3228630527,US 3228630528,3228630783,NL 3228631040,3228696575,NL -3228696576,3228826371,IL +3228696576,3228714764,IL +3228714765,3228714765,CA +3228714766,3228826371,IL 3228826372,3228826372,US 3228826373,3228830719,IL 3228830720,3228833791,PS 3228833792,3229024255,IL 3229024512,3229024767,US 3229025280,3229058047,US -3229058816,3229061119,US -3229061120,3229062433,CA -3229062434,3229062450,US -3229062451,3229064951,CA -3229064952,3229064955,US -3229064956,3229065215,CA -3229065216,3229092095,US +3229058816,3229092095,US 3229092096,3229093887,AU 3229093888,3229104895,US 3229104896,3229105151,ES @@ -58411,9 +62534,11 @@ 3229160960,3229161471,DE 3229161472,3229161727,SE 3229161728,3229161983,GB -3229161984,3229164543,SE +3229161984,3229164287,SE +3229164288,3229164543,DK 3229164544,3229165055,GB -3229165056,3229167103,SE +3229165056,3229165311,NO +3229165312,3229167103,SE 3229167104,3229167615,IT 3229167616,3229171711,SE 3229171712,3229172223,GB @@ -58421,15 +62546,20 @@ 3229182464,3229182975,GB 3229182976,3229183999,SE 3229184000,3229184511,GB -3229184512,3229195263,SE +3229184512,3229186815,SE +3229186816,3229187327,ES +3229187328,3229187583,SE +3229187584,3229187839,DK +3229187840,3229195263,SE 3229195264,3229196287,DE 3229196288,3229196799,SE 3229196800,3229197311,NL 3229197312,3229197823,SE 3229197824,3229198335,GB -3229198336,3229198847,SE +3229198336,3229198591,SE +3229198592,3229198847,ES 3229198848,3229199103,CH -3229199104,3229199359,AT +3229199104,3229199359,IT 3229199360,3229200383,SE 3229200384,3229200895,GB 3229200896,3229201151,DE @@ -58452,7 +62582,7 @@ 3229264896,3229265919,US 3229265920,3229266175,AU 3229266176,3229266943,US -3229266944,3229267199,NZ +3229266944,3229267199,AU 3229267200,3229272319,US 3229273856,3229274623,US 3229274624,3229274879,AU @@ -58539,7 +62669,9 @@ 3229844736,3229844991,US 3229845248,3229845503,US 3229845504,3229847295,CA -3229847296,3229870335,US +3229847296,3229849599,US +3229849600,3229849855,AU +3229849856,3229870335,US 3229870848,3229874943,US 3229874944,3229875455,AU 3229875456,3229875967,US @@ -58583,9 +62715,7 @@ 3229940736,3229940991,CH 3229940992,3229941247,AU 3229941248,3229941503,US -3229942272,3229942783,US -3229943040,3229943295,US -3229943552,3229944319,US +3229941760,3229944319,US 3229944320,3229944575,AU 3229944576,3229945087,US 3229945344,3229945599,AU @@ -58595,7 +62725,7 @@ 3229947392,3229948927,US 3229948928,3229949183,IT 3229949184,3229949695,US -3229949696,3229949951,NZ +3229949696,3229949951,AU 3229949952,3229950207,NL 3229950208,3229950975,US 3229950976,3229951231,NL @@ -58626,7 +62756,7 @@ 3230004224,3230004479,NL 3230004480,3230004991,US 3230005760,3230006015,MU -3230006016,3230007295,US +3230006016,3230007039,US 3230007296,3230072831,FR 3230072832,3230074623,US 3230074624,3230074879,DE @@ -58719,8 +62849,7 @@ 3230156544,3230164991,FI 3230165504,3230167295,US 3230167552,3230168063,CA -3230168832,3230174463,US -3230175232,3230177791,US +3230168832,3230177791,US 3230177792,3230178303,GB 3230178304,3230178559,CH 3230179328,3230210047,US @@ -58792,15 +62921,13 @@ 3230295040,3230295295,AU 3230295296,3230296319,US 3230296320,3230297343,NO -3230297344,3230299647,SE +3230297344,3230300159,SE 3230301696,3230302207,US -3230302464,3230302719,CA 3230302976,3230307327,US 3230307584,3230309119,US 3230309120,3230309375,NO 3230309376,3230310143,GB -3230310144,3230310655,US -3230310912,3230316287,US +3230310144,3230316287,US 3230316288,3230316543,NL 3230316544,3230316799,US 3230316800,3230317311,CA @@ -58837,9 +62964,12 @@ 3230372864,3230383359,CA 3230383616,3230384127,CA 3230384384,3230387455,CA -3230387712,3230400255,CA +3230387712,3230390015,CA +3230390016,3230390271,US +3230390272,3230400255,CA 3230681088,3230683135,FR -3230787584,3230797311,US +3230787584,3230793727,US +3230793984,3230797311,US 3230797312,3230797567,SG 3230797568,3230823679,US 3230823680,3230823935,NL @@ -58874,7 +63004,7 @@ 3230842112,3230842367,AU 3230842624,3230843135,US 3230843136,3230843391,NL -3230843392,3230844671,US +3230843392,3230844927,US 3230844928,3230845183,AU 3230845184,3230845951,US 3230845952,3230846207,CZ @@ -59233,6 +63363,7 @@ 3231285248,3231291647,US 3231291648,3231291903,NL 3231291904,3231292159,US +3231292160,3231292415,MX 3231292416,3231292927,US 3231292928,3231293183,AU 3231293184,3231294975,US @@ -59247,7 +63378,7 @@ 3231300352,3231300607,US 3231300608,3231301119,NL 3231301120,3231302143,US -3231302144,3231302399,NO +3231302144,3231302399,NL 3231302400,3231302655,US 3231302656,3231303167,AU 3231303168,3231307007,US @@ -59263,11 +63394,16 @@ 3231319040,3231322111,US 3231322112,3231324671,SG 3231325184,3231326207,CA -3231326208,3231352831,US +3231326208,3231349759,US +3231350528,3231352831,US 3231352832,3231358975,CA -3231358976,3231383551,US +3231358976,3231369215,US +3231369216,3231369471,TW +3231369472,3231383551,US 3231383552,3231385599,NO -3231385600,3231477759,US +3231385600,3231444071,US +3231444072,3231444079,CA +3231444080,3231477759,US 3231477760,3231478015,CA 3231478016,3231482879,US 3231482880,3231483135,BE @@ -59312,9 +63448,7 @@ 3231513600,3231514367,US 3231514624,3231515647,NO 3231515648,3231516159,US -3231516672,3231518719,SE -3231518720,3231518975,BR -3231518976,3231519231,SE +3231516672,3231519231,SE 3231519744,3231521791,US 3231522560,3231528959,US 3231528960,3231528991,CA @@ -59367,8 +63501,8 @@ 3231588864,3231589119,GB 3231589120,3231591679,US 3231591680,3231591935,AU -3231591936,3231593983,US -3231593984,3231594495,GB +3231591936,3231594239,US +3231594240,3231594495,GB 3231594496,3231641855,US 3231641856,3231642111,SG 3231642112,3231644927,US @@ -59398,7 +63532,7 @@ 3231673856,3231674111,US 3231674112,3231674367,CA 3231674368,3231675391,US -3231675392,3231675647,BR +3231675392,3231675903,BR 3231675904,3231676159,NL 3231676416,3231677439,NL 3231677440,3231694847,US @@ -59406,7 +63540,7 @@ 3231711232,3231713023,US 3231713024,3231713279,CA 3231713280,3231713791,US -3231713792,3231714047,GB +3231713792,3231714047,NL 3231714048,3231715071,US 3231715072,3231715327,NL 3231715328,3231715583,AU @@ -59429,8 +63563,7 @@ 3231723008,3231723519,US 3231723776,3231724031,US 3231724032,3231724287,BR -3231724288,3231725055,US -3231725312,3231727871,US +3231724288,3231727871,US 3231727872,3231728127,NL 3231728384,3231728639,NL 3231728640,3231729407,US @@ -59441,7 +63574,8 @@ 3231737600,3231738367,US 3231738368,3231738623,NL 3231738624,3231739135,US -3231739136,3231739647,NL +3231739136,3231739391,GB +3231739392,3231739647,NL 3231739648,3231739903,BR 3231739904,3231742719,US 3231742720,3231742975,NL @@ -59468,6 +63602,7 @@ 3231755776,3231756543,PR 3231756544,3231757311,GB 3231757312,3231759359,US +3231759360,3231759615,BR 3231759616,3231760895,US 3231760896,3231761151,GB 3231761152,3231761407,NL @@ -59491,8 +63626,7 @@ 3231800320,3231801343,CN 3231801344,3231809535,CA 3231809536,3231810047,AU -3231810560,3231825919,US -3231825920,3231842303,CA +3231810560,3231842303,US 3231842304,3231843327,RU 3231843328,3231844351,NO 3231844352,3231845375,RU @@ -59571,7 +63705,9 @@ 3232065792,3232066303,GB 3232066304,3232066559,SE 3232066560,3232066815,NO -3232066816,3232079871,SE +3232066816,3232070399,SE +3232070400,3232070655,ES +3232070656,3232079871,SE 3232079872,3232080895,GB 3232080896,3232082687,SE 3232082688,3232083199,GB @@ -59594,11 +63730,16 @@ 3232098304,3232100095,SE 3232100096,3232100351,IE 3232100352,3232101119,GB -3232101120,3232104447,SE +3232101120,3232102143,SE +3232102144,3232102144,DK +3232102145,3232102145,SE +3232102146,3232102399,DK +3232102400,3232104447,SE 3232104448,3232106495,DE 3232107520,3232108543,RU 3232108544,3232112639,DE -3232116736,3232129023,DE +3232116736,3232125183,DE +3232125952,3232129023,DE 3232129024,3232130047,NL 3232130048,3232131071,UA 3232131072,3232133119,DE @@ -59617,7 +63758,6 @@ 3232156160,3232156671,PL 3232157696,3232159743,DE 3232159744,3232160767,PL -3232160768,3232161791,DE 3232163840,3232165887,RU 3232167936,3232168959,DE 3232169216,3232169727,DE @@ -59676,9 +63816,9 @@ 3232724152,3232724159,US 3232724160,3232727039,CA 3232727040,3232759807,US -3232759808,3232772095,SE -3232772096,3232774143,IT -3232774144,3232774911,SE +3232759808,3232765951,SE +3232765952,3232766207,NO +3232766208,3232774911,SE 3232774912,3232775167,IE 3232775168,3232794879,SE 3232794880,3232795135,DE @@ -59771,8 +63911,7 @@ 3233590528,3233590783,PR 3233590784,3233591295,AU 3233591552,3233593599,US -3233593600,3233593855,NZ -3233593856,3233594111,AU +3233593600,3233594111,AU 3233594112,3233594367,NL 3233594368,3233594623,US 3233594624,3233594879,NL @@ -59806,7 +63945,7 @@ 3233625600,3233625855,AU 3233625856,3233626111,NL 3233626112,3233626879,US -3233627136,3233628671,US +3233627136,3233628415,US 3233628672,3233628927,FR 3233628928,3233629439,CA 3233629440,3233629695,GB @@ -59839,7 +63978,7 @@ 3233654272,3233655551,GB 3233655552,3233662975,US 3233663488,3233663999,NL -3233664256,3233665023,US +3233664000,3233665023,US 3233665024,3233666047,AU 3233666048,3233668863,US 3233668864,3233669119,AU @@ -59852,6 +63991,7 @@ 3233677312,3233679103,US 3233679360,3233682431,US 3233682944,3233684991,US +3233684992,3233685247,MX 3233685248,3233685503,BR 3233685760,3233688063,US 3233688576,3233688831,NL @@ -59955,11 +64095,7 @@ 3233808384,3233873919,TW 3233873920,3233874175,US 3233874176,3233874687,AU -3233874688,3233903615,US -3233903616,3233903743,GB -3233903744,3233903807,US -3233903808,3233903871,GB -3233903872,3233926294,US +3233874688,3233926294,US 3233926295,3233926295,MX 3233926296,3233939455,US 3233939456,3234004991,FI @@ -60065,13 +64201,16 @@ 3234232576,3234232831,US 3234232832,3234233087,BR 3234233088,3234238975,US -3234238976,3234239487,MY -3234239488,3234240383,US +3234238976,3234239231,MY +3234239232,3234239327,US +3234239328,3234239329,MY +3234239330,3234240383,US 3234240384,3234240387,IE 3234240388,3234240607,US 3234240608,3234240611,IL 3234240612,3234247167,US -3234247680,3234269695,US +3234247680,3234267135,US +3234267392,3234269695,US 3234270208,3234271231,CA 3234271232,3234275327,PT 3234275328,3234279423,AU @@ -60083,7 +64222,14 @@ 3234316288,3234320383,CA 3234320384,3234332671,US 3234332928,3234334975,US -3234335744,3234349055,US +3234335744,3234338815,US +3234338816,3234339071,CN +3234339072,3234339327,MT +3234339328,3234339583,LB +3234339584,3234339839,PA +3234339840,3234340095,US +3234340096,3234340351,IN +3234340352,3234349055,US 3234349056,3234353151,NZ 3234353152,3234549759,US 3234549760,3234550015,RU @@ -60129,7 +64275,8 @@ 3234726144,3234726399,CA 3234726400,3234726911,US 3234726912,3234727935,CA -3234727936,3234733055,US +3234727936,3234730495,US +3234730752,3234733055,US 3234733056,3234733311,CA 3234733312,3234735103,US 3234735616,3234737407,US @@ -60160,7 +64307,8 @@ 3234781440,3234781951,CA 3234781952,3234782719,US 3234782720,3234783999,IL -3234784000,3234791167,US +3234784000,3234786815,US +3234787328,3234791167,US 3234791424,3234794495,US 3234794752,3234795007,US 3234795008,3234795263,NL @@ -60227,15 +64375,15 @@ 3234861056,3234886143,US 3234886656,3234926847,US 3234927616,3234988031,US -3234988032,3234990847,CA +3234988032,3234991103,CA 3234991104,3234998783,US 3234999296,3235004415,US 3235004416,3235021823,CA 3235021824,3235026943,US -3235026944,3235028991,CA -3235028992,3235045375,US -3235045376,3235046143,CA -3235046144,3235085311,US +3235026944,3235027967,CA +3235027968,3235045375,US +3235045376,3235045887,CA +3235045888,3235085311,US 3235085312,3235086335,CA 3235086336,3235184639,US 3235184640,3235184895,CA @@ -60334,7 +64482,9 @@ 3236102144,3236106239,PH 3236106240,3236140031,US 3236140032,3236142079,CA -3236142080,3236142847,US +3236142080,3236142335,US +3236142336,3236142463,CA +3236142464,3236142847,US 3236142848,3236143005,CA 3236143006,3236143006,US 3236143007,3236143103,CA @@ -60344,8 +64494,15 @@ 3236200448,3236233215,MY 3236233216,3236238591,US 3236239360,3236241407,CA -3236241408,3236302847,US -3236306944,3236364287,US +3236241408,3236291071,US +3236291072,3236291327,GB +3236291328,3236302847,US +3236306944,3236312063,US +3236312064,3236312319,MO +3236312320,3236312575,GH +3236312576,3236312831,GR +3236312832,3236313087,QA +3236313088,3236364287,US 3236364544,3236365567,US 3236365824,3236368127,US 3236368128,3236368383,AU @@ -60368,7 +64525,9 @@ 3236389376,3236392447,US 3236392448,3236392703,CL 3236392704,3236393471,US -3236393472,3236395519,BR +3236393472,3236393983,BR +3236393984,3236395007,CO +3236395008,3236395519,BR 3236395520,3236396799,US 3236396800,3236397055,AU 3236397056,3236398591,US @@ -60381,7 +64540,8 @@ 3236406784,3236407551,AU 3236407552,3236408063,SG 3236408064,3236408319,US -3236408320,3236409343,CA +3236408320,3236409087,CA +3236409088,3236409599,BR 3236409600,3236411135,US 3236411136,3236411391,AU 3236411392,3236412415,US @@ -60475,10 +64635,7 @@ 3236826112,3236827135,CA 3236827136,3236958207,US 3236958208,3236962303,AU -3236962304,3236966143,US -3236966400,3237021695,US -3237021696,3237023743,CA -3237023744,3237038079,US +3236962304,3237038079,US 3237038080,3237038335,CA 3237038336,3237043967,US 3237043968,3237044223,CH @@ -60486,9 +64643,7 @@ 3237046016,3237046271,RO 3237046272,3237047039,US 3237047040,3237047295,FR -3237047296,3237047551,US -3237047552,3237047807,IE -3237047808,3237050111,US +3237047296,3237050111,US 3237050112,3237050367,GB 3237050368,3237051903,US 3237051904,3237052159,TR @@ -60496,9 +64651,7 @@ 3237052288,3237154815,US 3237154816,3237155839,ES 3237155840,3237156863,AU -3237156864,3237163007,US -3237163008,3237167103,DM -3237167104,3237182463,US +3237156864,3237182463,US 3237182464,3237183487,NL 3237183488,3237216255,US 3237216256,3237281791,JP @@ -60509,6 +64662,7 @@ 3237285632,3237287935,US 3237287936,3237288191,CA 3237288192,3237289471,US +3237289472,3237289727,BR 3237289728,3237290495,US 3237291008,3237291263,NZ 3237291264,3237294847,US @@ -60525,8 +64679,7 @@ 3237308672,3237310719,AU 3237310720,3237312767,US 3237312768,3237313023,BO -3237313024,3237317631,US -3237317888,3237319679,US +3237313024,3237319679,US 3237319680,3237319935,MU 3237319936,3237320703,US 3237320704,3237320959,UA @@ -60586,7 +64739,9 @@ 3237634310,3237634310,GB 3237634311,3237647103,US 3237647104,3237647359,AU -3237647360,3237679359,US +3237647360,3237648639,US +3237648640,3237648895,AU +3237648896,3237679359,US 3237679872,3237681663,US 3237681664,3237682943,CA 3237682944,3237684991,US @@ -60621,7 +64776,7 @@ 3237781504,3237785599,CA 3237785600,3237797887,US 3237797888,3237801983,CA -3237806080,3237857535,US +3237801984,3237857535,US 3237858304,3237863423,CA 3237863424,3237867519,US 3237867520,3237867775,HK @@ -60640,7 +64795,8 @@ 3237870976,3237871103,JP 3237871104,3237871231,TH 3237871232,3237871359,TW -3237871360,3237871615,NZ +3237871360,3237871487,SG +3237871488,3237871615,MY 3237871616,3237896191,US 3237896192,3237900287,PR 3237900288,3237957631,US @@ -60662,7 +64818,7 @@ 3237961472,3237961727,HT 3237961728,3238002687,US 3238002688,3238008831,NL -3238008832,3238010879,PL +3238008832,3238010879,GB 3238010880,3238017023,CH 3238017024,3238018303,DK 3238018304,3238018559,UA @@ -60735,20 +64891,23 @@ 3238395904,3238461439,HU 3238461440,3238502399,DE 3238502400,3238504447,RU -3238504448,3238526975,DE +3238504448,3238510591,DE +3238518784,3238526975,DE 3238526976,3238527231,RU -3238527232,3238530047,CH -3238530560,3238535167,CH +3238529024,3238530047,CH +3238530560,3238530815,CH +3238531072,3238535167,CH 3238535168,3238536191,SE 3238536192,3238537215,DK 3238537216,3238538495,CH 3238538496,3238538751,PL -3238538752,3238539263,RU +3238538752,3238539263,UA 3238539264,3238541567,CH 3238541568,3238541823,PL 3238541824,3238542591,CH 3238542592,3238542847,PL -3238542848,3238545407,CH +3238542848,3238543103,CH +3238543360,3238545407,CH 3238545920,3238546431,RU 3238546432,3238546943,CH 3238546944,3238547455,UA @@ -60767,7 +64926,8 @@ 3238578432,3238578687,UA 3238578688,3238578943,CH 3238578944,3238579199,RU -3238579200,3238589951,CH +3238579200,3238579455,CH +3238580224,3238589951,CH 3238589952,3238590207,LT 3238590208,3238590719,CH 3238590976,3238591231,SA @@ -60789,7 +64949,6 @@ 3238599168,3238599679,HU 3238599680,3238599935,UA 3238599936,3238600703,HU -3238600704,3238604799,DE 3238608896,3238621183,SE 3238623232,3238623487,LV 3238623488,3238623743,PL @@ -60826,8 +64985,8 @@ 3238867968,3238887423,SE 3238887424,3238888447,NL 3238888448,3238893567,SE -3238893568,3238894591,NL -3238894592,3238897663,SE +3238893568,3238895615,NL +3238895616,3238897663,SE 3238897664,3238899711,NL 3238899712,3238901759,SE 3238901760,3238902783,NL @@ -60856,7 +65015,9 @@ 3238993920,3238995967,HR 3238995968,3239001087,SE 3239001088,3239002111,NL -3239002112,3239008255,SE +3239002112,3239006207,SE +3239006208,3239007231,NL +3239007232,3239008255,SE 3239008256,3239009279,NL 3239009280,3239018495,SE 3239018496,3239020543,HR @@ -60866,7 +65027,6 @@ 3239026688,3239028735,HR 3239028736,3239051263,SE 3239051264,3239053311,DE -3239054336,3239054847,DE 3239055360,3239059455,DE 3239062272,3239062527,ES 3239062528,3239062783,CH @@ -60932,8 +65092,7 @@ 3239116544,3239116799,PL 3239116800,3239117055,PT 3239117056,3239117311,SI -3239117312,3239117823,DE -3239118336,3239118591,DE +3239117312,3239117567,DE 3239118848,3239119871,DE 3239119872,3239120127,GB 3239120128,3239120383,CZ @@ -60970,7 +65129,7 @@ 3239137024,3239137279,LI 3239138304,3239138559,PL 3239138560,3239138815,CH -3239138816,3239141375,DE +3239139328,3239141375,DE 3239141376,3239145471,US 3239145472,3239147519,DE 3239147520,3239149567,SG @@ -60981,7 +65140,7 @@ 3239161088,3239161343,BY 3239161344,3239161599,PL 3239161600,3239161855,HU -3239161856,3239162623,DE +3239162368,3239162623,DE 3239162624,3239162879,BE 3239163904,3239164159,PL 3239164160,3239164671,DE @@ -61044,9 +65203,7 @@ 3239275520,3239276543,UA 3239276544,3239277055,LU 3239277056,3239277567,DE -3239277568,3239278079,RU -3239278080,3239278591,UA -3239278592,3239279103,RU +3239277568,3239279103,RU 3239279104,3239280127,PL 3239280128,3239280639,RU 3239281664,3239282687,RU @@ -61083,8 +65240,8 @@ 3239445760,3239446015,PL 3239446016,3239446271,RU 3239446272,3239446527,FR -3239446528,3239449599,DE -3239450624,3239451647,DE +3239446528,3239447551,DE +3239448576,3239449599,DE 3239451648,3239451903,PL 3239451904,3239452159,DE 3239452160,3239452415,CY @@ -61104,7 +65261,7 @@ 3239468288,3239468543,RO 3239468544,3239468799,NO 3239468800,3239469055,RO -3239469056,3239470591,DE +3239470080,3239470591,DE 3239470592,3239470847,CH 3239470848,3239471103,BG 3239471872,3239472127,FR @@ -61114,7 +65271,7 @@ 3239480320,3239480575,UA 3239480832,3239481087,CH 3239481088,3239481343,FR -3239481344,3239486719,DE +3239485440,3239486719,DE 3239486720,3239486975,ES 3239486976,3239487487,DE 3239487744,3239487999,PL @@ -61124,7 +65281,6 @@ 3239489024,3239489279,DE 3239489280,3239489535,PL 3239489536,3239501823,DE -3239505920,3239506431,DE 3239506432,3239506687,RU 3239506688,3239506943,GB 3239507200,3239507455,GB @@ -61136,10 +65292,7 @@ 3239508992,3239509247,PL 3239509248,3239509503,DE 3239509504,3239509759,CH -3239509760,3239510015,DE -3239510016,3239510271,UA -3239510272,3239511039,DE -3239512064,3239514111,DE +3239509760,3239514111,DE 3239518208,3239521791,DE 3239522304,3239522559,PL 3239522560,3239522815,SI @@ -61166,9 +65319,8 @@ 3239541248,3239541503,UA 3239541504,3239541759,FR 3239541760,3239542015,GB -3239542016,3239542271,PL 3239542272,3239542527,RU -3239542784,3239544831,DE +3239543808,3239544831,DE 3239544832,3239545087,GB 3239545088,3239545343,SI 3239545344,3239545855,HU @@ -61176,7 +65328,7 @@ 3239546112,3239546367,GB 3239546368,3239546623,RU 3239546624,3239546879,NL -3239546880,3239549951,DE +3239547904,3239549951,DE 3239549952,3239550207,TR 3239550208,3239550463,UA 3239550464,3239550719,FR @@ -61199,10 +65351,13 @@ 3239568384,3239568639,SE 3239568640,3239568895,NO 3239568896,3239573759,DE -3239574016,3239574783,DE +3239574272,3239574783,DE 3239575040,3239575295,DE 3239575296,3239575551,DK -3239575552,3239578879,DE +3239576064,3239576319,DE +3239576576,3239576831,DE +3239577088,3239577599,DE +3239578624,3239578879,DE 3239579136,3239579391,PL 3239579392,3239581695,DE 3239581696,3239581951,PL @@ -61215,7 +65370,8 @@ 3239583744,3239584767,DE 3239585024,3239585279,DE 3239587840,3239591935,DE -3239591936,3239592447,FI +3239591936,3239592191,FI +3239592192,3239592447,CN 3239592448,3239592703,US 3239592704,3239593983,FI 3239593984,3239624703,DE @@ -61309,7 +65465,8 @@ 3239740416,3239740671,DK 3239740928,3239741183,UA 3239741184,3239741439,RU -3239741440,3239759871,DE +3239741440,3239744511,DE +3239745536,3239759871,DE 3239760128,3239760383,UA 3239761408,3239761663,RU 3239761920,3239762175,BG @@ -61327,7 +65484,7 @@ 3239773952,3239774207,SA 3239774464,3239774719,ES 3239774976,3239775231,PT -3239776256,3239782399,DE +3239776256,3239778303,DE 3239782400,3239782655,AT 3239782656,3239782911,RU 3239782912,3239783167,GB @@ -61378,7 +65535,6 @@ 3239837696,3239837951,PL 3239838976,3239839231,DE 3239839232,3239839487,RU -3239839488,3239839743,DE 3239839744,3239839999,SK 3239840000,3239840511,SA 3239840512,3239840767,DE @@ -61447,7 +65603,7 @@ 3239896064,3239896575,DE 3239896576,3239896831,PL 3239896832,3239897087,HU -3239897088,3239897343,IE +3239897088,3239897343,GB 3239897344,3239897599,FR 3239897600,3239897855,RU 3239897856,3239898111,FR @@ -61460,15 +65616,15 @@ 3239902464,3239902719,RU 3239902720,3239902975,EE 3239903232,3239904255,DE -3239904512,3239904767,DE -3239905024,3239907327,DE +3239904512,3239904767,GB +3239905536,3239905791,DE 3239907328,3239907583,UA 3239907584,3239907839,DE 3239908096,3239908351,RU 3239908352,3239911423,DE 3239912960,3239913215,DE 3239913216,3239913471,LT -3239913472,3239915519,DE +3239914240,3239915519,DE 3239915520,3239915775,PL 3239915776,3239916031,HU 3239916032,3239916287,SA @@ -61477,17 +65633,15 @@ 3239916800,3239917055,KZ 3239917056,3239917311,DE 3239917312,3239917567,BG -3239919616,3239922687,DE -3239922688,3239922724,LU -3239922725,3239922725,DE -3239922726,3239922943,LU -3239922944,3239935999,DE +3239919616,3239927807,DE +3239931904,3239935999,DE 3239936512,3239938815,DE 3239938816,3239939071,NL -3239939072,3239949311,DE +3239939072,3239948543,DE 3239950848,3239951103,DE 3239951104,3239951359,AT -3239951360,3239954431,DE +3239951360,3239951615,DE +3239952384,3239954431,DE 3239954432,3239954687,UA 3239954688,3239954943,DK 3239954944,3239955199,ES @@ -61501,20 +65655,23 @@ 3239960064,3239960319,FR 3239960320,3239960575,GB 3239960576,3239966719,DE -3239967232,3239968255,DE +3239967232,3239967487,DE +3239967744,3239968255,DE 3239968512,3239968767,PL 3239968768,3239969023,NO -3239969536,3239971839,DE +3239969536,3239970047,DE +3239970816,3239971839,DE 3239972864,3239974911,DE 3239974912,3239975935,GB 3239975936,3239976191,RO 3239976192,3239976447,DE 3239976448,3239976959,NL -3239976960,3239978751,DE +3239977984,3239978751,DE 3239978752,3239979007,RU 3239979264,3239979519,GB 3239979520,3239979775,DE -3239980032,3239996415,DE +3239980032,3239993343,DE +3239995392,3239996415,DE 3239996416,3239996671,GB 3239996928,3239997183,BE 3239997184,3239997439,GB @@ -61543,13 +65700,15 @@ 3240036096,3240037375,DE 3240037888,3240038143,AT 3240038400,3240040447,DE -3240042496,3240048639,DE -3240049664,3240083455,DE +3240046592,3240048639,DE +3240049664,3240050687,DE +3240054784,3240058879,DE +3240067072,3240083455,DE 3240083456,3240085503,RU 3240085504,3240087551,KZ 3240087552,3240097791,DE 3240098816,3240099327,CH -3240100352,3240100863,GB +3240100608,3240100863,GB 3240101376,3240101887,GB 3240102144,3240102399,GB 3240102912,3240103935,UA @@ -61557,7 +65716,8 @@ 3240104704,3240104959,NL 3240104960,3240105215,RU 3240105216,3240105471,UA -3240105472,3240109055,GB +3240105472,3240107007,GB +3240107520,3240109055,GB 3240109056,3240109567,PL 3240109568,3240112639,GB 3240112640,3240112895,PL @@ -61580,11 +65740,9 @@ 3240120832,3240121343,GB 3240122368,3240123391,GB 3240125440,3240125695,RO -3240125696,3240132607,GB -3240140800,3240142847,GB -3240153600,3240154111,GB -3240161536,3240161791,GB -3240163840,3240165375,GB +3240125696,3240125951,GB +3240126208,3240132607,GB +3240163328,3240165375,GB 3240165376,3240165887,PL 3240165888,3240166399,ES 3240166400,3240166911,PL @@ -61753,10 +65911,8 @@ 3240280064,3240280191,DE 3240280192,3240280319,SE 3240280320,3240280447,PL -3240280704,3240280831,RU 3240280832,3240280959,GB 3240280960,3240281215,PL -3240281216,3240281343,FR 3240281344,3240281471,PL 3240281472,3240281599,FR 3240281600,3240281727,JO @@ -61776,10 +65932,9 @@ 3240285184,3240286207,PL 3240286208,3240287231,UA 3240287232,3240288255,PL -3240288256,3240292351,GB -3240294400,3240296447,GB +3240288256,3240296447,GB 3240296448,3240296703,RO -3240297472,3240300543,GB +3240297472,3240300031,GB 3240302848,3240303103,UA 3240304640,3240305663,RU 3240305664,3240305919,PL @@ -61800,14 +65955,15 @@ 3240312832,3240321023,GB 3240321024,3240321791,RU 3240321792,3240322047,PL -3240322048,3240322559,RU +3240322048,3240322303,RU 3240322560,3240324095,CZ 3240324096,3240324351,RO 3240324352,3240324607,RU 3240324608,3240324863,PL 3240324864,3240325119,SI 3240325120,3240334335,GB -3240336640,3240352255,GB +3240336640,3240347647,GB +3240351744,3240352255,GB 3240352768,3240353791,GB 3240355840,3240361983,GB 3240361984,3240362239,TR @@ -61830,7 +65986,6 @@ 3240373760,3240374015,DE 3240374016,3240374271,GB 3240378368,3240394751,GB -3240395264,3240395775,GB 3240396032,3240396287,GB 3240396800,3240398847,GB 3240400896,3240407039,GB @@ -61848,11 +66003,10 @@ 3240411136,3240419327,RO 3240419840,3240420095,AT 3240420608,3240420863,NL -3240420864,3240421375,GB +3240420864,3240421119,GB 3240423424,3240435711,GB 3240436480,3240436735,GB 3240436736,3240437759,DE -3240438784,3240443903,GB 3240450048,3240454911,GB 3240454912,3240455167,IN 3240456192,3240460287,GB @@ -61882,24 +66036,24 @@ 3240467968,3240468223,DE 3240468224,3240468479,CH 3240468480,3240476671,GB -3240484864,3240486911,GB -3240487424,3240487935,GB +3240485120,3240485375,GB +3240485888,3240486399,GB 3240487936,3240488191,CH 3240488192,3240488447,GB 3240488448,3240488703,BG 3240488704,3240488959,NL -3240488960,3240493055,GB +3240488960,3240491007,GB 3240493056,3240501247,SE -3240503296,3240504319,GB -3240505088,3240505343,GB 3240505344,3240505599,PL 3240505600,3240505855,GB 3240506368,3240506623,GB -3240507392,3240529919,GB +3240507392,3240525823,GB +3240529408,3240529919,GB 3240534016,3240536640,GB 3240536641,3240536641,US 3240536642,3240550399,GB -3240558592,3240575487,GB +3240559616,3240560127,GB +3240560640,3240575487,GB 3240575488,3240575743,RO 3240575744,3240575999,GB 3240576000,3240576255,DE @@ -61922,7 +66076,7 @@ 3240588800,3240589055,UA 3240589056,3240589311,RO 3240589312,3240593407,SE -3240593408,3240594175,GB +3240593408,3240593663,GB 3240594176,3240594431,DK 3240594432,3240599551,GB 3240602624,3240605695,GB @@ -61931,7 +66085,6 @@ 3240615936,3240622079,GB 3240622080,3240622591,RU 3240622592,3240623103,GB -3240623872,3240624127,GB 3240624128,3240689663,EE 3240689664,3240690175,GB 3240690176,3240690687,TR @@ -62037,7 +66190,8 @@ 3240754176,3240755199,DE 3240755200,3240759295,IT 3240771584,3240779775,IT -3240788992,3240791551,IT +3240788992,3240790015,IT +3240790528,3240791551,IT 3240791552,3240791807,RU 3240791808,3240792063,ES 3240792064,3240792319,GB @@ -62065,11 +66219,7 @@ 3240812288,3240812543,KW 3240813568,3240814591,PL 3240814592,3240816639,IT -3240818688,3240819711,NL -3240819712,3240819715,GB -3240819716,3240819716,NL -3240819717,3240819967,GB -3240819968,3240820735,NL +3240818688,3240820735,NL 3240820736,3240820799,FR 3240820800,3240820831,CY 3240820832,3240820863,GB @@ -62082,7 +66232,7 @@ 3240827392,3240827647,BG 3240827648,3240827903,CH 3240828160,3240828415,DE -3240828416,3240837119,IT +3240828928,3240837119,IT 3240839424,3240839679,IT 3240840192,3240840447,IT 3240840448,3240840703,PL @@ -62096,7 +66246,8 @@ 3240845312,3240845823,IT 3240846336,3240846847,IT 3240846848,3240847359,VA -3240847360,3240852735,IT +3240847360,3240848895,IT +3240849152,3240852735,IT 3240852736,3240852991,GB 3240853248,3240853503,RU 3240853504,3240854527,VA @@ -62131,7 +66282,9 @@ 3240886272,3241017343,SE 3241017344,3241017855,AT 3241017856,3241018111,RU -3241018112,3241029119,AT +3241018112,3241018367,FR +3241018368,3241022463,AT +3241027584,3241029119,AT 3241029120,3241029375,UA 3241029376,3241029631,PL 3241029632,3241031679,AT @@ -62181,9 +66334,8 @@ 3241071616,3241071871,PL 3241071872,3241072127,RU 3241072384,3241072639,DE -3241073664,3241073919,AT 3241073920,3241074175,GB -3241074432,3241076735,AT +3241074688,3241076735,AT 3241077248,3241077759,AT 3241077760,3241078015,LV 3241078016,3241078271,PL @@ -62191,7 +66343,8 @@ 3241078528,3241078783,DE 3241078784,3241082879,AT 3241082880,3241083135,FR -3241083136,3241100287,CH +3241083136,3241091071,CH +3241099264,3241100287,CH 3241101056,3241101311,DK 3241101312,3241101567,RO 3241101568,3241101823,DE @@ -62254,15 +66407,19 @@ 3241146624,3241146879,RO 3241146880,3241147903,CH 3241148160,3241148415,CH -3241148416,3241476095,FR -3241476608,3241477631,BE +3241148416,3241416767,FR +3241416768,3241416831,US +3241416832,3241476095,FR +3241476864,3241477375,BE 3241477632,3241477887,GB 3241478144,3241481727,BE 3241481728,3241481983,PT 3241481984,3241482239,DE 3241482240,3241484799,SE 3241484800,3241485055,BE -3241485312,3241496575,BE +3241485312,3241486335,BE +3241486336,3241487615,SE +3241487616,3241496575,BE 3241496576,3241496831,AT 3241497344,3241497599,UA 3241497600,3241497855,SE @@ -62281,25 +66438,34 @@ 3241503488,3241508095,BE 3241508096,3241508351,NL 3241508352,3241508607,BE -3241508864,3241541375,BE +3241508864,3241540607,BE +3241540864,3241541119,BE 3241541376,3241541631,PL 3241541632,3241672703,FR -3241673472,3241689087,FR -3241691136,3241699327,FR +3241673728,3241674751,FR +3241675776,3241676799,FR +3241680896,3241689087,FR +3241693184,3241699327,FR 3241699584,3241699839,FR 3241699840,3241700095,SE -3241700096,3241723903,FR +3241700096,3241722879,FR 3241724160,3241724415,FR 3241724416,3241724671,RU 3241724672,3241724927,FR -3241725952,3241736191,FR -3241737216,3241740287,FR -3241740544,3241748479,FR +3241725952,3241734143,FR +3241734400,3241736191,FR +3241737216,3241737727,FR +3241739264,3241740287,FR +3241740544,3241741823,FR +3241742336,3241742847,FR +3241743360,3241743615,DE +3241744128,3241748479,FR 3241750528,3241752831,FR 3241754368,3241758719,FR 3241759744,3241763071,FR 3241763072,3241763327,DE -3241763328,3241771007,FR +3241764864,3241765887,FR +3241766144,3241771007,FR 3241772032,3241789439,FR 3241789696,3241789951,FR 3241790464,3241790975,FR @@ -62316,7 +66482,6 @@ 3241842688,3241843455,BE 3241843456,3241843711,CH 3241843712,3241848063,BE -3241851904,3241852927,GB 3241852928,3241854463,SK 3241854464,3241854975,GB 3241854976,3241855999,DE @@ -62368,11 +66533,9 @@ 3243238400,3243245567,NL 3243245568,3243376639,AT 3243376640,3243442175,GB -3243442176,3243443199,AT -3243443200,3243443455,DE -3243443456,3243507711,AT +3243442176,3243507711,AT 3243507712,3243507967,GB -3243509248,3243509759,CZ +3243509504,3243509759,CZ 3243509760,3243510015,RU 3243510016,3243510271,NL 3243510272,3243510527,CZ @@ -62440,7 +66603,6 @@ 3243571456,3243571711,CZ 3243571968,3243572223,GR 3243572224,3243572479,CZ -3243572736,3243572991,CZ 3243572992,3243573247,RU 3243573248,3243704319,CZ 3243704320,3243769855,SK @@ -62499,7 +66661,7 @@ 3244153856,3244154879,NO 3244154880,3244155903,GB 3244155904,3244156927,UA -3244156928,3244158975,RU +3244157952,3244158975,RU 3244158976,3244159999,DE 3244160000,3244161023,RU 3244161024,3244163071,NO @@ -62520,7 +66682,6 @@ 3244820736,3244820991,DE 3244820992,3244821247,SI 3244821248,3244821503,RU -3244821504,3244821759,UA 3244821760,3244822015,TR 3244822016,3244822271,RU 3244822272,3244822527,GB @@ -62683,7 +66844,8 @@ 3244866560,3244866815,FI 3244866816,3244867071,UA 3244867072,3244867583,RU -3244867584,3244868095,NL +3244867584,3244867839,NL +3244867840,3244868095,BE 3244868096,3244868351,DE 3244868352,3244868607,RU 3244868608,3244868863,FI @@ -62735,7 +66897,6 @@ 3244882176,3244882431,UA 3244882432,3244882687,IT 3244882688,3244882943,PL -3244882944,3244883199,NL 3244883200,3244883455,RU 3244883456,3244883711,CZ 3244883712,3244883967,NL @@ -62963,7 +67124,6 @@ 3244945664,3244945919,NL 3244945920,3244946175,PL 3244946176,3244946431,TR -3244946432,3244946687,RO 3244946688,3244946943,RU 3244946944,3244947455,DE 3244947456,3244947711,PL @@ -63142,10 +67302,7 @@ 3245126656,3245126911,FR 3245126912,3245127167,DE 3245127168,3245127423,RU -3245127424,3245127679,AT -3245127680,3245127742,US -3245127743,3245127743,DE -3245127744,3245127935,US +3245127680,3245127935,DE 3245127936,3245128191,LV 3245128192,3245128447,IT 3245128448,3245128703,CH @@ -63161,7 +67318,6 @@ 3245132288,3245132543,PL 3245132544,3245132799,FR 3245132800,3245133311,IT -3245133312,3245133567,PL 3245134080,3245134335,UA 3245134336,3245134591,NL 3245134848,3245135103,AT @@ -63216,7 +67372,6 @@ 3245169152,3245169407,IT 3245169408,3245169663,PL 3245169920,3245170175,PT -3245170176,3245170431,GB 3245170432,3245170687,CH 3245170688,3245171711,DE 3245172736,3245173759,IT @@ -63291,8 +67446,7 @@ 3245219840,3245221887,FI 3245221888,3245223935,DE 3245223936,3245225471,NL -3245225472,3245225727,GB -3245225728,3245225983,NL +3245225472,3245225983,GB 3245225984,3245228031,HU 3245228032,3245229055,FI 3245229056,3245230079,DE @@ -63323,7 +67477,7 @@ 3245243392,3245244415,UA 3245244416,3245244671,ES 3245244672,3245244927,AT -3245244928,3245245183,BE +3245244928,3245245183,US 3245245440,3245245695,BG 3245245696,3245245951,DE 3245246720,3245246975,PL @@ -63470,22 +67624,23 @@ 3246129152,3246260223,RU 3246260224,3246325759,PT 3246351616,3246352639,ES -3246374400,3246374655,ES -3246376960,3246377215,ES +3246370816,3246371073,ES +3246371074,3246371074,PT +3246371075,3246374911,ES 3246378752,3246379007,ES 3246379008,3246381055,GB +3246387200,3246388223,GB 3246391296,3246613503,GB 3246613504,3246614527,HU 3246614528,3246744543,GB 3246744544,3246744559,NG 3246744560,3246784511,GB -3246784512,3246825727,CH -3246825728,3246825983,GB +3246784512,3246825983,CH 3246825984,3246826239,US 3246826240,3246915583,CH 3246915584,3247046655,PT 3247046656,3247046911,AT -3247046912,3247048191,SI +3247046912,3247047679,SI 3247048192,3247048703,NO 3247048704,3247048959,EE 3247048960,3247049215,SI @@ -63574,9 +67729,9 @@ 3247112192,3247177727,FR 3247177728,3247243263,TR 3247243264,3247244287,DE -3247244288,3247252319,NL -3247252320,3247252327,DE -3247252328,3247253503,NL +3247244288,3247250175,NL +3247250176,3247250431,DE +3247250432,3247253503,NL 3247253504,3247254527,DE 3247254528,3247267839,NL 3247267840,3247268351,DE @@ -63587,18 +67742,18 @@ 3247300608,3247308799,NL 3247308800,3247309055,BG 3247309056,3247309567,FI -3247309824,3247313663,FI +3247309824,3247313407,FI 3247313664,3247313919,AM -3247313920,3247316479,FI -3247316480,3247316991,RU +3247314688,3247315967,FI +3247316480,3247316735,IR +3247316736,3247316991,RU 3247321600,3247322111,FI 3247322368,3247322623,DE -3247322624,3247323135,FI +3247322880,3247323135,FI 3247323136,3247323647,RU -3247324160,3247324415,FI 3247324416,3247324671,SE 3247324672,3247324927,CH -3247324928,3247333631,FI +3247325184,3247333631,FI 3247333632,3247333887,DE 3247333888,3247334399,FI 3247334400,3247334655,NO @@ -63618,7 +67773,6 @@ 3247341312,3247341567,DE 3247343616,3247345663,FI 3247345920,3247346175,HU -3247346176,3247346943,FI 3247346944,3247347199,SI 3247347200,3247347455,FI 3247347456,3247347711,IL @@ -63627,7 +67781,8 @@ 3247349248,3247349503,FR 3247349504,3247349759,UA 3247349760,3247353855,SE -3247353856,3247362047,FI +3247353856,3247357951,FI +3247361024,3247361279,FI 3247362048,3247362303,RO 3247362304,3247362559,HU 3247362560,3247362815,PL @@ -63660,7 +67815,7 @@ 3247394048,3247394303,PL 3247394560,3247397887,FI 3247397888,3247398143,RU -3247398144,3247399167,FI +3247398144,3247398911,FI 3247399424,3247399679,RU 3247399680,3247404799,FI 3247404800,3247405055,RU @@ -63670,12 +67825,13 @@ 3247406080,3247431679,FI 3247431936,3247432191,FI 3247432192,3247432447,TR -3247432448,3247437823,FI +3247432448,3247433471,FI +3247433728,3247437823,FI 3247438080,3247438335,IT 3247438848,3247439871,FI 3247439872,3247702015,ES 3247702016,3247702271,RO -3247702528,3247703551,ES +3247702528,3247703295,ES 3247703552,3247704063,FR 3247705856,3247706111,RU 3247708160,3247711743,ES @@ -63683,7 +67839,6 @@ 3247713280,3247713535,RU 3247713536,3247713791,BE 3247713792,3247714047,SK -3247714304,3247716351,CH 3247726592,3247742975,ES 3247742976,3247751167,DE 3247751168,3247769599,ES @@ -63772,7 +67927,8 @@ 3247909888,3247910911,DE 3247910912,3247912959,PL 3247912960,3247913983,UA -3247913984,3247915007,DE +3247913984,3247914495,DE +3247914496,3247915007,AT 3247915008,3247917055,PL 3247917056,3247918079,NL 3247918080,3247919103,PL @@ -63813,7 +67969,6 @@ 3248521984,3248522239,RU 3248522240,3248522751,NO 3248523264,3248524287,NO -3248525312,3248525567,DE 3248526336,3248527359,NO 3248528384,3248528895,NO 3248528896,3248529151,RU @@ -63827,30 +67982,31 @@ 3248551936,3248553215,NO 3248553728,3248553983,RU 3248553984,3248554239,RO -3248554496,3248557055,NO 3248557056,3248558079,UA 3248558080,3248575487,NO 3248575488,3248576511,CZ -3248576512,3248591871,NO -3248592384,3248599039,NO +3248576512,3248582655,NO +3248584704,3248586751,NO +3248589312,3248589823,NO +3248590848,3248591871,NO +3248592896,3248599039,NO 3248599040,3248603135,SE 3248603136,3248603391,BG 3248603392,3248603647,RU 3248603648,3248604159,NO -3248604928,3248608767,NO -3248609280,3248619519,NO +3248606208,3248608255,NO +3248609280,3248610303,NO +3248611328,3248619519,NO 3248619520,3248624383,DK 3248624384,3248624639,US 3248624640,3248750591,DK 3248750592,3248750847,PT -3248751616,3248752127,PL 3248752640,3248752895,DE 3248752896,3248753151,TR 3248753408,3248753663,GB 3248753664,3248753919,FR 3248753920,3248754431,GB 3248754432,3248754687,AT -3248754688,3248758783,PL 3248758784,3248774143,SE 3248774144,3248775167,UA 3248775168,3248783615,GB @@ -63896,10 +68052,8 @@ 3248807936,3248808447,AT 3248808448,3248808959,GR 3248808960,3248810111,FR -3248810112,3248810143,RU 3248810144,3248810175,CY 3248810176,3248810207,FR -3248810208,3248810239,GB 3248810240,3248810495,CH 3248810496,3248812543,AT 3248812544,3248813055,GB @@ -63910,12 +68064,12 @@ 3248816128,3248881663,CZ 3248881664,3249012735,FI 3249012736,3249012991,DE -3249012992,3249014271,LU +3249012992,3249013759,LU 3249014272,3249014783,DE 3249014784,3249025023,LU 3249025536,3249025791,FR 3249026560,3249026815,PL -3249026816,3249045503,LU +3249027584,3249045503,LU 3249045504,3249078271,DE 3249078272,3249078783,RU 3249078784,3249079295,CH @@ -64022,43 +68176,47 @@ 3249141760,3249142271,RU 3249142784,3249143295,UA 3249143296,3249143807,GB -3249143808,3249242879,AT -3249242880,3249243135,DE -3249243136,3249274879,AT +3249143808,3249274879,AT 3249274880,3249405951,NL 3249405952,3249521279,DE 3249521280,3249521343,UA 3249521344,3249537023,DE 3249537024,3249537279,PT -3249537536,3249537791,NL 3249537792,3249538047,GB -3249538048,3249551359,NL +3249538048,3249541119,NL +3249545216,3249547263,NL +3249548288,3249551359,NL 3249551360,3249552639,GB -3249552640,3249565695,NL +3249552640,3249552895,NL +3249553152,3249553407,NL +3249561600,3249565695,NL 3249569792,3249574143,NL 3249574144,3249574399,RU 3249574400,3249574655,GB 3249574656,3249574911,UA -3249574912,3249583103,NL -3249583616,3249590527,NL +3249574912,3249576191,NL +3249577728,3249583103,NL +3249585152,3249590527,NL 3249590528,3249590783,FR -3249590784,3249591295,NL -3249591808,3249600255,NL +3249592320,3249595135,NL +3249596416,3249600255,NL 3249600256,3249600511,AT 3249600512,3249601535,UA 3249601536,3249601791,RU -3249601792,3249655807,NL +3249601792,3249635327,NL +3249637376,3249655807,NL 3249659904,3249668095,NL 3249668096,3249676287,IE 3249676288,3249676543,GB -3249676544,3249676799,IE 3249676800,3249677055,UA 3249677056,3249677311,SE -3249677312,3249678847,IE +3249678336,3249678847,IE 3249679104,3249679359,CH -3249679360,3249683455,IE +3249679360,3249682431,IE 3249683456,3249684479,SE -3249684480,3249698047,IE +3249684480,3249696767,IE +3249697280,3249697535,IE +3249697792,3249698047,IE 3249698048,3249698303,PL 3249698304,3249698559,RU 3249698560,3249698815,HU @@ -64069,8 +68227,8 @@ 3249702144,3249702399,FI 3249702400,3249702655,FR 3249702656,3249702911,RU -3249702912,3249703679,FR -3249703680,3249703935,GB +3249702912,3249703167,FR +3249703424,3249703679,FR 3249703936,3249704191,FR 3249704192,3249704447,RO 3249704704,3249704959,PL @@ -64090,7 +68248,6 @@ 3249710592,3249710847,BG 3249710848,3249711103,PL 3249711104,3249711359,HU -3249711360,3249711615,DE 3249711872,3249712127,AT 3249712384,3249712639,GB 3249712896,3249713151,DK @@ -64113,7 +68270,6 @@ 3249723392,3249723647,IT 3249723648,3249723903,GB 3249724160,3249724415,LU -3249724416,3249724671,IL 3249724672,3249724927,RU 3249724928,3249725183,BG 3249725184,3249725439,GB @@ -64161,8 +68317,8 @@ 3249863424,3249863679,SE 3249863680,3249863935,ES 3249863936,3249865471,SE -3249865472,3249866751,GB -3249866752,3249868543,SE +3249865472,3249865727,GB +3249865728,3249868543,SE 3249868544,3249868799,DE 3249868800,3249869823,NL 3249869824,3249871103,SE @@ -64171,9 +68327,7 @@ 3249871616,3249871871,NO 3249871872,3249872383,SE 3249872384,3249872639,GB -3249872640,3249910783,SE -3249910784,3249911807,GB -3249911808,3249926143,SE +3249872640,3249926143,SE 3249926144,3249926399,AU 3249926400,3249926655,SE 3249926656,3249926911,AU @@ -64182,7 +68336,9 @@ 3249929984,3249932287,SE 3249932288,3249934335,US 3249934336,3249934847,IT -3249934848,3249960447,SE +3249934848,3249935871,SE +3249935872,3249936383,DE +3249936384,3249960447,SE 3249960448,3249960959,DE 3249960960,3249961215,CA 3249961216,3249961471,SE @@ -64223,7 +68379,13 @@ 3250010368,3250010879,CH 3250010880,3250012159,SE 3250012160,3250013183,DE -3250013184,3250020863,SE +3250013184,3250014207,SE +3250014208,3250014719,DE +3250014720,3250015231,SE +3250015232,3250015743,FI +3250015744,3250017791,SE +3250017792,3250018303,DE +3250018304,3250020863,SE 3250020864,3250021375,IT 3250021376,3250022399,FR 3250022400,3250023423,SE @@ -64239,7 +68401,9 @@ 3250035456,3250035711,US 3250035712,3250038271,SE 3250038272,3250039295,ES -3250039296,3250042623,SE +3250039296,3250039807,SE +3250039808,3250040319,GB +3250040320,3250042623,SE 3250042624,3250043135,FR 3250043136,3250061311,SE 3250061312,3250192383,FI @@ -64254,7 +68418,7 @@ 3250194688,3250194943,UA 3250194944,3250195199,RO 3250195456,3250195711,DE -3250195712,3250196223,GB +3250195712,3250195967,GB 3250196224,3250196479,UA 3250196480,3250200575,AT 3250200576,3250200831,HU @@ -64275,7 +68439,7 @@ 3250246656,3250247423,AT 3250247680,3250257663,AT 3250257664,3250257919,PL -3250258176,3250271231,AT +3250258432,3250271231,AT 3250271232,3250271743,PL 3250271744,3250271999,LB 3250272000,3250272255,GB @@ -64295,9 +68459,8 @@ 3250324480,3250324991,GB 3250324992,3250325247,AE 3250325248,3250325503,MA -3250325504,3250326527,OM 3250326528,3250327039,BH -3250327040,3250327551,SA +3250327040,3250327295,SA 3250331648,3250335743,MT 3250335744,3250339839,KW 3250339840,3250348031,JO @@ -64312,8 +68475,7 @@ 3250357904,3250357919,FR 3250357920,3250357927,PL 3250357928,3250357959,CY -3250357960,3250357967,GB -3250357976,3250358015,GB +3250357984,3250357999,GB 3250358016,3250358527,LB 3250358528,3250358783,HU 3250359296,3250359807,HU @@ -64325,8 +68487,7 @@ 3250372608,3250373631,HU 3250373632,3250374143,DE 3250374144,3250374655,PL -3250374656,3250374911,SA -3250374912,3250375679,SE +3250374656,3250375679,SE 3250375680,3250376703,GB 3250376704,3250380799,AT 3250380800,3250386943,CH @@ -64390,7 +68551,6 @@ 3250588928,3250589183,GB 3250589184,3250589439,DE 3250589504,3250589567,HR -3250589632,3250589695,NO 3250589696,3250593791,CH 3250593792,3250594815,GB 3250594816,3250595327,UA @@ -64415,7 +68575,6 @@ 3250667520,3250675711,PL 3250675712,3250683903,GB 3250683904,3250692095,CH -3250692096,3250692351,NO 3250692352,3250692607,NL 3250693376,3250693631,UA 3250693632,3250694143,DE @@ -64452,12 +68611,11 @@ 3250748416,3250749439,UA 3250749440,3250749695,GH 3250749696,3250749951,IT -3250750208,3250750463,RO 3250750464,3250751487,FR 3250751488,3250751999,DE 3250752000,3250752511,CH 3250752512,3250753023,BG -3250753024,3250754047,DE +3250753536,3250754047,DE 3250754048,3250754303,AT 3250754560,3250755071,DE 3250755584,3250755839,FR @@ -64477,11 +68635,10 @@ 3251111168,3251111423,CH 3251111424,3251111679,AT 3251111680,3251111935,ES -3251111936,3251112191,BG 3251112192,3251112447,SK 3251112448,3251112703,RU 3251112704,3251112959,SE -3251112960,3251113983,BG +3251113472,3251113983,BG 3251114496,3251114751,RU 3251114752,3251115007,RO 3251115008,3251115263,PL @@ -64510,7 +68667,6 @@ 3251126784,3251127295,PL 3251127296,3251127807,UA 3251127808,3251128319,NL -3251128832,3251129343,SE 3251129344,3251129855,UA 3251129856,3251130367,CH 3251130368,3251130879,GB @@ -64552,7 +68708,6 @@ 3251147264,3251147519,PL 3251147520,3251147775,NL 3251147776,3251148031,SE -3251148032,3251148287,RU 3251148544,3251148799,UA 3251149056,3251149311,NL 3251149312,3251149567,DE @@ -64567,7 +68722,6 @@ 3251152128,3251152639,RO 3251152640,3251152895,UA 3251152896,3251153151,RU -3251153152,3251153407,UA 3251153408,3251153663,TR 3251153664,3251153919,FR 3251153920,3251154175,DE @@ -64578,7 +68732,7 @@ 3251155456,3251155711,NL 3251155712,3251155967,UA 3251155968,3251156223,TR -3251156224,3251156735,FR +3251156480,3251156735,FR 3251156736,3251156991,UA 3251156992,3251157247,FR 3251157248,3251157503,BE @@ -64589,7 +68743,6 @@ 3251158784,3251159295,GB 3251159296,3251159551,DE 3251159808,3251160063,DE -3251160064,3251160319,JO 3251160320,3251160575,PL 3251160576,3251160831,NL 3251160832,3251161087,RU @@ -64630,7 +68783,6 @@ 3251171840,3251172095,RO 3251172096,3251172351,ES 3251172608,3251172863,GB -3251172864,3251173119,UA 3251173120,3251173375,SA 3251173376,3251173631,UA 3251173632,3251173887,DE @@ -64652,7 +68804,6 @@ 3251183872,3251184127,CH 3251184128,3251184383,PL 3251184640,3251184895,PL -3251184896,3251185151,DE 3251185408,3251185663,DK 3251185664,3251185919,IT 3251185920,3251186175,AT @@ -64660,7 +68811,6 @@ 3251186432,3251186687,SE 3251186688,3251186943,RO 3251186944,3251187199,SI -3251187200,3251187455,GR 3251187456,3251187711,GB 3251187712,3251188735,NL 3251188736,3251189759,DE @@ -64711,13 +68861,11 @@ 3251213312,3251213375,CY 3251213376,3251213439,DE 3251213504,3251213567,NL -3251213568,3251213631,FR 3251213632,3251213695,PL 3251213760,3251213823,CY 3251213824,3251213887,GB 3251213888,3251214015,CY 3251214080,3251214143,CY -3251214144,3251214207,AF 3251214272,3251214335,DE 3251214336,3251214463,RU 3251214464,3251214591,UA @@ -64744,11 +68892,9 @@ 3251220224,3251220479,UA 3251220480,3251222527,DE 3251222528,3251224575,GB -3251225088,3251225599,FR 3251225600,3251226111,GB 3251226112,3251226623,UA 3251226624,3251227135,GB -3251227136,3251227647,DE 3251227648,3251228159,GB 3251228160,3251228671,UA 3251229696,3251230719,SI @@ -64759,7 +68905,6 @@ 3251234816,3251235839,RO 3251235840,3251236863,DE 3251236864,3251237887,BG -3251238912,3251239935,FR 3251240960,3251241215,BE 3251241216,3251243007,GB 3251245056,3251245311,DE @@ -64775,7 +68920,7 @@ 3251252736,3251256831,CH 3251256832,3251257343,GB 3251257344,3251259903,BE -3251260672,3251261439,FR +3251260416,3251261439,FR 3251261440,3251264255,CH 3251264256,3251265535,FR 3251265536,3251267839,NL @@ -64805,23 +68950,25 @@ 3251302400,3251306495,LI 3251306496,3251306751,AT 3251306752,3251307007,MK -3251307008,3251307519,RS 3251307520,3251307775,MK 3251307776,3251308031,GB 3251308032,3251308543,RS -3251310592,3251311103,SI 3251311104,3251311615,RS 3251311616,3251312127,GB -3251312384,3251312639,CH -3251312640,3251314687,RS +3251312384,3251312639,RS +3251313152,3251313663,RS 3251314688,3251315711,FR 3251315712,3251317759,RU 3251317760,3251318783,PL 3251318784,3251319807,UA 3251320832,3251321855,PL 3251321856,3251322879,RU -3251322880,3251331327,GB -3251331328,3251331583,FR +3251322880,3251331071,GB +3251331072,3251331262,FR +3251331263,3251331263,GB +3251331264,3251331321,FR +3251331322,3251331322,GB +3251331323,3251331583,FR 3251331584,3251332095,PL 3251332096,3251333119,RU 3251333120,3251333631,CH @@ -64850,7 +68997,6 @@ 3251362304,3251362815,UA 3251362816,3251363327,NL 3251363328,3251363839,PL -3251363840,3251364095,MK 3251364096,3251364607,NL 3251364608,3251364863,RO 3251364864,3251366911,IT @@ -64872,8 +69018,8 @@ 3252167680,3252176127,NL 3252176128,3252177919,SE 3252177920,3252178943,HR -3252178944,3252179455,SE -3252179456,3252189183,NL +3252178944,3252179199,SE +3252179200,3252189183,NL 3252189184,3252190719,SE 3252190720,3252190975,NO 3252190976,3252191231,SE @@ -64902,8 +69048,8 @@ 3252289792,3252291327,GR 3252291584,3252293631,FR 3252293632,3252297727,DE -3252297984,3252298239,GR -3252298752,3252308223,GR +3252298752,3252299007,GR +3252299776,3252308223,GR 3252308224,3252308479,DE 3252308480,3252310527,GR 3252311040,3252313599,GR @@ -64919,9 +69065,9 @@ 3252318976,3252319231,PL 3252319232,3252319743,AT 3252319744,3252319999,RU -3252320000,3252320255,GR 3252320256,3252320511,CZ -3252320768,3252321791,GR +3252320768,3252321023,GR +3252321280,3252321791,GR 3252321792,3252322303,PL 3252322304,3252323327,NO 3252323328,3252324351,PL @@ -64935,9 +69081,7 @@ 3252336640,3252337663,UA 3252337664,3252338687,RU 3252338688,3252340735,BE -3252340736,3252340991,TR 3252341248,3252341503,DE -3252341504,3252341759,GR 3252342016,3252342079,GB 3252342080,3252342239,CY 3252342240,3252342271,CH @@ -64948,7 +69092,6 @@ 3252342608,3252342655,CY 3252342656,3252342783,IL 3252342784,3252346367,DE -3252346368,3252346623,GB 3252346624,3252355071,GR 3252355072,3252356351,LT 3252357120,3252358911,LT @@ -64988,21 +69131,30 @@ 3252387584,3252387839,RU 3252387840,3252404223,LT 3252404224,3252405759,NO -3252405760,3252409663,LT +3252405760,3252406271,FR +3252406272,3252407295,NO +3252407296,3252409663,FR 3252409664,3252409679,CD -3252409680,3252421631,LT -3252421632,3252423679,NO -3252423680,3252448511,LT +3252409680,3252415487,FR +3252415488,3252415743,LT +3252415744,3252420607,FR +3252420608,3252424703,NO +3252424704,3252428799,FR +3252428800,3252429823,NO +3252429824,3252448511,FR 3252448512,3252448767,NO -3252448768,3252449791,LT +3252448768,3252449791,FR 3252449792,3252450047,DK -3252450048,3252452543,LT +3252450048,3252452543,FR 3252452544,3252452551,SS -3252452552,3252455679,LT +3252452552,3252455679,FR 3252455680,3252455807,BI -3252455808,3252469759,LT +3252455808,3252461567,FR +3252461568,3252469759,NO 3252469760,3252473855,NL -3252473856,3252486143,LT +3252473856,3252475903,NO +3252475904,3252477951,FR +3252477952,3252486143,NO 3252486144,3252490239,BE 3252490240,3252496127,SE 3252496128,3252496383,AU @@ -65030,9 +69182,9 @@ 3252518656,3252518911,DE 3252518912,3252527103,NL 3252527104,3252535295,BE -3252540416,3252541951,NL 3252541952,3252542207,CI -3252542208,3252551679,BE +3252542208,3252542719,BE +3252543488,3252551679,BE 3252551680,3252563967,CH 3252563968,3252564479,RU 3252564480,3252564735,GB @@ -65041,11 +69193,12 @@ 3252566016,3252566271,DE 3252566272,3252566527,RO 3252566528,3252566783,RU -3252566784,3252567295,CH +3252566784,3252567039,CH 3252567296,3252567551,GB 3252567552,3252567807,RU 3252567808,3252568063,RO -3252568064,3252579327,CH +3252568064,3252576255,CH +3252578816,3252579327,CH 3252579328,3252579583,FR 3252579584,3252579839,RU 3252579840,3252580095,SE @@ -65120,7 +69273,6 @@ 3252913152,3252913407,ES 3252913408,3252913663,FR 3252913664,3252913919,RU -3252913920,3252914175,NO 3252914176,3252916223,FR 3252916224,3252920319,DE 3252920320,3252928511,LB @@ -65140,7 +69292,6 @@ 3252939264,3252939775,DE 3252940288,3252940799,PT 3252940800,3252941311,RU -3252941312,3252941823,RO 3252941824,3252942847,GB 3252942848,3252943359,FR 3252943360,3252943871,UA @@ -65149,7 +69300,7 @@ 3252944896,3252945151,AT 3252945152,3252945407,GB 3252945408,3252945663,UA -3252945664,3252980735,AT +3252945920,3252976639,AT 3252980992,3252981247,GB 3252981248,3252981503,RU 3252981504,3252981759,SE @@ -65165,18 +69316,21 @@ 3252984832,3252985087,FR 3252985088,3252985343,SE 3252985344,3252985855,RU -3252985856,3252989439,AT +3252985856,3252989183,AT 3252989440,3252989695,PL -3252989696,3253004799,AT +3252989952,3253004799,AT 3253004800,3253005055,CZ -3253005056,3253010431,AT +3253005056,3253006335,AT +3253006336,3253010431,DE 3253010432,3253075967,FI 3253075968,3253207039,RO 3253207040,3253270527,RU 3253270528,3253271551,BY 3253271552,3253338111,RU 3253338112,3253338367,PL -3253338368,3253380863,SE +3253338368,3253380351,SE +3253380352,3253380607,GB +3253380608,3253380863,SE 3253380864,3253381119,IT 3253381120,3253383935,SE 3253383936,3253384191,NO @@ -65184,9 +69338,12 @@ 3253388288,3253388799,FR 3253388800,3253389055,SE 3253389056,3253389823,FR -3253389824,3253395455,SE +3253389824,3253395199,SE +3253395200,3253395455,GB 3253395456,3253395967,IT -3253395968,3253398271,SE +3253395968,3253397503,SE +3253397504,3253397759,GB +3253397760,3253398271,SE 3253398272,3253398783,FR 3253398784,3253399039,SE 3253399040,3253399295,FR @@ -65200,11 +69357,15 @@ 3253403648,3253403903,PL 3253403904,3253409791,SE 3253409792,3253410047,GB -3253410048,3253412351,SE +3253410048,3253411327,SE +3253411328,3253411583,NO +3253411584,3253412351,SE 3253412352,3253412607,US 3253412608,3253416447,SE 3253416448,3253416703,GB -3253416704,3253428223,SE +3253416704,3253419519,SE +3253419520,3253419775,GB +3253419776,3253428223,SE 3253428224,3253428479,DE 3253428480,3253429247,SE 3253429248,3253429759,JP @@ -65222,7 +69383,8 @@ 3253436416,3253440511,SE 3253440512,3253440767,FR 3253440768,3253441023,SE -3253441024,3253441535,AT +3253441024,3253441279,CL +3253441280,3253441535,NL 3253441536,3253443839,SE 3253443840,3253444351,NO 3253444352,3253453311,SE @@ -65266,7 +69428,6 @@ 3253627904,3253628927,UA 3253628928,3253629951,GR 3253629952,3253630975,UA -3253630976,3253631999,RU 3253632000,3253633023,DE 3253633024,3253635071,RU 3253635072,3253636095,IT @@ -65291,7 +69452,6 @@ 3253658624,3253659647,DE 3253659648,3253660671,GB 3253661696,3253662719,NL -3253662720,3253663743,RO 3253663744,3253664767,NL 3253664768,3253665791,DE 3253665792,3253666815,CZ @@ -65313,7 +69473,6 @@ 3253683200,3253685247,UA 3253685248,3253686271,FR 3253686272,3253687295,PL -3253687296,3253688319,RU 3253688320,3253690367,NL 3253690368,3253691391,DK 3253691392,3253692415,PL @@ -65384,8 +69543,14 @@ 3253737848,3253737855,HU 3253737856,3253738559,GB 3253738560,3253738567,CZ -3253738568,3253738575,BE -3253738576,3253741679,GB +3253738568,3253738569,BE +3253738570,3253738570,GB +3253738571,3253738575,BE +3253738576,3253739263,GB +3253739264,3253739519,FR +3253739520,3253741055,GB +3253741056,3253741311,BE +3253741312,3253741679,GB 3253741680,3253741695,RU 3253741696,3253745151,GB 3253745152,3253745279,NO @@ -65415,7 +69580,13 @@ 3253765280,3253765295,NL 3253765296,3253765311,BE 3253765312,3253765375,TR -3253765376,3253796863,GB +3253765376,3253767615,GB +3253767616,3253767679,IE +3253767680,3253767711,GB +3253767712,3253767743,DE +3253767744,3253771199,GB +3253771200,3253771263,IE +3253771264,3253796863,GB 3253796864,3253862399,SE 3253862400,3253862655,GB 3253862656,3253882879,FR @@ -65423,14 +69594,12 @@ 3253886976,3253887231,GB 3253887232,3253887487,NL 3253887488,3253887743,ES -3253887744,3253887999,GB 3253888000,3253888255,PL 3253888256,3253888511,BE 3253888512,3253888767,GB 3253888768,3253889023,SE 3253889024,3253889279,RO 3253889280,3253889535,CH -3253889536,3253889791,DE 3253889792,3253890047,DK 3253890048,3253890303,NL 3253890560,3253890815,GB @@ -65465,7 +69634,7 @@ 3253901824,3253902079,SI 3253902080,3253902335,DK 3253902336,3253904383,UA -3253904384,3253904895,GB +3253904384,3253904895,ES 3253904896,3253905151,UA 3253905152,3253905407,RU 3253905408,3253905919,PL @@ -65508,23 +69677,37 @@ 3253967872,3253968895,UA 3253968896,3253969151,DE 3253969408,3253969919,AT -3253969920,3253970431,NL 3253970432,3253970687,RU 3253970688,3253970943,UA 3253970944,3253971967,RS 3253971968,3253972991,RU 3253972992,3253974527,GB -3253974784,3253974847,NO -3253974848,3253974911,SE -3253974976,3253975039,SE +3253974784,3253975039,SE 3253975040,3253977087,DE 3253977088,3253985279,TR 3253985280,3253993471,GB -3253993472,3254124543,BE +3253993472,3254001919,BE +3254001920,3254002175,NL +3254002176,3254079743,BE +3254079744,3254079999,HU +3254080000,3254124543,BE 3254124544,3254255615,CH -3254255616,3254263807,FR -3254263808,3254264063,GF -3254264064,3254488431,FR +3254255616,3254256127,RE +3254256128,3254256639,GP +3254256640,3254257151,YT +3254257152,3254259455,FR +3254259456,3254259967,YT +3254259968,3254260223,GF +3254260224,3254260479,MQ +3254260480,3254260991,FR +3254260992,3254262015,YT +3254262016,3254262527,FR +3254262528,3254263039,YT +3254263040,3254266367,FR +3254266368,3254266623,RE +3254266624,3254277119,FR +3254277120,3254278143,YT +3254278144,3254488431,FR 3254488432,3254488447,MG 3254488448,3254489407,FR 3254489408,3254489439,MR @@ -65556,27 +69739,24 @@ 3254508800,3254508831,MQ 3254508832,3254521855,FR 3254521856,3254522111,GB -3254522112,3254607871,FR -3254607872,3254610175,RE -3254610176,3254610431,FR -3254610432,3254610687,RE -3254610688,3254611455,FR -3254611456,3254611456,YT -3254611457,3254611711,FR -3254611712,3254611712,YT -3254611713,3254611967,FR -3254611968,3254612991,RE -3254612992,3254613247,FR -3254613248,3254614015,RE -3254614016,3254614527,FR -3254614528,3254615039,RE -3254615040,3254615551,FR -3254615552,3254615552,YT -3254615553,3254615807,FR -3254615808,3254615808,YT -3254615809,3254648831,FR -3254648832,3254649087,GB -3254649088,3254649855,AL +3254522112,3254608895,FR +3254608896,3254609151,RE +3254609152,3254609407,FR +3254609408,3254609663,RE +3254609664,3254609919,FR +3254609920,3254610431,RE +3254610432,3254610687,FR +3254610688,3254610943,RE +3254610944,3254611199,FR +3254611200,3254611455,RE +3254611456,3254611967,YT +3254611968,3254612991,FR +3254612992,3254613247,RE +3254613248,3254615039,FR +3254615040,3254615551,RE +3254615552,3254616063,YT +3254616064,3254648831,FR +3254648832,3254649855,AL 3254649856,3254650879,SE 3254653440,3254654847,DE 3254654848,3254654975,DK @@ -65584,7 +69764,9 @@ 3254656256,3254656511,BG 3254656512,3254656767,DE 3254656768,3254657023,GB -3254657024,3254665215,RO +3254657024,3254661119,ES +3254661120,3254664959,RO +3254664960,3254665215,GB 3254681600,3254697983,DE 3254697984,3254698495,SE 3254698496,3254699007,GB @@ -65638,6 +69820,7 @@ 3254788352,3254789119,ES 3254789120,3254789375,FR 3254789376,3254789631,BE +3254789890,3254789890,TK 3254790656,3254790911,LU 3254790912,3254791423,BE 3254791424,3254791679,SK @@ -65698,7 +69881,6 @@ 3254822144,3254822399,DE 3254822400,3254822655,FR 3254822656,3254822911,PL -3254822912,3254823167,CH 3254823168,3254823423,NO 3254823424,3254823679,NL 3254823680,3254823935,PL @@ -65729,7 +69911,6 @@ 3254832128,3254832383,RO 3254832384,3254832639,BE 3254832640,3254832895,UA -3254832896,3254833151,LV 3254833152,3254833407,DE 3254833408,3254833663,RU 3254833664,3254833919,GB @@ -65759,7 +69940,6 @@ 3254841344,3254841599,PL 3254841600,3254841855,IE 3254841856,3254842111,LV -3254842624,3254842879,RU 3254842880,3254843135,SE 3254843136,3254843391,DE 3254843648,3254843903,FR @@ -65831,7 +70011,6 @@ 3254901760,3254902271,UA 3254902272,3254904831,SK 3254904832,3254907903,RU -3254907904,3254908159,SK 3254908160,3254908415,CH 3254908416,3254908671,PL 3254908672,3254908927,MT @@ -65841,34 +70020,34 @@ 3254910976,3255044095,FR 3255044608,3255056383,FR 3255058432,3255067647,FR -3255068672,3255114751,FR +3255068672,3255081727,FR +3255081984,3255114751,FR 3255115264,3255117823,FR -3255118336,3255120127,FR +3255118336,3255119871,FR 3255120384,3255120639,FR 3255120640,3255120895,DE -3255120896,3255123711,FR +3255120896,3255121919,FR +3255123200,3255123711,FR 3255123712,3255123967,DE -3255123968,3255127551,FR +3255123968,3255124991,FR +3255126016,3255127551,FR 3255127808,3255128575,FR 3255129856,3255130111,HR -3255130112,3255146495,FR +3255130112,3255134207,FR +3255135232,3255140351,FR +3255141376,3255146495,FR 3255148544,3255153151,FR -3255153664,3255166975,FR -3255167488,3255172351,FR +3255153664,3255153919,FR +3255154176,3255164927,FR +3255166720,3255166975,FR +3255167488,3255167743,FR +3255168512,3255169279,FR 3255172352,3255172607,DE 3255172608,3255173119,FR 3255173120,3255173631,SH 3255173648,3255173711,GB 3255173760,3255173823,GB -3255173840,3255174151,GB -3255174160,3255174167,GB -3255174200,3255174207,GB -3255174216,3255174247,GB -3255174272,3255174279,GB -3255174312,3255174319,GB -3255174328,3255174335,GB -3255174376,3255174383,GB -3255174400,3255175167,GB +3255173840,3255175167,GB 3255175200,3255175231,GB 3255175248,3255175263,GB 3255175280,3255175295,GB @@ -65936,7 +70115,7 @@ 3255304192,3255304447,DE 3255304448,3255305215,LV 3255305216,3255305471,BG -3255305472,3255307775,LV +3255305472,3255307263,LV 3255307776,3255308031,PL 3255308032,3255308287,CH 3255308288,3255311359,LV @@ -66056,7 +70235,6 @@ 3255488512,3255489535,AT 3255492608,3255496703,GB 3255498752,3255500799,FR -3255500800,3255504895,CH 3255504896,3255505151,RU 3255505152,3255505663,GB 3255505920,3255506431,RU @@ -66067,7 +70245,9 @@ 3255507712,3255507967,AT 3255507968,3255508223,UA 3255508224,3255508479,RU -3255508480,3255544319,CH +3255508480,3255522303,CH +3255523328,3255529471,CH +3255533568,3255544319,CH 3255544320,3255544575,DE 3255544576,3255544831,AT 3255544832,3255558143,CH @@ -66076,7 +70256,7 @@ 3255562240,3255563263,CH 3255563776,3255564031,CH 3255564032,3255564287,RU -3255564288,3255565311,CH +3255564288,3255564543,CH 3255565312,3255565955,DE 3255565956,3255565956,CH 3255565957,3255566079,DE @@ -66088,9 +70268,11 @@ 3255599104,3255615487,CH 3255615488,3255623679,DE 3255623680,3255631871,BG -3255631872,3255660287,NL +3255631872,3255649279,NL +3255650304,3255660287,NL 3255660288,3255660543,GR -3255660544,3255666431,NL +3255660544,3255663615,NL +3255664640,3255666175,NL 3255666432,3255666687,DE 3255666688,3255697407,NL 3255697408,3255710719,SE @@ -66104,25 +70286,34 @@ 3255743232,3255743487,IT 3255743488,3255743743,DE 3255743744,3255743999,US -3255744000,3255762943,SE +3255744000,3255745535,SE +3255745536,3255745791,DK +3255745792,3255752959,SE +3255752960,3255753215,LI +3255753216,3255762943,SE 3255762944,3255771135,DE -3255779328,3255791615,DE +3255779328,3255782655,DE +3255783424,3255791615,DE 3255791616,3255792639,UA 3255792640,3255793663,RU 3255793664,3255794943,PL 3255794944,3255795711,RU -3255795712,3255799039,DE +3255795712,3255798783,DE 3255799040,3255799295,SE 3255799296,3255800575,DE 3255800576,3255800831,UA 3255800832,3255801855,DE -3255802368,3255817215,DE +3255802368,3255802623,DE +3255802880,3255817215,DE 3255817216,3255817471,SE 3255817472,3255817727,ES 3255817728,3255820287,DE 3255821312,3255822335,CH -3255822336,3255828479,DE -3255828480,3256025087,SE +3255822336,3255826943,DE +3255827456,3255828479,DE +3255828480,3255939623,SE +3255939624,3255939624,GB +3255939625,3256025087,SE 3256025088,3256057855,NO 3256057856,3256082431,DK 3256082432,3256090623,LV @@ -66161,7 +70352,6 @@ 3256415232,3256415743,PL 3256415744,3256416255,UA 3256416256,3256416767,RS -3256417024,3256417279,GB 3256417280,3256417791,NO 3256417792,3256418303,GB 3256418304,3256483839,DE @@ -66169,13 +70359,16 @@ 3256489472,3256489983,GR 3256489984,3256490239,BE 3256490496,3256490751,CH -3256490752,3256511487,NL +3256490752,3256502271,NL +3256503296,3256509439,NL +3256510464,3256511487,NL 3256511744,3256513023,NL -3256513280,3256524287,NL +3256513536,3256522239,NL +3256522752,3256524287,NL 3256524288,3256524799,DE -3256524800,3256528895,NL -3256530688,3256530943,DE -3256530944,3256549375,NL +3256524800,3256526847,NL +3256530944,3256531967,NL +3256532992,3256549375,NL 3256549376,3256614911,TR 3256614912,3256615935,FI 3256615936,3256616959,UA @@ -66233,6 +70426,7 @@ 3256692736,3256693759,GR 3256694784,3256695807,DE 3256695808,3256696831,UA +3256698368,3256698623,NL 3256699392,3256699647,GB 3256705024,3256705279,IE 3256705536,3256705791,BE @@ -66254,7 +70448,6 @@ 3256745984,3256778751,ES 3256778752,3256786943,CY 3256786944,3256787199,NL -3256787200,3256787455,RO 3256787456,3256787711,DE 3256787712,3256787967,UA 3256787968,3256788223,PL @@ -66298,25 +70491,32 @@ 3256827136,3256827391,IS 3256827392,3256827647,GB 3256827648,3256827903,PL -3256827904,3256864511,DE +3256827904,3256844287,DE +3256860672,3256863743,DE +3256864256,3256864511,DE 3256864512,3256864767,CH -3256864768,3256870911,DE +3256864768,3256866815,DE +3256867840,3256870911,DE 3256870912,3256871167,RU 3256871168,3256871935,DE -3256872448,3256874239,DE -3256874496,3256875007,DE +3256872448,3256873983,DE +3256874496,3256874751,DE 3256875008,3256875519,UA 3256875520,3256876031,RU 3256876032,3256876287,PL 3256876288,3256876543,RU 3256876544,3256876799,CH -3256877056,3256898559,GB +3256877056,3256896511,GB +3256898048,3256898303,GB 3256898560,3256899071,TR 3256899072,3256899583,RU -3256899584,3256915455,GB +3256899584,3256901631,GB +3256905216,3256905471,GB +3256909824,3256915455,GB 3256915456,3256915711,RS 3256915712,3256915967,SE -3256915968,3256945663,GB +3256915968,3256944639,GB +3256944896,3256945151,GB 3256945664,3256945919,SI 3256945920,3256946175,GB 3256946176,3256946431,RO @@ -66352,8 +70552,7 @@ 3256973312,3256973823,DE 3256973824,3256975359,IR 3256975360,3256988671,GB -3256988672,3256988927,RU -3256988928,3256989183,UA +3256988672,3256989183,UA 3256989440,3256989695,GB 3256989696,3256989951,HU 3256989952,3256990207,PL @@ -66367,13 +70566,21 @@ 3257011456,3257024511,GB 3257024512,3257032703,AU 3257032704,3257040895,GB -3257042944,3257051135,GB -3257052160,3257057279,GB +3257042944,3257043711,GB +3257043968,3257051135,GB +3257052160,3257052927,GB +3257053184,3257057279,GB 3257058816,3257059071,PL -3257059072,3257092607,GB +3257059328,3257065471,GB +3257073664,3257092351,GB 3257092608,3257092863,RO -3257092864,3257121535,GB -3257121792,3257139199,GB +3257092864,3257093119,GB +3257093632,3257094143,GB +3257094656,3257095167,GB +3257097472,3257097983,GB +3257098240,3257131007,GB +3257135104,3257137151,GB +3257138176,3257139199,GB 3257139200,3257139455,DK 3257139456,3257143295,GB 3257143296,3257143807,RU @@ -66383,9 +70590,8 @@ 3257144576,3257144831,GB 3257144832,3257145087,FR 3257145088,3257145343,GB -3257146112,3257146367,GB 3257147392,3257163775,GB -3257167872,3257169919,GB +3257167872,3257168895,GB 3257170176,3257176063,GB 3257178112,3257180159,GB 3257180160,3257180415,TR @@ -66396,58 +70602,63 @@ 3257181440,3257181695,PL 3257181696,3257181951,FR 3257182208,3257182463,PL -3257182464,3257186303,GB -3257188352,3257196543,GB +3257182720,3257183231,GB +3257184256,3257186303,GB +3257192448,3257196543,GB 3257196544,3257200639,LU 3257200640,3257204735,GB 3257204736,3257225215,AT -3257226240,3257227263,AT +3257226240,3257227263,DE 3257229312,3257268223,AT 3257268224,3257268479,UA 3257268480,3257268735,SE -3257268736,3257269247,AT +3257268992,3257269247,AT 3257269248,3257269503,IT -3257269504,3257270015,AT +3257269504,3257269759,AT 3257270016,3257270271,DE 3257286656,3257294847,CH 3257294848,3257303039,HU 3257303040,3257311231,PT 3257311232,3257335807,CH -3257335808,3257355775,DE -3257356288,3257357311,DE +3257335808,3257343999,DE +3257348096,3257355775,DE +3257356288,3257356799,DE 3257357312,3257357567,PT 3257357568,3257357823,SI -3257357824,3257371903,DE +3257357824,3257363455,DE +3257364480,3257371903,DE 3257371904,3257372159,BE 3257372416,3257372671,GB -3257372672,3257382911,DE +3257372672,3257381375,DE +3257381888,3257382911,DE 3257382912,3257383167,NL 3257383168,3257383679,DE -3257383936,3257388799,DE -3257388800,3257389055,FR -3257389056,3257390079,DE -3257390592,3257401343,DE +3257383936,3257387007,DE +3257388544,3257388799,DE +3257390592,3257390847,DE +3257391104,3257395199,DE +3257396480,3257396735,DE +3257397248,3257401343,DE 3257401344,3257453567,CH 3257453568,3257454591,RO 3257454592,3257455103,IT 3257455104,3257455359,RO 3257455360,3257455615,SI -3257455616,3257466879,CH +3257455616,3257461759,CH +3257462016,3257462271,CH +3257462784,3257466879,CH 3257466880,3257467135,DE 3257467392,3257467903,SE 3257467904,3257468927,IT 3257469184,3257469439,IT -3257469440,3257469951,GB 3257469952,3257470975,PL 3257470976,3257471999,FI 3257472000,3257472511,SG 3257472512,3257475071,FI -3257476096,3257477119,DE -3257480192,3257480447,GB +3257476864,3257477119,DE 3257481216,3257481471,GB 3257481472,3257481727,DE 3257481728,3257481983,FI -3257481984,3257482239,FR 3257482240,3257482751,RO 3257482752,3257483007,NL 3257483008,3257491455,CH @@ -66468,9 +70679,11 @@ 3257546688,3257546719,DE 3257546720,3257546751,DK 3257546752,3257548799,IE -3257548800,3257555199,GB -3257555200,3257555455,CH -3257555456,3257556991,GB +3257548800,3257551623,GB +3257551624,3257551647,BE +3257551648,3257551711,GB +3257551712,3257551719,BE +3257551720,3257556991,GB 3257557504,3257558015,LU 3257558016,3257559039,RO 3257559552,3257560063,UA @@ -66505,23 +70718,43 @@ 3257742336,3257743359,DE 3257743360,3257748479,NL 3257748480,3257749503,DE -3257749504,3257753087,NL -3257753088,3257753343,DE -3257753344,3257759631,NL -3257759632,3257759639,DE -3257759640,3257765887,NL +3257749504,3257765887,NL 3257765888,3257767935,DE 3257767936,3257782271,NL 3257782272,3257784319,DE 3257784320,3257794559,NL 3257794560,3257835519,GB -3257835520,3257843711,IE -3257843712,3257844735,GB -3257844736,3257860095,IE +3257835520,3257836287,IE +3257836288,3257836543,GB +3257836544,3257836799,IE +3257836800,3257837055,GB +3257837056,3257837311,IE +3257837312,3257837567,GB +3257837568,3257837823,IE +3257837824,3257838335,GB +3257838336,3257838591,IE +3257838592,3257839103,GB +3257839104,3257839359,IE +3257839360,3257839615,GB +3257839616,3257839871,IE +3257839872,3257840127,GB +3257840128,3257840383,IE +3257840384,3257840639,GB +3257840640,3257840895,IE +3257840896,3257841151,GB +3257841152,3257841407,IE +3257841408,3257841663,GB +3257841664,3257841919,IE +3257841920,3257842943,GB +3257842944,3257843199,IE +3257843200,3257843711,GB +3257843712,3257860095,IE 3257860096,3257925631,SE 3257925632,3257925887,AT 3257925888,3257926143,SE -3257926144,3257977855,AT +3257926144,3257926399,AT +3257926656,3257970687,AT +3257972736,3257977855,AT 3257977856,3257978111,GB 3257978112,3257978367,SE 3257978368,3257978623,BG @@ -66529,7 +70762,6 @@ 3257978880,3257979135,FR 3257979136,3257979391,UA 3257979392,3257979647,GB -3257979648,3257979903,DE 3257979904,3257980159,UA 3257980160,3257980415,SE 3257980416,3257980671,NL @@ -66538,15 +70770,18 @@ 3257981184,3257981439,GB 3257981440,3257981695,RU 3257981696,3257981951,PL -3257981952,3257987327,AT +3257986048,3257987327,AT 3257987328,3257987583,CZ -3257987584,3257988095,AT -3257989120,3257991167,AT -3257991168,3257995519,DE +3257987840,3257988095,AT +3257990656,3257990911,AT +3257991168,3257995263,DE 3257996032,3258003967,DE 3258003968,3258004479,RU -3258004480,3258018815,DE -3258019328,3258021887,DE +3258004992,3258005503,DE +3258006528,3258016767,DE +3258017792,3258018815,DE +3258019328,3258019583,DE +3258019840,3258021887,DE 3258021888,3258022911,RU 3258022912,3258023167,PL 3258023168,3258023423,DE @@ -66555,12 +70790,12 @@ 3258023936,3258056703,DE 3258057216,3258057471,CZ 3258058240,3258058495,RU -3258058496,3258059007,RO +3258058496,3258058751,RO 3258059008,3258059263,UA 3258059264,3258059519,RU 3258059520,3258059775,RO 3258062848,3258063103,RU -3258063104,3258063871,CZ +3258063360,3258063871,CZ 3258063872,3258064127,AT 3258064128,3258064383,FR 3258064384,3258065151,GB @@ -66583,7 +70818,6 @@ 3258070528,3258071295,GB 3258071296,3258071551,DK 3258071552,3258071807,DE -3258071808,3258072063,GB 3258072064,3258072319,FR 3258072320,3258072575,PL 3258072576,3258072831,BE @@ -66622,7 +70856,6 @@ 3258084352,3258084607,GB 3258084608,3258084863,AT 3258084864,3258085119,PL -3258085120,3258085375,LT 3258085376,3258085631,NL 3258085632,3258085887,DE 3258085888,3258086143,UA @@ -66672,18 +70905,18 @@ 3258103040,3258103295,SE 3258103296,3258103551,DE 3258103552,3258103807,AE -3258104064,3258104319,GB 3258104320,3258104575,PL 3258104576,3258104831,DE -3258105088,3258105599,CZ +3258105088,3258105343,CZ 3258105600,3258105855,DE 3258105856,3258109951,CZ 3258109952,3258110207,DK -3258110208,3258111487,CZ +3258110208,3258110975,CZ +3258111232,3258111487,CZ 3258111488,3258111743,PL 3258111744,3258118399,CZ 3258118400,3258118655,UA -3258118656,3258119679,CZ +3258118656,3258118911,CZ 3258120192,3258120703,CZ 3258121216,3258121471,PL 3258121728,3258121983,UA @@ -66693,16 +70926,18 @@ 3258230784,3258232831,NO 3258232832,3258249215,SE 3258249216,3258253311,NO -3258253312,3258272767,NL +3258253312,3258269695,NL +3258271744,3258272767,NL 3258272768,3258273791,FR -3258273792,3258279935,NL -3258281984,3258284031,NL -3258284288,3258290175,NL +3258273792,3258275071,NL +3258275840,3258286079,NL +3258286592,3258288127,NL 3258294272,3258297343,NL 3258297344,3258297599,BE 3258297600,3258298111,NL 3258298112,3258298367,GB -3258298368,3258318847,NL +3258298368,3258302463,NL +3258306560,3258318847,NL 3258318848,3258320895,DE 3258320896,3258321919,GB 3258321920,3258322943,RU @@ -66719,7 +70954,6 @@ 3258343424,3258351615,NO 3258351616,3258352639,RO 3258352640,3258353663,RU -3258353664,3258354687,NO 3258354688,3258355711,BG 3258355712,3258356735,NL 3258356736,3258357759,RU @@ -66733,14 +70967,19 @@ 3258366976,3258367999,PL 3258368000,3258384383,KW 3258384384,3258385407,DE -3258386432,3258411007,DE -3258411520,3258427647,DE +3258388480,3258395647,DE +3258396672,3258423295,DE +3258424320,3258424575,DE +3258424832,3258426367,DE 3258427648,3258427903,RO 3258427904,3258428159,DE -3258428416,3258449919,DE -3258449920,3258486783,CH +3258428416,3258444799,DE +3258445824,3258449919,DE +3258449920,3258468351,CH +3258474496,3258486783,CH 3258486784,3258487807,LI -3258487808,3258503935,CH +3258488832,3258495999,CH +3258499072,3258503935,CH 3258503936,3258504191,PL 3258504192,3258504703,CH 3258504704,3258504959,DE @@ -66750,11 +70989,15 @@ 3258507008,3258515455,CH 3258515456,3258580991,FR 3258580992,3258646527,RU -3258646528,3258691583,DE +3258646528,3258654719,DE +3258655232,3258659839,DE +3258660864,3258681343,DE +3258683136,3258689023,DE +3258689536,3258690047,DE +3258690560,3258691583,DE 3258691840,3258692351,AT 3258692352,3258692607,DE 3258692608,3258692863,FR -3258692864,3258693119,DE 3258693120,3258693375,SI 3258693376,3258693631,DE 3258693632,3258693887,RU @@ -66780,10 +71023,10 @@ 3258732544,3258732799,SE 3258732800,3258733055,CH 3258733056,3258733311,RO -3258733312,3258734591,GB +3258733312,3258734079,GB 3258735104,3258735359,GB 3258736640,3258745855,GB -3258746880,3258762751,GB +3258746880,3258762239,GB 3258763264,3258764287,GB 3258764288,3258764543,DE 3258764800,3258765055,BE @@ -66802,7 +71045,8 @@ 3258776064,3258776319,GE 3258776320,3258776575,PL 3258776576,3258777599,UA -3258777600,3258789887,GB +3258777600,3258784255,GB +3258784768,3258789887,GB 3258789888,3258790911,CZ 3258790912,3258792191,RU 3258792192,3258792447,PL @@ -66813,20 +71057,23 @@ 3258794496,3258794751,PL 3258794752,3258795007,RU 3258795008,3258796031,PL -3258796032,3258802175,GB +3258797056,3258797311,GB +3258797568,3258802175,GB 3258802176,3258806271,LU -3258806272,3258813439,GB -3258814464,3258818047,GB +3258806272,3258810367,GB +3258812416,3258813439,GB 3258818048,3258818303,SE -3258818560,3258843135,GB +3258818560,3258834943,GB +3258839040,3258843135,GB 3258843136,3258843391,RU -3258843648,3258847231,GB +3258844928,3258847231,GB 3258848256,3258848767,GB 3258848768,3258849023,RO 3258849024,3258849279,DE 3258849280,3258859519,GB 3258859520,3258859775,BY -3258859776,3258900479,GB +3258859776,3258860031,GB +3258860288,3258900479,GB 3258901504,3258902783,GB 3258903040,3258903295,FR 3258903296,3258903551,GB @@ -66850,16 +71097,15 @@ 3259226112,3259227391,RU 3259227392,3259227647,KZ 3259227648,3259236351,RU -3259236352,3259236863,SE -3259236864,3259237119,CH -3259237120,3259237887,SE +3259236352,3259237887,SE 3259237888,3259238143,FR 3259238144,3259243007,SE 3259243008,3259243519,AT 3259243520,3259244543,US 3259244544,3259246591,SE 3259246592,3259247615,IT -3259247616,3259248127,SE +3259247616,3259247871,LI +3259247872,3259248127,SE 3259248128,3259248383,GB 3259248384,3259248895,SE 3259248896,3259249151,GB @@ -66881,7 +71127,9 @@ 3259285760,3259286015,GB 3259286016,3259290879,SE 3259290880,3259291135,US -3259291136,3259297535,SE +3259291136,3259293951,SE +3259293952,3259294207,LI +3259294208,3259297535,SE 3259297536,3259297791,GB 3259297792,3259301887,SE 3259301888,3259302143,DE @@ -66912,7 +71160,9 @@ 3259438080,3259438335,ES 3259438336,3259457279,SE 3259457280,3259457535,IT -3259457536,3259470847,SE +3259457536,3259466239,SE +3259466240,3259466495,LI +3259466496,3259470847,SE 3259470848,3259471871,US 3259471872,3259479807,SE 3259479808,3259480063,DK @@ -66920,20 +71170,25 @@ 3259480832,3259481087,ES 3259481088,3259490303,SE 3259490304,3259490815,IN -3259490816,3259498495,SE +3259490816,3259491071,SE +3259491072,3259491327,LI +3259491328,3259498495,SE 3259498496,3259541503,GB 3259541504,3259543551,NL 3259543552,3259760639,GB -3259760640,3259814399,DE +3259761152,3259767295,DE +3259768064,3259787263,DE +3259787776,3259789311,DE +3259791360,3259814399,DE 3259814400,3259814655,AT 3259814656,3259816447,DE 3259816704,3259821055,DE 3259821824,3259822079,AT -3259822080,3259823103,DE +3259822592,3259823103,DE 3259823104,3259823615,RO 3259823616,3259823871,NO 3259823872,3259824127,IE -3259824128,3259825919,DE +3259824128,3259825663,DE 3259826176,3259891711,DE 3259891712,3259957247,BE 3259957248,3259958271,DE @@ -66976,12 +71231,10 @@ 3260549120,3260549375,AT 3260549376,3260549631,CH 3260549632,3260549887,DE -3260550144,3260550399,PL -3260550400,3260550655,DE 3260550656,3260551167,RU 3260551168,3260553983,DE 3260553984,3260554239,GB -3260554240,3260555263,SE +3260554240,3260555263,CH 3260555264,3260563455,HU 3260563456,3260571647,GB 3260571648,3260579839,BE @@ -67030,8 +71283,7 @@ 3260678144,3260743679,IL 3260743680,3260809215,IT 3260809216,3260874751,PL -3260891136,3260893439,DK -3260893440,3260894207,SE +3260893184,3260894207,SE 3260894208,3260895231,AT 3260895232,3260898303,SE 3260898304,3260899327,ES @@ -67041,7 +71293,7 @@ 3260900608,3260901119,NL 3260901120,3260903423,DE 3260903424,3260906239,CH -3260906240,3260906495,DE +3260906368,3260906495,DE 3260906496,3260907519,PL 3260907520,3260915711,GB 3260915712,3260923903,UA @@ -67056,8 +71308,9 @@ 3261202432,3261213439,FR 3261213440,3261213695,AF 3261213696,3261267967,FR -3261267968,3261281023,DE -3261281280,3261297663,DE +3261267968,3261280767,DE +3261281280,3261282559,DE +3261283328,3261297663,DE 3261297664,3261297919,RU 3261297920,3261298175,PL 3261298176,3261333503,DE @@ -67072,11 +71325,14 @@ 3261534720,3261534975,US 3261534976,3261539327,SE 3261539328,3261540351,SG -3261540352,3261595647,SE +3261540352,3261554175,SE +3261554176,3261554431,DK +3261554432,3261595647,SE 3261595648,3261599743,NL -3261600768,3261627903,NL -3261628160,3261632511,NL -3261633536,3261636095,NL +3261600768,3261624831,NL +3261625344,3261625855,NL +3261626368,3261632511,NL +3261634048,3261636095,NL 3261636352,3261643775,NL 3261644800,3261661183,NL 3261661184,3261669375,RO @@ -67088,9 +71344,7 @@ 3261677568,3261685759,GB 3261685760,3261687807,DE 3261687808,3261689855,RO -3261689856,3261690623,GB -3261690624,3261690879,AU -3261690880,3261691903,GB +3261689856,3261691903,GB 3261691904,3261692997,NL 3261692998,3261692998,US 3261692999,3261694463,NL @@ -67143,14 +71397,17 @@ 3261797632,3261797887,RU 3261797888,3261798143,TR 3261798144,3261798399,RU -3261798400,3261812735,AT +3261798400,3261805567,AT +3261805568,3261806591,DE +3261806592,3261810687,AT 3261812736,3261812991,RU -3261812992,3261816575,AT +3261812992,3261815807,AT +3261816064,3261816575,AT 3261816576,3261816831,DE 3261816832,3261820927,AT 3261820928,3261821183,RO 3261821184,3261821439,AT -3261821440,3261821695,NL +3261821440,3261821695,GB 3261821696,3261821951,UA 3261821952,3261822207,RU 3261822208,3261822463,UA @@ -67163,21 +71420,18 @@ 3261824000,3261824255,RU 3261824512,3261824767,FR 3261824768,3261825023,PT -3261825024,3261837311,AT -3261839360,3261855743,AT +3261825280,3261827071,AT +3261828096,3261855743,AT 3261857792,3261923327,CZ 3261923328,3261988863,NL 3261988864,3261989119,SE -3261989120,3261989631,FI -3261990144,3261990399,FI 3261990400,3261990655,UA -3261990656,3261990911,FI -3261992448,3261993215,FI 3261993472,3261993727,RU -3261993728,3261995263,FI +3261993728,3261993983,FI +3261994752,3261995263,FI 3261995264,3261995519,DE 3261995520,3261995775,PL -3261995776,3262005247,FI +3261996800,3262005247,FI 3262005248,3262005759,PL 3262005760,3262006015,RU 3262006016,3262006271,NL @@ -67191,20 +71445,16 @@ 3262008576,3262008831,PL 3262008832,3262009087,AT 3262009088,3262009343,UA -3262009344,3262010367,FI -3262011392,3262013439,FI +3262010112,3262010367,FI 3262013440,3262017535,SE -3262017536,3262018559,FI 3262018560,3262018815,PL -3262018816,3262019071,FI -3262020096,3262021119,FI 3262021120,3262021375,UA 3262021376,3262021631,PL 3262021632,3262021887,CH 3262021888,3262022143,UA 3262022912,3262023167,DE 3262023680,3262023935,DK -3262023936,3262025727,FI +3262025216,3262025471,FI 3262027264,3262027519,TR 3262027520,3262027775,BE 3262027776,3262028287,RU @@ -67213,7 +71463,6 @@ 3262028800,3262029823,DE 3262029824,3262030847,NL 3262030848,3262031871,FR -3262031872,3262033919,FI 3262033920,3262038015,AX 3262038016,3262038271,FR 3262038272,3262038527,RU @@ -67292,15 +71541,17 @@ 3262151936,3262152191,DE 3262152664,3262152671,DE 3262152704,3262185471,AT -3262185472,3262191615,DE -3262192128,3262192383,DE -3262192640,3262196479,DE -3262196736,3262203903,DE -3262204928,3262224383,DE +3262185472,3262194175,DE +3262195712,3262196223,DE +3262197760,3262200319,DE +3262200576,3262201087,DE +3262201856,3262224383,DE 3262224896,3262225151,AT -3262225152,3262227711,DE +3262226432,3262227455,DE 3262227712,3262227967,RO -3262227968,3262229247,DE +3262227968,3262228223,DE +3262228480,3262228735,DE +3262228992,3262229247,DE 3262229248,3262229503,NL 3262229504,3262248191,DE 3262248448,3262283775,DE @@ -67376,7 +71627,6 @@ 3262461312,3262461439,NO 3262461440,3262461567,DE 3262461568,3262461695,GB -3262461696,3262461823,UA 3262461824,3262461951,RO 3262461952,3262463999,IQ 3262464000,3262472191,RU @@ -67479,18 +71729,14 @@ 3262479428,3262479428,FR 3262479429,3262479654,DE 3262479655,3262479655,NL -3262479656,3262479751,DE -3262479752,3262479752,CH -3262479753,3262480282,DE +3262479656,3262480282,DE 3262480283,3262480283,GB -3262480284,3262480316,DE -3262480317,3262480317,NL +3262480284,3262480317,DE 3262480318,3262480318,IT 3262480319,3262480383,DE 3262480384,3262488575,GB 3262488576,3262496767,SE 3262496768,3262504959,FR -3262504960,3262505471,DE 3262505472,3262505983,GB 3262505984,3262506495,PL 3262506496,3262507007,RO @@ -67502,11 +71748,7 @@ 3262511104,3262511615,GB 3262512128,3262512639,UA 3262512640,3262513151,DE -3262513152,3262550271,AT -3262550272,3262550527,DE -3262550528,3262562815,AT -3262562816,3262563071,HU -3262563072,3262578687,AT +3262513152,3262578687,AT 3262578688,3262611455,FR 3262611456,3262627839,GB 3262627840,3262636031,IT @@ -67515,19 +71757,17 @@ 3262648320,3262648575,DE 3262648576,3262654463,NL 3262654464,3262654719,DE -3262654720,3262658967,NL -3262658968,3262658975,DE -3262658976,3262664703,NL -3262664704,3262670847,DE +3262654720,3262664703,NL +3262664704,3262665736,DE +3262665737,3262665737,CH +3262665738,3262670847,DE 3262670848,3262690815,NL 3262690816,3262691583,DE 3262691584,3262693375,NL 3262693376,3262701567,DE 3262701568,3262715135,NL 3262715136,3262715391,DE -3262715392,3262718463,NL -3262718464,3262718471,DE -3262718472,3262722815,NL +3262715392,3262722815,NL 3262722816,3262723071,DE 3262723072,3262732799,NL 3262732800,3262733055,DE @@ -67536,9 +71776,13 @@ 3262754816,3262832639,NL 3262832640,3262840319,DE 3262840320,3262906367,NL -3262906368,3262954495,CH +3262906368,3262914559,CH +3262922752,3262954495,CH 3262954496,3262955519,LI -3262955520,3262964991,CH +3262955520,3262958591,CH +3262959360,3262960127,CH +3262960640,3262960895,CH +3262961408,3262964991,CH 3262964992,3262965247,DE 3262965248,3262971903,CH 3262971904,3263029247,IE @@ -67557,7 +71801,6 @@ 3263062016,3263070207,EE 3263070208,3263070719,FR 3263070720,3263070975,NL -3263070976,3263071487,DE 3263072256,3263074303,LB 3263074304,3263074815,CH 3263074816,3263075327,RO @@ -67573,7 +71816,7 @@ 3263085568,3263086591,CH 3263086592,3263086847,DK 3263086848,3263087103,NL -3263087104,3263087871,DE +3263087360,3263087871,DE 3263087872,3263088127,SI 3263088128,3263088383,DE 3263088384,3263088639,LV @@ -67589,7 +71832,6 @@ 3263091456,3263091711,NO 3263091712,3263091967,FI 3263091968,3263092479,HR -3263092480,3263092735,ES 3263092736,3263092991,PL 3263092992,3263093247,FR 3263093248,3263093503,CH @@ -67599,12 +71841,12 @@ 3263094784,3263095039,UA 3263095040,3263095295,ES 3263095296,3263095551,FR -3263095552,3263095807,RO 3263095808,3263096063,DE 3263096064,3263096319,PL 3263096320,3263096575,TR 3263096576,3263096831,SA 3263096832,3263097087,PL +3263097088,3263097343,FR 3263097344,3263097599,DK 3263097600,3263097855,NL 3263097856,3263098111,FR @@ -67632,7 +71874,7 @@ 3263104042,3263121420,DE 3263121421,3263121421,BE 3263121422,3263131647,DE -3263132672,3263137791,DE +3263133696,3263137791,DE 3263137792,3263138303,PL 3263138304,3263138551,DE 3263138552,3263138815,AT @@ -67640,7 +71882,9 @@ 3263168512,3263430655,GB 3263430656,3263436543,SE 3263436544,3263436799,ES -3263436800,3263458047,SE +3263436800,3263446527,SE +3263446528,3263447039,DE +3263447040,3263458047,SE 3263458048,3263458303,DE 3263458304,3263459583,SE 3263459584,3263459839,FR @@ -67652,9 +71896,7 @@ 3263478528,3263478783,ES 3263478784,3263480831,SE 3263480832,3263481855,JP -3263481856,3263482879,SE -3263482880,3263483903,IT -3263483904,3263496191,SE +3263481856,3263496191,SE 3263496192,3263501519,GB 3263501520,3263501527,IE 3263501528,3263503103,GB @@ -67683,7 +71925,11 @@ 3263692800,3263823871,FI 3263823872,3263826943,DE 3263826944,3263827199,AT -3263827200,3263878145,DE +3263827200,3263833855,DE +3263833856,3263833903,GB +3263833904,3263833919,DE +3263833920,3263834111,GB +3263834112,3263878145,DE 3263878146,3263878146,US 3263878147,3263886079,DE 3263886080,3263886335,SG @@ -67692,7 +71938,8 @@ 3263979520,3263987711,DE 3263987712,3264004095,ES 3264004096,3264012287,HU -3264012544,3264013055,GB +3264012544,3264012799,FR +3264012800,3264013055,GB 3264013056,3264013311,TR 3264013312,3264013567,UA 3264013824,3264014079,NL @@ -67746,18 +71993,15 @@ 3264307200,3264311295,PL 3264311808,3264312063,DE 3264312064,3264312319,CH -3264312320,3264312575,PL 3264312576,3264312831,UA 3264312832,3264313087,DE 3264313088,3264313343,NL 3264313344,3264313599,RO 3264313600,3264313855,PT 3264313856,3264314623,DE -3264314624,3264314879,SE 3264314880,3264315135,GB 3264315392,3264317439,IE 3264318464,3264318975,ES -3264318976,3264319487,DE 3264319488,3264319743,FR 3264319744,3264319999,SE 3264320000,3264320255,DE @@ -67765,7 +72009,6 @@ 3264321024,3264321535,DE 3264321792,3264322047,RS 3264322048,3264322303,FR -3264322304,3264322559,RO 3264322560,3264322815,HU 3264322816,3264323071,CH 3264323072,3264323327,RU @@ -67808,9 +72051,13 @@ 3264345088,3264346111,NL 3264346112,3264347135,SE 3264347136,3264348159,DE -3264348672,3264372223,FR -3264372736,3264375039,FR -3264375040,3264376063,SE +3264350208,3264356351,FR +3264356608,3264356863,FR +3264357632,3264357887,DE +3264359936,3264360191,FR +3264360448,3264369151,FR +3264372736,3264374783,FR +3264374784,3264376063,SE 3264376064,3264376319,HR 3264376320,3264376575,UA 3264376576,3264376831,CH @@ -67850,33 +72097,36 @@ 3264409600,3264410623,RU 3264410624,3264411647,NO 3264411648,3264413695,PL -3264417536,3264419327,CH +3264417792,3264419839,CH 3264423424,3264428031,CH -3264430592,3264431103,CH +3264430592,3264430847,CH 3264431104,3264431615,LI 3264431616,3264431871,CH -3264432128,3264434687,CH +3264432128,3264434431,CH 3264434944,3264438783,CH -3264439296,3264439551,CH -3264439808,3264441343,CH +3264439808,3264440831,CH 3264441344,3264441599,PL -3264442112,3264444415,CH -3264444672,3264444927,CH -3264444928,3264445183,DE -3264445184,3264445439,CH +3264442368,3264446463,CH 3264447488,3264447743,CH 3264447744,3264447999,DE -3264448000,3264452607,CH +3264448000,3264448511,CH +3264449792,3264450047,CH +3264450304,3264452607,CH 3264454656,3264456191,CH 3264456704,3264463871,CH 3264463872,3264466943,LI 3264466944,3264474623,CH -3264474880,3264476671,CH +3264475136,3264475391,CH +3264476416,3264476671,CH 3264476672,3264477183,RU 3264477184,3264477439,PL 3264477440,3264477695,RU -3264477696,3264544767,CH -3264544768,3264561151,HU +3264477952,3264544767,CH +3264544768,3264556799,HU +3264556800,3264557055,BG +3264557056,3264557823,HU +3264557824,3264558079,BG +3264558080,3264561151,HU 3264561152,3264563199,RU 3264563200,3264564223,ES 3264564224,3264565247,IE @@ -67902,7 +72152,11 @@ 3264606976,3264607231,BE 3264607232,3264607487,IT 3264607488,3264610303,DE -3264610304,3264614911,GB +3264610304,3264612479,GB +3264612480,3264612575,FR +3264612576,3264613027,GB +3264613028,3264613031,FR +3264613032,3264614911,GB 3264614912,3264615167,SE 3264615168,3264617983,GB 3264617984,3264618239,US @@ -67912,7 +72166,7 @@ 3264624640,3264624671,US 3264624672,3264626687,GB 3264626688,3264627711,EE -3264628736,3264630783,UA +3264628736,3264629759,UA 3264630784,3264631807,DE 3264631808,3264632831,RO 3264632832,3264633855,RU @@ -68038,19 +72292,16 @@ 3264846208,3264846335,AE 3264846336,3264846463,GB 3264846464,3264846591,NO -3264846592,3264846719,US 3264846720,3264846847,RU 3264846848,3264846911,DK 3264846912,3264847103,CY 3264847168,3264847199,IE -3264847200,3264847231,NO 3264847232,3264847263,CH 3264847264,3264847295,LI 3264847296,3264847359,CY 3264847488,3264847615,RU 3264847616,3264847679,PL 3264847680,3264847743,FI -3264847744,3264847807,BE 3264847808,3264847871,SE 3264847872,3264849919,DE 3264849920,3264850431,GB @@ -68078,24 +72329,36 @@ 3264921600,3264929791,LU 3264929792,3264937983,SK 3264937984,3265003519,GB -3265003520,3265018879,DE +3265003520,3265005567,DE +3265007616,3265010175,DE +3265011712,3265018879,DE 3265018880,3265019903,HK -3265036288,3265042943,DE -3265043456,3265045759,DE +3265036288,3265037311,DE +3265038080,3265042943,DE +3265043712,3265043967,DE +3265044736,3265044991,DE 3265045760,3265046015,TR -3265046016,3265055231,DE +3265046016,3265048575,DE +3265050624,3265052671,DE +3265053696,3265054719,DE 3265055232,3265055743,FR 3265055744,3265069055,DE 3265069056,3265134591,FI 3265134592,3265137983,CH 3265137984,3265138047,NL -3265138048,3265138863,CH +3265138048,3265138599,CH +3265138600,3265138607,NL +3265138608,3265138863,CH 3265138864,3265138879,SE -3265138880,3265139999,CH +3265138880,3265139967,CH +3265139968,3265139975,BE +3265139976,3265139999,CH 3265140000,3265140015,BE -3265140016,3265140991,CH -3265140992,3265141247,GB -3265141248,3265141551,CH +3265140016,3265140119,CH +3265140120,3265140127,BE +3265140128,3265141135,CH +3265141136,3265141151,GB +3265141152,3265141551,CH 3265141552,3265141555,IE 3265141556,3265141759,CH 3265141760,3265141775,GB @@ -68125,7 +72388,7 @@ 3265371136,3265376255,DE 3265377280,3265378303,GB 3265378304,3265379327,NL -3265380352,3265382399,GB +3265380352,3265382911,GB 3265386496,3265386751,NL 3265387008,3265387263,NL 3265388544,3265392639,GB @@ -68137,7 +72400,6 @@ 3265593344,3265594367,RU 3265594880,3265595391,UA 3265595392,3265595903,PL -3265595904,3265596415,RU 3265596416,3265596927,GB 3265596928,3265597439,FR 3265597440,3265599999,RU @@ -68149,7 +72411,6 @@ 3265602048,3265602303,NL 3265602560,3265602815,IT 3265602816,3265603071,IE -3265603072,3265603327,DK 3265603328,3265603583,MD 3265603584,3265603839,DE 3265603840,3265604095,PL @@ -68182,9 +72443,13 @@ 3265724416,3265789951,FR 3265789952,3265824767,GB 3265824768,3265825023,US -3265825024,3265877247,GB -3265877504,3265879039,GB -3265880064,3265887487,GB +3265825024,3265867775,GB +3265868288,3265868543,GB +3265868800,3265869055,DE +3265869312,3265869823,GB +3265871872,3265878015,GB +3265880064,3265886207,GB +3265887232,3265887487,GB 3265887488,3265887743,PT 3265887744,3265888255,PL 3265888256,3265902335,GB @@ -68192,7 +72457,6 @@ 3265904384,3265904639,RO 3265904640,3265904895,DE 3265905152,3265905663,GB -3265905664,3265905919,IE 3265905920,3265906175,GB 3265906176,3265906431,DE 3265906432,3265906687,CH @@ -68214,7 +72478,6 @@ 3265911808,3265912063,PL 3265912064,3265912319,GB 3265912320,3265912575,DE -3265912576,3265912831,RO 3265912832,3265913087,CZ 3265913088,3265913343,SE 3265913344,3265914367,PL @@ -68297,21 +72560,21 @@ 3266420736,3266428927,GB 3266428928,3266437119,GR 3266437120,3266445311,GL -3266445312,3266472959,NL -3266472960,3266473215,SE -3266473216,3266510847,NL +3266445312,3266510847,NL 3266510848,3266543615,ES 3266543616,3266576383,IT -3266576384,3266582783,DE -3266583040,3266588927,DE -3266589184,3266603519,DE -3266604032,3266617327,DE +3266576384,3266588927,DE +3266589440,3266603007,DE +3266603264,3266603519,DE +3266604032,3266617279,DE 3266617328,3266617343,GB -3266617344,3266634383,DE +3266617344,3266621439,DE +3266624512,3266634383,DE 3266634392,3266634399,EE 3266634400,3266634431,DE -3266634464,3266634751,DE -3266635520,3266637055,DE +3266634496,3266634751,DE +3266636288,3266636799,DE +3266636928,3266636991,DE 3266637312,3266641919,DE 3266641920,3266707455,PL 3266707456,3266772991,DK @@ -68334,7 +72597,6 @@ 3267040256,3267041279,RO 3267042304,3267043327,UA 3267043328,3267044351,GB -3267044352,3267045375,RU 3267045376,3267046399,PL 3267046400,3267047423,NL 3267047424,3267048447,UA @@ -68406,18 +72668,25 @@ 3267537920,3267538943,FR 3267549184,3267550207,DK 3267559424,3267624959,DE +3267628400,3267628415,FR 3267630080,3267631095,GB 3267631096,3267631103,IT 3267631104,3267631615,GB 3267634176,3267635199,GB -3267636864,3267636991,ZA 3267648320,3267648335,GB 3267650320,3267650335,AT -3267660608,3267660671,ES +3267657576,3267657583,RO +3267657696,3267657703,RO +3267657712,3267657727,RO +3267661904,3267661967,ES +3267662896,3267662911,IE 3267665920,3267666943,GB 3267667456,3267667967,GB 3267670016,3267671039,ZA 3267674208,3267674239,GB +3267681312,3267681327,FR +3267681888,3267681903,FR +3267683936,3267683967,PL 3267684352,3267684863,GB 3267690496,3267691519,FI 3267691520,3267692543,SE @@ -68449,7 +72718,7 @@ 3268223200,3268223231,GB 3268224768,3268225023,US 3268226368,3268226399,GB -3268226496,3268226663,GB +3268226496,3268226655,GB 3268226688,3268226815,GB 3268227328,3268227391,GB 3268227520,3268227615,GB @@ -68471,12 +72740,14 @@ 3268235520,3268235775,GB 3268235936,3268236031,GB 3268236192,3268236207,GB -3268236544,3268236607,GB -3268236672,3268236799,GB +3268236544,3268236799,GB +3268237824,3268237839,GB 3268238336,3268238359,GB 3268238368,3268238399,GB 3268238472,3268238543,GB -3268238552,3268238847,GB +3268238552,3268238591,GB +3268238632,3268238783,GB +3268238816,3268238847,GB 3268239584,3268240127,GB 3268240160,3268240191,GB 3268240384,3268240399,GB @@ -68501,9 +72772,7 @@ 3268249600,3268251311,GB 3268251312,3268251327,IE 3268251328,3268251647,GB -3268254464,3268254543,GB -3268254592,3268254607,GB -3268254624,3268254639,GB +3268254464,3268254719,GB 3268254896,3268254903,GB 3268255824,3268255863,GB 3268255896,3268255919,GB @@ -68562,14 +72831,10 @@ 3268345856,3268411391,GB 3268411392,3268426751,AT 3268426752,3268427775,CH -3268427776,3268463615,AT -3268463616,3268463871,CH -3268463872,3268464127,AT +3268427776,3268464127,AT 3268464128,3268464383,LI 3268464384,3268476927,AT -3268476928,3268537087,CH -3268537088,3268537343,US -3268537344,3268542463,CH +3268476928,3268542463,CH 3268542464,3268607999,PT 3268608000,3268673535,FI 3268673536,3268739071,CZ @@ -68663,6 +72928,7 @@ 3269285088,3269285135,DE 3269285136,3269285151,GB 3269285152,3269285215,DE +3269285216,3269285311,FR 3269285312,3269285327,DE 3269285336,3269285343,FR 3269285344,3269285344,GB @@ -68791,7 +73057,9 @@ 3270680576,3270688767,FR 3270688768,3270836223,IT 3270836224,3270901759,DE -3270901760,3270909951,IT +3270901760,3270903807,IT +3270903808,3270905855,SE +3270905856,3270909951,IT 3270909952,3270911743,DE 3270911840,3270911871,PL 3270911872,3270911935,DE @@ -68916,7 +73184,7 @@ 3271745024,3271745535,PL 3271745536,3271746047,GB 3271746048,3271746559,RU -3271746560,3271747071,CH +3271746560,3271747071,US 3271747072,3271747583,KZ 3271747584,3271748095,RU 3271748096,3271748607,GR @@ -68977,7 +73245,7 @@ 3271916032,3271916543,GB 3271916544,3271917311,UA 3271917312,3271925759,RU -3271925760,3271926015,DE +3271925760,3271926015,DK 3271926016,3271926271,MD 3271926272,3271926527,RU 3271926528,3271926783,NL @@ -69005,8 +73273,9 @@ 3271933440,3271933695,SE 3271933696,3271933951,DE 3271933952,3272015871,FR -3272015872,3272017407,RO -3272017664,3272018943,RO +3272015872,3272016639,RO +3272016896,3272017919,RO +3272018176,3272018431,RO 3272019968,3272020991,IT 3272020992,3272024063,DK 3272024064,3272032255,IE @@ -69233,15 +73502,15 @@ 3272392704,3272400895,AT 3272400912,3272400919,GB 3272402432,3272402687,GB -3272402688,3272402815,SE 3272403968,3272404991,FR 3272404992,3272406015,DE 3272406016,3272407039,NL 3272409088,3272417279,BE -3272417280,3272418687,FR -3272418688,3272419327,PL +3272417280,3272418303,FR +3272418304,3272418559,GB +3272418560,3272418687,FR +3272418816,3272419327,PL 3272419328,3272420351,DE -3272420608,3272420863,DE 3272420864,3272420991,PL 3272420992,3272421119,DK 3272421376,3272421887,RO @@ -69275,7 +73544,6 @@ 3272479744,3272480255,SE 3272480256,3272480511,FR 3272480512,3272480767,CH -3272480768,3272481023,DE 3272481024,3272481279,SE 3272481792,3272482047,IT 3272482048,3272482303,NL @@ -69336,7 +73604,7 @@ 3272884224,3272892415,DE 3272892416,3272892927,UA 3272893440,3272893951,SE -3272893952,3272894463,UA +3272893952,3272894463,RU 3272894976,3272895487,RO 3272895488,3272895999,GB 3272896000,3272896511,PL @@ -69448,7 +73716,6 @@ 3273261056,3273261567,NO 3273261568,3273262079,BE 3273262080,3273262591,LU -3273262592,3273263103,RU 3273263616,3273264127,SE 3273264128,3273264639,PL 3273264640,3273265151,AT @@ -69473,6 +73740,7 @@ 3273326592,3273326847,IE 3273326984,3273326987,DE 3273326992,3273327047,DE +3273327104,3273327231,DE 3273327264,3273327287,DE 3273327376,3273327423,IE 3273327424,3273327511,GB @@ -69503,9 +73771,8 @@ 3273333056,3273333119,DE 3273334272,3273334783,DE 3273334784,3273335039,AE -3273335040,3273335295,DE 3273335296,3273335423,GB -3273335432,3273335439,GB +3273335432,3273335455,GB 3273335936,3273335999,DE 3273336848,3273336863,DE 3273336864,3273336871,GB @@ -69639,17 +73906,14 @@ 3273687040,3273719807,DE 3273719808,3273720831,NL 3273720832,3273720847,IE -3273720848,3273726719,NL -3273726720,3273726975,GB -3273726976,3273727087,DK +3273720848,3273727087,NL 3273727088,3273727088,GB 3273727089,3273727095,ES -3273727096,3273727119,DK +3273727096,3273727119,NL 3273727120,3273727127,PT -3273727128,3273727135,DK +3273727128,3273727135,NL 3273727136,3273727167,IT -3273727168,3273727231,DK -3273727232,3273732095,NL +3273727168,3273732095,NL 3273732096,3273736191,GB 3273736192,3273744383,FR 3273744384,3273746943,GB @@ -69660,7 +73924,9 @@ 3273762304,3273762559,NL 3273762560,3273768959,DE 3273768960,3273785343,TR -3273785344,3273801727,RU +3273785344,3273792511,RU +3273792512,3273793023,UZ +3273793024,3273801727,RU 3273801728,3273802239,DE 3273802752,3273803263,SA 3273803776,3273804287,CH @@ -69690,7 +73956,6 @@ 3273867264,3273867519,BE 3273867520,3273867775,UA 3273867776,3273868031,PT -3273868032,3273868287,GB 3273868288,3273869311,RU 3273869312,3273871359,DE 3273871360,3273871615,PL @@ -69725,14 +73990,15 @@ 3273883392,3273883647,DE 3273883648,3273916415,NL 3273916416,3273932799,IT -3273932800,3273949183,DE +3273932800,3273940991,DE +3273940992,3273943039,GB +3273943040,3273949183,DE 3273949184,3273981951,FR 3273981952,3274047487,DE 3274050560,3274051583,PL 3274051584,3274052351,UA 3274052352,3274052607,GB 3274052608,3274052863,DE -3274052864,3274053119,GB 3274053120,3274053375,KZ 3274053376,3274053631,RU 3274053632,3274054655,DE @@ -69751,7 +74017,6 @@ 3274163200,3274163711,UA 3274163712,3274164223,BG 3274164224,3274164735,AT -3274165248,3274165759,GB 3274165760,3274166271,RU 3274166272,3274166783,AT 3274166784,3274167295,UA @@ -69811,7 +74076,6 @@ 3274368512,3274368767,AT 3274368768,3274369023,FR 3274370048,3274371071,GB -3274371072,3274373375,NL 3274373376,3274373631,PL 3274373632,3274374143,FR 3274374144,3274375167,DE @@ -69940,8 +74204,7 @@ 3274471680,3274471935,GB 3274472960,3274483711,GB 3274489600,3274489855,GB -3274490176,3274490895,GB -3274490912,3274491199,GB +3274490176,3274491199,GB 3274491208,3274491247,GB 3274491256,3274491295,GB 3274491304,3274491319,GB @@ -70003,7 +74266,6 @@ 3274695424,3274695679,PL 3274695680,3274695935,SI 3274695936,3274696191,DE -3274696192,3274696447,DK 3274696448,3274696703,CH 3274696704,3274696959,IT 3274696960,3274697215,GR @@ -70041,11 +74303,7 @@ 3274814464,3274815487,GB 3274815488,3274816511,RU 3274816512,3274817535,SK -3274817536,3274819839,RU -3274819840,3274820095,UA -3274820096,3274821119,RU -3274821120,3274821375,UA -3274821376,3274821631,RU +3274817536,3274821631,RU 3274821632,3274823679,KZ 3274823680,3274825727,TR 3274825728,3274827775,DE @@ -70113,16 +74371,16 @@ 3275415552,3275423743,UA 3275423744,3275423751,GB 3275423808,3275423839,GB -3275423872,3275424735,GB -3275424752,3275425343,GB -3275425536,3275425559,GB -3275425568,3275425583,GB -3275425792,3275426559,GB +3275423872,3275424719,GB +3275424728,3275424735,GB +3275424752,3275425311,GB +3275425328,3275425343,GB +3275425536,3275426559,GB 3275426576,3275428367,GB 3275428376,3275428407,GB 3275428416,3275428447,GB +3275428608,3275428863,GB 3275429888,3275430143,GB -3275430272,3275430399,GB 3275430592,3275430631,GB 3275430656,3275430911,GB 3275431936,3275432959,GB @@ -70143,20 +74401,30 @@ 3275443840,3275443967,GB 3275444224,3275444735,GB 3275446272,3275446783,GB -3275446800,3275446823,GB +3275446800,3275446815,GB 3275446848,3275447039,GB 3275447056,3275447151,GB -3275448320,3275450207,GB +3275448320,3275449359,GB +3275449376,3275449399,GB +3275449408,3275449519,GB +3275449520,3275449527,FR +3275449528,3275449567,GB +3275449584,3275450207,GB 3275450224,3275450879,GB 3275451232,3275451263,GB 3275451392,3275451663,GB 3275451680,3275451711,GB 3275451720,3275451727,GB 3275451744,3275451767,GB -3275452416,3275455231,GB +3275451776,3275451779,GB +3275452416,3275453695,GB +3275453824,3275453839,GB +3275453848,3275454063,GB +3275454080,3275454127,GB +3275454144,3275455231,GB 3275455248,3275456407,GB -3275456416,3275457535,GB -3275457536,3275457791,FK +3275456416,3275457279,GB +3275457280,3275457791,FK 3275457792,3275458559,GB 3275458560,3275460095,IE 3275460096,3275460223,GB @@ -70172,20 +74440,19 @@ 3275468768,3275468799,IE 3275468800,3275474951,GB 3275474960,3275475039,GB -3275475044,3275476223,GB -3275476288,3275476479,GB -3275476656,3275476687,GB -3275476704,3275476735,GB +3275475044,3275475711,GB +3275475720,3275475791,GB +3275475800,3275475879,GB +3275475968,3275476735,GB 3275476992,3275477567,GB 3275477760,3275478271,GB 3275478528,3275481087,GB +3275481344,3275481599,GB +3275482112,3275482367,GB 3275483136,3275483647,GB 3275484160,3275484415,GB -3275485184,3275485215,GB -3275485224,3275485231,GB -3275485248,3275485375,GB -3275485408,3275485423,GB -3275485440,3275485759,GB +3275485184,3275485759,GB +3275486208,3275487231,GB 3275488768,3275489279,CZ 3275489280,3275497471,GB 3275497472,3275505663,DE @@ -70225,7 +74492,6 @@ 3275512320,3275512447,FI 3275512448,3275512575,DK 3275512576,3275512703,BE -3275512704,3275512831,PL 3275512832,3275512895,SE 3275512896,3275512959,AT 3275512960,3275513023,PL @@ -70241,7 +74507,6 @@ 3275530240,3275530751,DK 3275530752,3275531263,AT 3275531264,3275531775,GB -3275531776,3275532287,IE 3275532288,3275532799,UA 3275532800,3275533311,GB 3275533824,3275534335,UA @@ -70422,30 +74687,26 @@ 3275931648,3275939839,UA 3275939840,3275948031,GB 3275948032,3276013567,SE -3276013568,3276014239,GB -3276014240,3276014247,FR -3276014248,3276014799,GB +3276013568,3276014079,GB +3276014080,3276014335,FR +3276014336,3276014799,GB 3276014800,3276014815,FR 3276014816,3276014951,GB 3276014952,3276014959,ES -3276014960,3276018175,GB -3276018176,3276018431,FR -3276018432,3276019495,GB -3276019496,3276019503,FR -3276019504,3276019631,GB -3276019632,3276019639,FR -3276019640,3276020129,GB +3276014960,3276020129,GB 3276020130,3276020130,FR -3276020131,3276020735,GB -3276020736,3276020991,FR -3276020992,3276025159,GB +3276020131,3276023039,GB +3276023040,3276023295,FR +3276023296,3276025159,GB 3276025160,3276025167,FR 3276025168,3276026367,GB 3276026368,3276026623,FR -3276026624,3276027647,GB -3276027648,3276027903,FR -3276027904,3276029375,GB -3276029376,3276029439,FR +3276026624,3276027391,GB +3276027392,3276027647,FR +3276027648,3276028543,GB +3276028544,3276028671,FR +3276028672,3276029183,GB +3276029184,3276029439,FR 3276029440,3276030591,GB 3276030592,3276030607,FR 3276030608,3276031479,GB @@ -70460,11 +74721,13 @@ 3276042016,3276042031,FR 3276042032,3276042079,GB 3276042080,3276042095,FR -3276042096,3276042495,GB -3276042496,3276042751,FR -3276042752,3276045247,GB +3276042096,3276042751,GB +3276042752,3276043007,FR +3276043008,3276045247,GB 3276045248,3276045255,FR -3276045256,3276046335,GB +3276045256,3276045823,GB +3276045824,3276046079,FR +3276046080,3276046335,GB 3276046336,3276062719,RU 3276062720,3276063231,PL 3276063232,3276063743,FR @@ -70599,7 +74862,6 @@ 3276428544,3276428799,BG 3276428800,3276429055,DE 3276429056,3276429311,NL -3276429312,3276430079,RU 3276430080,3276430591,PL 3276430592,3276430847,GB 3276430848,3276431103,DE @@ -70609,20 +74871,26 @@ 3276455936,3276464127,BE 3276464128,3276472319,GR 3276473304,3276473311,AT -3276480256,3276480511,FR +3276474880,3276474927,IT +3276478064,3276478095,CH +3276478720,3276478975,FR 3276485632,3276486655,GB +3276490776,3276490776,NL +3276490782,3276490782,AT +3276490783,3276490783,CH +3276494336,3276494591,GB +3276499504,3276499567,DE 3276503040,3276505087,DE -3276508680,3276508687,GB -3276508928,3276509183,GB 3276509184,3276510207,IT 3276512256,3276513023,ZA -3276517632,3276517887,NL 3276518368,3276518383,NL +3276520704,3276520735,SE 3276522496,3276523519,NL -3276527616,3276527743,PK +3276524864,3276524895,PT +3276528128,3276528191,GB 3276528352,3276528359,GB 3276530688,3276531711,NL -3276536688,3276536695,HU +3276536752,3276536783,HU 3276537344,3276537599,AT 3276537856,3276668927,ES 3276668928,3276677119,MC @@ -70713,42 +74981,43 @@ 3276861184,3276861439,DE 3276861440,3276865535,DK 3276865536,3276866303,NL -3276866304,3276866559,GB -3276866560,3276866815,IT -3276866816,3276870911,GB -3276870912,3276871423,IT -3276871424,3276873983,GB +3276866304,3276870911,GB +3276870912,3276871679,IT +3276871680,3276873760,GB +3276873761,3276873761,ES +3276873762,3276873983,GB 3276873984,3276874239,ES -3276874240,3276876383,GB +3276874240,3276874959,GB +3276874960,3276874975,NL +3276874976,3276876383,GB 3276876384,3276876415,NL 3276876416,3276882431,GB -3276882432,3276882943,IT -3276882944,3276883711,GB -3276883712,3276883967,IT -3276883968,3276886363,GB +3276882432,3276882687,IT +3276882688,3276883077,GB +3276883078,3276883078,IT +3276883079,3276883711,GB +3276883712,3276883839,IT +3276883840,3276886363,GB 3276886364,3276886367,DE -3276886368,3276890111,GB -3276890112,3276890367,US -3276890368,3276892159,GB +3276886368,3276890175,GB +3276890176,3276890191,US +3276890192,3276892159,GB 3276892160,3276893183,IT 3276893184,3276893695,GB 3276893696,3276893951,IT -3276893952,3276898671,GB +3276893952,3276897727,GB +3276897728,3276897791,BE +3276897792,3276898671,GB 3276898672,3276898687,CH -3276898688,3276902141,GB +3276898688,3276901613,GB +3276901614,3276901614,CH +3276901615,3276902141,GB 3276902142,3276902142,CH 3276902143,3276902655,GB 3276902656,3276902911,SE -3276902912,3276903167,GB -3276903168,3276903679,SE -3276903680,3276907519,GB -3276907520,3276907775,NL -3276907776,3276908287,GB -3276908288,3276908543,BE -3276908544,3276908799,SE -3276908800,3276909823,GB -3276909824,3276910079,SE -3276910080,3276911167,GB +3276902912,3276907519,GB +3276907520,3276907551,NL +3276907552,3276911167,GB 3276911168,3276911199,IT 3276911200,3276911615,GB 3276911616,3276911871,IT @@ -70770,9 +75039,7 @@ 3276919488,3276919535,DE 3276919536,3276922879,GB 3276922880,3276923135,FR -3276923136,3276923647,GB -3276923648,3276924159,FR -3276924160,3276925951,GB +3276923136,3276925951,GB 3276925952,3276926207,FR 3276926208,3276931071,GB 3276931072,3276939263,KZ @@ -70803,7 +75070,6 @@ 3277178880,3277179135,ES 3277179392,3277179647,DE 3277179648,3277180159,BE -3277180160,3277180415,NL 3277180416,3277180671,RU 3277180928,3277181183,UA 3277181184,3277181439,PL @@ -70813,7 +75079,6 @@ 3277182208,3277182463,RU 3277182464,3277182719,UA 3277182720,3277182975,BG -3277182976,3277183231,UA 3277183232,3277183487,DE 3277183744,3277183999,UA 3277184000,3277184255,DE @@ -70827,7 +75092,6 @@ 3277186560,3277186815,PL 3277186816,3277187071,RU 3277187072,3277187327,GB -3277187328,3277187583,UA 3277187584,3277188351,RU 3277188352,3277188607,DE 3277188608,3277188863,RU @@ -70836,7 +75100,6 @@ 3277189376,3277189631,PL 3277189632,3277189887,TR 3277189888,3277190143,PL -3277190144,3277190399,SE 3277190400,3277190655,GB 3277190656,3277190911,BE 3277190912,3277191167,FR @@ -70962,9 +75225,7 @@ 3277389312,3277389823,AM 3277389824,3277394943,GB 3277394944,3277395455,US -3277395456,3277402591,GB -3277402592,3277402607,ES -3277402608,3277403135,GB +3277395456,3277403135,GB 3277403136,3277403215,FR 3277403216,3277403231,GB 3277403232,3277403279,FR @@ -70972,15 +75233,13 @@ 3277403296,3277403311,FR 3277403312,3277403327,GB 3277403328,3277403359,FR -3277403360,3277403391,GB -3277403392,3277403455,FR +3277403360,3277403375,GB +3277403376,3277403455,FR 3277403456,3277403647,GB 3277403648,3277403807,ES 3277403808,3277404159,GB 3277404160,3277404415,DE -3277404416,3277404511,IT -3277404512,3277404527,GB -3277404528,3277404655,IT +3277404416,3277404655,IT 3277404656,3277404671,GB 3277404672,3277404735,CH 3277404736,3277404927,GB @@ -71007,7 +75266,7 @@ 3277482496,3277483007,PL 3277483008,3277483519,IT 3277483520,3277484031,RO -3277484032,3277486079,CH +3277484032,3277484543,CH 3277486080,3277486591,GB 3277486592,3277487103,UA 3277487104,3277487615,RO @@ -71077,13 +75336,13 @@ 3277717504,3277725695,YE 3277725696,3277733887,CH 3277733888,3277742079,DE -3277742080,3277746175,FI +3277742080,3277745151,FI +3277745152,3277746175,CH 3277746176,3277750271,GB 3277750272,3277766655,IT 3277766656,3277774847,PL 3277774848,3277783039,RU 3277783040,3277815807,BE -3277815808,3277816063,RO 3277816064,3277816319,PL 3277816576,3277816831,GB 3277816832,3277817087,CH @@ -71158,7 +75417,6 @@ 3277843456,3277843967,PT 3277843968,3277845503,DK 3277845504,3277847039,NL -3277847040,3277847551,DK 3277847552,3277848063,RU 3277848064,3277848575,RO 3277848576,3277856767,AT @@ -71187,9 +75445,7 @@ 3278061568,3278065663,NL 3278065664,3278110719,GB 3278110720,3278176255,SE -3278176256,3278210559,FR -3278210560,3278210815,MQ -3278210816,3278241791,FR +3278176256,3278241791,FR 3278241792,3278307327,GB 3278307328,3278372863,IT 3278372864,3278635007,GB @@ -71234,7 +75490,9 @@ 3278929920,3278938111,TR 3278938112,3278939611,DE 3278939612,3278939615,FR -3278939616,3278940055,DE +3278939616,3278939715,DE +3278939716,3278939719,TR +3278939720,3278940055,DE 3278940056,3278940059,SG 3278940060,3278940355,DE 3278940356,3278940359,NL @@ -71359,7 +75617,6 @@ 3279028224,3279028735,PL 3279028736,3279029247,RU 3279029760,3279030271,UA -3279030272,3279030783,RU 3279030784,3279031295,DE 3279031296,3279031807,NL 3279032320,3279032831,HU @@ -71382,7 +75639,6 @@ 3279057408,3279057919,FR 3279058944,3279059455,UA 3279059456,3279060479,RU -3279060480,3279060991,PL 3279060992,3279069183,UA 3279069184,3279077375,PL 3279077376,3279085567,ES @@ -71409,7 +75665,9 @@ 3279388672,3279396863,GR 3279421440,3279486975,IT 3279486976,3279552511,NL -3279552512,3279560703,LV +3279552512,3279559028,LV +3279559029,3279559029,US +3279559030,3279560703,LV 3279560704,3279568895,GB 3279568896,3279577087,IT 3279577088,3279585279,BE @@ -71429,7 +75687,9 @@ 3279601664,3279609855,CZ 3279609856,3279618047,RU 3279618048,3279683583,UA -3279683584,3279946751,DE +3279683584,3279794943,DE +3279794944,3279795199,NO +3279795200,3279946751,DE 3279946752,3279947775,SE 3279947776,3279948799,NL 3279949824,3279950847,UA @@ -71513,7 +75773,6 @@ 3280128256,3280128511,GB 3280128512,3280129023,HU 3280129280,3280129535,LV -3280129536,3280129791,SA 3280129792,3280130047,FR 3280130304,3280130559,RU 3280130560,3280130815,GB @@ -71566,7 +75825,6 @@ 3280577792,3280578047,NL 3280578048,3280578303,RO 3280578304,3280578559,UA -3280578560,3280578815,PL 3280578816,3280579071,NL 3280579072,3280579327,DE 3280579328,3280579583,RU @@ -71657,7 +75915,6 @@ 3280765952,3280766975,DK 3280766976,3280767999,AT 3280768000,3280769023,FR -3280769024,3280770047,NL 3280770048,3280771071,FR 3280771072,3280772095,PL 3280772096,3280773119,ES @@ -71717,7 +75974,7 @@ 3280998656,3280999423,GB 3280999424,3280999679,HU 3280999680,3280999935,UA -3280999936,3281000447,DE +3280999936,3281000191,DE 3281000448,3281000703,FR 3281000704,3281000959,UA 3281000960,3281001215,SI @@ -71757,7 +76014,7 @@ 3281339648,3281339903,GB 3281339904,3281340159,UA 3281340160,3281340415,BG -3281340416,3281340927,RO +3281340416,3281340671,RO 3281340928,3281341183,DE 3281341184,3281341439,AT 3281341440,3281341695,DE @@ -71770,7 +76027,7 @@ 3281344000,3281344255,NL 3281344256,3281344511,RU 3281344512,3281344767,UA -3281344768,3281345279,RU +3281344768,3281345023,RU 3281345280,3281345535,SA 3281345536,3281345791,CH 3281346048,3281346303,SI @@ -71948,7 +76205,6 @@ 3282746112,3282746367,SE 3282746368,3282746623,PL 3282746624,3282746879,SE -3282746880,3282747135,RO 3282747136,3282747391,PL 3282747392,3282763775,RU 3282763776,3282960383,GB @@ -71958,11 +76214,10 @@ 3283113472,3283156991,CH 3283156992,3283173375,DE 3283173376,3283174399,PL -3283174400,3283176447,UA -3283176448,3283177471,GB +3283174400,3283175423,GB +3283175424,3283176447,UA 3283177472,3283178495,BE 3283178496,3283179519,PL -3283179520,3283180543,LU 3283180544,3283181567,UA 3283181568,3283182591,NO 3283182592,3283183615,PL @@ -72020,7 +76275,6 @@ 3283249152,3283249663,UA 3283249664,3283250175,RO 3283250176,3283250687,RU -3283250688,3283251199,RO 3283251200,3283251711,FR 3283251712,3283252223,PL 3283252224,3283252735,BG @@ -72048,11 +76302,9 @@ 3283488256,3283488511,PL 3283488768,3283489279,FR 3283489280,3283489535,DE -3283489536,3283489791,PL 3283489792,3283490047,RU 3283490048,3283490559,UA 3283490560,3283490815,PL -3283490816,3283491071,CH 3283491072,3283491327,TR 3283491328,3283491583,AT 3283491584,3283491839,RO @@ -72064,7 +76316,6 @@ 3283493120,3283493375,IL 3283493376,3283493887,PL 3283493888,3283494143,DK -3283494400,3283494655,PL 3283494656,3283494911,DK 3283494912,3283495167,PL 3283495168,3283495423,BG @@ -72123,7 +76374,6 @@ 3283636224,3283636735,UA 3283636736,3283637759,PL 3283638272,3283638783,PL -3283638784,3283639295,RU 3283639296,3283639807,CH 3283639808,3283640319,DE 3283640320,3283648511,DK @@ -72143,8 +76393,7 @@ 3283944448,3283945471,AT 3283945472,3283946495,UA 3283946496,3283947519,GB -3283947520,3283947775,UA -3283947776,3283948543,RU +3283947520,3283948543,RU 3283948544,3283949567,NL 3283949568,3283950591,SE 3283950592,3283951615,KZ @@ -72196,7 +76445,6 @@ 3283990016,3283990527,SE 3283991040,3283991551,RO 3283991552,3283992063,SE -3283992064,3283992575,RO 3283992576,3283993087,IL 3283993088,3283993599,RO 3283993600,3283994111,UA @@ -72255,10 +76503,16 @@ 3284016384,3284016639,CH 3284016640,3284017151,DK 3284017152,3284025343,GR -3284025344,3284030471,GB +3284025344,3284028287,GB +3284028288,3284028319,US +3284028320,3284029183,GB +3284029184,3284029199,US +3284029200,3284030471,GB 3284030472,3284030479,IL 3284030480,3284030495,FR -3284030496,3284033535,GB +3284030496,3284030615,GB +3284030616,3284030623,SE +3284030624,3284033535,GB 3284033536,3284041727,RU 3284041728,3284041983,DK 3284041984,3284042239,SI @@ -72272,7 +76526,7 @@ 3284044032,3284044287,FR 3284044288,3284044543,DE 3284044800,3284045055,CZ -3284045056,3284045311,LT +3284045056,3284045311,EE 3284045312,3284045567,DE 3284045568,3284045823,AT 3284046080,3284046335,DE @@ -72353,7 +76607,6 @@ 3284108800,3284109311,FR 3284109312,3284109823,RU 3284109824,3284110335,UA -3284110336,3284110847,RU 3284110848,3284111359,DK 3284111360,3284111871,SE 3284111872,3284112383,RU @@ -72451,7 +76704,7 @@ 3284717312,3284717567,DE 3284717568,3284717823,FR 3284717824,3284718079,RU -3284718080,3284718591,GB +3284718336,3284718591,GB 3284718592,3284718847,PL 3284718848,3284719103,RU 3284719104,3284719359,PL @@ -72483,9 +76736,7 @@ 3284811776,3284819967,KE 3284819968,3284828159,GB 3284828160,3284844543,AT -3284844544,3284856063,CH -3284856064,3284856191,DE -3284856192,3284860927,CH +3284844544,3284860927,CH 3284860928,3284926463,DE 3284926464,3284991999,NO 3284992000,3285057535,PL @@ -72599,14 +76850,20 @@ 3285451608,3285451615,GB 3285452496,3285452511,GB 3285453440,3285453567,GB -3285457072,3285457079,GB 3285461184,3285461215,NL +3285461808,3285461839,NL +3285463168,3285463199,LU +3285465600,3285465855,GB 3285472256,3285472271,US 3285472272,3285472287,DE 3285472288,3285472511,US +3285477136,3285477151,IT 3285480960,3285481215,CH -3285501696,3285501951,GB +3285495296,3285495807,ES +3285501328,3285501359,CZ 3285510144,3285512191,GB +3285515776,3285515799,GR +3285515816,3285515823,GR 3285516288,3285516687,BE 3285516688,3285516691,NL 3285516692,3285517311,BE @@ -72715,23 +76972,27 @@ 3285913648,3285913655,IE 3285913656,3285913703,GB 3285913708,3285913711,FI +3285913712,3285913719,GB +3285913728,3285913855,GB 3285917696,3285917703,GB -3285917712,3285917759,GB +3285917712,3285917807,GB +3285917952,3285918207,GB 3285919744,3285921791,QA -3285922048,3285922303,FR 3285924912,3285924919,CH +3285924920,3285924927,FI +3285924928,3285924943,DE 3285925164,3285925171,CH 3285926432,3285926463,CH 3285926592,3285926623,DE 3285928304,3285928311,GB 3285931528,3285931535,DE +3285934592,3285934847,ES 3285935872,3285936127,GB 3285939136,3285939175,GB 3285939184,3285939191,GB 3285939744,3285939759,GB 3285939840,3285939967,GB 3285941248,3285941503,ES -3285946112,3285946367,ES 3285949856,3285949887,ES 3285950208,3285950463,IT 3285951648,3285951679,ES @@ -72742,6 +77003,7 @@ 3285954576,3285954815,GB 3285962752,3285963775,DE 3285964800,3285964927,DE +3285965056,3285965311,DE 3285975040,3286013695,FR 3286013696,3286013951,RE 3286013952,3286106111,FR @@ -72811,7 +77073,6 @@ 3286355968,3286356991,DE 3286356992,3286358015,PL 3286358016,3286359039,GB -3286359040,3286360063,PT 3286360064,3286361087,IT 3286361088,3286362111,UA 3286362112,3286363135,RU @@ -72826,11 +77087,13 @@ 3286403072,3286403327,GG 3286403328,3286404863,GB 3286404864,3286405375,GG -3286405376,3286405887,GB -3286405888,3286406143,GG -3286406144,3286406399,GB -3286406400,3286406655,GG -3286406656,3286409215,GB +3286405376,3286406399,GB +3286406400,3286406911,GG +3286406912,3286407167,GB +3286407168,3286407423,GG +3286407424,3286407679,GB +3286407680,3286407935,GG +3286407936,3286409215,GB 3286409216,3286417407,DE 3286417408,3286417663,UA 3286417664,3286417919,IT @@ -72864,7 +77127,15 @@ 3286425344,3286425599,IT 3286425600,3286433791,KW 3286433792,3286499327,DE -3286499328,3286564863,HU +3286499328,3286502143,HU +3286502144,3286502399,BG +3286502400,3286510335,HU +3286510336,3286510591,BG +3286510592,3286514431,HU +3286514432,3286514687,RO +3286514688,3286552575,HU +3286552576,3286553087,BG +3286553088,3286564863,HU 3286564864,3286566655,AE 3286566656,3286567423,KW 3286567424,3286630399,AE @@ -72902,9 +77173,7 @@ 3286662400,3286662655,UA 3286662656,3286662911,DE 3286662912,3286671359,UA -3286671360,3286672639,AT -3286672640,3286672895,HU -3286672896,3286679551,AT +3286671360,3286679551,AT 3286679552,3286695935,IT 3286695936,3286761471,DK 3286761472,3286773759,GB @@ -72912,7 +77181,9 @@ 3286777856,3286778111,GB 3286778112,3286781951,FR 3286781952,3286794239,GB -3286794240,3286888447,DE +3286794240,3286799103,DE +3286799104,3286799359,IT +3286799360,3286888447,DE 3286888448,3286889471,IE 3286889472,3286892543,DE 3286892544,3286893055,LI @@ -72962,7 +77233,6 @@ 3286917120,3286918143,RU 3286918144,3286919167,AT 3286919168,3286920191,DE -3286920192,3286920447,RU 3286921216,3286922239,UA 3286922240,3286923263,GB 3286923264,3286924287,CM @@ -72981,7 +77251,6 @@ 3286929408,3286929663,LV 3286929664,3286929919,BE 3286929920,3286930175,SE -3286930176,3286930431,RU 3286930432,3286930687,UA 3286930688,3286930943,DE 3286930944,3286931199,SE @@ -73092,7 +77361,6 @@ 3287218432,3287218687,GB 3287218688,3287218943,RU 3287218944,3287219199,FR -3287219200,3287219455,DE 3287219456,3287219711,CH 3287219712,3287220223,SE 3287220224,3287285759,RU @@ -73167,7 +77435,7 @@ 3287465984,3287467007,DK 3287467008,3287468031,SA 3287468032,3287469055,UA -3287469056,3287471103,DE +3287469056,3287470079,DE 3287471104,3287472127,GB 3287472128,3287472639,RU 3287472640,3287473151,UA @@ -73178,7 +77446,7 @@ 3287479296,3287480319,RO 3287480320,3287481343,AT 3287481344,3287482367,PL -3287482368,3287548927,DE +3287482368,3287548415,DE 3287548928,3287549439,UA 3287549440,3287549951,SE 3287549952,3287550463,UA @@ -73265,7 +77533,6 @@ 3287675648,3287675903,DE 3287675904,3287676159,BE 3287676160,3287676415,DE -3287676416,3287676671,RU 3287676672,3287676927,GB 3287676928,3287677183,ES 3287677184,3287677439,RU @@ -73297,7 +77564,6 @@ 3287728128,3287729407,IT 3287729664,3287729919,DK 3287729920,3287730175,HU -3287731200,3287732223,DE 3287732224,3287734271,IT 3287734272,3287734527,PL 3287734528,3287734783,UA @@ -73339,7 +77605,6 @@ 3287830784,3287831039,GB 3287831040,3287831295,RU 3287831296,3287831551,CH -3287831552,3287831807,RO 3287831808,3287832063,AT 3287832064,3287832319,FI 3287832320,3287832575,NL @@ -73369,7 +77634,6 @@ 3287869952,3287870463,UA 3287870464,3287870975,RU 3287870976,3287871487,NL -3287872512,3287873023,GB 3287873024,3287873535,PL 3287873536,3287874047,RU 3287874048,3287874559,FR @@ -73397,7 +77661,7 @@ 3287954432,3287954687,CH 3287954688,3287954943,RO 3287954944,3287955199,PL -3287955200,3287955711,RU +3287955456,3287955711,RU 3287955712,3287955967,DE 3287955968,3287956223,SI 3287956224,3287956479,RO @@ -73501,10 +77765,8 @@ 3288466432,3288467455,SY 3288467456,3288469503,BI 3288469504,3288481791,ZA -3288481792,3288482303,ZW -3288482304,3288483071,ZA -3288483072,3288483327,ZW -3288483328,3288485631,ZA +3288481792,3288482559,ZW +3288482560,3288485631,ZA 3288485632,3288485887,ZW 3288485888,3288489983,MA 3288489984,3288514559,ZA @@ -73554,14 +77816,14 @@ 3288578048,3288580095,JM 3288580096,3288588287,BB 3288588288,3288608255,ZA -3288608256,3288614655,US +3288608256,3288608264,US +3288608265,3288608265,DE +3288608266,3288614655,US 3288614656,3288616959,ZA 3288616960,3288617215,ZW 3288617216,3288661759,ZA 3288661760,3288662015,LS -3288662016,3288727551,ZA -3288727552,3288727807,MU -3288727808,3288753919,ZA +3288662016,3288753919,ZA 3288753920,3288754175,NG 3288758272,3288758527,EG 3288758528,3288772607,ZA @@ -73582,7 +77844,9 @@ 3288787968,3288788223,EG 3288788224,3288792831,ZA 3288792832,3288793087,AO -3288793088,3289004031,ZA +3288793088,3289002751,ZA +3289002752,3289003007,AO +3289003008,3289004031,ZA 3289004032,3289005055,NG 3289005056,3289005311,TZ 3289005312,3289014527,ZA @@ -73602,7 +77866,8 @@ 3289027584,3289027839,MZ 3289027840,3289041407,ZA 3289041408,3289041663,NG -3289041664,3289044991,ZA +3289041664,3289044735,ZA +3289044736,3289044991,GH 3289044992,3289047039,ML 3289047040,3289048063,ZA 3289048064,3289048319,UG @@ -73610,8 +77875,7 @@ 3289048832,3289049087,NG 3289049088,3289053951,ZA 3289053952,3289055231,NG -3289055232,3289063423,ZA -3289067520,3289071103,ZA +3289055232,3289071103,ZA 3289071104,3289071359,SO 3289071616,3289074431,ZA 3289074432,3289074687,DZ @@ -73636,6 +77900,7 @@ 3289108480,3289114367,ZA 3289114368,3289114623,NG 3289114624,3289115135,ZA +3289115136,3289115391,AO 3289115392,3289120511,ZA 3289120512,3289120767,TZ 3289120768,3289123327,PR @@ -73650,20 +77915,28 @@ 3289169920,3289186303,MA 3289186304,3289212159,ZA 3289212160,3289212415,MZ +3289212416,3289212927,NG 3289214976,3289215231,NG 3289215232,3289217279,ZA 3289217280,3289217535,KE 3289218560,3289220351,ZA 3289220352,3289220607,TZ 3289220608,3289221119,ZA -3289221632,3289229311,ZA +3289221120,3289221631,KE +3289221632,3289227519,ZA +3289227520,3289227775,NG +3289227776,3289229311,ZA 3289229312,3289229567,SZ -3289229824,3289230591,ZA +3289229568,3289230591,ZA +3289230592,3289230847,KE 3289233408,3289233919,ZA 3289233920,3289234175,TZ 3289234176,3289235199,ZA 3289235200,3289235455,KE -3289237504,3289243391,ZA +3289237504,3289237759,ZA +3289238528,3289238783,AO +3289238784,3289239039,ZA +3289239552,3289243391,ZA 3289243392,3289243647,BI 3289243648,3289321471,ZA 3289321472,3289325567,IN @@ -73754,9 +78027,11 @@ 3290719232,3290955775,ZA 3290955776,3290980351,CR 3290980352,3290984447,ZA +3290984448,3290988543,MZ 3290988544,3290992639,KE 3290992640,3290996735,GH 3290996736,3291000831,NG +3291000832,3291004927,ZA 3291004928,3291021311,NG 3291021312,3291029503,ZA 3291029504,3291037695,TZ @@ -73818,6 +78093,7 @@ 3291215616,3291215871,BF 3291215872,3291216127,KE 3291216128,3291216383,LS +3291216384,3291216639,ZA 3291216640,3291216895,NG 3291217920,3291230207,ZA 3291230208,3291234303,GH @@ -73897,15 +78173,16 @@ 3291546624,3291546879,SZ 3291546880,3291547135,TZ 3291547136,3291547391,AO +3291547392,3291547647,RW +3291547648,3291547903,BJ +3291547904,3291548159,MU 3291742208,3292004351,US 3292004352,3292266495,SC 3292397568,3292528639,ZA 3300917248,3300921343,MU 3300921344,3300925439,BJ 3300925440,3300929535,MG -3300933632,3300935679,MU -3300937728,3300938751,MU -3300941824,3300950015,MU +3300933632,3300950015,MU 3300953088,3300954111,MU 3300966400,3301113855,ZA 3301113856,3301146623,NG @@ -73945,8 +78222,9 @@ 3301471488,3301474047,NG 3301474048,3301474303,GH 3301474304,3301490687,MA +3301490688,3301494783,ZA 3301494784,3301498879,ZM -3301507328,3301507583,ZW +3301507328,3301507583,MU 3301507584,3301507839,GH 3301507840,3301508095,EG 3301508608,3301509119,ZA @@ -73987,12 +78265,12 @@ 3302490624,3302491135,MU 3302491136,3302492159,NG 3302492160,3302494207,MW -3302494208,3302496255,ZA 3302498304,3302502399,NA 3302502400,3302505471,AO 3302505472,3302506495,NA 3302506496,3302514687,KE 3302522880,3302523903,KE +3302523904,3302525951,ZA 3302525952,3302526975,EG 3302526976,3302529023,NG 3302529024,3302530047,ZA @@ -74014,6 +78292,7 @@ 3302540288,3302540799,UG 3302540800,3302541311,AO 3302541312,3302542335,NG +3302542336,3302542591,ZA 3302543360,3302544383,NG 3302544384,3302544639,CM 3302544640,3302544895,MU @@ -74023,8 +78302,8 @@ 3302548992,3302549503,ZA 3302549504,3302550015,KE 3302550016,3302550527,TZ -3302550528,3302551039,ZA -3302551040,3302551551,MU +3302550528,3302551295,ZA +3302551296,3302551551,MU 3302551552,3302552063,EG 3302552064,3302552575,KE 3302552832,3302553087,KE @@ -74035,7 +78314,6 @@ 3302554368,3302554623,NG 3302554624,3302554879,EG 3302554880,3302555135,NG -3302555136,3302555391,MU 3302555392,3302555647,NG 3302555648,3302621183,MA 3302621184,3302684671,EG @@ -74048,6 +78326,7 @@ 3302766592,3302768639,ZA 3302768640,3302776831,NG 3302776832,3302785023,ZW +3302785024,3302793215,NG 3302801408,3302805503,NG 3302805504,3302809599,MW 3302809600,3302817791,NG @@ -74085,16 +78364,15 @@ 3302958080,3302958335,BI 3302958336,3302958591,SZ 3302958592,3302958847,DJ +3302958848,3302959103,GA +3302959104,3302959359,BJ +3302985728,3302987775,MU 3304062976,3304456191,SC 3304456192,3304521727,NG 3304521728,3304587263,SC 3304587264,3304718335,ZA 3304849408,3305111551,ZA -3305111552,3305130239,TN -3305130240,3305130495,GP -3305130496,3305362687,TN -3305362688,3305362943,GP -3305362944,3307208703,TN +3305111552,3307208703,TN 3307208704,3309305855,EG 3309305856,3312451583,ZA 3312451584,3312975871,DZ @@ -74170,13 +78448,13 @@ 3315463168,3315464191,SO 3315464192,3315465215,CD 3315465216,3315466239,CG -3315466240,3315467263,MZ -3315467264,3315467519,ZA -3315467520,3315482623,MZ +3315466240,3315482623,MZ 3315482624,3315499007,MG 3315499008,3315515391,ZM 3315515392,3315531775,SC -3315531776,3315539967,CM +3315531776,3315535871,CM +3315535872,3315536127,TD +3315536128,3315539967,CM 3315539968,3315548159,ZA 3315548160,3315552255,NG 3315552256,3315556351,GW @@ -74194,9 +78472,7 @@ 3317301248,3317432319,TZ 3317432320,3317497855,NA 3317497856,3317530623,CD -3317530624,3317538815,LS -3317538816,3317539071,ZA -3317539072,3317547007,LS +3317530624,3317547007,LS 3317547008,3317563391,ZA 3317563392,3317694463,GH 3317694464,3318218751,EG @@ -74301,7 +78577,9 @@ 3320905728,3320938495,DJ 3320938496,3320971263,AO 3320971264,3320979455,GA -3320979456,3320995839,ZA +3320979456,3320985599,ZA +3320985600,3320985607,KE +3320985608,3320995839,ZA 3320995840,3321004031,NG 3321004032,3321008127,GM 3321008128,3321012223,ZA @@ -74332,7 +78610,11 @@ 3321790464,3321806847,LS 3321806848,3321823231,SD 3321823232,3321839615,NG -3321839616,3321855999,GH +3321839616,3321848831,GH +3321848832,3321849855,ZA +3321849856,3321850879,GH +3321850880,3321851903,ZA +3321851904,3321855999,GH 3321856000,3321860095,CV 3321860096,3321864191,ZA 3321864192,3321868287,NG @@ -74410,7 +78692,9 @@ 3323244544,3323244671,CA 3323244672,3323245319,US 3323245320,3323245327,CA -3323245328,3323270420,US +3323245328,3323245463,US +3323245464,3323245471,CA +3323245472,3323270420,US 3323270421,3323270421,CH 3323270422,3323331583,US 3323331584,3323331839,CA @@ -74461,14 +78745,14 @@ 3323680329,3323680413,CA 3323680414,3323680414,US 3323680415,3323680511,CA -3323680512,3323680767,US -3323680768,3323681023,CA -3323681024,3323681279,US +3323680512,3323681279,US 3323681280,3323682955,CA 3323682956,3323682959,US 3323682960,3323684863,CA 3323684864,3323685375,US -3323685376,3323685887,CA +3323685376,3323685551,CA +3323685552,3323685555,BY +3323685556,3323685887,CA 3323685888,3323686399,US 3323686400,3323686911,CA 3323686912,3323687423,US @@ -74476,7 +78760,7 @@ 3323687936,3323687999,US 3323688000,3323688959,CA 3323688960,3323689199,US -3323689200,3323689215,BY +3323689200,3323689215,CA 3323689216,3323689471,US 3323689472,3323690495,CA 3323690496,3323741439,US @@ -74603,11 +78887,7 @@ 3324706304,3324706559,CA 3324706560,3324811047,US 3324811048,3324811055,AU -3324811056,3324843775,US -3324843776,3324843799,AU -3324843800,3324843801,US -3324843802,3324844031,AU -3324844032,3324980223,US +3324811056,3324980223,US 3324980224,3324981247,CA 3324981248,3325034495,US 3325034496,3325035519,NZ @@ -74642,11 +78922,15 @@ 3325206640,3325206655,US 3325206656,3325207807,CA 3325207808,3325207935,US -3325207936,3325211419,CA +3325207936,3325208119,CA +3325208120,3325208123,US +3325208124,3325211419,CA 3325211420,3325211423,US 3325211424,3325211647,CA 3325211648,3325211775,US -3325211776,3325213687,CA +3325211776,3325212647,CA +3325212648,3325212655,US +3325212656,3325213687,CA 3325213688,3325213695,US 3325213696,3325216527,CA 3325216528,3325216531,US @@ -74664,7 +78948,11 @@ 3325221452,3325221455,US 3325221456,3325221791,CA 3325221792,3325221795,FR -3325221796,3325223647,CA +3325221796,3325222203,CA +3325222204,3325222207,BY +3325222208,3325223083,CA +3325223084,3325223087,BY +3325223088,3325223647,CA 3325223648,3325223663,DE 3325223664,3325224671,CA 3325224672,3325224675,US @@ -74678,7 +78966,9 @@ 3325229592,3325229599,US 3325229600,3325230319,CA 3325230320,3325230323,US -3325230324,3325231103,CA +3325230324,3325230583,CA +3325230584,3325230591,SN +3325230592,3325231103,CA 3325231104,3325232127,US 3325233152,3325234175,US 3325234176,3325234431,SA @@ -74706,9 +78996,10 @@ 3325284864,3325285119,AU 3325285376,3325296383,US 3325296384,3325296639,CA -3325296640,3325304063,US -3325304064,3325304319,AS -3325304320,3325304831,US +3325296640,3325304127,US +3325304128,3325304191,AS +3325304192,3325304319,US +3325304320,3325304831,AS 3325304832,3325307647,CA 3325307648,3325307903,BB 3325307904,3325313023,CA @@ -74724,9 +79015,7 @@ 3325438976,3325442559,MU 3325442560,3325443583,ZA 3325443584,3325444095,US -3325444096,3325444351,MU -3325444352,3325444607,ZA -3325444608,3325448447,MU +3325444096,3325448447,MU 3325448448,3325448959,US 3325448960,3325450239,MU 3325450240,3325451007,US @@ -74808,7 +79097,9 @@ 3326413824,3326414335,YE 3326414336,3326420991,US 3326420992,3326423039,PR -3326423040,3326526463,US +3326423040,3326499327,US +3326499328,3326499583,IN +3326499584,3326526463,US 3326526464,3326526719,CA 3326526720,3326613503,US 3326613504,3326615551,CA @@ -74827,7 +79118,9 @@ 3326713344,3326714111,US 3326714112,3326716927,CA 3326716928,3326717951,US -3326717952,3326726399,CA +3326717952,3326722047,CA +3326722048,3326726143,US +3326726144,3326726399,CA 3326726400,3326726655,US 3326726656,3326729215,CA 3326729216,3326729471,JP @@ -74839,9 +79132,7 @@ 3326738176,3326740479,US 3326741760,3326742015,US 3326742528,3326746623,US -3326749184,3326796863,US -3326796864,3326796927,GB -3326796928,3326952191,US +3326749184,3326952191,US 3326952192,3326952447,AS 3326952448,3326953983,US 3326953984,3326954495,AS @@ -74928,9 +79219,7 @@ 3328481792,3328482303,CA 3328482304,3328483071,US 3328483072,3328483327,CA -3328483328,3328510064,US -3328510065,3328510077,AE -3328510078,3328515071,US +3328483328,3328515071,US 3328515072,3328516095,DM 3328516096,3328617983,US 3328617984,3328618239,CA @@ -74946,8 +79235,24 @@ 3328774400,3328775935,CA 3328775936,3328788479,US 3328788480,3328789503,FR -3328789504,3328794623,US -3328794624,3328802815,CA +3328789504,3328794879,US +3328794880,3328795391,CA +3328795392,3328796159,US +3328796160,3328796671,CA +3328796672,3328797695,US +3328797696,3328797951,CA +3328797952,3328798207,US +3328798208,3328798719,CA +3328798720,3328799487,US +3328799488,3328799999,CA +3328800000,3328800255,NL +3328800256,3328800767,IT +3328800768,3328801023,NZ +3328801024,3328801279,SE +3328801280,3328801791,CZ +3328801792,3328802047,US +3328802048,3328802303,DE +3328802304,3328802815,AU 3328802816,3328826813,US 3328826814,3328826814,SG 3328826815,3329230335,US @@ -75032,7 +79337,14 @@ 3331102464,3331102719,CA 3331102720,3331194879,US 3331194880,3331260415,AU -3331260416,3331356671,US +3331260416,3331269375,US +3331269376,3331269631,AU +3331269632,3331269887,FR +3331269888,3331270655,US +3331270656,3331270911,FR +3331270912,3331271423,US +3331271424,3331271679,FR +3331271680,3331356671,US 3331356672,3331357183,BZ 3331357184,3331362815,US 3331362816,3331366911,CA @@ -75046,13 +79358,13 @@ 3331563520,3331563775,CH 3331563776,3331565567,US 3331565568,3331566079,CA -3331566080,3331575807,US -3331575808,3331576831,KY -3331576832,3331632639,US +3331566080,3331632639,US 3331632640,3331632895,CA 3331632896,3331633407,US 3331633408,3331633919,CH -3331633920,3331647231,US +3331633920,3331637247,US +3331637248,3331638271,KR +3331638272,3331647231,US 3331647232,3331647487,CA 3331647488,3331649279,US 3331649280,3331649535,CA @@ -75069,9 +79381,7 @@ 3331983360,3331988479,US 3331988480,3331989503,CA 3331989504,3332028415,US -3332028416,3332028927,CA -3332028928,3332029183,US -3332029184,3332030463,CA +3332028416,3332030463,CA 3332030464,3332083967,US 3332083968,3332084223,AU 3332084224,3332423423,US @@ -75151,9 +79461,7 @@ 3332898560,3332899071,US 3332899072,3332906495,CA 3332906496,3332909567,US -3332909568,3332909823,CA -3332909824,3332910079,US -3332910080,3332922879,CA +3332909568,3332922879,CA 3332922880,3332923391,US 3332923392,3332925695,CA 3332925696,3332929023,US @@ -75184,16 +79492,21 @@ 3333374976,3333375231,IN 3333375232,3333385983,US 3333385984,3333386239,JP -3333386240,3333427967,US +3333386240,3333396479,US +3333396480,3333396689,GB +3333396690,3333396691,US +3333396692,3333396735,GB +3333396736,3333427967,US 3333427968,3333428007,GB 3333428008,3333428008,US 3333428009,3333428223,GB -3333428224,3333476607,US -3333477376,3333480191,US +3333428224,3333480191,US 3333480192,3333481471,DE 3333481472,3333517823,US 3333517824,3333518335,CA -3333518336,3333583871,US +3333518336,3333519359,US +3333519360,3333521407,GB +3333521408,3333583871,US 3333583872,3333584895,CA 3333584896,3333593855,US 3333593856,3333594111,CA @@ -75271,11 +79584,13 @@ 3335252736,3335252991,CA 3335252992,3335276287,US 3335276288,3335276799,PR -3335276800,3335439615,US +3335276800,3335354179,US +3335354180,3335354183,CA +3335354184,3335439615,US 3335439616,3335439871,CH 3335439872,3335440383,US 3335440384,3335441151,CH -3335441152,3335458815,US +3335441152,3335456767,US 3335458816,3335460863,BM 3335460864,3335475199,US 3335475200,3335475455,DE @@ -75291,7 +79606,9 @@ 3336139776,3336140799,CA 3336140800,3336854015,US 3336854016,3336854271,CO -3336854272,3336991231,US +3336854272,3336896767,US +3336896768,3336897023,VE +3336897024,3336991231,US 3336991232,3336991487,CA 3336991488,3336993023,US 3336993024,3336993535,CA @@ -75313,7 +79630,9 @@ 3337055232,3337060351,CA 3337060352,3337069055,US 3337069056,3337069119,GB -3337069120,3337289983,US +3337069120,3337107711,US +3337107712,3337107967,GB +3337107968,3337289983,US 3337289984,3337293567,CA 3337293568,3337293823,US 3337293824,3337297919,CA @@ -75356,7 +79675,9 @@ 3337961728,3337961983,CA 3337961984,3337963391,US 3337963392,3337963519,CA -3337963520,3337969663,US +3337963520,3337963639,US +3337963640,3337963647,CA +3337963648,3337969663,US 3337969664,3337973759,PR 3337973760,3337977855,CA 3337977856,3337980671,US @@ -75463,13 +79784,18 @@ 3338371072,3338403839,CA 3338403840,3338424319,US 3338424320,3338428415,CA -3338428416,3338429439,US -3338429440,3338429951,CA +3338428416,3338429695,US +3338429696,3338429951,SG 3338429952,3338430719,US -3338430720,3338432511,CA +3338430720,3338430975,NL +3338430976,3338431487,US +3338431488,3338431743,CA +3338431744,3338432255,US +3338432256,3338432511,CA 3338432512,3338455039,US 3338455040,3338455295,GB -3338455296,3338567679,US +3338455296,3338541567,US +3338542080,3338567679,US 3338567680,3338600447,CA 3338600448,3338686463,US 3338686464,3338688511,AW @@ -75479,7 +79805,9 @@ 3338825728,3338827775,AW 3338827776,3338912767,US 3338912768,3338913023,EC -3338913024,3338935039,US +3338913024,3338934015,US +3338934016,3338934271,GB +3338934272,3338935039,US 3338935040,3338935295,GB 3338935296,3338964991,US 3338964992,3338965247,CA @@ -75532,7 +79860,9 @@ 3339180032,3339181055,CA 3339181056,3339184127,US 3339184128,3339186175,CA -3339186176,3339270399,US +3339186176,3339261951,US +3339261952,3339263999,HK +3339264000,3339270399,US 3339271168,3339327999,US 3339328512,3339329535,CA 3339329536,3339337727,US @@ -75581,9 +79911,7 @@ 3339965440,3339968511,CA 3339968512,3339975935,US 3339975936,3339976191,CA -3339976192,3339991807,US -3339991808,3339992063,CA -3339992064,3340080127,US +3339976192,3340080127,US 3340080128,3340081151,CA 3340081152,3340084223,US 3340084224,3340085247,KN @@ -75655,11 +79983,9 @@ 3341216768,3341217791,CA 3341217792,3341218623,US 3341218624,3341218655,CA -3341218656,3341339647,US -3341339648,3341339903,CZ -3341339904,3341340159,US -3341340160,3341340415,CZ -3341340416,3341439200,US +3341218656,3341287423,US +3341287424,3341418495,CZ +3341418496,3341439200,US 3341439201,3341439201,CA 3341439202,3341444863,US 3341444864,3341445631,DE @@ -75685,9 +80011,7 @@ 3341518848,3341520895,CA 3341520896,3341521663,US 3341521664,3341531135,CA -3341531392,3341531647,US -3341531648,3341531903,IN -3341531904,3341534207,US +3341531136,3341534207,US 3341534976,3341537279,CA 3341537280,3341546239,US 3341546240,3341547007,CA @@ -75752,7 +80076,8 @@ 3342517248,3342526463,US 3342526464,3342528511,CA 3342528512,3342543359,US -3342543872,3342552063,US +3342543872,3342548991,US +3342551040,3342552063,US 3342552064,3342553087,CA 3342553088,3342565375,US 3342565376,3342567423,CA @@ -75768,17 +80093,15 @@ 3342603264,3342604799,US 3342604800,3342605311,CA 3342605312,3342605567,US -3342605568,3342614271,CA -3342614528,3342623743,CA -3342624256,3342627839,CA -3342628096,3342663423,CA +3342605568,3342663423,CA 3342663680,3342831103,US 3342831104,3342831359,IN 3342831360,3343013887,US 3343013888,3343015935,CA 3343015936,3343055871,US 3343055872,3343056895,CA -3343056896,3343129087,US +3343056896,3343126015,US +3343126528,3343129087,US 3343129600,3343153151,US 3343153152,3343154943,CA 3343154944,3343167487,US @@ -75809,7 +80132,9 @@ 3343465472,3343466495,JM 3343466496,3343470847,US 3343471104,3343557119,US -3343557376,3343858687,US +3343557376,3343649791,US +3343649792,3343650815,VI +3343650816,3343858687,US 3343858688,3343859199,VG 3343859200,3344111871,US 3344112128,3344116223,US @@ -75837,7 +80162,9 @@ 3344242176,3344242687,US 3344242688,3344255999,CA 3344256000,3344261631,US -3344261888,3344266239,CA +3344261888,3344263430,CA +3344263431,3344263431,US +3344263432,3344266239,CA 3344266240,3344266751,US 3344266752,3344268543,CA 3344268544,3344268799,GB @@ -75882,9 +80209,7 @@ 3344656384,3344658431,US 3344658432,3344660479,CA 3344660480,3344670719,US -3344670720,3344671231,GP -3344671232,3344671487,MF -3344671488,3344671743,GP +3344670720,3344671743,GP 3344671744,3344676863,US 3344676864,3344677407,CA 3344677408,3344677423,US @@ -75979,7 +80304,9 @@ 3345447680,3345448447,FR 3345448448,3345448703,BE 3345448704,3345448959,DE -3345448960,3346140671,US +3345448960,3345659903,US +3345659904,3345660159,CA +3345660160,3346140671,US 3346141184,3346188799,US 3346189312,3346196479,US 3346196480,3346197503,CA @@ -76069,8 +80396,8 @@ 3349545728,3349545983,US 3349545984,3349549567,CA 3349550080,3349551103,CA -3349551104,3349553663,US -3349553664,3349605375,CA +3349551104,3349553407,US +3349553408,3349605375,CA 3349605632,3349607423,CA 3349607936,3349608447,CA 3349608448,3349609471,US @@ -76193,7 +80520,8 @@ 3351043072,3351043583,FR 3351043584,3351044095,CA 3351044096,3351058943,US -3351059456,3351071743,US +3351059456,3351068159,US +3351068672,3351071743,US 3351071744,3351072767,CA 3351072768,3351074815,US 3351074816,3351076863,CA @@ -76201,8 +80529,10 @@ 3351080960,3351081983,AG 3351081984,3351086079,US 3351086080,3351087103,CA -3351087104,3351094527,US -3351094528,3351095295,CA +3351087104,3351094271,US +3351094272,3351094527,CA +3351094528,3351095039,US +3351095040,3351095295,CA 3351095296,3351103487,US 3351103488,3351104511,CA 3351104512,3351104639,JP @@ -76233,8 +80563,7 @@ 3351306240,3351307263,VC 3351307264,3351308287,US 3351308288,3351310335,CA -3351310336,3351318015,US -3351318528,3351326719,US +3351310336,3351326719,US 3351326720,3351328767,CA 3351328768,3351336959,US 3351336960,3351339007,CA @@ -76242,7 +80571,9 @@ 3351357440,3351359487,CA 3351359488,3351372799,US 3351372800,3351373823,BM -3351373824,3351380223,US +3351373824,3351376127,US +3351376128,3351376383,PR +3351376384,3351380223,US 3351380224,3351380479,CA 3351380480,3351380735,US 3351380736,3351381759,CA @@ -76345,14 +80676,18 @@ 3351475712,3351475967,IS 3351475968,3351483391,US 3351483392,3351484415,CA -3351484416,3351485439,US -3351485440,3351488511,CA +3351484416,3351486463,US +3351486464,3351488511,CA 3351488512,3351494911,US 3351494912,3351495679,SG 3351495680,3351495935,US -3351495936,3351496191,SG +3351495936,3351495989,SG +3351495990,3351495990,US +3351495991,3351496191,SG 3351496192,3351496447,US -3351496448,3351496703,SG +3351496448,3351496675,SG +3351496676,3351496679,US +3351496680,3351496703,SG 3351496704,3351497727,US 3351497728,3351498751,CA 3351498752,3351501823,US @@ -76438,8 +80773,8 @@ 3353731504,3353732607,US 3353732608,3353732863,DE 3353732864,3353736191,US -3353736192,3353736703,PR -3353736704,3353737215,US +3353736192,3353736959,PR +3353736960,3353737215,US 3353737216,3353737471,GB 3353737472,3353741823,US 3353742336,3353780223,US @@ -76450,9 +80785,7 @@ 3353861120,3353862143,CA 3353862144,3353862719,US 3353862720,3353862751,CA -3353862752,3353864447,US -3353864448,3353864703,CA -3353864704,3353864959,US +3353862752,3353864959,US 3353864960,3353865215,CA 3353865216,3353884927,US 3353884928,3353885183,GB @@ -76482,7 +80815,9 @@ 3354656768,3354663423,US 3354663936,3354676223,US 3354676224,3354677247,CA -3354677248,3354687487,US +3354677248,3354686975,US +3354686976,3354687231,HK +3354687232,3354687487,US 3354687488,3354688511,CA 3354688512,3354720767,US 3354721280,3354758655,US @@ -76504,8 +80839,7 @@ 3354972160,3354972415,CA 3354972416,3355012607,US 3355013120,3355017215,CA -3355017216,3355052031,US -3355052032,3355052287,CA +3355017216,3355052287,US 3355052288,3355052543,AU 3355052544,3355053311,CA 3355053312,3355053567,US @@ -76527,14 +80861,19 @@ 3355372288,3355372543,CA 3355372544,3355384831,US 3355384832,3355385855,CA -3355385856,3355407359,US +3355385856,3355389439,US +3355389440,3355389695,GB +3355389696,3355389951,JP +3355389952,3355407359,US 3355407360,3355408383,PR 3355408384,3355412479,US -3355412480,3355412991,BE +3355412480,3355412607,BE +3355412608,3355412735,US +3355412736,3355412991,BE 3355412992,3355432959,US 3355432960,3355435007,CA 3355435008,3355443199,US -3355443200,3355443200,GB +3355443200,3355443200,CN 3355443201,3355445247,CO 3355445248,3355447295,BR 3355447296,3355447551,CU @@ -76550,7 +80889,6 @@ 3355459584,3355459839,PA 3355459840,3355460095,VE 3355460096,3355460351,CL -3355460352,3355460607,BR 3355460608,3355460863,UY 3355460864,3355461887,BR 3355461888,3355463423,EC @@ -76566,7 +80904,7 @@ 3355467264,3355467519,US 3355467520,3355467775,MX 3355467776,3355468799,AR -3355469312,3355469567,BR +3355468800,3355469567,BR 3355469568,3355470591,MX 3355470592,3355470847,PE 3355470848,3355471103,CL @@ -76714,8 +81052,7 @@ 3355870720,3355871231,CR 3355871232,3355873279,BR 3355873280,3355875327,BQ -3355875328,3355876351,MX -3355876352,3355877375,VE +3355875328,3355877375,MX 3355877376,3355885567,CO 3355885568,3355901951,GT 3355901952,3355902975,BR @@ -76783,7 +81120,9 @@ 3356076288,3356078079,BR 3356078080,3356078335,EC 3356078336,3356079359,CL +3356079616,3356080127,MX 3356080128,3356080383,BR +3356080384,3356080639,MX 3356080896,3356082431,NI 3356082432,3356082687,CL 3356082688,3356082943,AR @@ -76899,7 +81238,10 @@ 3356180480,3356190719,CL 3356190720,3356192767,DO 3356192768,3356194815,AR -3356196864,3356229631,VE +3356196864,3356201471,KY +3356201472,3356201727,VE +3356201728,3356213247,KY +3356213248,3356229631,VE 3356229632,3356233727,BR 3356233728,3356237823,CL 3356237824,3356246015,GT @@ -76951,8 +81293,8 @@ 3356329984,3356332031,GF 3356332032,3356334079,CU 3356334080,3356336127,BO -3356336128,3356337151,SV -3356337152,3356337663,HN +3356336128,3356336895,SV +3356336896,3356337663,HN 3356337664,3356337919,SV 3356337920,3356338175,HN 3356338176,3356339967,SV @@ -76969,7 +81311,7 @@ 3356368896,3356369407,BR 3356369408,3356369663,EC 3356369664,3356369919,BR -3356370176,3356370943,AR +3356369920,3356370943,AR 3356370944,3356372991,CO 3356372992,3356375039,CU 3356377088,3356379647,CL @@ -76988,13 +81330,13 @@ 3356391168,3356391423,PA 3356393472,3356413439,CL 3356413440,3356413823,CO -3356413824,3356420607,CL -3356420608,3356420991,CO -3356420992,3356421247,CL -3356421248,3356421375,CO -3356421376,3356421759,CL -3356421760,3356422015,CO -3356422016,3356425471,CL +3356413824,3356419839,CL +3356419840,3356419967,CO +3356419968,3356420863,CL +3356420864,3356421375,CO +3356421376,3356421631,CL +3356421632,3356422143,CO +3356422144,3356425471,CL 3356425472,3356425599,CO 3356425600,3356426239,CL 3356426240,3356427263,BR @@ -77005,7 +81347,9 @@ 3356499968,3356508159,MX 3356508160,3356508671,AR 3356508672,3356509183,CR -3356509184,3356510207,VE +3356509184,3356509439,VE +3356509440,3356509503,US +3356509504,3356510207,VE 3356510208,3356511999,AR 3356512000,3356512255,CO 3356512256,3356514303,AR @@ -77027,15 +81371,15 @@ 3356958720,3356967167,MX 3356967424,3356967935,MX 3356967936,3356968959,BR -3356968960,3356970495,MX -3356971520,3356972031,MX +3356968960,3356972031,MX 3356972288,3356979967,MX 3356980480,3356980735,MX 3356981248,3356988415,MX 3356988672,3356989439,MX 3356989952,3356996607,MX 3356996608,3356997631,BR -3356997632,3357003007,MX +3356997632,3356998911,MX +3356999168,3357003007,MX 3357003776,3357007871,MX 3357007872,3357011967,BR 3357011968,3357015551,MX @@ -77128,9 +81472,8 @@ 3357451144,3357451151,HN 3357451152,3357451263,GT 3357451264,3357451519,HN -3357451520,3357451575,GT -3357451576,3357451583,NI -3357451584,3357452287,GT +3357451520,3357451775,NI +3357451776,3357452287,GT 3357452288,3357452799,HN 3357452800,3357453055,NI 3357453056,3357453071,GT @@ -77151,7 +81494,9 @@ 3357457712,3357457727,CR 3357457728,3357458431,GT 3357458432,3357474815,CL -3357474816,3357475071,US +3357474816,3357475015,US +3357475016,3357475019,AR +3357475020,3357475071,US 3357475072,3357475887,AR 3357475888,3357475903,VE 3357475904,3357475999,AR @@ -77198,7 +81543,9 @@ 3357480360,3357480367,CO 3357480368,3357480463,AR 3357480464,3357480479,CO -3357480480,3357480719,AR +3357480480,3357480511,AR +3357480512,3357480543,CO +3357480544,3357480719,AR 3357480720,3357480735,CO 3357480736,3357480959,AR 3357480960,3357483007,EC @@ -77213,7 +81560,9 @@ 3357556992,3357557247,AR 3357557248,3357557759,MX 3357557760,3357558783,EC -3357558784,3357559039,AR +3357558784,3357558895,AR +3357558896,3357558903,EC +3357558904,3357559039,AR 3357559040,3357559295,EC 3357559296,3357559551,CA 3357559552,3357559807,US @@ -77236,9 +81585,7 @@ 3357606912,3357607167,AR 3357607168,3357613055,MX 3357613056,3357613311,AR -3357613312,3357616127,MX -3357616384,3357618943,MX -3357619200,3357623039,MX +3357613312,3357623039,MX 3357623040,3357623295,AR 3357623296,3357626623,MX 3357627392,3357627647,MX @@ -77266,9 +81613,9 @@ 3357715456,3357715711,MX 3357715968,3357723903,MX 3357724416,3357725183,MX -3357725440,3357726463,MX +3357725440,3357726719,MX 3357726720,3357727743,BR -3357728000,3357728767,MX +3357727744,3357728767,MX 3357728768,3357736959,BR 3357736960,3357745151,VE 3357745152,3357753343,CO @@ -77280,7 +81627,11 @@ 3357776128,3357776383,UY 3357776384,3357776895,US 3357776896,3357777919,CL -3357777920,3357786111,GT +3357777920,3357778415,GT +3357778416,3357778423,SV +3357778424,3357784319,GT +3357784320,3357784335,SV +3357784336,3357786111,GT 3357786112,3357802495,VE 3357802496,3357868031,MX 3357868032,3357933567,PE @@ -77301,28 +81652,30 @@ 3358132128,3358132135,CO 3358132136,3358132607,AR 3358132608,3358132735,CO -3358132736,3358132991,AR -3358132992,3358133119,EC +3358132736,3358132975,AR +3358132976,3358133119,EC 3358133120,3358133247,AR 3358133248,3358133759,VE 3358133760,3358142719,AR 3358142720,3358142975,US 3358142976,3358143231,CO -3358143232,3358143487,AR +3358143232,3358143295,VE +3358143296,3358143487,AR 3358143488,3358143999,US -3358144000,3358144255,AR +3358144000,3358144127,CL +3358144128,3358144255,AR 3358144256,3358144511,CL 3358144512,3358145023,VE 3358145024,3358149631,AR -3358149632,3358149887,CO -3358149888,3358150015,AR -3358150016,3358150143,CO -3358150144,3358150423,AR +3358149632,3358150399,CO +3358150400,3358150423,AR 3358150424,3358150431,CO 3358150432,3358150479,AR 3358150480,3358150655,CO 3358150656,3358150911,EC -3358150912,3358151263,AR +3358150912,3358151039,AR +3358151040,3358151167,EC +3358151168,3358151263,AR 3358151264,3358151271,EC 3358151272,3358151423,AR 3358151424,3358151551,EC @@ -77330,12 +81683,12 @@ 3358151680,3358151807,PE 3358151808,3358151935,AR 3358151936,3358152191,PE -3358152192,3358152559,AR -3358152560,3358152575,PE +3358152192,3358152543,AR +3358152544,3358152575,PE 3358152576,3358152703,AR 3358152704,3358152959,US -3358152960,3358153087,EC -3358153088,3358153279,AR +3358152960,3358153215,EC +3358153216,3358153279,AR 3358153280,3358153311,US 3358153312,3358153343,AR 3358153344,3358153535,US @@ -77363,10 +81716,18 @@ 3358326784,3358392319,VE 3358392320,3358457855,AR 3358457856,3358523391,PA -3358523392,3358529535,VE +3358523392,3358524159,VE +3358524160,3358524415,AR +3358524416,3358525951,VE +3358525952,3358526463,AR +3358526464,3358529535,VE 3358529536,3358530303,AR -3358530304,3358532607,VE -3358532608,3358532863,AR +3358530304,3358530943,VE +3358530944,3358531071,AR +3358531072,3358531583,VE +3358531584,3358531839,AR +3358531840,3358532351,VE +3358532352,3358532863,AR 3358532864,3358534399,VE 3358534400,3358534655,AR 3358534656,3358535167,VE @@ -77375,15 +81736,22 @@ 3358539520,3358539775,AR 3358539776,3358543871,VE 3358543872,3358544127,MX -3358544128,3358548223,VE +3358544128,3358544383,AR +3358544384,3358545407,VE +3358545408,3358545663,AR +3358545664,3358548223,VE 3358548224,3358548479,AR 3358548480,3358549759,VE 3358549760,3358550015,AR 3358550016,3358553599,VE 3358553600,3358553855,AR -3358553856,3358558463,VE +3358553856,3358556159,VE +3358556160,3358558463,AR 3358558464,3358558591,PY -3358558592,3358562303,VE +3358558592,3358559231,AR +3358559232,3358560255,VE +3358560256,3358561791,AR +3358561792,3358562303,VE 3358562304,3358563327,PE 3358563328,3358564095,CO 3358564096,3358564351,MX @@ -77406,15 +81774,9 @@ 3358565184,3358565247,AR 3358565248,3358565311,VE 3358565312,3358565343,AR -3358565344,3358565567,VE -3358565568,3358565599,AR -3358565600,3358565791,VE -3358565792,3358565855,AR -3358565856,3358565951,VE -3358565952,3358566015,AR -3358566016,3358566047,VE -3358566048,3358566111,AR -3358566112,3358566847,VE +3358565344,3358565375,VE +3358565376,3358566399,AR +3358566400,3358566847,VE 3358566848,3358566879,AR 3358566880,3358566911,VE 3358566912,3358566975,AR @@ -77429,24 +81791,17 @@ 3358567392,3358567407,VE 3358567408,3358567423,AR 3358567424,3358568959,CO -3358568960,3358570495,VE +3358568960,3358569471,AR +3358569472,3358570495,VE 3358570496,3358570751,MX 3358570752,3358571263,PE 3358571264,3358572543,MX -3358572544,3358573055,VE -3358573056,3358573311,AR -3358573312,3358574847,VE -3358574848,3358576127,AR -3358576128,3358577151,VE +3358572544,3358577151,AR 3358577152,3358577407,PE -3358577408,3358577919,AR -3358577920,3358578175,VE -3358578176,3358578431,AR +3358577408,3358578431,AR 3358578432,3358578687,VE 3358578688,3358579967,CO -3358579968,3358580223,AR -3358580224,3358580735,MX -3358580736,3358588927,VE +3358579968,3358588927,AR 3358588928,3358654463,PE 3358654464,3358658559,AR 3358658560,3358660607,CL @@ -77479,9 +81834,7 @@ 3358892032,3358918655,MX 3358918656,3358924799,BR 3358924800,3358965759,MX -3358965760,3358966783,BR -3358966784,3358967039,MX -3358967040,3358973951,BR +3358965760,3358973951,BR 3358973952,3358982143,MX 3358982144,3359047679,CL 3359047680,3359080447,AR @@ -77552,7 +81905,9 @@ 3359899648,3359916031,CL 3359916032,3359932415,AR 3359932416,3359948799,MX -3359948800,3359989759,AR +3359948800,3359989247,AR +3359989248,3359989503,US +3359989504,3359989759,AR 3359989760,3359997951,CO 3359997952,3360006143,AR 3360006144,3360014335,EC @@ -77574,7 +81929,9 @@ 3360251904,3360253951,BO 3360253952,3360255999,SV 3360256000,3360260095,CL -3360260096,3360276479,AR +3360260096,3360260351,AR +3360260352,3360260607,US +3360260608,3360276479,AR 3360276480,3360278527,VE 3360278528,3360280575,EC 3360280576,3360282623,CL @@ -77584,9 +81941,7 @@ 3360342016,3360354303,VE 3360354304,3360356351,PA 3360356352,3360358399,CR -3360358400,3360358911,CL -3360358912,3360358919,CO -3360358920,3360366591,CL +3360358400,3360366591,CL 3360366592,3360382975,CO 3360382976,3360399359,VE 3360399360,3360403455,BO @@ -77610,7 +81965,9 @@ 3360707584,3360708095,US 3360708096,3360708223,AR 3360708224,3360708351,US -3360708352,3360708991,AR +3360708352,3360708479,AR +3360708480,3360708735,US +3360708736,3360708991,AR 3360708992,3360709247,US 3360709248,3360709631,AR 3360709632,3360709759,US @@ -77626,13 +81983,19 @@ 3360765952,3360767999,CO 3360768000,3360772351,AR 3360772352,3360772479,BO -3360772480,3360781839,AR +3360772480,3360780303,AR +3360780304,3360780319,BR +3360780320,3360780399,AR +3360780400,3360780415,BR +3360780416,3360781839,AR 3360781840,3360781847,DO 3360781848,3360781943,AR 3360781944,3360781947,MX 3360781948,3360782167,AR 3360782168,3360782175,MX -3360782176,3360788479,AR +3360782176,3360782239,AR +3360782240,3360782247,MX +3360782248,3360788479,AR 3360788480,3360790527,CL 3360790528,3360849919,AR 3360849920,3360882687,VE @@ -77645,17 +82008,14 @@ 3361034240,3361036287,EC 3361036288,3361046527,AR 3361046528,3361052671,BO -3361052672,3361054719,AR +3361052672,3361054463,AR +3361054464,3361054719,PE 3361054720,3361058815,NI 3361058816,3361062911,AR 3361062912,3361071103,CL 3361071104,3361072639,CO 3361072640,3361072767,VE -3361072768,3361072895,CO -3361072896,3361073151,VE -3361073152,3361074175,CO -3361074176,3361074431,VE -3361074432,3361079295,CO +3361072768,3361079295,CO 3361079296,3361144831,CL 3361144832,3361210367,BO 3361210368,3361275903,DO @@ -77704,19 +82064,25 @@ 3362258944,3362324479,CL 3362324480,3362324735,AR 3362324736,3362324991,US -3362324992,3362328063,AR +3362324992,3362326015,AR +3362326016,3362326271,US +3362326272,3362327039,AR +3362327040,3362327551,US +3362327552,3362328063,AR 3362328064,3362328575,US 3362328576,3362337279,AR 3362337280,3362338047,US -3362338048,3362342143,AR +3362338048,3362338559,AR +3362338560,3362338815,US +3362338816,3362339327,AR +3362339328,3362339583,US +3362339584,3362342143,AR 3362342144,3362342399,PA 3362342400,3362343423,AR 3362343424,3362343679,US 3362343680,3362344447,AR -3362344448,3362344703,US -3362344704,3362344959,AR -3362344960,3362346751,US -3362346752,3362348799,AR +3362344448,3362346495,US +3362346496,3362348799,AR 3362348800,3362349055,US 3362349056,3362351103,CR 3362351104,3362353151,AR @@ -77729,8 +82095,7 @@ 3362426880,3362428927,PA 3362428928,3362430975,CL 3362430976,3362447359,CO -3362447360,3362447871,SV -3362447872,3362448895,HN +3362447360,3362448895,HN 3362448896,3362449151,SV 3362449152,3362449407,HN 3362449408,3362451199,SV @@ -77760,7 +82125,13 @@ 3362529280,3362537471,PA 3362537472,3362545663,AR 3362545664,3362549759,PE -3362549760,3362553855,AR +3362549760,3362551871,AR +3362551872,3362551887,MX +3362551888,3362552143,AR +3362552144,3362552159,PR +3362552160,3362553023,AR +3362553024,3362553039,PR +3362553040,3362553855,AR 3362553856,3362557951,PY 3362557952,3362562047,AR 3362570240,3362586623,UY @@ -77893,7 +82264,9 @@ 3368086528,3368087551,CR 3368087552,3370188799,BR 3370188800,3370196991,MX -3370196992,3370487807,BR +3370196992,3370214399,BR +3370214400,3370215423,AR +3370215424,3370487807,BR 3370487808,3370488831,CR 3370488832,3370489855,AR 3370489856,3370490879,VE @@ -77901,7 +82274,9 @@ 3370506240,3370507263,VE 3370507264,3370514943,BR 3370515456,3370516479,AR -3370516480,3376873471,BR +3370516480,3371106303,BR +3371106304,3371122687,MX +3371122688,3376873471,BR 3376881664,3376922623,BR 3376926720,3377291263,BR 3377295360,3377303551,BR @@ -77917,21 +82292,34 @@ 3380761088,3380761599,VE 3380761600,3380764671,BR 3380764672,3380808191,MX +3380808192,3380808703,CR 3380808704,3380811775,MX 3380811776,3380813823,BR 3380813824,3380815103,MX 3380815104,3380815359,CR +3380815360,3380815871,CL 3380815872,3380816127,MX 3380816128,3380816383,BO +3380816384,3380816639,SV +3380816640,3380816895,CW 3380816896,3380817151,MX +3380817152,3380817407,BO +3380817408,3380817663,CO +3380817664,3380817919,AR 3380817920,3380818175,MX +3380818176,3380818431,PA 3380818944,3380822527,MX +3380822528,3380822783,NI 3380823040,3380824063,BR -3380824064,3380826111,MX +3380824064,3380824319,MX +3380824320,3380824575,GT +3380825088,3380825343,MX +3380825344,3380825599,HT 3380826112,3380828159,BR 3380828160,3380828671,MX 3380829184,3380830207,BR 3380830208,3380830463,MX +3380830464,3380830719,CO 3380831232,3380831743,MX 3380832256,3380832767,MX 3380833280,3380833791,MX @@ -77939,6 +82327,7 @@ 3380835328,3380835839,MX 3380836352,3380836607,MX 3380836608,3380836863,PE +3380836864,3380837375,SV 3380837376,3380840447,MX 3380840448,3380843519,BR 3380843520,3380844543,PA @@ -78062,9 +82451,7 @@ 3384410112,3384672255,CL 3384672256,3384688639,HN 3384688640,3384705023,CO -3384705024,3384705535,US -3384705536,3384706047,PA -3384706048,3384707071,US +3384705024,3384707071,US 3384707072,3384721407,PA 3384721408,3384725503,US 3384725504,3384732415,PA @@ -78151,16 +82538,20 @@ 3387424768,3387555839,CO 3387555840,3387568127,AR 3387568128,3387572223,PE -3387572224,3387573375,AR -3387573376,3387573759,CO -3387573760,3387574015,AR +3387572224,3387572539,AR +3387572540,3387572543,CO +3387572544,3387573375,AR +3387573376,3387573887,CO +3387573888,3387574015,AR 3387574016,3387574143,CO 3387574144,3387574783,AR 3387574784,3387575039,CO 3387575040,3387575295,AR 3387575296,3387575423,CO -3387575424,3387575807,AR -3387575808,3387576063,CO +3387575424,3387575551,AR +3387575552,3387575567,CO +3387575568,3387575679,AR +3387575680,3387576063,CO 3387576064,3387576319,AR 3387576320,3387578367,EC 3387578368,3387584511,AR @@ -78268,7 +82659,8 @@ 3389143040,3389145087,AU 3389145088,3389151231,HK 3389151232,3389152255,JP -3389152256,3389153279,AU +3389152256,3389153023,US +3389153024,3389153279,AU 3389153280,3389161471,TV 3389161472,3389194239,JP 3389194240,3389195775,AU @@ -78291,8 +82683,7 @@ 3389214720,3389218815,NZ 3389218816,3389222911,AU 3389222912,3389223935,US -3389223936,3389225983,IN -3389225984,3389226239,SG +3389223936,3389226239,IN 3389226240,3389226495,AU 3389226496,3389227007,IN 3389227008,3389227519,CN @@ -78396,7 +82787,6 @@ 3389420032,3389420287,CN 3389420288,3389420543,AU 3389420544,3389421055,NZ -3389421056,3389421311,AU 3389421312,3389421567,JP 3389421568,3389422591,KI 3389422592,3389431807,AU @@ -78414,7 +82804,7 @@ 3389458432,3389460479,AU 3389460480,3389464575,JP 3389464576,3389469695,NZ -3389469696,3389471743,IN +3389471232,3389471487,IN 3389471744,3389472767,NZ 3389472768,3389480959,AU 3389480960,3389489151,JP @@ -78543,7 +82933,10 @@ 3389812736,3389813759,AU 3389813760,3389814015,CN 3389814016,3389814527,TH -3389814528,3389846527,AU +3389814528,3389815295,AU +3389816064,3389816575,AU +3389816576,3389816831,US +3389816832,3389846527,AU 3389846528,3389847551,JP 3389847552,3389849599,NZ 3389849600,3389915135,JP @@ -78668,7 +83061,6 @@ 3390339328,3390339839,NZ 3390339840,3390340351,JP 3390340352,3390340607,CN -3390340608,3390340863,IN 3390340864,3390341119,CN 3390341120,3390375935,KR 3390375936,3390377983,AU @@ -78762,7 +83154,9 @@ 3391620864,3391621119,CN 3391621120,3391622911,HK 3391622912,3391623167,CN -3391623168,3391653631,HK +3391623168,3391627263,HK +3391627264,3391651839,IN +3391651840,3391653631,HK 3391653632,3391654143,CN 3391654144,3391654911,HK 3391654912,3391655167,CN @@ -78890,7 +83284,9 @@ 3391954944,3391971327,HK 3391971328,3391979519,AU 3391979520,3391979775,HK -3391979776,3391980031,JP +3391979776,3391979955,CN +3391979956,3391979957,JP +3391979958,3391980031,CN 3391980032,3391980543,HK 3391980544,3391983615,MY 3391983616,3391984639,NP @@ -78991,7 +83387,6 @@ 3392416256,3392416767,HK 3392416768,3392417023,IN 3392417024,3392417535,AU -3392417536,3392417791,HK 3392417792,3392418559,ID 3392418560,3392418815,SG 3392418816,3392419071,ID @@ -79041,8 +83436,7 @@ 3392503808,3392505343,HK 3392506880,3392507903,HK 3392512000,3392516095,BD -3392516096,3392520191,NZ -3392520192,3392524287,AU +3392516096,3392524287,AU 3392524288,3392528383,JP 3392528384,3392536575,ID 3392536576,3392602111,IN @@ -79073,9 +83467,7 @@ 3392692224,3392700415,IN 3392700416,3392708607,SG 3392708608,3392712703,ID -3392712704,3392714751,AF -3392714752,3392715007,FR -3392715008,3392716799,AF +3392712704,3392716799,AF 3392716800,3392733183,IN 3392733184,3392741375,ID 3392741376,3392765951,PH @@ -79189,7 +83581,6 @@ 3393021696,3393021951,HK 3393021952,3393022463,ID 3393022464,3393022975,SG -3393022976,3393023231,PH 3393023232,3393023487,AU 3393023488,3393023743,SG 3393023744,3393023999,IN @@ -79197,7 +83588,6 @@ 3393024512,3393025023,NZ 3393025024,3393025279,AU 3393025280,3393025535,IN -3393025536,3393025791,PH 3393025792,3393026047,AU 3393026560,3393026815,AU 3393027072,3393028095,ID @@ -79237,9 +83627,7 @@ 3393189888,3393190911,CN 3393190912,3393191167,IN 3393191424,3393191935,SB -3393191936,3393222911,HK -3393222912,3393223167,MY -3393223168,3393257471,HK +3393191936,3393257471,HK 3393257472,3393260031,CN 3393260032,3393260543,BD 3393260544,3393265663,AU @@ -79307,7 +83695,7 @@ 3393620992,3393621247,JP 3393621248,3393622015,AU 3393622016,3393626111,PK -3393626112,3393630207,CN +3393626112,3393630207,HK 3393630208,3393634303,JP 3393634304,3393638399,CN 3393638400,3393650687,JP @@ -79356,7 +83744,9 @@ 3393855744,3393855999,NZ 3393856000,3393856255,AU 3393856256,3393856511,HK -3393856768,3393857023,SG +3393856768,3393856896,AU +3393856897,3393856897,SG +3393856898,3393857023,AU 3393857024,3393857535,NZ 3393857536,3393858047,HK 3393858304,3393858559,ID @@ -79488,7 +83878,9 @@ 3394347008,3394351103,PH 3394355200,3394359295,IN 3394359296,3394363391,AU -3394363392,3394441215,HK +3394363392,3394375839,HK +3394375840,3394375847,CN +3394375848,3394441215,HK 3394441216,3394453503,IN 3394453504,3394461695,AU 3394461696,3394465791,SG @@ -79553,7 +83945,9 @@ 3394760704,3394764799,ID 3394764800,3394772991,HK 3394777088,3394781183,JP -3394781184,3394789375,MP +3394781184,3394785023,MP +3394785024,3394785279,US +3394785280,3394789375,MP 3394789376,3394797567,HK 3394797568,3394813951,IN 3394813952,3394815999,JP @@ -79603,7 +83997,7 @@ 3394904320,3394904575,IN 3394904576,3394905087,AU 3394905088,3394905343,BN -3394905344,3394906111,AU +3394905600,3394906111,AU 3394906112,3394906367,IN 3394906368,3394906623,AU 3394906624,3394907135,IN @@ -79611,7 +84005,6 @@ 3394908160,3394910207,AU 3394910208,3394912255,NZ 3394912256,3394920447,PF -3394920448,3394924543,IN 3394924544,3394928639,CN 3394928640,3394936831,PH 3394936832,3394940927,AU @@ -79745,9 +84138,9 @@ 3397070848,3397074943,PH 3397074944,3397083135,HK 3397083136,3397087231,CN -3397091328,3397097471,GU -3397097472,3397097855,MP -3397097856,3397099519,GU +3397091328,3397095679,GU +3397095680,3397095935,MP +3397095936,3397099519,GU 3397099520,3397103615,HK 3397103616,3397105663,LA 3397105664,3397107711,JP @@ -79789,7 +84182,7 @@ 3397213184,3397213439,IN 3397213440,3397213695,AU 3397213696,3397214207,ID -3397214208,3397214719,MN +3397214208,3397214719,BD 3397214720,3397215231,AU 3397215232,3397215743,ID 3397215744,3397216255,PH @@ -79870,7 +84263,8 @@ 3397500928,3397501951,BD 3397501952,3397503999,IN 3397504000,3397505023,TH -3397505024,3397506559,IN +3397505280,3397505535,IN +3397506048,3397506559,IN 3397506560,3397506815,AU 3397506816,3397507071,IN 3397507072,3397507583,ID @@ -79947,19 +84341,27 @@ 3397812224,3397816319,CN 3397816320,3397832703,IN 3397836800,3397844991,AU -3397844992,3397857791,JP -3397857792,3397858047,AU -3397858048,3397862143,JP -3397862144,3397862399,PH +3397844992,3397845247,JP +3397845248,3397845503,AU +3397845504,3397846015,JP +3397846016,3397846271,AU +3397846272,3397857791,JP +3397857792,3397858559,AU +3397858560,3397861887,JP +3397861888,3397862399,PH 3397862400,3397869823,JP 3397869824,3397870079,AU -3397870080,3397878527,JP +3397870080,3397871871,JP +3397871872,3397872127,AU +3397872128,3397878527,JP 3397878528,3397878783,TW 3397878784,3397881855,JP 3397881856,3397882111,HK 3397882112,3397887999,JP -3397888000,3397888768,IN -3397888769,3397910527,JP +3397888000,3397889023,IN +3397889024,3397895423,JP +3397895424,3397895679,AU +3397895680,3397910527,JP 3397910528,3397918719,SG 3397918720,3397922815,AU 3397922816,3397926911,CN @@ -80070,16 +84472,15 @@ 3398639904,3398639907,MY 3398639908,3398640671,JP 3398640672,3398640695,SG -3398640696,3398641407,JP -3398641408,3398641663,MY -3398641664,3398641919,JP +3398640696,3398641919,JP 3398641920,3398642175,AU 3398642176,3398642431,JP 3398642432,3398642943,AU 3398642944,3398643199,JP 3398643200,3398643455,AU 3398643456,3398647807,JP -3398647808,3398668287,AU +3398647808,3398655999,IN +3398656000,3398668287,AU 3398668288,3398672383,CN 3398672384,3398680575,PK 3398680576,3398684671,ID @@ -80108,8 +84509,7 @@ 3398830080,3398831103,KH 3398831104,3398831359,JP 3398831360,3398831615,HK -3398831616,3398831871,SG -3398831872,3398832127,JP +3398831616,3398832127,JP 3398832128,3398840319,CN 3398840320,3398842367,JP 3398842368,3398843391,CN @@ -80256,7 +84656,7 @@ 3399827456,3399835647,AU 3399835648,3399839743,CN 3399839744,3399841791,JP -3399841792,3399852031,TW +3399843840,3399852031,TW 3399852032,3399856127,JP 3399856128,3399860223,CN 3399860224,3399864319,PG @@ -80400,7 +84800,9 @@ 3400433664,3400435711,HK 3400435712,3400435967,BD 3400435968,3400441855,HK -3400441856,3400450047,NZ +3400441856,3400446975,NZ +3400446976,3400447231,GB +3400447232,3400450047,NZ 3400450048,3400458239,JP 3400458240,3400466431,AU 3400466432,3400499199,MO @@ -80428,7 +84830,9 @@ 3400648832,3400649943,SG 3400649944,3400649951,HK 3400649952,3400650239,SG -3400650240,3400654847,AU +3400650240,3400650495,AU +3400650496,3400650751,SG +3400650752,3400654847,AU 3400654848,3400663039,IN 3400663040,3400683519,MY 3400683520,3400691711,JP @@ -80476,7 +84880,8 @@ 3401400320,3401404415,AU 3401404416,3401408511,CN 3401408512,3401416703,HK -3401416704,3401420799,KR +3401416704,3401416959,KR +3401417728,3401420799,SG 3401420800,3401424895,JP 3401424896,3401428991,NZ 3401428992,3401431039,JP @@ -80500,7 +84905,9 @@ 3401545728,3401547775,BD 3401547776,3401580543,IN 3401580544,3402629119,CN -3402629120,3405774847,JP +3402629120,3402917631,JP +3402917632,3402917887,US +3402917888,3405774847,JP 3405774848,3405775871,AU 3405775872,3405776895,CN 3405776896,3405777407,AU @@ -80698,8 +85105,6 @@ 3406208512,3406208767,AU 3406208768,3406209023,CN 3406209024,3406221311,AU -3406221824,3406222079,IN -3406222592,3406222847,IN 3406223360,3406225407,AU 3406225408,3406229503,CN 3406229504,3406231039,AU @@ -80817,7 +85222,9 @@ 3406512384,3406512639,IN 3406512640,3406513663,AU 3406513664,3406513919,CN -3406513920,3406514687,AU +3406513920,3406514175,AU +3406514176,3406514431,IN +3406514432,3406514687,AU 3406514688,3406514943,TH 3406514944,3406515199,AU 3406515200,3406516223,CN @@ -80927,7 +85334,8 @@ 3406696960,3406697215,IN 3406697216,3406698495,AU 3406698496,3406699519,CN -3406699520,3406700799,AU +3406699520,3406700543,AU +3406700544,3406700799,IN 3406700800,3406701055,CN 3406701056,3406706687,AU 3406706688,3406706943,CN @@ -81009,7 +85417,9 @@ 3406864640,3406865151,CN 3406865152,3406865663,AU 3406865664,3406865919,IN -3406865920,3406871039,AU +3406865920,3406869759,AU +3406869760,3406870015,JP +3406870016,3406871039,AU 3406871040,3406871551,CN 3406871552,3406881791,AU 3406881792,3406882047,CN @@ -81056,7 +85466,9 @@ 3406948352,3406948607,AU 3406948608,3406948863,CN 3406948864,3406950655,AU -3406950656,3406951423,NF +3406950656,3406950911,NF +3406950912,3406951167,AU +3406951168,3406951423,NF 3406951424,3406952447,AU 3406952448,3406952703,CN 3406952960,3406954239,AU @@ -81072,7 +85484,8 @@ 3406962688,3406963967,AU 3406963968,3406964223,CN 3406964224,3406966783,AU -3406966784,3406967551,CN +3406966784,3406967295,CN +3406967296,3406967551,HK 3406967552,3406967807,IN 3406967808,3406968063,CN 3406968064,3406972927,AU @@ -81294,7 +85707,8 @@ 3407297792,3407298559,CN 3407298560,3407300863,AU 3407300864,3407301119,CN -3407301120,3407303935,AU +3407301120,3407301887,AU +3407302144,3407303935,AU 3407303936,3407304191,CN 3407304192,3407305727,AU 3407305728,3407306751,CN @@ -81361,8 +85775,8 @@ 3407377408,3407377663,CN 3407377664,3407378943,AU 3407378944,3407379455,CN -3407379456,3407382271,AU -3407382272,3407382527,JP +3407379456,3407382015,AU +3407382016,3407382527,JP 3407382528,3407384831,AU 3407384832,3407385087,CN 3407385088,3407386623,AU @@ -81401,7 +85815,9 @@ 3407438592,3407439103,CN 3407439104,3407440383,AU 3407440384,3407440639,CN -3407440640,3407446783,AU +3407440640,3407440895,AU +3407440896,3407441151,IN +3407441152,3407446783,AU 3407446784,3407447039,CN 3407447040,3407447807,AU 3407447808,3407448063,CN @@ -81436,7 +85852,11 @@ 3407473408,3407473919,CN 3407473920,3407475199,AU 3407475200,3407475455,CN -3407475456,3407481855,AU +3407475456,3407481087,AU +3407481088,3407481223,JP +3407481224,3407481231,AU +3407481232,3407481599,JP +3407481600,3407481855,AU 3407481856,3407482111,CN 3407482112,3407487487,AU 3407487488,3407487743,CN @@ -81594,7 +86014,8 @@ 3407667712,3407668223,CN 3407668224,3407671039,AU 3407671040,3407671295,CN -3407671296,3407675903,AU +3407671296,3407674367,AU +3407674880,3407675903,AU 3407675904,3407676159,CN 3407676160,3407677439,AU 3407677440,3407677951,CN @@ -82101,7 +86522,9 @@ 3409871616,3409871871,CN 3409871872,3409873663,AU 3409873664,3409873919,CN -3409873920,3409876991,AU +3409873920,3409875967,AU +3409875968,3409876735,JP +3409876736,3409876991,AU 3409876992,3409878015,TH 3409878016,3409879295,AU 3409879296,3409879551,CN @@ -82111,7 +86534,11 @@ 3409888000,3409888255,HK 3409888256,3409888511,AU 3409888512,3409888767,CN -3409888768,3409896447,AU +3409888768,3409891327,AU +3409891328,3409891839,GB +3409891840,3409892351,AU +3409892352,3409892863,US +3409892864,3409896447,AU 3409896448,3409897471,CN 3409897472,3409897983,AU 3409897984,3409898239,CN @@ -82299,7 +86726,7 @@ 3411641344,3411642367,IN 3411642368,3411643391,CN 3411643392,3411644415,VN -3411644416,3411644927,AU +3411644672,3411644927,AU 3411644928,3411645951,ID 3411645952,3411646207,SG 3411646208,3411647487,IN @@ -82346,12 +86773,7 @@ 3411859252,3411861503,JP 3411861504,3411869695,AU 3411869696,3411943423,CN -3411943424,3411946495,NZ -3411946496,3411947007,AU -3411947008,3411948031,NZ -3411948032,3411948543,AU -3411948544,3411950591,NZ -3411950592,3411951615,AU +3411943424,3411951615,NZ 3411951616,3411967999,LK 3411968000,3411984383,AU 3411984384,3412000767,IN @@ -82478,7 +86900,8 @@ 3413180416,3413213183,TH 3413213184,3413229567,VN 3413229568,3413245951,AU -3413245952,3413262335,MY +3413245952,3413251071,MY +3413251072,3413262335,JP 3413262336,3413263359,PH 3413270528,3413278719,TH 3413278720,3413295103,NZ @@ -82495,11 +86918,7 @@ 3413327872,3413344255,IN 3413344256,3413360639,PH 3413360640,3413377023,MY -3413377024,3413395199,SG -3413395200,3413395455,AU -3413395456,3413415935,SG -3413415936,3413416191,AU -3413416192,3413524479,SG +3413377024,3413524479,SG 3413524480,3413540863,TH 3413540864,3413557247,NZ 3413557248,3413565439,CN @@ -82577,7 +86996,9 @@ 3413934080,3413946367,IN 3413946368,3413950463,AU 3413950464,3413966847,IN -3413966848,3414050303,SG +3413966848,3414024191,SG +3414024192,3414024447,AU +3414024448,3414050303,SG 3414050304,3414050559,US 3414050560,3414155519,SG 3414155520,3414155775,PH @@ -82748,7 +87169,6 @@ 3416262656,3416264703,AU 3416264704,3416268799,JP 3416268800,3416272895,HK -3416274688,3416274943,MN 3416274944,3416276991,ID 3416276992,3416285183,HK 3416285184,3416287231,VN @@ -82777,8 +87197,6 @@ 3416372224,3416372479,CN 3416372480,3416372735,SG 3416372736,3416372991,AU -3416373248,3416373503,AU -3416373504,3416373759,SG 3416373760,3416374271,AU 3416374272,3416374527,PH 3416374528,3416374783,IN @@ -82790,12 +87208,13 @@ 3416474584,3416474599,AU 3416474600,3416474639,JP 3416474640,3416474647,NZ -3416474648,3416475391,JP -3416475392,3416475647,NZ -3416475648,3416482047,JP -3416482048,3416482303,SG -3416482304,3416489727,JP -3416489728,3416489983,AU +3416474648,3416475439,JP +3416475440,3416475455,NZ +3416475456,3416482047,JP +3416482048,3416482055,SG +3416482056,3416489755,JP +3416489756,3416489759,AU +3416489760,3416489983,JP 3416489984,3416506367,VN 3416506368,3416514559,TW 3416514560,3416522751,IN @@ -82803,8 +87222,8 @@ 3416588288,3416653823,JP 3416653824,3416667135,AU 3416667136,3416667647,US -3416667648,3416667775,AU -3416667776,3416668159,US +3416667648,3416667903,AU +3416667904,3416668159,US 3416668160,3416686591,AU 3416686592,3416694783,SG 3416694784,3416702975,CN @@ -82887,7 +87306,7 @@ 3417014272,3417022463,JP 3417022464,3417030655,KR 3417030656,3417034751,AU -3417034752,3417035775,IN +3417035008,3417035775,IN 3417035776,3417036799,JP 3417036800,3417037823,ID 3417037824,3417038079,AU @@ -82912,21 +87331,17 @@ 3417182208,3417184767,AU 3417184768,3417185023,MN 3417185024,3417185279,AF -3417185280,3417185535,AU -3417185536,3417185791,SG +3417185280,3417185791,SG 3417185792,3417186303,NZ 3417186304,3417194495,HK 3417194496,3417198591,JP -3417198592,3417200127,SG -3417200128,3417200383,AU -3417200384,3417200639,SG +3417198592,3417200639,SG 3417200640,3417202687,JP 3417202688,3417210879,CN 3417210880,3417227263,AU 3417227264,3417243647,JP 3417243648,3417244671,PH 3417244672,3417245695,IN -3417245696,3417247743,BT 3417247744,3417251839,JP 3417251840,3417260031,KR 3417260032,3417264127,PK @@ -83034,7 +87449,9 @@ 3418243072,3418251263,PH 3418251264,3418255359,CN 3418255360,3418257407,ID -3418257408,3418259455,HK +3418257408,3418257663,HK +3418257664,3418257919,AU +3418257920,3418259455,HK 3418259456,3418267647,IN 3418267648,3418271743,VN 3418271744,3418273791,SG @@ -83045,9 +87462,7 @@ 3418282240,3418282495,AU 3418282496,3418283519,PH 3418283520,3418284031,AU -3418284032,3418286847,SG -3418286848,3418287103,AU -3418287104,3418288127,SG +3418284032,3418288127,SG 3418288128,3418290175,ID 3418290176,3418290431,IN 3418290432,3418290687,CN @@ -83066,7 +87481,6 @@ 3418301440,3418302463,AU 3418302464,3418304511,ID 3418304512,3418306559,VN -3418306560,3418307583,MN 3418308608,3418324991,CN 3418324992,3418326015,VU 3418326016,3418326271,AU @@ -83094,7 +87508,9 @@ 3418403584,3418403839,AU 3418403840,3418406911,JP 3418406912,3418423295,IN -3418423296,3418444091,HK +3418423296,3418434559,HK +3418434560,3418434815,SG +3418434816,3418444091,HK 3418444092,3418444095,CN 3418444096,3418456063,HK 3418456064,3418472447,IN @@ -83123,7 +87539,9 @@ 3418642944,3418643199,ID 3418643200,3418643455,JP 3418643456,3418644479,AU -3418644480,3418650807,JP +3418644480,3418644735,JP +3418644736,3418644863,AU +3418644864,3418650807,JP 3418650808,3418650808,HK 3418650809,3418650823,JP 3418650824,3418650839,HK @@ -83156,7 +87574,13 @@ 3419078656,3419209727,TW 3419209728,3419226111,VN 3419226112,3419234303,CN -3419234304,3419242495,JP +3419234304,3419239935,JP +3419239936,3419240447,US +3419240448,3419240959,JP +3419240960,3419241471,US +3419241472,3419241983,JP +3419241984,3419242239,US +3419242240,3419242495,JP 3419242496,3419275263,CN 3419275264,3419340799,AU 3419340800,3419344895,TW @@ -83233,8 +87657,8 @@ 3419897856,3419899903,JP 3419899904,3419900159,FR 3419900160,3419900415,BE -3419900416,3419901439,AU -3419901440,3419901951,NZ +3419900416,3419901567,AU +3419901568,3419901951,NZ 3419901952,3419902207,AU 3419902208,3419902463,HK 3419902464,3419902719,CN @@ -83313,15 +87737,13 @@ 3422000536,3422000536,IN 3422000537,3422552063,KR 3422552064,3422850559,US -3422850560,3422851071,GB -3422851072,3422955519,US +3422850560,3422850815,GB +3422850816,3422955519,US 3422955520,3422956799,FR -3422956800,3423092735,US -3423092736,3423092767,VI -3423092768,3423092783,US -3423092784,3423092831,VI -3423092832,3423092847,US -3423092848,3423093759,VI +3422956800,3423076351,US +3423076352,3423077375,CA +3423077376,3423092735,US +3423092736,3423093759,VI 3423093760,3423094783,US 3423094784,3423095807,CA 3423095808,3423128575,US @@ -83333,10 +87755,8 @@ 3423182848,3423184895,CA 3423184896,3423204095,US 3423204096,3423204351,CA -3423204352,3423222271,US -3423222272,3423222527,CA -3423222528,3423229951,US -3423232000,3423236095,US +3423204352,3423229951,US +3423230976,3423236095,US 3423238144,3423248383,US 3423248384,3423249407,CA 3423249408,3423258623,US @@ -83368,9 +87788,7 @@ 3423468544,3423469567,CA 3423469568,3423473663,US 3423473664,3423474687,CA -3423474688,3423480063,US -3423480064,3423480319,AU -3423480320,3423480831,US +3423474688,3423480831,US 3423480832,3423480987,NG 3423480988,3423480988,US 3423480989,3423481343,NG @@ -83391,7 +87809,8 @@ 3423586304,3423588351,US 3423590400,3423602687,US 3423602688,3423603711,KN -3423603712,3423626239,US +3423603712,3423614975,US +3423616000,3423626239,US 3423626240,3423627263,CA 3423627264,3423629311,US 3423629312,3423630335,AG @@ -83440,15 +87859,16 @@ 3424507136,3424507391,CA 3424507392,3425173503,US 3425173504,3425304575,CA -3425304576,3425471487,US -3425472512,3425697791,US +3425304576,3425697791,US 3425697792,3425699839,CA 3425699840,3425711615,US 3425713152,3425714175,US 3425714176,3425722367,CA 3425722368,3425726463,US 3425728512,3425828863,US -3425828864,3425894399,CA +3425828864,3425869167,CA +3425869168,3425869183,US +3425869184,3425894399,CA 3425894400,3426013183,US 3426013184,3426013439,IL 3426013440,3426306559,US @@ -83499,7 +87919,6 @@ 3427618304,3427618559,CA 3427618560,3427631103,US 3427632128,3427647999,US -3427648000,3427648511,CA 3427648512,3427651071,US 3427651072,3427651327,CA 3427651328,3427729407,US @@ -83694,8 +88113,8 @@ 3428589568,3428591871,US 3428591872,3428592127,CA 3428592128,3428592383,US -3428592384,3428594175,CA -3428594176,3428594687,US +3428592384,3428593919,CA +3428593920,3428594687,US 3428594688,3428595199,CA 3428595200,3428596223,US 3428596224,3428596735,CA @@ -83767,9 +88186,7 @@ 3429171200,3429236735,CA 3429236736,3429382143,US 3429382144,3429382399,DE -3429382400,3429401855,US -3429401856,3429402111,CA -3429402112,3429500927,US +3429382400,3429500927,US 3429500928,3429502975,CA 3429502976,3429517407,US 3429517408,3429517411,HK @@ -83784,11 +88201,10 @@ 3429777408,3429809151,US 3429810176,3429892095,US 3429892096,3429957631,CA -3429957632,3430073354,US +3429957632,3430025471,US +3430025728,3430073354,US 3430073355,3430073355,AU -3430073356,3430074111,US -3430074112,3430074367,AU -3430074368,3430146047,US +3430073356,3430146047,US 3430148096,3430328831,US 3430328832,3430329087,GH 3430329088,3430354943,US @@ -83856,12 +88272,15 @@ 3430845440,3430845951,MX 3430845952,3430849535,US 3430849536,3430850047,CA -3430850048,3430973951,US -3430974208,3431114495,US +3430850048,3431114495,US 3431114496,3431114751,CA 3431114752,3431468031,US 3431468032,3431469055,CA -3431469056,3431596287,US +3431469056,3431526911,US +3431526912,3431526921,CH +3431526922,3431526922,US +3431526923,3431527167,CH +3431527168,3431596287,US 3431596288,3431602687,CA 3431602688,3431602943,US 3431602944,3431606271,CA @@ -83933,9 +88352,9 @@ 3432493824,3432495103,DE 3432495104,3432517119,US 3432517120,3432517631,MU -3432517632,3432571647,US -3432571648,3432571903,CA -3432571904,3432579071,US +3432517632,3432570879,US +3432570880,3432572927,HK +3432572928,3432579071,US 3432580096,3432585215,US 3432585216,3432585727,MX 3432585728,3432609791,US @@ -83951,7 +88370,8 @@ 3432689152,3432689663,CA 3432689664,3432695807,US 3432697856,3432708095,US -3432710144,3432807423,US +3432710144,3432717311,US +3432718336,3432807423,US 3432807424,3432808447,CA 3432808448,3433824511,US 3433824512,3433824767,DE @@ -83969,7 +88389,8 @@ 3434014720,3434015231,US 3434015232,3434020607,CA 3434020608,3434427391,US -3434427392,3434428415,HR +3434427392,3434428159,HR +3434428160,3434428415,HN 3434428416,3434433279,US 3434433280,3434433535,PR 3434433536,3434553343,US @@ -83981,7 +88402,9 @@ 3434575616,3434583039,US 3434583040,3434584063,NL 3434584064,3434807551,US -3434807552,3434831359,CA +3434807552,3434810111,CA +3434810112,3434810367,US +3434810368,3434831359,CA 3434831360,3434831615,US 3434831616,3434872575,CA 3434872576,3434913791,US @@ -84016,9 +88439,7 @@ 3436290048,3436314367,CA 3436314368,3436476415,US 3436476416,3436478463,AW -3436478464,3436492799,US -3436492800,3436493055,NL -3436493056,3436507135,US +3436478464,3436507135,US 3436507136,3436509183,BB 3436509184,3436697087,US 3436697088,3436697343,VE @@ -84140,8 +88561,8 @@ 3437755904,3437756159,US 3437756160,3437756415,IE 3437756416,3437772799,US -3437772800,3437776895,CA -3437776896,3437789863,US +3437772800,3437776639,CA +3437776640,3437789863,US 3437789864,3437789871,AU 3437789872,3437961215,US 3437961216,3437964287,ZA @@ -84290,8 +88711,8 @@ 3449212928,3449213183,US 3449213184,3449213695,CA 3449213696,3449214975,US -3449214976,3449215743,CA -3449215744,3449215871,US +3449214976,3449215487,CA +3449215488,3449215871,US 3449215872,3449215999,CA 3449216000,3449220607,US 3449220608,3449221375,CA @@ -84310,9 +88731,7 @@ 3449575680,3449593855,US 3449593856,3449594111,AU 3449594112,3449638911,US -3449638912,3449639167,GB -3449639168,3449639423,US -3449639424,3449639679,GB +3449638912,3449639679,GB 3449639680,3449639935,US 3449639936,3449640191,GB 3449640192,3449640447,NL @@ -84329,7 +88748,9 @@ 3449843200,3449843711,YE 3449843712,3449874687,US 3449874688,3449874943,AG -3449874944,3449923583,US +3449874944,3449884159,US +3449884160,3449884415,AS +3449884416,3449923583,US 3449923584,3449923839,ES 3449923840,3449974783,US 3449974784,3449976831,CA @@ -84380,17 +88801,13 @@ 3450950656,3450951679,JP 3450951680,3450953727,US 3450953728,3450957823,DE -3450957824,3450974207,US -3450974208,3450974463,GB -3450974464,3450975231,US +3450957824,3450975231,US 3450975232,3450975743,LB 3450975744,3450982399,US 3450982400,3450984447,TW 3450984448,3450986495,PH 3450986496,3450986751,HK -3450986752,3450987007,US -3450987008,3450987263,CN -3450987264,3451170303,US +3450986752,3451170303,US 3451170304,3451170559,VE 3451170560,3451187967,US 3451187968,3451188223,AU @@ -84467,9 +88884,7 @@ 3452174336,3452180479,US 3452181504,3452436479,US 3452436480,3452502015,CA -3452502016,3452678399,US -3452678400,3452682239,BE -3452682240,3452715007,US +3452502016,3452715007,US 3452715008,3452723199,CA 3452723200,3452764671,US 3452764672,3452765183,CA @@ -84491,9 +88906,7 @@ 3452770304,3452770559,CA 3452770560,3452770815,US 3452770816,3452771071,CA -3452771072,3452771327,US -3452771328,3452771583,CA -3452771584,3452771839,US +3452771072,3452771839,US 3452771840,3452773119,CA 3452773120,3452773375,US 3452773376,3452773887,CA @@ -84570,7 +88983,9 @@ 3452813312,3452813567,US 3452813568,3452814079,CA 3452814080,3452814335,US -3452814336,3452816127,CA +3452814336,3452815359,CA +3452815360,3452815615,US +3452815616,3452816127,CA 3452816128,3452816511,US 3452816512,3452816527,CA 3452816528,3452816895,US @@ -84588,7 +89003,9 @@ 3452821504,3452822271,US 3452822272,3452822527,CA 3452822528,3452822783,US -3452822784,3452824063,CA +3452822784,3452823551,CA +3452823552,3452823807,US +3452823808,3452824063,CA 3452824064,3452824319,US 3452824320,3452824575,CA 3452824576,3452824831,US @@ -84917,12 +89334,14 @@ 3456303104,3456311295,JP 3456311296,3456360447,US 3456360448,3456364543,BG -3456364544,3456892927,US +3456364544,3456856063,US +3456856064,3456856319,CA +3456856320,3456892927,US 3456892928,3456958463,CA 3456958464,3457551871,US 3457551872,3457552127,CA -3457552128,3457553151,US -3457553152,3457553663,CA +3457552128,3457553407,US +3457553408,3457553663,CA 3457553664,3457554175,US 3457554176,3457554431,CA 3457554432,3457555711,US @@ -84965,6 +89384,8 @@ 3458820096,3458820351,CA 3458820352,3458820863,US 3458820864,3458821119,JM +3458821120,3458821887,US +3458821888,3458822143,CA 3458822144,3459055615,US 3459055616,3459121151,CA 3459121152,3459186687,US @@ -85091,14 +89512,12 @@ 3459456512,3459456767,US 3459456768,3459457279,CA 3459457536,3459457791,CA -3459457792,3459458047,PR 3459458048,3459512319,US 3459512320,3459513855,CA 3459513856,3459592191,US 3459592192,3459596287,CA -3459596288,3459614719,US -3459616768,3459617023,CA -3459617024,3459617791,US +3459596288,3459614975,US +3459616768,3459617791,US 3459617792,3459617999,CA 3459618000,3459618000,ID 3459618001,3459618047,CA @@ -85107,12 +89526,14 @@ 3459619072,3459622911,US 3459624960,3459629055,BM 3459629056,3459631103,US -3459633152,3459731455,US +3459633152,3459686399,US +3459686400,3459687167,NL +3459687168,3459731455,US 3459731456,3459735551,CA 3459735552,3459745535,US 3459745536,3459745791,IT 3459745792,3459842815,US -3459842816,3459843071,AR +3459842816,3459843071,BR 3459843072,3459848959,US 3459848960,3459849215,FR 3459849216,3459850239,US @@ -85286,7 +89707,9 @@ 3461513728,3461513983,BF 3461513984,3461514495,US 3461514496,3461514751,QA -3461514752,3461516287,US +3461514752,3461515775,US +3461515776,3461516031,CA +3461516032,3461516287,US 3461516288,3461516543,IL 3461516544,3461548031,US 3461550080,3461554175,US @@ -85441,7 +89864,9 @@ 3464388608,3464391935,US 3464391936,3464392191,CA 3464392192,3464394751,US -3464394752,3464396799,VC +3464394752,3464395263,VC +3464395264,3464395519,LC +3464395520,3464396799,VC 3464396800,3464415231,US 3464417280,3464421631,US 3464421632,3464421887,CA @@ -85510,9 +89935,9 @@ 3465962496,3465962751,CA 3465962752,3466067967,US 3466067968,3466068223,CA -3466068224,3466068991,US -3466068992,3466069247,CA -3466069248,3466069343,US +3466068224,3466069055,US +3466069056,3466069087,CA +3466069088,3466069343,US 3466069344,3466069375,CA 3466069376,3466069447,US 3466069448,3466069455,CA @@ -85556,11 +89981,13 @@ 3466914304,3466914559,FR 3466914560,3466929407,US 3466929408,3466929663,IT -3466929664,3466937663,US +3466929664,3466937599,US +3466937600,3466937663,ES 3466937664,3466937669,DE 3466937670,3466937670,US 3466937671,3466937727,DE -3466937728,3466938444,US +3466937728,3466937855,ES +3466937856,3466938444,US 3466938445,3466938448,HK 3466938449,3466938807,US 3466938808,3466938811,GB @@ -85700,9 +90127,7 @@ 3469176320,3469176575,MX 3469176576,3469186303,US 3469186304,3469186559,MX -3469186560,3469859583,US -3469859584,3469859839,CA -3469859840,3469893631,US +3469186560,3469893631,US 3469893632,3469901823,CA 3469901824,3469989887,US 3469990400,3470131199,US @@ -85735,11 +90160,11 @@ 3470610432,3470614527,AR 3470614528,3470646591,US 3470646592,3470646599,CN -3470646600,3470651391,US +3470646600,3470646831,US +3470646832,3470646847,IL +3470646848,3470651391,US 3470651392,3470655487,CA -3470655488,3470660647,US -3470660648,3470660655,IE -3470660656,3470671871,US +3470655488,3470671871,US 3470671872,3470680063,CA 3470680064,3470744063,US 3470744064,3470744575,CA @@ -85802,7 +90227,9 @@ 3473755392,3473755647,HN 3473755648,3473765887,US 3473765888,3473766399,EC -3473766400,3473901055,US +3473766400,3473786111,US +3473786112,3473786127,PR +3473786128,3473901055,US 3473901056,3473901311,EC 3473901312,3473917439,US 3473917440,3473917695,PR @@ -85837,7 +90264,9 @@ 3475670272,3475670527,AI 3475670528,3475670783,LC 3475670784,3475670847,DM -3475670848,3475671039,AG +3475670848,3475670857,AG +3475670858,3475670858,DM +3475670859,3475671039,AG 3475671040,3475681279,US 3475681280,3475685375,HN 3475685376,3475851263,US @@ -85865,7 +90294,8 @@ 3476447232,3476455423,CA 3476455424,3476881407,US 3476881408,3476946943,CA -3476946944,3477542143,US +3476946944,3477389311,US +3477393408,3477542143,US 3477542144,3477542399,IN 3477542400,3478114303,US 3478114304,3478118399,PE @@ -85873,7 +90303,9 @@ 3478192128,3478257663,CA 3478257664,3478274823,US 3478274824,3478274831,GB -3478274832,3478288671,US +3478274832,3478288607,US +3478288608,3478288615,GB +3478288616,3478288671,US 3478288672,3478288703,GB 3478288704,3478372351,US 3478372352,3478380543,MX @@ -86021,7 +90453,9 @@ 3481843456,3481843711,GB 3481843712,3481951395,US 3481951396,3481951399,GB -3481951400,3481964575,US +3481951400,3481958271,US +3481958272,3481958399,NL +3481958400,3481964575,US 3481964576,3481964579,IE 3481964580,3481993791,US 3481993792,3481993799,CA @@ -86105,9 +90539,9 @@ 3482039296,3482039551,US 3482039552,3482040319,CA 3482040320,3482041087,US -3482041088,3482041343,CA -3482041344,3482041599,US -3482041600,3482042367,CA +3482041088,3482041855,CA +3482041856,3482042111,US +3482042112,3482042367,CA 3482042368,3482043903,US 3482043904,3482044927,CA 3482044928,3482045183,US @@ -86125,7 +90559,11 @@ 3482051584,3482051839,US 3482051840,3482052863,CA 3482052864,3482053631,US -3482053632,3482054655,CA +3482053632,3482053887,CA +3482053888,3482053999,US +3482054000,3482054015,CA +3482054016,3482054143,US +3482054144,3482054655,CA 3482054656,3482058239,US 3482058240,3482058495,CA 3482058496,3482583039,US @@ -86160,8 +90598,13 @@ 3484322048,3484323839,US 3484326912,3484327423,US 3484331008,3484437503,US -3484437504,3484442623,GB -3484442624,3484450815,US +3484437504,3484438527,GB +3484438528,3484438783,ZM +3484438784,3484439039,US +3484439040,3484439295,GB +3484439296,3484439551,US +3484439552,3484439807,ZM +3484439808,3484450815,US 3484450816,3484451839,CA 3484451840,3484452095,US 3484452096,3484453631,CA @@ -86246,9 +90689,9 @@ 3485462528,3485464575,VC 3485464576,3485466623,LC 3485466624,3485597695,US -3485597696,3485672543,CA -3485672544,3485672551,US -3485672552,3485695999,CA +3485597696,3485694975,CA +3485694976,3485695231,US +3485695232,3485695999,CA 3485696000,3485721056,US 3485721057,3485721057,AE 3485721058,3485959423,US @@ -86457,11 +90900,11 @@ 3486702592,3486702847,CA 3486702848,3487039487,US 3487039488,3487105023,CA -3487105024,3487175935,US +3487105024,3487174143,US +3487174144,3487174271,CH +3487174272,3487175935,US 3487175936,3487176191,GB -3487176192,3487177983,US -3487177984,3487178239,GB -3487178240,3487181359,US +3487176192,3487181359,US 3487181360,3487181375,GB 3487181376,3487189247,US 3487189248,3487189503,DK @@ -86522,7 +90965,9 @@ 3488940032,3488956415,CA 3488956416,3488989183,US 3488989184,3489005567,CA -3489005568,3489136639,US +3489005568,3489058047,US +3489058048,3489058063,GB +3489058064,3489136639,US 3489136640,3489153535,MX 3489153536,3489154047,HN 3489154048,3489155583,MX @@ -86551,7 +90996,7 @@ 3489399040,3489464319,US 3489464320,3489529855,CA 3489529856,3489562623,US -3489563136,3489563391,JM +3489565440,3489565695,JM 3489566720,3489575935,US 3489575936,3489576959,CN 3489576960,3489577215,US @@ -86581,7 +91026,9 @@ 3490265344,3490267135,CO 3490267136,3490488319,US 3490488320,3490489343,PR -3490489344,3490703615,US +3490489344,3490702847,US +3490702848,3490703103,AS +3490703104,3490703615,US 3490703616,3490703871,PR 3490703872,3490786047,US 3490786048,3490786303,PR @@ -86594,9 +91041,7 @@ 3491478528,3491637247,US 3491637248,3491637759,CO 3491637760,3491651583,US -3491651584,3491654655,VI -3491654656,3491654911,US -3491654912,3491659775,VI +3491651584,3491659775,VI 3491659776,3491743743,US 3491743744,3491745791,CO 3491745792,3491969023,US @@ -86609,21 +91054,27 @@ 3492812760,3492812763,JP 3492812764,3492845823,US 3492845824,3492846079,CH -3492846080,3492867071,US +3492846080,3492858111,US +3492858112,3492858367,SA +3492858368,3492864767,US +3492864768,3492865023,CA +3492865024,3492865279,US +3492865280,3492865359,GB +3492865360,3492865375,US +3492865376,3492865504,GB +3492865505,3492865505,US +3492865506,3492865535,GB +3492865536,3492867071,US 3492867072,3492867327,FR -3492867328,3492868607,US -3492868608,3492868863,MX -3492868864,3492869631,US +3492867328,3492869631,US 3492869632,3492869887,BR 3492869888,3492877954,US 3492877955,3492877955,CA -3492877956,3492886527,US -3492886528,3492886559,GB -3492886560,3492886591,US -3492886592,3492886783,GB -3492886784,3492894975,US +3492877956,3492894975,US 3492894976,3492895231,BE -3492895232,3492912127,US +3492895232,3492910079,US +3492910080,3492910207,GB +3492910208,3492912127,US 3492912128,3492912151,GB 3492912152,3492912159,US 3492912160,3492912383,GB @@ -86631,9 +91082,9 @@ 3492913664,3492913919,CA 3492913920,3492917247,US 3492917248,3492917503,VI -3492917504,3492923391,US -3492923392,3492923647,GB -3492923648,3492933375,US +3492917504,3492921855,US +3492921856,3492922111,VI +3492922112,3492933375,US 3492933376,3492933376,CA 3492933377,3492933377,CH 3492933378,3492933631,CA @@ -86645,17 +91096,15 @@ 3492950864,3492950879,DE 3492950880,3492954623,US 3492954624,3492955135,GB -3492955136,3492960255,US -3492960256,3492960511,ES -3492960512,3492962815,US -3492962816,3492963071,GB -3492963072,3492968191,US +3492955136,3492957695,US +3492957696,3492958207,VI +3492958208,3492962559,US +3492962560,3492962815,GB +3492962816,3492968191,US 3492968192,3492968447,GB -3492968448,3492969505,US -3492969506,3492969506,VI -3492969507,3492969535,US -3492969536,3492969599,VI -3492969600,3492994815,US +3492968448,3492969471,US +3492969472,3492969727,VI +3492969728,3492994815,US 3492994816,3492995071,GB 3492995072,3492996127,US 3492996128,3492996136,GB @@ -86665,15 +91114,15 @@ 3493013760,3493014015,GB 3493014016,3493014627,US 3493014628,3493014628,GB -3493014629,3493029341,US -3493029342,3493029342,GB -3493029343,3493039359,US +3493014629,3493029119,US +3493029120,3493029311,GB +3493029312,3493029327,US +3493029328,3493029375,GB +3493029376,3493039359,US 3493039360,3493039615,AR 3493039616,3493061119,US 3493061120,3493061375,BR -3493061376,3493062911,US -3493062912,3493063167,DE -3493063168,3493073151,US +3493061376,3493073151,US 3493073152,3493073407,BO 3493073408,3493073663,US 3493073664,3493073919,BO @@ -86708,10 +91157,10 @@ 3493987328,3493990399,US 3493990400,3493991423,CA 3493991424,3493998591,US -3493998592,3493998847,AI -3493998848,3493999359,KN +3493998592,3493999103,AI +3493999104,3493999359,KN 3493999360,3494000639,AI -3494000640,3494003711,US +3494000640,3494002687,US 3494003712,3494004735,CA 3494004736,3494009855,US 3494009856,3494010879,CA @@ -86756,8 +91205,8 @@ 3494198272,3494244351,US 3494244352,3494246399,CA 3494246400,3494247423,US -3494247424,3494250495,CA -3494250496,3494262783,US +3494247424,3494251519,CA +3494252544,3494262783,US 3494262784,3494264831,CA 3494264832,3494271999,US 3494272000,3494273023,KN @@ -86780,7 +91229,8 @@ 3494361088,3494362111,CA 3494362112,3494380543,US 3494380544,3494381567,CA -3494381568,3494402559,US +3494381568,3494386687,US +3494387712,3494402559,US 3494402560,3494402815,GB 3494402816,3494410239,US 3494410240,3494412287,CA @@ -86799,13 +91249,9 @@ 3494459392,3494460415,CA 3494460416,3494464511,US 3494464512,3494465535,CA -3494465536,3494496255,US -3494496512,3494496767,US -3494498304,3494510591,US +3494465536,3494510591,US 3494510592,3494512639,CA -3494512640,3494512895,US -3494512896,3494513151,NO -3494513152,3494516735,US +3494512640,3494516735,US 3494516736,3494517759,CA 3494517760,3494540031,US 3494540032,3494540287,UG @@ -86855,7 +91301,8 @@ 3494788096,3494788351,NG 3494788352,3494788607,LY 3494788608,3494789119,CA -3494789120,3494852607,US +3494789120,3494812671,US +3494813696,3494852607,US 3494852608,3494854655,CA 3494854656,3494862847,US 3494862848,3494863871,DM @@ -86916,10 +91363,11 @@ 3495215104,3495217151,VI 3495217152,3495219199,VC 3495219200,3495225343,US +3495225856,3495226111,GB 3495226624,3495226879,US 3495227392,3495251967,US 3495251968,3495254015,CA -3495254016,3495260159,US +3495255040,3495260159,US 3495260160,3495261183,CA 3495261184,3495271423,US 3495272192,3495285759,US @@ -86980,9 +91428,9 @@ 3495620608,3495622655,CA 3495622656,3495635967,US 3495636992,3495647231,US -3495648000,3495653887,US -3495653888,3495654143,CA -3495654144,3495673855,US +3495648000,3495654143,US +3495654144,3495654399,CA +3495654400,3495673855,US 3495673856,3495674879,MF 3495674880,3495675391,VG 3495675392,3495688191,US @@ -87018,9 +91466,10 @@ 3495864320,3495864831,DM 3495864832,3495865343,MF 3495865344,3495866367,US -3495866368,3495866623,VC -3495866624,3495866879,LC -3495866880,3495867391,VC +3495866368,3495866623,LC +3495866624,3495867050,VC +3495867051,3495867051,LC +3495867052,3495867391,VC 3495867392,3495867647,LC 3495867648,3495868415,VC 3495868416,3495871487,US @@ -87046,8 +91495,10 @@ 3496189952,3496190519,US 3496190520,3496190527,CA 3496190528,3496190719,US -3496190720,3496190975,CA -3496190976,3496296447,US +3496190720,3496190735,CA +3496190736,3496190751,US +3496190752,3496190767,CA +3496190768,3496296447,US 3496296448,3496312831,CA 3496312832,3496468479,US 3496468480,3496476671,CA @@ -87294,7 +91745,9 @@ 3507038208,3507040255,TW 3507040256,3507290111,US 3507290112,3507355647,AR -3507355648,3507470335,US +3507355648,3507427583,US +3507427584,3507427839,CA +3507427840,3507470335,US 3507470336,3507486719,CA 3507486720,3507585023,US 3507585024,3507598911,CA @@ -87498,15 +91951,11 @@ 3509522176,3509522431,CA 3509522432,3509522687,KW 3509522688,3509522943,CA -3509522944,3509523679,US -3509523680,3509523695,CA -3509523696,3509524223,US -3509524224,3509524735,CA +3509522944,3509524479,US +3509524480,3509524735,CA 3509524736,3509524991,US 3509524992,3509525759,CA -3509525760,3509526015,US -3509526016,3509526271,CA -3509526272,3509526527,US +3509525760,3509526527,US 3509526528,3509526783,CA 3509526784,3509527807,US 3509527808,3509528063,CA @@ -87517,7 +91966,9 @@ 3509532672,3509532927,US 3509532928,3509533439,CA 3509533440,3509534719,US -3509534720,3509535999,CA +3509534720,3509535487,CA +3509535488,3509535743,US +3509535744,3509535999,CA 3509536000,3509536255,US 3509536256,3509536767,CA 3509536768,3509537279,US @@ -87526,9 +91977,11 @@ 3509538560,3509538815,CA 3509538816,3509539071,US 3509539072,3509539327,CA -3509539328,3509539583,US -3509539584,3509540095,CA -3509540096,3509540607,US +3509539328,3509539631,US +3509539632,3509539647,CA +3509539648,3509539967,US +3509539968,3509540031,CA +3509540032,3509540607,US 3509540608,3509541503,CA 3509541504,3509541631,US 3509541632,3509541887,CA @@ -87544,14 +91997,16 @@ 3509546096,3509546111,CA 3509546112,3509546495,US 3509546496,3509547007,CA -3509547008,3509551359,US -3509551360,3509551871,CA +3509547008,3509551615,US +3509551616,3509551871,CA 3509551872,3509552127,US 3509552128,3509552639,CA 3509552640,3509553919,US 3509553920,3509554959,CA 3509554960,3509555199,US -3509555200,3509556735,CA +3509555200,3509555455,CA +3509555456,3509555711,US +3509555712,3509556735,CA 3509556736,3509557759,US 3509557760,3509558015,CA 3509558016,3509559039,US @@ -87573,11 +92028,9 @@ 3509567232,3509569023,CA 3509569024,3509569535,US 3509569536,3509569791,CA -3509569792,3509570815,US -3509570816,3509571583,CA -3509571584,3509571839,US -3509571840,3509572095,CA -3509572096,3509572351,US +3509569792,3509571071,US +3509571072,3509571327,CA +3509571328,3509572351,US 3509572352,3509573375,CA 3509573376,3509573439,US 3509573440,3509573455,CA @@ -87903,7 +92356,9 @@ 3514592256,3514593279,SV 3514593280,3514596863,US 3514596864,3514597375,SV -3514597376,3514732071,US +3514597376,3514724635,US +3514724636,3514724636,UA +3514724637,3514732071,US 3514732072,3514732075,UA 3514732076,3514826751,US 3514826752,3514843135,CA @@ -87927,7 +92382,9 @@ 3515301888,3515318271,CA 3515318272,3515358975,US 3515358976,3515359231,MX -3515359232,3515596799,US +3515359232,3515450623,US +3515450624,3515450879,CA +3515450880,3515596799,US 3515596800,3515613183,CA 3515613184,3515711487,US 3515711488,3515731967,CA @@ -87958,7 +92415,9 @@ 3516530688,3516643083,US 3516643084,3516643087,PR 3516643088,3516899839,US -3516899840,3516900095,NG +3516899840,3516900031,NG +3516900032,3516900063,US +3516900064,3516900095,NG 3516900096,3516900351,US 3516900352,3516900607,NG 3516900608,3516900863,US @@ -87983,13 +92442,17 @@ 3517120512,3517173759,US 3517173760,3517174783,IN 3517174784,3517233151,US -3517233152,3517235199,GU +3517233152,3517234687,GU +3517234688,3517234943,US +3517234944,3517235199,GU 3517235200,3517382655,US 3517382656,3517383167,CA 3517383168,3517383423,US 3517383424,3517384703,CA -3517384704,3517385215,US -3517385216,3517385727,CA +3517384704,3517385407,US +3517385408,3517385439,CA +3517385440,3517385471,US +3517385472,3517385727,CA 3517385728,3517385983,US 3517385984,3517387263,CA 3517387264,3517387519,US @@ -88027,14 +92490,14 @@ 3517399040,3517399807,US 3517399808,3517399871,CA 3517399872,3517400063,US -3517400064,3517400575,CA -3517400576,3517401855,US +3517400064,3517400319,CA +3517400320,3517401855,US 3517401856,3517402367,CA 3517402368,3517402623,US 3517402624,3517402879,CA 3517402880,3517403647,US -3517403648,3517404159,CA -3517404160,3517404415,US +3517403648,3517403903,CA +3517403904,3517404415,US 3517404416,3517404927,CA 3517404928,3517405183,US 3517405184,3517405439,CA @@ -88058,10 +92521,10 @@ 3517413120,3517414399,CA 3517414400,3517414911,US 3517414912,3517415423,CA -3517415424,3517416191,US -3517416192,3517416447,CA -3517416448,3517416703,US -3517416704,3517417471,CA +3517415424,3517416919,US +3517416920,3517416927,CA +3517416928,3517416959,US +3517416960,3517417471,CA 3517417472,3517418495,US 3517418496,3517419007,CA 3517419008,3517419519,US @@ -88111,7 +92574,9 @@ 3517438464,3517438943,US 3517438944,3517439231,CA 3517439232,3517439743,US -3517439744,3517442047,CA +3517439744,3517441279,CA +3517441280,3517441535,US +3517441536,3517442047,CA 3517442048,3517442175,US 3517442176,3517442207,CA 3517442208,3517442559,US @@ -88152,7 +92617,9 @@ 3517602560,3517602687,SE 3517602688,3517602815,US 3517602816,3517603071,SE -3517603072,3517603583,US +3517603072,3517603231,US +3517603232,3517603327,SE +3517603328,3517603583,US 3517603584,3517603647,SE 3517603648,3517603711,US 3517603712,3517604095,SE @@ -88168,9 +92635,13 @@ 3517608192,3517608447,US 3517608448,3517608703,GB 3517608704,3517609727,US -3517609728,3517610495,SE +3517609728,3517609743,SE +3517609744,3517609751,US +3517609752,3517610495,SE 3517610496,3517611263,IE -3517611264,3517612031,SE +3517611264,3517611311,SE +3517611312,3517611343,US +3517611344,3517612031,SE 3517612032,3517644799,US 3517644800,3517710335,CA 3517710336,3517718527,US @@ -88216,7 +92687,9 @@ 3519351424,3519351455,GB 3519351456,3519351551,US 3519351552,3519351807,GB -3519351808,3519381503,US +3519351808,3519354909,US +3519354910,3519354910,BR +3519354911,3519381503,US 3519381504,3519397887,CA 3519397888,3519467519,US 3519469568,3519475711,US @@ -88246,7 +92719,9 @@ 3519877888,3519878143,CA 3519878144,3519878271,US 3519878272,3519878303,CA -3519878304,3519879727,US +3519878304,3519878911,US +3519878912,3519879167,CA +3519879168,3519879727,US 3519879728,3519879735,CA 3519879736,3519879935,US 3519879936,3519880447,CA @@ -88255,7 +92730,9 @@ 3519882496,3519882751,US 3519882752,3519884031,CA 3519884032,3519884287,US -3519884288,3519901695,CA +3519884288,3519898367,CA +3519898368,3519898623,US +3519898624,3519901695,CA 3519901696,3519930367,US 3519934464,3519938559,CA 3519938560,3520020479,US @@ -88318,8 +92795,8 @@ 3521965056,3521966079,DE 3521966080,3522101247,US 3522101248,3522109439,CA -3522109440,3522118399,US -3522118400,3522118655,GB +3522109440,3522118143,US +3522118144,3522118655,GB 3522118656,3522118911,US 3522118912,3522119679,GB 3522119680,3522119935,US @@ -88336,9 +92813,13 @@ 3522123520,3522123775,GB 3522123776,3522125055,US 3522125056,3522125311,GB -3522125312,3522132395,US +3522125312,3522131858,US +3522131859,3522131859,DE +3522131860,3522132395,US 3522132396,3522132396,BR -3522132397,3522174975,US +3522132397,3522133663,US +3522133664,3522133695,DE +3522133696,3522174975,US 3522174976,3522179071,BM 3522179072,3522195455,US 3522195456,3522199551,CA @@ -88389,12 +92870,25 @@ 3523557376,3523559423,CN 3523559424,3523575807,PH 3523575808,3523583999,CN -3523584000,3523601663,HK +3523584000,3523596359,HK +3523596360,3523596375,PK +3523596376,3523596783,HK +3523596784,3523596791,PK +3523596792,3523596927,HK +3523596928,3523597055,PK +3523597056,3523597063,HK +3523597064,3523597103,PK +3523597104,3523597119,HK +3523597120,3523597127,PK +3523597128,3523597567,HK +3523597568,3523597823,PK +3523597824,3523601663,HK 3523601664,3523601919,SA 3523601920,3523674111,HK 3523674112,3523682303,FJ 3523682304,3523686399,NZ -3523686400,3523690495,AU +3523686400,3523688447,AU +3523688704,3523690495,AU 3523690496,3523698687,IN 3523698688,3523700735,JP 3523700736,3523701759,HK @@ -88426,7 +92920,9 @@ 3524722688,3524730879,SG 3524730880,3524739071,CN 3524739072,3524743167,ID -3524743168,3524745727,MP +3524743168,3524745215,MP +3524745216,3524745471,GU +3524745472,3524745727,MP 3524745728,3524745983,GU 3524745984,3524747263,MP 3524747264,3524755455,PH @@ -88448,8 +92944,8 @@ 3526651136,3526651391,KP 3526651392,3526754303,CN 3526754304,3526845183,NZ -3526845184,3526845439,AU -3526845440,3526885375,NZ +3526845184,3526845311,AU +3526845312,3526885375,NZ 3526885376,3526893567,PK 3526893568,3526897663,NZ 3526897664,3526901759,HK @@ -88499,10 +92995,10 @@ 3529089024,3529097215,KR 3529097216,3529113599,JP 3529113600,3531603967,KR -3531603968,3533765631,JP -3533765632,3533765887,CN -3533765888,3534749695,JP -3534749696,3534757887,HK +3531603968,3534749695,JP +3534749696,3534756351,HK +3534756352,3534756383,CN +3534756384,3534757887,HK 3534757888,3534758143,AU 3534758144,3534758147,JP 3534758148,3534758911,AU @@ -88532,7 +93028,11 @@ 3535831040,3535863807,TW 3535863808,3535880191,SG 3535880192,3535896575,JP -3535896576,3535929343,AU +3535896576,3535905791,AU +3535905792,3535906047,US +3535906048,3535909887,AU +3535909888,3535910143,US +3535910144,3535929343,AU 3535929344,3535994879,JP 3535994880,3536060415,MY 3536060416,3536322559,JP @@ -88623,9 +93123,7 @@ 3557072896,3557081087,DE 3557081088,3557089279,NL 3557089280,3557105663,DE -3557105664,3557111807,BG -3557111808,3557112831,GB -3557112832,3557113855,BG +3557105664,3557113855,BG 3557113856,3557130239,RU 3557130240,3557138431,BG 3557138432,3557146623,RU @@ -88639,8 +93137,8 @@ 3557253120,3557261311,RU 3557261312,3557277695,DE 3557277696,3557283839,NL -3557283840,3557284863,PL -3557284864,3557285887,NL +3557283840,3557285119,PL +3557285120,3557285887,NL 3557285888,3557294079,RU 3557294080,3557302271,DE 3557302272,3557310463,UA @@ -88730,8 +93228,12 @@ 3557916672,3557920055,NO 3557920056,3557920056,DK 3557920057,3557924863,NO -3557924864,3557925887,AX -3557925888,3557929983,FI +3557924864,3557926143,AX +3557926144,3557926399,FI +3557926400,3557926655,AX +3557926656,3557929471,FI +3557929472,3557929727,AX +3557929728,3557929983,FI 3557929984,3557933055,AX 3557933056,3557941247,IT 3557941248,3557957631,DE @@ -88759,9 +93261,7 @@ 3558146048,3558154239,RU 3558154240,3558157391,GB 3558157392,3558157407,AF -3558157408,3558161663,GB -3558161664,3558161919,TD -3558161920,3558162431,GB +3558157408,3558162431,GB 3558162432,3558170623,DE 3558170624,3558178815,GB 3558178816,3558187007,BG @@ -88773,9 +93273,11 @@ 3558203392,3558211583,ES 3558211584,3558219775,GB 3558219776,3558227967,ES -3558227968,3558232063,RU -3558232064,3558234111,ES -3558234112,3558234623,RU +3558227968,3558228479,RU +3558228480,3558228735,FR +3558228736,3558232063,RU +3558232064,3558232575,LB +3558232576,3558234623,RU 3558234624,3558234879,UA 3558234880,3558235647,RU 3558235648,3558235903,LB @@ -88803,9 +93305,7 @@ 3558293504,3558301695,RU 3558301696,3558318079,DE 3558318080,3558334463,FR -3558334464,3558339959,CH -3558339960,3558339967,DE -3558339968,3558342655,CH +3558334464,3558342655,CH 3558342656,3558350847,IT 3558350848,3558359039,RU 3558359040,3558367231,GB @@ -88850,11 +93350,9 @@ 3558719488,3558735871,IL 3558735872,3558741503,GB 3558741504,3558742015,GG -3558742016,3558742527,GB -3558742528,3558742783,GG -3558742784,3558743039,GB -3558743040,3558743295,GG -3558743296,3558743551,GB +3558742016,3558742271,GB +3558742272,3558742527,GG +3558742528,3558743551,GB 3558743552,3558743807,GG 3558743808,3558744063,GB 3558744064,3558752255,LB @@ -88897,16 +93395,22 @@ 3559055360,3559063551,AM 3559063552,3559079935,CH 3559079936,3559088127,JO -3559088128,3559090239,GB +3559088128,3559089527,GB +3559089528,3559089535,BE +3559089536,3559089935,GB +3559089936,3559089951,BE +3559089952,3559090239,GB 3559090240,3559090303,BE 3559090304,3559093311,GB 3559093312,3559093319,BE 3559093320,3559093503,GB 3559093504,3559093759,BE -3559093760,3559095455,GB +3559093760,3559094303,GB +3559094304,3559094319,BE +3559094320,3559095455,GB 3559095456,3559095456,BE 3559095457,3559096063,GB -3559096064,3559096319,BE +3559096064,3559096319,NL 3559096320,3559104511,RO 3559104512,3559112703,RU 3559112704,3559120895,IT @@ -88930,13 +93434,15 @@ 3559276544,3559284735,GB 3559284736,3559292927,RU 3559292928,3559301119,JO -3559301120,3559305215,GB -3559305216,3559305471,US -3559305472,3559309311,GB +3559301120,3559306576,GB +3559306577,3559306577,AT +3559306578,3559309311,GB 3559309312,3559317503,PL 3559317504,3559325695,FI 3559325696,3559333887,IT -3559333888,3559342079,SE +3559333888,3559336447,SE +3559336448,3559336703,US +3559336704,3559342079,SE 3559342080,3559350271,BG 3559350272,3559358463,BA 3559358464,3559366655,FR @@ -89004,9 +93510,11 @@ 3559890944,3559899135,CH 3559899136,3559899647,UA 3559899648,3559899967,EE -3559899968,3559900223,UA -3559900224,3559900287,EE -3559900288,3559902719,UA +3559899968,3559900031,UA +3559900032,3559900095,EE +3559900096,3559900223,UA +3559900224,3559900351,EE +3559900352,3559902719,UA 3559902720,3559902975,EE 3559902976,3559903231,UA 3559903232,3559907327,EE @@ -89022,9 +93530,11 @@ 3559989248,3559997439,PL 3559997440,3560005631,KE 3560005632,3560013823,RU -3560013824,3560022527,GB -3560022528,3560022783,ES -3560022784,3560023631,GB +3560013824,3560015871,GB +3560015872,3560016127,ES +3560016128,3560022751,GB +3560022752,3560022767,ES +3560022768,3560023631,GB 3560023632,3560023639,ES 3560023640,3560023791,GB 3560023792,3560023799,ES @@ -89063,9 +93573,9 @@ 3560316928,3560325119,NL 3560325120,3560333311,DK 3560333312,3560341503,RO -3560341504,3560346623,GB -3560346624,3560347647,US -3560347648,3560357887,GB +3560341504,3560345855,GB +3560345856,3560348670,US +3560348671,3560357887,GB 3560357888,3560366079,GR 3560366080,3560374271,CH 3560374272,3560382463,ES @@ -89108,9 +93618,7 @@ 3560669184,3560685567,CH 3560685568,3560693759,ES 3560693760,3560701951,PL -3560705536,3560705791,DE 3560707584,3560707839,DE -3560708096,3560708351,DE 3560709632,3560709887,DE 3560710144,3560718335,CH 3560718336,3560726527,GM @@ -89251,9 +93759,7 @@ 3561242624,3561259007,DE 3561259008,3561267199,IL 3561267200,3561275391,UA -3561275392,3561288831,BE -3561288832,3561288959,FR -3561288960,3561291775,BE +3561275392,3561291775,BE 3561291776,3561299967,RS 3561299968,3561308159,GB 3561308160,3561316351,PL @@ -89277,7 +93783,9 @@ 3561472000,3561480191,DE 3561480192,3561488383,GB 3561488384,3561496575,OM -3561496576,3561502719,GB +3561496576,3561496831,GB +3561496832,3561497087,NL +3561497088,3561502719,GB 3561502720,3561503743,NL 3561503744,3561504767,GB 3561504768,3561512959,DE @@ -89296,10 +93804,12 @@ 3561604352,3561604607,FR 3561604608,3561607391,GB 3561607392,3561607423,FR -3561607424,3561609215,GB -3561609216,3561609471,FR -3561609472,3561616639,GB -3561616640,3561616895,FR +3561607424,3561607935,GB +3561607936,3561608191,FR +3561608192,3561609215,GB +3561609216,3561609727,FR +3561609728,3561616383,GB +3561616384,3561616895,FR 3561616896,3561618943,GB 3561618944,3561619455,ES 3561619456,3561641450,GB @@ -89320,11 +93830,7 @@ 3561775104,3561783295,IL 3561783296,3561799679,RU 3561799680,3561807871,DE -3561807872,3561808895,BE -3561808896,3561809151,LU -3561809152,3561814271,BE -3561814272,3561814527,LU -3561814528,3561815039,BE +3561807872,3561815039,BE 3561815040,3561815295,LU 3561815296,3561816063,BE 3561816064,3561824255,VA @@ -89496,7 +94002,9 @@ 3563011072,3563012095,DE 3563012096,3563020287,FR 3563020288,3563028479,DE -3563028480,3563036671,IR +3563028480,3563033599,IR +3563033600,3563034623,DE +3563034624,3563036671,IR 3563036672,3563044863,BG 3563044864,3563053055,ES 3563053056,3563061247,GB @@ -89524,9 +94032,7 @@ 3563225088,3563233279,LB 3563233280,3563241471,BY 3563241472,3563257855,TR -3563257856,3563268351,FR -3563268352,3563268607,BE -3563268608,3563290623,FR +3563257856,3563290623,FR 3563290624,3563315199,DE 3563315200,3563323391,DK 3563323648,3563329791,GB @@ -89595,9 +94101,7 @@ 3563855872,3563864063,AT 3563864064,3563872255,GB 3563872256,3563880447,RU -3563880448,3563884651,CY -3563884652,3563884652,TR -3563884653,3563888639,CY +3563880448,3563888639,TR 3563888640,3563896831,DE 3563896832,3563913215,HU 3563913216,3563921407,RU @@ -89736,7 +94240,9 @@ 3564883200,3564883455,NL 3564883456,3564886719,GB 3564886720,3564886751,NL -3564886752,3564889633,GB +3564886752,3564888479,GB +3564888480,3564888495,NL +3564888496,3564889633,GB 3564889634,3564889634,NL 3564889635,3564892735,GB 3564892736,3564892751,NL @@ -89745,9 +94251,7 @@ 3564895744,3564896255,GB 3564896256,3564904447,RU 3564904448,3564912639,DE -3564912640,3564915711,NL -3564915712,3564915967,BG -3564915968,3564920831,NL +3564912640,3564920831,NL 3564920832,3564922111,DE 3564922112,3564929023,US 3564929024,3564937215,AT @@ -89768,15 +94272,9 @@ 3565002752,3565027327,NO 3565027328,3565035519,PL 3565035520,3565036287,IE -3565036288,3565037055,GB -3565037056,3565037311,IE -3565037312,3565038079,GB -3565038080,3565038335,IE -3565038336,3565038879,GB +3565036288,3565038879,GB 3565038880,3565038895,IE -3565038896,3565039103,GB -3565039104,3565039359,IE -3565039360,3565039615,GB +3565038896,3565039615,GB 3565039616,3565041663,IE 3565041664,3565043711,GB 3565043712,3565051903,AT @@ -89874,11 +94372,7 @@ 3565767272,3565767287,GB 3565767296,3565767351,GB 3565767360,3565767399,GB -3565767408,3565767439,GB -3565767456,3565767487,GB -3565767504,3565767599,GB -3565767616,3565767631,GB -3565767680,3565767999,GB +3565767408,3565767999,GB 3565768208,3565768223,GB 3565768240,3565768247,GB 3565768448,3565768575,GB @@ -89963,7 +94457,6 @@ 3567152256,3567152383,GB 3567152400,3567152407,GB 3567152640,3567152647,GB -3567152664,3567152671,GB 3567152744,3567152751,GB 3567152832,3567152863,GB 3567152960,3567152991,GB @@ -89994,9 +94487,7 @@ 3567389696,3567390975,DE 3567390976,3567391231,GB 3567391232,3567391487,DE -3567391488,3567394815,GB -3567394816,3567395071,FR -3567395072,3567399167,GB +3567391488,3567399167,GB 3567399168,3567399423,DE 3567399424,3567399935,GB 3567399936,3567401471,DE @@ -90008,13 +94499,17 @@ 3567453696,3567453951,ES 3567453952,3567456407,GB 3567456408,3567456415,ES -3567456416,3567458305,GB +3567456416,3567456511,GB +3567456512,3567456767,ES +3567456768,3567458305,GB 3567458306,3567458306,ES 3567458307,3567459935,GB 3567459936,3567459943,ES 3567459944,3567465983,GB 3567465984,3567466239,ES -3567466240,3567495679,GB +3567466240,3567490559,GB +3567490560,3567490815,ES +3567490816,3567495679,GB 3567495680,3567495935,ES 3567495936,3567499007,GB 3567499008,3567499135,ES @@ -90084,9 +94579,7 @@ 3568476160,3568484351,DK 3568484352,3568492543,NL 3568492544,3568500735,RS -3568500736,3568520137,IL -3568520138,3568520138,SY -3568520139,3568566271,IL +3568500736,3568566271,IL 3568566272,3568599039,FR 3568599040,3568631807,PL 3568631808,3568697343,SE @@ -90144,8 +94637,8 @@ 3570663424,3570728959,GB 3570728960,3570729983,FI 3570729984,3570731007,SE -3570731008,3570794495,FI -3570794496,3570860031,SE +3570731008,3570794751,FI +3570794752,3570860031,SE 3570860032,3570892799,CH 3570892800,3570925567,SA 3570925568,3570991103,IT @@ -90170,7 +94663,11 @@ 3571580928,3571646463,FI 3571646464,3571655560,DE 3571655561,3571655561,RO -3571655562,3571711999,DE +3571655562,3571688383,DE +3571688384,3571689215,ES +3571689216,3571699711,DE +3571699712,3571700735,GB +3571700736,3571711999,DE 3571712000,3571843071,GB 3571843072,3571974143,ES 3571974144,3571978239,RU @@ -90245,7 +94742,9 @@ 3574136832,3574169599,DE 3574169600,3574174839,GB 3574174840,3574174847,ES -3574174848,3574187007,GB +3574174848,3574186799,GB +3574186800,3574186815,ES +3574186816,3574187007,GB 3574187008,3574188031,ES 3574188032,3574190591,GB 3574190592,3574190847,ES @@ -90265,22 +94764,19 @@ 3574464512,3574530047,TR 3574530048,3574594559,SE 3574594560,3574595583,GB -3574595584,3574595839,GF -3574595840,3574597887,FR -3574597888,3574598143,GP -3574598144,3574598399,MQ -3574598400,3574599423,FR +3574595584,3574596607,FR +3574596608,3574596863,MF +3574596864,3574597119,MQ +3574597120,3574597631,FR +3574597632,3574597887,GP +3574597888,3574598911,FR +3574598912,3574599167,MQ +3574599168,3574599423,FR 3574599424,3574599679,MQ 3574599680,3574599935,GP -3574599936,3574600191,FR -3574600192,3574600447,MQ -3574600448,3574601215,FR +3574599936,3574601215,FR 3574601216,3574601471,GP -3574601472,3574602239,FR -3574602240,3574602495,GF -3574602496,3574602751,FR -3574602752,3574603007,RE -3574603008,3574603775,FR +3574601472,3574603775,FR 3574603776,3574611967,BG 3574611968,3574628351,HU 3574628352,3574661119,GR @@ -90290,7 +94786,9 @@ 3574792192,3574824959,CZ 3574824960,3574830079,GB 3574830080,3574831103,NL -3574831104,3574857727,GB +3574831104,3574842367,GB +3574842368,3574842623,NL +3574842624,3574857727,GB 3574857728,3574923263,DE 3574923264,3574939647,RU 3574939648,3574941375,SE @@ -90319,11 +94817,7 @@ 3575590912,3575640063,BE 3575640064,3575644159,TR 3575644160,3575709695,DK -3575709696,3575715839,AT -3575715840,3575716351,SK -3575716352,3575739391,AT -3575739392,3575739647,FR -3575739648,3575742463,AT +3575709696,3575742463,AT 3575742464,3575775231,RU 3575775232,3575824383,NL 3575824384,3575832575,KW @@ -90451,7 +94945,7 @@ 3576084704,3576084735,GB 3576084864,3576084927,GB 3576085184,3576085215,GB -3576085696,3576085711,GB +3576085504,3576085759,GB 3576086016,3576086143,GB 3576086368,3576086399,GB 3576086496,3576086527,GB @@ -90478,9 +94972,9 @@ 3576093184,3576093247,GB 3576095232,3576096767,GB 3576099072,3576100863,GB -3576101376,3576111359,GB -3576111360,3576111615,FR -3576111616,3576135679,GB +3576101376,3576134653,GB +3576134654,3576134654,CH +3576134655,3576135679,GB 3576135680,3576168447,DE 3576168448,3576233983,GB 3576233984,3576236543,FR @@ -90488,11 +94982,7 @@ 3576241992,3576241999,FR 3576242000,3576242383,GB 3576242384,3576242391,FR -3576242392,3576245247,GB -3576245248,3576245503,FR -3576245504,3576251135,GB -3576251136,3576251391,FR -3576251392,3576251711,GB +3576242392,3576251711,GB 3576251712,3576251775,FR 3576251776,3576252415,GB 3576252416,3576252671,FR @@ -90504,14 +94994,14 @@ 3576254696,3576254703,FR 3576254704,3576254775,GB 3576254776,3576254783,FR -3576254784,3576260607,GB +3576254784,3576258047,GB +3576258048,3576258303,FR +3576258304,3576260607,GB 3576260608,3576260623,FR 3576260624,3576260863,GB -3576260864,3576261119,FR -3576261120,3576263447,GB -3576263448,3576263455,FR -3576263456,3576263679,GB -3576263680,3576263935,FR +3576260864,3576260871,FR +3576260872,3576263919,GB +3576263920,3576263935,FR 3576263936,3576264255,GB 3576264256,3576264263,FR 3576264264,3576264351,GB @@ -90520,15 +95010,15 @@ 3576264376,3576264383,FR 3576264384,3576264679,GB 3576264680,3576264687,FR -3576264688,3576264959,GB -3576264960,3576265215,FR -3576265216,3576266751,GB +3576264688,3576266751,GB 3576266752,3576299519,FR 3576299520,3576365055,AE 3576365056,3576430591,TR 3576430592,3576496127,FR 3576496128,3576561663,IT -3576561664,3576627199,NL +3576561664,3576622100,NL +3576622101,3576622101,GB +3576622102,3576627199,NL 3576627200,3576692735,AT 3576692736,3576758271,GB 3576758272,3576823807,BE @@ -90538,22 +95028,28 @@ 3576987648,3577020415,GB 3577020416,3577085951,NL 3577085952,3577151487,DE -3577151488,3577152767,RE -3577152768,3577154047,FR -3577154048,3577155583,RE -3577155584,3577155839,FR -3577155840,3577156351,RE -3577156352,3577157631,FR -3577157632,3577158399,RE -3577158400,3577158911,FR -3577158912,3577159167,RE -3577159168,3577159679,FR -3577159680,3577159935,RE -3577159936,3577160959,FR -3577160960,3577161023,YT -3577161024,3577161087,FR -3577161088,3577161215,YT -3577161216,3577165567,FR +3577151488,3577151999,RE +3577152000,3577152255,FR +3577152256,3577152511,RE +3577152512,3577153023,FR +3577153024,3577153279,RE +3577153280,3577153791,FR +3577153792,3577154303,RE +3577154304,3577154815,FR +3577154816,3577155327,RE +3577155328,3577155839,FR +3577155840,3577156095,RE +3577156096,3577156607,FR +3577156608,3577156863,RE +3577156864,3577157375,FR +3577157376,3577157887,RE +3577157888,3577158655,FR +3577158656,3577159167,RE +3577159168,3577160959,FR +3577160960,3577161215,YT +3577161216,3577163775,FR +3577163776,3577164031,RE +3577164032,3577165567,FR 3577165568,3577166079,RE 3577166080,3577166591,FR 3577166592,3577167103,RE @@ -90568,14 +95064,13 @@ 3577544704,3577545983,DE 3577545984,3577546111,SE 3577546112,3577610239,DE -3577625600,3577625855,GB -3577626112,3577626367,GB +3577626176,3577626239,GB 3577628672,3577629695,CH 3577635840,3577636863,DE 3577636864,3577637887,GB 3577641200,3577641215,FR +3577641472,3577641983,FR 3577650048,3577650063,NL -3577653248,3577655295,IT 3577663488,3577664511,SE 3577669632,3577670655,BE 3577675776,3577741311,PT @@ -90611,7 +95106,9 @@ 3579197312,3579197439,US 3579197440,3579248639,GB 3579248640,3579346943,RU -3579346944,3579445247,SE +3579346944,3579362055,SE +3579362056,3579362063,NO +3579362064,3579445247,SE 3579445248,3579478015,AT 3579478016,3579527167,FR 3579527168,3579543551,BA @@ -90646,8 +95143,7 @@ 3580199936,3580200447,EE 3580200448,3580201983,SE 3580201984,3580203007,LT -3580203008,3580203519,SE -3580203520,3580204543,RU +3580203008,3580204543,SE 3580204544,3580205055,NL 3580205056,3580206079,SE 3580206080,3580207103,HR @@ -90683,7 +95179,7 @@ 3580268544,3580272639,LV 3580272640,3580276735,SE 3580276736,3580280831,NL -3580280832,3580329983,RU +3580280832,3580329983,SE 3580329984,3580338175,NL 3580338176,3580338687,SE 3580338688,3580339199,HR @@ -90706,7 +95202,9 @@ 3580643328,3580645375,UA 3580645376,3580647423,PL 3580647424,3580647935,GB -3580647936,3580649471,DE +3580647936,3580648703,DE +3580648704,3580648959,GB +3580648960,3580649471,DE 3580649472,3580651519,SE 3580651520,3580653567,NL 3580653568,3580655615,PL @@ -90747,21 +95245,7 @@ 3581239296,3581241343,NL 3581242624,3581245439,FR 3581255680,3581258751,FR -3581280256,3581365247,BE -3581365248,3581365503,NL -3581365504,3581365759,BE -3581365760,3581366015,NL -3581366016,3581366783,BE -3581366784,3581367039,NL -3581367040,3581367295,BE -3581367296,3581367807,NL -3581367808,3581368063,BE -3581368064,3581368319,NL -3581368320,3581371391,BE -3581371392,3581371647,NL -3581371648,3581371903,BE -3581371904,3581372159,NL -3581372160,3581411327,BE +3581280256,3581411327,BE 3581411328,3581673471,GB 3581673472,3581935615,NL 3581935616,3581943807,RU @@ -90834,9 +95318,7 @@ 3582313872,3582320639,JE 3582320640,3582328831,CH 3582328832,3582337023,HU -3582337024,3582343167,ES -3582343168,3582343423,PT -3582343424,3582345215,ES +3582337024,3582345215,PT 3582345216,3582353407,IT 3582353408,3582361599,SE 3582361600,3582377983,PL @@ -90856,7 +95338,7 @@ 3582509056,3582517247,SA 3582517248,3582525439,PL 3582525440,3582533631,IM -3582533632,3582541823,BG +3582533632,3582541823,IT 3582541824,3582550015,US 3582550016,3582558207,RS 3582558208,3582570911,MC @@ -90903,7 +95385,8 @@ 3582885888,3582894079,TR 3582894080,3582902271,CH 3582902272,3582910463,RU -3582910464,3582917631,SI +3582910464,3582916607,SI +3582916608,3582917631,ZA 3582917632,3582918655,LU 3582918656,3582926847,GB 3582926848,3582935039,ES @@ -90939,7 +95422,9 @@ 3583157760,3583160319,GB 3583160320,3583161343,DE 3583161344,3583162623,GB -3583162624,3583162879,ZA +3583162624,3583162751,ZA +3583162752,3583162815,GB +3583162816,3583162879,ZA 3583162880,3583164415,GB 3583164416,3583172607,PT 3583172608,3583188991,DE @@ -90975,7 +95460,11 @@ 3583418368,3583426559,TN 3583426560,3583434751,CI 3583434752,3583442943,AT -3583442944,3583451135,UA +3583442944,3583445247,RU +3583445248,3583445503,UA +3583445504,3583446783,RU +3583446784,3583447039,UA +3583447040,3583451135,RU 3583451136,3583459327,IL 3583459328,3583467111,CZ 3583467112,3583467119,PL @@ -91006,7 +95495,9 @@ 3583696896,3583705087,NL 3583705088,3583713279,UA 3583713280,3583721471,CZ -3583721472,3583729663,DE +3583721472,3583727871,DE +3583727872,3583728127,GB +3583728128,3583729663,DE 3583729664,3583737855,TR 3583742976,3583743487,PL 3583743488,3583743743,GB @@ -91115,12 +95606,17 @@ 3584509232,3584509239,AW 3584509240,3584509695,GB 3584509696,3584509951,JE -3584509952,3584516095,GB +3584509952,3584513535,GB +3584513536,3584513791,JE +3584513792,3584516095,GB 3584516096,3584524287,NO 3584524288,3584532479,IS 3584532480,3584540671,DE 3584540672,3584548863,RU -3584548864,3584557055,ES +3584548864,3584549887,ES +3584549888,3584550911,FR +3584550912,3584552959,IT +3584552960,3584557055,FR 3584557056,3584565247,EE 3584565248,3584573439,RU 3584573440,3584589823,DE @@ -91259,7 +95755,9 @@ 3585646592,3585654783,SA 3585654784,3585662975,NO 3585662976,3585671167,BY -3585671168,3585679359,SE +3585671168,3585672191,SE +3585672192,3585672447,DK +3585672448,3585679359,SE 3585679360,3585687551,FI 3585687552,3585695743,DE 3585695744,3585702527,GB @@ -91289,9 +95787,8 @@ 3585861632,3585863679,EE 3585863680,3585865471,NL 3585865472,3585865727,LB -3585865728,3585866495,EE -3585866496,3585866751,RU -3585866752,3585867775,EE +3585865728,3585865983,UA +3585865984,3585867775,EE 3585867776,3585875967,NO 3585875968,3585884159,CH 3585884160,3585892351,IQ @@ -91299,22 +95796,7 @@ 3585900544,3585906687,NO 3585906688,3585907711,CZ 3585907712,3585908735,NO -3585908736,3585908991,FR -3585908992,3585909247,GF -3585909248,3585909503,FR -3585909504,3585909759,GF -3585909760,3585910271,FR -3585910272,3585910527,GP -3585910528,3585912831,FR -3585912832,3585913087,GP -3585913088,3585913855,FR -3585913856,3585914623,GP -3585914624,3585914879,GF -3585914880,3585915391,FR -3585915392,3585915647,GP -3585915648,3585915903,FR -3585915904,3585916159,GP -3585916160,3585916671,FR +3585908736,3585916671,GP 3585916672,3585916927,MQ 3585916928,3585925119,IT 3585925120,3585933311,CH @@ -91323,7 +95805,9 @@ 3585949696,3585957887,KW 3585957888,3585966079,SE 3585966080,3585974271,CH -3585974272,3585982463,BE +3585974272,3585976831,BE +3585976832,3585977087,GB +3585977088,3585982463,BE 3585982464,3585998847,RU 3585998848,3586007039,ES 3586007040,3586015231,LT @@ -91343,7 +95827,9 @@ 3586162688,3586179071,FI 3586179072,3586195455,ES 3586195456,3586203647,RU -3586203648,3586205695,KE +3586203648,3586204415,KE +3586204416,3586204671,ZM +3586204672,3586205695,KE 3586205696,3586207743,BW 3586207744,3586208767,ZA 3586208768,3586211071,KE @@ -91450,9 +95936,7 @@ 3587129344,3587145727,NL 3587145728,3587162111,CY 3587162112,3587178495,IR -3587178496,3587182591,AT -3587182592,3587182847,HU -3587182848,3587186687,AT +3587178496,3587186687,AT 3587186688,3587186943,DE 3587186944,3587187199,GB 3587187200,3587187455,DE @@ -91469,9 +95953,7 @@ 3587231232,3587231263,NL 3587231264,3587233087,GB 3587233088,3587233095,NL -3587233096,3587233279,GB -3587233280,3587233535,NL -3587233536,3587234191,GB +3587233096,3587234191,GB 3587234192,3587234207,NL 3587234208,3587237631,GB 3587237632,3587237887,NL @@ -91532,9 +96014,7 @@ 3587620864,3587637247,SE 3587637248,3587646975,FR 3587646976,3587647231,MC -3587647232,3587647743,FR -3587647744,3587647999,GB -3587648000,3587653631,FR +3587647232,3587653631,FR 3587653632,3587670015,SK 3587670016,3587702783,IT 3587702784,3587710975,DE @@ -91573,8 +96053,7 @@ 3588153344,3588161535,RU 3588161536,3588173311,FR 3588173312,3588173567,RE -3588173568,3588173823,YT -3588173824,3588227071,FR +3588173568,3588227071,FR 3588227072,3588292607,BE 3588292608,3588308991,AT 3588308992,3588325375,NO @@ -91656,9 +96135,7 @@ 3589242880,3589259263,NL 3589259264,3589275647,DE 3589275648,3589292031,RS -3589292032,3589305343,AT -3589305344,3589305599,DE -3589305600,3589308415,AT +3589292032,3589308415,AT 3589308416,3589324799,DE 3589324800,3589341183,BG 3589341184,3589373951,PL @@ -91670,9 +96147,7 @@ 3589431040,3589431295,ES 3589431296,3589432831,GB 3589432832,3589433087,CH -3589433088,3589433855,GB -3589433856,3589434111,IE -3589434112,3589435759,GB +3589433088,3589435759,GB 3589435760,3589435763,ES 3589435764,3589439487,GB 3589439488,3589455871,SE @@ -91685,15 +96160,18 @@ 3589545984,3589554175,DE 3589554176,3589570559,PS 3589570560,3589578751,GB -3589578752,3589579007,IN +3589578752,3589579007,NL 3589579008,3589580543,GB -3589580544,3589580799,NL -3589580800,3589582975,GB +3589580544,3589581055,NL +3589581056,3589582975,GB 3589582976,3589583103,NL 3589583104,3589583871,GB 3589583872,3589584127,NL 3589584128,3589586943,GB -3589586944,3589603327,RS +3589586944,3589587199,DE +3589587200,3589599231,RS +3589599232,3589601279,SE +3589601280,3589603327,RS 3589603328,3589668863,FR 3589668864,3589677055,RU 3589677056,3589685247,FR @@ -91705,13 +96183,13 @@ 3589742592,3589746175,NL 3589746176,3589746687,US 3589746688,3589767167,NL -3589767168,3589816319,RU +3589767168,3589810431,RU +3589810432,3589810687,PL +3589810688,3589816319,RU 3589825792,3589826047,DE 3589827712,3589827839,DE -3589828352,3589828607,FR 3589828736,3589828863,NL 3589829632,3589830143,GB -3589831680,3589831935,FR 3589832704,3589849087,TR 3589849088,3589865471,GB 3589865472,3589881855,GR @@ -91759,9 +96237,7 @@ 3590251648,3590251775,NL 3590251776,3590252543,FR 3590252544,3590253055,LB -3590253056,3590253311,FR -3590253312,3590253567,GB -3590253568,3590254847,FR +3590253056,3590254847,FR 3590254848,3590255103,GB 3590255104,3590255871,FR 3590255872,3590255935,US @@ -91775,7 +96251,9 @@ 3590258688,3590291455,IT 3590291456,3590299647,EG 3590299648,3590307839,FI -3590307840,3590312935,GB +3590307840,3590308951,GB +3590308952,3590308959,GH +3590308960,3590312935,GB 3590312936,3590312943,UG 3590312944,3590317951,GB 3590317952,3590318015,UA @@ -91821,7 +96299,9 @@ 3624298496,3624299519,PH 3624299520,3624300031,US 3624300032,3624300287,LY -3624300288,3624302847,US +3624300288,3624302335,US +3624302336,3624302591,CA +3624302592,3624302847,US 3624302848,3624303103,MY 3624303104,3624303871,US 3624303872,3624304127,CA @@ -91843,7 +96323,9 @@ 3624376336,3624376343,AU 3624376344,3624376351,US 3624376352,3624376359,PT -3624376360,3624377863,US +3624376360,3624376655,US +3624376656,3624376679,GB +3624376680,3624377863,US 3624377864,3624377871,GB 3624377872,3624377879,US 3624377880,3624377887,GB @@ -91852,11 +96334,9 @@ 3624377912,3624386559,US 3624386560,3624394751,CA 3624394752,3624402943,US -3624402944,3624407039,JP -3624407040,3624435711,US -3624435712,3624443391,CA -3624443392,3624443903,US -3624443904,3624452095,CA +3624402944,3624411135,JP +3624411136,3624435711,US +3624435712,3624452095,CA 3624452096,3624480767,US 3624480768,3624484863,CA 3624484864,3624534015,US @@ -91875,9 +96355,10 @@ 3624721920,3624730623,US 3624730624,3624796159,CA 3624796160,3624812543,US -3624813056,3624814079,US +3624813056,3624813823,US 3624814336,3624815103,US -3624815616,3624828927,US +3624815616,3624816383,US +3624816640,3624828927,US 3624828928,3624833023,CA 3624833024,3624845311,US 3624845312,3624849407,AU @@ -91964,7 +96445,9 @@ 3628161024,3628161279,CA 3628161280,3628179455,US 3628179456,3628187647,CA -3628187648,3628225779,US +3628187648,3628225387,US +3628225388,3628225395,GB +3628225396,3628225779,US 3628225780,3628225783,GB 3628225784,3628236799,US 3628236800,3628257279,CA @@ -92055,17 +96538,7 @@ 3629789952,3629790207,CA 3629790208,3629839103,US 3629839104,3629839359,CA -3629839360,3630039047,US -3630039048,3630039055,CA -3630039056,3630039079,US -3630039080,3630039087,CA -3630039088,3630039119,US -3630039120,3630039135,CA -3630039136,3630039159,US -3630039160,3630039167,CA -3630039168,3630039183,US -3630039184,3630039199,CA -3630039200,3630039295,US +3629839360,3630039295,US 3630039296,3630039551,CA 3630039552,3630040063,US 3630040064,3630040319,CA @@ -92105,9 +96578,7 @@ 3630058752,3630059007,CA 3630059008,3630059263,US 3630059264,3630059519,CA -3630059520,3630060799,US -3630060800,3630061055,CA -3630061056,3630061567,US +3630059520,3630061567,US 3630061568,3630062079,CA 3630062080,3630062335,US 3630062336,3630062591,CA @@ -92116,38 +96587,34 @@ 3630063872,3630063935,US 3630063936,3630063951,CA 3630063952,3630066431,US -3630066432,3630067967,CA -3630067968,3630068991,US +3630066432,3630067711,CA +3630067712,3630068991,US 3630068992,3630069247,CA 3630069248,3630069503,US 3630069504,3630069759,CA 3630069760,3630071295,US 3630071296,3630071551,CA 3630071552,3630072575,US -3630072576,3630074111,CA +3630072576,3630073599,CA +3630073600,3630073855,US +3630073856,3630074111,CA 3630074112,3630074879,US 3630074880,3630075135,CA -3630075136,3630075311,US -3630075312,3630075327,CA -3630075328,3630075391,US -3630075392,3630075647,CA -3630075648,3630076927,US -3630076928,3630077439,CA -3630077440,3630078463,US +3630075136,3630076927,US +3630076928,3630077183,CA +3630077184,3630078463,US 3630078464,3630078719,CA -3630078720,3630078975,US -3630078976,3630079039,CA -3630079040,3630079407,US -3630079408,3630079423,CA -3630079424,3630080575,US -3630080576,3630080639,CA -3630080640,3630081151,US -3630081152,3630081791,CA -3630081792,3630082047,US -3630082048,3630082559,CA +3630078720,3630081151,US +3630081152,3630081279,CA +3630081280,3630081535,US +3630081536,3630081791,CA +3630081792,3630082303,US +3630082304,3630082559,CA 3630082560,3630082815,US 3630082816,3630083071,CA -3630083072,3630084607,US +3630083072,3630083583,US +3630083584,3630083839,CA +3630083840,3630084607,US 3630084608,3630084863,CA 3630084864,3630085119,US 3630085120,3630085375,CA @@ -92196,33 +96663,29 @@ 3630151680,3630152191,CA 3630152192,3630152703,US 3630152704,3630153215,CA -3630153216,3630155775,US -3630155776,3630158079,CA -3630158080,3630158295,US -3630158296,3630158303,CA -3630158304,3630159103,US -3630159104,3630159359,CA -3630159360,3630159615,US +3630153216,3630156287,US +3630156288,3630156543,CA +3630156544,3630157311,US +3630157312,3630157567,CA +3630157568,3630158079,US +3630158080,3630158335,CA +3630158336,3630159615,US 3630159616,3630159871,CA 3630159872,3630160127,US 3630160128,3630160383,CA -3630160384,3630160639,US -3630160640,3630160895,CA -3630160896,3630161151,US -3630161152,3630161919,CA -3630161920,3630162431,US -3630162432,3630162943,CA -3630162944,3630163199,US +3630160384,3630161151,US +3630161152,3630161407,CA +3630161408,3630162431,US +3630162432,3630162687,CA +3630162688,3630163199,US 3630163200,3630163455,CA -3630163456,3630163967,US -3630163968,3630164735,CA -3630164736,3630164991,US -3630164992,3630166527,CA -3630166528,3630167007,US -3630167008,3630167023,CA -3630167024,3630168319,US -3630168320,3630169087,CA -3630169088,3630169855,US +3630163456,3630163711,US +3630163712,3630163967,CA +3630163968,3630164991,US +3630164992,3630165247,CA +3630165248,3630165503,US +3630165504,3630166015,CA +3630166016,3630169855,US 3630169856,3630170111,CA 3630170112,3630309375,US 3630309376,3630317567,CA @@ -92274,8 +96737,19 @@ 3631667200,3631667455,US 3631667456,3631668223,CA 3631668224,3631668479,US -3631668480,3631668991,CA -3631668992,3631822815,US +3631668480,3631668735,CA +3631668736,3631669807,US +3631669808,3631669823,EC +3631669824,3631670527,US +3631670528,3631670783,NG +3631670784,3631671039,EC +3631671040,3631671295,US +3631671296,3631671551,JM +3631671552,3631671807,PY +3631671808,3631672063,US +3631672064,3631672575,PY +3631672576,3631672831,NG +3631672832,3631822815,US 3631822816,3631822831,AU 3631822832,3631825647,US 3631825648,3631825663,NZ @@ -92291,7 +96765,9 @@ 3632197632,3632201727,CA 3632201728,3632244223,US 3632244224,3632244479,CA -3632244480,3632332799,US +3632244480,3632279039,US +3632279040,3632279295,SA +3632279296,3632332799,US 3632332800,3632357375,CA 3632357376,3632381951,US 3632381952,3632390143,CA @@ -92329,7 +96805,6 @@ 3633348608,3633405951,US 3633405952,3633410047,CA 3633410048,3633446911,US -3633454080,3633454335,US 3633455104,3633456383,US 3633456384,3633456639,AU 3633456640,3633479679,US @@ -92349,7 +96824,9 @@ 3633550848,3633551359,GA 3633551360,3633757439,US 3633757440,3633757695,IN -3633757696,3633785343,US +3633757696,3633757951,US +3633757952,3633758207,PH +3633758208,3633785343,US 3633785600,3633786367,US 3633786880,3633815807,US 3633815808,3633816063,CA @@ -92379,7 +96856,8 @@ 3634094080,3634098175,SE 3634098176,3634511871,US 3634511872,3634515967,CA -3634515968,3634552831,US +3634515968,3634524159,US +3634528256,3634552831,US 3634552832,3634556927,CA 3634556928,3634741247,US 3634741248,3634749439,CA @@ -92587,7 +97065,9 @@ 3636158208,3636158215,CA 3636158216,3636158463,US 3636158464,3636158719,CA -3636158720,3636158975,US +3636158720,3636158871,US +3636158872,3636158879,CA +3636158880,3636158975,US 3636158976,3636159743,CA 3636159744,3636160511,US 3636160512,3636160767,CA @@ -92597,14 +97077,11 @@ 3636163584,3636164095,CA 3636164096,3636164327,US 3636164328,3636164335,CA -3636164336,3636165119,US -3636165120,3636165375,CA -3636165376,3636166399,US +3636164336,3636166399,US 3636166400,3636166655,CA 3636166656,3636206079,US 3636206080,3636206335,AU -3636206336,3636301823,US -3636305920,3636396031,US +3636206336,3636396031,US 3636396032,3636461567,CA 3636461568,3636609023,US 3636609024,3636621311,CA @@ -92615,7 +97092,11 @@ 3636627200,3636627455,BR 3636627456,3636628479,MX 3636628480,3636628991,PE -3636628992,3636822015,US +3636628992,3636740095,US +3636740096,3636740351,CA +3636740352,3636741503,US +3636741504,3636741631,CA +3636741632,3636822015,US 3636822016,3636854783,CA 3636854784,3636887551,US 3636887552,3636895743,CA @@ -92642,7 +97123,9 @@ 3637641216,3637665791,US 3637665792,3637669887,CA 3637669888,3637706751,US -3637706752,3637739519,CA +3637706752,3637726591,CA +3637726592,3637726719,US +3637726720,3637739519,CA 3637739520,3638165503,US 3638165504,3638181887,CA 3638181888,3638214399,US @@ -92655,7 +97138,9 @@ 3638247936,3638248703,GB 3638248704,3638249215,US 3638249216,3638249471,GB -3638249472,3638304767,US +3638249472,3638250559,US +3638250560,3638250623,GB +3638250624,3638304767,US 3638304768,3638312959,CA 3638312960,3638349823,US 3638349824,3638350079,AU @@ -92666,15 +97151,15 @@ 3638400000,3638401087,US 3638401088,3638401119,CA 3638401120,3638509567,US -3638509568,3638534143,CA +3638509568,3638526719,CA +3638526720,3638526975,US +3638526976,3638534143,CA 3638534144,3638697983,US 3638697984,3638706175,CA 3638706176,3638706687,US 3638706688,3638706943,NG 3638706944,3638738943,US -3638740992,3638746111,US -3638746112,3638746367,MX -3638746368,3638874111,US +3638740992,3638874111,US 3638874112,3638878207,CA 3638878208,3638984703,US 3638984704,3638992895,GT @@ -92688,7 +97173,7 @@ 3639148544,3639222271,US 3639222272,3639230463,CA 3639230464,3639247359,US -3639248128,3639249151,US +3639247872,3639249151,US 3639249664,3639255039,US 3639255040,3639263231,CA 3639263232,3639279615,US @@ -92709,7 +97194,8 @@ 3639402240,3639402495,GH 3639402496,3639513239,US 3639513240,3639513243,AE -3639513244,3639533567,US +3639513244,3639525375,US +3639529472,3639533567,US 3639533568,3639537663,CA 3639537664,3639550207,US 3639550208,3639550215,AR @@ -92720,7 +97206,9 @@ 3639550312,3639550319,AU 3639550320,3639550327,CO 3639550328,3639554559,US -3639554560,3639554815,GB +3639554560,3639554748,GB +3639554749,3639554749,US +3639554750,3639554815,GB 3639554816,3639555839,US 3639555840,3639555847,AR 3639555848,3639555855,BR @@ -92746,9 +97234,9 @@ 3639664640,3639668735,CA 3639668736,3639672831,US 3639672832,3639681023,CL -3639681024,3639684991,US -3639684992,3639685119,SA -3639685120,3639692031,US +3639681024,3639685055,US +3639685056,3639685063,SA +3639685064,3639692031,US 3639692032,3639692287,GB 3639692288,3639704573,US 3639704574,3639704574,GB @@ -92760,7 +97248,9 @@ 3639737375,3639737599,GB 3639737600,3639737629,US 3639737630,3639737630,GB -3639737631,3639902207,US +3639737631,3639868415,US +3639868416,3639868543,MX +3639868544,3639902207,US 3639902208,3639918591,PE 3639918592,3639934975,AR 3639934976,3640057855,US @@ -92842,7 +97332,9 @@ 3641356536,3641356543,CM 3641356544,3641357983,GB 3641357984,3641358015,SL -3641358016,3641360383,GB +3641358016,3641359359,GB +3641359360,3641359615,US +3641359616,3641360383,GB 3641360384,3641368575,RO 3641368576,3641372671,GB 3641372672,3641376767,BG @@ -92873,7 +97365,10 @@ 3641483264,3641491455,IT 3641491456,3641493503,UA 3641493504,3641494015,NL -3641494016,3641499647,UA +3641494016,3641494527,BG +3641494528,3641495551,UA +3641495552,3641496063,NL +3641496064,3641499647,UA 3641499648,3641503743,SA 3641503744,3641507839,RU 3641507840,3641516031,NO @@ -92915,9 +97410,9 @@ 3641669120,3641670271,ZW 3641670272,3641670911,GB 3641670912,3641671167,LS -3641671168,3641671423,ZW -3641671424,3641671679,GB +3641671168,3641671679,GB 3641671680,3641679871,RU +3641679872,3641680127,DK 3641681152,3641681407,SE 3641681408,3641681663,FR 3641683968,3641688063,KZ @@ -92959,7 +97454,6 @@ 3641835520,3641839615,IT 3641839616,3641843711,GB 3641843712,3641847807,ES -3641847808,3641851903,IT 3641851904,3641855999,NL 3641856000,3641860095,GB 3641860096,3641868287,IT @@ -93053,8 +97547,7 @@ 3642253312,3642257407,FI 3642257408,3642261503,RU 3642261504,3642265599,BA -3642265600,3642267647,AE -3642267648,3642269695,IR +3642265600,3642269695,AE 3642269696,3642273791,UA 3642273792,3642277887,RU 3642277888,3642290175,DE @@ -93125,7 +97618,9 @@ 3642554199,3642554199,RU 3642554200,3642554367,UA 3642554368,3642554623,LT -3642554624,3642556415,UA +3642554624,3642554720,UA +3642554721,3642554721,LV +3642554722,3642556415,UA 3642556416,3642560511,CZ 3642560512,3642564607,KG 3642564608,3642568703,DE @@ -93160,7 +97655,9 @@ 3642691584,3642695679,DE 3642695680,3642699775,SK 3642699776,3642703871,CZ -3642703872,3642707967,LU +3642703872,3642705151,LU +3642705152,3642705407,DE +3642705408,3642707967,LU 3642707968,3642712063,DE 3642712064,3642716159,NO 3642716160,3642720255,IT @@ -93202,15 +97699,7 @@ 3644928000,3644932095,GI 3644932096,3644936191,IT 3644936192,3644940287,RU -3644940288,3644942847,HU -3644942848,3644943103,BG -3644943104,3644943359,HU -3644943360,3644943615,BG -3644943616,3644946175,HU -3644946176,3644946687,BG -3644946688,3644946943,HU -3644946944,3644947967,BG -3644947968,3644948479,HU +3644940288,3644948479,HU 3644948480,3644952575,DE 3644952576,3644960767,GB 3644960768,3644964863,TR @@ -93226,9 +97715,7 @@ 3645009920,3645014015,FR 3645014016,3645018111,DE 3645018112,3645022207,RU -3645022208,3645023743,CZ -3645023744,3645023999,SK -3645024000,3645030399,CZ +3645022208,3645030399,CZ 3645030400,3645038591,IR 3645038592,3645046783,PS 3645046784,3645050879,RU @@ -93261,17 +97748,14 @@ 3645169664,3645173759,CH 3645173760,3645177855,GB 3645177856,3645181951,GR -3645181952,3645183375,FR -3645183376,3645183383,SA -3645183384,3645185759,FR +3645181952,3645185759,FR 3645185760,3645185775,GB 3645185776,3645186047,FR 3645186048,3645190143,GB 3645190144,3645194239,FI 3645194240,3645202431,DE 3645202432,3645206527,CZ -3645206528,3645208575,LV -3645208576,3645210623,LT +3645206528,3645210623,LV 3645210624,3645214719,RU 3645214720,3645218815,NL 3645218816,3645222911,DE @@ -93302,6 +97786,7 @@ 3645325312,3645329407,IT 3645329408,3645333503,CH 3645334272,3645335039,DE +3645335688,3645335691,DE 3645337600,3645341695,FR 3645341696,3645345791,RU 3645345792,3645349887,FI @@ -93438,6 +97923,7 @@ 3645767680,3645771775,IE 3645771776,3645779967,SE 3645779968,3645784063,PS +3645784064,3645788159,DJ 3645788160,3645792255,GB 3645792256,3645796351,TR 3645796352,3645800447,CH @@ -93491,7 +97977,11 @@ 3647966208,3647967231,GB 3647967232,3647968255,BE 3647968256,3647969279,FR -3647969280,3647971327,DE +3647969280,3647969327,DE +3647969328,3647969335,IT +3647969336,3647970047,DE +3647970048,3647970303,BE +3647970304,3647971327,DE 3647971328,3647972351,GB 3647972352,3647973375,IT 3647973376,3647973399,DE @@ -93514,9 +98004,7 @@ 3647980384,3647980415,FR 3647980416,3647980543,DE 3647980544,3647981567,GB -3647981568,3647981823,BE -3647981824,3647982079,DK -3647982080,3647982591,BE +3647981568,3647982591,BE 3647982592,3647983615,IT 3647983616,3647984031,DE 3647984032,3647984047,NL @@ -93527,12 +98015,16 @@ 3647987656,3647987695,DE 3647987696,3647987711,ES 3647987712,3647988735,IT -3647988736,3647989759,BE -3647989760,3647995903,DE +3647988736,3647989063,DE +3647989064,3647989071,BE +3647989072,3647989247,DE +3647989248,3647989503,BE +3647989504,3647995903,DE 3647995904,3648004095,RU 3648004096,3648007167,GB 3648007168,3648007679,US -3648007680,3648008191,GB +3648007680,3648007935,RU +3648007936,3648008191,GB 3648008192,3648016383,FR 3648016384,3648020479,GB 3648020480,3648024575,IT @@ -93540,6 +98032,7 @@ 3648028672,3648032767,HU 3648032768,3648033023,IE 3648034888,3648034895,IE +3648036096,3648036351,IE 3648036864,3648040959,CZ 3648040960,3648045055,BE 3648045056,3648049151,FI @@ -93560,15 +98053,16 @@ 3648080896,3648081023,ZM 3648081024,3648081055,GA 3648081056,3648081151,ZM -3648081152,3648082239,BE +3648081152,3648081407,BE +3648081408,3648081663,CG +3648081664,3648082239,BE 3648082240,3648082311,NE 3648082312,3648082431,BE 3648082432,3648082479,ZM 3648082480,3648084223,BE 3648084224,3648084479,CD 3648084480,3648084991,BE -3648084992,3648085759,GB -3648085760,3648086015,ZM +3648084992,3648086015,GB 3648086016,3648090111,AT 3648090112,3648094207,RU 3648094208,3648102399,PL @@ -93599,7 +98093,9 @@ 3648192512,3648196607,DE 3648196608,3648200703,IT 3648200704,3648208895,SE -3648208896,3648212991,DE +3648208896,3648209166,DE +3648209167,3648209169,GB +3648209170,3648212991,DE 3648212992,3648217087,RU 3648217088,3648221183,UA 3648221184,3648225279,IE @@ -93618,8 +98114,7 @@ 3648282624,3648286719,PL 3648286720,3648290815,DE 3648290816,3648299007,RU -3648299008,3648301055,FI -3648301056,3648303103,CZ +3648299008,3648303103,FI 3648303104,3648307199,AT 3648307200,3648311295,TR 3648311296,3648323583,DK @@ -93643,7 +98138,9 @@ 3648397312,3648405503,NO 3648405504,3648413695,RU 3648413696,3648417791,SK -3648417792,3648425983,GB +3648417792,3648419903,GB +3648419904,3648419935,BE +3648419936,3648425983,GB 3648425984,3648430079,IT 3648430080,3648434175,NL 3648434176,3648438271,RU @@ -93667,9 +98164,7 @@ 3648512000,3648516095,NL 3648516096,3648519167,RS 3648519168,3648520191,MK -3648520192,3648523775,NL -3648523776,3648524031,DE -3648524032,3648782335,NL +3648520192,3648782335,NL 3648782336,3649044479,ES 3649044480,3649110015,FR 3649110016,3649175551,PT @@ -93736,7 +98231,7 @@ 3650225408,3650225663,BR 3650225664,3650226175,TR 3650226176,3650226431,RS -3650226432,3650226687,AT +3650226432,3650226687,SG 3650226688,3650227455,IN 3650227456,3650227711,PL 3650227712,3650227967,PT @@ -93763,7 +98258,9 @@ 3650285568,3650289663,UA 3650289664,3650297855,RU 3650297856,3650301951,LT -3650301952,3650310143,DE +3650301952,3650307103,DE +3650307104,3650307134,GB +3650307135,3650310143,DE 3650310144,3650314239,GB 3650314240,3650318335,DE 3650318336,3650322431,GI @@ -93854,7 +98351,9 @@ 3650611836,3650611836,RU 3650611837,3650611866,LB 3650611867,3650611867,RU -3650611868,3650611947,LB +3650611868,3650611920,LB +3650611921,3650611921,RU +3650611922,3650611947,LB 3650611948,3650611948,RU 3650611949,3650611967,LB 3650611968,3650613247,RU @@ -93864,16 +98363,17 @@ 3650748416,3650879487,GB 3650879488,3650912255,RO 3650912256,3650915327,GB -3650915328,3650915337,FR -3650915338,3650915338,BE -3650915339,3650915583,FR +3650915328,3650915583,FR 3650915584,3650920447,GB 3650920448,3650920457,FR 3650920458,3650920458,GB 3650920459,3650920703,FR -3650920704,3650926079,GB -3650926080,3650926335,BE -3650926336,3650926591,GB +3650920704,3650920895,LB +3650920896,3650920927,GB +3650920928,3650920959,LB +3650920960,3650922799,GB +3650922800,3650922815,FR +3650922816,3650926591,GB 3650926592,3650929663,ES 3650929664,3650929847,GB 3650929848,3650929855,FR @@ -93885,9 +98385,9 @@ 3650932976,3650939599,GB 3650939600,3650939607,FR 3650939608,3650939615,TR -3650939616,3650944511,GB -3650944512,3650944767,FR -3650944768,3650945023,GB +3650939616,3650940927,GB +3650940928,3650941183,NL +3650941184,3650945023,GB 3650945024,3651010559,DK 3651010560,3651076095,GB 3651076096,3651108863,DE @@ -93896,7 +98396,9 @@ 3651152896,3651153919,GB 3651153920,3651168255,DE 3651168256,3651169023,ES -3651169024,3651207167,DE +3651169024,3651192319,DE +3651192320,3651193343,GB +3651193344,3651207167,DE 3651207168,3651207199,GB 3651207224,3651207295,GB 3651207424,3651207615,GB @@ -94007,7 +98509,9 @@ 3651958784,3651960831,IR 3651960832,3651964927,GB 3651964928,3651969023,SK -3651969024,3651977215,DE +3651969024,3651971613,DE +3651971614,3651971614,TR +3651971615,3651977215,DE 3651977216,3651985407,IT 3651985408,3651997695,PL 3651997696,3652001791,RU @@ -94017,8 +98521,8 @@ 3652014080,3652018175,SA 3652018176,3652022271,IE 3652022272,3652026367,ES -3652026368,3652032511,DE -3652032512,3652033791,NL +3652026368,3652032767,DE +3652032768,3652033791,NL 3652033792,3652034559,DE 3652034560,3652046847,PL 3652046848,3652050943,IE @@ -94044,16 +98548,18 @@ 3652149248,3652153343,DE 3652153344,3652157439,SE 3652157440,3652165631,RU -3652165632,3652169471,FR +3652165632,3652165887,GF +3652165888,3652169471,FR 3652169472,3652169727,GF -3652169728,3652170495,MQ -3652170496,3652170751,FR +3652169728,3652170239,MQ +3652170240,3652170751,FR 3652170752,3652171007,MQ -3652171008,3652172031,FR -3652172032,3652172287,RE -3652172288,3652172799,FR -3652172800,3652173055,RE -3652173056,3652173823,FR +3652171008,3652171519,FR +3652171520,3652171775,MQ +3652171776,3652172287,RE +3652172288,3652172543,FR +3652172544,3652172799,RE +3652172800,3652173823,FR 3652173824,3652177919,AT 3652177920,3652182015,CY 3652182016,3652190207,DE @@ -94067,7 +98573,9 @@ 3653386240,3653390335,DE 3653390336,3653394431,FR 3653394432,3653402623,NL -3653402624,3653410060,GB +3653402624,3653407103,GB +3653407104,3653407111,UG +3653407112,3653410060,GB 3653410061,3653410061,YT 3653410062,3653410815,GB 3653410816,3653414911,CZ @@ -94083,9 +98591,6 @@ 3653451776,3653464063,RU 3653464064,3653468159,NL 3653468160,3653472255,GR -3653472256,3653472511,NL -3653472512,3653472767,US -3653472768,3653476351,NL 3653476352,3653480447,CZ 3653480448,3653484543,DK 3653484544,3653488639,TR @@ -94152,8 +98657,7 @@ 3654025216,3654287359,GB 3654287360,3654608404,SE 3654608405,3654608405,NO -3654608406,3654608639,SE -3654608640,3654608895,RU +3654608406,3654608895,SE 3654608896,3654609919,NO 3654609920,3654614143,SE 3654614144,3654614271,FI @@ -94168,13 +98672,13 @@ 3659628544,3659661311,JP 3659661312,3659792383,TW 3659792384,3660054527,KR -3660054528,3660097535,JP -3660097536,3660097791,US -3660097792,3660099583,JP -3660099584,3660099839,US -3660099840,3660102143,JP -3660102144,3660102399,US -3660102400,3660102655,JP +3660054528,3660097023,JP +3660097024,3660097279,US +3660097280,3660099071,JP +3660099072,3660099583,US +3660099584,3660100095,JP +3660100096,3660100607,US +3660100608,3660102655,JP 3660102656,3660102911,US 3660102912,3660578815,JP 3660578816,3661103103,KR @@ -94250,7 +98754,9 @@ 3669618688,3669620735,CN 3669622784,3669688319,SG 3669688320,3669753855,TW -3669753856,3670015999,HK +3669753856,3669777663,HK +3669777664,3669777919,SG +3669777920,3670015999,HK 3670016000,3671064575,CN 3671064576,3671130111,MY 3671130112,3671195647,KR @@ -94385,7 +98891,9 @@ 3715760128,3715891199,CN 3715891200,3716153343,HK 3716153344,3716169727,SG -3716169728,3716186111,TH +3716169728,3716175615,JP +3716175616,3716184575,TH +3716184576,3716186111,JP 3716186112,3716415487,CN 3716415488,3716431871,VN 3716431872,3716440063,KR @@ -94480,7 +98988,9 @@ 3743121408,3743125503,MY 3743125504,3743129599,ID 3743129600,3743130623,HK -3743130624,3743133695,SG +3743130624,3743130879,SG +3743130880,3743131135,HK +3743131136,3743133695,SG 3743133696,3743134719,AU 3743134720,3743135743,JP 3743135744,3743136767,CN @@ -94546,16 +99056,12 @@ 3755988992,3755990015,HK 3755990016,3755991039,SG 3755991040,3755999231,JP -3755999232,3756002815,IN -3756002816,3756003071,LK -3756003072,3757047807,IN +3755999232,3757047807,IN 3757047808,3757834239,CN 3757834240,3757867007,AU 3757867008,3757875519,CN 3757875520,3757875583,HK -3757875584,3757880063,CN -3757880064,3757883391,HK -3757883392,3757899775,CN +3757875584,3757899775,CN 3757899776,3757965311,KR 3757965312,3758063615,CN 3758063616,3758079999,HK diff --git a/src/config/geoip6 b/src/config/geoip6 index 06bd578b85..db79a4335b 100644 --- a/src/config/geoip6 +++ b/src/config/geoip6 @@ -1,8 +1,17 @@ -# Last updated based on August 7 2014 Maxmind GeoLite2 Country +# Last updated based on January 7 2015 Maxmind GeoLite2 Country # wget https://geolite.maxmind.com/download/geoip/database/GeoLite2-Country.mmdb.gz # gunzip GeoLite2-Country.mmdb.gz # python mmdb-convert.py GeoLite2-Country.mmdb -2001:218::,2001:218:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:200::,2001:200::ffff:ffff:ffff:ffff:ffff,JP +2001:200:120::,2001:200:120:ffff:ffff:ffff:ffff:ffff,JP +2001:200:148::,2001:200:148:ffff:ffff:ffff:ffff:ffff,JP +2001:200:167::,2001:200:167:ffff:ffff:ffff:ffff:ffff,JP +2001:200:601::,2001:200:601:ffff:ffff:ffff:ffff:ffff,AU +2001:208:3::,2001:208:3:ffff:ffff:ffff:ffff:ffff,SG +2001:208:5::,2001:208:5:ffff:ffff:ffff:ffff:ffff,SG +2001:218::,2001:218:e000:ffff:ffff:ffff:ffff:ffff,JP +2001:218:e001::,2001:218:e001:ffff:ffff:ffff:ffff:ffff,US +2001:218:e002::,2001:218:ffff:ffff:ffff:ffff:ffff:ffff,JP 2001:220::,2001:220:ffff:ffff:ffff:ffff:ffff:ffff,KR 2001:230::,2001:230:ffff:ffff:ffff:ffff:ffff:ffff,KR 2001:238::,2001:238:ffff:ffff:ffff:ffff:ffff:ffff,TW @@ -46,7 +55,9 @@ 2001:368::,2001:368:ffff:ffff:ffff:ffff:ffff:ffff,JP 2001:370::,2001:370:ffff:ffff:ffff:ffff:ffff:ffff,JP 2001:378::,2001:378:ffff:ffff:ffff:ffff:ffff:ffff,KR -2001:380::,2001:380:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:380::,2001:380:1fb:ffff:ffff:ffff:ffff:ffff,JP +2001:380:1fc::,2001:380:1fc:ffff:ffff:ffff:ffff:ffff,VN +2001:380:1fd::,2001:380:ffff:ffff:ffff:ffff:ffff:ffff,JP 2001:388::,2001:388:ffff:ffff:ffff:ffff:ffff:ffff,AU 2001:390::,2001:390:ffff:ffff:ffff:ffff:ffff:ffff,KR 2001:398::,2001:398:ffff:ffff:ffff:ffff:ffff:ffff,JP @@ -60,9 +71,2308 @@ 2001:3d8::,2001:3d8:ffff:ffff:ffff:ffff:ffff:ffff,JP 2001:3e0::,2001:3e0:ffff:ffff:ffff:ffff:ffff:ffff,JP 2001:3e8::,2001:3e8:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:400::,2001:4ff:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:500::,2001:5ff:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:600::,2001:7ff:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:400::,2001:400:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:408::,2001:408:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:410::,2001:410:ffff:ffff:ffff:ffff:ffff:ffff,CA +2001:418::,2001:418:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:420::,2001:420:4049:ffff:ffff:ffff:ffff:ffff,US +2001:420:404a::,2001:420:404a:ffff:ffff:ffff:ffff:ffff,GB +2001:420:404b::,2001:420:5040:ffff:ffff:ffff:ffff:ffff,US +2001:420:5041::,2001:420:5041:ffff:ffff:ffff:ffff:ffff,AU +2001:420:5042::,2001:420:5042:ffff:ffff:ffff:ffff:ffff,US +2001:420:5043::,2001:420:5043:ffff:ffff:ffff:ffff:ffff,AU +2001:420:5044::,2001:420:5046:ffff:ffff:ffff:ffff:ffff,US +2001:420:5047::,2001:420:5047:ffff:ffff:ffff:ffff:ffff,AU +2001:420:5048::,2001:420:5441:ffff:ffff:ffff:ffff:ffff,US +2001:420:5442::,2001:420:5442:ffff:ffff:ffff:ffff:ffff,IN +2001:420:5443::,2001:420:5502:ffff:ffff:ffff:ffff:ffff,US +2001:420:5503::,2001:420:5503:ffff:ffff:ffff:ffff:ffff,IN +2001:420:5504::,2001:420:5882:ffff:ffff:ffff:ffff:ffff,US +2001:420:5883::,2001:420:5883:ffff:ffff:ffff:ffff:ffff,CN +2001:420:5884::,2001:420:5a3f:ffff:ffff:ffff:ffff:ffff,US +2001:420:5a40::,2001:420:5a40:ffff:ffff:ffff:ffff:ffff,CN +2001:420:5a41::,2001:420:5a43:ffff:ffff:ffff:ffff:ffff,US +2001:420:5a44::,2001:420:5a44:ffff:ffff:ffff:ffff:ffff,CN +2001:420:5a45::,2001:420:5c3f:ffff:ffff:ffff:ffff:ffff,US +2001:420:5c40::,2001:420:5c40:ffff:ffff:ffff:ffff:ffff,SG +2001:420:5c41::,2001:420:c0c0:ffff:ffff:ffff:ffff:ffff,US +2001:420:c0c1::,2001:420:c0c1:ffff:ffff:ffff:ffff:ffff,CH +2001:420:c0c2::,2001:420:c0cf:ffff:ffff:ffff:ffff:ffff,US +2001:420:c0d0::,2001:420:c0d0:ffff:ffff:ffff:ffff:ffff,AU +2001:420:c0d1::,2001:420:c0d3:ffff:ffff:ffff:ffff:ffff,US +2001:420:c0d4::,2001:420:c0d4:ffff:ffff:ffff:ffff:ffff,SG +2001:420:c0d5::,2001:420:c0d7:ffff:ffff:ffff:ffff:ffff,US +2001:420:c0d8::,2001:420:c0d8:ffff:ffff:ffff:ffff:ffff,CN +2001:420:c0d9::,2001:420:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:428::,2001:428:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:430::,2001:430:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:438::,2001:438:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:440::,2001:440:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:448::,2001:448:ffff:ffff:ffff:ffff:ffff:ffff,MX +2001:450::,2001:450:1b:ffff:ffff:ffff:ffff:ffff,US +2001:450:1c::,2001:450:1c:ffff:ffff:ffff:ffff:ffff,CA +2001:450:1d::,2001:450:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:458::,2001:458:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:460::,2001:460:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:468::,2001:468:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:470::,2001:470:18:ffff:ffff:ffff:ffff:ffff,US +2001:470:19::,2001:470:19:5ff:ffff:ffff:ffff:ffff,HK +2001:470:19:600::,2001:470:19:7ff:ffff:ffff:ffff:ffff,US +2001:470:19:800::,2001:470:19:fff:ffff:ffff:ffff:ffff,CN +2001:470:19:1000::,2001:470:1c:7ff:ffff:ffff:ffff:ffff,US +2001:470:1c:800::,2001:470:1c:bff:ffff:ffff:ffff:ffff,CA +2001:470:1c:c00::,2001:470:1c:ffff:ffff:ffff:ffff:ffff,US +2001:470:1d::,2001:470:1d:fff:ffff:ffff:ffff:ffff,CA +2001:470:1d:1000::,2001:470:23:ffff:ffff:ffff:ffff:ffff,US +2001:470:24::,2001:470:24:ffff:ffff:ffff:ffff:ffff,CN +2001:470:25::,2001:470:26:7ff:ffff:ffff:ffff:ffff,US +2001:470:26:800::,2001:470:26:fff:ffff:ffff:ffff:ffff,CH +2001:470:26:1000::,2001:470:34:ffff:ffff:ffff:ffff:ffff,US +2001:470:35::,2001:470:35:7ff:ffff:ffff:ffff:ffff,ID +2001:470:35:800::,2001:470:3c:ffff:ffff:ffff:ffff:ffff,US +2001:470:3d::,2001:470:3d:ffff:ffff:ffff:ffff:ffff,PH +2001:470:3e::,2001:470:65:ffff:ffff:ffff:ffff:ffff,US +2001:470:66::,2001:470:66:ffff:ffff:ffff:ffff:ffff,CN +2001:470:67::,2001:470:6f:1ff:ffff:ffff:ffff:ffff,US +2001:470:6f:200::,2001:470:6f:3ff:ffff:ffff:ffff:ffff,UA +2001:470:6f:400::,2001:470:1eff:ffff:ffff:ffff:ffff:ffff,US +2001:470:1f00::,2001:470:1f00:ffff:ffff:ffff:ffff:ffff,AU +2001:470:1f01::,2001:470:1f16:ffff:ffff:ffff:ffff:ffff,US +2001:470:1f17::,2001:470:1f17:ffff:ffff:ffff:ffff:ffff,CN +2001:470:1f18::,2001:470:2092:ffff:ffff:ffff:ffff:ffff,US +2001:470:2093::,2001:470:2093:ffff:ffff:ffff:ffff:ffff,SI +2001:470:2094::,2001:470:507c:ffff:ffff:ffff:ffff:ffff,US +2001:470:507d::,2001:470:507d:ffff:ffff:ffff:ffff:ffff,UA +2001:470:507e::,2001:470:5853:ffff:ffff:ffff:ffff:ffff,US +2001:470:5854::,2001:470:5854:ffff:ffff:ffff:ffff:ffff,CZ +2001:470:5855::,2001:470:591a:ffff:ffff:ffff:ffff:ffff,US +2001:470:591b::,2001:470:591b:ffff:ffff:ffff:ffff:ffff,CZ +2001:470:591c::,2001:470:591c:ffff:ffff:ffff:ffff:ffff,US +2001:470:591d::,2001:470:591d:ffff:ffff:ffff:ffff:ffff,CZ +2001:470:591e::,2001:470:5948:ffff:ffff:ffff:ffff:ffff,US +2001:470:5949::,2001:470:5949:ffff:ffff:ffff:ffff:ffff,CZ +2001:470:594a::,2001:470:618d:ffff:ffff:ffff:ffff:ffff,US +2001:470:618e::,2001:470:618e:ffff:ffff:ffff:ffff:ffff,PL +2001:470:618f::,2001:470:6914:ffff:ffff:ffff:ffff:ffff,US +2001:470:6915::,2001:470:6915:ffff:ffff:ffff:ffff:ffff,ES +2001:470:6916::,2001:470:69a3:ffff:ffff:ffff:ffff:ffff,US +2001:470:69a4::,2001:470:69a4:ffff:ffff:ffff:ffff:ffff,GB +2001:470:69a5::,2001:470:6adc:ffff:ffff:ffff:ffff:ffff,US +2001:470:6add::,2001:470:6add:ffff:ffff:ffff:ffff:ffff,GB +2001:470:6ade::,2001:470:6b2e:ffff:ffff:ffff:ffff:ffff,US +2001:470:6b2f::,2001:470:6b2f:ffff:ffff:ffff:ffff:ffff,GB +2001:470:6b30::,2001:470:6be4:ffff:ffff:ffff:ffff:ffff,US +2001:470:6be5::,2001:470:6be5:ffff:ffff:ffff:ffff:ffff,GB +2001:470:6be6::,2001:470:6bed:ffff:ffff:ffff:ffff:ffff,US +2001:470:6bee::,2001:470:6bee:ffff:ffff:ffff:ffff:ffff,IN +2001:470:6bef::,2001:470:6c96:ffff:ffff:ffff:ffff:ffff,US +2001:470:6c97::,2001:470:6c97:ffff:ffff:ffff:ffff:ffff,RU +2001:470:6c98::,2001:470:6cee:ffff:ffff:ffff:ffff:ffff,US +2001:470:6cef::,2001:470:6cef:ffff:ffff:ffff:ffff:ffff,ES +2001:470:6cf0::,2001:470:710f:ffff:ffff:ffff:ffff:ffff,US +2001:470:7110::,2001:470:7110:ffff:ffff:ffff:ffff:ffff,UA +2001:470:7111::,2001:470:74e0:ffff:ffff:ffff:ffff:ffff,US +2001:470:74e1::,2001:470:74e1:ffff:ffff:ffff:ffff:ffff,FI +2001:470:74e2::,2001:470:75bf:ffff:ffff:ffff:ffff:ffff,US +2001:470:75c0::,2001:470:75c0:ffff:ffff:ffff:ffff:ffff,TR +2001:470:75c1::,2001:470:75c4:ffff:ffff:ffff:ffff:ffff,US +2001:470:75c5::,2001:470:75c5:ffff:ffff:ffff:ffff:ffff,DE +2001:470:75c6::,2001:470:79ff:ffff:ffff:ffff:ffff:ffff,US +2001:470:7a00::,2001:470:7a00:ffff:ffff:ffff:ffff:ffff,NL +2001:470:7a01::,2001:470:7c14:ffff:ffff:ffff:ffff:ffff,US +2001:470:7c15::,2001:470:7c15:ffff:ffff:ffff:ffff:ffff,DE +2001:470:7c16::,2001:470:8091:ffff:ffff:ffff:ffff:ffff,US +2001:470:8092::,2001:470:8092:ffff:ffff:ffff:ffff:ffff,CN +2001:470:8093::,2001:470:80b6:ffff:ffff:ffff:ffff:ffff,US +2001:470:80b7::,2001:470:80b7:ffff:ffff:ffff:ffff:ffff,CN +2001:470:80b8::,2001:470:81ee:ffff:ffff:ffff:ffff:ffff,US +2001:470:81ef::,2001:470:81ef:ffff:ffff:ffff:ffff:ffff,CA +2001:470:81f0::,2001:470:8327:ffff:ffff:ffff:ffff:ffff,US +2001:470:8328::,2001:470:8328:ffff:ffff:ffff:ffff:ffff,CN +2001:470:8329::,2001:470:83a2:ffff:ffff:ffff:ffff:ffff,US +2001:470:83a3::,2001:470:83a3:ffff:ffff:ffff:ffff:ffff,AU +2001:470:83a4::,2001:470:83bb:ffff:ffff:ffff:ffff:ffff,US +2001:470:83bc::,2001:470:83bc:ffff:ffff:ffff:ffff:ffff,CN +2001:470:83bd::,2001:470:83cf:ffff:ffff:ffff:ffff:ffff,US +2001:470:83d0::,2001:470:83d0:ffff:ffff:ffff:ffff:ffff,CN +2001:470:83d1::,2001:470:83e8:ffff:ffff:ffff:ffff:ffff,US +2001:470:83e9::,2001:470:83e9:ffff:ffff:ffff:ffff:ffff,CN +2001:470:83ea::,2001:470:859e:ffff:ffff:ffff:ffff:ffff,US +2001:470:859f::,2001:470:859f:ffff:ffff:ffff:ffff:ffff,AU +2001:470:85a0::,2001:470:903e:ffff:ffff:ffff:ffff:ffff,US +2001:470:903f::,2001:470:903f:ffff:ffff:ffff:ffff:ffff,GB +2001:470:9040::,2001:470:9d38:ffff:ffff:ffff:ffff:ffff,US +2001:470:9d39::,2001:470:9d39:ffff:ffff:ffff:ffff:ffff,DE +2001:470:9d3a::,2001:470:9ebf:ffff:ffff:ffff:ffff:ffff,US +2001:470:9ec0::,2001:470:9ec0:ffff:ffff:ffff:ffff:ffff,DE +2001:470:9ec1::,2001:470:b7a4:ffff:ffff:ffff:ffff:ffff,US +2001:470:b7a5::,2001:470:b7a5:ffff:ffff:ffff:ffff:ffff,CH +2001:470:b7a6::,2001:470:c322:ffff:ffff:ffff:ffff:ffff,US +2001:470:c323::,2001:470:c323:ffff:ffff:ffff:ffff:ffff,CA +2001:470:c324::,2001:470:c8f1:ffff:ffff:ffff:ffff:ffff,US +2001:470:c8f2::,2001:470:c8f2:ffff:ffff:ffff:ffff:ffff,ES +2001:470:c8f3::,2001:470:d6b8:ffff:ffff:ffff:ffff:ffff,US +2001:470:d6b9::,2001:470:d6b9:ffff:ffff:ffff:ffff:ffff,RU +2001:470:d6ba::,2001:470:de60:ffff:ffff:ffff:ffff:ffff,US +2001:470:de61::,2001:470:de61:ffff:ffff:ffff:ffff:ffff,RU +2001:470:de62::,2001:470:deb4:ffff:ffff:ffff:ffff:ffff,US +2001:470:deb5::,2001:470:deb5:ffff:ffff:ffff:ffff:ffff,RU +2001:470:deb6::,2001:470:dfad:ffff:ffff:ffff:ffff:ffff,US +2001:470:dfae::,2001:470:dfae:ffff:ffff:ffff:ffff:ffff,SE +2001:470:dfaf::,2001:470:e97e:ffff:ffff:ffff:ffff:ffff,US +2001:470:e97f::,2001:470:e97f:ffff:ffff:ffff:ffff:ffff,CA +2001:470:e980::,2001:470:ea76:ffff:ffff:ffff:ffff:ffff,US +2001:470:ea77::,2001:470:ea77:ffff:ffff:ffff:ffff:ffff,AU +2001:470:ea78::,2001:470:ecf6:ffff:ffff:ffff:ffff:ffff,US +2001:470:ecf7::,2001:470:ecf7:ffff:ffff:ffff:ffff:ffff,ID +2001:470:ecf8::,2001:470:f1fa:ffff:ffff:ffff:ffff:ffff,US +2001:470:f1fb::,2001:470:f1fb:ffff:ffff:ffff:ffff:ffff,CN +2001:470:f1fc::,2001:470:f382:ffff:ffff:ffff:ffff:ffff,US +2001:470:f383::,2001:470:f383:ffff:ffff:ffff:ffff:ffff,CN +2001:470:f384::,2001:470:fe3f:ffff:ffff:ffff:ffff:ffff,US +2001:470:fe40::,2001:470:fe40:ffff:ffff:ffff:ffff:ffff,JP +2001:470:fe41::,2001:470:fe7b:ffff:ffff:ffff:ffff:ffff,US +2001:470:fe7c::,2001:470:fe7c:ffff:ffff:ffff:ffff:ffff,CN +2001:470:fe7d::,2001:470:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:478::,2001:478:ffff:ffff:ffff:ffff:ffff:ffff,KN +2001:480::,2001:480:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:490::,2001:490:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:4a0::,2001:4a0:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:4b0::,2001:4b0:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:4b8::,2001:4b8:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:4c0::,2001:4c0:ffff:ffff:ffff:ffff:ffff:ffff,CA +2001:4c8::,2001:4c8:ffff:ffff:ffff:ffff:ffff:ffff,CA +2001:4d0::,2001:4d0:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:4e0::,2001:4e0:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:4e8::,2001:4e8:ffff:ffff:ffff:ffff:ffff:ffff,CA +2001:4f0::,2001:4f0:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:4f8::,2001:4f8:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:500:1::,2001:500:4:ffff:ffff:ffff:ffff:ffff,US +2001:500:6::,2001:500:f:ffff:ffff:ffff:ffff:ffff,CA +2001:500:10::,2001:500:10:ffff:ffff:ffff:ffff:ffff,PR +2001:500:11::,2001:500:15:ffff:ffff:ffff:ffff:ffff,US +2001:500:16::,2001:500:2c:ffff:ffff:ffff:ffff:ffff,CA +2001:500:2d::,2001:500:31:ffff:ffff:ffff:ffff:ffff,US +2001:500:40::,2001:500:56:ffff:ffff:ffff:ffff:ffff,CA +2001:500:60::,2001:500:7d:ffff:ffff:ffff:ffff:ffff,US +2001:500:80::,2001:500:83:ffff:ffff:ffff:ffff:ffff,CA +2001:500:84::,2001:500:89:ffff:ffff:ffff:ffff:ffff,US +2001:500:8c::,2001:500:9f:ffff:ffff:ffff:ffff:ffff,US +2001:500:a0::,2001:500:a7:ffff:ffff:ffff:ffff:ffff,CA +2001:500:a8::,2001:500:a8:ffff:ffff:ffff:ffff:ffff,US +2001:500:c0::,2001:500:ef:ffff:ffff:ffff:ffff:ffff,CA +2001:500:f0::,2001:500:f0:ffff:ffff:ffff:ffff:ffff,US +2001:500:f1::,2001:500:f1:ffff:ffff:ffff:ffff:ffff,CA +2001:500:100::,2001:500:109:ffff:ffff:ffff:ffff:ffff,CA +2001:500:3e5::,2001:500:3e5:ffff:ffff:ffff:ffff:ffff,US +2001:500:30ff::,2001:500:30ff:ffff:ffff:ffff:ffff:ffff,US +2001:500:3682::,2001:500:3682:ffff:ffff:ffff:ffff:ffff,US +2001:500:4431::,2001:500:4431:ffff:ffff:ffff:ffff:ffff,US +2001:500:7967::,2001:500:7967:ffff:ffff:ffff:ffff:ffff,US +2001:500:856e::,2001:500:856e:ffff:ffff:ffff:ffff:ffff,US +2001:500:d937::,2001:500:d937:ffff:ffff:ffff:ffff:ffff,US +2001:500:ed30::,2001:500:ed30:ffff:ffff:ffff:ffff:ffff,US +2001:501:8a29::,2001:501:8a29:ffff:ffff:ffff:ffff:ffff,US +2001:501:973c::,2001:501:973c:ffff:ffff:ffff:ffff:ffff,US +2001:501:b1f9::,2001:501:b1f9:ffff:ffff:ffff:ffff:ffff,US +2001:502:8cc::,2001:502:8cc:ffff:ffff:ffff:ffff:ffff,US +2001:502:100e::,2001:502:100e:ffff:ffff:ffff:ffff:ffff,US +2001:502:1ca1::,2001:502:1ca1:ffff:ffff:ffff:ffff:ffff,US +2001:502:2eda::,2001:502:2eda:ffff:ffff:ffff:ffff:ffff,US +2001:502:4612::,2001:502:4612:ffff:ffff:ffff:ffff:ffff,US +2001:502:63bd::,2001:502:63bd:ffff:ffff:ffff:ffff:ffff,US +2001:502:7094::,2001:502:7094:ffff:ffff:ffff:ffff:ffff,US +2001:502:7a71::,2001:502:7a71:ffff:ffff:ffff:ffff:ffff,US +2001:502:8c25::,2001:502:8c25:ffff:ffff:ffff:ffff:ffff,US +2001:502:ad09::,2001:502:ad09:ffff:ffff:ffff:ffff:ffff,US +2001:502:be98::,2001:502:be98:ffff:ffff:ffff:ffff:ffff,US +2001:502:cbe4::,2001:502:cbe4:ffff:ffff:ffff:ffff:ffff,US +2001:502:cfb5::,2001:502:cfb5:ffff:ffff:ffff:ffff:ffff,US +2001:502:d399::,2001:502:d399:ffff:ffff:ffff:ffff:ffff,US +2001:502:f3ff::,2001:502:f3ff:ffff:ffff:ffff:ffff:ffff,US +2001:503:c27::,2001:503:c27:ffff:ffff:ffff:ffff:ffff,US +2001:503:d2d::,2001:503:d2d:ffff:ffff:ffff:ffff:ffff,US +2001:503:231d::,2001:503:231d:ffff:ffff:ffff:ffff:ffff,US +2001:503:3227::,2001:503:3227:ffff:ffff:ffff:ffff:ffff,US +2001:503:39c1::,2001:503:39c1:ffff:ffff:ffff:ffff:ffff,US +2001:503:4872::,2001:503:4872:ffff:ffff:ffff:ffff:ffff,US +2001:503:5419::,2001:503:5419:ffff:ffff:ffff:ffff:ffff,US +2001:503:5ae2::,2001:503:5ae2:ffff:ffff:ffff:ffff:ffff,US +2001:503:6810::,2001:503:6810:ffff:ffff:ffff:ffff:ffff,US +2001:503:7bbb::,2001:503:7bbb:ffff:ffff:ffff:ffff:ffff,US +2001:503:7bbf::,2001:503:7bbf:ffff:ffff:ffff:ffff:ffff,US +2001:503:8028::,2001:503:8028:ffff:ffff:ffff:ffff:ffff,US +2001:503:83eb::,2001:503:83eb:ffff:ffff:ffff:ffff:ffff,US +2001:503:91ef::,2001:503:91ef:ffff:ffff:ffff:ffff:ffff,US +2001:503:a124::,2001:503:a124:ffff:ffff:ffff:ffff:ffff,US +2001:503:a83e::,2001:503:a83e:ffff:ffff:ffff:ffff:ffff,US +2001:503:ba3e::,2001:503:ba3e:ffff:ffff:ffff:ffff:ffff,US +2001:503:bfb0::,2001:503:bfb0:ffff:ffff:ffff:ffff:ffff,US +2001:503:c779::,2001:503:c779:ffff:ffff:ffff:ffff:ffff,US +2001:503:cc2c::,2001:503:cc2c:ffff:ffff:ffff:ffff:ffff,US +2001:503:d1ae::,2001:503:d1ae:ffff:ffff:ffff:ffff:ffff,US +2001:503:d414::,2001:503:d414:ffff:ffff:ffff:ffff:ffff,US +2001:503:e239::,2001:503:e239:ffff:ffff:ffff:ffff:ffff,US +2001:503:e8ef::,2001:503:e8ef:ffff:ffff:ffff:ffff:ffff,US +2001:503:eea3::,2001:503:eea3:ffff:ffff:ffff:ffff:ffff,US +2001:503:f189::,2001:503:f189:ffff:ffff:ffff:ffff:ffff,US +2001:503:f261::,2001:503:f261:ffff:ffff:ffff:ffff:ffff,US +2001:503:f3da::,2001:503:f3da:ffff:ffff:ffff:ffff:ffff,US +2001:503:ff39::,2001:503:ff39:ffff:ffff:ffff:ffff:ffff,US +2001:504::,2001:504:13:ffff:ffff:ffff:ffff:ffff,US +2001:504:15::,2001:504:15:ffff:ffff:ffff:ffff:ffff,CA +2001:504:16::,2001:504:19:ffff:ffff:ffff:ffff:ffff,US +2001:504:1a::,2001:504:1a:ffff:ffff:ffff:ffff:ffff,CA +2001:504:1b::,2001:504:1c:ffff:ffff:ffff:ffff:ffff,US +2001:504:1d::,2001:504:1d:ffff:ffff:ffff:ffff:ffff,PR +2001:504:20::,2001:504:23:ffff:ffff:ffff:ffff:ffff,CA +2001:504:24::,2001:504:24:ffff:ffff:ffff:ffff:ffff,US +2001:504:25::,2001:504:26:ffff:ffff:ffff:ffff:ffff,CA +2001:504:27::,2001:504:29:ffff:ffff:ffff:ffff:ffff,US +2001:504:2b::,2001:504:2d:ffff:ffff:ffff:ffff:ffff,CA +2001:504:2e::,2001:504:2e:ffff:ffff:ffff:ffff:ffff,US +2001:504:2f::,2001:504:2f:ffff:ffff:ffff:ffff:ffff,CA +2001:504:30::,2001:504:34:ffff:ffff:ffff:ffff:ffff,US +2001:504:35::,2001:504:35:ffff:ffff:ffff:ffff:ffff,GD +2001:504:36::,2001:504:36:ffff:ffff:ffff:ffff:ffff,US +2001:504:37::,2001:504:37:ffff:ffff:ffff:ffff:ffff,CA +2001:504:38::,2001:504:38:ffff:ffff:ffff:ffff:ffff,US +2001:504:39::,2001:504:39:ffff:ffff:ffff:ffff:ffff,CA +2001:504:3a::,2001:504:3d:ffff:ffff:ffff:ffff:ffff,US +2001:504:3e::,2001:504:3e:ffff:ffff:ffff:ffff:ffff,JM +2001:504:3f::,2001:504:41:ffff:ffff:ffff:ffff:ffff,US +2001:504:42::,2001:504:42:ffff:ffff:ffff:ffff:ffff,CA +2001:504:43::,2001:504:43:ffff:ffff:ffff:ffff:ffff,US +2001:506::,2001:506:1:ffff:ffff:ffff:ffff:ffff,US +2001:506:8::,2001:506:8:ffff:ffff:ffff:ffff:ffff,US +2001:506:20::,2001:506:20:ffff:ffff:ffff:ffff:ffff,CA +2001:506:28::,2001:506:28:ffff:ffff:ffff:ffff:ffff,US +2001:506:100::,2001:506:100:ffff:ffff:ffff:ffff:ffff,US +2001:506:1000::,2001:506:2fff:ffff:ffff:ffff:ffff:ffff,US +2001:506:4000::,2001:506:7fff:ffff:ffff:ffff:ffff:ffff,US +2001:508::,2001:508:ffff:ffff:ffff:ffff:ffff:ffff,BM +2001:510::,2001:510:ffff:ffff:ffff:ffff:ffff:ffff,CA +2001:518::,2001:518:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:520::,2001:520:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:528::,2001:528:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:530::,2001:530:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:538::,2001:538:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:540::,2001:540:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:548::,2001:548:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:550::,2001:550:907:ffff:ffff:ffff:ffff:ffff,US +2001:550:908::,2001:550:908:ffff:ffff:ffff:ffff:ffff,CA +2001:550:909::,2001:550:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:558::,2001:560:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:568::,2001:56f:ffff:ffff:ffff:ffff:ffff:ffff,CA +2001:570::,2001:570:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:578::,2001:57b:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:580::,2001:580:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:590::,2001:590:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:598::,2001:598:ffff:ffff:ffff:ffff:ffff:ffff,CA +2001:5a0::,2001:5a0:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:5a8::,2001:5a8:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:5b0::,2001:5b0:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:5b8::,2001:5b8:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:5c0:1000::,2001:5c0:1100:7fff:ffff:ffff:ffff:ffff,CA +2001:5c0:1100:8000::,2001:5c0:1100:bfff:ffff:ffff:ffff:ffff,US +2001:5c0:1100:c000::,2001:5c0:1504:ffff:ffff:ffff:ffff:ffff,CA +2001:5c0:1505::,2001:5c0:1505:ffff:ffff:ffff:ffff:ffff,RU +2001:5c0:1506::,2001:5c0:1507:7fff:ffff:ffff:ffff:ffff,CA +2001:5c0:1507:8000::,2001:5c0:1507:ffff:ffff:ffff:ffff:ffff,IT +2001:5c0:1508::,2001:5c0:1fff:ffff:ffff:ffff:ffff:ffff,CA +2001:5c8::,2001:5c8:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:5d0::,2001:5d0:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:5d8::,2001:5d8:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:5e0::,2001:5e0:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:5e8::,2001:5e8:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:5f0::,2001:5f0:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:5f8::,2001:5f8:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:608::,2001:608:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:610::,2001:610:ffff:ffff:ffff:ffff:ffff:ffff,NL +2001:618::,2001:618:ffff:ffff:ffff:ffff:ffff:ffff,CH +2001:620::,2001:620:ffff:ffff:ffff:ffff:ffff:ffff,CH +2001:628::,2001:62f:ffff:ffff:ffff:ffff:ffff:ffff,AT +2001:630::,2001:630:ffff:ffff:ffff:ffff:ffff:ffff,GB +2001:638::,2001:638:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:640::,2001:640:ffff:ffff:ffff:ffff:ffff:ffff,RU +2001:648::,2001:64f:ffff:ffff:ffff:ffff:ffff:ffff,GR +2001:650::,2001:65f:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:660::,2001:667:ffff:ffff:ffff:ffff:ffff:ffff,FR +2001:668::,2001:66f:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:670::,2001:673:ffff:ffff:ffff:ffff:ffff:ffff,FI +2001:678:1::,2001:678:1:ffff:ffff:ffff:ffff:ffff,CZ +2001:678:2::,2001:678:2:ffff:ffff:ffff:ffff:ffff,DE +2001:678:3::,2001:678:3:ffff:ffff:ffff:ffff:ffff,CH +2001:678:4::,2001:678:5:ffff:ffff:ffff:ffff:ffff,GB +2001:678:6::,2001:678:6:ffff:ffff:ffff:ffff:ffff,LT +2001:678:7::,2001:678:7:ffff:ffff:ffff:ffff:ffff,GR +2001:678:8::,2001:678:8:ffff:ffff:ffff:ffff:ffff,NL +2001:678:9::,2001:678:a:ffff:ffff:ffff:ffff:ffff,BE +2001:678:b::,2001:678:b:ffff:ffff:ffff:ffff:ffff,LV +2001:678:c::,2001:678:c:ffff:ffff:ffff:ffff:ffff,FR +2001:678:d::,2001:678:d:ffff:ffff:ffff:ffff:ffff,AT +2001:678:e::,2001:678:e:ffff:ffff:ffff:ffff:ffff,DE +2001:678:f::,2001:678:11:ffff:ffff:ffff:ffff:ffff,CZ +2001:678:12::,2001:678:12:ffff:ffff:ffff:ffff:ffff,IT +2001:678:13::,2001:678:18:ffff:ffff:ffff:ffff:ffff,RU +2001:678:19::,2001:678:19:ffff:ffff:ffff:ffff:ffff,LT +2001:678:1a::,2001:678:1a:ffff:ffff:ffff:ffff:ffff,DK +2001:678:1b::,2001:678:1b:ffff:ffff:ffff:ffff:ffff,LU +2001:678:1c::,2001:678:1c:ffff:ffff:ffff:ffff:ffff,AT +2001:678:20::,2001:678:20:ffff:ffff:ffff:ffff:ffff,AT +2001:678:24::,2001:678:24:ffff:ffff:ffff:ffff:ffff,AT +2001:678:28::,2001:678:28:ffff:ffff:ffff:ffff:ffff,SM +2001:678:2c::,2001:678:2c:ffff:ffff:ffff:ffff:ffff,NL +2001:678:30::,2001:678:30:ffff:ffff:ffff:ffff:ffff,NL +2001:678:34::,2001:678:34:ffff:ffff:ffff:ffff:ffff,NL +2001:678:38::,2001:678:38:ffff:ffff:ffff:ffff:ffff,NL +2001:678:3c::,2001:678:3c:ffff:ffff:ffff:ffff:ffff,BG +2001:678:40::,2001:678:40:ffff:ffff:ffff:ffff:ffff,ES +2001:678:44::,2001:678:44:ffff:ffff:ffff:ffff:ffff,ES +2001:678:48::,2001:678:48:ffff:ffff:ffff:ffff:ffff,ES +2001:678:4c::,2001:678:4c:ffff:ffff:ffff:ffff:ffff,FR +2001:678:60::,2001:678:60:ffff:ffff:ffff:ffff:ffff,LU +2001:678:64::,2001:678:64:ffff:ffff:ffff:ffff:ffff,BE +2001:678:68::,2001:678:68:ffff:ffff:ffff:ffff:ffff,BE +2001:678:6c::,2001:678:6c:ffff:ffff:ffff:ffff:ffff,BE +2001:678:70::,2001:678:70:ffff:ffff:ffff:ffff:ffff,SK +2001:678:74::,2001:678:74:ffff:ffff:ffff:ffff:ffff,DK +2001:678:78::,2001:678:78:ffff:ffff:ffff:ffff:ffff,DK +2001:678:7c::,2001:678:7c:ffff:ffff:ffff:ffff:ffff,LV +2001:678:80::,2001:678:80:ffff:ffff:ffff:ffff:ffff,LV +2001:678:84::,2001:678:84:ffff:ffff:ffff:ffff:ffff,LV +2001:678:88::,2001:678:88:ffff:ffff:ffff:ffff:ffff,LT +2001:678:8c::,2001:678:8c:ffff:ffff:ffff:ffff:ffff,LT +2001:678:90::,2001:678:90:ffff:ffff:ffff:ffff:ffff,SK +2001:678:94::,2001:678:94:ffff:ffff:ffff:ffff:ffff,EE +2001:678:98::,2001:678:98:ffff:ffff:ffff:ffff:ffff,KZ +2001:678:9c::,2001:678:9c:ffff:ffff:ffff:ffff:ffff,SK +2001:678:a0::,2001:678:a0:ffff:ffff:ffff:ffff:ffff,FI +2001:67c::,2001:67c::ffff:ffff:ffff:ffff:ffff,IE +2001:67c:4::,2001:67c:4:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:8::,2001:67c:8:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:c::,2001:67c:c:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:10::,2001:67c:10:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:14::,2001:67c:14:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:18::,2001:67c:18:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:1c::,2001:67c:1c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:20::,2001:67c:20:ffff:ffff:ffff:ffff:ffff,IE +2001:67c:24::,2001:67c:24:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2c::,2001:67c:2c:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:30::,2001:67c:30:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:34::,2001:67c:34:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:38::,2001:67c:38:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:40::,2001:67c:40:ffff:ffff:ffff:ffff:ffff,BE +2001:67c:44::,2001:67c:44:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:4c::,2001:67c:4c:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:50::,2001:67c:50:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:54::,2001:67c:54:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:58::,2001:67c:58:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:5c::,2001:67c:5c:ffff:ffff:ffff:ffff:ffff,BE +2001:67c:60::,2001:67c:60:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:64::,2001:67c:64:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:68::,2001:67c:68:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:6c::,2001:67c:6c:ffff:ffff:ffff:ffff:ffff,IS +2001:67c:70::,2001:67c:70:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:74::,2001:67c:74:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:78::,2001:67c:78:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:84::,2001:67c:84:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:88::,2001:67c:88:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:8c::,2001:67c:8c:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:90::,2001:67c:90:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:94::,2001:67c:94:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:98::,2001:67c:98:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:9c::,2001:67c:9c:ffff:ffff:ffff:ffff:ffff,BE +2001:67c:a0::,2001:67c:a0:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:a4::,2001:67c:a4:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:a8::,2001:67c:a8:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:ac::,2001:67c:ac:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:b0::,2001:67c:b0:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:b4::,2001:67c:b4:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:b8::,2001:67c:b8:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:bc::,2001:67c:bc:ffff:ffff:ffff:ffff:ffff,EE +2001:67c:c4::,2001:67c:c4:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:c8::,2001:67c:c8:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:cc::,2001:67c:cc:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:d0::,2001:67c:d0:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:d4::,2001:67c:d4:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:d8::,2001:67c:d8:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:dc::,2001:67c:dc:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:e0::,2001:67c:e0:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:e4::,2001:67c:e4:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:e8::,2001:67c:e8:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:ec::,2001:67c:ec:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:f0::,2001:67c:f0:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:f4::,2001:67c:f4:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:f8::,2001:67c:f8:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:fc::,2001:67c:fc:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:100::,2001:67c:100:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:108::,2001:67c:108:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:10c::,2001:67c:10c:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:110::,2001:67c:110:ffff:ffff:ffff:ffff:ffff,FI +2001:67c:114::,2001:67c:114:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:118::,2001:67c:118:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:11c::,2001:67c:11c:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:120::,2001:67c:120:ffff:ffff:ffff:ffff:ffff,BE +2001:67c:124::,2001:67c:124:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:128::,2001:67c:128:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:12c::,2001:67c:12c:ffff:ffff:ffff:ffff:ffff,FI +2001:67c:130::,2001:67c:130:ffff:ffff:ffff:ffff:ffff,SA +2001:67c:134::,2001:67c:134:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:138::,2001:67c:138:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:13c::,2001:67c:13c:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:140::,2001:67c:140:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:148::,2001:67c:148:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:14c::,2001:67c:14d:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:154::,2001:67c:154:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:158::,2001:67c:158:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:15c::,2001:67c:15c:ffff:ffff:ffff:ffff:ffff,FI +2001:67c:160::,2001:67c:160:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:164::,2001:67c:164:ffff:ffff:ffff:ffff:ffff,FI +2001:67c:168::,2001:67c:168:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:170::,2001:67c:170:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:174::,2001:67c:174:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:178::,2001:67c:178:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:17c::,2001:67c:17c:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:180::,2001:67c:180:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:184::,2001:67c:184:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:188::,2001:67c:188:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:18c::,2001:67c:18c:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:190::,2001:67c:190:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:194::,2001:67c:194:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:19c::,2001:67c:19c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1a0::,2001:67c:1a0:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:1a4::,2001:67c:1a4:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:1a8::,2001:67c:1a8:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:1ac::,2001:67c:1ac:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:1b0::,2001:67c:1b0:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:1b4::,2001:67c:1b4:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:1b8::,2001:67c:1b8:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:1bc::,2001:67c:1bc:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:1c0::,2001:67c:1c0:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:1c4::,2001:67c:1c4:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:1c8::,2001:67c:1c8:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:1cc::,2001:67c:1cc:ffff:ffff:ffff:ffff:ffff,BE +2001:67c:1d0::,2001:67c:1d0:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:1d4::,2001:67c:1d4:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:1d8::,2001:67c:1d8:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:1dc::,2001:67c:1dc:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:1e0::,2001:67c:1e0:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:1e4::,2001:67c:1e4:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1e8::,2001:67c:1e8:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:1ec::,2001:67c:1ec:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:1f0::,2001:67c:1f0:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:1f4::,2001:67c:1f4:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:1f8::,2001:67c:1f8:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:1fc::,2001:67c:1fc:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:200::,2001:67c:200:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:204::,2001:67c:204:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:208::,2001:67c:208:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:20c::,2001:67c:20c:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:210::,2001:67c:210:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:218::,2001:67c:218:ffff:ffff:ffff:ffff:ffff,LT +2001:67c:21c::,2001:67c:21c:ffff:ffff:ffff:ffff:ffff,AM +2001:67c:220::,2001:67c:220:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:224::,2001:67c:224:ffff:ffff:ffff:ffff:ffff,FI +2001:67c:228::,2001:67c:228:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:22c::,2001:67c:22c:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:230::,2001:67c:230:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:234::,2001:67c:234:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:238::,2001:67c:238:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:23c::,2001:67c:23c:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:240::,2001:67c:240:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:244::,2001:67c:244:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:248::,2001:67c:248:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:24c::,2001:67c:24c:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:250::,2001:67c:250:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:254::,2001:67c:254:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:258::,2001:67c:258:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:25c::,2001:67c:25c:ffff:ffff:ffff:ffff:ffff,FI +2001:67c:260::,2001:67c:260:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:264::,2001:67c:264:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:268::,2001:67c:268:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:26c::,2001:67c:26c:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:270::,2001:67c:270:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:274::,2001:67c:274:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:278::,2001:67c:278:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:27c::,2001:67c:27c:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:280::,2001:67c:280:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:284::,2001:67c:284:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:288::,2001:67c:288:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:28c::,2001:67c:28c:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:294::,2001:67c:294:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:298::,2001:67c:298:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:29c::,2001:67c:29c:ffff:ffff:ffff:ffff:ffff,IT +2001:67c:2a0::,2001:67c:2a0:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2a4::,2001:67c:2a4:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2a8::,2001:67c:2a8:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:2ac::,2001:67c:2ac:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2b0::,2001:67c:2b0:ffff:ffff:ffff:ffff:ffff,FI +2001:67c:2b8::,2001:67c:2b8:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:2bc::,2001:67c:2bc:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2c0::,2001:67c:2c0:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:2c4::,2001:67c:2c4:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:2c8::,2001:67c:2c8:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2cc::,2001:67c:2cc:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2d0::,2001:67c:2d0:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2d4::,2001:67c:2d4:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2d8::,2001:67c:2d8:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:2dc::,2001:67c:2dc:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:2e0::,2001:67c:2e0:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2e4::,2001:67c:2e4:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2e8::,2001:67c:2e8:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2ec::,2001:67c:2ec:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2f4::,2001:67c:2f4:ffff:ffff:ffff:ffff:ffff,LU +2001:67c:2f8::,2001:67c:2f8:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:2fc::,2001:67c:2fc:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:300::,2001:67c:300:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:304::,2001:67c:304:ffff:ffff:ffff:ffff:ffff,BE +2001:67c:308::,2001:67c:308:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:30c::,2001:67c:30c:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:310::,2001:67c:310:ffff:ffff:ffff:ffff:ffff,CY +2001:67c:314::,2001:67c:314:ffff:ffff:ffff:ffff:ffff,BE +2001:67c:318::,2001:67c:318:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:31c::,2001:67c:31c:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:324::,2001:67c:324:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:328::,2001:67c:328:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:32c::,2001:67c:32c:ffff:ffff:ffff:ffff:ffff,EE +2001:67c:330::,2001:67c:330:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:334::,2001:67c:334:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:338::,2001:67c:338:ffff:ffff:ffff:ffff:ffff,IE +2001:67c:33c::,2001:67c:33c:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:340::,2001:67c:340:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:344::,2001:67c:344:ffff:ffff:ffff:ffff:ffff,BE +2001:67c:348::,2001:67c:348:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:34c::,2001:67c:34c:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:350::,2001:67c:350:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:354::,2001:67c:354:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:358::,2001:67c:358:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:35c::,2001:67c:35c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:360::,2001:67c:360:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:364::,2001:67c:364:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:368::,2001:67c:368:ffff:ffff:ffff:ffff:ffff,LV +2001:67c:36c::,2001:67c:36c:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:370::,2001:67c:370:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:374::,2001:67c:374:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:37c::,2001:67c:37c:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:380::,2001:67c:380:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:384::,2001:67c:384:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:388::,2001:67c:388:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:38c::,2001:67c:38c:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:390::,2001:67c:390:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:394::,2001:67c:394:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:398::,2001:67c:398:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:39c::,2001:67c:39c:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:3a0::,2001:67c:3a0:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:3a4::,2001:67c:3a4:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:3a8::,2001:67c:3a8:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:3ac::,2001:67c:3ac:ffff:ffff:ffff:ffff:ffff,RS +2001:67c:3b0::,2001:67c:3b0:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:3b4::,2001:67c:3b4:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:3b8::,2001:67c:3b8:ffff:ffff:ffff:ffff:ffff,IE +2001:67c:3bc::,2001:67c:3bc:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:3c0::,2001:67c:3c0:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:3c4::,2001:67c:3c4:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:3c8::,2001:67c:3c8:ffff:ffff:ffff:ffff:ffff,EE +2001:67c:3cc::,2001:67c:3cc:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:3d0::,2001:67c:3d0:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:3d4::,2001:67c:3d4:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:3d8::,2001:67c:3d8:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:3dc::,2001:67c:3dc:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:3e0::,2001:67c:3e0:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:3e4::,2001:67c:3e4:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:3e8::,2001:67c:3e9:ffff:ffff:ffff:ffff:ffff,SA +2001:67c:3f0::,2001:67c:3f0:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:3f4::,2001:67c:3f4:ffff:ffff:ffff:ffff:ffff,HR +2001:67c:3f8::,2001:67c:3f8:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:3fc::,2001:67c:3fc:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:400::,2001:67c:400:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:404::,2001:67c:404:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:408::,2001:67c:408:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:40c::,2001:67c:40c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:410::,2001:67c:410:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:414::,2001:67c:414:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:418::,2001:67c:418:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:41c::,2001:67c:41c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:420::,2001:67c:420:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:424::,2001:67c:424:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:428::,2001:67c:428:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:42c::,2001:67c:42c:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:430::,2001:67c:430:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:434::,2001:67c:434:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:438::,2001:67c:438:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:43c::,2001:67c:43c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:440::,2001:67c:440:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:444::,2001:67c:444:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:448::,2001:67c:448:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:44c::,2001:67c:44c:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:450::,2001:67c:450:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:454::,2001:67c:454:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:458::,2001:67c:458:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:45c::,2001:67c:45c:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:460::,2001:67c:460:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:464::,2001:67c:464:ffff:ffff:ffff:ffff:ffff,TR +2001:67c:468::,2001:67c:468:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:46c::,2001:67c:46c:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:470::,2001:67c:470:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:474::,2001:67c:474:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:478::,2001:67c:478:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:47c::,2001:67c:47c:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:480::,2001:67c:480:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:484::,2001:67c:484:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:488::,2001:67c:488:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:48c::,2001:67c:48c:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:490::,2001:67c:490:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:494::,2001:67c:494:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:498::,2001:67c:498:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:49c::,2001:67c:49c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:4a0::,2001:67c:4a0:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:4a4::,2001:67c:4a4:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:4a8::,2001:67c:4a8:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:4ac::,2001:67c:4ac:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:4b0::,2001:67c:4b0:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:4b4::,2001:67c:4b4:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:4b8::,2001:67c:4b8:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:4bc::,2001:67c:4bc:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:4c0::,2001:67c:4c0:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:4c4::,2001:67c:4c4:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:4c8::,2001:67c:4c8:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:4cc::,2001:67c:4cc:ffff:ffff:ffff:ffff:ffff,IL +2001:67c:4d0::,2001:67c:4d0:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:4d4::,2001:67c:4d4:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:4d8::,2001:67c:4d8:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:4dc::,2001:67c:4dc:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:4e4::,2001:67c:4e4:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:4e8::,2001:67c:4e8:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:4ec::,2001:67c:4ec:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:4f0::,2001:67c:4f0:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:4f4::,2001:67c:4f4:ffff:ffff:ffff:ffff:ffff,TR +2001:67c:4f8::,2001:67c:4f8:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:4fc::,2001:67c:4fc:ffff:ffff:ffff:ffff:ffff,BE +2001:67c:500::,2001:67c:500:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:504::,2001:67c:504:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:508::,2001:67c:508:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:50c::,2001:67c:50c:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:510::,2001:67c:510:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:514::,2001:67c:514:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:518::,2001:67c:518:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:51c::,2001:67c:51c:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:520::,2001:67c:520:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:524::,2001:67c:524:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:528::,2001:67c:528:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:530::,2001:67c:530:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:534::,2001:67c:534:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:538::,2001:67c:538:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:53c::,2001:67c:53c:ffff:ffff:ffff:ffff:ffff,HR +2001:67c:540::,2001:67c:540:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:544::,2001:67c:544:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:548::,2001:67c:548:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:54c::,2001:67c:54c:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:550::,2001:67c:550:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:554::,2001:67c:554:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:558::,2001:67c:558:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:55c::,2001:67c:55c:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:560::,2001:67c:560:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:564::,2001:67c:564:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:568::,2001:67c:568:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:56c::,2001:67c:56c:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:570::,2001:67c:570:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:574::,2001:67c:574:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:578::,2001:67c:578:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:57c::,2001:67c:57c:ffff:ffff:ffff:ffff:ffff,BY +2001:67c:580::,2001:67c:580:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:584::,2001:67c:584:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:588::,2001:67c:588:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:58c::,2001:67c:58c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:590::,2001:67c:590:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:594::,2001:67c:594:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:598::,2001:67c:598:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:59c::,2001:67c:59c:ffff:ffff:ffff:ffff:ffff,HU +2001:67c:5a0::,2001:67c:5a1:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:5a8::,2001:67c:5a8:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:5ac::,2001:67c:5ac:ffff:ffff:ffff:ffff:ffff,BY +2001:67c:5b0::,2001:67c:5b0:ffff:ffff:ffff:ffff:ffff,LV +2001:67c:5b4::,2001:67c:5b4:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:5b8::,2001:67c:5b8:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:5bc::,2001:67c:5bc:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:5c0::,2001:67c:5c0:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:5c4::,2001:67c:5c4:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:5c8::,2001:67c:5c8:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:5cc::,2001:67c:5cc:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:5d0::,2001:67c:5d0:ffff:ffff:ffff:ffff:ffff,LV +2001:67c:5d4::,2001:67c:5d4:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:5d8::,2001:67c:5d8:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:5dc::,2001:67c:5dc:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:5e0::,2001:67c:5e0:ffff:ffff:ffff:ffff:ffff,TR +2001:67c:5e4::,2001:67c:5e4:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:5e8::,2001:67c:5e8:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:5ec::,2001:67c:5ec:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:5f0::,2001:67c:5f0:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:5f4::,2001:67c:5f4:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:5f8::,2001:67c:5f8:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:5fc::,2001:67c:5fc:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:600::,2001:67c:600:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:604::,2001:67c:604:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:608::,2001:67c:608:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:60c::,2001:67c:60c:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:610::,2001:67c:610:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:61c::,2001:67c:61c:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:620::,2001:67c:620:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:624::,2001:67c:624:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:628::,2001:67c:628:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:62c::,2001:67c:62c:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:630::,2001:67c:630:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:634::,2001:67c:634:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:638::,2001:67c:638:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:63c::,2001:67c:63c:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:640::,2001:67c:640:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:644::,2001:67c:644:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:648::,2001:67c:648:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:64c::,2001:67c:64c:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:650::,2001:67c:650:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:654::,2001:67c:654:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:658::,2001:67c:658:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:65c::,2001:67c:65c:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:660::,2001:67c:660:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:664::,2001:67c:664:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:668::,2001:67c:668:ffff:ffff:ffff:ffff:ffff,MD +2001:67c:66c::,2001:67c:66c:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:670::,2001:67c:670:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:674::,2001:67c:674:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:678::,2001:67c:678:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:67c::,2001:67c:67c:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:680::,2001:67c:680:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:684::,2001:67c:684:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:688::,2001:67c:688:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:68c::,2001:67c:68c:ffff:ffff:ffff:ffff:ffff,TR +2001:67c:690::,2001:67c:690:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:694::,2001:67c:694:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:698::,2001:67c:698:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:69c::,2001:67c:69c:ffff:ffff:ffff:ffff:ffff,RS +2001:67c:6a0::,2001:67c:6a0:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:6a4::,2001:67c:6a4:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:6a8::,2001:67c:6a8:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:6ac::,2001:67c:6ac:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:6b0::,2001:67c:6b0:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:6b4::,2001:67c:6b4:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:6b8::,2001:67c:6b8:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:6bc::,2001:67c:6bc:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:6c0::,2001:67c:6c0:ffff:ffff:ffff:ffff:ffff,TR +2001:67c:6c4::,2001:67c:6c4:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:6c8::,2001:67c:6c8:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:6cc::,2001:67c:6cc:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:6d0::,2001:67c:6d0:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:6d4::,2001:67c:6d4:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:6d8::,2001:67c:6d8:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:6dc::,2001:67c:6dc:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:6e0::,2001:67c:6e0:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:6e4::,2001:67c:6e4:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:6e8::,2001:67c:6e8:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:6ec::,2001:67c:6ec:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:6f0::,2001:67c:6f0:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:6f4::,2001:67c:6f4:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:6fc::,2001:67c:6fc:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:700::,2001:67c:700:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:704::,2001:67c:704:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:708::,2001:67c:708:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:70c::,2001:67c:70c:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:710::,2001:67c:710:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:714::,2001:67c:714:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:718::,2001:67c:718:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:71c::,2001:67c:71c:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:720::,2001:67c:720:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:724::,2001:67c:724:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:728::,2001:67c:728:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:72c::,2001:67c:72c:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:730::,2001:67c:730:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:734::,2001:67c:734:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:738::,2001:67c:738:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:73c::,2001:67c:73c:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:740::,2001:67c:740:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:744::,2001:67c:744:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:748::,2001:67c:748:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:74c::,2001:67c:74c:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:750::,2001:67c:750:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:754::,2001:67c:754:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:758::,2001:67c:758:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:75c::,2001:67c:75c:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:760::,2001:67c:760:ffff:ffff:ffff:ffff:ffff,LV +2001:67c:764::,2001:67c:764:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:768::,2001:67c:768:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:76c::,2001:67c:76c:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:770::,2001:67c:771:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:778::,2001:67c:778:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:77c::,2001:67c:77c:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:784::,2001:67c:784:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:788::,2001:67c:788:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:78c::,2001:67c:78c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:790::,2001:67c:790:ffff:ffff:ffff:ffff:ffff,IT +2001:67c:794::,2001:67c:794:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:798::,2001:67c:798:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:79c::,2001:67c:79c:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:7a0::,2001:67c:7a0:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:7a4::,2001:67c:7a4:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:7a8::,2001:67c:7a8:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:7ac::,2001:67c:7ac:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:7b0::,2001:67c:7b0:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:7b4::,2001:67c:7b4:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:7b8::,2001:67c:7b8:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:7c0::,2001:67c:7c3:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:7d0::,2001:67c:7d0:ffff:ffff:ffff:ffff:ffff,LV +2001:67c:7d4::,2001:67c:7d4:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:7d8::,2001:67c:7d8:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:7dc::,2001:67c:7dc:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:7e0::,2001:67c:7e0:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:7e4::,2001:67c:7e4:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:7e8::,2001:67c:7e8:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:7ec::,2001:67c:7ec:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:7f0::,2001:67c:7f0:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:7f4::,2001:67c:7f4:ffff:ffff:ffff:ffff:ffff,KW +2001:67c:7f8::,2001:67c:7f8:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:7fc::,2001:67c:7fc:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:1000::,2001:67c:1001:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1008::,2001:67c:1009:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:1010::,2001:67c:1011:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1018::,2001:67c:1019:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:1020::,2001:67c:1021:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:1028::,2001:67c:1029:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:1030::,2001:67c:1030:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:1034::,2001:67c:1034:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:1038::,2001:67c:1038:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:103c::,2001:67c:103c:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:1040::,2001:67c:1040:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:1044::,2001:67c:1044:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:1048::,2001:67c:1048:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:104c::,2001:67c:104c:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:1054::,2001:67c:1054:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:1058::,2001:67c:1058:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:105c::,2001:67c:105c:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:1060::,2001:67c:1060:ffff:ffff:ffff:ffff:ffff,LU +2001:67c:1064::,2001:67c:1064:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:1068::,2001:67c:1068:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:106c::,2001:67c:106c:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:1070::,2001:67c:1071:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:1078::,2001:67c:1078:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:107c::,2001:67c:107c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1080::,2001:67c:1080:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:1084::,2001:67c:1084:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1090::,2001:67c:1090:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:1098::,2001:67c:1098:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:109c::,2001:67c:109c:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:10a0::,2001:67c:10a0:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:10a4::,2001:67c:10a4:ffff:ffff:ffff:ffff:ffff,FI +2001:67c:10a8::,2001:67c:10a9:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:10b0::,2001:67c:10b0:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:10b4::,2001:67c:10b4:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:10b8::,2001:67c:10b8:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:10bc::,2001:67c:10bc:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:10c0::,2001:67c:10c0:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:10c4::,2001:67c:10c4:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:10c8::,2001:67c:10c8:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:10cc::,2001:67c:10cc:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:10d0::,2001:67c:10d0:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:10d4::,2001:67c:10d4:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:10d8::,2001:67c:10d8:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:10dc::,2001:67c:10dc:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:10e0::,2001:67c:10e0:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:10e4::,2001:67c:10e4:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:10e8::,2001:67c:10e8:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:10ec::,2001:67c:10ec:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:10f0::,2001:67c:10f0:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:10f4::,2001:67c:10f4:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:10f8::,2001:67c:10f8:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:10fc::,2001:67c:10fc:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1100::,2001:67c:1100:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:1104::,2001:67c:1104:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1108::,2001:67c:1109:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:1110::,2001:67c:1111:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:1118::,2001:67c:1118:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:111c::,2001:67c:111c:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:1120::,2001:67c:1120:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:1124::,2001:67c:1124:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:1128::,2001:67c:1128:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:112c::,2001:67c:112c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1130::,2001:67c:1130:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1134::,2001:67c:1134:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:1138::,2001:67c:1138:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:113c::,2001:67c:113c:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:1140::,2001:67c:1140:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:1144::,2001:67c:1144:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:1148::,2001:67c:1148:ffff:ffff:ffff:ffff:ffff,ES +2001:67c:114c::,2001:67c:114c:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:1150::,2001:67c:1150:ffff:ffff:ffff:ffff:ffff,IL +2001:67c:1154::,2001:67c:1154:ffff:ffff:ffff:ffff:ffff,TR +2001:67c:1158::,2001:67c:1158:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:115c::,2001:67c:115c:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:1160::,2001:67c:1160:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:1164::,2001:67c:1164:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:116c::,2001:67c:116c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1170::,2001:67c:1170:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:1174::,2001:67c:1174:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1178::,2001:67c:1178:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:117c::,2001:67c:117c:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:1184::,2001:67c:1184:ffff:ffff:ffff:ffff:ffff,HR +2001:67c:1188::,2001:67c:1188:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:118c::,2001:67c:118c:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:1190::,2001:67c:1190:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:1194::,2001:67c:1194:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:1198::,2001:67c:1199:ffff:ffff:ffff:ffff:ffff,SA +2001:67c:11a0::,2001:67c:11a0:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:11a4::,2001:67c:11a4:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:11a8::,2001:67c:11a8:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:11ac::,2001:67c:11ac:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:11b0::,2001:67c:11b0:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:11b4::,2001:67c:11b4:ffff:ffff:ffff:ffff:ffff,ES +2001:67c:11b8::,2001:67c:11b8:ffff:ffff:ffff:ffff:ffff,TR +2001:67c:11bc::,2001:67c:11bc:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:11c0::,2001:67c:11c0:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:11c4::,2001:67c:11c4:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:11c8::,2001:67c:11c8:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:11cc::,2001:67c:11cc:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:11d0::,2001:67c:11d0:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:11d4::,2001:67c:11d4:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:11d8::,2001:67c:11d8:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:11dc::,2001:67c:11dc:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:11e0::,2001:67c:11e0:ffff:ffff:ffff:ffff:ffff,BG +2001:67c:11e4::,2001:67c:11e4:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:11e8::,2001:67c:11e8:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:11ec::,2001:67c:11ec:ffff:ffff:ffff:ffff:ffff,TR +2001:67c:11f4::,2001:67c:11f4:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:11f8::,2001:67c:11f8:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:11fc::,2001:67c:11fc:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:1200::,2001:67c:1203:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:1210::,2001:67c:1213:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:1220::,2001:67c:1223:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:1230::,2001:67c:1233:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:1240::,2001:67c:1240:ffff:ffff:ffff:ffff:ffff,IE +2001:67c:1244::,2001:67c:1244:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1248::,2001:67c:1248:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:124c::,2001:67c:124c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1254::,2001:67c:1254:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:125c::,2001:67c:125c:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:1260::,2001:67c:1260:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:1264::,2001:67c:1264:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:1268::,2001:67c:1268:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:126c::,2001:67c:126c:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:1270::,2001:67c:1270:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:1274::,2001:67c:1274:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:1278::,2001:67c:1278:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:1280::,2001:67c:1280:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:1284::,2001:67c:1284:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:1288::,2001:67c:1288:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:128c::,2001:67c:128c:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:1294::,2001:67c:1294:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:129c::,2001:67c:129c:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:12a0::,2001:67c:12a0:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:12a4::,2001:67c:12a4:ffff:ffff:ffff:ffff:ffff,TR +2001:67c:12a8::,2001:67c:12a8:ffff:ffff:ffff:ffff:ffff,FI +2001:67c:12ac::,2001:67c:12ac:ffff:ffff:ffff:ffff:ffff,LU +2001:67c:12b0::,2001:67c:12b0:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:12b4::,2001:67c:12b4:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:12b8::,2001:67c:12b8:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:12bc::,2001:67c:12bc:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:12c0::,2001:67c:12c1:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:12c8::,2001:67c:12c8:ffff:ffff:ffff:ffff:ffff,LV +2001:67c:12cc::,2001:67c:12cc:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:12d0::,2001:67c:12d0:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:12d4::,2001:67c:12d4:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:12d8::,2001:67c:12d8:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:12dc::,2001:67c:12dc:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:12e0::,2001:67c:12e0:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:12e4::,2001:67c:12e4:ffff:ffff:ffff:ffff:ffff,SA +2001:67c:12e8::,2001:67c:12e9:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:12f4::,2001:67c:12f4:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:12f8::,2001:67c:12f8:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:12fc::,2001:67c:12fc:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:1300::,2001:67c:1300:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:1304::,2001:67c:1304:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:1308::,2001:67c:1308:ffff:ffff:ffff:ffff:ffff,MD +2001:67c:130c::,2001:67c:130c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1310::,2001:67c:1310:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:1314::,2001:67c:1314:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:1318::,2001:67c:1318:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:131c::,2001:67c:131c:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:1320::,2001:67c:1320:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:1324::,2001:67c:1324:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:1328::,2001:67c:1328:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:132c::,2001:67c:132c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1330::,2001:67c:1330:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:1334::,2001:67c:1334:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:1338::,2001:67c:1338:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:133c::,2001:67c:133c:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:1340::,2001:67c:1340:ffff:ffff:ffff:ffff:ffff,HR +2001:67c:1348::,2001:67c:1348:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:134c::,2001:67c:134c:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:1350::,2001:67c:1350:ffff:ffff:ffff:ffff:ffff,CY +2001:67c:1354::,2001:67c:1354:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:1358::,2001:67c:1358:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:135c::,2001:67c:135c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1360::,2001:67c:1360:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:1364::,2001:67c:1364:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:1368::,2001:67c:1368:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:136c::,2001:67c:136c:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:1370::,2001:67c:1370:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:1374::,2001:67c:1374:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:1378::,2001:67c:1378:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:137c::,2001:67c:137c:ffff:ffff:ffff:ffff:ffff,ES +2001:67c:1380::,2001:67c:1380:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:1384::,2001:67c:1384:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1388::,2001:67c:1388:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:138c::,2001:67c:138c:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:1390::,2001:67c:1390:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1394::,2001:67c:1394:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:1398::,2001:67c:1398:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:139c::,2001:67c:139c:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:13a0::,2001:67c:13a0:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:13a8::,2001:67c:13a8:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:13ac::,2001:67c:13ac:ffff:ffff:ffff:ffff:ffff,FI +2001:67c:13b0::,2001:67c:13b0:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:13b4::,2001:67c:13b4:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:13b8::,2001:67c:13b8:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:13bc::,2001:67c:13bc:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:13c0::,2001:67c:13c0:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:13c4::,2001:67c:13c4:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:13c8::,2001:67c:13c8:ffff:ffff:ffff:ffff:ffff,LV +2001:67c:13cc::,2001:67c:13cc:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:13d0::,2001:67c:13d0:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:13d4::,2001:67c:13d4:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:13d8::,2001:67c:13d8:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:13e0::,2001:67c:13e0:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:13e4::,2001:67c:13e4:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:13e8::,2001:67c:13e8:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:13ec::,2001:67c:13ec:ffff:ffff:ffff:ffff:ffff,PT +2001:67c:13f0::,2001:67c:13f0:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:13f4::,2001:67c:13f4:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:13f8::,2001:67c:13f8:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:1400::,2001:67c:1407:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:1420::,2001:67c:1427:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:1440::,2001:67c:1447:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:1460::,2001:67c:1467:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:1480::,2001:67c:1480:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:1484::,2001:67c:1484:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:1488::,2001:67c:1488:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:148c::,2001:67c:148c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1490::,2001:67c:1490:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1494::,2001:67c:1494:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:1498::,2001:67c:1498:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:149c::,2001:67c:149c:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:14a0::,2001:67c:14a0:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:14a4::,2001:67c:14a4:ffff:ffff:ffff:ffff:ffff,BG +2001:67c:14ac::,2001:67c:14ac:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:14b0::,2001:67c:14b0:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:14b4::,2001:67c:14b4:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:14b8::,2001:67c:14b8:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:14bc::,2001:67c:14bc:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:14c4::,2001:67c:14c4:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:14d0::,2001:67c:14d0:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:14d4::,2001:67c:14d4:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:14d8::,2001:67c:14d8:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:14dc::,2001:67c:14dc:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:14e0::,2001:67c:14e7:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:1500::,2001:67c:1500:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1504::,2001:67c:1504:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1508::,2001:67c:1508:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:150c::,2001:67c:150c:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:1510::,2001:67c:1510:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:1514::,2001:67c:1514:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:1518::,2001:67c:1518:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:151c::,2001:67c:151c:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:1520::,2001:67c:1520:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:1524::,2001:67c:1524:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:1528::,2001:67c:1528:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:152c::,2001:67c:152c:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:1530::,2001:67c:1530:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:1534::,2001:67c:1534:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1538::,2001:67c:1538:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:153c::,2001:67c:153c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1540::,2001:67c:1540:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:1544::,2001:67c:1544:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:154c::,2001:67c:154c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1554::,2001:67c:1554:ffff:ffff:ffff:ffff:ffff,TR +2001:67c:1558::,2001:67c:1558:ffff:ffff:ffff:ffff:ffff,TR +2001:67c:155c::,2001:67c:155c:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:1560::,2001:67c:1563:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:1570::,2001:67c:1570:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:1574::,2001:67c:1574:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:1578::,2001:67c:1578:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:157c::,2001:67c:157c:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:1580::,2001:67c:1580:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:1584::,2001:67c:1584:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:158c::,2001:67c:158c:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:1590::,2001:67c:1591:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:1598::,2001:67c:1598:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:159c::,2001:67c:159c:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:15a0::,2001:67c:15a3:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:15b0::,2001:67c:15b0:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:15b8::,2001:67c:15b8:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:15bc::,2001:67c:15bc:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:15c0::,2001:67c:15c0:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:15c4::,2001:67c:15c4:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:15c8::,2001:67c:15c8:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:15cc::,2001:67c:15cc:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:15d0::,2001:67c:15d0:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:15d4::,2001:67c:15d4:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:15d8::,2001:67c:15d8:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:15dc::,2001:67c:15dc:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:15e0::,2001:67c:15e0:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:15e4::,2001:67c:15e4:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:15e8::,2001:67c:15e8:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:15ec::,2001:67c:15ec:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:15f0::,2001:67c:15f0:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:15f4::,2001:67c:15f4:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:15f8::,2001:67c:15f8:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:15fc::,2001:67c:15fc:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1600::,2001:67c:160f:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:1640::,2001:67c:164f:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:1680::,2001:67c:1680:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:1684::,2001:67c:1684:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:1688::,2001:67c:1688:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:168c::,2001:67c:168c:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:1690::,2001:67c:1690:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:1694::,2001:67c:1694:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:1698::,2001:67c:1698:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:169c::,2001:67c:169c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:16a0::,2001:67c:16a0:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:16a4::,2001:67c:16a4:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:16a8::,2001:67c:16a8:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:16ac::,2001:67c:16ac:ffff:ffff:ffff:ffff:ffff,ES +2001:67c:16b0::,2001:67c:16b0:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:16b4::,2001:67c:16b4:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:16b8::,2001:67c:16b8:ffff:ffff:ffff:ffff:ffff,BG +2001:67c:16bc::,2001:67c:16bc:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:16c0::,2001:67c:16c0:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:16c4::,2001:67c:16c4:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:16c8::,2001:67c:16c8:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:16d0::,2001:67c:16d1:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:16d8::,2001:67c:16d8:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:16dc::,2001:67c:16dc:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:16e0::,2001:67c:16e0:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:16e4::,2001:67c:16e4:ffff:ffff:ffff:ffff:ffff,HR +2001:67c:16e8::,2001:67c:16e8:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:16ec::,2001:67c:16ec:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:16f0::,2001:67c:16f0:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:16f4::,2001:67c:16f4:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:16f8::,2001:67c:16f8:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:16fc::,2001:67c:16fc:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1700::,2001:67c:1700:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:1704::,2001:67c:1704:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:1708::,2001:67c:1708:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:170c::,2001:67c:170c:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:1710::,2001:67c:1710:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:1720::,2001:67c:1720:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:1724::,2001:67c:1724:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:1728::,2001:67c:1728:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:172c::,2001:67c:172c:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:1730::,2001:67c:1730:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:1734::,2001:67c:1734:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:1738::,2001:67c:1738:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:173c::,2001:67c:173c:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:1740::,2001:67c:1740:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:1744::,2001:67c:1744:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:1748::,2001:67c:1748:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:174c::,2001:67c:174c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1750::,2001:67c:1750:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:1754::,2001:67c:1754:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1758::,2001:67c:1758:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:175c::,2001:67c:175c:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:1760::,2001:67c:1760:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:1764::,2001:67c:1764:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:1768::,2001:67c:1768:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:176c::,2001:67c:176c:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:1770::,2001:67c:1770:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1774::,2001:67c:1774:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:177c::,2001:67c:177c:ffff:ffff:ffff:ffff:ffff,LT +2001:67c:1780::,2001:67c:1780:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:1784::,2001:67c:1784:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1788::,2001:67c:1788:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:178c::,2001:67c:178c:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:1790::,2001:67c:1790:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:1794::,2001:67c:1794:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1798::,2001:67c:1798:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:179c::,2001:67c:179c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:17a0::,2001:67c:17a0:ffff:ffff:ffff:ffff:ffff,FI +2001:67c:17a8::,2001:67c:17a8:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:17ac::,2001:67c:17ac:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:17b0::,2001:67c:17b0:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:17b4::,2001:67c:17b4:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:17b8::,2001:67c:17b8:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:17bc::,2001:67c:17bc:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:17c0::,2001:67c:17c0:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:17c4::,2001:67c:17c4:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:17c8::,2001:67c:17c8:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:17cc::,2001:67c:17cc:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:17d0::,2001:67c:17d0:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:17d4::,2001:67c:17d4:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:17d8::,2001:67c:17d8:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:17dc::,2001:67c:17dc:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:17e0::,2001:67c:17e0:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:17e4::,2001:67c:17e4:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:17e8::,2001:67c:17e8:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:17ec::,2001:67c:17ec:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:17f0::,2001:67c:17f0:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:17f4::,2001:67c:17f4:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:17f8::,2001:67c:17f8:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:17fc::,2001:67c:17fc:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:1800::,2001:67c:1800:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1804::,2001:67c:1804:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:1808::,2001:67c:1809:ffff:ffff:ffff:ffff:ffff,BE +2001:67c:1810::,2001:67c:1810:ffff:ffff:ffff:ffff:ffff,BE +2001:67c:1814::,2001:67c:1814:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:1818::,2001:67c:1818:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:181c::,2001:67c:181c:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:1820::,2001:67c:1820:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:1828::,2001:67c:1828:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:182c::,2001:67c:182c:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:1830::,2001:67c:1830:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1834::,2001:67c:1834:ffff:ffff:ffff:ffff:ffff,BE +2001:67c:1838::,2001:67c:1838:ffff:ffff:ffff:ffff:ffff,BE +2001:67c:183c::,2001:67c:183c:ffff:ffff:ffff:ffff:ffff,BE +2001:67c:1840::,2001:67c:1840:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:1844::,2001:67c:1844:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:1848::,2001:67c:1848:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:184c::,2001:67c:184c:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:1854::,2001:67c:1854:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:1858::,2001:67c:1858:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:185c::,2001:67c:185c:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:1860::,2001:67c:1860:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:1864::,2001:67c:1864:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:1868::,2001:67c:1868:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:186c::,2001:67c:186c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1870::,2001:67c:1870:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:1874::,2001:67c:1874:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:1878::,2001:67c:1878:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:187c::,2001:67c:187c:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:1880::,2001:67c:1880:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1884::,2001:67c:1884:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:1888::,2001:67c:1888:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:188c::,2001:67c:188c:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:1890::,2001:67c:1890:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1894::,2001:67c:1894:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1898::,2001:67c:1898:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:189c::,2001:67c:189c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:18a0::,2001:67c:18a0:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:18a4::,2001:67c:18a4:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:18a8::,2001:67c:18a8:ffff:ffff:ffff:ffff:ffff,BY +2001:67c:18ac::,2001:67c:18ac:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:18b0::,2001:67c:18b0:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:18b4::,2001:67c:18b4:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:18b8::,2001:67c:18b8:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:18bc::,2001:67c:18bc:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:18c0::,2001:67c:18c0:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:18c4::,2001:67c:18c4:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:18c8::,2001:67c:18c9:ffff:ffff:ffff:ffff:ffff,SA +2001:67c:18d0::,2001:67c:18d0:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:18d4::,2001:67c:18d4:ffff:ffff:ffff:ffff:ffff,NZ +2001:67c:18d8::,2001:67c:18d8:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:18dc::,2001:67c:18dc:ffff:ffff:ffff:ffff:ffff,LI +2001:67c:18e0::,2001:67c:18e0:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:18e4::,2001:67c:18e4:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:18e8::,2001:67c:18e8:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:18ec::,2001:67c:18ec:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:18f0::,2001:67c:18f0:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:18f4::,2001:67c:18f4:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:18f8::,2001:67c:18f8:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:18fc::,2001:67c:18fc:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1900::,2001:67c:1903:ffff:ffff:ffff:ffff:ffff,BE +2001:67c:1910::,2001:67c:1910:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1918::,2001:67c:1918:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:191c::,2001:67c:191c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1920::,2001:67c:1920:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1924::,2001:67c:1924:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:1928::,2001:67c:1928:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:1930::,2001:67c:1933:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:1940::,2001:67c:1940:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:1944::,2001:67c:1944:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:1948::,2001:67c:1948:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:194c::,2001:67c:194c:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:1950::,2001:67c:1950:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:1954::,2001:67c:1954:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:1958::,2001:67c:1958:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:195c::,2001:67c:195c:ffff:ffff:ffff:ffff:ffff,ES +2001:67c:1960::,2001:67c:1960:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:1964::,2001:67c:1964:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:1968::,2001:67c:1968:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:196c::,2001:67c:196c:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:1970::,2001:67c:1970:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:1974::,2001:67c:1974:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:1978::,2001:67c:1978:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:197c::,2001:67c:197c:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:1980::,2001:67c:1980:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:1984::,2001:67c:1984:ffff:ffff:ffff:ffff:ffff,BG +2001:67c:1988::,2001:67c:1988:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:198c::,2001:67c:198c:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:1990::,2001:67c:1990:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:1994::,2001:67c:1994:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:1998::,2001:67c:1998:ffff:ffff:ffff:ffff:ffff,LU +2001:67c:19a0::,2001:67c:19a0:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:19a4::,2001:67c:19a4:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:19a8::,2001:67c:19a8:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:19ac::,2001:67c:19ac:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:19b0::,2001:67c:19b3:ffff:ffff:ffff:ffff:ffff,FI +2001:67c:19c0::,2001:67c:19c0:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:19c4::,2001:67c:19c4:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:19c8::,2001:67c:19c8:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:19cc::,2001:67c:19cc:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:19d0::,2001:67c:19d0:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:19d4::,2001:67c:19d4:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:19d8::,2001:67c:19d8:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:19dc::,2001:67c:19dc:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:19e0::,2001:67c:19e0:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:19e4::,2001:67c:19e4:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:19e8::,2001:67c:19e8:ffff:ffff:ffff:ffff:ffff,TR +2001:67c:19ec::,2001:67c:19ec:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:19f0::,2001:67c:19f0:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:19f4::,2001:67c:19f4:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:19f8::,2001:67c:19f8:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:19fc::,2001:67c:19fc:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:1a00::,2001:67c:1a3f:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:1b00::,2001:67c:1b00:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:1b04::,2001:67c:1b04:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:1b08::,2001:67c:1b08:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:1b0c::,2001:67c:1b0c:ffff:ffff:ffff:ffff:ffff,SA +2001:67c:1b10::,2001:67c:1b10:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:1b14::,2001:67c:1b14:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1b18::,2001:67c:1b18:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:1b1c::,2001:67c:1b1c:ffff:ffff:ffff:ffff:ffff,LU +2001:67c:1b20::,2001:67c:1b20:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:1b24::,2001:67c:1b24:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:1b30::,2001:67c:1b30:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:1b34::,2001:67c:1b34:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:1b3c::,2001:67c:1b3c:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:1b40::,2001:67c:1b43:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:1b50::,2001:67c:1b50:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:1b54::,2001:67c:1b54:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:1b58::,2001:67c:1b59:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:1b60::,2001:67c:1b60:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:1b64::,2001:67c:1b64:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:1b6c::,2001:67c:1b6c:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:1b70::,2001:67c:1b70:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:1b78::,2001:67c:1b78:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:1b7c::,2001:67c:1b7c:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:1b80::,2001:67c:1b80:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:1b84::,2001:67c:1b84:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:1b88::,2001:67c:1b88:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:1b8c::,2001:67c:1b8c:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:1b90::,2001:67c:1b90:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:1b94::,2001:67c:1b94:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:1b98::,2001:67c:1b98:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1b9c::,2001:67c:1b9c:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:1ba4::,2001:67c:1ba4:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1ba8::,2001:67c:1ba8:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:1bb0::,2001:67c:1bb0:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:1bb4::,2001:67c:1bb4:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:1bb8::,2001:67c:1bb8:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:1bbc::,2001:67c:1bbc:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:1bc0::,2001:67c:1bc0:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:1bc4::,2001:67c:1bc4:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:1bc8::,2001:67c:1bc8:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:1bcc::,2001:67c:1bcc:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:1bd0::,2001:67c:1bd0:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:1bd4::,2001:67c:1bd4:ffff:ffff:ffff:ffff:ffff,SK +2001:67c:1bd8::,2001:67c:1bd8:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:1bdc::,2001:67c:1bdc:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:1be0::,2001:67c:1be0:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:1be4::,2001:67c:1be4:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:1be8::,2001:67c:1be8:ffff:ffff:ffff:ffff:ffff,FI +2001:67c:1bec::,2001:67c:1bec:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:1bf4::,2001:67c:1bf4:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:1bf8::,2001:67c:1bf8:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:1bfc::,2001:67c:1bfc:ffff:ffff:ffff:ffff:ffff,BG +2001:67c:1c00::,2001:67c:1cff:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:2004::,2001:67c:2004:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:2008::,2001:67c:2008:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:200c::,2001:67c:200c:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2010::,2001:67c:2010:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2014::,2001:67c:2014:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:2018::,2001:67c:2018:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2020::,2001:67c:2020:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:2024::,2001:67c:2024:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:2028::,2001:67c:2028:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2030::,2001:67c:2030:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:2034::,2001:67c:2034:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:2038::,2001:67c:2038:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:203c::,2001:67c:203c:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:2040::,2001:67c:2040:ffff:ffff:ffff:ffff:ffff,AE +2001:67c:2044::,2001:67c:2044:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2048::,2001:67c:2048:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:204c::,2001:67c:204c:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:2050::,2001:67c:2050:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:205c::,2001:67c:205c:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2060::,2001:67c:2060:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2064::,2001:67c:2064:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:2068::,2001:67c:2068:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:206c::,2001:67c:206c:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:2070::,2001:67c:2070:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:2074::,2001:67c:2074:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:2078::,2001:67c:2078:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:207c::,2001:67c:207c:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2080::,2001:67c:2080:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:2084::,2001:67c:2084:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2088::,2001:67c:2088:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:208c::,2001:67c:208c:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:20a0::,2001:67c:20a1:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:20a8::,2001:67c:20a8:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:20ac::,2001:67c:20ac:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:20b0::,2001:67c:20b0:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:20b4::,2001:67c:20b4:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:20b8::,2001:67c:20b9:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:20c0::,2001:67c:20c0:ffff:ffff:ffff:ffff:ffff,FI +2001:67c:20c4::,2001:67c:20c4:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:20c8::,2001:67c:20c8:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:20cc::,2001:67c:20cc:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:20d0::,2001:67c:20d1:ffff:ffff:ffff:ffff:ffff,BG +2001:67c:20d8::,2001:67c:20d8:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:20dc::,2001:67c:20dc:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:20e0::,2001:67c:20e0:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:20e4::,2001:67c:20e4:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:20e8::,2001:67c:20e8:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:20ec::,2001:67c:20ec:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:20f0::,2001:67c:20f0:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:20f4::,2001:67c:20f4:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:20f8::,2001:67c:20f8:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:2100::,2001:67c:2100:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:2104::,2001:67c:2104:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2108::,2001:67c:2108:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:210c::,2001:67c:210c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2110::,2001:67c:2110:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:2114::,2001:67c:2114:ffff:ffff:ffff:ffff:ffff,IS +2001:67c:2118::,2001:67c:2118:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:211c::,2001:67c:211c:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:2120::,2001:67c:2120:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:2124::,2001:67c:2124:ffff:ffff:ffff:ffff:ffff,HU +2001:67c:2128::,2001:67c:2128:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:212c::,2001:67c:212c:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:2130::,2001:67c:2130:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2134::,2001:67c:2134:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2138::,2001:67c:2138:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:213c::,2001:67c:213c:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2144::,2001:67c:2144:ffff:ffff:ffff:ffff:ffff,FI +2001:67c:2148::,2001:67c:2148:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:214c::,2001:67c:214c:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2150::,2001:67c:2150:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2154::,2001:67c:2154:ffff:ffff:ffff:ffff:ffff,BG +2001:67c:2158::,2001:67c:2158:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:215c::,2001:67c:215c:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2160::,2001:67c:2160:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:2164::,2001:67c:2164:ffff:ffff:ffff:ffff:ffff,SA +2001:67c:2168::,2001:67c:2168:ffff:ffff:ffff:ffff:ffff,FI +2001:67c:216c::,2001:67c:216c:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:2170::,2001:67c:2170:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:2174::,2001:67c:2174:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:2178::,2001:67c:2178:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:217c::,2001:67c:217c:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:2180::,2001:67c:2180:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:2188::,2001:67c:2188:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:218c::,2001:67c:218c:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:2190::,2001:67c:2190:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:2194::,2001:67c:2194:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:2198::,2001:67c:2198:ffff:ffff:ffff:ffff:ffff,LV +2001:67c:219c::,2001:67c:219c:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:21a0::,2001:67c:21a0:ffff:ffff:ffff:ffff:ffff,IT +2001:67c:21a4::,2001:67c:21a4:ffff:ffff:ffff:ffff:ffff,FI +2001:67c:21a8::,2001:67c:21a8:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:21ac::,2001:67c:21ac:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:21b0::,2001:67c:21b0:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:21b4::,2001:67c:21b4:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:21b8::,2001:67c:21b8:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:21c0::,2001:67c:21c0:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:21c4::,2001:67c:21c4:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:21c8::,2001:67c:21c8:ffff:ffff:ffff:ffff:ffff,BG +2001:67c:21cc::,2001:67c:21cc:ffff:ffff:ffff:ffff:ffff,ES +2001:67c:21d0::,2001:67c:21d0:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:21d8::,2001:67c:21d8:ffff:ffff:ffff:ffff:ffff,FI +2001:67c:21dc::,2001:67c:21dc:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:21e0::,2001:67c:21e0:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:21e4::,2001:67c:21e4:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:21e8::,2001:67c:21e8:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:21ec::,2001:67c:21ec:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:21f0::,2001:67c:21f0:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:21f4::,2001:67c:21f4:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:21f8::,2001:67c:21f8:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:21fc::,2001:67c:21fc:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2200::,2001:67c:2200:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:2204::,2001:67c:2204:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:2208::,2001:67c:2208:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:220c::,2001:67c:220c:ffff:ffff:ffff:ffff:ffff,BG +2001:67c:2210::,2001:67c:2210:ffff:ffff:ffff:ffff:ffff,RS +2001:67c:2214::,2001:67c:2214:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2218::,2001:67c:2219:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:2220::,2001:67c:2220:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:2224::,2001:67c:2224:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:2228::,2001:67c:2228:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:222c::,2001:67c:222c:ffff:ffff:ffff:ffff:ffff,SK +2001:67c:2234::,2001:67c:2234:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:2238::,2001:67c:2238:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:223c::,2001:67c:223c:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2240::,2001:67c:2240:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2244::,2001:67c:2244:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2248::,2001:67c:2248:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:2250::,2001:67c:2250:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2254::,2001:67c:2254:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:2258::,2001:67c:2258:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:225c::,2001:67c:225c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2260::,2001:67c:2260:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:2264::,2001:67c:2264:ffff:ffff:ffff:ffff:ffff,KG +2001:67c:2268::,2001:67c:2268:ffff:ffff:ffff:ffff:ffff,BY +2001:67c:226c::,2001:67c:226c:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2270::,2001:67c:2270:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:2274::,2001:67c:2274:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2278::,2001:67c:2278:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:227c::,2001:67c:227c:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:2280::,2001:67c:2280:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:2284::,2001:67c:2284:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2288::,2001:67c:2288:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:228c::,2001:67c:228c:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:2290::,2001:67c:2290:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2294::,2001:67c:2294:ffff:ffff:ffff:ffff:ffff,ES +2001:67c:2298::,2001:67c:2298:ffff:ffff:ffff:ffff:ffff,US +2001:67c:229c::,2001:67c:229c:ffff:ffff:ffff:ffff:ffff,GR +2001:67c:22a0::,2001:67c:22a0:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:22a4::,2001:67c:22a4:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:22a8::,2001:67c:22a8:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:22b0::,2001:67c:22b0:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:22b4::,2001:67c:22b4:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:22b8::,2001:67c:22b8:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:22bc::,2001:67c:22bc:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:22c0::,2001:67c:22c0:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:22c4::,2001:67c:22c4:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:22c8::,2001:67c:22c8:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:22cc::,2001:67c:22cc:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:22d0::,2001:67c:22d0:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:22d8::,2001:67c:22d8:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:22dc::,2001:67c:22dc:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:22e0::,2001:67c:22e0:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:22e4::,2001:67c:22e4:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:22e8::,2001:67c:22e8:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:22ec::,2001:67c:22ec:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:22f0::,2001:67c:22f0:ffff:ffff:ffff:ffff:ffff,RS +2001:67c:22f8::,2001:67c:22f8:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:22fc::,2001:67c:22fc:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2300::,2001:67c:2300:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:2304::,2001:67c:2304:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2308::,2001:67c:2308:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:230c::,2001:67c:230c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2310::,2001:67c:2310:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2314::,2001:67c:2314:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2318::,2001:67c:2318:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:231c::,2001:67c:231c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2320::,2001:67c:2320:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:2324::,2001:67c:2324:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:2328::,2001:67c:2328:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:232c::,2001:67c:232c:ffff:ffff:ffff:ffff:ffff,LV +2001:67c:2330::,2001:67c:2330:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:2334::,2001:67c:2334:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2338::,2001:67c:2338:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:233c::,2001:67c:233c:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2340::,2001:67c:2340:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2348::,2001:67c:2348:ffff:ffff:ffff:ffff:ffff,AE +2001:67c:234c::,2001:67c:234c:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2354::,2001:67c:2354:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2358::,2001:67c:2358:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:235c::,2001:67c:235c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2360::,2001:67c:2360:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2364::,2001:67c:2364:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:2368::,2001:67c:2368:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:236c::,2001:67c:236c:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:2370::,2001:67c:2370:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:2374::,2001:67c:2374:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2378::,2001:67c:2378:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:237c::,2001:67c:237c:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:2380::,2001:67c:2380:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:2384::,2001:67c:2384:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2388::,2001:67c:2388:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:238c::,2001:67c:238c:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:2394::,2001:67c:2394:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:239c::,2001:67c:239c:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:23a0::,2001:67c:23a0:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:23a4::,2001:67c:23a4:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:23a8::,2001:67c:23a8:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:23b0::,2001:67c:23b0:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:23b4::,2001:67c:23b4:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:23b8::,2001:67c:23b8:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:23bc::,2001:67c:23bc:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:23c0::,2001:67c:23c0:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:23c4::,2001:67c:23c4:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:23c8::,2001:67c:23c8:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:23cc::,2001:67c:23cc:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:23d4::,2001:67c:23d4:ffff:ffff:ffff:ffff:ffff,EE +2001:67c:23d8::,2001:67c:23d9:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:23e4::,2001:67c:23e4:ffff:ffff:ffff:ffff:ffff,BE +2001:67c:23e8::,2001:67c:23e8:ffff:ffff:ffff:ffff:ffff,AE +2001:67c:23ec::,2001:67c:23ec:ffff:ffff:ffff:ffff:ffff,BG +2001:67c:23f0::,2001:67c:23f0:ffff:ffff:ffff:ffff:ffff,AE +2001:67c:23f4::,2001:67c:23f4:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:23f8::,2001:67c:23f8:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:23fc::,2001:67c:23fc:ffff:ffff:ffff:ffff:ffff,BG +2001:67c:2400::,2001:67c:2400:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2404::,2001:67c:2404:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:2408::,2001:67c:2408:ffff:ffff:ffff:ffff:ffff,AE +2001:67c:240c::,2001:67c:240c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2410::,2001:67c:2410:ffff:ffff:ffff:ffff:ffff,TR +2001:67c:2414::,2001:67c:2414:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2418::,2001:67c:2418:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:2420::,2001:67c:2420:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:2424::,2001:67c:2424:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:2428::,2001:67c:2428:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:242c::,2001:67c:242c:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:2430::,2001:67c:2433:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:2440::,2001:67c:2440:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:2444::,2001:67c:2444:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2448::,2001:67c:2448:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:244c::,2001:67c:244c:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2454::,2001:67c:2454:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:245c::,2001:67c:245c:ffff:ffff:ffff:ffff:ffff,FI +2001:67c:2460::,2001:67c:2460:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2464::,2001:67c:2464:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2468::,2001:67c:2468:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:246c::,2001:67c:246c:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:2470::,2001:67c:2470:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:2474::,2001:67c:2474:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2478::,2001:67c:2478:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:247c::,2001:67c:247c:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:2480::,2001:67c:2480:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2484::,2001:67c:2484:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2488::,2001:67c:2488:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:248c::,2001:67c:248c:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:2490::,2001:67c:2490:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:2494::,2001:67c:2494:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:2498::,2001:67c:2498:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:249c::,2001:67c:249c:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:24a0::,2001:67c:24a0:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:24a4::,2001:67c:24a4:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:24a8::,2001:67c:24a8:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:24ac::,2001:67c:24ac:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:24b4::,2001:67c:24b4:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:24b8::,2001:67c:24b8:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:24c4::,2001:67c:24c4:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:24c8::,2001:67c:24c8:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:24cc::,2001:67c:24cc:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:24d0::,2001:67c:24d0:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:24d4::,2001:67c:24d4:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:24d8::,2001:67c:24d8:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:24dc::,2001:67c:24dc:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:24e0::,2001:67c:24e0:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:24e4::,2001:67c:24e4:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:24e8::,2001:67c:24e9:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:24f0::,2001:67c:24f0:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:24f4::,2001:67c:24f4:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:24f8::,2001:67c:24f8:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:24fc::,2001:67c:24fc:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:2500::,2001:67c:2507:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2520::,2001:67c:2520:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2524::,2001:67c:2524:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2528::,2001:67c:2528:ffff:ffff:ffff:ffff:ffff,LV +2001:67c:252c::,2001:67c:252c:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:2534::,2001:67c:2534:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:2538::,2001:67c:2538:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:253c::,2001:67c:253c:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2540::,2001:67c:2540:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:2544::,2001:67c:2544:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2548::,2001:67c:2548:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:254c::,2001:67c:254c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2550::,2001:67c:2550:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2554::,2001:67c:2554:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2558::,2001:67c:2558:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:255c::,2001:67c:255c:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2560::,2001:67c:2560:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:2564::,2001:67c:2564:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:256c::,2001:67c:256c:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:2574::,2001:67c:2574:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:2578::,2001:67c:2578:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:257c::,2001:67c:257c:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:2580::,2001:67c:2580:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:2584::,2001:67c:2584:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:2588::,2001:67c:2588:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:2590::,2001:67c:2590:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2594::,2001:67c:2594:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:2598::,2001:67c:2598:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:259c::,2001:67c:259c:ffff:ffff:ffff:ffff:ffff,AE +2001:67c:25a0::,2001:67c:25a0:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:25a4::,2001:67c:25a4:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:25a8::,2001:67c:25a8:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:25ac::,2001:67c:25ac:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:25b0::,2001:67c:25b0:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:25b4::,2001:67c:25b4:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:25b8::,2001:67c:25b8:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:25bc::,2001:67c:25bc:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:25c0::,2001:67c:25c0:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:25c4::,2001:67c:25c4:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:25cc::,2001:67c:25cc:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:25d0::,2001:67c:25d0:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:25d4::,2001:67c:25d4:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:25d8::,2001:67c:25d8:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:25dc::,2001:67c:25dc:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:25e4::,2001:67c:25e4:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:25f4::,2001:67c:25f4:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:25fc::,2001:67c:25fc:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:2600::,2001:67c:2600:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:2604::,2001:67c:2604:ffff:ffff:ffff:ffff:ffff,SK +2001:67c:260c::,2001:67c:260c:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:2610::,2001:67c:2610:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:2614::,2001:67c:2614:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:2618::,2001:67c:2618:ffff:ffff:ffff:ffff:ffff,EE +2001:67c:261c::,2001:67c:261c:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2620::,2001:67c:2620:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:2624::,2001:67c:2624:ffff:ffff:ffff:ffff:ffff,SA +2001:67c:262c::,2001:67c:262c:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2630::,2001:67c:2630:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:2634::,2001:67c:2634:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2638::,2001:67c:2638:ffff:ffff:ffff:ffff:ffff,SK +2001:67c:263c::,2001:67c:263c:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:2640::,2001:67c:2640:ffff:ffff:ffff:ffff:ffff,AE +2001:67c:2644::,2001:67c:2644:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:264c::,2001:67c:264c:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:2650::,2001:67c:2650:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2654::,2001:67c:2654:ffff:ffff:ffff:ffff:ffff,AE +2001:67c:265c::,2001:67c:265c:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2660::,2001:67c:2660:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:2664::,2001:67c:2664:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:2668::,2001:67c:2668:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:266c::,2001:67c:266c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2670::,2001:67c:2670:ffff:ffff:ffff:ffff:ffff,SK +2001:67c:2674::,2001:67c:2674:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2678::,2001:67c:2678:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:267c::,2001:67c:267c:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2684::,2001:67c:2684:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:2688::,2001:67c:2688:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:268c::,2001:67c:268c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2690::,2001:67c:2690:ffff:ffff:ffff:ffff:ffff,BE +2001:67c:2694::,2001:67c:2694:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2698::,2001:67c:2698:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:269c::,2001:67c:269c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:26a0::,2001:67c:26a0:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:26a4::,2001:67c:26a4:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:26ac::,2001:67c:26ac:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:26b0::,2001:67c:26b0:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:26b4::,2001:67c:26b4:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:26b8::,2001:67c:26b8:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:26bc::,2001:67c:26bc:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:26c0::,2001:67c:26c3:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:26d0::,2001:67c:26d0:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:26d4::,2001:67c:26d4:ffff:ffff:ffff:ffff:ffff,SK +2001:67c:26d8::,2001:67c:26d8:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:26dc::,2001:67c:26dc:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:26e0::,2001:67c:26e0:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:26e4::,2001:67c:26e4:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:26e8::,2001:67c:26e8:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:26ec::,2001:67c:26ec:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:26f0::,2001:67c:26f0:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:26f4::,2001:67c:26f4:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:26f8::,2001:67c:26f8:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:26fc::,2001:67c:26fc:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:2700::,2001:67c:2700:ffff:ffff:ffff:ffff:ffff,FI +2001:67c:2704::,2001:67c:2704:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2708::,2001:67c:2708:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:270c::,2001:67c:270c:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2710::,2001:67c:2710:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:2714::,2001:67c:2714:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2718::,2001:67c:2718:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:271c::,2001:67c:271c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2720::,2001:67c:2720:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:2724::,2001:67c:2724:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:2728::,2001:67c:2728:ffff:ffff:ffff:ffff:ffff,IR +2001:67c:272c::,2001:67c:272c:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:2730::,2001:67c:2730:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:2734::,2001:67c:2734:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:2738::,2001:67c:2738:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:273c::,2001:67c:273c:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:2740::,2001:67c:2740:ffff:ffff:ffff:ffff:ffff,SK +2001:67c:2744::,2001:67c:2744:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:2748::,2001:67c:2748:ffff:ffff:ffff:ffff:ffff,GR +2001:67c:274c::,2001:67c:274c:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2758::,2001:67c:2758:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:275c::,2001:67c:275c:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2760::,2001:67c:2760:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2764::,2001:67c:2764:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:2768::,2001:67c:2768:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:276c::,2001:67c:276c:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2770::,2001:67c:2770:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2774::,2001:67c:2774:ffff:ffff:ffff:ffff:ffff,AE +2001:67c:2778::,2001:67c:2778:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:277c::,2001:67c:277c:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:2780::,2001:67c:2780:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2784::,2001:67c:2784:ffff:ffff:ffff:ffff:ffff,FI +2001:67c:2788::,2001:67c:2788:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:278c::,2001:67c:278c:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2790::,2001:67c:2790:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:2794::,2001:67c:2794:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2798::,2001:67c:2798:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:27c0::,2001:67c:27c0:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:27c4::,2001:67c:27c4:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:27c8::,2001:67c:27c8:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:27cc::,2001:67c:27cc:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:27d0::,2001:67c:27d0:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:27d4::,2001:67c:27d4:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:27d8::,2001:67c:27d8:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:27dc::,2001:67c:27dc:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:27e0::,2001:67c:27e0:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:27e4::,2001:67c:27e4:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:27e8::,2001:67c:27e8:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:27ec::,2001:67c:27ec:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:27f0::,2001:67c:27f0:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:27f4::,2001:67c:27f4:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:27f8::,2001:67c:27f8:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:27fc::,2001:67c:27fc:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2800::,2001:67c:2800:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:2804::,2001:67c:2804:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:2808::,2001:67c:2808:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:280c::,2001:67c:280c:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:2810::,2001:67c:2810:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:2814::,2001:67c:2814:ffff:ffff:ffff:ffff:ffff,LI +2001:67c:2818::,2001:67c:2818:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:281c::,2001:67c:281c:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2820::,2001:67c:2820:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:2824::,2001:67c:2824:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2828::,2001:67c:2828:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:282c::,2001:67c:282c:ffff:ffff:ffff:ffff:ffff,BE +2001:67c:2830::,2001:67c:2830:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2834::,2001:67c:2834:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2838::,2001:67c:2838:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:283c::,2001:67c:283c:ffff:ffff:ffff:ffff:ffff,ES +2001:67c:2840::,2001:67c:2840:ffff:ffff:ffff:ffff:ffff,IL +2001:67c:2844::,2001:67c:2844:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:2848::,2001:67c:2848:ffff:ffff:ffff:ffff:ffff,ES +2001:67c:284c::,2001:67c:284c:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2850::,2001:67c:2850:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2854::,2001:67c:2854:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:285c::,2001:67c:285c:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2860::,2001:67c:2860:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2864::,2001:67c:2864:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2868::,2001:67c:2868:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:286c::,2001:67c:286c:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:2870::,2001:67c:2870:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2874::,2001:67c:2874:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:2878::,2001:67c:2878:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:287c::,2001:67c:287c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2880::,2001:67c:2880:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2884::,2001:67c:2884:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2888::,2001:67c:2889:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2890::,2001:67c:2890:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2894::,2001:67c:2894:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:2898::,2001:67c:2898:ffff:ffff:ffff:ffff:ffff,ES +2001:67c:289c::,2001:67c:289c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:28a0::,2001:67c:28a0:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:28a4::,2001:67c:28a4:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:28a8::,2001:67c:28a8:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:28ac::,2001:67c:28ac:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:28b0::,2001:67c:28b0:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:28b4::,2001:67c:28b4:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:28b8::,2001:67c:28b8:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:28bc::,2001:67c:28bc:ffff:ffff:ffff:ffff:ffff,HU +2001:67c:28c0::,2001:67c:28c0:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:28c4::,2001:67c:28c4:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:28cc::,2001:67c:28cc:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:28d0::,2001:67c:28d0:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:28d8::,2001:67c:28d8:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:28e0::,2001:67c:28e0:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:28e4::,2001:67c:28e4:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:28e8::,2001:67c:28e8:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:28f0::,2001:67c:28f0:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:28f4::,2001:67c:28f4:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:28f8::,2001:67c:28f8:ffff:ffff:ffff:ffff:ffff,BE +2001:67c:28fc::,2001:67c:28fc:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2900::,2001:67c:291f:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2980::,2001:67c:2980:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2984::,2001:67c:2984:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:2988::,2001:67c:2989:ffff:ffff:ffff:ffff:ffff,TR +2001:67c:2994::,2001:67c:2994:ffff:ffff:ffff:ffff:ffff,SA +2001:67c:2998::,2001:67c:2998:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:299c::,2001:67c:299c:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:29a0::,2001:67c:29a0:ffff:ffff:ffff:ffff:ffff,TR +2001:67c:29a8::,2001:67c:29a8:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:29ac::,2001:67c:29ac:ffff:ffff:ffff:ffff:ffff,CY +2001:67c:29b0::,2001:67c:29b1:ffff:ffff:ffff:ffff:ffff,CY +2001:67c:29bc::,2001:67c:29bc:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:29c0::,2001:67c:29c1:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:29c8::,2001:67c:29c8:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:29cc::,2001:67c:29cc:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:29d0::,2001:67c:29d0:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:29d4::,2001:67c:29d4:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:29d8::,2001:67c:29d8:ffff:ffff:ffff:ffff:ffff,AE +2001:67c:29dc::,2001:67c:29dc:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:29e0::,2001:67c:29e0:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:29e4::,2001:67c:29e4:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:29e8::,2001:67c:29e8:ffff:ffff:ffff:ffff:ffff,TR +2001:67c:29ec::,2001:67c:29ec:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:29f0::,2001:67c:29f0:ffff:ffff:ffff:ffff:ffff,BG +2001:67c:29f4::,2001:67c:29f4:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:29f8::,2001:67c:29f8:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:29fc::,2001:67c:29fc:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2a00::,2001:67c:2a00:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:2a04::,2001:67c:2a04:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2a08::,2001:67c:2a08:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:2a0c::,2001:67c:2a0c:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2a14::,2001:67c:2a14:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2a18::,2001:67c:2a18:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2a24::,2001:67c:2a24:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:2a28::,2001:67c:2a28:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:2a2c::,2001:67c:2a2c:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:2a30::,2001:67c:2a30:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2a34::,2001:67c:2a34:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2a38::,2001:67c:2a38:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:2a3c::,2001:67c:2a3c:ffff:ffff:ffff:ffff:ffff,ES +2001:67c:2a40::,2001:67c:2a40:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:2a44::,2001:67c:2a44:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:2a48::,2001:67c:2a48:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2a4c::,2001:67c:2a4c:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:2a50::,2001:67c:2a50:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:2a54::,2001:67c:2a54:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2a58::,2001:67c:2a58:ffff:ffff:ffff:ffff:ffff,BE +2001:67c:2a5c::,2001:67c:2a5c:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:2a64::,2001:67c:2a64:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:2a68::,2001:67c:2a68:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:2a6c::,2001:67c:2a6c:ffff:ffff:ffff:ffff:ffff,TR +2001:67c:2a70::,2001:67c:2a70:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2a74::,2001:67c:2a74:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:2a78::,2001:67c:2a78:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:2a7c::,2001:67c:2a7c:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2a80::,2001:67c:2a80:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:2a84::,2001:67c:2a84:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2a88::,2001:67c:2a88:ffff:ffff:ffff:ffff:ffff,LV +2001:67c:2a8c::,2001:67c:2a8c:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:2a90::,2001:67c:2a90:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:2a94::,2001:67c:2a94:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2a98::,2001:67c:2a98:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2a9c::,2001:67c:2a9c:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:2aa0::,2001:67c:2aa0:ffff:ffff:ffff:ffff:ffff,LU +2001:67c:2aa4::,2001:67c:2aa4:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:2aa8::,2001:67c:2aa8:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:2aac::,2001:67c:2aac:ffff:ffff:ffff:ffff:ffff,IS +2001:67c:2ab0::,2001:67c:2ab0:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2ab4::,2001:67c:2ab4:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2ab8::,2001:67c:2ab8:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2abc::,2001:67c:2abc:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:2ac0::,2001:67c:2ac0:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:2ac4::,2001:67c:2ac4:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2ac8::,2001:67c:2ac8:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2acc::,2001:67c:2acc:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2ad0::,2001:67c:2ad0:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2ad4::,2001:67c:2ad4:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2ad8::,2001:67c:2ad8:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2adc::,2001:67c:2adc:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2ae0::,2001:67c:2ae0:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:2ae4::,2001:67c:2ae4:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2ae8::,2001:67c:2ae8:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2aec::,2001:67c:2aec:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:2af0::,2001:67c:2af0:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2af4::,2001:67c:2af4:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2afc::,2001:67c:2afc:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:2b04::,2001:67c:2b04:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:2b08::,2001:67c:2b08:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2b0c::,2001:67c:2b0c:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2b10::,2001:67c:2b10:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:2b14::,2001:67c:2b14:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:2b18::,2001:67c:2b18:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:2b1c::,2001:67c:2b1c:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2b20::,2001:67c:2b20:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2b24::,2001:67c:2b24:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2b28::,2001:67c:2b28:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2b2c::,2001:67c:2b2c:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:2b30::,2001:67c:2b30:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2b34::,2001:67c:2b34:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2b3c::,2001:67c:2b3c:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:2b40::,2001:67c:2b40:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2b44::,2001:67c:2b44:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2b48::,2001:67c:2b48:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2b4c::,2001:67c:2b4c:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:2b50::,2001:67c:2b50:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:2b54::,2001:67c:2b54:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:2b58::,2001:67c:2b58:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2b5c::,2001:67c:2b5c:ffff:ffff:ffff:ffff:ffff,FR +2001:67c:2b60::,2001:67c:2b60:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2b64::,2001:67c:2b64:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2b68::,2001:67c:2b68:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:2b6c::,2001:67c:2b6c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2b70::,2001:67c:2b70:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:2b74::,2001:67c:2b74:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2b78::,2001:67c:2b79:ffff:ffff:ffff:ffff:ffff,GR +2001:67c:2b80::,2001:67c:2b80:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:2b84::,2001:67c:2b84:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2b88::,2001:67c:2b88:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2b8c::,2001:67c:2b8c:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2b90::,2001:67c:2b90:ffff:ffff:ffff:ffff:ffff,SI +2001:67c:2b94::,2001:67c:2b94:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2b98::,2001:67c:2b98:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:2b9c::,2001:67c:2b9c:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2ba0::,2001:67c:2ba0:ffff:ffff:ffff:ffff:ffff,TR +2001:67c:2ba4::,2001:67c:2ba4:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2ba8::,2001:67c:2ba8:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2bac::,2001:67c:2bac:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2bb4::,2001:67c:2bb4:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:2bb8::,2001:67c:2bb8:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:2bbc::,2001:67c:2bbc:ffff:ffff:ffff:ffff:ffff,RO +2001:67c:2bc0::,2001:67c:2bc0:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2bc4::,2001:67c:2bc4:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:2bc8::,2001:67c:2bc8:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2bcc::,2001:67c:2bcc:ffff:ffff:ffff:ffff:ffff,LV +2001:67c:2bd0::,2001:67c:2bd0:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2bd4::,2001:67c:2bd4:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2bd8::,2001:67c:2bd8:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2bdc::,2001:67c:2bdc:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2be4::,2001:67c:2be4:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2be8::,2001:67c:2be8:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2bec::,2001:67c:2bec:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2bf0::,2001:67c:2bf0:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:2bf4::,2001:67c:2bf4:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2bf8::,2001:67c:2bf8:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2bfc::,2001:67c:2bfc:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2c00::,2001:67c:2c00:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2c04::,2001:67c:2c04:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2c08::,2001:67c:2c08:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:2c0c::,2001:67c:2c0c:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:2c10::,2001:67c:2c10:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:2c14::,2001:67c:2c14:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:2c18::,2001:67c:2c18:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2c1c::,2001:67c:2c1c:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2c20::,2001:67c:2c20:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:2c24::,2001:67c:2c24:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2c28::,2001:67c:2c28:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:2c2c::,2001:67c:2c2c:ffff:ffff:ffff:ffff:ffff,HU +2001:67c:2c30::,2001:67c:2c30:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2c34::,2001:67c:2c34:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2c38::,2001:67c:2c38:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:2c3c::,2001:67c:2c3c:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2c40::,2001:67c:2c40:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:2c44::,2001:67c:2c44:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:2c48::,2001:67c:2c48:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2c4c::,2001:67c:2c4c:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2c50::,2001:67c:2c50:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2c54::,2001:67c:2c54:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2c58::,2001:67c:2c58:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2c5c::,2001:67c:2c5c:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2c60::,2001:67c:2c60:ffff:ffff:ffff:ffff:ffff,BE +2001:67c:2c64::,2001:67c:2c64:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2c68::,2001:67c:2c68:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2c6c::,2001:67c:2c6c:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2c70::,2001:67c:2c70:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2c74::,2001:67c:2c74:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2c78::,2001:67c:2c78:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2c7c::,2001:67c:2c7c:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:2c80::,2001:67c:2c80:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2c84::,2001:67c:2c84:ffff:ffff:ffff:ffff:ffff,BE +2001:67c:2c88::,2001:67c:2c89:ffff:ffff:ffff:ffff:ffff,BG +2001:67c:2c90::,2001:67c:2c93:ffff:ffff:ffff:ffff:ffff,BG +2001:67c:2ca0::,2001:67c:2ca7:ffff:ffff:ffff:ffff:ffff,BE +2001:67c:2cc0::,2001:67c:2cc0:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:2cc4::,2001:67c:2cc4:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2cc8::,2001:67c:2cc8:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:2ccc::,2001:67c:2ccc:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:2cd0::,2001:67c:2cd0:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:2cd4::,2001:67c:2cd4:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2cd8::,2001:67c:2cd8:ffff:ffff:ffff:ffff:ffff,SK +2001:67c:2cdc::,2001:67c:2cdc:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2ce0::,2001:67c:2ce0:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2ce4::,2001:67c:2ce4:ffff:ffff:ffff:ffff:ffff,BG +2001:67c:2ce8::,2001:67c:2ce8:ffff:ffff:ffff:ffff:ffff,FI +2001:67c:2cec::,2001:67c:2cec:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2cf0::,2001:67c:2cf0:ffff:ffff:ffff:ffff:ffff,NO +2001:67c:2cf4::,2001:67c:2cf4:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2cf8::,2001:67c:2cf8:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2cfc::,2001:67c:2cfc:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2d00::,2001:67c:2d00:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2d04::,2001:67c:2d04:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2d08::,2001:67c:2d08:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2d0c::,2001:67c:2d0c:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2d10::,2001:67c:2d10:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:2d18::,2001:67c:2d19:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2d20::,2001:67c:2d20:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:2d24::,2001:67c:2d24:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2d28::,2001:67c:2d28:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:2d2c::,2001:67c:2d2c:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:2d30::,2001:67c:2d30:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:2d34::,2001:67c:2d34:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:2d38::,2001:67c:2d38:ffff:ffff:ffff:ffff:ffff,CZ +2001:67c:2d3c::,2001:67c:2d3c:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:2d40::,2001:67c:2d40:ffff:ffff:ffff:ffff:ffff,UA +2001:680::,2001:680:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:688::,2001:688:ffff:ffff:ffff:ffff:ffff:ffff,FR +2001:690::,2001:697:ffff:ffff:ffff:ffff:ffff:ffff,PT +2001:6a0::,2001:6a0:ffff:ffff:ffff:ffff:ffff:ffff,PL +2001:6a8::,2001:6a8:ffff:ffff:ffff:ffff:ffff:ffff,BE +2001:6b0::,2001:6b0:ffff:ffff:ffff:ffff:ffff:ffff,SE +2001:6b8::,2001:6b8:ffff:ffff:ffff:ffff:ffff:ffff,IT +2001:6c8::,2001:6cf:ffff:ffff:ffff:ffff:ffff:ffff,DK +2001:6d0::,2001:6d0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2001:6d8::,2001:6df:ffff:ffff:ffff:ffff:ffff:ffff,PL +2001:6e0::,2001:6e0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2001:6e8::,2001:6ef:ffff:ffff:ffff:ffff:ffff:ffff,FI +2001:6f0::,2001:6f7:ffff:ffff:ffff:ffff:ffff:ffff,SE +2001:6f8::,2001:6f8:900:87ff:ffff:ffff:ffff:ffff,GB +2001:6f8:900:8800::,2001:6f8:900:9fff:ffff:ffff:ffff:ffff,DE +2001:6f8:900:a000::,2001:6f8:11ab:ffff:ffff:ffff:ffff:ffff,GB +2001:6f8:11ac::,2001:6f8:11ac:ffff:ffff:ffff:ffff:ffff,DE +2001:6f8:11ad::,2001:6f8:1bff:ffff:ffff:ffff:ffff:ffff,GB +2001:6f8:1c00::,2001:6f8:1c00:ffff:ffff:ffff:ffff:ffff,DE +2001:6f8:1c01::,2001:6f8:1c3b:ffff:ffff:ffff:ffff:ffff,GB +2001:6f8:1c3c::,2001:6f8:1c3c:ffff:ffff:ffff:ffff:ffff,DE +2001:6f8:1c3d::,2001:6f8:ffff:ffff:ffff:ffff:ffff:ffff,GB +2001:700::,2001:700:ffff:ffff:ffff:ffff:ffff:ffff,NO +2001:708::,2001:708:ffff:ffff:ffff:ffff:ffff:ffff,FI +2001:710::,2001:710:ffff:ffff:ffff:ffff:ffff:ffff,GB +2001:718::,2001:718:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2001:720::,2001:720:ffff:ffff:ffff:ffff:ffff:ffff,ES +2001:728::,2001:728:ffff:ffff:ffff:ffff:ffff:ffff,GB +2001:730::,2001:737:ffff:ffff:ffff:ffff:ffff:ffff,AT +2001:738::,2001:738:ffff:ffff:ffff:ffff:ffff:ffff,HU +2001:748::,2001:748:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:750::,2001:750:ffff:ffff:ffff:ffff:ffff:ffff,IT +2001:758::,2001:758:ffff:ffff:ffff:ffff:ffff:ffff,FR +2001:760::,2001:760:ffff:ffff:ffff:ffff:ffff:ffff,IT +2001:768::,2001:768:ffff:ffff:ffff:ffff:ffff:ffff,GB +2001:770::,2001:770:ffff:ffff:ffff:ffff:ffff:ffff,IE +2001:778::,2001:77f:ffff:ffff:ffff:ffff:ffff:ffff,LT +2001:780::,2001:787:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:788::,2001:78f:ffff:ffff:ffff:ffff:ffff:ffff,CH +2001:790::,2001:790:ffff:ffff:ffff:ffff:ffff:ffff,IR +2001:798::,2001:798:ffff:ffff:ffff:ffff:ffff:ffff,GB +2001:7a0::,2001:7a0:ffff:ffff:ffff:ffff:ffff:ffff,SE +2001:7a8::,2001:7a8:ffff:ffff:ffff:ffff:ffff:ffff,FR +2001:7b0::,2001:7b0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:7b8::,2001:7b8:ffff:ffff:ffff:ffff:ffff:ffff,NL +2001:7c0::,2001:7c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:7c8::,2001:7c8:ffff:ffff:ffff:ffff:ffff:ffff,IE +2001:7d0::,2001:7d0:ffff:ffff:ffff:ffff:ffff:ffff,EE +2001:7d8::,2001:7d8:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:7e0::,2001:7e0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2001:7e8::,2001:7e8:ffff:ffff:ffff:ffff:ffff:ffff,LU +2001:7f8::,2001:7f8::ffff:ffff:ffff:ffff:ffff,DE +2001:7f8:1::,2001:7f8:1:ffff:ffff:ffff:ffff:ffff,NL +2001:7f8:2::,2001:7f8:2:ffff:ffff:ffff:ffff:ffff,IT +2001:7f8:3::,2001:7f8:5:ffff:ffff:ffff:ffff:ffff,GB +2001:7f8:6::,2001:7f8:6:ffff:ffff:ffff:ffff:ffff,BG +2001:7f8:7::,2001:7f8:7:ffff:ffff:ffff:ffff:ffff,FI +2001:7f8:8::,2001:7f8:8:ffff:ffff:ffff:ffff:ffff,DE +2001:7f8:9::,2001:7f8:9:ffff:ffff:ffff:ffff:ffff,GB +2001:7f8:a::,2001:7f8:a:ffff:ffff:ffff:ffff:ffff,PT +2001:7f8:b::,2001:7f8:b:ffff:ffff:ffff:ffff:ffff,IT +2001:7f8:c::,2001:7f8:c:ffff:ffff:ffff:ffff:ffff,CH +2001:7f8:d::,2001:7f8:d:ffff:ffff:ffff:ffff:ffff,SE +2001:7f8:e::,2001:7f8:e:ffff:ffff:ffff:ffff:ffff,NL +2001:7f8:f::,2001:7f8:f:ffff:ffff:ffff:ffff:ffff,ES +2001:7f8:10::,2001:7f8:10:ffff:ffff:ffff:ffff:ffff,IT +2001:7f8:12::,2001:7f8:12:ffff:ffff:ffff:ffff:ffff,NO +2001:7f8:13::,2001:7f8:13:ffff:ffff:ffff:ffff:ffff,NL +2001:7f8:14::,2001:7f8:14:ffff:ffff:ffff:ffff:ffff,CZ +2001:7f8:15::,2001:7f8:15:ffff:ffff:ffff:ffff:ffff,EE +2001:7f8:16::,2001:7f8:16:ffff:ffff:ffff:ffff:ffff,SE +2001:7f8:17::,2001:7f8:17:ffff:ffff:ffff:ffff:ffff,GB +2001:7f8:18::,2001:7f8:18:ffff:ffff:ffff:ffff:ffff,IE +2001:7f8:19::,2001:7f8:19:ffff:ffff:ffff:ffff:ffff,DE +2001:7f8:1b::,2001:7f8:1b:ffff:ffff:ffff:ffff:ffff,BE +2001:7f8:1c::,2001:7f8:1c:ffff:ffff:ffff:ffff:ffff,CH +2001:7f8:1d::,2001:7f8:1d:ffff:ffff:ffff:ffff:ffff,FI +2001:7f8:1e::,2001:7f8:1e:ffff:ffff:ffff:ffff:ffff,RS +2001:7f8:1f::,2001:7f8:1f:ffff:ffff:ffff:ffff:ffff,DK +2001:7f8:20::,2001:7f8:20:ffff:ffff:ffff:ffff:ffff,RU +2001:7f8:21::,2001:7f8:21:ffff:ffff:ffff:ffff:ffff,SE +2001:7f8:23::,2001:7f8:23:ffff:ffff:ffff:ffff:ffff,IT +2001:7f8:24::,2001:7f8:24:ffff:ffff:ffff:ffff:ffff,CH +2001:7f8:25::,2001:7f8:25:ffff:ffff:ffff:ffff:ffff,GB +2001:7f8:26::,2001:7f8:26:ffff:ffff:ffff:ffff:ffff,BE +2001:7f8:27::,2001:7f8:27:ffff:ffff:ffff:ffff:ffff,PL +2001:7f8:28::,2001:7f8:28:ffff:ffff:ffff:ffff:ffff,HR +2001:7f8:29::,2001:7f8:29:ffff:ffff:ffff:ffff:ffff,DE +2001:7f8:2a::,2001:7f8:2a:ffff:ffff:ffff:ffff:ffff,ES +2001:7f8:2d::,2001:7f8:2d:ffff:ffff:ffff:ffff:ffff,FR +2001:7f8:2f::,2001:7f8:2f:ffff:ffff:ffff:ffff:ffff,SK +2001:7f8:30::,2001:7f8:30:ffff:ffff:ffff:ffff:ffff,AT +2001:7f8:31::,2001:7f8:31:ffff:ffff:ffff:ffff:ffff,NL +2001:7f8:33::,2001:7f8:33:ffff:ffff:ffff:ffff:ffff,DE +2001:7f8:34::,2001:7f8:34:ffff:ffff:ffff:ffff:ffff,GB +2001:7f8:35::,2001:7f8:35:ffff:ffff:ffff:ffff:ffff,HU +2001:7f8:37::,2001:7f8:38:ffff:ffff:ffff:ffff:ffff,SE +2001:7f8:39::,2001:7f8:39:ffff:ffff:ffff:ffff:ffff,EE +2001:7f8:3a::,2001:7f8:3a:ffff:ffff:ffff:ffff:ffff,DE +2001:7f8:3b::,2001:7f8:3b:ffff:ffff:ffff:ffff:ffff,IL +2001:7f8:3d::,2001:7f8:3d:ffff:ffff:ffff:ffff:ffff,DE +2001:7f8:3e::,2001:7f8:3e:ffff:ffff:ffff:ffff:ffff,GB +2001:7f8:41::,2001:7f8:41:ffff:ffff:ffff:ffff:ffff,NO +2001:7f8:42::,2001:7f8:42:ffff:ffff:ffff:ffff:ffff,PL +2001:7f8:43::,2001:7f8:43:ffff:ffff:ffff:ffff:ffff,FR +2001:7f8:44::,2001:7f8:44:ffff:ffff:ffff:ffff:ffff,DE +2001:7f8:45::,2001:7f8:45:ffff:ffff:ffff:ffff:ffff,SE +2001:7f8:46::,2001:7f8:46:ffff:ffff:ffff:ffff:ffff,SI +2001:7f8:47::,2001:7f8:47:ffff:ffff:ffff:ffff:ffff,FR +2001:7f8:48::,2001:7f8:48:ffff:ffff:ffff:ffff:ffff,IS +2001:7f8:4a::,2001:7f8:4a:ffff:ffff:ffff:ffff:ffff,AT +2001:7f8:4b::,2001:7f8:4b:ffff:ffff:ffff:ffff:ffff,PL +2001:7f8:4c::,2001:7f8:4c:ffff:ffff:ffff:ffff:ffff,LU +2001:7f8:4d::,2001:7f8:4d:ffff:ffff:ffff:ffff:ffff,IE +2001:7f8:4e::,2001:7f8:4e:ffff:ffff:ffff:ffff:ffff,FR +2001:7f8:4f::,2001:7f8:4f:ffff:ffff:ffff:ffff:ffff,BH +2001:7f8:50::,2001:7f8:50:ffff:ffff:ffff:ffff:ffff,EE +2001:7f8:51::,2001:7f8:51:ffff:ffff:ffff:ffff:ffff,UA +2001:7f8:52::,2001:7f8:52:ffff:ffff:ffff:ffff:ffff,LB +2001:7f8:53::,2001:7f8:53:ffff:ffff:ffff:ffff:ffff,SE +2001:7f8:54::,2001:7f8:54:ffff:ffff:ffff:ffff:ffff,FR +2001:7f8:55::,2001:7f8:55:ffff:ffff:ffff:ffff:ffff,UA +2001:7f8:56::,2001:7f8:56:ffff:ffff:ffff:ffff:ffff,DE +2001:7f8:58::,2001:7f8:58:ffff:ffff:ffff:ffff:ffff,BG +2001:7f8:59::,2001:7f8:59:ffff:ffff:ffff:ffff:ffff,FR +2001:7f8:5a::,2001:7f8:5a:ffff:ffff:ffff:ffff:ffff,BY +2001:7f8:5b::,2001:7f8:5b:ffff:ffff:ffff:ffff:ffff,PL +2001:7f8:5c::,2001:7f8:5c:ffff:ffff:ffff:ffff:ffff,SE +2001:7f8:5d::,2001:7f8:5d:ffff:ffff:ffff:ffff:ffff,UA +2001:7f8:5e::,2001:7f8:5e:ffff:ffff:ffff:ffff:ffff,CZ +2001:7f8:5f::,2001:7f8:5f:ffff:ffff:ffff:ffff:ffff,IT +2001:7f8:60::,2001:7f8:60:ffff:ffff:ffff:ffff:ffff,PL +2001:7f8:61::,2001:7f8:61:ffff:ffff:ffff:ffff:ffff,NL +2001:7f8:63::,2001:7f8:63:ffff:ffff:ffff:ffff:ffff,UA +2001:7f8:64::,2001:7f8:64:ffff:ffff:ffff:ffff:ffff,RO +2001:7f8:66::,2001:7f8:66:ffff:ffff:ffff:ffff:ffff,AT +2001:7f8:67::,2001:7f8:67:ffff:ffff:ffff:ffff:ffff,GB +2001:7f8:68::,2001:7f8:68:ffff:ffff:ffff:ffff:ffff,FR +2001:7f8:69::,2001:7f8:69:ffff:ffff:ffff:ffff:ffff,PL +2001:7f8:6a::,2001:7f8:6a:ffff:ffff:ffff:ffff:ffff,MD +2001:7f8:6b::,2001:7f8:6b:ffff:ffff:ffff:ffff:ffff,PL +2001:7f8:6c::,2001:7f8:6c:ffff:ffff:ffff:ffff:ffff,UA +2001:7f8:6d::,2001:7f8:6d:ffff:ffff:ffff:ffff:ffff,FR +2001:7f8:6e::,2001:7f8:6e:ffff:ffff:ffff:ffff:ffff,GR +2001:7f8:6f::,2001:7f8:70:ffff:ffff:ffff:ffff:ffff,RU +2001:7f8:71::,2001:7f8:71:ffff:ffff:ffff:ffff:ffff,AT +2001:7f8:72::,2001:7f8:72:ffff:ffff:ffff:ffff:ffff,PS +2001:7f8:73::,2001:7f8:73:ffff:ffff:ffff:ffff:ffff,AE +2001:7f8:74::,2001:7f8:75:ffff:ffff:ffff:ffff:ffff,PL +2001:7f8:76::,2001:7f8:76:ffff:ffff:ffff:ffff:ffff,NO +2001:7f8:77::,2001:7f8:78:ffff:ffff:ffff:ffff:ffff,RU +2001:7f8:79::,2001:7f8:79:ffff:ffff:ffff:ffff:ffff,FR +2001:7f8:7a::,2001:7f8:7a:ffff:ffff:ffff:ffff:ffff,AE +2001:7f8:7b::,2001:7f8:7b:ffff:ffff:ffff:ffff:ffff,UA +2001:7f8:7c::,2001:7f8:7c:ffff:ffff:ffff:ffff:ffff,PL +2001:7f8:7d::,2001:7f8:7d:ffff:ffff:ffff:ffff:ffff,RU +2001:7f8:7e::,2001:7f8:7e:ffff:ffff:ffff:ffff:ffff,ES +2001:7f8:7f::,2001:7f8:7f:ffff:ffff:ffff:ffff:ffff,CZ +2001:7f8:81::,2001:7f8:81:ffff:ffff:ffff:ffff:ffff,FR +2001:7f8:82::,2001:7f8:82:ffff:ffff:ffff:ffff:ffff,RU +2001:7f8:83::,2001:7f8:83:ffff:ffff:ffff:ffff:ffff,PL +2001:7f8:84::,2001:7f8:84:ffff:ffff:ffff:ffff:ffff,RU +2001:7f8:85::,2001:7f8:85:ffff:ffff:ffff:ffff:ffff,HU +2001:7f8:86::,2001:7f8:86:ffff:ffff:ffff:ffff:ffff,NL +2001:7f8:87::,2001:7f8:87:ffff:ffff:ffff:ffff:ffff,CZ +2001:7f8:88::,2001:7f8:89:ffff:ffff:ffff:ffff:ffff,FR +2001:7f8:8a::,2001:7f8:8a:ffff:ffff:ffff:ffff:ffff,PL +2001:7f8:8b::,2001:7f8:8b:ffff:ffff:ffff:ffff:ffff,BY +2001:7f8:8d::,2001:7f8:8d:ffff:ffff:ffff:ffff:ffff,AT +2001:7f8:8e::,2001:7f8:8e:ffff:ffff:ffff:ffff:ffff,BG +2001:7f8:8f::,2001:7f8:8f:ffff:ffff:ffff:ffff:ffff,NL +2001:7f8:90::,2001:7f8:90:ffff:ffff:ffff:ffff:ffff,GB +2001:7f8:91::,2001:7f8:91:ffff:ffff:ffff:ffff:ffff,SK +2001:7f8:92::,2001:7f8:92:ffff:ffff:ffff:ffff:ffff,DE +2001:7fa:0:1::,2001:7fa::1:ffff:ffff:ffff:ffff,HK +2001:7fa:0:2::,2001:7fa::2:ffff:ffff:ffff:ffff,KR +2001:7fa:0:3::,2001:7fa::3:ffff:ffff:ffff:ffff,JP +2001:7fa:1::,2001:7fa:1:ffff:ffff:ffff:ffff:ffff,TW +2001:7fa:2::,2001:7fa:2:ffff:ffff:ffff:ffff:ffff,ID +2001:7fa:3::,2001:7fa:4:ffff:ffff:ffff:ffff:ffff,NZ +2001:7fa:5::,2001:7fa:5:ffff:ffff:ffff:ffff:ffff,CN +2001:7fa:6::,2001:7fa:6:ffff:ffff:ffff:ffff:ffff,VN +2001:7fa:7::,2001:7fa:7:ffff:ffff:ffff:ffff:ffff,JP +2001:7fa:8::,2001:7fa:8:ffff:ffff:ffff:ffff:ffff,KR +2001:7fa:9::,2001:7fa:e:ffff:ffff:ffff:ffff:ffff,AU +2001:7fa:f::,2001:7fa:f:ffff:ffff:ffff:ffff:ffff,ID +2001:7fa:10::,2001:7fa:10:ffff:ffff:ffff:ffff:ffff,CN +2001:7fa:11::,2001:7fa:11:ffff:ffff:ffff:ffff:ffff,AU +2001:7fe::,2001:7fe:ffff:ffff:ffff:ffff:ffff:ffff,SE 2001:808::,2001:808:ffff:ffff:ffff:ffff:ffff:ffff,PL 2001:810::,2001:810:ffff:ffff:ffff:ffff:ffff:ffff,FR 2001:818::,2001:81f:ffff:ffff:ffff:ffff:ffff:ffff,PT @@ -93,8 +2403,64 @@ 2001:8e0::,2001:8e8:ffff:ffff:ffff:ffff:ffff:ffff,CH 2001:8f0::,2001:8f3:ffff:ffff:ffff:ffff:ffff:ffff,CY 2001:8f8::,2001:8ff:ffff:ffff:ffff:ffff:ffff:ffff,AE -2001:900::,2001:9ff:ffff:ffff:ffff:ffff:ffff:ffff,NL -2001:a00::,2001:aff:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:900::,2001:900:ffff:ffff:ffff:ffff:ffff:ffff,FR +2001:908::,2001:908:ffff:ffff:ffff:ffff:ffff:ffff,PL +2001:910::,2001:917:ffff:ffff:ffff:ffff:ffff:ffff,FR +2001:918::,2001:918:ffff:ffff:ffff:ffff:ffff:ffff,CH +2001:920::,2001:927:ffff:ffff:ffff:ffff:ffff:ffff,GB +2001:928::,2001:928:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:930::,2001:930:ffff:ffff:ffff:ffff:ffff:ffff,TR +2001:938::,2001:938:ffff:ffff:ffff:ffff:ffff:ffff,AT +2001:940::,2001:940:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:948::,2001:948:ffff:ffff:ffff:ffff:ffff:ffff,SE +2001:950::,2001:950:ffff:ffff:ffff:ffff:ffff:ffff,HU +2001:958::,2001:958:ffff:ffff:ffff:ffff:ffff:ffff,GB +2001:960::,2001:960:ffff:ffff:ffff:ffff:ffff:ffff,NL +2001:968::,2001:968:ffff:ffff:ffff:ffff:ffff:ffff,NL +2001:978::,2001:978:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:980::,2001:987:ffff:ffff:ffff:ffff:ffff:ffff,NL +2001:988::,2001:988:ffff:ffff:ffff:ffff:ffff:ffff,FR +2001:990::,2001:990:ffff:ffff:ffff:ffff:ffff:ffff,NL +2001:998::,2001:99b:ffff:ffff:ffff:ffff:ffff:ffff,FI +2001:9a0::,2001:9a0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2001:9a8::,2001:9a8:ffff:ffff:ffff:ffff:ffff:ffff,NL +2001:9b0::,2001:9b0:ffff:ffff:ffff:ffff:ffff:ffff,SE +2001:9c0::,2001:9c0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2001:9c8::,2001:9cf:ffff:ffff:ffff:ffff:ffff:ffff,SE +2001:9d0::,2001:9d0:ffff:ffff:ffff:ffff:ffff:ffff,AT +2001:9d8::,2001:9d8:ffff:ffff:ffff:ffff:ffff:ffff,GB +2001:9e0::,2001:9e0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2001:9e8::,2001:9e8:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:9f0::,2001:9f0:ffff:ffff:ffff:ffff:ffff:ffff,FI +2001:a00::,2001:a00:ffff:ffff:ffff:ffff:ffff:ffff,AT +2001:a08::,2001:a08:ffff:ffff:ffff:ffff:ffff:ffff,GB +2001:a10::,2001:a10:ffff:ffff:ffff:ffff:ffff:ffff,PL +2001:a18::,2001:a1f:ffff:ffff:ffff:ffff:ffff:ffff,LU +2001:a20::,2001:a20:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:a30::,2001:a30:ffff:ffff:ffff:ffff:ffff:ffff,IT +2001:a38::,2001:a38:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:a40::,2001:a40:ffff:ffff:ffff:ffff:ffff:ffff,PT +2001:a48::,2001:a48:ffff:ffff:ffff:ffff:ffff:ffff,PL +2001:a50::,2001:a50:ffff:ffff:ffff:ffff:ffff:ffff,ES +2001:a58::,2001:a58:ffff:ffff:ffff:ffff:ffff:ffff,RU +2001:a60::,2001:a67:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:a68::,2001:a68:ffff:ffff:ffff:ffff:ffff:ffff,FI +2001:a70::,2001:a70:ffff:ffff:ffff:ffff:ffff:ffff,FR +2001:a78::,2001:a78:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:a80::,2001:a80:ffff:ffff:ffff:ffff:ffff:ffff,IT +2001:a88::,2001:a88:ffff:ffff:ffff:ffff:ffff:ffff,GB +2001:a90::,2001:a90:ffff:ffff:ffff:ffff:ffff:ffff,NO +2001:a98::,2001:a98:ffff:ffff:ffff:ffff:ffff:ffff,TR +2001:aa0::,2001:aa0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:aa8::,2001:ab7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:ab8::,2001:ab8:ffff:ffff:ffff:ffff:ffff:ffff,FR +2001:ac0::,2001:ac7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2001:ac8::,2001:ac8:ffff:ffff:ffff:ffff:ffff:ffff,GB +2001:ad0::,2001:ad0:ffff:ffff:ffff:ffff:ffff:ffff,EE +2001:ad8::,2001:ae0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:ae8::,2001:ae8:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2001:af0::,2001:af0:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2001:af8::,2001:af8:ffff:ffff:ffff:ffff:ffff:ffff,AT 2001:b00::,2001:b07:ffff:ffff:ffff:ffff:ffff:ffff,IT 2001:b08::,2001:b08:ffff:ffff:ffff:ffff:ffff:ffff,RU 2001:b10::,2001:b10:ffff:ffff:ffff:ffff:ffff:ffff,PL @@ -116,7 +2482,7 @@ 2001:b98::,2001:b98:ffff:ffff:ffff:ffff:ffff:ffff,GB 2001:ba0::,2001:ba0:ffff:ffff:ffff:ffff:ffff:ffff,ES 2001:ba8::,2001:ba8:ffff:ffff:ffff:ffff:ffff:ffff,GB -2001:bb0::,2001:bb0:ffff:ffff:ffff:ffff:ffff:ffff,IE +2001:bb0::,2001:bb7:ffff:ffff:ffff:ffff:ffff:ffff,IE 2001:bb8::,2001:bb8:ffff:ffff:ffff:ffff:ffff:ffff,EE 2001:bc0::,2001:bc0:ffff:ffff:ffff:ffff:ffff:ffff,GB 2001:bc8::,2001:bc8:ffff:ffff:ffff:ffff:ffff:ffff,FR @@ -156,8 +2522,777 @@ 2001:ce8::,2001:ce8:ffff:ffff:ffff:ffff:ffff:ffff,JP 2001:cf0::,2001:cf0:ffff:ffff:ffff:ffff:ffff:ffff,KR 2001:cf8::,2001:cf8:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:d00::,2001:db7:ffff:ffff:ffff:ffff:ffff:ffff,CN -2001:db9::,2001:dff:ffff:ffff:ffff:ffff:ffff:ffff,CN +2001:d00::,2001:d00:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:d08::,2001:d08:ffff:ffff:ffff:ffff:ffff:ffff,MY +2001:d10::,2001:d10:ffff:ffff:ffff:ffff:ffff:ffff,ID +2001:d18::,2001:d18:ffff:ffff:ffff:ffff:ffff:ffff,PH +2001:d28::,2001:d28:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:d30::,2001:d30:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:d38::,2001:d38:ffff:ffff:ffff:ffff:ffff:ffff,KR +2001:d40::,2001:d40:ffff:ffff:ffff:ffff:ffff:ffff,TW +2001:d48::,2001:d48:ffff:ffff:ffff:ffff:ffff:ffff,TW +2001:d50::,2001:d50:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:d58::,2001:d58:ffff:ffff:ffff:ffff:ffff:ffff,TW +2001:d68::,2001:d68:ffff:ffff:ffff:ffff:ffff:ffff,ID +2001:d70::,2001:d73:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:d80::,2001:d80:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:d88::,2001:d88:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:d90::,2001:d90:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:d98::,2001:d98:ffff:ffff:ffff:ffff:ffff:ffff,SG +2001:da0::,2001:da0:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:da8::,2001:daa:ffff:ffff:ffff:ffff:ffff:ffff,CN +2001:db0::,2001:db0:ffff:ffff:ffff:ffff:ffff:ffff,AU +2001:dc0::,2001:dc0:ffff:ffff:ffff:ffff:ffff:ffff,AU +2001:dc1::,2001:dc1:ffff:ffff:ffff:ffff:ffff:ffff,TW +2001:dc2::,2001:dc4:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:dc5::,2001:dc5:ffff:ffff:ffff:ffff:ffff:ffff,KR +2001:dc6::,2001:dc6:ffff:ffff:ffff:ffff:ffff:ffff,ID +2001:dc7::,2001:dc7:ffff:ffff:ffff:ffff:ffff:ffff,CN +2001:dc8::,2001:dc8:ffff:ffff:ffff:ffff:ffff:ffff,VN +2001:dc9::,2001:dc9:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:dca::,2001:dca:ffff:ffff:ffff:ffff:ffff:ffff,HK +2001:dcc::,2001:dcc:ffff:ffff:ffff:ffff:ffff:ffff,KR +2001:dcd::,2001:dcd:ffff:ffff:ffff:ffff:ffff:ffff,AU +2001:dce::,2001:dce:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2001:dd8::,2001:dd8::ffff:ffff:ffff:ffff:ffff,FJ +2001:dd8:1::,2001:dd8:1:ffff:ffff:ffff:ffff:ffff,CN +2001:dd8:2::,2001:dd8:2:ffff:ffff:ffff:ffff:ffff,MY +2001:dd8:3::,2001:dd8:3:ffff:ffff:ffff:ffff:ffff,NZ +2001:dd8:4::,2001:dd8:4:ffff:ffff:ffff:ffff:ffff,SG +2001:dd8:5::,2001:dd8:5:ffff:ffff:ffff:ffff:ffff,CN +2001:dd8:6::,2001:dd8:6:ffff:ffff:ffff:ffff:ffff,AU +2001:dd8:7::,2001:dd8:7:ffff:ffff:ffff:ffff:ffff,NP +2001:dd8:8::,2001:dd8:f:ffff:ffff:ffff:ffff:ffff,AU +2001:dd8:10::,2001:dd8:11:ffff:ffff:ffff:ffff:ffff,NP +2001:dd8:12::,2001:dd8:12:ffff:ffff:ffff:ffff:ffff,AU +2001:dd8:13::,2001:dd8:13:ffff:ffff:ffff:ffff:ffff,NZ +2001:dd8:14::,2001:dd8:14:ffff:ffff:ffff:ffff:ffff,AU +2001:dd8:15::,2001:dd8:15:ffff:ffff:ffff:ffff:ffff,HK +2001:dd8:16::,2001:dd8:16:ffff:ffff:ffff:ffff:ffff,SG +2001:dd8:17::,2001:dd8:17:ffff:ffff:ffff:ffff:ffff,KR +2001:dd8:18::,2001:dd8:18:ffff:ffff:ffff:ffff:ffff,TW +2001:dd8:19::,2001:dd8:19:ffff:ffff:ffff:ffff:ffff,IN +2001:dd8:1a::,2001:dd8:1a:ffff:ffff:ffff:ffff:ffff,CN +2001:dd8:1b::,2001:dd8:1b:ffff:ffff:ffff:ffff:ffff,IN +2001:dd8:1c::,2001:dd8:1c:ffff:ffff:ffff:ffff:ffff,PK +2001:dd8:1d::,2001:dd8:1d:ffff:ffff:ffff:ffff:ffff,BD +2001:dd8:1e::,2001:dd8:1e:ffff:ffff:ffff:ffff:ffff,KH +2001:dd8:1f::,2001:dd8:1f:ffff:ffff:ffff:ffff:ffff,ID +2001:dd8:20::,2001:dd8:21:ffff:ffff:ffff:ffff:ffff,IN +2001:dd8:22::,2001:dd8:22:ffff:ffff:ffff:ffff:ffff,JP +2001:dd8:24::,2001:dd8:25:ffff:ffff:ffff:ffff:ffff,NP +2001:dda::,2001:dda::ffff:ffff:ffff:ffff:ffff,JP +2001:ddc::,2001:ddc::ffff:ffff:ffff:ffff:ffff,MY +2001:de1::,2001:de1:3f:ffff:ffff:ffff:ffff:ffff,JP +2001:de8::,2001:de8::ffff:ffff:ffff:ffff:ffff,TH +2001:de8:1::,2001:de8:1:ffff:ffff:ffff:ffff:ffff,IN +2001:de8:2::,2001:de8:2:ffff:ffff:ffff:ffff:ffff,ID +2001:de8:3::,2001:de8:3:ffff:ffff:ffff:ffff:ffff,VN +2001:de8:4::,2001:de8:7:ffff:ffff:ffff:ffff:ffff,SG +2001:de8:8::,2001:de8:8:ffff:ffff:ffff:ffff:ffff,JP +2001:de8:9::,2001:de8:9:ffff:ffff:ffff:ffff:ffff,AU +2001:de8:a::,2001:de8:a:ffff:ffff:ffff:ffff:ffff,VN +2001:de8:b::,2001:de8:b:ffff:ffff:ffff:ffff:ffff,BD +2001:de8:c::,2001:de8:c:ffff:ffff:ffff:ffff:ffff,JP +2001:de8:d::,2001:de8:d:ffff:ffff:ffff:ffff:ffff,SG +2001:de8:e::,2001:de8:e:ffff:ffff:ffff:ffff:ffff,TH +2001:de8:f::,2001:de8:10:ffff:ffff:ffff:ffff:ffff,MY +2001:de8:11::,2001:de8:11:ffff:ffff:ffff:ffff:ffff,ID +2001:de8:12::,2001:de8:12:ffff:ffff:ffff:ffff:ffff,SG +2001:de8:13::,2001:de8:13:ffff:ffff:ffff:ffff:ffff,MY +2001:de8:14::,2001:de8:14:ffff:ffff:ffff:ffff:ffff,AU +2001:de8:15::,2001:de8:15:ffff:ffff:ffff:ffff:ffff,ID +2001:de8:16::,2001:de8:16:ffff:ffff:ffff:ffff:ffff,PF +2001:de8:17::,2001:de8:17:ffff:ffff:ffff:ffff:ffff,AU +2001:de8:19::,2001:de8:19:ffff:ffff:ffff:ffff:ffff,NZ +2001:de8:1a::,2001:de8:1a:ffff:ffff:ffff:ffff:ffff,ID +2001:de8:1b::,2001:de8:1b:ffff:ffff:ffff:ffff:ffff,MY +2001:de8:1d::,2001:de8:1d:ffff:ffff:ffff:ffff:ffff,KH +2001:de8:1e::,2001:de8:1e:ffff:ffff:ffff:ffff:ffff,JP +2001:de9::,2001:de9::ffff:ffff:ffff:ffff:ffff,LK +2001:dea::,2001:dea::ffff:ffff:ffff:ffff:ffff,AU +2001:deb::,2001:deb::ffff:ffff:ffff:ffff:ffff,TH +2001:dec::,2001:dec::ffff:ffff:ffff:ffff:ffff,VU +2001:ded::,2001:ded::ffff:ffff:ffff:ffff:ffff,SG +2001:dee::,2001:dee::ffff:ffff:ffff:ffff:ffff,HK +2001:df0::,2001:df0:1:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:2::,2001:df0:2:ffff:ffff:ffff:ffff:ffff,JP +2001:df0:4::,2001:df0:4:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:7::,2001:df0:7:ffff:ffff:ffff:ffff:ffff,SG +2001:df0:8::,2001:df0:8:ffff:ffff:ffff:ffff:ffff,JP +2001:df0:9::,2001:df0:a:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:c::,2001:df0:13:ffff:ffff:ffff:ffff:ffff,VN +2001:df0:14::,2001:df0:14:ffff:ffff:ffff:ffff:ffff,SG +2001:df0:15::,2001:df0:15:ffff:ffff:ffff:ffff:ffff,JP +2001:df0:17::,2001:df0:17:ffff:ffff:ffff:ffff:ffff,LK +2001:df0:18::,2001:df0:18:ffff:ffff:ffff:ffff:ffff,MY +2001:df0:19::,2001:df0:1d:ffff:ffff:ffff:ffff:ffff,VN +2001:df0:1e::,2001:df0:1e:ffff:ffff:ffff:ffff:ffff,TH +2001:df0:1f::,2001:df0:1f:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:20::,2001:df0:3f:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:40::,2001:df0:40:ffff:ffff:ffff:ffff:ffff,VN +2001:df0:41::,2001:df0:41:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:42::,2001:df0:42:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:43::,2001:df0:43:ffff:ffff:ffff:ffff:ffff,JP +2001:df0:44::,2001:df0:44:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:45::,2001:df0:46:ffff:ffff:ffff:ffff:ffff,JP +2001:df0:48::,2001:df0:48:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:49::,2001:df0:49:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:4a::,2001:df0:4a:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:4b::,2001:df0:4d:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:4f::,2001:df0:60:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:62::,2001:df0:62:ffff:ffff:ffff:ffff:ffff,TH +2001:df0:63::,2001:df0:63:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:65::,2001:df0:65:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:66::,2001:df0:66:ffff:ffff:ffff:ffff:ffff,VN +2001:df0:68::,2001:df0:68:ffff:ffff:ffff:ffff:ffff,JP +2001:df0:69::,2001:df0:69:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:6a::,2001:df0:6a:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:6b::,2001:df0:6b:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:6c::,2001:df0:6c:ffff:ffff:ffff:ffff:ffff,WS +2001:df0:6f::,2001:df0:6f:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:70::,2001:df0:70:ffff:ffff:ffff:ffff:ffff,PH +2001:df0:71::,2001:df0:71:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:73::,2001:df0:74:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:75::,2001:df0:75:ffff:ffff:ffff:ffff:ffff,SG +2001:df0:76::,2001:df0:76:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:77::,2001:df0:77:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:78::,2001:df0:78:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:7b::,2001:df0:7c:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:7d::,2001:df0:7d:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:7e::,2001:df0:81:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:82::,2001:df0:82:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:83::,2001:df0:83:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:84::,2001:df0:84:ffff:ffff:ffff:ffff:ffff,PK +2001:df0:85::,2001:df0:85:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:86::,2001:df0:87:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:89::,2001:df0:89:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:8b::,2001:df0:8b:ffff:ffff:ffff:ffff:ffff,NP +2001:df0:8c::,2001:df0:8c:ffff:ffff:ffff:ffff:ffff,NU +2001:df0:8e::,2001:df0:90:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:91::,2001:df0:91:ffff:ffff:ffff:ffff:ffff,FJ +2001:df0:92::,2001:df0:92:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:93::,2001:df0:93:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:94::,2001:df0:94:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:95::,2001:df0:95:ffff:ffff:ffff:ffff:ffff,JP +2001:df0:96::,2001:df0:96:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:97::,2001:df0:97:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:98::,2001:df0:9a:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:9c::,2001:df0:9c:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:9d::,2001:df0:9d:ffff:ffff:ffff:ffff:ffff,MY +2001:df0:9e::,2001:df0:9e:ffff:ffff:ffff:ffff:ffff,TH +2001:df0:9f::,2001:df0:9f:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:a0::,2001:df0:a1:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:a2::,2001:df0:a2:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:a3::,2001:df0:a3:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:a4::,2001:df0:a4:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:a5::,2001:df0:a6:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:a7::,2001:df0:ab:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:ad::,2001:df0:ad:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:ae::,2001:df0:ae:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:b0::,2001:df0:b0:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:b1::,2001:df0:b8:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:b9::,2001:df0:b9:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:ba::,2001:df0:bd:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:be::,2001:df0:be:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:bf::,2001:df0:bf:ffff:ffff:ffff:ffff:ffff,LA +2001:df0:c0::,2001:df0:c0:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:c1::,2001:df0:c2:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:c4::,2001:df0:c4:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:c5::,2001:df0:c5:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:c6::,2001:df0:c6:ffff:ffff:ffff:ffff:ffff,SG +2001:df0:c7::,2001:df0:c8:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:c9::,2001:df0:cc:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:cd::,2001:df0:cd:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:ce::,2001:df0:ce:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:cf::,2001:df0:cf:ffff:ffff:ffff:ffff:ffff,JP +2001:df0:d1::,2001:df0:d1:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:d2::,2001:df0:d2:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:d4::,2001:df0:d6:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:d7::,2001:df0:d7:ffff:ffff:ffff:ffff:ffff,KR +2001:df0:d8::,2001:df0:d8:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:d9::,2001:df0:d9:ffff:ffff:ffff:ffff:ffff,TW +2001:df0:da::,2001:df0:da:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:dc::,2001:df0:dc:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:dd::,2001:df0:dd:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:de::,2001:df0:df:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:e1::,2001:df0:e1:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:e2::,2001:df0:e2:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:e3::,2001:df0:e3:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:e4::,2001:df0:e5:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:e6::,2001:df0:e6:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:e7::,2001:df0:e8:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:e9::,2001:df0:e9:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:ea::,2001:df0:ea:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:eb::,2001:df0:eb:ffff:ffff:ffff:ffff:ffff,JP +2001:df0:ed::,2001:df0:ed:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:ee::,2001:df0:ee:ffff:ffff:ffff:ffff:ffff,MY +2001:df0:ef::,2001:df0:f0:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:f1::,2001:df0:f1:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:f2::,2001:df0:f2:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:f3::,2001:df0:f3:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:f4::,2001:df0:f4:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:f5::,2001:df0:f5:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:f6::,2001:df0:f6:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:f7::,2001:df0:f7:ffff:ffff:ffff:ffff:ffff,SG +2001:df0:f8::,2001:df0:fa:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:fb::,2001:df0:fb:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:fc::,2001:df0:fc:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:fd::,2001:df0:fe:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:100::,2001:df0:1ff:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:201::,2001:df0:201:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:202::,2001:df0:202:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:203::,2001:df0:203:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:204::,2001:df0:204:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:205::,2001:df0:205:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:206::,2001:df0:206:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:207::,2001:df0:207:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:208::,2001:df0:208:ffff:ffff:ffff:ffff:ffff,MY +2001:df0:209::,2001:df0:209:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:20a::,2001:df0:20a:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:20b::,2001:df0:20b:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:20c::,2001:df0:20c:ffff:ffff:ffff:ffff:ffff,NF +2001:df0:20d::,2001:df0:20d:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:20e::,2001:df0:20e:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:210::,2001:df0:210:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:211::,2001:df0:211:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:212::,2001:df0:212:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:213::,2001:df0:213:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:214::,2001:df0:214:ffff:ffff:ffff:ffff:ffff,SG +2001:df0:215::,2001:df0:215:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:216::,2001:df0:217:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:218::,2001:df0:219:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:21a::,2001:df0:21a:ffff:ffff:ffff:ffff:ffff,SG +2001:df0:21b::,2001:df0:21b:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:21c::,2001:df0:21c:ffff:ffff:ffff:ffff:ffff,PH +2001:df0:21d::,2001:df0:21d:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:21e::,2001:df0:21e:ffff:ffff:ffff:ffff:ffff,JP +2001:df0:21f::,2001:df0:220:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:221::,2001:df0:221:ffff:ffff:ffff:ffff:ffff,VN +2001:df0:222::,2001:df0:222:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:224::,2001:df0:224:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:225::,2001:df0:225:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:226::,2001:df0:228:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:229::,2001:df0:229:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:22b::,2001:df0:22b:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:22c::,2001:df0:22d:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:22e::,2001:df0:22f:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:230::,2001:df0:230:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:231::,2001:df0:231:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:232::,2001:df0:232:ffff:ffff:ffff:ffff:ffff,JP +2001:df0:233::,2001:df0:234:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:235::,2001:df0:235:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:237::,2001:df0:237:ffff:ffff:ffff:ffff:ffff,TH +2001:df0:238::,2001:df0:238:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:239::,2001:df0:239:ffff:ffff:ffff:ffff:ffff,SG +2001:df0:23a::,2001:df0:23a:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:23b::,2001:df0:23b:ffff:ffff:ffff:ffff:ffff,PH +2001:df0:23c::,2001:df0:23d:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:23e::,2001:df0:23e:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:23f::,2001:df0:23f:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:240::,2001:df0:241:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:242::,2001:df0:242:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:243::,2001:df0:243:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:245::,2001:df0:246:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:247::,2001:df0:247:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:248::,2001:df0:248:ffff:ffff:ffff:ffff:ffff,TH +2001:df0:249::,2001:df0:24a:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:24b::,2001:df0:24b:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:24c::,2001:df0:24c:ffff:ffff:ffff:ffff:ffff,MY +2001:df0:24e::,2001:df0:24e:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:24f::,2001:df0:24f:ffff:ffff:ffff:ffff:ffff,SG +2001:df0:250::,2001:df0:250:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:251::,2001:df0:252:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:253::,2001:df0:253:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:254::,2001:df0:254:ffff:ffff:ffff:ffff:ffff,JP +2001:df0:255::,2001:df0:255:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:256::,2001:df0:256:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:257::,2001:df0:257:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:258::,2001:df0:258:ffff:ffff:ffff:ffff:ffff,JP +2001:df0:259::,2001:df0:259:ffff:ffff:ffff:ffff:ffff,SG +2001:df0:25a::,2001:df0:25a:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:25b::,2001:df0:25b:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:25c::,2001:df0:25d:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:25e::,2001:df0:25e:ffff:ffff:ffff:ffff:ffff,JP +2001:df0:260::,2001:df0:260:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:261::,2001:df0:261:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:262::,2001:df0:262:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:263::,2001:df0:263:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:264::,2001:df0:264:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:265::,2001:df0:265:ffff:ffff:ffff:ffff:ffff,TH +2001:df0:266::,2001:df0:266:ffff:ffff:ffff:ffff:ffff,JP +2001:df0:267::,2001:df0:267:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:268::,2001:df0:269:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:26a::,2001:df0:26b:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:26c::,2001:df0:26c:ffff:ffff:ffff:ffff:ffff,SG +2001:df0:26d::,2001:df0:26f:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:270::,2001:df0:270:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:271::,2001:df0:271:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:272::,2001:df0:272:ffff:ffff:ffff:ffff:ffff,MY +2001:df0:273::,2001:df0:273:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:274::,2001:df0:277:ffff:ffff:ffff:ffff:ffff,NP +2001:df0:278::,2001:df0:278:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:279::,2001:df0:279:ffff:ffff:ffff:ffff:ffff,PK +2001:df0:27a::,2001:df0:27a:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:27b::,2001:df0:27b:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:27c::,2001:df0:27c:ffff:ffff:ffff:ffff:ffff,SG +2001:df0:27d::,2001:df0:27d:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:27e::,2001:df0:27e:ffff:ffff:ffff:ffff:ffff,CN +2001:df0:27f::,2001:df0:27f:ffff:ffff:ffff:ffff:ffff,JP +2001:df0:280::,2001:df0:28f:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:290::,2001:df0:290:ffff:ffff:ffff:ffff:ffff,KR +2001:df0:291::,2001:df0:291:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:292::,2001:df0:292:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:293::,2001:df0:293:ffff:ffff:ffff:ffff:ffff,JP +2001:df0:294::,2001:df0:294:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:295::,2001:df0:296:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:298::,2001:df0:298:ffff:ffff:ffff:ffff:ffff,PH +2001:df0:299::,2001:df0:299:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:29a::,2001:df0:29a:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:29b::,2001:df0:29b:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:29c::,2001:df0:29c:ffff:ffff:ffff:ffff:ffff,VN +2001:df0:29d::,2001:df0:29d:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:29e::,2001:df0:29e:ffff:ffff:ffff:ffff:ffff,SG +2001:df0:29f::,2001:df0:29f:ffff:ffff:ffff:ffff:ffff,BD +2001:df0:2a0::,2001:df0:2a0:ffff:ffff:ffff:ffff:ffff,MY +2001:df0:2a1::,2001:df0:2a1:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:2a2::,2001:df0:2a2:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:2a3::,2001:df0:2a3:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:2a4::,2001:df0:2a4:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:2a5::,2001:df0:2a5:ffff:ffff:ffff:ffff:ffff,SG +2001:df0:2a6::,2001:df0:2a6:ffff:ffff:ffff:ffff:ffff,JP +2001:df0:2a7::,2001:df0:2a7:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:2a8::,2001:df0:2a8:ffff:ffff:ffff:ffff:ffff,PH +2001:df0:2a9::,2001:df0:2aa:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:2ab::,2001:df0:2ab:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:2ac::,2001:df0:2ac:ffff:ffff:ffff:ffff:ffff,SG +2001:df0:2ad::,2001:df0:2ad:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:2ae::,2001:df0:2ae:ffff:ffff:ffff:ffff:ffff,WS +2001:df0:2af::,2001:df0:2af:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:2b0::,2001:df0:2b1:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:2b2::,2001:df0:2b2:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:2b4::,2001:df0:2b4:ffff:ffff:ffff:ffff:ffff,JP +2001:df0:2b5::,2001:df0:2b5:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:2b7::,2001:df0:2b7:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:2b8::,2001:df0:2b8:ffff:ffff:ffff:ffff:ffff,MY +2001:df0:2b9::,2001:df0:2b9:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:2ba::,2001:df0:2ba:ffff:ffff:ffff:ffff:ffff,SG +2001:df0:2bb::,2001:df0:2bb:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:2bc::,2001:df0:2bc:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:2bd::,2001:df0:2bd:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:2be::,2001:df0:2be:ffff:ffff:ffff:ffff:ffff,JP +2001:df0:2bf::,2001:df0:2bf:ffff:ffff:ffff:ffff:ffff,MY +2001:df0:2c1::,2001:df0:2c1:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:2c2::,2001:df0:2c2:ffff:ffff:ffff:ffff:ffff,JP +2001:df0:2c3::,2001:df0:2c3:ffff:ffff:ffff:ffff:ffff,BD +2001:df0:2c4::,2001:df0:2c4:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:2c5::,2001:df0:2c5:ffff:ffff:ffff:ffff:ffff,BD +2001:df0:2c6::,2001:df0:2c8:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:2c9::,2001:df0:2c9:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:2ca::,2001:df0:2ca:ffff:ffff:ffff:ffff:ffff,JP +2001:df0:2cb::,2001:df0:2cb:ffff:ffff:ffff:ffff:ffff,PK +2001:df0:2cc::,2001:df0:2cc:ffff:ffff:ffff:ffff:ffff,JP +2001:df0:2ce::,2001:df0:2e0:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:2e1::,2001:df0:2e1:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:2e2::,2001:df0:2e2:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:2e3::,2001:df0:2e3:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:2e4::,2001:df0:2e4:ffff:ffff:ffff:ffff:ffff,JP +2001:df0:2e5::,2001:df0:2e5:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:2e6::,2001:df0:2e7:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:2e8::,2001:df0:2e8:ffff:ffff:ffff:ffff:ffff,VN +2001:df0:2e9::,2001:df0:2e9:ffff:ffff:ffff:ffff:ffff,CN +2001:df0:2ea::,2001:df0:2ea:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:2ec::,2001:df0:2ec:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:2ed::,2001:df0:2ee:ffff:ffff:ffff:ffff:ffff,JP +2001:df0:2ef::,2001:df0:2ef:ffff:ffff:ffff:ffff:ffff,PH +2001:df0:2f0::,2001:df0:2f3:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:2f4::,2001:df0:2f4:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:2f5::,2001:df0:2f5:ffff:ffff:ffff:ffff:ffff,JP +2001:df0:2f6::,2001:df0:2f6:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:2f9::,2001:df0:2f9:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:2fa::,2001:df0:2fa:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:2fb::,2001:df0:2fb:ffff:ffff:ffff:ffff:ffff,TH +2001:df0:2fc::,2001:df0:2fc:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:2fd::,2001:df0:2fd:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:2fe::,2001:df0:2ff:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:300::,2001:df0:311:ffff:ffff:ffff:ffff:ffff,SG +2001:df0:314::,2001:df0:317:ffff:ffff:ffff:ffff:ffff,SG +2001:df0:400::,2001:df0:400:ffff:ffff:ffff:ffff:ffff,SG +2001:df0:401::,2001:df0:401:ffff:ffff:ffff:ffff:ffff,JP +2001:df0:402::,2001:df0:403:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:404::,2001:df0:404:ffff:ffff:ffff:ffff:ffff,SG +2001:df0:405::,2001:df0:405:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:407::,2001:df0:407:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:408::,2001:df0:408:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:409::,2001:df0:409:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:40a::,2001:df0:40a:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:40c::,2001:df0:40c:ffff:ffff:ffff:ffff:ffff,JP +2001:df0:40d::,2001:df0:40d:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:40e::,2001:df0:40f:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:410::,2001:df0:410:ffff:ffff:ffff:ffff:ffff,VU +2001:df0:411::,2001:df0:411:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:412::,2001:df0:412:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:413::,2001:df0:413:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:415::,2001:df0:415:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:417::,2001:df0:417:ffff:ffff:ffff:ffff:ffff,JP +2001:df0:418::,2001:df0:419:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:41a::,2001:df0:41a:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:41b::,2001:df0:41b:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:41c::,2001:df0:41c:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:41d::,2001:df0:41e:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:41f::,2001:df0:41f:ffff:ffff:ffff:ffff:ffff,MY +2001:df0:420::,2001:df0:420:ffff:ffff:ffff:ffff:ffff,SG +2001:df0:421::,2001:df0:421:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:422::,2001:df0:422:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:423::,2001:df0:423:ffff:ffff:ffff:ffff:ffff,CN +2001:df0:424::,2001:df0:424:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:425::,2001:df0:425:ffff:ffff:ffff:ffff:ffff,SG +2001:df0:426::,2001:df0:426:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:427::,2001:df0:427:ffff:ffff:ffff:ffff:ffff,MY +2001:df0:430::,2001:df0:43f:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:440::,2001:df0:440:ffff:ffff:ffff:ffff:ffff,JP +2001:df0:441::,2001:df0:441:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:442::,2001:df0:443:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:444::,2001:df0:445:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:446::,2001:df0:446:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:447::,2001:df0:447:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:448::,2001:df0:448:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:449::,2001:df0:449:ffff:ffff:ffff:ffff:ffff,JP +2001:df0:44a::,2001:df0:44a:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:44b::,2001:df0:44b:ffff:ffff:ffff:ffff:ffff,MY +2001:df0:44c::,2001:df0:44d:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:44e::,2001:df0:44e:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:44f::,2001:df0:44f:ffff:ffff:ffff:ffff:ffff,SG +2001:df0:450::,2001:df0:450:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:451::,2001:df0:451:ffff:ffff:ffff:ffff:ffff,MY +2001:df0:452::,2001:df0:452:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:453::,2001:df0:453:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:454::,2001:df0:454:ffff:ffff:ffff:ffff:ffff,SG +2001:df0:455::,2001:df0:455:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:456::,2001:df0:456:ffff:ffff:ffff:ffff:ffff,JP +2001:df0:457::,2001:df0:457:ffff:ffff:ffff:ffff:ffff,MY +2001:df0:458::,2001:df0:458:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:459::,2001:df0:459:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:45a::,2001:df0:45a:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:45b::,2001:df0:45b:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:45c::,2001:df0:45d:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:45e::,2001:df0:45e:ffff:ffff:ffff:ffff:ffff,BD +2001:df0:45f::,2001:df0:45f:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:460::,2001:df0:460:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:461::,2001:df0:461:ffff:ffff:ffff:ffff:ffff,SG +2001:df0:462::,2001:df0:462:ffff:ffff:ffff:ffff:ffff,JP +2001:df0:463::,2001:df0:463:ffff:ffff:ffff:ffff:ffff,SG +2001:df0:464::,2001:df0:464:ffff:ffff:ffff:ffff:ffff,MY +2001:df0:465::,2001:df0:465:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:466::,2001:df0:466:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:467::,2001:df0:467:ffff:ffff:ffff:ffff:ffff,JP +2001:df0:468::,2001:df0:469:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:46a::,2001:df0:46a:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:46b::,2001:df0:46b:ffff:ffff:ffff:ffff:ffff,MY +2001:df0:46c::,2001:df0:46c:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:500::,2001:df0:5ff:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:800::,2001:df0:800:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:c00::,2001:df0:c00:ffff:ffff:ffff:ffff:ffff,MY +2001:df0:1000::,2001:df0:1000:ffff:ffff:ffff:ffff:ffff,TH +2001:df0:1400::,2001:df0:1400:ffff:ffff:ffff:ffff:ffff,SG +2001:df0:1800::,2001:df0:1800:ffff:ffff:ffff:ffff:ffff,JP +2001:df0:1c00::,2001:df0:1c00:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:2000::,2001:df0:2000:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:2400::,2001:df0:2400:ffff:ffff:ffff:ffff:ffff,SG +2001:df0:2800::,2001:df0:2800:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:2c00::,2001:df0:2c00:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:3000::,2001:df0:3000:ffff:ffff:ffff:ffff:ffff,PH +2001:df0:3400::,2001:df0:3400:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:3c00::,2001:df0:3c00:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:4000::,2001:df0:4000:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:4400::,2001:df0:4400:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:4800::,2001:df0:4800:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:4c00::,2001:df0:4c00:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:5000::,2001:df0:5000:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:5400::,2001:df0:5400:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:5800::,2001:df0:5800:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:5c00::,2001:df0:5c00:ffff:ffff:ffff:ffff:ffff,BD +2001:df0:6000::,2001:df0:6000:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:6400::,2001:df0:6400:ffff:ffff:ffff:ffff:ffff,SG +2001:df0:6800::,2001:df0:6800:ffff:ffff:ffff:ffff:ffff,JP +2001:df0:6c00::,2001:df0:6c00:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:7000::,2001:df0:7000:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:7400::,2001:df0:7400:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:7800::,2001:df0:7800:ffff:ffff:ffff:ffff:ffff,WS +2001:df0:7c00::,2001:df0:7c00:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:8000::,2001:df0:8000:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:8400::,2001:df0:8400:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:8800::,2001:df0:8800:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:8c00::,2001:df0:8c00:ffff:ffff:ffff:ffff:ffff,MY +2001:df0:9400::,2001:df0:9400:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:9800::,2001:df0:9800:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:9c00::,2001:df0:9c00:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:a000::,2001:df0:a000:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:a400::,2001:df0:a400:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:a800::,2001:df0:a800:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:ac00::,2001:df0:ac00:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:b000::,2001:df0:b000:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:b400::,2001:df0:b400:ffff:ffff:ffff:ffff:ffff,JP +2001:df0:b800::,2001:df0:b800:ffff:ffff:ffff:ffff:ffff,PH +2001:df0:bc00::,2001:df0:bc00:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:c000::,2001:df0:c000:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:c400::,2001:df0:c400:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:c800::,2001:df0:c800:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:cc00::,2001:df0:cc00:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:d000::,2001:df0:d000:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:d400::,2001:df0:d400:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:d800::,2001:df0:d800:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:dc00::,2001:df0:dc00:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:e000::,2001:df0:e000:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:e400::,2001:df0:e400:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:e800::,2001:df0:e800:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:ec00::,2001:df0:ec00:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:f000::,2001:df0:f000:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:f400::,2001:df0:f401:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:f800::,2001:df0:f800:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:fc00::,2001:df0:fc01:ffff:ffff:ffff:ffff:ffff,IN +2001:df1::,2001:df1::ffff:ffff:ffff:ffff:ffff,TH +2001:df1:400::,2001:df1:400:ffff:ffff:ffff:ffff:ffff,BD +2001:df1:800::,2001:df1:801:ffff:ffff:ffff:ffff:ffff,SG +2001:df1:c00::,2001:df1:c00:ffff:ffff:ffff:ffff:ffff,IN +2001:df1:1000::,2001:df1:1000:ffff:ffff:ffff:ffff:ffff,IN +2001:df1:1400::,2001:df1:1400:ffff:ffff:ffff:ffff:ffff,IN +2001:df1:1800::,2001:df1:1800:ffff:ffff:ffff:ffff:ffff,AU +2001:df1:1c00::,2001:df1:1c00:ffff:ffff:ffff:ffff:ffff,IN +2001:df1:2000::,2001:df1:2000:ffff:ffff:ffff:ffff:ffff,AU +2001:df1:2400::,2001:df1:2400:ffff:ffff:ffff:ffff:ffff,PH +2001:df1:2800::,2001:df1:2800:ffff:ffff:ffff:ffff:ffff,SG +2001:df1:2c00::,2001:df1:2c00:ffff:ffff:ffff:ffff:ffff,AU +2001:df1:3000::,2001:df1:3000:ffff:ffff:ffff:ffff:ffff,AU +2001:df1:3400::,2001:df1:3400:ffff:ffff:ffff:ffff:ffff,BD +2001:df1:3800::,2001:df1:3800:ffff:ffff:ffff:ffff:ffff,NZ +2001:df1:3c00::,2001:df1:3c00:ffff:ffff:ffff:ffff:ffff,IN +2001:df1:4000::,2001:df1:4000:ffff:ffff:ffff:ffff:ffff,AU +2001:df1:4400::,2001:df1:4400:ffff:ffff:ffff:ffff:ffff,IN +2001:df1:4800::,2001:df1:4800:ffff:ffff:ffff:ffff:ffff,IN +2001:df1:4c00::,2001:df1:4c00:ffff:ffff:ffff:ffff:ffff,HK +2001:df1:5000::,2001:df1:5000:ffff:ffff:ffff:ffff:ffff,HK +2001:df1:5400::,2001:df1:5400:ffff:ffff:ffff:ffff:ffff,KR +2001:df1:5800::,2001:df1:5800:ffff:ffff:ffff:ffff:ffff,BD +2001:df1:5c00::,2001:df1:5c00:ffff:ffff:ffff:ffff:ffff,ID +2001:df1:6000::,2001:df1:6000:ffff:ffff:ffff:ffff:ffff,SG +2001:df1:6400::,2001:df1:6400:ffff:ffff:ffff:ffff:ffff,TH +2001:df1:6800::,2001:df1:6800:ffff:ffff:ffff:ffff:ffff,AU +2001:df1:6c00::,2001:df1:6c00:ffff:ffff:ffff:ffff:ffff,TH +2001:df1:7000::,2001:df1:7000:ffff:ffff:ffff:ffff:ffff,ID +2001:df1:7400::,2001:df1:7400:ffff:ffff:ffff:ffff:ffff,SG +2001:df1:7800::,2001:df1:7800:ffff:ffff:ffff:ffff:ffff,ID +2001:df1:7c00::,2001:df1:7c00:ffff:ffff:ffff:ffff:ffff,NZ +2001:df1:8000::,2001:df1:8000:ffff:ffff:ffff:ffff:ffff,IN +2001:df1:8400::,2001:df1:8400:ffff:ffff:ffff:ffff:ffff,BD +2001:df1:8800::,2001:df1:8800:ffff:ffff:ffff:ffff:ffff,AU +2001:df1:8c00::,2001:df1:8c00:ffff:ffff:ffff:ffff:ffff,AU +2001:df1:9000::,2001:df1:9000:ffff:ffff:ffff:ffff:ffff,ID +2001:df1:9400::,2001:df1:9400:ffff:ffff:ffff:ffff:ffff,HK +2001:df1:9800::,2001:df1:9800:ffff:ffff:ffff:ffff:ffff,MY +2001:df1:9c00::,2001:df1:9c00:ffff:ffff:ffff:ffff:ffff,SG +2001:df1:a000::,2001:df1:a000:ffff:ffff:ffff:ffff:ffff,IN +2001:df1:a400::,2001:df1:a400:ffff:ffff:ffff:ffff:ffff,BD +2001:df1:a800::,2001:df1:a800:ffff:ffff:ffff:ffff:ffff,SG +2001:df1:ac00::,2001:df1:ac00:ffff:ffff:ffff:ffff:ffff,HK +2001:df1:b000::,2001:df1:b000:ffff:ffff:ffff:ffff:ffff,TH +2001:df1:b400::,2001:df1:b400:ffff:ffff:ffff:ffff:ffff,AU +2001:df1:b800::,2001:df1:b800:ffff:ffff:ffff:ffff:ffff,AU +2001:df1:bc00::,2001:df1:bc00:ffff:ffff:ffff:ffff:ffff,SG +2001:df1:c400::,2001:df1:c400:ffff:ffff:ffff:ffff:ffff,AU +2001:df1:c800::,2001:df1:c800:ffff:ffff:ffff:ffff:ffff,HK +2001:df1:cc00::,2001:df1:cc00:ffff:ffff:ffff:ffff:ffff,AU +2001:df1:d000::,2001:df1:d000:ffff:ffff:ffff:ffff:ffff,AU +2001:df1:d400::,2001:df1:d400:ffff:ffff:ffff:ffff:ffff,HK +2001:df1:d800::,2001:df1:d800:ffff:ffff:ffff:ffff:ffff,AU +2001:df1:e000::,2001:df1:e000:ffff:ffff:ffff:ffff:ffff,ID +2001:df1:e800::,2001:df1:e800:ffff:ffff:ffff:ffff:ffff,AU +2001:df1:f000::,2001:df1:f000:ffff:ffff:ffff:ffff:ffff,ID +2001:df1:f800::,2001:df1:f800:ffff:ffff:ffff:ffff:ffff,BN +2001:df2::,2001:df2::ffff:ffff:ffff:ffff:ffff,AU +2001:df2:800::,2001:df2:800:ffff:ffff:ffff:ffff:ffff,AU +2001:df2:1000::,2001:df2:1001:ffff:ffff:ffff:ffff:ffff,IN +2001:df2:1800::,2001:df2:1803:ffff:ffff:ffff:ffff:ffff,IN +2001:df2:2000::,2001:df2:2000:ffff:ffff:ffff:ffff:ffff,IN +2001:df2:2800::,2001:df2:2800:ffff:ffff:ffff:ffff:ffff,IN +2001:df2:3000::,2001:df2:3000:ffff:ffff:ffff:ffff:ffff,SG +2001:df2:3800::,2001:df2:3800:ffff:ffff:ffff:ffff:ffff,TH +2001:df2:4000::,2001:df2:4000:ffff:ffff:ffff:ffff:ffff,HK +2001:df2:4800::,2001:df2:4800:ffff:ffff:ffff:ffff:ffff,IN +2001:df2:5000::,2001:df2:5000:ffff:ffff:ffff:ffff:ffff,IN +2001:df2:5800::,2001:df2:5800:ffff:ffff:ffff:ffff:ffff,HK +2001:df2:6000::,2001:df2:6000:ffff:ffff:ffff:ffff:ffff,ID +2001:df2:6800::,2001:df2:6800:ffff:ffff:ffff:ffff:ffff,PH +2001:df2:7000::,2001:df2:7000:ffff:ffff:ffff:ffff:ffff,IN +2001:df2:7800::,2001:df2:7800:ffff:ffff:ffff:ffff:ffff,AU +2001:df2:8000::,2001:df2:8000:ffff:ffff:ffff:ffff:ffff,BN +2001:df2:8800::,2001:df2:8800:ffff:ffff:ffff:ffff:ffff,IN +2001:df2:9800::,2001:df2:9803:ffff:ffff:ffff:ffff:ffff,IN +2001:df2:a000::,2001:df2:a000:ffff:ffff:ffff:ffff:ffff,ID +2001:df2:a800::,2001:df2:a800:ffff:ffff:ffff:ffff:ffff,IN +2001:df2:b000::,2001:df2:b000:ffff:ffff:ffff:ffff:ffff,IN +2001:df2:c000::,2001:df2:c000:ffff:ffff:ffff:ffff:ffff,ID +2001:df2:c800::,2001:df2:c800:ffff:ffff:ffff:ffff:ffff,AU +2001:df2:d000::,2001:df2:d000:ffff:ffff:ffff:ffff:ffff,HK +2001:df2:d800::,2001:df2:d800:ffff:ffff:ffff:ffff:ffff,JP +2001:df2:e000::,2001:df2:e000:ffff:ffff:ffff:ffff:ffff,AU +2001:df2:e800::,2001:df2:e800:ffff:ffff:ffff:ffff:ffff,IN +2001:df2:f000::,2001:df2:f000:ffff:ffff:ffff:ffff:ffff,VN +2001:df2:f800::,2001:df2:f800:ffff:ffff:ffff:ffff:ffff,IN +2001:df3::,2001:df3::ffff:ffff:ffff:ffff:ffff,MY +2001:df3:800::,2001:df3:80f:ffff:ffff:ffff:ffff:ffff,CN +2001:df3:1000::,2001:df3:1000:ffff:ffff:ffff:ffff:ffff,BD +2001:df3:1800::,2001:df3:1800:ffff:ffff:ffff:ffff:ffff,ID +2001:df3:2000::,2001:df3:2000:ffff:ffff:ffff:ffff:ffff,ID +2001:df3:2800::,2001:df3:2800:ffff:ffff:ffff:ffff:ffff,IN +2001:df3:3000::,2001:df3:3000:ffff:ffff:ffff:ffff:ffff,IN +2001:df3:3800::,2001:df3:3800:ffff:ffff:ffff:ffff:ffff,ID +2001:df3:4000::,2001:df3:4000:ffff:ffff:ffff:ffff:ffff,NZ +2001:df3:4800::,2001:df3:4800:ffff:ffff:ffff:ffff:ffff,IN +2001:df3:5000::,2001:df3:5000:ffff:ffff:ffff:ffff:ffff,IN +2001:df3:5800::,2001:df3:5800:ffff:ffff:ffff:ffff:ffff,AU +2001:df3:6000::,2001:df3:6000:ffff:ffff:ffff:ffff:ffff,SG +2001:df3:6800::,2001:df3:6800:ffff:ffff:ffff:ffff:ffff,AU +2001:df3:7000::,2001:df3:7000:ffff:ffff:ffff:ffff:ffff,ID +2001:df3:7800::,2001:df3:7800:ffff:ffff:ffff:ffff:ffff,SG +2001:df3:8000::,2001:df3:8000:ffff:ffff:ffff:ffff:ffff,ID +2001:df3:8800::,2001:df3:8800:ffff:ffff:ffff:ffff:ffff,IN +2001:df3:9800::,2001:df3:9800:ffff:ffff:ffff:ffff:ffff,MY +2001:df3:a000::,2001:df3:a003:ffff:ffff:ffff:ffff:ffff,PH +2001:df3:a800::,2001:df3:a800:ffff:ffff:ffff:ffff:ffff,MY +2001:df3:b000::,2001:df3:b000:ffff:ffff:ffff:ffff:ffff,TH +2001:df3:b800::,2001:df3:b800:ffff:ffff:ffff:ffff:ffff,IN +2001:df3:c000::,2001:df3:c000:ffff:ffff:ffff:ffff:ffff,ID +2001:df3:c800::,2001:df3:c800:ffff:ffff:ffff:ffff:ffff,IN +2001:df3:d000::,2001:df3:d000:ffff:ffff:ffff:ffff:ffff,AU +2001:df3:d800::,2001:df3:d800:ffff:ffff:ffff:ffff:ffff,SG +2001:df3:e000::,2001:df3:e000:ffff:ffff:ffff:ffff:ffff,NZ +2001:df3:e800::,2001:df3:e800:ffff:ffff:ffff:ffff:ffff,IN +2001:df3:f000::,2001:df3:f000:ffff:ffff:ffff:ffff:ffff,ID +2001:df3:f800::,2001:df3:f800:ffff:ffff:ffff:ffff:ffff,IN +2001:df4::,2001:df4::ffff:ffff:ffff:ffff:ffff,MY +2001:df4:800::,2001:df4:800:ffff:ffff:ffff:ffff:ffff,AU +2001:df4:1000::,2001:df4:1000:ffff:ffff:ffff:ffff:ffff,HK +2001:df4:1800::,2001:df4:1800:ffff:ffff:ffff:ffff:ffff,IN +2001:df4:2000::,2001:df4:2000:ffff:ffff:ffff:ffff:ffff,TH +2001:df4:2800::,2001:df4:2800:ffff:ffff:ffff:ffff:ffff,HK +2001:df4:3000::,2001:df4:3000:ffff:ffff:ffff:ffff:ffff,TH +2001:df4:3800::,2001:df4:3800:ffff:ffff:ffff:ffff:ffff,BD +2001:df4:4000::,2001:df4:400f:ffff:ffff:ffff:ffff:ffff,SG +2001:df4:4800::,2001:df4:4800:ffff:ffff:ffff:ffff:ffff,AU +2001:df4:5000::,2001:df4:5000:ffff:ffff:ffff:ffff:ffff,ID +2001:df4:5800::,2001:df4:5800:ffff:ffff:ffff:ffff:ffff,AU +2001:df4:6000::,2001:df4:6000:ffff:ffff:ffff:ffff:ffff,MY +2001:df4:6800::,2001:df4:6800:ffff:ffff:ffff:ffff:ffff,SG +2001:df4:7000::,2001:df4:7000:ffff:ffff:ffff:ffff:ffff,HK +2001:df4:7800::,2001:df4:7800:ffff:ffff:ffff:ffff:ffff,IN +2001:df4:8000::,2001:df4:8000:ffff:ffff:ffff:ffff:ffff,MY +2001:df4:8800::,2001:df4:8800:ffff:ffff:ffff:ffff:ffff,HK +2001:df4:9000::,2001:df4:9000:ffff:ffff:ffff:ffff:ffff,SG +2001:df4:9800::,2001:df4:9800:ffff:ffff:ffff:ffff:ffff,ID +2001:df4:a000::,2001:df4:a000:ffff:ffff:ffff:ffff:ffff,NZ +2001:df4:a800::,2001:df4:a800:ffff:ffff:ffff:ffff:ffff,ID +2001:df4:b000::,2001:df4:b000:ffff:ffff:ffff:ffff:ffff,IN +2001:df4:b800::,2001:df4:b800:ffff:ffff:ffff:ffff:ffff,AU +2001:df4:c000::,2001:df4:c000:ffff:ffff:ffff:ffff:ffff,ID +2001:df4:c800::,2001:df4:c800:ffff:ffff:ffff:ffff:ffff,SG +2001:df4:d000::,2001:df4:d000:ffff:ffff:ffff:ffff:ffff,IN +2001:df4:d800::,2001:df4:d800:ffff:ffff:ffff:ffff:ffff,VN +2001:df4:e000::,2001:df4:e000:ffff:ffff:ffff:ffff:ffff,IN +2001:df4:e800::,2001:df4:e800:ffff:ffff:ffff:ffff:ffff,MN +2001:df4:f800::,2001:df4:f800:ffff:ffff:ffff:ffff:ffff,AU +2001:df5::,2001:df5::ffff:ffff:ffff:ffff:ffff,AU +2001:df5:800::,2001:df5:800:ffff:ffff:ffff:ffff:ffff,HK +2001:df5:1000::,2001:df5:1000:ffff:ffff:ffff:ffff:ffff,NZ +2001:df5:1800::,2001:df5:1800:ffff:ffff:ffff:ffff:ffff,ID +2001:df5:2000::,2001:df5:2000:ffff:ffff:ffff:ffff:ffff,NZ +2001:df5:2800::,2001:df5:2800:ffff:ffff:ffff:ffff:ffff,IN +2001:df5:3000::,2001:df5:3000:ffff:ffff:ffff:ffff:ffff,AU +2001:df5:3800::,2001:df5:3800:ffff:ffff:ffff:ffff:ffff,IN +2001:df5:4000::,2001:df5:4000:ffff:ffff:ffff:ffff:ffff,ID +2001:df5:4800::,2001:df5:4800:ffff:ffff:ffff:ffff:ffff,BN +2001:df5:5800::,2001:df5:5800:ffff:ffff:ffff:ffff:ffff,AU +2001:df5:6000::,2001:df5:6000:ffff:ffff:ffff:ffff:ffff,NZ +2001:df5:6800::,2001:df5:6800:ffff:ffff:ffff:ffff:ffff,KR +2001:df5:7000::,2001:df5:7000:ffff:ffff:ffff:ffff:ffff,ID +2001:df5:7800::,2001:df5:7800:ffff:ffff:ffff:ffff:ffff,CN +2001:df5:8000::,2001:df5:8000:ffff:ffff:ffff:ffff:ffff,SG +2001:df5:8800::,2001:df5:8800:ffff:ffff:ffff:ffff:ffff,IN +2001:df5:9000::,2001:df5:9000:ffff:ffff:ffff:ffff:ffff,IN +2001:df5:9800::,2001:df5:9800:ffff:ffff:ffff:ffff:ffff,SG +2001:df5:a000::,2001:df5:a000:ffff:ffff:ffff:ffff:ffff,ID +2001:df5:a800::,2001:df5:a800:ffff:ffff:ffff:ffff:ffff,AU +2001:df5:b000::,2001:df5:b000:ffff:ffff:ffff:ffff:ffff,NZ +2001:df5:b800::,2001:df5:b800:ffff:ffff:ffff:ffff:ffff,HK +2001:df5:c800::,2001:df5:c800:ffff:ffff:ffff:ffff:ffff,AU +2001:df5:d000::,2001:df5:d000:ffff:ffff:ffff:ffff:ffff,ID +2001:df5:d800::,2001:df5:d800:ffff:ffff:ffff:ffff:ffff,SG +2001:df5:e000::,2001:df5:e000:ffff:ffff:ffff:ffff:ffff,MY +2001:df5:e800::,2001:df5:e800:ffff:ffff:ffff:ffff:ffff,PH +2001:df5:f000::,2001:df5:f000:ffff:ffff:ffff:ffff:ffff,ID +2001:df5:f800::,2001:df5:f800:ffff:ffff:ffff:ffff:ffff,SG +2001:df6::,2001:df6:1:ffff:ffff:ffff:ffff:ffff,IN +2001:df6:800::,2001:df6:80f:ffff:ffff:ffff:ffff:ffff,HK +2001:df6:1000::,2001:df6:1000:ffff:ffff:ffff:ffff:ffff,PH +2001:df6:1800::,2001:df6:1800:ffff:ffff:ffff:ffff:ffff,ID +2001:df6:2000::,2001:df6:2001:ffff:ffff:ffff:ffff:ffff,HK +2001:df6:2800::,2001:df6:2800:ffff:ffff:ffff:ffff:ffff,IN +2001:df6:3000::,2001:df6:3000:ffff:ffff:ffff:ffff:ffff,NZ +2001:df6:3800::,2001:df6:3800:ffff:ffff:ffff:ffff:ffff,NZ +2001:df6:4000::,2001:df6:4001:ffff:ffff:ffff:ffff:ffff,AU +2001:df6:4800::,2001:df6:4801:ffff:ffff:ffff:ffff:ffff,NZ +2001:df6:5000::,2001:df6:5000:ffff:ffff:ffff:ffff:ffff,AU +2001:df6:5800::,2001:df6:5800:ffff:ffff:ffff:ffff:ffff,IN +2001:df6:6000::,2001:df6:6000:ffff:ffff:ffff:ffff:ffff,JP +2001:df6:6800::,2001:df6:6800:ffff:ffff:ffff:ffff:ffff,CN +2001:df6:7000::,2001:df6:7000:ffff:ffff:ffff:ffff:ffff,VN +2001:df6:7800::,2001:df6:7800:ffff:ffff:ffff:ffff:ffff,HK +2001:df6:8000::,2001:df6:8000:ffff:ffff:ffff:ffff:ffff,JP +2001:df6:8800::,2001:df6:8800:ffff:ffff:ffff:ffff:ffff,AU +2001:df6:9000::,2001:df6:9000:ffff:ffff:ffff:ffff:ffff,AU +2001:df6:9800::,2001:df6:9800:ffff:ffff:ffff:ffff:ffff,AU +2001:df6:a000::,2001:df6:a000:ffff:ffff:ffff:ffff:ffff,JP +2001:df6:a800::,2001:df6:a800:ffff:ffff:ffff:ffff:ffff,IN +2001:df6:b000::,2001:df6:b000:ffff:ffff:ffff:ffff:ffff,TH +2001:df6:b800::,2001:df6:b800:ffff:ffff:ffff:ffff:ffff,SG +2001:df6:c800::,2001:df6:c800:ffff:ffff:ffff:ffff:ffff,IN +2001:df6:d000::,2001:df6:d000:ffff:ffff:ffff:ffff:ffff,HK +2001:df6:d800::,2001:df6:d800:ffff:ffff:ffff:ffff:ffff,BD +2001:df6:e800::,2001:df6:e800:ffff:ffff:ffff:ffff:ffff,IN +2001:df6:f000::,2001:df6:f000:ffff:ffff:ffff:ffff:ffff,HK +2001:df6:f800::,2001:df6:f800:ffff:ffff:ffff:ffff:ffff,AU +2001:df7::,2001:df7::ffff:ffff:ffff:ffff:ffff,IN +2001:df7:800::,2001:df7:800:ffff:ffff:ffff:ffff:ffff,IN +2001:df7:1000::,2001:df7:1000:ffff:ffff:ffff:ffff:ffff,IN +2001:df7:1800::,2001:df7:1800:ffff:ffff:ffff:ffff:ffff,AU +2001:df7:2000::,2001:df7:2000:ffff:ffff:ffff:ffff:ffff,AU +2001:df7:2800::,2001:df7:2800:ffff:ffff:ffff:ffff:ffff,AU +2001:df7:3000::,2001:df7:3001:ffff:ffff:ffff:ffff:ffff,NZ +2001:df7:3800::,2001:df7:3800:ffff:ffff:ffff:ffff:ffff,AU +2001:df7:4000::,2001:df7:4000:ffff:ffff:ffff:ffff:ffff,SG +2001:df7:4800::,2001:df7:481f:ffff:ffff:ffff:ffff:ffff,JP +2001:df7:5000::,2001:df7:5000:ffff:ffff:ffff:ffff:ffff,IN +2001:df7:5800::,2001:df7:5800:ffff:ffff:ffff:ffff:ffff,AU +2001:df7:6000::,2001:df7:6000:ffff:ffff:ffff:ffff:ffff,IN +2001:df7:6800::,2001:df7:6800:ffff:ffff:ffff:ffff:ffff,IN +2001:df7:7000::,2001:df7:7000:ffff:ffff:ffff:ffff:ffff,HK +2001:df7:7800::,2001:df7:7800:ffff:ffff:ffff:ffff:ffff,JP +2001:df7:8800::,2001:df7:8800:ffff:ffff:ffff:ffff:ffff,ID +2001:df7:9800::,2001:df7:9800:ffff:ffff:ffff:ffff:ffff,NZ +2001:df7:a000::,2001:df7:a000:ffff:ffff:ffff:ffff:ffff,AU +2001:df7:a800::,2001:df7:a800:ffff:ffff:ffff:ffff:ffff,JP +2001:df7:b000::,2001:df7:b000:ffff:ffff:ffff:ffff:ffff,IN +2001:df7:b800::,2001:df7:b800:ffff:ffff:ffff:ffff:ffff,SG +2001:df7:c000::,2001:df7:c003:ffff:ffff:ffff:ffff:ffff,SG +2001:df7:c800::,2001:df7:c800:ffff:ffff:ffff:ffff:ffff,IN +2001:df7:d000::,2001:df7:d000:ffff:ffff:ffff:ffff:ffff,BD +2001:df7:d800::,2001:df7:d800:ffff:ffff:ffff:ffff:ffff,AU +2001:df7:e000::,2001:df7:e000:ffff:ffff:ffff:ffff:ffff,IN +2001:df7:e800::,2001:df7:e800:ffff:ffff:ffff:ffff:ffff,AU +2001:df7:f000::,2001:df7:f000:ffff:ffff:ffff:ffff:ffff,JP +2001:df7:f800::,2001:df7:f800:ffff:ffff:ffff:ffff:ffff,IN +2001:df8::,2001:df9:ffff:ffff:ffff:ffff:ffff:ffff,AU +2001:dfa::,2001:dfa:ffff:ffff:ffff:ffff:ffff:ffff,JP 2001:e00::,2001:e01:ffff:ffff:ffff:ffff:ffff:ffff,ID 2001:e08::,2001:e08:ffff:ffff:ffff:ffff:ffff:ffff,CN 2001:e10::,2001:e10:ffff:ffff:ffff:ffff:ffff:ffff,TW @@ -303,7 +3438,7 @@ 2001:13e8::,2001:13e8:ffff:ffff:ffff:ffff:ffff:ffff,AR 2001:13f0::,2001:13f0:ffff:ffff:ffff:ffff:ffff:ffff,DO 2001:13f8::,2001:13f8:ffff:ffff:ffff:ffff:ffff:ffff,CO -2001:1400::,2001:1400:ffff:ffff:ffff:ffff:ffff:ffff,SE +2001:1400::,2001:1407:ffff:ffff:ffff:ffff:ffff:ffff,SE 2001:1408::,2001:1408:ffff:ffff:ffff:ffff:ffff:ffff,AT 2001:1410::,2001:1410:ffff:ffff:ffff:ffff:ffff:ffff,DE 2001:1418::,2001:1418:ffff:ffff:ffff:ffff:ffff:ffff,IT @@ -316,7 +3451,9 @@ 2001:1450::,2001:1450:ffff:ffff:ffff:ffff:ffff:ffff,IT 2001:1458::,2001:1459:ffff:ffff:ffff:ffff:ffff:ffff,CH 2001:1460::,2001:1460:ffff:ffff:ffff:ffff:ffff:ffff,NL -2001:1468::,2001:146f:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2001:1468::,2001:1469:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2001:146a::,2001:146a::ffff:ffff:ffff:ffff:ffff,RU +2001:146a:1::,2001:146f:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2001:1470::,2001:1477:ffff:ffff:ffff:ffff:ffff:ffff,SI 2001:1478::,2001:1478:ffff:ffff:ffff:ffff:ffff:ffff,GB 2001:1488::,2001:1488:ffff:ffff:ffff:ffff:ffff:ffff,CZ @@ -344,7 +3481,7 @@ 2001:1540::,2001:1540:ffff:ffff:ffff:ffff:ffff:ffff,NL 2001:1548::,2001:1548:ffff:ffff:ffff:ffff:ffff:ffff,GR 2001:1558::,2001:1558:ffff:ffff:ffff:ffff:ffff:ffff,CH -2001:1560::,2001:1560:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:1560::,2001:1567:ffff:ffff:ffff:ffff:ffff:ffff,DE 2001:1568::,2001:1568:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2001:1570::,2001:1570:ffff:ffff:ffff:ffff:ffff:ffff,GB 2001:1578::,2001:1578:ffff:ffff:ffff:ffff:ffff:ffff,DE @@ -368,7 +3505,6 @@ 2001:1610::,2001:1610:ffff:ffff:ffff:ffff:ffff:ffff,LU 2001:1618::,2001:1618:ffff:ffff:ffff:ffff:ffff:ffff,AT 2001:1620::,2001:1623:ffff:ffff:ffff:ffff:ffff:ffff,CH -2001:1628::,2001:1628:ffff:ffff:ffff:ffff:ffff:ffff,FR 2001:1630::,2001:1637:ffff:ffff:ffff:ffff:ffff:ffff,SE 2001:1638::,2001:1638:ffff:ffff:ffff:ffff:ffff:ffff,DE 2001:1640::,2001:1640:ffff:ffff:ffff:ffff:ffff:ffff,DE @@ -386,13 +3522,17 @@ 2001:16a8::,2001:16a8:ffff:ffff:ffff:ffff:ffff:ffff,IT 2001:16b0::,2001:16b0:ffff:ffff:ffff:ffff:ffff:ffff,PL 2001:16b8::,2001:16b8:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:16c0::,2001:16c0:ffff:ffff:ffff:ffff:ffff:ffff,IR +2001:16c0::,2001:16c0:1233:ffff:ffff:ffff:ffff:ffff,IR +2001:16c0:1234::,2001:16c0:1234:ffff:ffff:ffff:ffff:ffff,AU +2001:16c0:1235::,2001:16c7:ffff:ffff:ffff:ffff:ffff:ffff,IR 2001:16c8::,2001:16c8:ffff:ffff:ffff:ffff:ffff:ffff,GB 2001:16d0::,2001:16d0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2001:16d8::,2001:16d8:ffff:ffff:ffff:ffff:ffff:ffff,SE +2001:16d8::,2001:16d8:edff:ffff:ffff:ffff:ffff:ffff,SE +2001:16d8:ee00::,2001:16d8:ee00:ffff:ffff:ffff:ffff:ffff,NO +2001:16d8:ee01::,2001:16d8:ffff:ffff:ffff:ffff:ffff:ffff,SE 2001:16e0::,2001:16e7:ffff:ffff:ffff:ffff:ffff:ffff,DE 2001:16e8::,2001:16e8:ffff:ffff:ffff:ffff:ffff:ffff,NL -2001:16f0::,2001:16f0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:16f0::,2001:16f7:ffff:ffff:ffff:ffff:ffff:ffff,DE 2001:16f8::,2001:16f8:ffff:ffff:ffff:ffff:ffff:ffff,NL 2001:1700::,2001:171f:ffff:ffff:ffff:ffff:ffff:ffff,CH 2001:1800::,2001:1800:ffff:ffff:ffff:ffff:ffff:ffff,US @@ -451,7 +3591,11 @@ 2001:19d8::,2001:19d8:ffff:ffff:ffff:ffff:ffff:ffff,US 2001:19e0::,2001:19e0:ffff:ffff:ffff:ffff:ffff:ffff,US 2001:19e8::,2001:19e8:ffff:ffff:ffff:ffff:ffff:ffff,US -2001:19f0::,2001:19f0:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:19f0::,2001:19f0:67ff:ffff:ffff:ffff:ffff:ffff,US +2001:19f0:6800::,2001:19f0:6800:ffff:ffff:ffff:ffff:ffff,FR +2001:19f0:6801::,2001:19f0:73ff:ffff:ffff:ffff:ffff:ffff,US +2001:19f0:7400::,2001:19f0:7400:ffff:ffff:ffff:ffff:ffff,GB +2001:19f0:7401::,2001:19f0:ffff:ffff:ffff:ffff:ffff:ffff,US 2001:19f8::,2001:19f8:ffff:ffff:ffff:ffff:ffff:ffff,US 2001:1a08::,2001:1a08:ffff:ffff:ffff:ffff:ffff:ffff,GB 2001:1a10::,2001:1a10:ffff:ffff:ffff:ffff:ffff:ffff,QA @@ -497,7 +3641,7 @@ 2001:1b50::,2001:1b57:ffff:ffff:ffff:ffff:ffff:ffff,CH 2001:1b58::,2001:1b58:ffff:ffff:ffff:ffff:ffff:ffff,FR 2001:1b60::,2001:1b67:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:1b68::,2001:1b68:ffff:ffff:ffff:ffff:ffff:ffff,TR +2001:1b68::,2001:1b6f:ffff:ffff:ffff:ffff:ffff:ffff,TR 2001:1b70::,2001:1b77:ffff:ffff:ffff:ffff:ffff:ffff,SE 2001:1b78::,2001:1b78:ffff:ffff:ffff:ffff:ffff:ffff,FR 2001:1b80::,2001:1b80:ffff:ffff:ffff:ffff:ffff:ffff,PL @@ -517,6 +3661,22 @@ 2001:1bf0::,2001:1bf7:ffff:ffff:ffff:ffff:ffff:ffff,EE 2001:1bf8::,2001:1bf8:ffff:ffff:ffff:ffff:ffff:ffff,LV 2001:1c00::,2001:1dff:ffff:ffff:ffff:ffff:ffff:ffff,NL +2001:2002:4e44::,2001:2002:4e44:ffff:ffff:ffff:ffff:ffff,SE +2001:2002:4e46::,2001:2002:4e46:ffff:ffff:ffff:ffff:ffff,SE +2001:2002:4e48::,2001:2002:4e48:ffff:ffff:ffff:ffff:ffff,SE +2001:2002:51e0::,2001:2002:51e0:ffff:ffff:ffff:ffff:ffff,SE +2001:2002:51e4::,2001:2002:51e4:ffff:ffff:ffff:ffff:ffff,SE +2001:2002:51e8::,2001:2002:51e9:ffff:ffff:ffff:ffff:ffff,SE +2001:2002:51ed::,2001:2002:51ed:ffff:ffff:ffff:ffff:ffff,SE +2001:2002:d4b5::,2001:2002:d4b5:ffff:ffff:ffff:ffff:ffff,SE +2001:2002:d541::,2001:2002:d542:ffff:ffff:ffff:ffff:ffff,SE +2001:2002:d9d0::,2001:2002:d9d0:7fff:ffff:ffff:ffff:ffff,SE +2001:2002:d9d1::,2001:2002:d9d1:ffff:ffff:ffff:ffff:ffff,SE +2001:2003:50dc::,2001:2003:50dc:ffff:ffff:ffff:ffff:ffff,FI +2001:2003:54f8::,2001:2003:54f8:ffff:ffff:ffff:ffff:ffff,FI +2001:2003:54fa::,2001:2003:54fa:ffff:ffff:ffff:ffff:ffff,FI +2001:2010:d00a::,2001:2010:d00a:ffff:ffff:ffff:ffff:ffff,DK +2001:2010:d013::,2001:2010:d013:ffff:ffff:ffff:ffff:ffff,DK 2001:4000::,2001:4000:ffff:ffff:ffff:ffff:ffff:ffff,FR 2001:4010::,2001:4010:ffff:ffff:ffff:ffff:ffff:ffff,GB 2001:4018::,2001:4018:ffff:ffff:ffff:ffff:ffff:ffff,NL @@ -575,7 +3735,6 @@ 2001:41f0::,2001:41f0:ffff:ffff:ffff:ffff:ffff:ffff,NL 2001:41f8::,2001:41f8:ffff:ffff:ffff:ffff:ffff:ffff,DE 2001:4200::,2001:4200:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2001:4208::,2001:4208:ffff:ffff:ffff:ffff:ffff:ffff,ZA 2001:4210::,2001:4210:ffff:ffff:ffff:ffff:ffff:ffff,ZA 2001:4218::,2001:4218:ffff:ffff:ffff:ffff:ffff:ffff,ZA 2001:4220::,2001:4220:ffff:ffff:ffff:ffff:ffff:ffff,EG @@ -626,7 +3785,7 @@ 2001:43c8::,2001:43c8:ffff:ffff:ffff:ffff:ffff:ffff,EG 2001:43d0::,2001:43d0:ffff:ffff:ffff:ffff:ffff:ffff,KE 2001:43d8::,2001:43d8:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2001:43e0::,2001:43e0:ffff:ffff:ffff:ffff:ffff:ffff,GH +2001:43e0::,2001:43e0:ffff:ffff:ffff:ffff:ffff:ffff,ZA 2001:43e8::,2001:43e8:ffff:ffff:ffff:ffff:ffff:ffff,ZA 2001:43f0::,2001:43f0:ffff:ffff:ffff:ffff:ffff:ffff,ZW 2001:43f8::,2001:43f8:1:ffff:ffff:ffff:ffff:ffff,TZ @@ -641,6 +3800,7 @@ 2001:43f8:a0::,2001:43f8:a0:ffff:ffff:ffff:ffff:ffff,ZA 2001:43f8:b0::,2001:43f8:b0:ffff:ffff:ffff:ffff:ffff,SL 2001:43f8:c0::,2001:43f8:c0:ffff:ffff:ffff:ffff:ffff,KE +2001:43f8:d0::,2001:43f8:d0:ffff:ffff:ffff:ffff:ffff,MU 2001:43f8:e0::,2001:43f8:e0:ffff:ffff:ffff:ffff:ffff,TZ 2001:43f8:100::,2001:43f8:100:ffff:ffff:ffff:ffff:ffff,ZA 2001:43f8:110::,2001:43f8:110:ffff:ffff:ffff:ffff:ffff,MU @@ -656,14 +3816,14 @@ 2001:43f8:1c0::,2001:43f8:1c0:ffff:ffff:ffff:ffff:ffff,DZ 2001:43f8:1d0::,2001:43f8:1d0:ffff:ffff:ffff:ffff:ffff,GH 2001:43f8:1e0::,2001:43f8:1e0:ffff:ffff:ffff:ffff:ffff,NG -2001:43f8:1f0::,2001:43f8:1f5:ffff:ffff:ffff:ffff:ffff,ZA +2001:43f8:1f0::,2001:43f8:1f6:ffff:ffff:ffff:ffff:ffff,ZA 2001:43f8:200::,2001:43f8:200:ffff:ffff:ffff:ffff:ffff,KE 2001:43f8:210::,2001:43f8:210:ffff:ffff:ffff:ffff:ffff,LS 2001:43f8:230::,2001:43f8:230:ffff:ffff:ffff:ffff:ffff,ZA 2001:43f8:240::,2001:43f8:241:ffff:ffff:ffff:ffff:ffff,GH 2001:43f8:250::,2001:43f8:250:ffff:ffff:ffff:ffff:ffff,KE 2001:43f8:260::,2001:43f8:260:ffff:ffff:ffff:ffff:ffff,KE -2001:43f8:270::,2001:43f8:270:ffff:ffff:ffff:ffff:ffff,MU +2001:43f8:270::,2001:43f8:271:ffff:ffff:ffff:ffff:ffff,MU 2001:43f8:290::,2001:43f8:290:ffff:ffff:ffff:ffff:ffff,MG 2001:43f8:2a0::,2001:43f8:2a0:ffff:ffff:ffff:ffff:ffff,BW 2001:43f8:2b0::,2001:43f8:2b0:ffff:ffff:ffff:ffff:ffff,BW @@ -724,7 +3884,34 @@ 2001:43f8:9a0::,2001:43f8:9a0:ffff:ffff:ffff:ffff:ffff,BJ 2001:43f8:9b0::,2001:43f8:9b1:ffff:ffff:ffff:ffff:ffff,SZ 2001:43f8:9c0::,2001:43f8:9c0:ffff:ffff:ffff:ffff:ffff,DJ -2001:4400::,2001:44ff:ffff:ffff:ffff:ffff:ffff:ffff,AU +2001:43f8:9d0::,2001:43f8:9d0:ffff:ffff:ffff:ffff:ffff,AO +2001:43f8:9e0::,2001:43f8:9e0:ffff:ffff:ffff:ffff:ffff,ZW +2001:43f8:9f0::,2001:43f8:9f0:ffff:ffff:ffff:ffff:ffff,NG +2001:43f8:a00::,2001:43f8:a00:ffff:ffff:ffff:ffff:ffff,NG +2001:4400::,2001:4403:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2001:4408::,2001:4408:ffff:ffff:ffff:ffff:ffff:ffff,IN +2001:4410::,2001:4410:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2001:4420::,2001:4420:ffff:ffff:ffff:ffff:ffff:ffff,TW +2001:4428::,2001:4428:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2001:4430::,2001:4430:ffff:ffff:ffff:ffff:ffff:ffff,KR +2001:4438::,2001:4438:ffff:ffff:ffff:ffff:ffff:ffff,CN +2001:4450::,2001:4450:ffff:ffff:ffff:ffff:ffff:ffff,PH +2001:4458::,2001:4458:ffff:ffff:ffff:ffff:ffff:ffff,MY +2001:4460::,2001:4460:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:4470::,2001:4470:ffff:ffff:ffff:ffff:ffff:ffff,MY +2001:4478::,2001:447b:ffff:ffff:ffff:ffff:ffff:ffff,AU +2001:4480::,2001:4480:ffff:ffff:ffff:ffff:ffff:ffff,HK +2001:4488::,2001:448b:ffff:ffff:ffff:ffff:ffff:ffff,ID +2001:4490::,2001:4493:ffff:ffff:ffff:ffff:ffff:ffff,IN +2001:4498::,2001:4498:ffff:ffff:ffff:ffff:ffff:ffff,MY +2001:44a0::,2001:44a0:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:44a8::,2001:44a8:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:44b0::,2001:44b0:ffff:ffff:ffff:ffff:ffff:ffff,JP +2001:44b8::,2001:44b8:ffff:ffff:ffff:ffff:ffff:ffff,AU +2001:44c0::,2001:44c0:ffff:ffff:ffff:ffff:ffff:ffff,IN +2001:44c8::,2001:44c8:ffff:ffff:ffff:ffff:ffff:ffff,TH +2001:44d0::,2001:44df:ffff:ffff:ffff:ffff:ffff:ffff,KR +2001:44f0::,2001:44f0:ffff:ffff:ffff:ffff:ffff:ffff,TW 2001:4500::,2001:4500:ffff:ffff:ffff:ffff:ffff:ffff,TW 2001:4508::,2001:4508:ffff:ffff:ffff:ffff:ffff:ffff,TW 2001:4510::,2001:4517:ffff:ffff:ffff:ffff:ffff:ffff,CN @@ -735,7 +3922,40 @@ 2001:4540::,2001:455f:ffff:ffff:ffff:ffff:ffff:ffff,TW 2001:4580::,2001:45bf:ffff:ffff:ffff:ffff:ffff:ffff,TW 2001:4600::,2001:46ff:ffff:ffff:ffff:ffff:ffff:ffff,NO -2001:4800::,2001:48ff:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:4800::,2001:4808:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:4810::,2001:4810:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:4818::,2001:4818:ffff:ffff:ffff:ffff:ffff:ffff,CA +2001:4828::,2001:4828:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:4830::,2001:4830:10ff:ffff:ffff:ffff:ffff:ffff,US +2001:4830:1100::,2001:4830:1100:ffff:ffff:ffff:ffff:ffff,CA +2001:4830:1101::,2001:4830:1200:7fff:ffff:ffff:ffff:ffff,US +2001:4830:1200:8000::,2001:4830:1200:81ff:ffff:ffff:ffff:ffff,AU +2001:4830:1200:8200::,2001:4830:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:4838::,2001:4838:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:4840::,2001:4840:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:4848::,2001:4848:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:4850::,2001:4850:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:4858::,2001:4858:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:4860::,2001:4860:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:4868::,2001:4868:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:4870::,2001:4871:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:4878::,2001:4878:8304:ffff:ffff:ffff:ffff:ffff,US +2001:4878:8305::,2001:4878:8305:ffff:ffff:ffff:ffff:ffff,IN +2001:4878:8306::,2001:4878:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:4888::,2001:4888:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:4890::,2001:4890:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:4898::,2001:489a:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:48a0::,2001:48a0:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:48a8::,2001:48a8:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:48b0::,2001:48b0:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:48b8::,2001:48b8:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:48c0::,2001:48c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:48c8::,2001:48c8:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:48d0::,2001:48d0:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:48d8::,2001:48d8:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:48e0::,2001:48e0:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:48e8::,2001:48e8:ffff:ffff:ffff:ffff:ffff:ffff,US +2001:48f8::,2001:48f8:ffff:ffff:ffff:ffff:ffff:ffff,US 2001:4900::,2001:4900:ffff:ffff:ffff:ffff:ffff:ffff,CA 2001:4908::,2001:4908:ffff:ffff:ffff:ffff:ffff:ffff,US 2001:4910::,2001:4910:ffff:ffff:ffff:ffff:ffff:ffff,BM @@ -788,7 +4008,7 @@ 2001:4b90::,2001:4b90:ffff:ffff:ffff:ffff:ffff:ffff,FR 2001:4b98::,2001:4b98:ffff:ffff:ffff:ffff:ffff:ffff,FR 2001:4ba0::,2001:4ba0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:4ba8::,2001:4ba8:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2001:4ba8::,2001:4baf:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2001:4bb0::,2001:4bb0:ffff:ffff:ffff:ffff:ffff:ffff,IT 2001:4bb8::,2001:4bb8:ffff:ffff:ffff:ffff:ffff:ffff,AT 2001:4bc0::,2001:4bc7:ffff:ffff:ffff:ffff:ffff:ffff,DE @@ -799,14 +4019,77 @@ 2001:4be8::,2001:4be8:ffff:ffff:ffff:ffff:ffff:ffff,GB 2001:4bf0::,2001:4bf0:ffff:ffff:ffff:ffff:ffff:ffff,GB 2001:4bf8::,2001:4bf8:ffff:ffff:ffff:ffff:ffff:ffff,CH -2001:4c00::,2001:4dff:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:4c00::,2001:4c07:ffff:ffff:ffff:ffff:ffff:ffff,IT +2001:4c08::,2001:4c08:ffff:ffff:ffff:ffff:ffff:ffff,GB +2001:4c10::,2001:4c10:ffff:ffff:ffff:ffff:ffff:ffff,NL +2001:4c20::,2001:4c20:ffff:ffff:ffff:ffff:ffff:ffff,GB +2001:4c28::,2001:4c28:ffff:ffff:ffff:ffff:ffff:ffff,NO +2001:4c30::,2001:4c30:ffff:ffff:ffff:ffff:ffff:ffff,PL +2001:4c38::,2001:4c3f:ffff:ffff:ffff:ffff:ffff:ffff,NL +2001:4c40::,2001:4c40:ffff:ffff:ffff:ffff:ffff:ffff,BE +2001:4c48::,2001:4c4f:ffff:ffff:ffff:ffff:ffff:ffff,HU +2001:4c50::,2001:4c57:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:4c58::,2001:4c5f:ffff:ffff:ffff:ffff:ffff:ffff,PL +2001:4c60::,2001:4c60:ffff:ffff:ffff:ffff:ffff:ffff,ES +2001:4c68::,2001:4c68:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:4c70::,2001:4c70:ffff:ffff:ffff:ffff:ffff:ffff,PL +2001:4c78::,2001:4c78:ffff:ffff:ffff:ffff:ffff:ffff,CH +2001:4c80::,2001:4c80:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:4c88::,2001:4c88:ffff:ffff:ffff:ffff:ffff:ffff,IR +2001:4c90::,2001:4c97:ffff:ffff:ffff:ffff:ffff:ffff,IT +2001:4c98::,2001:4c98:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:4ca0::,2001:4ca0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:4ca8::,2001:4ca8:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:4cb0::,2001:4cb0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2001:4cb8::,2001:4cb8:ffff:ffff:ffff:ffff:ffff:ffff,NL +2001:4cc0::,2001:4cc0:ffff:ffff:ffff:ffff:ffff:ffff,PT +2001:4cc8::,2001:4cc8:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2001:4cd0::,2001:4cd0:ffff:ffff:ffff:ffff:ffff:ffff,IL +2001:4cd8::,2001:4cd8:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:4ce0::,2001:4ce0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:4ce8::,2001:4cf0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:4cf8::,2001:4cf8:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:4d00::,2001:4d00:ffff:ffff:ffff:ffff:ffff:ffff,AM +2001:4d08::,2001:4d08:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:4d10::,2001:4d10:ffff:ffff:ffff:ffff:ffff:ffff,ES +2001:4d18::,2001:4d18:ffff:ffff:ffff:ffff:ffff:ffff,RO +2001:4d20::,2001:4d20:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:4d30::,2001:4d30:ffff:ffff:ffff:ffff:ffff:ffff,GB +2001:4d38::,2001:4d38:ffff:ffff:ffff:ffff:ffff:ffff,IT +2001:4d48::,2001:4d48:ffff:ffff:ffff:ffff:ffff:ffff,GB +2001:4d50::,2001:4d50:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:4d58::,2001:4d58:ffff:ffff:ffff:ffff:ffff:ffff,CH +2001:4d60::,2001:4d60:ffff:ffff:ffff:ffff:ffff:ffff,NL +2001:4d68::,2001:4d68:ffff:ffff:ffff:ffff:ffff:ffff,IE +2001:4d70::,2001:4d70:ffff:ffff:ffff:ffff:ffff:ffff,GR +2001:4d78::,2001:4d78:ffff:ffff:ffff:ffff:ffff:ffff,GB +2001:4d80::,2001:4d80:ffff:ffff:ffff:ffff:ffff:ffff,RO +2001:4d88::,2001:4d88:1010:ffff:ffff:ffff:ffff:ffff,DE +2001:4d88:1011::,2001:4d88:1011:ffff:ffff:ffff:ffff:ffff,ZA +2001:4d88:1012::,2001:4d88:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:4d90::,2001:4d90:ffff:ffff:ffff:ffff:ffff:ffff,ES +2001:4d98::,2001:4d98:ffff:ffff:ffff:ffff:ffff:ffff,CH +2001:4da0::,2001:4da7:ffff:ffff:ffff:ffff:ffff:ffff,CH +2001:4da8::,2001:4da8:ffff:ffff:ffff:ffff:ffff:ffff,NO +2001:4db0::,2001:4db0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2001:4db8::,2001:4db8:ffff:ffff:ffff:ffff:ffff:ffff,SE +2001:4dc0::,2001:4dc0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2001:4dc8::,2001:4dc8:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:4dd0::,2001:4dd7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:4dd8::,2001:4dd8:ffff:ffff:ffff:ffff:ffff:ffff,NO +2001:4de0::,2001:4de0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2001:4de8::,2001:4de8:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2001:4df0::,2001:4df0:ffff:ffff:ffff:ffff:ffff:ffff,IL 2001:8000::,2001:8fff:ffff:ffff:ffff:ffff:ffff:ffff,AU 2001:a000::,2001:a7ff:ffff:ffff:ffff:ffff:ffff:ffff,JP -2001:b000::,2001:b7ff:ffff:ffff:ffff:ffff:ffff:ffff,TW -2003::,2003:1fff:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:b000::,2001:b010:fc7f:ffff:ffff:ffff:ffff:ffff,TW +2001:b010:fc80::,2001:b010:fc80:ffff:ffff:ffff:ffff:ffff,CN +2001:b010:fc81::,2001:b7ff:ffff:ffff:ffff:ffff:ffff:ffff,TW +2003::,2003:49:4e71:ffff:ffff:ffff:ffff:ffff,DE +2003:49:4e72::,2003:49:4e72:ffff:ffff:ffff:ffff:ffff,CZ +2003:49:4e73::,2003:1fff:ffff:ffff:ffff:ffff:ffff:ffff,DE 2400::,2400:fff:ffff:ffff:ffff:ffff:ffff:ffff,KR 2400:1000::,2400:1000:ffff:ffff:ffff:ffff:ffff:ffff,JP -2400:1080::,2400:1080:ffff:ffff:ffff:ffff:ffff:ffff,HK 2400:1100::,2400:1100:ffff:ffff:ffff:ffff:ffff:ffff,HK 2400:1200::,2400:1200:ffff:ffff:ffff:ffff:ffff:ffff,NZ 2400:1300::,2400:1300:ffff:ffff:ffff:ffff:ffff:ffff,TW @@ -885,7 +4168,6 @@ 2400:4c00::,2400:4c00:ffff:ffff:ffff:ffff:ffff:ffff,HK 2400:4c80::,2400:4c80:ffff:ffff:ffff:ffff:ffff:ffff,ID 2400:4d00::,2400:4d00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:4d80::,2400:4d80:ffff:ffff:ffff:ffff:ffff:ffff,SG 2400:4e00::,2400:4e00:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:4e80::,2400:4e80:ffff:ffff:ffff:ffff:ffff:ffff,TW 2400:4f00::,2400:4f00:ffff:ffff:ffff:ffff:ffff:ffff,PK @@ -909,7 +4191,6 @@ 2400:5800::,2400:5800:ffff:ffff:ffff:ffff:ffff:ffff,BD 2400:5880::,2400:5880:ffff:ffff:ffff:ffff:ffff:ffff,MY 2400:5900::,2400:5900:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2400:5980::,2400:5980:ffff:ffff:ffff:ffff:ffff:ffff,SG 2400:5a00::,2400:5a00:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:5a80::,2400:5a80:ffff:ffff:ffff:ffff:ffff:ffff,BD 2400:5b00::,2400:5b00:ffff:ffff:ffff:ffff:ffff:ffff,NZ @@ -1003,7 +4284,7 @@ 2400:8780::,2400:8780:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:8800::,2400:8800:ffff:ffff:ffff:ffff:ffff:ffff,HK 2400:8880::,2400:8880:ffff:ffff:ffff:ffff:ffff:ffff,IN -2400:8900::,2400:8900:ffff:ffff:ffff:ffff:ffff:ffff,SG +2400:8900::,2400:8901:ffff:ffff:ffff:ffff:ffff:ffff,SG 2400:8980::,2400:8980:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:8a00::,2400:8a00:ffff:ffff:ffff:ffff:ffff:ffff,AU 2400:8a80::,2400:8a80:ffff:ffff:ffff:ffff:ffff:ffff,PH @@ -1051,7 +4332,6 @@ 2400:a000::,2400:a000:ffff:ffff:ffff:ffff:ffff:ffff,IN 2400:a080::,2400:a080:ffff:ffff:ffff:ffff:ffff:ffff,JP 2400:a100::,2400:a100:ffff:ffff:ffff:ffff:ffff:ffff,NP -2400:a180::,2400:a180:ffff:ffff:ffff:ffff:ffff:ffff,HK 2400:a280::,2400:a280:ffff:ffff:ffff:ffff:ffff:ffff,AU 2400:a300::,2400:a300:ffff:ffff:ffff:ffff:ffff:ffff,JP 2400:a380::,2400:a380:ffff:ffff:ffff:ffff:ffff:ffff,CN @@ -1131,7 +4411,15 @@ 2400:c980::,2400:c980:ffff:ffff:ffff:ffff:ffff:ffff,SG 2400:ca00::,2400:ca00:ffff:ffff:ffff:ffff:ffff:ffff,BD 2400:ca80::,2400:ca80:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:cb00::,2400:cb00:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:cb00::,2400:cb00:20:ffff:ffff:ffff:ffff:ffff,HK +2400:cb00:21::,2400:cb00:21:ffff:ffff:ffff:ffff:ffff,IT +2400:cb00:22::,2400:cb00:24:ffff:ffff:ffff:ffff:ffff,HK +2400:cb00:25::,2400:cb00:25:ffff:ffff:ffff:ffff:ffff,US +2400:cb00:26::,2400:cb00:38:ffff:ffff:ffff:ffff:ffff,HK +2400:cb00:39::,2400:cb00:39:ffff:ffff:ffff:ffff:ffff,IT +2400:cb00:3a::,2400:cb00:f00c:ffff:ffff:ffff:ffff:ffff,HK +2400:cb00:f00d::,2400:cb00:f00d:ffff:ffff:ffff:ffff:ffff,US +2400:cb00:f00e::,2400:cb00:ffff:ffff:ffff:ffff:ffff:ffff,HK 2400:cb80::,2400:cb80:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:cc00::,2400:cc00:ffff:ffff:ffff:ffff:ffff:ffff,AU 2400:cc80::,2400:cc80:ffff:ffff:ffff:ffff:ffff:ffff,CN @@ -1180,7 +4468,6 @@ 2400:e200::,2400:e200:ffff:ffff:ffff:ffff:ffff:ffff,AU 2400:e280::,2400:e280:ffff:ffff:ffff:ffff:ffff:ffff,HK 2400:e300::,2400:e300:ffff:ffff:ffff:ffff:ffff:ffff,AU -2400:e380::,2400:e380:ffff:ffff:ffff:ffff:ffff:ffff,HK 2400:e400::,2400:e400:ffff:ffff:ffff:ffff:ffff:ffff,JP 2400:e480::,2400:e480:ffff:ffff:ffff:ffff:ffff:ffff,TW 2400:e500::,2400:e500:ffff:ffff:ffff:ffff:ffff:ffff,AF @@ -1339,7 +4626,6 @@ 2401:3380::,2401:3380:ffff:ffff:ffff:ffff:ffff:ffff,CN 2401:3400::,2401:3400:ffff:ffff:ffff:ffff:ffff:ffff,MY 2401:3480::,2401:3480:ffff:ffff:ffff:ffff:ffff:ffff,CN -2401:3500::,2401:3500:ffff:ffff:ffff:ffff:ffff:ffff,HK 2401:3580::,2401:3580:ffff:ffff:ffff:ffff:ffff:ffff,BD 2401:3600::,2401:3600:ffff:ffff:ffff:ffff:ffff:ffff,JP 2401:3680::,2401:3680:ffff:ffff:ffff:ffff:ffff:ffff,HK @@ -1372,6 +4658,7 @@ 2401:4480::,2401:4480:ffff:ffff:ffff:ffff:ffff:ffff,CN 2401:4500::,2401:4500:ffff:ffff:ffff:ffff:ffff:ffff,JP 2401:4580::,2401:4580:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:4600::,2401:4600:ffff:ffff:ffff:ffff:ffff:ffff,BD 2401:4680::,2401:4680:ffff:ffff:ffff:ffff:ffff:ffff,CN 2401:4700::,2401:4700:ffff:ffff:ffff:ffff:ffff:ffff,IN 2401:4780::,2401:4780:ffff:ffff:ffff:ffff:ffff:ffff,CN @@ -1402,133 +4689,262 @@ 2401:5480::,2401:5480:ffff:ffff:ffff:ffff:ffff:ffff,HK 2401:5500::,2401:5500:ffff:ffff:ffff:ffff:ffff:ffff,AU 2401:5580::,2401:5580:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2401:5680::,2401:5680:ffff:ffff:ffff:ffff:ffff:ffff,CN 2401:5700::,2401:5700:ffff:ffff:ffff:ffff:ffff:ffff,TH +2401:5780::,2401:5780:ffff:ffff:ffff:ffff:ffff:ffff,IN 2401:5800::,2401:5800:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:5880::,2401:5880:ffff:ffff:ffff:ffff:ffff:ffff,CN 2401:5900::,2401:5900:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:5980::,2401:5980:ffff:ffff:ffff:ffff:ffff:ffff,MY 2401:5a00::,2401:5a00:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:5a80::,2401:5a80:ffff:ffff:ffff:ffff:ffff:ffff,IN 2401:5b00::,2401:5b00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:5b80::,2401:5b80:ffff:ffff:ffff:ffff:ffff:ffff,AU 2401:5c00::,2401:5c00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:5c80::,2401:5c80:ffff:ffff:ffff:ffff:ffff:ffff,CN 2401:5d00::,2401:5d00:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:5d80::,2401:5d80:ffff:ffff:ffff:ffff:ffff:ffff,HK 2401:5e00::,2401:5e00:ffff:ffff:ffff:ffff:ffff:ffff,TW +2401:5e80::,2401:5e80:ffff:ffff:ffff:ffff:ffff:ffff,AU 2401:5f00::,2401:5f00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:5f80::,2401:5f80:ffff:ffff:ffff:ffff:ffff:ffff,VN 2401:6000::,2401:6fff:ffff:ffff:ffff:ffff:ffff:ffff,AU 2401:7000::,2401:7000:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2401:7080::,2401:7080:ffff:ffff:ffff:ffff:ffff:ffff,TW 2401:7100::,2401:7100:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:7180::,2401:7180:ffff:ffff:ffff:ffff:ffff:ffff,CN 2401:7200::,2401:7200:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:7280::,2401:7280:ffff:ffff:ffff:ffff:ffff:ffff,HK 2401:7300::,2401:7300:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:7380::,2401:7380:ffff:ffff:ffff:ffff:ffff:ffff,AU 2401:7400::,2401:7401:ffff:ffff:ffff:ffff:ffff:ffff,SG +2401:7480::,2401:7480:ffff:ffff:ffff:ffff:ffff:ffff,MY 2401:7500::,2401:7500:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:7580::,2401:7580:ffff:ffff:ffff:ffff:ffff:ffff,CN 2401:7600::,2401:7600:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:7680::,2401:7680:ffff:ffff:ffff:ffff:ffff:ffff,CN 2401:7700::,2401:7700:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:7780::,2401:7780:ffff:ffff:ffff:ffff:ffff:ffff,CN 2401:7800::,2401:7800:ffff:ffff:ffff:ffff:ffff:ffff,SG +2401:7880::,2401:7880:ffff:ffff:ffff:ffff:ffff:ffff,CN 2401:7900::,2401:7900:ffff:ffff:ffff:ffff:ffff:ffff,LK +2401:7980::,2401:7980:ffff:ffff:ffff:ffff:ffff:ffff,CN 2401:7a00::,2401:7a00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:7a80::,2401:7a80:ffff:ffff:ffff:ffff:ffff:ffff,CN 2401:7b00::,2401:7b00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:7b80::,2401:7b80:ffff:ffff:ffff:ffff:ffff:ffff,CN 2401:7c00::,2401:7c00:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2401:7c80::,2401:7c80:ffff:ffff:ffff:ffff:ffff:ffff,CN 2401:7d00::,2401:7d00:ffff:ffff:ffff:ffff:ffff:ffff,ID +2401:7d80::,2401:7d80:ffff:ffff:ffff:ffff:ffff:ffff,CN 2401:7e00::,2401:7e00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:7e80::,2401:7e80:ffff:ffff:ffff:ffff:ffff:ffff,AU 2401:7f00::,2401:7f00:ffff:ffff:ffff:ffff:ffff:ffff,JP -2401:8000::,2401:803f:ffff:ffff:ffff:ffff:ffff:ffff,TW +2401:7f80::,2401:7f80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:8000::,2401:8000::ffff:ffff:ffff:ffff:ffff,CN +2401:8000:1::,2401:803f:ffff:ffff:ffff:ffff:ffff:ffff,TW +2401:8080::,2401:8080:ffff:ffff:ffff:ffff:ffff:ffff,AF 2401:8100::,2401:8100:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:8180::,2401:8180:ffff:ffff:ffff:ffff:ffff:ffff,AU 2401:8200::,2401:8200:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:8280::,2401:8280:ffff:ffff:ffff:ffff:ffff:ffff,JP 2401:8300::,2401:8300:ffff:ffff:ffff:ffff:ffff:ffff,MV +2401:8380::,2401:8380:ffff:ffff:ffff:ffff:ffff:ffff,CN 2401:8400::,2401:8400:ffff:ffff:ffff:ffff:ffff:ffff,SG +2401:8480::,2401:8480:ffff:ffff:ffff:ffff:ffff:ffff,AU 2401:8500::,2401:8500:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:8580::,2401:8580:ffff:ffff:ffff:ffff:ffff:ffff,BD 2401:8600::,2401:8600:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:8680::,2401:8680:ffff:ffff:ffff:ffff:ffff:ffff,CN 2401:8700::,2401:8700:ffff:ffff:ffff:ffff:ffff:ffff,JP +2401:8780::,2401:8780:ffff:ffff:ffff:ffff:ffff:ffff,IN 2401:8800::,2401:8800:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:8880::,2401:8880:ffff:ffff:ffff:ffff:ffff:ffff,HK 2401:8900::,2401:8900:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:8980::,2401:8980:ffff:ffff:ffff:ffff:ffff:ffff,HK 2401:8a00::,2401:8a00:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:8a80::,2401:8a80:ffff:ffff:ffff:ffff:ffff:ffff,AU 2401:8b00::,2401:8b00:ffff:ffff:ffff:ffff:ffff:ffff,JP +2401:8b80::,2401:8b80:ffff:ffff:ffff:ffff:ffff:ffff,HK 2401:8c00::,2401:8c01:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:8c80::,2401:8c80:ffff:ffff:ffff:ffff:ffff:ffff,BD 2401:8d00::,2401:8d00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:8d80::,2401:8d80:ffff:ffff:ffff:ffff:ffff:ffff,AU 2401:8e00::,2401:8e00:ffff:ffff:ffff:ffff:ffff:ffff,PK +2401:8e80::,2401:8e80:ffff:ffff:ffff:ffff:ffff:ffff,PH 2401:8f00::,2401:8f00:ffff:ffff:ffff:ffff:ffff:ffff,ID +2401:8f80::,2401:8f80:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:9080::,2401:9080:ffff:ffff:ffff:ffff:ffff:ffff,AU 2401:9100::,2401:9100:ffff:ffff:ffff:ffff:ffff:ffff,MO +2401:9180::,2401:9180:ffff:ffff:ffff:ffff:ffff:ffff,TW 2401:9200::,2401:9200:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:9280::,2401:9280:ffff:ffff:ffff:ffff:ffff:ffff,ID 2401:9300::,2401:9300:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:9380::,2401:9380:ffff:ffff:ffff:ffff:ffff:ffff,CN 2401:9400::,2401:9400:ffff:ffff:ffff:ffff:ffff:ffff,PH +2401:9480::,2401:9480:ffff:ffff:ffff:ffff:ffff:ffff,NZ 2401:9500::,2401:9500:ffff:ffff:ffff:ffff:ffff:ffff,PH +2401:9580::,2401:9580:ffff:ffff:ffff:ffff:ffff:ffff,MY 2401:9600::,2401:9600:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:9680::,2401:9680:ffff:ffff:ffff:ffff:ffff:ffff,AU 2401:9700::,2401:9700:ffff:ffff:ffff:ffff:ffff:ffff,KH +2401:9780::,2401:9780:ffff:ffff:ffff:ffff:ffff:ffff,IN 2401:9800::,2401:9800:ffff:ffff:ffff:ffff:ffff:ffff,PH -2401:9900::,2401:9900:ffff:ffff:ffff:ffff:ffff:ffff,LK +2401:9880::,2401:9880:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:9980::,2401:9980:ffff:ffff:ffff:ffff:ffff:ffff,MY 2401:9a00::,2401:9a00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:9a80::,2401:9a80:ffff:ffff:ffff:ffff:ffff:ffff,CN 2401:9b00::,2401:9b00:ffff:ffff:ffff:ffff:ffff:ffff,ID +2401:9b80::,2401:9b80:ffff:ffff:ffff:ffff:ffff:ffff,CN 2401:9c00::,2401:9c00:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:9c80::,2401:9c80:ffff:ffff:ffff:ffff:ffff:ffff,HK 2401:9d00::,2401:9d00:ffff:ffff:ffff:ffff:ffff:ffff,TH +2401:9d80::,2401:9d80:ffff:ffff:ffff:ffff:ffff:ffff,HK 2401:9e00::,2401:9e00:ffff:ffff:ffff:ffff:ffff:ffff,PK +2401:9e80::,2401:9e80:ffff:ffff:ffff:ffff:ffff:ffff,ID 2401:9f00::,2401:9f00:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:9f80::,2401:9f80:ffff:ffff:ffff:ffff:ffff:ffff,CN 2401:a000::,2401:a000:ffff:ffff:ffff:ffff:ffff:ffff,KR +2401:a080::,2401:a080:ffff:ffff:ffff:ffff:ffff:ffff,HK 2401:a100::,2401:a100:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:a180::,2401:a180:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:a280::,2401:a280:ffff:ffff:ffff:ffff:ffff:ffff,HK 2401:a300::,2401:a300:ffff:ffff:ffff:ffff:ffff:ffff,ID +2401:a380::,2401:a380:ffff:ffff:ffff:ffff:ffff:ffff,JP 2401:a400::,2401:a400:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:a480::,2401:a480:ffff:ffff:ffff:ffff:ffff:ffff,IN 2401:a500::,2401:a500:ffff:ffff:ffff:ffff:ffff:ffff,JP +2401:a580::,2401:a580:ffff:ffff:ffff:ffff:ffff:ffff,TH 2401:a600::,2401:a600:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:a680::,2401:a680:ffff:ffff:ffff:ffff:ffff:ffff,HK 2401:a700::,2401:a700:ffff:ffff:ffff:ffff:ffff:ffff,KH +2401:a780::,2401:a780:ffff:ffff:ffff:ffff:ffff:ffff,HK 2401:a800::,2401:a800:ffff:ffff:ffff:ffff:ffff:ffff,KR +2401:a880::,2401:a880:ffff:ffff:ffff:ffff:ffff:ffff,IN 2401:a900::,2401:a900:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:a980::,2401:a980:ffff:ffff:ffff:ffff:ffff:ffff,CN 2401:aa00::,2401:aa00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:aa80::,2401:aa80:ffff:ffff:ffff:ffff:ffff:ffff,NZ 2401:ab00::,2401:ab00:ffff:ffff:ffff:ffff:ffff:ffff,TW +2401:ab80::,2401:ab80:ffff:ffff:ffff:ffff:ffff:ffff,HK 2401:ac00::,2401:ac00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:ac80::,2401:ac80:ffff:ffff:ffff:ffff:ffff:ffff,NZ 2401:ad00::,2401:ad00:ffff:ffff:ffff:ffff:ffff:ffff,JP +2401:ad80::,2401:ad80:ffff:ffff:ffff:ffff:ffff:ffff,NZ 2401:ae00::,2401:ae00:ffff:ffff:ffff:ffff:ffff:ffff,ID +2401:ae80::,2401:ae80:ffff:ffff:ffff:ffff:ffff:ffff,AU 2401:af00::,2401:af00:ffff:ffff:ffff:ffff:ffff:ffff,NC +2401:af80::,2401:af80:ffff:ffff:ffff:ffff:ffff:ffff,JP 2401:b000::,2401:b000:ffff:ffff:ffff:ffff:ffff:ffff,MY +2401:b080::,2401:b080:ffff:ffff:ffff:ffff:ffff:ffff,SG 2401:b100::,2401:b100:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:b180::,2401:b180:ffff:ffff:ffff:ffff:ffff:ffff,CN 2401:b200::,2401:b200:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:b280::,2401:b280:ffff:ffff:ffff:ffff:ffff:ffff,HK 2401:b300::,2401:b300:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:b380::,2401:b380:ffff:ffff:ffff:ffff:ffff:ffff,AU 2401:b400::,2401:b400:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:b480::,2401:b480:ffff:ffff:ffff:ffff:ffff:ffff,CN 2401:b500::,2401:b500:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:b580::,2401:b580:ffff:ffff:ffff:ffff:ffff:ffff,CN 2401:b600::,2401:b600:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:b680::,2401:b680:ffff:ffff:ffff:ffff:ffff:ffff,CN 2401:b700::,2401:b700:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:b780::,2401:b780:ffff:ffff:ffff:ffff:ffff:ffff,MY 2401:b800::,2401:b800:ffff:ffff:ffff:ffff:ffff:ffff,VN +2401:b880::,2401:b880:ffff:ffff:ffff:ffff:ffff:ffff,AU 2401:b900::,2401:b900:ffff:ffff:ffff:ffff:ffff:ffff,PH +2401:b980::,2401:b980:ffff:ffff:ffff:ffff:ffff:ffff,TH 2401:ba00::,2401:ba00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:ba80::,2401:ba80:ffff:ffff:ffff:ffff:ffff:ffff,PK 2401:bb00::,2401:bb00:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:bb80::,2401:bb80:ffff:ffff:ffff:ffff:ffff:ffff,CN 2401:bc00::,2401:bc00:ffff:ffff:ffff:ffff:ffff:ffff,PH +2401:bc80::,2401:bc80:ffff:ffff:ffff:ffff:ffff:ffff,MM 2401:bd00::,2401:bd00:ffff:ffff:ffff:ffff:ffff:ffff,JP +2401:bd80::,2401:bd80:ffff:ffff:ffff:ffff:ffff:ffff,TW 2401:be00::,2401:be00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:be80::,2401:be80:ffff:ffff:ffff:ffff:ffff:ffff,ID 2401:bf00::,2401:bf00:ffff:ffff:ffff:ffff:ffff:ffff,JP +2401:bf80::,2401:bf80:ffff:ffff:ffff:ffff:ffff:ffff,MY 2401:c000::,2401:c000:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:c080::,2401:c080:ffff:ffff:ffff:ffff:ffff:ffff,JP 2401:c100::,2401:c100:ffff:ffff:ffff:ffff:ffff:ffff,SG +2401:c180::,2401:c180:ffff:ffff:ffff:ffff:ffff:ffff,HK 2401:c200::,2401:c200:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:c280::,2401:c280:ffff:ffff:ffff:ffff:ffff:ffff,IN 2401:c300::,2401:c300:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:c380::,2401:c380:ffff:ffff:ffff:ffff:ffff:ffff,IN 2401:c400::,2401:c400:ffff:ffff:ffff:ffff:ffff:ffff,MY +2401:c480::,2401:c480:ffff:ffff:ffff:ffff:ffff:ffff,HK 2401:c500::,2401:c500:ffff:ffff:ffff:ffff:ffff:ffff,KR +2401:c580::,2401:c580:ffff:ffff:ffff:ffff:ffff:ffff,HK 2401:c600::,2401:c600:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:c680::,2401:c680:ffff:ffff:ffff:ffff:ffff:ffff,BD 2401:c700::,2401:c700:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:c780::,2401:c780:ffff:ffff:ffff:ffff:ffff:ffff,AU 2401:c800::,2401:c800:ffff:ffff:ffff:ffff:ffff:ffff,JP +2401:c880::,2401:c880:ffff:ffff:ffff:ffff:ffff:ffff,IN 2401:c900::,2401:c901:ffff:ffff:ffff:ffff:ffff:ffff,SG +2401:c980::,2401:c980:ffff:ffff:ffff:ffff:ffff:ffff,NZ 2401:ca00::,2401:ca00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:ca80::,2401:ca80:ffff:ffff:ffff:ffff:ffff:ffff,CN 2401:cb00::,2401:cb00:ffff:ffff:ffff:ffff:ffff:ffff,KH +2401:cb80::,2401:cb80:ffff:ffff:ffff:ffff:ffff:ffff,CN 2401:cc00::,2401:cc00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:cc80::,2401:cc80:ffff:ffff:ffff:ffff:ffff:ffff,AU 2401:cd00::,2401:cd00:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:cd80::,2401:cd81:ffff:ffff:ffff:ffff:ffff:ffff,AU 2401:ce00::,2401:ce00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:ce80::,2401:ce80:ffff:ffff:ffff:ffff:ffff:ffff,JP 2401:cf00::,2401:cf00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:cf80::,2401:cf80:ffff:ffff:ffff:ffff:ffff:ffff,PH 2401:d000::,2401:d000:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:d080::,2401:d080:ffff:ffff:ffff:ffff:ffff:ffff,AU 2401:d100::,2401:d100:ffff:ffff:ffff:ffff:ffff:ffff,SG +2401:d180::,2401:d180:ffff:ffff:ffff:ffff:ffff:ffff,CN 2401:d200::,2401:d200:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2401:d280::,2401:d280:ffff:ffff:ffff:ffff:ffff:ffff,HK 2401:d300::,2401:d300:ffff:ffff:ffff:ffff:ffff:ffff,MY +2401:d380::,2401:d380:ffff:ffff:ffff:ffff:ffff:ffff,BD 2401:d400::,2401:d400:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2401:d480::,2401:d480:ffff:ffff:ffff:ffff:ffff:ffff,AU 2401:d500::,2401:d500:ffff:ffff:ffff:ffff:ffff:ffff,JP +2401:d580::,2401:d580:ffff:ffff:ffff:ffff:ffff:ffff,AU 2401:d600::,2401:d600:ffff:ffff:ffff:ffff:ffff:ffff,MN +2401:d680::,2401:d680:ffff:ffff:ffff:ffff:ffff:ffff,MY 2401:d700::,2401:d700:ffff:ffff:ffff:ffff:ffff:ffff,JP +2401:d780::,2401:d780:ffff:ffff:ffff:ffff:ffff:ffff,CN 2401:d800::,2401:d800:ffff:ffff:ffff:ffff:ffff:ffff,VN +2401:d880::,2401:d880:ffff:ffff:ffff:ffff:ffff:ffff,TH 2401:d900::,2401:d900:ffff:ffff:ffff:ffff:ffff:ffff,JP +2401:d980::,2401:d980:ffff:ffff:ffff:ffff:ffff:ffff,HK 2401:da00::,2401:da00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:da80::,2401:da80:ffff:ffff:ffff:ffff:ffff:ffff,HK 2401:db00::,2401:db00:ffff:ffff:ffff:ffff:ffff:ffff,SG +2401:db80::,2401:db80:ffff:ffff:ffff:ffff:ffff:ffff,SG 2401:dc00::,2401:dc00:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:dc80::,2401:dc80:ffff:ffff:ffff:ffff:ffff:ffff,PF 2401:dd00::,2401:dd00:ffff:ffff:ffff:ffff:ffff:ffff,LK +2401:dd80::,2401:dd80:ffff:ffff:ffff:ffff:ffff:ffff,AU 2401:de00::,2401:de00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:de80::,2401:de80:ffff:ffff:ffff:ffff:ffff:ffff,ID 2401:df00::,2401:df01:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:df80::,2401:df80:ffff:ffff:ffff:ffff:ffff:ffff,IN 2401:e000::,2401:e000:ffff:ffff:ffff:ffff:ffff:ffff,TH +2401:e080::,2401:e080:ffff:ffff:ffff:ffff:ffff:ffff,CN 2401:e100::,2401:e100:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:e180::,2401:e180:ffff:ffff:ffff:ffff:ffff:ffff,TW 2401:e200::,2401:e200:ffff:ffff:ffff:ffff:ffff:ffff,KR +2401:e280::,2401:e280:ffff:ffff:ffff:ffff:ffff:ffff,MY 2401:e300::,2401:e300:ffff:ffff:ffff:ffff:ffff:ffff,JP +2401:e380::,2401:e380:ffff:ffff:ffff:ffff:ffff:ffff,HK 2401:e400::,2401:e400:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:e480::,2401:e480:ffff:ffff:ffff:ffff:ffff:ffff,ID 2401:e500::,2401:e500:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:e580::,2401:e580:ffff:ffff:ffff:ffff:ffff:ffff,AU 2401:e600::,2401:e600:ffff:ffff:ffff:ffff:ffff:ffff,FJ +2401:e680::,2401:e680:ffff:ffff:ffff:ffff:ffff:ffff,IN 2401:e700::,2401:e700:ffff:ffff:ffff:ffff:ffff:ffff,JP 2401:e800::,2401:e800:ffff:ffff:ffff:ffff:ffff:ffff,VN 2401:e900::,2401:e900:ffff:ffff:ffff:ffff:ffff:ffff,BD @@ -1548,7 +4964,21 @@ 2401:f700::,2401:f700:ffff:ffff:ffff:ffff:ffff:ffff,AU 2401:f800::,2401:f800:ffff:ffff:ffff:ffff:ffff:ffff,JP 2401:f900::,2401:f900:ffff:ffff:ffff:ffff:ffff:ffff,SG -2401:fa00::,2401:fa00:ffff:ffff:ffff:ffff:ffff:ffff,IN +2401:fa00::,2401:fa00::ffff:ffff:ffff:ffff:ffff,AU +2401:fa00:1::,2401:fa00:1:ffff:ffff:ffff:ffff:ffff,TW +2401:fa00:2::,2401:fa00:8:ffff:ffff:ffff:ffff:ffff,IN +2401:fa00:9::,2401:fa00:9:ffff:ffff:ffff:ffff:ffff,AU +2401:fa00:a::,2401:fa00:c:ffff:ffff:ffff:ffff:ffff,IN +2401:fa00:d::,2401:fa00:d:ffff:ffff:ffff:ffff:ffff,KR +2401:fa00:e::,2401:fa00:e:ffff:ffff:ffff:ffff:ffff,IN +2401:fa00:f::,2401:fa00:f:ffff:ffff:ffff:ffff:ffff,SG +2401:fa00:10::,2401:fa00:10:ffff:ffff:ffff:ffff:ffff,IN +2401:fa00:11::,2401:fa00:11:ffff:ffff:ffff:ffff:ffff,AU +2401:fa00:12::,2401:fa00:12:ffff:ffff:ffff:ffff:ffff,IN +2401:fa00:13::,2401:fa00:13:ffff:ffff:ffff:ffff:ffff,HK +2401:fa00:14::,2401:fa00:3f:ffff:ffff:ffff:ffff:ffff,IN +2401:fa00:40::,2401:fa00:40:ffff:ffff:ffff:ffff:ffff,CN +2401:fa00:41::,2401:fa00:ffff:ffff:ffff:ffff:ffff:ffff,IN 2401:fb00::,2401:fb00:ffff:ffff:ffff:ffff:ffff:ffff,IN 2401:fc00::,2401:fc00:ffff:ffff:ffff:ffff:ffff:ffff,AU 2401:fd00::,2401:fd00:ffff:ffff:ffff:ffff:ffff:ffff,MY @@ -1613,7 +5043,6 @@ 2402:3c00::,2402:3c00:ffff:ffff:ffff:ffff:ffff:ffff,CN 2402:3d00::,2402:3d00:ffff:ffff:ffff:ffff:ffff:ffff,JP 2402:3e00::,2402:3e00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2402:3f00::,2402:3f00:ffff:ffff:ffff:ffff:ffff:ffff,MN 2402:4000::,2402:4000:ffff:ffff:ffff:ffff:ffff:ffff,LK 2402:4100::,2402:4100:ffff:ffff:ffff:ffff:ffff:ffff,ID 2402:4200::,2402:4200:ffff:ffff:ffff:ffff:ffff:ffff,JP @@ -1645,7 +5074,11 @@ 2402:5d00::,2402:5d00:ffff:ffff:ffff:ffff:ffff:ffff,CN 2402:5e00::,2402:5e00:ffff:ffff:ffff:ffff:ffff:ffff,CN 2402:5f00::,2402:5f00:ffff:ffff:ffff:ffff:ffff:ffff,ID -2402:6000::,2402:6000:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2402:6000::,2402:6000:ff:ffff:ffff:ffff:ffff:ffff,AU +2402:6000:100::,2402:6000:100:ffff:ffff:ffff:ffff:ffff,NZ +2402:6000:101::,2402:6000:1fe:ffff:ffff:ffff:ffff:ffff,AU +2402:6000:1ff::,2402:6000:1ff:ffff:ffff:ffff:ffff:ffff,NZ +2402:6000:200::,2402:6000:ffff:ffff:ffff:ffff:ffff:ffff,AU 2402:6100::,2402:6100:ffff:ffff:ffff:ffff:ffff:ffff,KR 2402:6200::,2402:6200:ffff:ffff:ffff:ffff:ffff:ffff,GU 2402:6300::,2402:6300:ffff:ffff:ffff:ffff:ffff:ffff,AU @@ -1776,7 +5209,6 @@ 2402:e600::,2402:e600:ffff:ffff:ffff:ffff:ffff:ffff,SG 2402:e800::,2402:e800:ffff:ffff:ffff:ffff:ffff:ffff,JP 2402:e900::,2402:e900:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:ea00::,2402:ea00:ffff:ffff:ffff:ffff:ffff:ffff,IN 2402:eb00::,2402:eb00:ffff:ffff:ffff:ffff:ffff:ffff,AU 2402:ec00::,2402:ec00:ffff:ffff:ffff:ffff:ffff:ffff,AU 2402:ed00::,2402:ed00:ffff:ffff:ffff:ffff:ffff:ffff,JP @@ -2005,6 +5437,7 @@ 2403:d400::,2403:d400:ffff:ffff:ffff:ffff:ffff:ffff,CN 2403:d500::,2403:d500:ffff:ffff:ffff:ffff:ffff:ffff,AU 2403:d600::,2403:d600:ffff:ffff:ffff:ffff:ffff:ffff,AU +2403:d700::,2403:d700:ffff:ffff:ffff:ffff:ffff:ffff,MN 2403:d800::,2403:d800:ffff:ffff:ffff:ffff:ffff:ffff,NZ 2403:d900::,2403:d900:ffff:ffff:ffff:ffff:ffff:ffff,AU 2403:da00::,2403:da00:ffff:ffff:ffff:ffff:ffff:ffff,ID @@ -2089,7 +5522,7 @@ 2404:1300::,2404:1300:ffff:ffff:ffff:ffff:ffff:ffff,JP 2404:1400::,2404:1400:ffff:ffff:ffff:ffff:ffff:ffff,ID 2404:1500::,2404:1500:ffff:ffff:ffff:ffff:ffff:ffff,IN -2404:1600::,2404:1600:ffff:ffff:ffff:ffff:ffff:ffff,AU +2404:1600::,2404:1601:ffff:ffff:ffff:ffff:ffff:ffff,AU 2404:1700::,2404:1700:ffff:ffff:ffff:ffff:ffff:ffff,JP 2404:1800::,2404:1800:ffff:ffff:ffff:ffff:ffff:ffff,NZ 2404:1900::,2404:1900:ffff:ffff:ffff:ffff:ffff:ffff,JP @@ -2290,7 +5723,7 @@ 2404:e500::,2404:e500:ffff:ffff:ffff:ffff:ffff:ffff,ID 2404:e600::,2404:e600:ffff:ffff:ffff:ffff:ffff:ffff,SG 2404:e700::,2404:e700:ffff:ffff:ffff:ffff:ffff:ffff,ID -2404:e800::,2404:e8ff:ffff:ffff:ffff:ffff:ffff:ffff,SG +2404:e800::,2404:e801:ffff:ffff:ffff:ffff:ffff:ffff,SG 2404:e900::,2404:e900:ffff:ffff:ffff:ffff:ffff:ffff,ID 2404:ea00::,2404:ea00:ffff:ffff:ffff:ffff:ffff:ffff,AU 2404:eb00::,2404:eb00:ffff:ffff:ffff:ffff:ffff:ffff,ID @@ -2307,7 +5740,11 @@ 2404:f600::,2404:f600:ffff:ffff:ffff:ffff:ffff:ffff,ID 2404:f700::,2404:f700:ffff:ffff:ffff:ffff:ffff:ffff,ID 2404:f800::,2404:f800:ffff:ffff:ffff:ffff:ffff:ffff,JP -2404:f801::,2404:f801:ffff:ffff:ffff:ffff:ffff:ffff,SG +2404:f801::,2404:f801:802f:ffff:ffff:ffff:ffff:ffff,SG +2404:f801:8030::,2404:f801:8030:ffff:ffff:ffff:ffff:ffff,AU +2404:f801:8031::,2404:f801:8057:ffff:ffff:ffff:ffff:ffff,SG +2404:f801:8058::,2404:f801:8058:ffff:ffff:ffff:ffff:ffff,IN +2404:f801:8059::,2404:f801:ffff:ffff:ffff:ffff:ffff:ffff,SG 2404:f900::,2404:f900:ffff:ffff:ffff:ffff:ffff:ffff,ID 2404:fa00::,2404:fa00:ffff:ffff:ffff:ffff:ffff:ffff,AU 2404:fb00::,2404:fb00:ffff:ffff:ffff:ffff:ffff:ffff,ID @@ -2520,7 +5957,6 @@ 2405:d200::,2405:d200:ffff:ffff:ffff:ffff:ffff:ffff,JP 2405:d300::,2405:d300:ffff:ffff:ffff:ffff:ffff:ffff,AU 2405:d400::,2405:d400:ffff:ffff:ffff:ffff:ffff:ffff,PH -2405:d500::,2405:d500:ffff:ffff:ffff:ffff:ffff:ffff,HK 2405:d600::,2405:d600:ffff:ffff:ffff:ffff:ffff:ffff,AU 2405:d700::,2405:d700:ffff:ffff:ffff:ffff:ffff:ffff,CN 2405:d800::,2405:d800:ffff:ffff:ffff:ffff:ffff:ffff,SG @@ -2537,7 +5973,6 @@ 2405:e600::,2405:e600:ffff:ffff:ffff:ffff:ffff:ffff,CN 2405:e700::,2405:e700:ffff:ffff:ffff:ffff:ffff:ffff,IN 2405:e800::,2405:e800:ffff:ffff:ffff:ffff:ffff:ffff,JP -2405:e900::,2405:e900:ffff:ffff:ffff:ffff:ffff:ffff,PH 2405:ea00::,2405:ea00:ffff:ffff:ffff:ffff:ffff:ffff,AU 2405:eb00::,2405:eb00:ffff:ffff:ffff:ffff:ffff:ffff,SG 2405:ec00::,2405:ec00:ffff:ffff:ffff:ffff:ffff:ffff,BT @@ -2590,7 +6025,11 @@ 2406:1d00::,2406:1d00:ffff:ffff:ffff:ffff:ffff:ffff,NZ 2406:1e00::,2406:1e00:ffff:ffff:ffff:ffff:ffff:ffff,NZ 2406:1f00::,2406:1f00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2406:2000::,2406:2000:ffff:ffff:ffff:ffff:ffff:ffff,TW +2406:2000::,2406:2000:ef95:ffff:ffff:ffff:ffff:ffff,TW +2406:2000:ef96::,2406:2000:ef96:ffff:ffff:ffff:ffff:ffff,HK +2406:2000:ef97::,2406:2000:efb9:ffff:ffff:ffff:ffff:ffff,TW +2406:2000:efba::,2406:2000:efba:ffff:ffff:ffff:ffff:ffff,HK +2406:2000:efbb::,2406:2000:ffff:ffff:ffff:ffff:ffff:ffff,TW 2406:2100::,2406:2100:ffff:ffff:ffff:ffff:ffff:ffff,IN 2406:2200::,2406:2200:ffff:ffff:ffff:ffff:ffff:ffff,AU 2406:2300::,2406:2300:ffff:ffff:ffff:ffff:ffff:ffff,NZ @@ -2606,7 +6045,7 @@ 2406:2d00::,2406:2d00:ffff:ffff:ffff:ffff:ffff:ffff,IN 2406:2e00::,2406:2e00:ffff:ffff:ffff:ffff:ffff:ffff,IN 2406:2f00::,2406:2f00:ffff:ffff:ffff:ffff:ffff:ffff,IN -2406:3000::,2406:30ff:ffff:ffff:ffff:ffff:ffff:ffff,SG +2406:3000::,2406:3003:ffff:ffff:ffff:ffff:ffff:ffff,SG 2406:3100::,2406:3100:ffff:ffff:ffff:ffff:ffff:ffff,TH 2406:3200::,2406:3200:ffff:ffff:ffff:ffff:ffff:ffff,PH 2406:3300::,2406:3300:ffff:ffff:ffff:ffff:ffff:ffff,CN @@ -2677,6 +6116,7 @@ 2406:7400::,2406:7400:ffff:ffff:ffff:ffff:ffff:ffff,IN 2406:7500::,2406:7500:ffff:ffff:ffff:ffff:ffff:ffff,AU 2406:7600::,2406:7600:ffff:ffff:ffff:ffff:ffff:ffff,AU +2406:7700::,2406:7700:ffff:ffff:ffff:ffff:ffff:ffff,MY 2406:7800::,2406:7801:ffff:ffff:ffff:ffff:ffff:ffff,BN 2406:7900::,2406:7900:ffff:ffff:ffff:ffff:ffff:ffff,TH 2406:7a00::,2406:7a00:ffff:ffff:ffff:ffff:ffff:ffff,ID @@ -2770,6 +6210,7 @@ 2406:d600::,2406:d600:ffff:ffff:ffff:ffff:ffff:ffff,IN 2406:d700::,2406:d700:ffff:ffff:ffff:ffff:ffff:ffff,KR 2406:d800::,2406:d800:ffff:ffff:ffff:ffff:ffff:ffff,IN +2406:da01::,2406:daff:ffff:ffff:ffff:ffff:ffff:ffff,JP 2406:db00::,2406:db00:ffff:ffff:ffff:ffff:ffff:ffff,IN 2406:dc00::,2406:dc00:ffff:ffff:ffff:ffff:ffff:ffff,CN 2406:dd00::,2406:dd00:ffff:ffff:ffff:ffff:ffff:ffff,CN @@ -2837,7 +6278,6 @@ 2407:1c00::,2407:1c00:ffff:ffff:ffff:ffff:ffff:ffff,SG 2407:1d00::,2407:1d00:ffff:ffff:ffff:ffff:ffff:ffff,CN 2407:1e00::,2407:1e00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2407:1f00::,2407:1f00:ffff:ffff:ffff:ffff:ffff:ffff,HK 2407:2000::,2407:2000:ffff:ffff:ffff:ffff:ffff:ffff,KR 2407:2100::,2407:2100:ffff:ffff:ffff:ffff:ffff:ffff,HK 2407:2200::,2407:2200:ffff:ffff:ffff:ffff:ffff:ffff,AU @@ -2951,7 +6391,6 @@ 2407:9300::,2407:9300:ffff:ffff:ffff:ffff:ffff:ffff,IN 2407:9400::,2407:9400:ffff:ffff:ffff:ffff:ffff:ffff,MY 2407:9500::,2407:9500:ffff:ffff:ffff:ffff:ffff:ffff,NP -2407:9700::,2407:9700:ffff:ffff:ffff:ffff:ffff:ffff,IN 2407:9800::,2407:9800:ffff:ffff:ffff:ffff:ffff:ffff,PH 2407:9900::,2407:9900:ffff:ffff:ffff:ffff:ffff:ffff,JP 2407:9a00::,2407:9a00:ffff:ffff:ffff:ffff:ffff:ffff,IN @@ -3064,6 +6503,7 @@ 240b:240::,240b:27f:ffff:ffff:ffff:ffff:ffff:ffff,JP 240b:8000::,240b:87ff:ffff:ffff:ffff:ffff:ffff:ffff,CN 240c::,240c:f:ffff:ffff:ffff:ffff:ffff:ffff,CN +240c:8000::,240c:87ff:ffff:ffff:ffff:ffff:ffff:ffff,CN 240d::,240d:1f:ffff:ffff:ffff:ffff:ffff:ffff,JP 240e::,240e:fff:ffff:ffff:ffff:ffff:ffff:ffff,CN 240f::,240f:ff:ffff:ffff:ffff:ffff:ffff:ffff,JP @@ -3088,10 +6528,11 @@ 2600:1900::,2600:190f:ffff:ffff:ffff:ffff:ffff:ffff,US 2600:1a00::,2600:1a0f:ffff:ffff:ffff:ffff:ffff:ffff,GD 2600:1b00::,2600:1bff:ffff:ffff:ffff:ffff:ffff:ffff,JM -2600:1c00::,2600:1c0f:ffff:ffff:ffff:ffff:ffff:ffff,US 2600:1d00::,2600:1d0f:ffff:ffff:ffff:ffff:ffff:ffff,US 2600:1e00::,2600:1e0f:ffff:ffff:ffff:ffff:ffff:ffff,VC -2600:2000::,2600:200f:ffff:ffff:ffff:ffff:ffff:ffff,US +2600:1f00::,2600:200f:ffff:ffff:ffff:ffff:ffff:ffff,US +2600:2100::,2600:210f:ffff:ffff:ffff:ffff:ffff:ffff,US +2600:2200::,2600:220f:ffff:ffff:ffff:ffff:ffff:ffff,US 2600:2400::,2600:2407:ffff:ffff:ffff:ffff:ffff:ffff,US 2600:2800::,2600:2803:ffff:ffff:ffff:ffff:ffff:ffff,US 2600:2c00::,2600:2c03:ffff:ffff:ffff:ffff:ffff:ffff,US @@ -3119,7 +6560,9 @@ 2600:8400::,2600:840f:ffff:ffff:ffff:ffff:ffff:ffff,BB 2600:8800::,2600:880f:ffff:ffff:ffff:ffff:ffff:ffff,US 2600:e000::,2600:e00f:ffff:ffff:ffff:ffff:ffff:ffff,CA -2601::,2601:ff:ffff:ffff:ffff:ffff:ffff:ffff,US +2601::,2601:6:117f:ffff:ffff:ffff:ffff:ffff,US +2601:6:1180::,2601:6:1180:ffff:ffff:ffff:ffff:ffff,CA +2601:6:1181::,2601:fff:ffff:ffff:ffff:ffff:ffff:ffff,US 2602::,2602:10f:ffff:ffff:ffff:ffff:ffff:ffff,US 2602:200::,2602:200:ffff:ffff:ffff:ffff:ffff:ffff,CA 2602:210::,2602:210:ffff:ffff:ffff:ffff:ffff:ffff,CA @@ -3128,6 +6571,31 @@ 2602:232::,2602:232:ffff:ffff:ffff:ffff:ffff:ffff,CA 2602:240::,2602:25f:ffff:ffff:ffff:ffff:ffff:ffff,US 2602:300::,2602:3ff:ffff:ffff:ffff:ffff:ffff:ffff,US +2602:ff97::,2602:ff97:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff98::,2602:ff98:fff:ffff:ffff:ffff:ffff:ffff,CA +2602:ff99::,2602:ff99:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff9a::,2602:ff9a:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff9b::,2602:ff9b:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff9c::,2602:ff9c:fff:ffff:ffff:ffff:ffff:ffff,CA +2602:ff9d::,2602:ff9d:fff:ffff:ffff:ffff:ffff:ffff,CA +2602:ff9e::,2602:ff9e:fff:ffff:ffff:ffff:ffff:ffff,CA +2602:ff9f::,2602:ff9f:fff:ffff:ffff:ffff:ffff:ffff,CA +2602:ffa0::,2602:ffa0:fff:ffff:ffff:ffff:ffff:ffff,VG +2602:ffa1::,2602:ffa1:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ffa2::,2602:ffa2:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ffa3::,2602:ffa3:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ffa4::,2602:ffa4:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ffa5::,2602:ffa5:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ffa6::,2602:ffa6:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ffa7::,2602:ffa7:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ffa8::,2602:ffa8:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ffa9::,2602:ffa9:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ffaa::,2602:ffaa:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ffab::,2602:ffab:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ffac::,2602:ffac:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ffad::,2602:ffad:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ffae::,2602:ffae:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ffaf::,2602:ffaf:fff:ffff:ffff:ffff:ffff:ffff,US 2602:ffb0::,2602:ffb0:fff:ffff:ffff:ffff:ffff:ffff,US 2602:ffb1::,2602:ffb1:fff:ffff:ffff:ffff:ffff:ffff,CA 2602:ffb2::,2602:ffb2:fff:ffff:ffff:ffff:ffff:ffff,US @@ -3152,8 +6620,7 @@ 2602:ffc5::,2602:ffc5:fff:ffff:ffff:ffff:ffff:ffff,US 2602:ffc6::,2602:ffc6:fff:ffff:ffff:ffff:ffff:ffff,US 2602:ffc7::,2602:ffc7:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ffc8::,2602:ffc8:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ffc9::,2602:ffc9:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ffc8::,2602:ffc9:fff:ffff:ffff:ffff:ffff:ffff,US 2602:ffca::,2602:ffca:fff:ffff:ffff:ffff:ffff:ffff,US 2602:ffcb::,2602:ffcb:fff:ffff:ffff:ffff:ffff:ffff,US 2602:ffcc::,2602:ffcc:fff:ffff:ffff:ffff:ffff:ffff,US @@ -3205,6 +6672,7 @@ 2602:fffd::,2602:fffd:fff:ffff:ffff:ffff:ffff:ffff,CA 2602:ffff::,2602:ffff:fff:ffff:ffff:ffff:ffff:ffff,US 2603::,2603:10ff:ffff:ffff:ffff:ffff:ffff:ffff,US +2603:2000::,2603:2fff:ffff:ffff:ffff:ffff:ffff:ffff,US 2604::,2604::ffff:ffff:ffff:ffff:ffff:ffff,US 2604:10::,2604:10:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:100::,2604:100:ffff:ffff:ffff:ffff:ffff:ffff,US @@ -3269,7 +6737,9 @@ 2604:1e80::,2604:1e80:ffff:ffff:ffff:ffff:ffff:ffff,CA 2604:1f00::,2604:1f00:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:1f80::,2604:1f80:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:2000::,2604:2100:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2000::,2604:2000:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2080::,2604:2080:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2100::,2604:2100:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:2180::,2604:2180:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:2200::,2604:2200:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:2280::,2604:2280:ffff:ffff:ffff:ffff:ffff:ffff,US @@ -3395,7 +6865,9 @@ 2604:5e80::,2604:5e80:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:5f00::,2604:5f00:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:5f80::,2604:5f80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:6000::,2604:6100:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:6000::,2604:6000:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:6080::,2604:6080:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:6100::,2604:6100:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:6180::,2604:6180:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:6200::,2604:6200:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:6280::,2604:6280:ffff:ffff:ffff:ffff:ffff:ffff,US @@ -3469,10 +6941,10 @@ 2604:8500::,2604:8500:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:8580::,2604:8580:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:8600::,2604:8600:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:8680::,2604:8680:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:8700::,2604:8700:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:8780::,2604:8780:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:8800::,2604:88ff:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:8800::,2604:8800:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:8880::,2604:8880:ffff:ffff:ffff:ffff:ffff:ffff,CA 2604:8900::,2604:8900:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:8980::,2604:8980:ffff:ffff:ffff:ffff:ffff:ffff,CA 2604:8a00::,2604:8a00:ffff:ffff:ffff:ffff:ffff:ffff,US @@ -3558,6 +7030,7 @@ 2604:b200::,2604:b200:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:b280::,2604:b280:ffff:ffff:ffff:ffff:ffff:ffff,CA 2604:b300::,2604:b300:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:b380::,2604:b380:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:b400::,2604:b400:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:b480::,2604:b480:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:b500::,2604:b500:ffff:ffff:ffff:ffff:ffff:ffff,US @@ -3601,6 +7074,7 @@ 2604:c800::,2604:c800:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:c880::,2604:c880:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:c900::,2604:c900:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:c980::,2604:c980:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:ca00::,2604:ca00:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:ca80::,2604:ca80:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:cb00::,2604:cb00:ffff:ffff:ffff:ffff:ffff:ffff,US @@ -3630,13 +7104,11 @@ 2604:d700::,2604:d700:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:d780::,2604:d780:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:d800::,2604:d801:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:d880::,2604:d880:ffff:ffff:ffff:ffff:ffff:ffff,CA 2604:d900::,2604:d900:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:d980::,2604:d980:ffff:ffff:ffff:ffff:ffff:ffff,CA 2604:da00::,2604:da00:fff:ffff:ffff:ffff:ffff:ffff,US 2604:da80::,2604:da80:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:db00::,2604:db00:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:db80::,2604:db80:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:dc00::,2604:dc00:ffff:ffff:ffff:ffff:ffff:ffff,CA 2604:dc80::,2604:dc80:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:dd00::,2604:dd00:ffff:ffff:ffff:ffff:ffff:ffff,US @@ -3676,7 +7148,6 @@ 2604:ee00::,2604:ee00:fff:ffff:ffff:ffff:ffff:ffff,US 2604:ee80::,2604:ee80:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:ef00::,2604:ef00:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:ef80::,2604:ef80:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:f000::,2604:f000:ffff:ffff:ffff:ffff:ffff:ffff,CA 2604:f080::,2604:f080:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:f100::,2604:f100:ffff:ffff:ffff:ffff:ffff:ffff,US @@ -3745,7 +7216,6 @@ 2605:1080::,2605:1080:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:1100::,2605:1100:ffff:ffff:ffff:ffff:ffff:ffff,CA 2605:1180::,2605:1180:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:1200::,2605:1200:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:1280::,2605:1280:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:1300::,2605:1300:ffff:ffff:ffff:ffff:ffff:ffff,CA 2605:1380::,2605:1380:ffff:ffff:ffff:ffff:ffff:ffff,CA @@ -3800,6 +7270,7 @@ 2605:2c80::,2605:2c80:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:2d00::,2605:2d00:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:2d80::,2605:2d80:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:2e00::,2605:2e00:ffff:ffff:ffff:ffff:ffff:ffff,CA 2605:2e80::,2605:2e80:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:2f00::,2605:2f00:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:2f80::,2605:2f80:ffff:ffff:ffff:ffff:ffff:ffff,US @@ -3852,7 +7323,6 @@ 2605:4700::,2605:4700:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:4780::,2605:4780:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:4800::,2605:4800:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:4880::,2605:4880:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:4900::,2605:4900:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:4980::,2605:4980:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:4a00::,2605:4a00:ffff:ffff:ffff:ffff:ffff:ffff,US @@ -3882,7 +7352,6 @@ 2605:5600::,2605:5600:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:5680::,2605:5680:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:5700::,2605:5700:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:5780::,2605:5780:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:5800::,2605:5800:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:5880::,2605:5880:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:5900::,2605:5900:ffff:ffff:ffff:ffff:ffff:ffff,JM @@ -3899,7 +7368,9 @@ 2605:5e80::,2605:5e80:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:5f00::,2605:5f00:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:5f80::,2605:5f80:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:6000::,2605:6100:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:6000::,2605:6000:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:6080::,2605:6080:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:6100::,2605:6100:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:6180::,2605:6180:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:6200::,2605:6200:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:6280::,2605:6280:ffff:ffff:ffff:ffff:ffff:ffff,AI @@ -3950,7 +7421,6 @@ 2605:7900::,2605:7900:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:7980::,2605:7980:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:7a00::,2605:7a00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:7a80::,2605:7a80:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:7b00::,2605:7b00:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:7b80::,2605:7b80:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:7c00::,2605:7c00:ffff:ffff:ffff:ffff:ffff:ffff,CA @@ -3990,7 +7460,6 @@ 2605:8d00::,2605:8d00:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:8d80::,2605:8d80:ffff:ffff:ffff:ffff:ffff:ffff,CA 2605:8e00::,2605:8e00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:8e80::,2605:8e80:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:8f00::,2605:8f00:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:8f80::,2605:8f80:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:9000::,2605:9000:ffff:ffff:ffff:ffff:ffff:ffff,CA @@ -4014,74 +7483,149 @@ 2605:9900::,2605:9900:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:9980::,2605:9980:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:9a00::,2605:9a00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:9a80::,2605:9a80:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:9b00::,2605:9b00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:9b80::,2605:9b80:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:9c00::,2605:9c00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:9c80::,2605:9c80:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:9d00::,2605:9d00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:9d80::,2605:9d80:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:9e00::,2605:9e00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:9e80::,2605:9e80:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:9f00::,2605:9f00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:a000::,2605:a100:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:9f80::,2605:9f80:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:a000::,2605:a000:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:a080::,2605:a080:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:a100::,2605:a100:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:a180::,2605:a180:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:a200::,2605:a200:ffff:ffff:ffff:ffff:ffff:ffff,JM +2605:a280::,2605:a280:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:a300::,2605:a300:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:a380::,2605:a380:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:a400::,2605:a40f:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:a480::,2605:a480:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:a500::,2605:a500:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:a600::,2605:a700:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:a580::,2605:a580:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:a600::,2605:a601:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:a680::,2605:a680:ffff:ffff:ffff:ffff:ffff:ffff,CA +2605:a700::,2605:a700:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:a780::,2605:a780:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:a800::,2605:a800:ffff:ffff:ffff:ffff:ffff:ffff,CA +2605:a880::,2605:a880:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:a900::,2605:a900:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:a980::,2605:a980:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:aa00::,2605:aa00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:aa80::,2605:aa80:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:ab00::,2605:ab00:ffff:ffff:ffff:ffff:ffff:ffff,CA +2605:ab80::,2605:ab80:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:ac00::,2605:ac00:ffff:ffff:ffff:ffff:ffff:ffff,CA +2605:ac80::,2605:ac80:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:ad00::,2605:ad00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:ad80::,2605:ad80:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:ae00::,2605:ae00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:ae80::,2605:ae80:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:af00::,2605:af00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:af80::,2605:af80:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:b000::,2605:b000:ffff:ffff:ffff:ffff:ffff:ffff,CA +2605:b080::,2605:b080:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:b100::,2605:b100:ffff:ffff:ffff:ffff:ffff:ffff,CA +2605:b180::,2605:b180:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:b200::,2605:b200:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:b280::,2605:b280:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:b300::,2605:b300:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:b380::,2605:b380:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:b400::,2605:b400:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:b480::,2605:b480:ffff:ffff:ffff:ffff:ffff:ffff,CA 2605:b500::,2605:b500:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:b580::,2605:b580:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:b600::,2605:b600:ffff:ffff:ffff:ffff:ffff:ffff,CA +2605:b680::,2605:b680:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:b700::,2605:b700:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:b780::,2605:b780:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:b800::,2605:b800:ffff:ffff:ffff:ffff:ffff:ffff,PR +2605:b880::,2605:b880:ffff:ffff:ffff:ffff:ffff:ffff,CA 2605:b900::,2605:b900:ffff:ffff:ffff:ffff:ffff:ffff,CA +2605:b980::,2605:b980:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:ba00::,2605:ba00:ffff:ffff:ffff:ffff:ffff:ffff,PR +2605:ba80::,2605:ba80:ffff:ffff:ffff:ffff:ffff:ffff,CA 2605:bb00::,2605:bb00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:bb80::,2605:bb80:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:bc00::,2605:bc00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:bc80::,2605:bc80:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:bd00::,2605:bd00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:bd80::,2605:bd80:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:be00::,2605:be00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:be80::,2605:be80:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:bf00::,2605:bf00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:bf80::,2605:bf80:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:c000::,2605:c000:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:c080::,2605:c080:ffff:ffff:ffff:ffff:ffff:ffff,GD 2605:c100::,2605:c100:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:c180::,2605:c180:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:c200::,2605:c200:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:c280::,2605:c280:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:c300::,2605:c300:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:c380::,2605:c380:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:c400::,2605:c400:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:c480::,2605:c480:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:c500::,2605:c500:ffff:ffff:ffff:ffff:ffff:ffff,CA +2605:c580::,2605:c580:ffff:ffff:ffff:ffff:ffff:ffff,CA 2605:c600::,2605:c600:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:c680::,2605:c680:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:c700::,2605:c700:ffff:ffff:ffff:ffff:ffff:ffff,CA +2605:c780::,2605:c780:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:c800::,2605:c800:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:c880::,2605:c880:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:c900::,2605:c900:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:c980::,2605:c980:ffff:ffff:ffff:ffff:ffff:ffff,CA 2605:ca00::,2605:ca00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:ca80::,2605:ca80:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:cb00::,2605:cb00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:cb80::,2605:cb80:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:cc00::,2605:cc00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:cc80::,2605:cc80:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:cd00::,2605:cd00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:cd80::,2605:cd80:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:ce00::,2605:ce00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:ce80::,2605:ce80:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:cf00::,2605:cf00:ffff:ffff:ffff:ffff:ffff:ffff,CA +2605:cf80::,2605:cf80:ffff:ffff:ffff:ffff:ffff:ffff,CA 2605:d000::,2605:d000:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:d080::,2605:d080:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:d100::,2605:d100:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:d180::,2605:d180:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:d200::,2605:d200:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:d280::,2605:d280:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:d300::,2605:d300:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:d380::,2605:d380:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:d400::,2605:d400:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:d480::,2605:d480:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:d500::,2605:d500:ffff:ffff:ffff:ffff:ffff:ffff,CA +2605:d580::,2605:d580:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:d600::,2605:d600:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:d680::,2605:d680:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:d700::,2605:d700:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:d780::,2605:d780:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:d800::,2605:d800:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:d880::,2605:d880:ffff:ffff:ffff:ffff:ffff:ffff,DM 2605:d900::,2605:d900:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:d980::,2605:d980:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:da00::,2605:da00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:da80::,2605:da80:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:db00::,2605:db00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:db80::,2605:db80:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:dc00::,2605:dc00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:dc80::,2605:dc80:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:dd00::,2605:dd00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:dd80::,2605:dd80:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:de00::,2605:de00:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:de80::,2605:de80:ffff:ffff:ffff:ffff:ffff:ffff,VI 2605:df00::,2605:df00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:e000::,2605:e100:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:df80::,2605:df80:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:e000::,2605:e000:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:e080::,2605:e080:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:e100::,2605:e100:ffff:ffff:ffff:ffff:ffff:ffff,US +2605:e180::,2605:e180:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:e200::,2605:e200:ffff:ffff:ffff:ffff:ffff:ffff,CA 2605:e300::,2605:e300:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:e400::,2605:e400:ffff:ffff:ffff:ffff:ffff:ffff,US @@ -4208,7 +7752,8 @@ 2606:5d00::,2606:5d00:ffff:ffff:ffff:ffff:ffff:ffff,US 2606:5e00::,2606:5e00:ffff:ffff:ffff:ffff:ffff:ffff,US 2606:5f00::,2606:5f00:ffff:ffff:ffff:ffff:ffff:ffff,PR -2606:6000::,2606:6100:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:6000::,2606:6000:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:6100::,2606:6100:ffff:ffff:ffff:ffff:ffff:ffff,US 2606:6200::,2606:6200:ffff:ffff:ffff:ffff:ffff:ffff,CA 2606:6300::,2606:6300:ffff:ffff:ffff:ffff:ffff:ffff,CA 2606:6400::,2606:6400:ffff:ffff:ffff:ffff:ffff:ffff,US @@ -4271,7 +7816,10 @@ 2606:9d00::,2606:9d00:ffff:ffff:ffff:ffff:ffff:ffff,US 2606:9e00::,2606:9e00:ffff:ffff:ffff:ffff:ffff:ffff,BM 2606:9f00::,2606:9f00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:a000::,2606:a100:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:a000::,2606:a000:dd41:f5ff:ffff:ffff:ffff:ffff,US +2606:a000:dd41:f600::,2606:a000:dd41:f7ff:ffff:ffff:ffff:ffff,AU +2606:a000:dd41:f800::,2606:a000:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:a100::,2606:a100:ffff:ffff:ffff:ffff:ffff:ffff,US 2606:a200::,2606:a200:ffff:ffff:ffff:ffff:ffff:ffff,US 2606:a300::,2606:a300:ffff:ffff:ffff:ffff:ffff:ffff,US 2606:a400::,2606:a400:ffff:ffff:ffff:ffff:ffff:ffff,US @@ -4320,7 +7868,7 @@ 2606:d000::,2606:d000:ffff:ffff:ffff:ffff:ffff:ffff,US 2606:d100::,2606:d100:ffff:ffff:ffff:ffff:ffff:ffff,US 2606:d200::,2606:d200:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:d300::,2606:d300:ffff:ffff:ffff:ffff:ffff:ffff,US +2606:d300::,2606:d300:fff:ffff:ffff:ffff:ffff:ffff,US 2606:d400::,2606:d400:ffff:ffff:ffff:ffff:ffff:ffff,US 2606:d500::,2606:d500:ffff:ffff:ffff:ffff:ffff:ffff,US 2606:d600::,2606:d600:ffff:ffff:ffff:ffff:ffff:ffff,US @@ -4681,7 +8229,7 @@ 2607:f270::,2607:f270:ffff:ffff:ffff:ffff:ffff:ffff,US 2607:f278::,2607:f278:ffff:ffff:ffff:ffff:ffff:ffff,US 2607:f280::,2607:f281:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f288::,2607:f288:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:f288::,2607:f288:ffff:ffff:ffff:ffff:ffff:ffff,US 2607:f290::,2607:f290:ffff:ffff:ffff:ffff:ffff:ffff,US 2607:f298::,2607:f298:ffff:ffff:ffff:ffff:ffff:ffff,US 2607:f2a8::,2607:f2a8:ffff:ffff:ffff:ffff:ffff:ffff,US @@ -4694,7 +8242,36 @@ 2607:f2e8::,2607:f2e8:ffff:ffff:ffff:ffff:ffff:ffff,US 2607:f2f0::,2607:f2f0:ffff:ffff:ffff:ffff:ffff:ffff,US 2607:f2f8::,2607:f2f8:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f300::,2607:f400:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f300::,2607:f300:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f308::,2607:f308:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f310::,2607:f310:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f318::,2607:f318:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f330::,2607:f330:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f338::,2607:f338:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:f340::,2607:f340:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f348::,2607:f348:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f350::,2607:f350:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f358::,2607:f358:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f360::,2607:f360:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f368::,2607:f368:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f370::,2607:f370:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f378::,2607:f378:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f380::,2607:f380:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f388::,2607:f388:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f390::,2607:f390:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f398::,2607:f398:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f3a0::,2607:f3a0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f3b0::,2607:f3b0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f3b8::,2607:f3b8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f3c0::,2607:f3c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f3c8::,2607:f3c8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f3d0::,2607:f3d0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f3d8::,2607:f3d8:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:f3e0::,2607:f3e0:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:f3e8::,2607:f3e8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f3f0::,2607:f3f0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f3f8::,2607:f3f8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f400::,2607:f400:ffff:ffff:ffff:ffff:ffff:ffff,US 2607:f408::,2607:f408:ffff:ffff:ffff:ffff:ffff:ffff,US 2607:f418::,2607:f418:ffff:ffff:ffff:ffff:ffff:ffff,US 2607:f420::,2607:f420:ffff:ffff:ffff:ffff:ffff:ffff,US @@ -4791,7 +8368,11 @@ 2607:f720::,2607:f720:ffff:ffff:ffff:ffff:ffff:ffff,US 2607:f728::,2607:f728:ffff:ffff:ffff:ffff:ffff:ffff,US 2607:f738::,2607:f738:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:f740::,2607:f740:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f740::,2607:f740:e:ffff:ffff:ffff:ffff:ffff,US +2607:f740:f::,2607:f740:f:ffff:ffff:ffff:ffff:ffff,CA +2607:f740:10::,2607:f740:6f:ffff:ffff:ffff:ffff:ffff,US +2607:f740:70::,2607:f740:70:ffff:ffff:ffff:ffff:ffff,CA +2607:f740:71::,2607:f740:ffff:ffff:ffff:ffff:ffff:ffff,US 2607:f748::,2607:f748:ffff:ffff:ffff:ffff:ffff:ffff,CA 2607:f750::,2607:f750:ffff:ffff:ffff:ffff:ffff:ffff,US 2607:f758::,2607:f758:ffff:ffff:ffff:ffff:ffff:ffff,US @@ -4915,7 +8496,6 @@ 2607:fb50::,2607:fb50:ffff:ffff:ffff:ffff:ffff:ffff,US 2607:fb58::,2607:fb58:ffff:ffff:ffff:ffff:ffff:ffff,US 2607:fb60::,2607:fb60:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fb68::,2607:fb68:ffff:ffff:ffff:ffff:ffff:ffff,US 2607:fb70::,2607:fb70:ffff:ffff:ffff:ffff:ffff:ffff,US 2607:fb78::,2607:fb78:ffff:ffff:ffff:ffff:ffff:ffff,US 2607:fb80::,2607:fb80:ffff:ffff:ffff:ffff:ffff:ffff,US @@ -4933,7 +8513,38 @@ 2607:fbe8::,2607:fbe8:ffff:ffff:ffff:ffff:ffff:ffff,US 2607:fbf0::,2607:fbf0:ffff:ffff:ffff:ffff:ffff:ffff,US 2607:fbf8::,2607:fbf8:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:fc00::,2607:fd00:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fc00::,2607:fc00:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fc08::,2607:fc08:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fc10::,2607:fc10:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:fc18::,2607:fc18:fff:ffff:ffff:ffff:ffff:ffff,US +2607:fc20::,2607:fc20:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fc28::,2607:fc28:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fc30::,2607:fc30:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fc38::,2607:fc38:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fc40::,2607:fc40:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fc48::,2607:fc48:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fc50::,2607:fc50:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fc58::,2607:fc58:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fc60::,2607:fc60:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fc68::,2607:fc68:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fc70::,2607:fc70:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:fc78::,2607:fc78:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:fc80::,2607:fc80:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fc88::,2607:fc88:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fc90::,2607:fc90:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fc98::,2607:fc98:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fca0::,2607:fca0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fca8::,2607:fca8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fcb8::,2607:fcb8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fcc0::,2607:fcc0:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:fcc8::,2607:fcc8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fcd0::,2607:fcd0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fcd8::,2607:fcd8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fce0::,2607:fce0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fce8::,2607:fce8:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fcf0::,2607:fcf0:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:fcf8::,2607:fcf8:ffff:ffff:ffff:ffff:ffff:ffff,CA +2607:fd00::,2607:fd00:ffff:ffff:ffff:ffff:ffff:ffff,US 2607:fd08::,2607:fd08:ffff:ffff:ffff:ffff:ffff:ffff,US 2607:fd10::,2607:fd10:ffff:ffff:ffff:ffff:ffff:ffff,US 2607:fd28::,2607:fd28:ffff:ffff:ffff:ffff:ffff:ffff,US @@ -5098,7 +8709,1072 @@ 2610:1e8::,2610:1e8:ffff:ffff:ffff:ffff:ffff:ffff,CA 2610:1f0::,2610:1f0:ffff:ffff:ffff:ffff:ffff:ffff,US 2610:1f8::,2610:1f8:ffff:ffff:ffff:ffff:ffff:ffff,US -2620::,2620:100:f:ffff:ffff:ffff:ffff:ffff,US +2620::,2620::ffff:ffff:ffff:ffff:ffff,US +2620:0:10::,2620::10:ffff:ffff:ffff:ffff:ffff,US +2620:0:20::,2620::20:ffff:ffff:ffff:ffff:ffff,US +2620:0:30::,2620::37:ffff:ffff:ffff:ffff:ffff,US +2620:0:60::,2620::60:ffff:ffff:ffff:ffff:ffff,FR +2620:0:70::,2620::70:ffff:ffff:ffff:ffff:ffff,US +2620:0:80::,2620::80:ffff:ffff:ffff:ffff:ffff,US +2620:0:90::,2620::90:ffff:ffff:ffff:ffff:ffff,US +2620:0:a0::,2620::a0:ffff:ffff:ffff:ffff:ffff,US +2620:0:b0::,2620::b0:ffff:ffff:ffff:ffff:ffff,US +2620:0:c0::,2620::c0:ffff:ffff:ffff:ffff:ffff,US +2620:0:f0::,2620::f0:ffff:ffff:ffff:ffff:ffff,CA +2620:0:100::,2620::100:ffff:ffff:ffff:ffff:ffff,US +2620:0:110::,2620::110:ffff:ffff:ffff:ffff:ffff,US +2620:0:120::,2620::120:ffff:ffff:ffff:ffff:ffff,US +2620:0:140::,2620::140:ffff:ffff:ffff:ffff:ffff,US +2620:0:150::,2620::150:ffff:ffff:ffff:ffff:ffff,US +2620:0:160::,2620::160:ffff:ffff:ffff:ffff:ffff,CA +2620:0:170::,2620::170:ffff:ffff:ffff:ffff:ffff,US +2620:0:180::,2620::180:ffff:ffff:ffff:ffff:ffff,US +2620:0:190::,2620::190:ffff:ffff:ffff:ffff:ffff,US +2620:0:1a0::,2620::1a0:ffff:ffff:ffff:ffff:ffff,US +2620:0:1b0::,2620::1b0:ffff:ffff:ffff:ffff:ffff,US +2620:0:1c0::,2620::1c0:ffff:ffff:ffff:ffff:ffff,US +2620:0:1d0::,2620::1d0:ffff:ffff:ffff:ffff:ffff,US +2620:0:1f0::,2620::1f0:ffff:ffff:ffff:ffff:ffff,US +2620:0:200::,2620::200:ffff:ffff:ffff:ffff:ffff,US +2620:0:210::,2620::210:ffff:ffff:ffff:ffff:ffff,US +2620:0:220::,2620::220:ffff:ffff:ffff:ffff:ffff,US +2620:0:230::,2620::230:ffff:ffff:ffff:ffff:ffff,CA +2620:0:240::,2620::240:ffff:ffff:ffff:ffff:ffff,US +2620:0:250::,2620::250:ffff:ffff:ffff:ffff:ffff,US +2620:0:260::,2620::260:ffff:ffff:ffff:ffff:ffff,US +2620:0:270::,2620::270:ffff:ffff:ffff:ffff:ffff,US +2620:0:280::,2620::280:ffff:ffff:ffff:ffff:ffff,US +2620:0:290::,2620::290:ffff:ffff:ffff:ffff:ffff,US +2620:0:2b0::,2620::2b0:ffff:ffff:ffff:ffff:ffff,US +2620:0:2c0::,2620::2c0:ffff:ffff:ffff:ffff:ffff,US +2620:0:2d0::,2620::2d0:ffff:ffff:ffff:ffff:ffff,US +2620:0:2f0::,2620::2f0:ffff:ffff:ffff:ffff:ffff,US +2620:0:300::,2620::300:ffff:ffff:ffff:ffff:ffff,US +2620:0:320::,2620::320:ffff:ffff:ffff:ffff:ffff,US +2620:0:350::,2620::353:ffff:ffff:ffff:ffff:ffff,US +2620:0:360::,2620::361:ffff:ffff:ffff:ffff:ffff,US +2620:0:380::,2620::380:ffff:ffff:ffff:ffff:ffff,US +2620:0:390::,2620::390:ffff:ffff:ffff:ffff:ffff,US +2620:0:3b0::,2620::3b0:ffff:ffff:ffff:ffff:ffff,US +2620:0:3c0::,2620::3c0:ffff:ffff:ffff:ffff:ffff,US +2620:0:3e0::,2620::3e0:ffff:ffff:ffff:ffff:ffff,US +2620:0:3f0::,2620::3f0:ffff:ffff:ffff:ffff:ffff,US +2620:0:400::,2620::57f:ffff:ffff:ffff:ffff:ffff,US +2620:0:600::,2620::600:ffff:ffff:ffff:ffff:ffff,US +2620:0:610::,2620::61f:ffff:ffff:ffff:ffff:ffff,US +2620:0:630::,2620::630:ffff:ffff:ffff:ffff:ffff,US +2620:0:640::,2620::640:ffff:ffff:ffff:ffff:ffff,US +2620:0:650::,2620::650:ffff:ffff:ffff:ffff:ffff,US +2620:0:660::,2620::660:ffff:ffff:ffff:ffff:ffff,US +2620:0:670::,2620::671:ffff:ffff:ffff:ffff:ffff,US +2620:0:680::,2620::680:ffff:ffff:ffff:ffff:ffff,US +2620:0:690::,2620::691:ffff:ffff:ffff:ffff:ffff,US +2620:0:6a0::,2620::6a0:ffff:ffff:ffff:ffff:ffff,US +2620:0:6b0::,2620::6b0:ffff:ffff:ffff:ffff:ffff,US +2620:0:6c0::,2620::6c7:ffff:ffff:ffff:ffff:ffff,US +2620:0:6d0::,2620::6d0:ffff:ffff:ffff:ffff:ffff,US +2620:0:6e0::,2620::6e0:ffff:ffff:ffff:ffff:ffff,US +2620:0:6f0::,2620::6f0:ffff:ffff:ffff:ffff:ffff,US +2620:0:700::,2620::77f:ffff:ffff:ffff:ffff:ffff,US +2620:0:800::,2620::802:ffff:ffff:ffff:ffff:ffff,US +2620:0:810::,2620::810:ffff:ffff:ffff:ffff:ffff,CA +2620:0:840::,2620::840:ffff:ffff:ffff:ffff:ffff,US +2620:0:850::,2620::850:ffff:ffff:ffff:ffff:ffff,US +2620:0:860::,2620::863:ffff:ffff:ffff:ffff:ffff,US +2620:0:870::,2620::877:ffff:ffff:ffff:ffff:ffff,US +2620:0:880::,2620::880:ffff:ffff:ffff:ffff:ffff,US +2620:0:890::,2620::890:ffff:ffff:ffff:ffff:ffff,US +2620:0:8a0::,2620::8a0:ffff:ffff:ffff:ffff:ffff,US +2620:0:8d0::,2620::8d0:ffff:ffff:ffff:ffff:ffff,US +2620:0:8e0::,2620::8e0:ffff:ffff:ffff:ffff:ffff,US +2620:0:8f0::,2620::8f0:ffff:ffff:ffff:ffff:ffff,US +2620:0:900::,2620::900:ffff:ffff:ffff:ffff:ffff,US +2620:0:910::,2620::910:ffff:ffff:ffff:ffff:ffff,US +2620:0:920::,2620::920:ffff:ffff:ffff:ffff:ffff,US +2620:0:930::,2620::930:ffff:ffff:ffff:ffff:ffff,US +2620:0:940::,2620::940:ffff:ffff:ffff:ffff:ffff,US +2620:0:950::,2620::950:ffff:ffff:ffff:ffff:ffff,US +2620:0:960::,2620::960:ffff:ffff:ffff:ffff:ffff,US +2620:0:970::,2620::970:ffff:ffff:ffff:ffff:ffff,US +2620:0:980::,2620::980:ffff:ffff:ffff:ffff:ffff,US +2620:0:990::,2620::990:ffff:ffff:ffff:ffff:ffff,US +2620:0:9a0::,2620::9a0:ffff:ffff:ffff:ffff:ffff,US +2620:0:9b0::,2620::9b0:ffff:ffff:ffff:ffff:ffff,US +2620:0:9c0::,2620::9c0:ffff:ffff:ffff:ffff:ffff,US +2620:0:9e0::,2620::9e0:ffff:ffff:ffff:ffff:ffff,US +2620:0:9f0::,2620::9f0:ffff:ffff:ffff:ffff:ffff,US +2620:0:a00::,2620::a1f:ffff:ffff:ffff:ffff:ffff,US +2620:0:b00::,2620::b00:ffff:ffff:ffff:ffff:ffff,US +2620:0:b10::,2620::b13:ffff:ffff:ffff:ffff:ffff,US +2620:0:b20::,2620::b20:ffff:ffff:ffff:ffff:ffff,US +2620:0:b30::,2620::b30:ffff:ffff:ffff:ffff:ffff,US +2620:0:b40::,2620::b40:ffff:ffff:ffff:ffff:ffff,US +2620:0:b60::,2620::b61:ffff:ffff:ffff:ffff:ffff,US +2620:0:b80::,2620::b80:ffff:ffff:ffff:ffff:ffff,US +2620:0:b90::,2620::b90:ffff:ffff:ffff:ffff:ffff,US +2620:0:ba0::,2620::ba0:ffff:ffff:ffff:ffff:ffff,US +2620:0:bb0::,2620::bb0:ffff:ffff:ffff:ffff:ffff,US +2620:0:bd0::,2620::bd0:ffff:ffff:ffff:ffff:ffff,CA +2620:0:be0::,2620::be0:ffff:ffff:ffff:ffff:ffff,US +2620:0:bf0::,2620::bf0:ffff:ffff:ffff:ffff:ffff,US +2620:0:c10::,2620::c20:ffff:ffff:ffff:ffff:ffff,US +2620:0:c30::,2620::c30:ffff:ffff:ffff:ffff:ffff,US +2620:0:c40::,2620::c40:ffff:ffff:ffff:ffff:ffff,US +2620:0:c60::,2620::c60:ffff:ffff:ffff:ffff:ffff,US +2620:0:c70::,2620::c70:ffff:ffff:ffff:ffff:ffff,US +2620:0:c80::,2620::c80:ffff:ffff:ffff:ffff:ffff,US +2620:0:c90::,2620::ca0:ffff:ffff:ffff:ffff:ffff,US +2620:0:cb0::,2620::cb0:ffff:ffff:ffff:ffff:ffff,US +2620:0:cc0::,2620::ccf:ffff:ffff:ffff:ffff:ffff,US +2620:0:ce0::,2620::ce0:ffff:ffff:ffff:ffff:ffff,US +2620:0:cf0::,2620::cf0:ffff:ffff:ffff:ffff:ffff,US +2620:0:d20::,2620::d20:ffff:ffff:ffff:ffff:ffff,US +2620:0:d30::,2620::d30:ffff:ffff:ffff:ffff:ffff,US +2620:0:d50::,2620::d50:ffff:ffff:ffff:ffff:ffff,US +2620:0:d60::,2620::d63:ffff:ffff:ffff:ffff:ffff,US +2620:0:d70::,2620::d77:ffff:ffff:ffff:ffff:ffff,US +2620:0:d80::,2620::d80:ffff:ffff:ffff:ffff:ffff,US +2620:0:d90::,2620::d90:ffff:ffff:ffff:ffff:ffff,US +2620:0:dc0::,2620::dc0:ffff:ffff:ffff:ffff:ffff,US +2620:0:dd0::,2620::dd0:ffff:ffff:ffff:ffff:ffff,CN +2620:0:de0::,2620::de0:ffff:ffff:ffff:ffff:ffff,US +2620:0:df0::,2620::df0:ffff:ffff:ffff:ffff:ffff,US +2620:0:e00::,2620::e00:ffff:ffff:ffff:ffff:ffff,US +2620:0:e10::,2620::e10:ffff:ffff:ffff:ffff:ffff,US +2620:0:e20::,2620::e23:ffff:ffff:ffff:ffff:ffff,US +2620:0:e30::,2620::e30:ffff:ffff:ffff:ffff:ffff,US +2620:0:e50::,2620::e50:ffff:ffff:ffff:ffff:ffff,US +2620:0:e60::,2620::e60:ffff:ffff:ffff:ffff:ffff,US +2620:0:e80::,2620::e80:ffff:ffff:ffff:ffff:ffff,US +2620:0:e90::,2620::e90:ffff:ffff:ffff:ffff:ffff,US +2620:0:ea0::,2620::eb0:ffff:ffff:ffff:ffff:ffff,US +2620:0:ed0::,2620::ed0:ffff:ffff:ffff:ffff:ffff,US +2620:0:ee0::,2620::ee0:ffff:ffff:ffff:ffff:ffff,US +2620:0:ef0::,2620::ef0:ffff:ffff:ffff:ffff:ffff,US +2620:0:f00::,2620::f7f:ffff:ffff:ffff:ffff:ffff,US +2620:0:1000::,2620::100c:ffff:ffff:ffff:ffff:ffff,US +2620:0:100d::,2620::100d:ffff:ffff:ffff:ffff:ffff,CA +2620:0:100e::,2620::101f:ffff:ffff:ffff:ffff:ffff,US +2620:0:1020::,2620::1020:ffff:ffff:ffff:ffff:ffff,MX +2620:0:1021::,2620::1024:ffff:ffff:ffff:ffff:ffff,US +2620:0:1025::,2620::1025:ffff:ffff:ffff:ffff:ffff,BR +2620:0:1026::,2620::103f:ffff:ffff:ffff:ffff:ffff,US +2620:0:1040::,2620::1040:ffff:ffff:ffff:ffff:ffff,IE +2620:0:1041::,2620::1041:ffff:ffff:ffff:ffff:ffff,US +2620:0:1042::,2620::1042:ffff:ffff:ffff:ffff:ffff,GB +2620:0:1043::,2620::1044:ffff:ffff:ffff:ffff:ffff,US +2620:0:1045::,2620::1045:ffff:ffff:ffff:ffff:ffff,IL +2620:0:1046::,2620::1046:ffff:ffff:ffff:ffff:ffff,DE +2620:0:1047::,2620::1048:ffff:ffff:ffff:ffff:ffff,US +2620:0:1049::,2620::1049:ffff:ffff:ffff:ffff:ffff,DE +2620:0:104a::,2620::104a:ffff:ffff:ffff:ffff:ffff,US +2620:0:104b::,2620::104b:ffff:ffff:ffff:ffff:ffff,NL +2620:0:104c::,2620::1051:ffff:ffff:ffff:ffff:ffff,US +2620:0:1052::,2620::1052:ffff:ffff:ffff:ffff:ffff,IE +2620:0:1053::,2620::1053:ffff:ffff:ffff:ffff:ffff,FR +2620:0:1054::,2620::105e:ffff:ffff:ffff:ffff:ffff,US +2620:0:105f::,2620::105f:ffff:ffff:ffff:ffff:ffff,CH +2620:0:1060::,2620::1068:ffff:ffff:ffff:ffff:ffff,US +2620:0:1069::,2620::1069:ffff:ffff:ffff:ffff:ffff,PL +2620:0:106a::,2620::106a:ffff:ffff:ffff:ffff:ffff,US +2620:0:106b::,2620::106b:ffff:ffff:ffff:ffff:ffff,RU +2620:0:106c::,2620::1072:ffff:ffff:ffff:ffff:ffff,US +2620:0:1073::,2620::1073:ffff:ffff:ffff:ffff:ffff,GB +2620:0:1074::,2620::10ff:ffff:ffff:ffff:ffff:ffff,US +2620:0:1400::,2620::143f:ffff:ffff:ffff:ffff:ffff,US +2620:0:1500::,2620::157f:ffff:ffff:ffff:ffff:ffff,US +2620:0:1600::,2620::167f:ffff:ffff:ffff:ffff:ffff,US +2620:0:1700::,2620::170f:ffff:ffff:ffff:ffff:ffff,US +2620:0:1800::,2620::181f:ffff:ffff:ffff:ffff:ffff,US +2620:0:1a00::,2620::1a00:ffff:ffff:ffff:ffff:ffff,US +2620:0:1a10::,2620::1a10:ffff:ffff:ffff:ffff:ffff,US +2620:0:1a20::,2620::1a20:ffff:ffff:ffff:ffff:ffff,US +2620:0:1a30::,2620::1a30:ffff:ffff:ffff:ffff:ffff,US +2620:0:1a40::,2620::1a40:ffff:ffff:ffff:ffff:ffff,US +2620:0:1a50::,2620::1a50:ffff:ffff:ffff:ffff:ffff,US +2620:0:1a70::,2620::1a70:ffff:ffff:ffff:ffff:ffff,US +2620:0:1a80::,2620::1a80:ffff:ffff:ffff:ffff:ffff,US +2620:0:1aa0::,2620::1aa0:ffff:ffff:ffff:ffff:ffff,US +2620:0:1ab0::,2620::1ab0:ffff:ffff:ffff:ffff:ffff,US +2620:0:1ac0::,2620::1ac0:ffff:ffff:ffff:ffff:ffff,US +2620:0:1ad0::,2620::1ad7:ffff:ffff:ffff:ffff:ffff,US +2620:0:1ae0::,2620::1ae0:ffff:ffff:ffff:ffff:ffff,US +2620:0:1af0::,2620::1af0:ffff:ffff:ffff:ffff:ffff,CA +2620:0:1b00::,2620::1b07:ffff:ffff:ffff:ffff:ffff,US +2620:0:1c00::,2620::1cff:ffff:ffff:ffff:ffff:ffff,US +2620:0:2000::,2620::203f:ffff:ffff:ffff:ffff:ffff,US +2620:0:2210::,2620::2210:ffff:ffff:ffff:ffff:ffff,US +2620:0:2220::,2620::2220:ffff:ffff:ffff:ffff:ffff,CA +2620:0:2240::,2620::2240:ffff:ffff:ffff:ffff:ffff,US +2620:0:2250::,2620::2250:ffff:ffff:ffff:ffff:ffff,US +2620:0:2260::,2620::2260:ffff:ffff:ffff:ffff:ffff,US +2620:0:2280::,2620::2280:ffff:ffff:ffff:ffff:ffff,US +2620:0:2290::,2620::2290:ffff:ffff:ffff:ffff:ffff,US +2620:0:22a0::,2620::22a0:ffff:ffff:ffff:ffff:ffff,US +2620:0:22b0::,2620::22b0:ffff:ffff:ffff:ffff:ffff,US +2620:0:22c0::,2620::22c0:ffff:ffff:ffff:ffff:ffff,US +2620:0:22d0::,2620::22d0:ffff:ffff:ffff:ffff:ffff,US +2620:0:22e0::,2620::22e0:ffff:ffff:ffff:ffff:ffff,CA +2620:0:22f0::,2620::22f0:ffff:ffff:ffff:ffff:ffff,US +2620:0:2300::,2620::230f:ffff:ffff:ffff:ffff:ffff,US +2620:0:2400::,2620::24ff:ffff:ffff:ffff:ffff:ffff,US +2620:0:2800::,2620::2800:ffff:ffff:ffff:ffff:ffff,US +2620:0:2810::,2620::2810:ffff:ffff:ffff:ffff:ffff,US +2620:0:2820::,2620::2820:ffff:ffff:ffff:ffff:ffff,US +2620:0:2830::,2620::2830:ffff:ffff:ffff:ffff:ffff,US +2620:0:2840::,2620::2840:ffff:ffff:ffff:ffff:ffff,US +2620:0:2850::,2620::2850:ffff:ffff:ffff:ffff:ffff,US +2620:0:2860::,2620::2860:ffff:ffff:ffff:ffff:ffff,US +2620:0:2870::,2620::2870:ffff:ffff:ffff:ffff:ffff,US +2620:0:2880::,2620::2880:ffff:ffff:ffff:ffff:ffff,US +2620:0:28a0::,2620::28a0:ffff:ffff:ffff:ffff:ffff,US +2620:0:28b0::,2620::28b0:ffff:ffff:ffff:ffff:ffff,US +2620:0:28d0::,2620::28d0:ffff:ffff:ffff:ffff:ffff,US +2620:0:28f0::,2620::28f0:ffff:ffff:ffff:ffff:ffff,US +2620:0:2900::,2620::290f:ffff:ffff:ffff:ffff:ffff,US +2620:0:2a00::,2620::2a1f:ffff:ffff:ffff:ffff:ffff,US +2620:0:2b00::,2620::2b00:ffff:ffff:ffff:ffff:ffff,US +2620:0:2b10::,2620::2b10:ffff:ffff:ffff:ffff:ffff,US +2620:0:2b20::,2620::2b20:ffff:ffff:ffff:ffff:ffff,US +2620:0:2b30::,2620::2b40:ffff:ffff:ffff:ffff:ffff,US +2620:0:2b50::,2620::2b50:ffff:ffff:ffff:ffff:ffff,US +2620:0:2b60::,2620::2b60:ffff:ffff:ffff:ffff:ffff,US +2620:0:2b70::,2620::2b8f:ffff:ffff:ffff:ffff:ffff,US +2620:0:2bc0::,2620::2bc3:ffff:ffff:ffff:ffff:ffff,US +2620:0:2be0::,2620::2be0:ffff:ffff:ffff:ffff:ffff,US +2620:0:2d00::,2620::2d7f:ffff:ffff:ffff:ffff:ffff,US +2620:0:2e00::,2620::2e00:ffff:ffff:ffff:ffff:ffff,US +2620:0:2e10::,2620::2e10:ffff:ffff:ffff:ffff:ffff,US +2620:0:2e30::,2620::2e30:ffff:ffff:ffff:ffff:ffff,US +2620:0:2e40::,2620::2e40:ffff:ffff:ffff:ffff:ffff,US +2620:0:2e50::,2620::2e50:ffff:ffff:ffff:ffff:ffff,US +2620:0:2e60::,2620::2e60:ffff:ffff:ffff:ffff:ffff,US +2620:0:2e70::,2620::2e80:ffff:ffff:ffff:ffff:ffff,US +2620:0:2ea0::,2620::2ea0:ffff:ffff:ffff:ffff:ffff,US +2620:0:2eb0::,2620::2eb0:ffff:ffff:ffff:ffff:ffff,US +2620:0:2ed0::,2620::2ed0:ffff:ffff:ffff:ffff:ffff,US +2620:0:2ee0::,2620::2ee0:ffff:ffff:ffff:ffff:ffff,US +2620:0:2f00::,2620::2f7f:ffff:ffff:ffff:ffff:ffff,US +2620:0:5000::,2620::5000:ffff:ffff:ffff:ffff:ffff,US +2620:0:5010::,2620::5010:ffff:ffff:ffff:ffff:ffff,US +2620:0:5030::,2620::5030:ffff:ffff:ffff:ffff:ffff,US +2620:0:5040::,2620::5040:ffff:ffff:ffff:ffff:ffff,US +2620:0:5050::,2620::5050:ffff:ffff:ffff:ffff:ffff,US +2620:0:5060::,2620::5060:ffff:ffff:ffff:ffff:ffff,CA +2620:0:5070::,2620::5070:ffff:ffff:ffff:ffff:ffff,US +2620:0:5080::,2620::5080:ffff:ffff:ffff:ffff:ffff,US +2620:0:5090::,2620::5090:ffff:ffff:ffff:ffff:ffff,US +2620:0:50a0::,2620::50a0:ffff:ffff:ffff:ffff:ffff,US +2620:0:50b0::,2620::50b0:ffff:ffff:ffff:ffff:ffff,US +2620:0:50c0::,2620::50c0:ffff:ffff:ffff:ffff:ffff,US +2620:0:50d0::,2620::50d1:ffff:ffff:ffff:ffff:ffff,US +2620:0:50e0::,2620::50e0:ffff:ffff:ffff:ffff:ffff,US +2620:0:50f0::,2620::50f0:ffff:ffff:ffff:ffff:ffff,US +2620:0:5100::,2620::510f:ffff:ffff:ffff:ffff:ffff,US +2620:0:5200::,2620::5200:ffff:ffff:ffff:ffff:ffff,US +2620:0:5300::,2620::530f:ffff:ffff:ffff:ffff:ffff,US +2620:0:aa00::,2620::aa00:ffff:ffff:ffff:ffff:ffff,US +2620:1::,2620:1::ffff:ffff:ffff:ffff:ffff,US +2620:1:4000::,2620:1:4000:ffff:ffff:ffff:ffff:ffff,US +2620:1:8000::,2620:1:8000:ffff:ffff:ffff:ffff:ffff,US +2620:1:c000::,2620:1:c000:ffff:ffff:ffff:ffff:ffff,US +2620:2::,2620:2::ffff:ffff:ffff:ffff:ffff,US +2620:2:4000::,2620:2:4000:ffff:ffff:ffff:ffff:ffff,CA +2620:2:8000::,2620:2:8000:ffff:ffff:ffff:ffff:ffff,US +2620:2:c000::,2620:2:c000:ffff:ffff:ffff:ffff:ffff,US +2620:3::,2620:3::ffff:ffff:ffff:ffff:ffff,US +2620:3:4000::,2620:3:4000:ffff:ffff:ffff:ffff:ffff,US +2620:3:8000::,2620:3:8000:ffff:ffff:ffff:ffff:ffff,US +2620:3:c000::,2620:3:c000:ffff:ffff:ffff:ffff:ffff,US +2620:4::,2620:4::ffff:ffff:ffff:ffff:ffff,US +2620:4:4000::,2620:4:4000:ffff:ffff:ffff:ffff:ffff,US +2620:4:8000::,2620:4:8000:ffff:ffff:ffff:ffff:ffff,US +2620:4:c000::,2620:4:c000:ffff:ffff:ffff:ffff:ffff,US +2620:5::,2620:5::ffff:ffff:ffff:ffff:ffff,US +2620:5:4000::,2620:5:400f:ffff:ffff:ffff:ffff:ffff,US +2620:5:8000::,2620:5:8000:ffff:ffff:ffff:ffff:ffff,US +2620:5:c000::,2620:5:c000:ffff:ffff:ffff:ffff:ffff,US +2620:6::,2620:6::ffff:ffff:ffff:ffff:ffff,CA +2620:6:4000::,2620:6:4000:ffff:ffff:ffff:ffff:ffff,US +2620:6:8000::,2620:6:8000:ffff:ffff:ffff:ffff:ffff,US +2620:6:c000::,2620:6:c000:ffff:ffff:ffff:ffff:ffff,US +2620:7::,2620:7::ffff:ffff:ffff:ffff:ffff,US +2620:7:4000::,2620:7:4000:ffff:ffff:ffff:ffff:ffff,US +2620:7:8000::,2620:7:8000:ffff:ffff:ffff:ffff:ffff,US +2620:7:c000::,2620:7:c000:ffff:ffff:ffff:ffff:ffff,US +2620:8::,2620:8:7f:ffff:ffff:ffff:ffff:ffff,CA +2620:8:8200::,2620:8:8200:ffff:ffff:ffff:ffff:ffff,US +2620:9::,2620:9::ffff:ffff:ffff:ffff:ffff,US +2620:9:4000::,2620:9:4000:ffff:ffff:ffff:ffff:ffff,US +2620:9:8000::,2620:9:8000:ffff:ffff:ffff:ffff:ffff,US +2620:9:c000::,2620:9:c000:ffff:ffff:ffff:ffff:ffff,US +2620:a::,2620:a:f:ffff:ffff:ffff:ffff:ffff,CA +2620:a:4000::,2620:a:4000:ffff:ffff:ffff:ffff:ffff,US +2620:a:8000::,2620:a:8000:ffff:ffff:ffff:ffff:ffff,US +2620:a:c000::,2620:a:c000:ffff:ffff:ffff:ffff:ffff,US +2620:b::,2620:b::ffff:ffff:ffff:ffff:ffff,US +2620:b:4000::,2620:b:4000:ffff:ffff:ffff:ffff:ffff,US +2620:b:8000::,2620:b:8000:ffff:ffff:ffff:ffff:ffff,US +2620:b:c000::,2620:b:c000:ffff:ffff:ffff:ffff:ffff,US +2620:c::,2620:c::ffff:ffff:ffff:ffff:ffff,US +2620:c:4000::,2620:c:4000:ffff:ffff:ffff:ffff:ffff,US +2620:c:8000::,2620:c:8000:ffff:ffff:ffff:ffff:ffff,US +2620:c:c000::,2620:c:c000:ffff:ffff:ffff:ffff:ffff,US +2620:d::,2620:d::ffff:ffff:ffff:ffff:ffff,US +2620:d:4000::,2620:d:4000:ffff:ffff:ffff:ffff:ffff,US +2620:d:8000::,2620:d:8000:ffff:ffff:ffff:ffff:ffff,US +2620:d:c000::,2620:d:c000:ffff:ffff:ffff:ffff:ffff,US +2620:e::,2620:e::ffff:ffff:ffff:ffff:ffff,US +2620:e:4000::,2620:e:4000:ffff:ffff:ffff:ffff:ffff,US +2620:e:8000::,2620:e:8000:ffff:ffff:ffff:ffff:ffff,US +2620:e:c000::,2620:e:c000:ffff:ffff:ffff:ffff:ffff,US +2620:f::,2620:f:f:ffff:ffff:ffff:ffff:ffff,US +2620:f:4000::,2620:f:4000:ffff:ffff:ffff:ffff:ffff,US +2620:f:8000::,2620:f:8000:ffff:ffff:ffff:ffff:ffff,US +2620:f:c000::,2620:f:c000:ffff:ffff:ffff:ffff:ffff,US +2620:10::,2620:10::ffff:ffff:ffff:ffff:ffff,US +2620:10:4000::,2620:10:4000:ffff:ffff:ffff:ffff:ffff,US +2620:10:8000::,2620:10:8000:ffff:ffff:ffff:ffff:ffff,CA +2620:10:c000::,2620:10:c000:ffff:ffff:ffff:ffff:ffff,US +2620:11::,2620:11:ff:ffff:ffff:ffff:ffff:ffff,US +2620:11:4000::,2620:11:4000:ffff:ffff:ffff:ffff:ffff,US +2620:11:8000::,2620:11:8000:ffff:ffff:ffff:ffff:ffff,US +2620:11:c000::,2620:11:c000:ffff:ffff:ffff:ffff:ffff,US +2620:12::,2620:12::ffff:ffff:ffff:ffff:ffff,US +2620:12:4000::,2620:12:4000:ffff:ffff:ffff:ffff:ffff,US +2620:12:8000::,2620:12:8000:ffff:ffff:ffff:ffff:ffff,US +2620:12:c000::,2620:12:c000:ffff:ffff:ffff:ffff:ffff,US +2620:13::,2620:13::ffff:ffff:ffff:ffff:ffff,CA +2620:13:4000::,2620:13:4000:ffff:ffff:ffff:ffff:ffff,US +2620:13:8000::,2620:13:8000:ffff:ffff:ffff:ffff:ffff,US +2620:13:c000::,2620:13:c000:ffff:ffff:ffff:ffff:ffff,US +2620:14::,2620:14::ffff:ffff:ffff:ffff:ffff,US +2620:14:4000::,2620:14:4000:ffff:ffff:ffff:ffff:ffff,US +2620:14:8000::,2620:14:8000:ffff:ffff:ffff:ffff:ffff,US +2620:14:c000::,2620:14:c000:ffff:ffff:ffff:ffff:ffff,CA +2620:15::,2620:15::ffff:ffff:ffff:ffff:ffff,US +2620:15:4000::,2620:15:4000:ffff:ffff:ffff:ffff:ffff,US +2620:15:8000::,2620:15:8000:ffff:ffff:ffff:ffff:ffff,US +2620:15:c000::,2620:15:c000:ffff:ffff:ffff:ffff:ffff,US +2620:16::,2620:16::ffff:ffff:ffff:ffff:ffff,CA +2620:16:4000::,2620:16:4000:ffff:ffff:ffff:ffff:ffff,US +2620:16:8000::,2620:16:8000:ffff:ffff:ffff:ffff:ffff,US +2620:16:c000::,2620:16:c000:ffff:ffff:ffff:ffff:ffff,US +2620:17::,2620:17::ffff:ffff:ffff:ffff:ffff,US +2620:17:4000::,2620:17:4000:ffff:ffff:ffff:ffff:ffff,US +2620:17:8000::,2620:17:800f:ffff:ffff:ffff:ffff:ffff,US +2620:17:c000::,2620:17:c000:ffff:ffff:ffff:ffff:ffff,US +2620:18::,2620:18::ffff:ffff:ffff:ffff:ffff,US +2620:18:4000::,2620:18:4000:ffff:ffff:ffff:ffff:ffff,US +2620:18:8000::,2620:18:8000:ffff:ffff:ffff:ffff:ffff,US +2620:18:c000::,2620:18:c000:ffff:ffff:ffff:ffff:ffff,KN +2620:19::,2620:19::ffff:ffff:ffff:ffff:ffff,US +2620:19:4000::,2620:19:4000:ffff:ffff:ffff:ffff:ffff,CA +2620:19:8000::,2620:19:8000:ffff:ffff:ffff:ffff:ffff,US +2620:19:c000::,2620:19:c000:ffff:ffff:ffff:ffff:ffff,US +2620:1a::,2620:1a::ffff:ffff:ffff:ffff:ffff,US +2620:1a:4000::,2620:1a:4000:ffff:ffff:ffff:ffff:ffff,US +2620:1a:8000::,2620:1a:8000:ffff:ffff:ffff:ffff:ffff,US +2620:1a:c000::,2620:1a:c000:ffff:ffff:ffff:ffff:ffff,US +2620:1b::,2620:1b:f:ffff:ffff:ffff:ffff:ffff,US +2620:1b:4000::,2620:1b:4000:ffff:ffff:ffff:ffff:ffff,US +2620:1b:8000::,2620:1b:8000:ffff:ffff:ffff:ffff:ffff,US +2620:1b:c000::,2620:1b:c000:ffff:ffff:ffff:ffff:ffff,US +2620:1c::,2620:1c::ffff:ffff:ffff:ffff:ffff,US +2620:1c:4000::,2620:1c:4000:ffff:ffff:ffff:ffff:ffff,US +2620:1c:8000::,2620:1c:8000:ffff:ffff:ffff:ffff:ffff,US +2620:1c:c000::,2620:1c:c000:ffff:ffff:ffff:ffff:ffff,US +2620:1d::,2620:1d::ffff:ffff:ffff:ffff:ffff,US +2620:1d:4000::,2620:1d:4000:ffff:ffff:ffff:ffff:ffff,US +2620:1d:8000::,2620:1d:8000:ffff:ffff:ffff:ffff:ffff,US +2620:1d:c000::,2620:1d:c000:ffff:ffff:ffff:ffff:ffff,US +2620:1e::,2620:1e::ffff:ffff:ffff:ffff:ffff,US +2620:1e:4000::,2620:1e:4000:ffff:ffff:ffff:ffff:ffff,US +2620:1e:8000::,2620:1e:8000:ffff:ffff:ffff:ffff:ffff,US +2620:1e:c000::,2620:1e:c000:ffff:ffff:ffff:ffff:ffff,US +2620:1f::,2620:1f::ffff:ffff:ffff:ffff:ffff,US +2620:1f:4000::,2620:1f:4000:ffff:ffff:ffff:ffff:ffff,CA +2620:1f:8000::,2620:1f:8000:ffff:ffff:ffff:ffff:ffff,US +2620:1f:c000::,2620:1f:c000:ffff:ffff:ffff:ffff:ffff,US +2620:20::,2620:20::ffff:ffff:ffff:ffff:ffff,US +2620:20:4000::,2620:20:4000:ffff:ffff:ffff:ffff:ffff,US +2620:20:8000::,2620:20:8000:ffff:ffff:ffff:ffff:ffff,US +2620:20:c000::,2620:20:c000:ffff:ffff:ffff:ffff:ffff,US +2620:21::,2620:21::ffff:ffff:ffff:ffff:ffff,US +2620:21:4000::,2620:21:4000:ffff:ffff:ffff:ffff:ffff,US +2620:21:8000::,2620:21:8000:ffff:ffff:ffff:ffff:ffff,US +2620:21:c000::,2620:21:c000:ffff:ffff:ffff:ffff:ffff,CA +2620:22::,2620:22::ffff:ffff:ffff:ffff:ffff,US +2620:22:4000::,2620:22:4000:ffff:ffff:ffff:ffff:ffff,CA +2620:22:8000::,2620:22:8000:ffff:ffff:ffff:ffff:ffff,US +2620:22:c000::,2620:22:c000:ffff:ffff:ffff:ffff:ffff,US +2620:23::,2620:23::ffff:ffff:ffff:ffff:ffff,US +2620:23:4000::,2620:23:4000:ffff:ffff:ffff:ffff:ffff,US +2620:23:8000::,2620:23:8000:ffff:ffff:ffff:ffff:ffff,US +2620:23:c000::,2620:23:c000:ffff:ffff:ffff:ffff:ffff,US +2620:24::,2620:24:1f:ffff:ffff:ffff:ffff:ffff,US +2620:24:8080::,2620:24:8080:ffff:ffff:ffff:ffff:ffff,US +2620:25::,2620:25::ffff:ffff:ffff:ffff:ffff,US +2620:25:4000::,2620:25:4000:ffff:ffff:ffff:ffff:ffff,US +2620:25:8000::,2620:25:8000:ffff:ffff:ffff:ffff:ffff,US +2620:25:c000::,2620:25:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:26::,2620:26::ffff:ffff:ffff:ffff:ffff,US +2620:26:4000::,2620:26:400f:ffff:ffff:ffff:ffff:ffff,US +2620:26:8000::,2620:26:8000:ffff:ffff:ffff:ffff:ffff,US +2620:26:c000::,2620:26:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:27::,2620:27:f:ffff:ffff:ffff:ffff:ffff,US +2620:27:8080::,2620:27:8080:ffff:ffff:ffff:ffff:ffff,US +2620:28::,2620:28::ffff:ffff:ffff:ffff:ffff,US +2620:28:4000::,2620:28:400f:ffff:ffff:ffff:ffff:ffff,US +2620:28:8000::,2620:28:8000:ffff:ffff:ffff:ffff:ffff,US +2620:28:c000::,2620:28:c000:ffff:ffff:ffff:ffff:ffff,US +2620:29::,2620:29::ffff:ffff:ffff:ffff:ffff,US +2620:29:4000::,2620:29:4000:ffff:ffff:ffff:ffff:ffff,US +2620:29:8000::,2620:29:8000:ffff:ffff:ffff:ffff:ffff,US +2620:29:c000::,2620:29:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:2a::,2620:2a::ffff:ffff:ffff:ffff:ffff,US +2620:2a:4000::,2620:2a:400f:ffff:ffff:ffff:ffff:ffff,US +2620:2a:8000::,2620:2a:8000:ffff:ffff:ffff:ffff:ffff,US +2620:2a:c000::,2620:2a:c000:ffff:ffff:ffff:ffff:ffff,US +2620:2b::,2620:2b::ffff:ffff:ffff:ffff:ffff,US +2620:2b:4000::,2620:2b:400f:ffff:ffff:ffff:ffff:ffff,US +2620:2b:8000::,2620:2b:8000:ffff:ffff:ffff:ffff:ffff,US +2620:2b:c000::,2620:2b:c000:ffff:ffff:ffff:ffff:ffff,US +2620:2c::,2620:2c:f:ffff:ffff:ffff:ffff:ffff,US +2620:2c:8080::,2620:2c:8080:ffff:ffff:ffff:ffff:ffff,US +2620:2d::,2620:2d::ffff:ffff:ffff:ffff:ffff,US +2620:2d:4000::,2620:2d:400f:ffff:ffff:ffff:ffff:ffff,US +2620:2d:8000::,2620:2d:8000:ffff:ffff:ffff:ffff:ffff,US +2620:2d:c000::,2620:2d:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:2e::,2620:2e:3f:ffff:ffff:ffff:ffff:ffff,US +2620:2e:8080::,2620:2e:8080:ffff:ffff:ffff:ffff:ffff,US +2620:2f::,2620:2f::ffff:ffff:ffff:ffff:ffff,CA +2620:2f:4000::,2620:2f:4000:ffff:ffff:ffff:ffff:ffff,US +2620:2f:8000::,2620:2f:8000:ffff:ffff:ffff:ffff:ffff,US +2620:2f:c000::,2620:2f:c000:ffff:ffff:ffff:ffff:ffff,US +2620:30::,2620:30::ffff:ffff:ffff:ffff:ffff,US +2620:30:4000::,2620:30:4000:ffff:ffff:ffff:ffff:ffff,US +2620:30:8000::,2620:30:8000:ffff:ffff:ffff:ffff:ffff,US +2620:30:c000::,2620:30:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:31::,2620:31::ffff:ffff:ffff:ffff:ffff,US +2620:31:4000::,2620:31:40ff:ffff:ffff:ffff:ffff:ffff,US +2620:31:8000::,2620:31:8000:ffff:ffff:ffff:ffff:ffff,US +2620:31:c000::,2620:31:c000:ffff:ffff:ffff:ffff:ffff,US +2620:32::,2620:32::ffff:ffff:ffff:ffff:ffff,US +2620:32:4000::,2620:32:4000:ffff:ffff:ffff:ffff:ffff,CA +2620:32:8000::,2620:32:8000:ffff:ffff:ffff:ffff:ffff,US +2620:32:c000::,2620:32:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:33::,2620:33::ffff:ffff:ffff:ffff:ffff,US +2620:33:4000::,2620:33:400f:ffff:ffff:ffff:ffff:ffff,US +2620:33:8000::,2620:33:8000:ffff:ffff:ffff:ffff:ffff,US +2620:33:c000::,2620:33:c000:ffff:ffff:ffff:ffff:ffff,US +2620:34::,2620:34::ffff:ffff:ffff:ffff:ffff,US +2620:34:4000::,2620:34:4000:ffff:ffff:ffff:ffff:ffff,US +2620:34:8000::,2620:34:8000:ffff:ffff:ffff:ffff:ffff,US +2620:34:c000::,2620:34:c000:ffff:ffff:ffff:ffff:ffff,US +2620:35::,2620:35::ffff:ffff:ffff:ffff:ffff,US +2620:35:4000::,2620:35:400f:ffff:ffff:ffff:ffff:ffff,CA +2620:35:8000::,2620:35:8000:ffff:ffff:ffff:ffff:ffff,CA +2620:35:c000::,2620:35:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:36::,2620:36::ffff:ffff:ffff:ffff:ffff,US +2620:36:4000::,2620:36:400f:ffff:ffff:ffff:ffff:ffff,CA +2620:36:8000::,2620:36:8000:ffff:ffff:ffff:ffff:ffff,US +2620:36:c000::,2620:36:c000:ffff:ffff:ffff:ffff:ffff,CA +2620:37::,2620:37::ffff:ffff:ffff:ffff:ffff,US +2620:37:4000::,2620:37:400f:ffff:ffff:ffff:ffff:ffff,US +2620:37:8000::,2620:37:8000:ffff:ffff:ffff:ffff:ffff,US +2620:37:c000::,2620:37:c000:ffff:ffff:ffff:ffff:ffff,US +2620:38::,2620:38::ffff:ffff:ffff:ffff:ffff,US +2620:38:4000::,2620:38:400f:ffff:ffff:ffff:ffff:ffff,US +2620:38:8000::,2620:38:8000:ffff:ffff:ffff:ffff:ffff,US +2620:38:c000::,2620:38:c000:ffff:ffff:ffff:ffff:ffff,US +2620:39::,2620:39::ffff:ffff:ffff:ffff:ffff,US +2620:39:4000::,2620:39:4000:ffff:ffff:ffff:ffff:ffff,US +2620:39:8000::,2620:39:8000:ffff:ffff:ffff:ffff:ffff,US +2620:39:c000::,2620:39:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:3a::,2620:3a::ffff:ffff:ffff:ffff:ffff,US +2620:3a:4000::,2620:3a:400f:ffff:ffff:ffff:ffff:ffff,US +2620:3a:8000::,2620:3a:8000:ffff:ffff:ffff:ffff:ffff,US +2620:3a:c000::,2620:3a:c000:ffff:ffff:ffff:ffff:ffff,US +2620:3b::,2620:3b::ffff:ffff:ffff:ffff:ffff,US +2620:3b:4000::,2620:3b:4000:ffff:ffff:ffff:ffff:ffff,US +2620:3b:8000::,2620:3b:8000:ffff:ffff:ffff:ffff:ffff,US +2620:3b:c000::,2620:3b:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:3c::,2620:3c:3f:ffff:ffff:ffff:ffff:ffff,US +2620:3c:8080::,2620:3c:8080:ffff:ffff:ffff:ffff:ffff,US +2620:3d::,2620:3d::ffff:ffff:ffff:ffff:ffff,US +2620:3d:4000::,2620:3d:4000:ffff:ffff:ffff:ffff:ffff,US +2620:3d:8000::,2620:3d:8000:ffff:ffff:ffff:ffff:ffff,US +2620:3d:c000::,2620:3d:c000:ffff:ffff:ffff:ffff:ffff,CA +2620:3e::,2620:3e::ffff:ffff:ffff:ffff:ffff,US +2620:3e:4000::,2620:3e:4000:ffff:ffff:ffff:ffff:ffff,US +2620:3e:8000::,2620:3e:8000:ffff:ffff:ffff:ffff:ffff,US +2620:3e:c000::,2620:3e:c000:ffff:ffff:ffff:ffff:ffff,US +2620:3f::,2620:3f::ffff:ffff:ffff:ffff:ffff,US +2620:3f:4000::,2620:3f:4000:ffff:ffff:ffff:ffff:ffff,US +2620:3f:8000::,2620:3f:8000:ffff:ffff:ffff:ffff:ffff,US +2620:3f:c000::,2620:3f:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:40::,2620:40::ffff:ffff:ffff:ffff:ffff,US +2620:40:4000::,2620:40:4000:ffff:ffff:ffff:ffff:ffff,US +2620:40:8000::,2620:40:8000:ffff:ffff:ffff:ffff:ffff,US +2620:40:c000::,2620:40:c000:ffff:ffff:ffff:ffff:ffff,US +2620:41::,2620:41:1:ffff:ffff:ffff:ffff:ffff,US +2620:41:4000::,2620:41:4000:ffff:ffff:ffff:ffff:ffff,US +2620:41:8000::,2620:41:8000:ffff:ffff:ffff:ffff:ffff,US +2620:41:c000::,2620:41:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:42::,2620:42::ffff:ffff:ffff:ffff:ffff,US +2620:42:4000::,2620:42:4000:ffff:ffff:ffff:ffff:ffff,US +2620:42:c000::,2620:42:c000:ffff:ffff:ffff:ffff:ffff,CA +2620:43::,2620:43::ffff:ffff:ffff:ffff:ffff,US +2620:43:4000::,2620:43:4000:ffff:ffff:ffff:ffff:ffff,US +2620:43:8000::,2620:43:8000:ffff:ffff:ffff:ffff:ffff,US +2620:43:c000::,2620:43:c000:ffff:ffff:ffff:ffff:ffff,US +2620:44::,2620:44:1:ffff:ffff:ffff:ffff:ffff,US +2620:44:4000::,2620:44:4000:ffff:ffff:ffff:ffff:ffff,US +2620:44:8000::,2620:44:8000:ffff:ffff:ffff:ffff:ffff,US +2620:45::,2620:45::ffff:ffff:ffff:ffff:ffff,CA +2620:45:4000::,2620:45:4000:ffff:ffff:ffff:ffff:ffff,US +2620:45:8000::,2620:45:8000:ffff:ffff:ffff:ffff:ffff,US +2620:45:c000::,2620:45:c000:ffff:ffff:ffff:ffff:ffff,US +2620:46::,2620:46::ffff:ffff:ffff:ffff:ffff,US +2620:46:4000::,2620:46:4000:ffff:ffff:ffff:ffff:ffff,CA +2620:46:8000::,2620:46:8000:ffff:ffff:ffff:ffff:ffff,US +2620:46:c000::,2620:46:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:47::,2620:47::ffff:ffff:ffff:ffff:ffff,US +2620:47:4000::,2620:47:4000:ffff:ffff:ffff:ffff:ffff,US +2620:47:8000::,2620:47:8000:ffff:ffff:ffff:ffff:ffff,US +2620:47:c000::,2620:47:c000:ffff:ffff:ffff:ffff:ffff,US +2620:48::,2620:48::ffff:ffff:ffff:ffff:ffff,US +2620:48:4000::,2620:48:4000:ffff:ffff:ffff:ffff:ffff,US +2620:48:8000::,2620:48:8000:ffff:ffff:ffff:ffff:ffff,US +2620:48:c000::,2620:48:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:49::,2620:49:f:ffff:ffff:ffff:ffff:ffff,CA +2620:49:8080::,2620:49:8080:ffff:ffff:ffff:ffff:ffff,US +2620:4a::,2620:4a::ffff:ffff:ffff:ffff:ffff,US +2620:4a:4000::,2620:4a:4000:ffff:ffff:ffff:ffff:ffff,US +2620:4a:8000::,2620:4a:8000:ffff:ffff:ffff:ffff:ffff,US +2620:4a:c000::,2620:4a:c000:ffff:ffff:ffff:ffff:ffff,US +2620:4b::,2620:4b::ffff:ffff:ffff:ffff:ffff,CA +2620:4b:4000::,2620:4b:400f:ffff:ffff:ffff:ffff:ffff,US +2620:4b:8000::,2620:4b:800f:ffff:ffff:ffff:ffff:ffff,US +2620:4b:c000::,2620:4b:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:4c::,2620:4c:1:ffff:ffff:ffff:ffff:ffff,US +2620:4c:4000::,2620:4c:400f:ffff:ffff:ffff:ffff:ffff,US +2620:4c:c000::,2620:4c:c000:ffff:ffff:ffff:ffff:ffff,US +2620:4d::,2620:4d::ffff:ffff:ffff:ffff:ffff,US +2620:4d:4000::,2620:4d:400f:ffff:ffff:ffff:ffff:ffff,US +2620:4d:8000::,2620:4d:8000:ffff:ffff:ffff:ffff:ffff,US +2620:4d:c000::,2620:4d:c000:ffff:ffff:ffff:ffff:ffff,US +2620:4e::,2620:4e::ffff:ffff:ffff:ffff:ffff,US +2620:4e:4000::,2620:4e:4000:ffff:ffff:ffff:ffff:ffff,CA +2620:4e:8000::,2620:4e:8000:ffff:ffff:ffff:ffff:ffff,US +2620:4e:c000::,2620:4e:c000:ffff:ffff:ffff:ffff:ffff,US +2620:4f::,2620:4f::ffff:ffff:ffff:ffff:ffff,US +2620:4f:4000::,2620:4f:4000:ffff:ffff:ffff:ffff:ffff,US +2620:4f:8000::,2620:4f:8000:ffff:ffff:ffff:ffff:ffff,US +2620:4f:c000::,2620:4f:c000:ffff:ffff:ffff:ffff:ffff,US +2620:50::,2620:50:f:ffff:ffff:ffff:ffff:ffff,US +2620:50:8080::,2620:50:8080:ffff:ffff:ffff:ffff:ffff,US +2620:51::,2620:51::ffff:ffff:ffff:ffff:ffff,US +2620:51:4000::,2620:51:4000:ffff:ffff:ffff:ffff:ffff,CA +2620:51:8000::,2620:51:8000:ffff:ffff:ffff:ffff:ffff,CA +2620:51:c000::,2620:51:c000:ffff:ffff:ffff:ffff:ffff,US +2620:52::,2620:52:3:ffff:ffff:ffff:ffff:ffff,US +2620:52:4000::,2620:52:4000:ffff:ffff:ffff:ffff:ffff,US +2620:52:8000::,2620:52:8000:ffff:ffff:ffff:ffff:ffff,US +2620:52:c000::,2620:52:c000:ffff:ffff:ffff:ffff:ffff,US +2620:53::,2620:53::ffff:ffff:ffff:ffff:ffff,US +2620:53:4000::,2620:53:400f:ffff:ffff:ffff:ffff:ffff,US +2620:53:8000::,2620:53:8000:ffff:ffff:ffff:ffff:ffff,US +2620:53:c000::,2620:53:c000:ffff:ffff:ffff:ffff:ffff,US +2620:54::,2620:54::ffff:ffff:ffff:ffff:ffff,US +2620:54:4000::,2620:54:4000:ffff:ffff:ffff:ffff:ffff,US +2620:54:8000::,2620:54:8000:ffff:ffff:ffff:ffff:ffff,US +2620:54:c000::,2620:54:c000:ffff:ffff:ffff:ffff:ffff,CA +2620:55::,2620:55::ffff:ffff:ffff:ffff:ffff,US +2620:55:4000::,2620:55:400f:ffff:ffff:ffff:ffff:ffff,US +2620:55:8000::,2620:55:8000:ffff:ffff:ffff:ffff:ffff,US +2620:55:c000::,2620:55:c000:ffff:ffff:ffff:ffff:ffff,US +2620:56::,2620:56::ffff:ffff:ffff:ffff:ffff,US +2620:56:4000::,2620:56:4000:ffff:ffff:ffff:ffff:ffff,US +2620:56:8000::,2620:56:8000:ffff:ffff:ffff:ffff:ffff,US +2620:56:c000::,2620:56:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:57::,2620:57::ffff:ffff:ffff:ffff:ffff,US +2620:57:4000::,2620:57:400f:ffff:ffff:ffff:ffff:ffff,KY +2620:57:8000::,2620:57:8000:ffff:ffff:ffff:ffff:ffff,US +2620:57:c000::,2620:57:c000:ffff:ffff:ffff:ffff:ffff,US +2620:58::,2620:58:ff:ffff:ffff:ffff:ffff:ffff,US +2620:58:8800::,2620:58:8800:ffff:ffff:ffff:ffff:ffff,US +2620:59::,2620:59::ffff:ffff:ffff:ffff:ffff,US +2620:59:4000::,2620:59:4000:ffff:ffff:ffff:ffff:ffff,US +2620:59:8000::,2620:59:8000:ffff:ffff:ffff:ffff:ffff,US +2620:59:c000::,2620:59:c000:ffff:ffff:ffff:ffff:ffff,US +2620:5a::,2620:5a::ffff:ffff:ffff:ffff:ffff,US +2620:5a:4000::,2620:5a:4000:ffff:ffff:ffff:ffff:ffff,CA +2620:5a:8000::,2620:5a:8000:ffff:ffff:ffff:ffff:ffff,US +2620:5a:c000::,2620:5a:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:5b::,2620:5b::ffff:ffff:ffff:ffff:ffff,US +2620:5b:4000::,2620:5b:4000:ffff:ffff:ffff:ffff:ffff,US +2620:5b:8000::,2620:5b:8000:ffff:ffff:ffff:ffff:ffff,CA +2620:5b:c000::,2620:5b:c00f:ffff:ffff:ffff:ffff:ffff,CA +2620:5c::,2620:5c::ffff:ffff:ffff:ffff:ffff,US +2620:5c:4000::,2620:5c:4000:ffff:ffff:ffff:ffff:ffff,US +2620:5c:8000::,2620:5c:8000:ffff:ffff:ffff:ffff:ffff,US +2620:5c:c000::,2620:5c:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:5d::,2620:5d::ffff:ffff:ffff:ffff:ffff,US +2620:5d:4000::,2620:5d:4000:ffff:ffff:ffff:ffff:ffff,US +2620:5d:8000::,2620:5d:8000:ffff:ffff:ffff:ffff:ffff,US +2620:5d:c000::,2620:5d:c000:ffff:ffff:ffff:ffff:ffff,US +2620:5e::,2620:5e::ffff:ffff:ffff:ffff:ffff,US +2620:5e:4000::,2620:5e:4000:ffff:ffff:ffff:ffff:ffff,CA +2620:5e:8000::,2620:5e:8000:ffff:ffff:ffff:ffff:ffff,US +2620:5e:c000::,2620:5e:c000:ffff:ffff:ffff:ffff:ffff,CA +2620:5f::,2620:5f::ffff:ffff:ffff:ffff:ffff,US +2620:5f:4000::,2620:5f:4000:ffff:ffff:ffff:ffff:ffff,US +2620:5f:8000::,2620:5f:8000:ffff:ffff:ffff:ffff:ffff,US +2620:5f:c000::,2620:5f:c000:ffff:ffff:ffff:ffff:ffff,US +2620:60::,2620:60::ffff:ffff:ffff:ffff:ffff,US +2620:60:4000::,2620:60:400f:ffff:ffff:ffff:ffff:ffff,US +2620:60:8000::,2620:60:8000:ffff:ffff:ffff:ffff:ffff,CA +2620:60:c000::,2620:60:c000:ffff:ffff:ffff:ffff:ffff,CA +2620:61::,2620:61::ffff:ffff:ffff:ffff:ffff,CA +2620:61:4000::,2620:61:400f:ffff:ffff:ffff:ffff:ffff,US +2620:61:8000::,2620:61:8000:ffff:ffff:ffff:ffff:ffff,US +2620:61:c000::,2620:61:c000:ffff:ffff:ffff:ffff:ffff,US +2620:62::,2620:62::ffff:ffff:ffff:ffff:ffff,US +2620:62:4000::,2620:62:400f:ffff:ffff:ffff:ffff:ffff,CA +2620:62:8000::,2620:62:8000:ffff:ffff:ffff:ffff:ffff,US +2620:62:c000::,2620:62:c000:ffff:ffff:ffff:ffff:ffff,US +2620:63::,2620:63::ffff:ffff:ffff:ffff:ffff,US +2620:63:4000::,2620:63:4000:ffff:ffff:ffff:ffff:ffff,US +2620:63:8000::,2620:63:8000:ffff:ffff:ffff:ffff:ffff,US +2620:63:c000::,2620:63:c000:ffff:ffff:ffff:ffff:ffff,US +2620:64::,2620:64::ffff:ffff:ffff:ffff:ffff,US +2620:64:4000::,2620:64:4000:ffff:ffff:ffff:ffff:ffff,US +2620:64:8000::,2620:64:8000:ffff:ffff:ffff:ffff:ffff,TW +2620:64:c000::,2620:64:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:65::,2620:65:ff:ffff:ffff:ffff:ffff:ffff,US +2620:65:8000::,2620:65:800f:ffff:ffff:ffff:ffff:ffff,US +2620:65:c000::,2620:65:c000:ffff:ffff:ffff:ffff:ffff,US +2620:66::,2620:66::ffff:ffff:ffff:ffff:ffff,CA +2620:66:4000::,2620:66:400f:ffff:ffff:ffff:ffff:ffff,US +2620:66:8000::,2620:66:8000:ffff:ffff:ffff:ffff:ffff,US +2620:66:c000::,2620:66:c000:ffff:ffff:ffff:ffff:ffff,US +2620:67::,2620:67::ffff:ffff:ffff:ffff:ffff,US +2620:67:4000::,2620:67:4000:ffff:ffff:ffff:ffff:ffff,US +2620:67:8000::,2620:67:8000:ffff:ffff:ffff:ffff:ffff,US +2620:67:c000::,2620:67:c000:ffff:ffff:ffff:ffff:ffff,US +2620:68::,2620:68::ffff:ffff:ffff:ffff:ffff,US +2620:68:4000::,2620:68:4000:ffff:ffff:ffff:ffff:ffff,US +2620:68:8000::,2620:68:8000:ffff:ffff:ffff:ffff:ffff,CA +2620:68:c000::,2620:68:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:69:4000::,2620:69:4000:ffff:ffff:ffff:ffff:ffff,US +2620:69:8000::,2620:69:8000:ffff:ffff:ffff:ffff:ffff,US +2620:69:c000::,2620:69:c000:ffff:ffff:ffff:ffff:ffff,CA +2620:6a::,2620:6a::ffff:ffff:ffff:ffff:ffff,US +2620:6a:4000::,2620:6a:4000:ffff:ffff:ffff:ffff:ffff,CA +2620:6a:8000::,2620:6a:8000:ffff:ffff:ffff:ffff:ffff,US +2620:6a:c000::,2620:6a:c000:ffff:ffff:ffff:ffff:ffff,CA +2620:6b::,2620:6b::ffff:ffff:ffff:ffff:ffff,US +2620:6b:4000::,2620:6b:4000:ffff:ffff:ffff:ffff:ffff,US +2620:6b:8000::,2620:6b:8000:ffff:ffff:ffff:ffff:ffff,US +2620:6b:c000::,2620:6b:c000:ffff:ffff:ffff:ffff:ffff,US +2620:6c::,2620:6c:3f:ffff:ffff:ffff:ffff:ffff,US +2620:6c:8080::,2620:6c:8080:ffff:ffff:ffff:ffff:ffff,US +2620:6d:40::,2620:6d:40:ffff:ffff:ffff:ffff:ffff,US +2620:6d:8000::,2620:6d:8000:ffff:ffff:ffff:ffff:ffff,US +2620:6d:c000::,2620:6d:c000:ffff:ffff:ffff:ffff:ffff,US +2620:6e::,2620:6e::ffff:ffff:ffff:ffff:ffff,US +2620:6e:4000::,2620:6e:4000:ffff:ffff:ffff:ffff:ffff,US +2620:6e:8000::,2620:6e:800f:ffff:ffff:ffff:ffff:ffff,US +2620:6e:c000::,2620:6e:c000:ffff:ffff:ffff:ffff:ffff,US +2620:6f::,2620:6f::ffff:ffff:ffff:ffff:ffff,US +2620:6f:4000::,2620:6f:4000:ffff:ffff:ffff:ffff:ffff,US +2620:6f:8000::,2620:6f:8000:ffff:ffff:ffff:ffff:ffff,US +2620:6f:c000::,2620:6f:c000:ffff:ffff:ffff:ffff:ffff,US +2620:70::,2620:70::ffff:ffff:ffff:ffff:ffff,US +2620:70:4000::,2620:70:4000:ffff:ffff:ffff:ffff:ffff,US +2620:70:8000::,2620:70:8000:ffff:ffff:ffff:ffff:ffff,US +2620:70:c000::,2620:70:c000:ffff:ffff:ffff:ffff:ffff,US +2620:71::,2620:71::ffff:ffff:ffff:ffff:ffff,US +2620:71:4000::,2620:71:4000:ffff:ffff:ffff:ffff:ffff,US +2620:71:8000::,2620:71:8000:ffff:ffff:ffff:ffff:ffff,US +2620:71:c000::,2620:71:c000:ffff:ffff:ffff:ffff:ffff,US +2620:72::,2620:72::ffff:ffff:ffff:ffff:ffff,US +2620:72:4000::,2620:72:4000:ffff:ffff:ffff:ffff:ffff,US +2620:72:8000::,2620:72:8000:ffff:ffff:ffff:ffff:ffff,US +2620:72:c000::,2620:72:c000:ffff:ffff:ffff:ffff:ffff,US +2620:73::,2620:73::ffff:ffff:ffff:ffff:ffff,US +2620:73:4000::,2620:73:4000:ffff:ffff:ffff:ffff:ffff,US +2620:73:8000::,2620:73:8000:ffff:ffff:ffff:ffff:ffff,US +2620:73:c000::,2620:73:c000:ffff:ffff:ffff:ffff:ffff,US +2620:74::,2620:74:1f:ffff:ffff:ffff:ffff:ffff,US +2620:74:8080::,2620:74:8080:ffff:ffff:ffff:ffff:ffff,US +2620:75::,2620:75::ffff:ffff:ffff:ffff:ffff,US +2620:75:4000::,2620:75:4000:ffff:ffff:ffff:ffff:ffff,US +2620:75:8000::,2620:75:8000:ffff:ffff:ffff:ffff:ffff,US +2620:75:c000::,2620:75:c000:ffff:ffff:ffff:ffff:ffff,US +2620:76::,2620:76::ffff:ffff:ffff:ffff:ffff,US +2620:76:4000::,2620:76:4000:ffff:ffff:ffff:ffff:ffff,US +2620:76:8000::,2620:76:8000:ffff:ffff:ffff:ffff:ffff,US +2620:76:c000::,2620:76:c000:ffff:ffff:ffff:ffff:ffff,US +2620:77::,2620:77::ffff:ffff:ffff:ffff:ffff,US +2620:77:4000::,2620:77:4000:ffff:ffff:ffff:ffff:ffff,US +2620:77:8000::,2620:77:8000:ffff:ffff:ffff:ffff:ffff,US +2620:77:c000::,2620:77:c000:ffff:ffff:ffff:ffff:ffff,US +2620:78::,2620:78::ffff:ffff:ffff:ffff:ffff,US +2620:78:4000::,2620:78:4000:ffff:ffff:ffff:ffff:ffff,US +2620:78:8000::,2620:78:8000:ffff:ffff:ffff:ffff:ffff,US +2620:78:c000::,2620:78:c000:ffff:ffff:ffff:ffff:ffff,CA +2620:79::,2620:79::ffff:ffff:ffff:ffff:ffff,US +2620:79:4000::,2620:79:4000:ffff:ffff:ffff:ffff:ffff,US +2620:79:8000::,2620:79:8000:ffff:ffff:ffff:ffff:ffff,US +2620:79:c000::,2620:79:c000:ffff:ffff:ffff:ffff:ffff,US +2620:7a::,2620:7a::ffff:ffff:ffff:ffff:ffff,US +2620:7a:4000::,2620:7a:4000:ffff:ffff:ffff:ffff:ffff,US +2620:7a:8000::,2620:7a:8000:ffff:ffff:ffff:ffff:ffff,US +2620:7a:c000::,2620:7a:c000:ffff:ffff:ffff:ffff:ffff,US +2620:7b::,2620:7b::ffff:ffff:ffff:ffff:ffff,US +2620:7b:4000::,2620:7b:4000:ffff:ffff:ffff:ffff:ffff,US +2620:7b:8000::,2620:7b:8000:ffff:ffff:ffff:ffff:ffff,US +2620:7b:e000::,2620:7b:e000:ffff:ffff:ffff:ffff:ffff,US +2620:7c:4000::,2620:7c:4000:ffff:ffff:ffff:ffff:ffff,US +2620:7c:a000::,2620:7c:a000:ffff:ffff:ffff:ffff:ffff,US +2620:7d::,2620:7d::ffff:ffff:ffff:ffff:ffff,US +2620:7d:4000::,2620:7d:4000:ffff:ffff:ffff:ffff:ffff,US +2620:7d:8000::,2620:7d:8000:ffff:ffff:ffff:ffff:ffff,US +2620:7d:c000::,2620:7d:c000:ffff:ffff:ffff:ffff:ffff,US +2620:7e::,2620:7e:f:ffff:ffff:ffff:ffff:ffff,US +2620:7e:60c0::,2620:7e:60c0:ffff:ffff:ffff:ffff:ffff,US +2620:7e:c080::,2620:7e:c080:ffff:ffff:ffff:ffff:ffff,US +2620:7f:2040::,2620:7f:2040:ffff:ffff:ffff:ffff:ffff,US +2620:7f:8000::,2620:7f:8000:ffff:ffff:ffff:ffff:ffff,CA +2620:7f:c000::,2620:7f:c000:ffff:ffff:ffff:ffff:ffff,US +2620:80:4000::,2620:80:4000:ffff:ffff:ffff:ffff:ffff,US +2620:80:8000::,2620:80:8000:ffff:ffff:ffff:ffff:ffff,CA +2620:80:c000::,2620:80:c000:ffff:ffff:ffff:ffff:ffff,CA +2620:81::,2620:81::ffff:ffff:ffff:ffff:ffff,US +2620:81:4000::,2620:81:4000:ffff:ffff:ffff:ffff:ffff,US +2620:81:8000::,2620:81:8000:ffff:ffff:ffff:ffff:ffff,US +2620:81:c000::,2620:81:c000:ffff:ffff:ffff:ffff:ffff,US +2620:82:4000::,2620:82:4000:ffff:ffff:ffff:ffff:ffff,US +2620:82:8000::,2620:82:8000:ffff:ffff:ffff:ffff:ffff,US +2620:82:c000::,2620:82:c000:ffff:ffff:ffff:ffff:ffff,US +2620:83::,2620:83::ffff:ffff:ffff:ffff:ffff,US +2620:83:4000::,2620:83:4000:ffff:ffff:ffff:ffff:ffff,US +2620:83:8000::,2620:83:800f:ffff:ffff:ffff:ffff:ffff,US +2620:83:c000::,2620:83:c000:ffff:ffff:ffff:ffff:ffff,US +2620:84::,2620:84:1:ffff:ffff:ffff:ffff:ffff,US +2620:84:4000::,2620:84:4000:ffff:ffff:ffff:ffff:ffff,US +2620:84:8000::,2620:84:8000:ffff:ffff:ffff:ffff:ffff,US +2620:84:c000::,2620:84:c000:ffff:ffff:ffff:ffff:ffff,US +2620:85::,2620:85::ffff:ffff:ffff:ffff:ffff,US +2620:85:4000::,2620:85:4000:ffff:ffff:ffff:ffff:ffff,US +2620:85:8000::,2620:85:8000:ffff:ffff:ffff:ffff:ffff,US +2620:85:c000::,2620:85:c000:ffff:ffff:ffff:ffff:ffff,US +2620:86::,2620:86::ffff:ffff:ffff:ffff:ffff,US +2620:86:4000::,2620:86:4000:ffff:ffff:ffff:ffff:ffff,US +2620:86:8000::,2620:86:8000:ffff:ffff:ffff:ffff:ffff,US +2620:86:c000::,2620:86:c000:ffff:ffff:ffff:ffff:ffff,US +2620:87::,2620:87::ffff:ffff:ffff:ffff:ffff,US +2620:87:4000::,2620:87:4000:ffff:ffff:ffff:ffff:ffff,US +2620:87:8000::,2620:87:8000:ffff:ffff:ffff:ffff:ffff,US +2620:87:c000::,2620:87:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:88::,2620:88::ffff:ffff:ffff:ffff:ffff,US +2620:88:4000::,2620:88:4000:ffff:ffff:ffff:ffff:ffff,US +2620:88:8000::,2620:88:800f:ffff:ffff:ffff:ffff:ffff,US +2620:88:c000::,2620:88:c000:ffff:ffff:ffff:ffff:ffff,US +2620:89::,2620:89::ffff:ffff:ffff:ffff:ffff,US +2620:89:4000::,2620:89:4000:ffff:ffff:ffff:ffff:ffff,US +2620:89:8000::,2620:89:8000:ffff:ffff:ffff:ffff:ffff,US +2620:89:c000::,2620:89:c000:ffff:ffff:ffff:ffff:ffff,US +2620:8a::,2620:8a::ffff:ffff:ffff:ffff:ffff,US +2620:8a:4000::,2620:8a:4000:ffff:ffff:ffff:ffff:ffff,CA +2620:8a:8000::,2620:8a:8000:ffff:ffff:ffff:ffff:ffff,US +2620:8a:c000::,2620:8a:c000:ffff:ffff:ffff:ffff:ffff,US +2620:8b::,2620:8b::ffff:ffff:ffff:ffff:ffff,US +2620:8b:4000::,2620:8b:4000:ffff:ffff:ffff:ffff:ffff,US +2620:8b:8000::,2620:8b:8000:ffff:ffff:ffff:ffff:ffff,CA +2620:8b:c000::,2620:8b:c000:ffff:ffff:ffff:ffff:ffff,US +2620:8c:4000::,2620:8c:4000:ffff:ffff:ffff:ffff:ffff,US +2620:8c:8000::,2620:8c:8000:ffff:ffff:ffff:ffff:ffff,US +2620:8c:c000::,2620:8c:c000:ffff:ffff:ffff:ffff:ffff,US +2620:8d::,2620:8d::ffff:ffff:ffff:ffff:ffff,US +2620:8d:4000::,2620:8d:4000:ffff:ffff:ffff:ffff:ffff,US +2620:8d:8000::,2620:8d:8000:ffff:ffff:ffff:ffff:ffff,US +2620:8d:c000::,2620:8d:c000:ffff:ffff:ffff:ffff:ffff,US +2620:8e::,2620:8e::ffff:ffff:ffff:ffff:ffff,US +2620:8e:4000::,2620:8e:4000:ffff:ffff:ffff:ffff:ffff,US +2620:8e:8000::,2620:8e:8000:ffff:ffff:ffff:ffff:ffff,US +2620:8e:c000::,2620:8e:c000:ffff:ffff:ffff:ffff:ffff,US +2620:8f::,2620:8f::ffff:ffff:ffff:ffff:ffff,US +2620:8f:4000::,2620:8f:400f:ffff:ffff:ffff:ffff:ffff,US +2620:8f:8000::,2620:8f:8000:ffff:ffff:ffff:ffff:ffff,US +2620:8f:c000::,2620:8f:c000:ffff:ffff:ffff:ffff:ffff,CA +2620:90::,2620:90::ffff:ffff:ffff:ffff:ffff,CA +2620:90:4000::,2620:90:4000:ffff:ffff:ffff:ffff:ffff,US +2620:90:8000::,2620:90:8000:ffff:ffff:ffff:ffff:ffff,US +2620:90:c000::,2620:90:c000:ffff:ffff:ffff:ffff:ffff,US +2620:91::,2620:91::ffff:ffff:ffff:ffff:ffff,US +2620:91:4000::,2620:91:4000:ffff:ffff:ffff:ffff:ffff,US +2620:91:8000::,2620:91:8000:ffff:ffff:ffff:ffff:ffff,US +2620:91:c000::,2620:91:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:92::,2620:92:f:ffff:ffff:ffff:ffff:ffff,US +2620:92:4000::,2620:92:4000:ffff:ffff:ffff:ffff:ffff,US +2620:92:8000::,2620:92:8000:ffff:ffff:ffff:ffff:ffff,US +2620:92:c000::,2620:92:c000:ffff:ffff:ffff:ffff:ffff,CA +2620:93::,2620:93::ffff:ffff:ffff:ffff:ffff,US +2620:93:4000::,2620:93:4000:ffff:ffff:ffff:ffff:ffff,US +2620:93:8000::,2620:93:8000:ffff:ffff:ffff:ffff:ffff,US +2620:93:c000::,2620:93:c000:ffff:ffff:ffff:ffff:ffff,US +2620:94::,2620:94::ffff:ffff:ffff:ffff:ffff,US +2620:94:4000::,2620:94:4000:ffff:ffff:ffff:ffff:ffff,US +2620:94:8000::,2620:94:8000:ffff:ffff:ffff:ffff:ffff,US +2620:94:c000::,2620:94:c000:ffff:ffff:ffff:ffff:ffff,US +2620:95::,2620:95::ffff:ffff:ffff:ffff:ffff,US +2620:95:4000::,2620:95:400f:ffff:ffff:ffff:ffff:ffff,US +2620:95:8000::,2620:95:8000:ffff:ffff:ffff:ffff:ffff,US +2620:95:c000::,2620:95:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:96::,2620:96::ffff:ffff:ffff:ffff:ffff,US +2620:96:4000::,2620:96:400f:ffff:ffff:ffff:ffff:ffff,CA +2620:96:8000::,2620:96:8000:ffff:ffff:ffff:ffff:ffff,US +2620:96:c000::,2620:96:c000:ffff:ffff:ffff:ffff:ffff,US +2620:97::,2620:97::ffff:ffff:ffff:ffff:ffff,US +2620:97:4000::,2620:97:4000:ffff:ffff:ffff:ffff:ffff,US +2620:97:8000::,2620:97:8000:ffff:ffff:ffff:ffff:ffff,US +2620:97:c000::,2620:97:c000:ffff:ffff:ffff:ffff:ffff,US +2620:98::,2620:98::ffff:ffff:ffff:ffff:ffff,US +2620:98:4000::,2620:98:4000:ffff:ffff:ffff:ffff:ffff,CA +2620:98:8000::,2620:98:8000:ffff:ffff:ffff:ffff:ffff,US +2620:98:c000::,2620:98:c000:ffff:ffff:ffff:ffff:ffff,US +2620:99::,2620:99::ffff:ffff:ffff:ffff:ffff,US +2620:99:4000::,2620:99:4000:ffff:ffff:ffff:ffff:ffff,CA +2620:99:8000::,2620:99:8000:ffff:ffff:ffff:ffff:ffff,US +2620:99:c000::,2620:99:c000:ffff:ffff:ffff:ffff:ffff,US +2620:9a::,2620:9a::ffff:ffff:ffff:ffff:ffff,CA +2620:9a:4000::,2620:9a:4000:ffff:ffff:ffff:ffff:ffff,US +2620:9a:8000::,2620:9a:8000:ffff:ffff:ffff:ffff:ffff,US +2620:9a:c000::,2620:9a:c000:ffff:ffff:ffff:ffff:ffff,US +2620:9b:4000::,2620:9b:4000:ffff:ffff:ffff:ffff:ffff,US +2620:9b:8000::,2620:9b:8000:ffff:ffff:ffff:ffff:ffff,US +2620:9b:c000::,2620:9b:c000:ffff:ffff:ffff:ffff:ffff,US +2620:9c::,2620:9c::ffff:ffff:ffff:ffff:ffff,US +2620:9c:4000::,2620:9c:4000:ffff:ffff:ffff:ffff:ffff,US +2620:9c:8000::,2620:9c:8000:ffff:ffff:ffff:ffff:ffff,US +2620:9c:c000::,2620:9c:c000:ffff:ffff:ffff:ffff:ffff,US +2620:9d::,2620:9d::ffff:ffff:ffff:ffff:ffff,US +2620:9d:4000::,2620:9d:4000:ffff:ffff:ffff:ffff:ffff,US +2620:9d:8000::,2620:9d:8000:ffff:ffff:ffff:ffff:ffff,US +2620:9d:c000::,2620:9d:c000:ffff:ffff:ffff:ffff:ffff,US +2620:9e::,2620:9e::ffff:ffff:ffff:ffff:ffff,US +2620:9e:4000::,2620:9e:4000:ffff:ffff:ffff:ffff:ffff,US +2620:9e:8000::,2620:9e:8000:ffff:ffff:ffff:ffff:ffff,US +2620:9e:c000::,2620:9e:c000:ffff:ffff:ffff:ffff:ffff,US +2620:9f::,2620:9f:ff:ffff:ffff:ffff:ffff:ffff,US +2620:9f:8000::,2620:9f:8000:ffff:ffff:ffff:ffff:ffff,US +2620:9f:c000::,2620:9f:c000:ffff:ffff:ffff:ffff:ffff,US +2620:a0::,2620:a0::ffff:ffff:ffff:ffff:ffff,US +2620:a0:4000::,2620:a0:4000:ffff:ffff:ffff:ffff:ffff,US +2620:a0:8000::,2620:a0:8000:ffff:ffff:ffff:ffff:ffff,US +2620:a0:c000::,2620:a0:c000:ffff:ffff:ffff:ffff:ffff,US +2620:a1::,2620:a1::ffff:ffff:ffff:ffff:ffff,US +2620:a1:4000::,2620:a1:4000:ffff:ffff:ffff:ffff:ffff,US +2620:a1:8000::,2620:a1:8000:ffff:ffff:ffff:ffff:ffff,US +2620:a1:c000::,2620:a1:c000:ffff:ffff:ffff:ffff:ffff,US +2620:a2::,2620:a2::ffff:ffff:ffff:ffff:ffff,US +2620:a2:4000::,2620:a2:4000:ffff:ffff:ffff:ffff:ffff,US +2620:a2:8000::,2620:a2:8000:ffff:ffff:ffff:ffff:ffff,US +2620:a2:c000::,2620:a2:c000:ffff:ffff:ffff:ffff:ffff,US +2620:a3::,2620:a3::ffff:ffff:ffff:ffff:ffff,US +2620:a3:4000::,2620:a3:400f:ffff:ffff:ffff:ffff:ffff,US +2620:a3:8000::,2620:a3:8000:ffff:ffff:ffff:ffff:ffff,US +2620:a3:c020::,2620:a3:c020:ffff:ffff:ffff:ffff:ffff,US +2620:a4:40::,2620:a4:40:ffff:ffff:ffff:ffff:ffff,US +2620:a4:4060::,2620:a4:4060:ffff:ffff:ffff:ffff:ffff,US +2620:a4:8080::,2620:a4:8080:ffff:ffff:ffff:ffff:ffff,US +2620:a5::,2620:a5::ffff:ffff:ffff:ffff:ffff,US +2620:a5:8000::,2620:a5:8000:ffff:ffff:ffff:ffff:ffff,US +2620:a6::,2620:a6::ffff:ffff:ffff:ffff:ffff,US +2620:a6:8000::,2620:a6:8000:ffff:ffff:ffff:ffff:ffff,US +2620:a7::,2620:a7::ffff:ffff:ffff:ffff:ffff,US +2620:a7:8000::,2620:a7:8000:ffff:ffff:ffff:ffff:ffff,US +2620:a8::,2620:a8::ffff:ffff:ffff:ffff:ffff,US +2620:a8:8000::,2620:a8:8000:ffff:ffff:ffff:ffff:ffff,US +2620:a9::,2620:a9::ffff:ffff:ffff:ffff:ffff,US +2620:a9:8000::,2620:a9:800f:ffff:ffff:ffff:ffff:ffff,US +2620:aa::,2620:aa::ffff:ffff:ffff:ffff:ffff,US +2620:aa:8000::,2620:aa:8000:ffff:ffff:ffff:ffff:ffff,US +2620:ab::,2620:ab::ffff:ffff:ffff:ffff:ffff,US +2620:ab:8000::,2620:ab:8000:ffff:ffff:ffff:ffff:ffff,US +2620:ac::,2620:ac::ffff:ffff:ffff:ffff:ffff,US +2620:ac:8000::,2620:ac:8000:ffff:ffff:ffff:ffff:ffff,US +2620:ad::,2620:ad::ffff:ffff:ffff:ffff:ffff,US +2620:ad:8000::,2620:ad:8000:ffff:ffff:ffff:ffff:ffff,US +2620:ae::,2620:ae::ffff:ffff:ffff:ffff:ffff,CA +2620:ae:8000::,2620:ae:8000:ffff:ffff:ffff:ffff:ffff,US +2620:af::,2620:af::ffff:ffff:ffff:ffff:ffff,US +2620:af:8000::,2620:af:8000:ffff:ffff:ffff:ffff:ffff,US +2620:b0::,2620:b0::ffff:ffff:ffff:ffff:ffff,CA +2620:b0:8000::,2620:b0:8000:ffff:ffff:ffff:ffff:ffff,US +2620:b1::,2620:b1::ffff:ffff:ffff:ffff:ffff,US +2620:b1:8000::,2620:b1:8000:ffff:ffff:ffff:ffff:ffff,US +2620:b2::,2620:b2::ffff:ffff:ffff:ffff:ffff,US +2620:b2:8000::,2620:b2:8000:ffff:ffff:ffff:ffff:ffff,US +2620:b3::,2620:b3::ffff:ffff:ffff:ffff:ffff,US +2620:b3:8000::,2620:b3:8000:ffff:ffff:ffff:ffff:ffff,US +2620:b4::,2620:b4::ffff:ffff:ffff:ffff:ffff,US +2620:b4:8000::,2620:b4:8000:ffff:ffff:ffff:ffff:ffff,CA +2620:b5::,2620:b5::ffff:ffff:ffff:ffff:ffff,US +2620:b5:8000::,2620:b5:8000:ffff:ffff:ffff:ffff:ffff,US +2620:b6::,2620:b6::ffff:ffff:ffff:ffff:ffff,US +2620:b6:8000::,2620:b6:8000:ffff:ffff:ffff:ffff:ffff,US +2620:b7::,2620:b7::ffff:ffff:ffff:ffff:ffff,US +2620:b7:8000::,2620:b7:8000:ffff:ffff:ffff:ffff:ffff,CA +2620:b8::,2620:b8::ffff:ffff:ffff:ffff:ffff,US +2620:b8:8000::,2620:b8:8000:ffff:ffff:ffff:ffff:ffff,US +2620:b9::,2620:b9::ffff:ffff:ffff:ffff:ffff,US +2620:b9:8000::,2620:b9:8000:ffff:ffff:ffff:ffff:ffff,US +2620:ba::,2620:ba::ffff:ffff:ffff:ffff:ffff,US +2620:ba:8000::,2620:ba:8000:ffff:ffff:ffff:ffff:ffff,US +2620:bb::,2620:bb::ffff:ffff:ffff:ffff:ffff,US +2620:bb:8000::,2620:bb:8000:ffff:ffff:ffff:ffff:ffff,US +2620:bc:8000::,2620:bc:8000:ffff:ffff:ffff:ffff:ffff,US +2620:bd::,2620:bd::ffff:ffff:ffff:ffff:ffff,CA +2620:bd:8000::,2620:bd:8000:ffff:ffff:ffff:ffff:ffff,US +2620:be::,2620:be::ffff:ffff:ffff:ffff:ffff,US +2620:be:8000::,2620:be:8000:ffff:ffff:ffff:ffff:ffff,US +2620:bf::,2620:bf::ffff:ffff:ffff:ffff:ffff,US +2620:bf:8000::,2620:bf:8000:ffff:ffff:ffff:ffff:ffff,US +2620:c0::,2620:c0::ffff:ffff:ffff:ffff:ffff,US +2620:c0:8000::,2620:c0:8000:ffff:ffff:ffff:ffff:ffff,US +2620:c1::,2620:c1::ffff:ffff:ffff:ffff:ffff,US +2620:c1:8000::,2620:c1:8000:ffff:ffff:ffff:ffff:ffff,US +2620:c2::,2620:c2::ffff:ffff:ffff:ffff:ffff,CA +2620:c2:8000::,2620:c2:8000:ffff:ffff:ffff:ffff:ffff,US +2620:c3::,2620:c3::ffff:ffff:ffff:ffff:ffff,US +2620:c3:8000::,2620:c3:8000:ffff:ffff:ffff:ffff:ffff,US +2620:c4::,2620:c4::ffff:ffff:ffff:ffff:ffff,US +2620:c4:8000::,2620:c4:8000:ffff:ffff:ffff:ffff:ffff,US +2620:c5::,2620:c5::ffff:ffff:ffff:ffff:ffff,US +2620:c5:8000::,2620:c5:8000:ffff:ffff:ffff:ffff:ffff,US +2620:c6::,2620:c6::ffff:ffff:ffff:ffff:ffff,US +2620:c6:8000::,2620:c6:8000:ffff:ffff:ffff:ffff:ffff,US +2620:c7::,2620:c7::ffff:ffff:ffff:ffff:ffff,US +2620:c7:8000::,2620:c7:8000:ffff:ffff:ffff:ffff:ffff,US +2620:c8::,2620:c8::ffff:ffff:ffff:ffff:ffff,US +2620:c8:8000::,2620:c8:8000:ffff:ffff:ffff:ffff:ffff,US +2620:c9::,2620:c9::ffff:ffff:ffff:ffff:ffff,US +2620:c9:8000::,2620:c9:8000:ffff:ffff:ffff:ffff:ffff,US +2620:ca::,2620:ca::ffff:ffff:ffff:ffff:ffff,US +2620:ca:8000::,2620:ca:8000:ffff:ffff:ffff:ffff:ffff,US +2620:cb::,2620:cb::ffff:ffff:ffff:ffff:ffff,US +2620:cb:8000::,2620:cb:8000:ffff:ffff:ffff:ffff:ffff,CA +2620:cc::,2620:cc::ffff:ffff:ffff:ffff:ffff,US +2620:cc:8000::,2620:cc:8000:ffff:ffff:ffff:ffff:ffff,US +2620:cd::,2620:cd::ffff:ffff:ffff:ffff:ffff,US +2620:cd:8000::,2620:cd:8000:ffff:ffff:ffff:ffff:ffff,US +2620:ce::,2620:ce::ffff:ffff:ffff:ffff:ffff,US +2620:ce:8000::,2620:ce:8000:ffff:ffff:ffff:ffff:ffff,US +2620:cf::,2620:cf::ffff:ffff:ffff:ffff:ffff,US +2620:cf:8000::,2620:cf:8000:ffff:ffff:ffff:ffff:ffff,US +2620:d0::,2620:d0::ffff:ffff:ffff:ffff:ffff,US +2620:d0:8000::,2620:d0:8000:ffff:ffff:ffff:ffff:ffff,US +2620:d1::,2620:d1::ffff:ffff:ffff:ffff:ffff,US +2620:d1:8000::,2620:d1:8000:ffff:ffff:ffff:ffff:ffff,US +2620:d2::,2620:d2::ffff:ffff:ffff:ffff:ffff,US +2620:d2:8000::,2620:d2:8000:ffff:ffff:ffff:ffff:ffff,US +2620:d3::,2620:d3::ffff:ffff:ffff:ffff:ffff,US +2620:d3:8000::,2620:d3:8000:ffff:ffff:ffff:ffff:ffff,US +2620:d4::,2620:d4::ffff:ffff:ffff:ffff:ffff,US +2620:d4:8000::,2620:d4:8000:ffff:ffff:ffff:ffff:ffff,US +2620:d5::,2620:d5::ffff:ffff:ffff:ffff:ffff,US +2620:d5:8000::,2620:d5:8000:ffff:ffff:ffff:ffff:ffff,US +2620:d6::,2620:d6::ffff:ffff:ffff:ffff:ffff,US +2620:d6:8000::,2620:d6:8000:ffff:ffff:ffff:ffff:ffff,US +2620:d7::,2620:d7::ffff:ffff:ffff:ffff:ffff,US +2620:d7:8000::,2620:d7:8000:ffff:ffff:ffff:ffff:ffff,US +2620:d8::,2620:d8::ffff:ffff:ffff:ffff:ffff,US +2620:d8:8000::,2620:d8:8000:ffff:ffff:ffff:ffff:ffff,US +2620:d9::,2620:d9::ffff:ffff:ffff:ffff:ffff,US +2620:d9:8000::,2620:d9:8000:ffff:ffff:ffff:ffff:ffff,US +2620:da::,2620:da::ffff:ffff:ffff:ffff:ffff,US +2620:da:8000::,2620:da:8000:ffff:ffff:ffff:ffff:ffff,US +2620:db::,2620:db::ffff:ffff:ffff:ffff:ffff,US +2620:db:8000::,2620:db:8000:ffff:ffff:ffff:ffff:ffff,US +2620:dc::,2620:dc::ffff:ffff:ffff:ffff:ffff,US +2620:dc:8::,2620:dc:8:ffff:ffff:ffff:ffff:ffff,US +2620:dc:8000::,2620:dc:8000:ffff:ffff:ffff:ffff:ffff,CA +2620:dd::,2620:dd::ffff:ffff:ffff:ffff:ffff,CA +2620:dd:8000::,2620:dd:8000:ffff:ffff:ffff:ffff:ffff,US +2620:de::,2620:de::ffff:ffff:ffff:ffff:ffff,US +2620:de:8000::,2620:de:8000:ffff:ffff:ffff:ffff:ffff,US +2620:df::,2620:df::ffff:ffff:ffff:ffff:ffff,US +2620:df:8000::,2620:df:8000:ffff:ffff:ffff:ffff:ffff,US +2620:e0::,2620:e0::ffff:ffff:ffff:ffff:ffff,US +2620:e0:8000::,2620:e0:8000:ffff:ffff:ffff:ffff:ffff,US +2620:e1::,2620:e1::ffff:ffff:ffff:ffff:ffff,US +2620:e1:8000::,2620:e1:8000:ffff:ffff:ffff:ffff:ffff,US +2620:e2::,2620:e2::ffff:ffff:ffff:ffff:ffff,US +2620:e2:8000::,2620:e2:8000:ffff:ffff:ffff:ffff:ffff,US +2620:e3::,2620:e3::ffff:ffff:ffff:ffff:ffff,US +2620:e3:8000::,2620:e3:8000:ffff:ffff:ffff:ffff:ffff,US +2620:e4::,2620:e4::ffff:ffff:ffff:ffff:ffff,US +2620:e4:8000::,2620:e4:8000:ffff:ffff:ffff:ffff:ffff,US +2620:e5::,2620:e5::ffff:ffff:ffff:ffff:ffff,US +2620:e5:8000::,2620:e5:8000:ffff:ffff:ffff:ffff:ffff,US +2620:e6::,2620:e6::ffff:ffff:ffff:ffff:ffff,US +2620:e6:8000::,2620:e6:8000:ffff:ffff:ffff:ffff:ffff,US +2620:e7::,2620:e7::ffff:ffff:ffff:ffff:ffff,US +2620:e7:8000::,2620:e7:8000:ffff:ffff:ffff:ffff:ffff,CA +2620:e8::,2620:e8::ffff:ffff:ffff:ffff:ffff,US +2620:e8:8000::,2620:e8:8000:ffff:ffff:ffff:ffff:ffff,US +2620:e9::,2620:e9::ffff:ffff:ffff:ffff:ffff,US +2620:e9:8000::,2620:e9:8000:ffff:ffff:ffff:ffff:ffff,US +2620:ea::,2620:ea:f:ffff:ffff:ffff:ffff:ffff,US +2620:ea:8000::,2620:ea:8000:ffff:ffff:ffff:ffff:ffff,US +2620:eb::,2620:eb::ffff:ffff:ffff:ffff:ffff,US +2620:eb:8000::,2620:eb:8000:ffff:ffff:ffff:ffff:ffff,US +2620:ec::,2620:ec::ffff:ffff:ffff:ffff:ffff,US +2620:ec:8000::,2620:ec:8000:ffff:ffff:ffff:ffff:ffff,US +2620:ed::,2620:ed::ffff:ffff:ffff:ffff:ffff,US +2620:ed:8000::,2620:ed:8000:ffff:ffff:ffff:ffff:ffff,US +2620:ee::,2620:ee::ffff:ffff:ffff:ffff:ffff,US +2620:ee:8000::,2620:ee:8000:ffff:ffff:ffff:ffff:ffff,US +2620:ef::,2620:ef::ffff:ffff:ffff:ffff:ffff,US +2620:ef:8000::,2620:ef:8000:ffff:ffff:ffff:ffff:ffff,US +2620:f0::,2620:f0::ffff:ffff:ffff:ffff:ffff,US +2620:f0:8000::,2620:f0:8000:ffff:ffff:ffff:ffff:ffff,US +2620:f1::,2620:f1::ffff:ffff:ffff:ffff:ffff,US +2620:f1:8000::,2620:f1:8000:ffff:ffff:ffff:ffff:ffff,US +2620:f2::,2620:f2::ffff:ffff:ffff:ffff:ffff,CA +2620:f2:8000::,2620:f2:8000:ffff:ffff:ffff:ffff:ffff,US +2620:f3::,2620:f3::ffff:ffff:ffff:ffff:ffff,US +2620:f3:8000::,2620:f3:8000:ffff:ffff:ffff:ffff:ffff,US +2620:f4::,2620:f4::ffff:ffff:ffff:ffff:ffff,US +2620:f4:8000::,2620:f4:8000:ffff:ffff:ffff:ffff:ffff,CA +2620:f5::,2620:f5::ffff:ffff:ffff:ffff:ffff,US +2620:f5:8000::,2620:f5:8000:ffff:ffff:ffff:ffff:ffff,US +2620:f6::,2620:f6::ffff:ffff:ffff:ffff:ffff,CA +2620:f6:8000::,2620:f6:8000:ffff:ffff:ffff:ffff:ffff,US +2620:f7::,2620:f7::ffff:ffff:ffff:ffff:ffff,US +2620:f7:8000::,2620:f7:8000:ffff:ffff:ffff:ffff:ffff,US +2620:f8::,2620:f8::ffff:ffff:ffff:ffff:ffff,US +2620:f8:8000::,2620:f8:8000:ffff:ffff:ffff:ffff:ffff,US +2620:f9::,2620:f9:f:ffff:ffff:ffff:ffff:ffff,US +2620:f9:8000::,2620:f9:8000:ffff:ffff:ffff:ffff:ffff,US +2620:fa::,2620:fa::ffff:ffff:ffff:ffff:ffff,US +2620:fa:8000::,2620:fa:8000:ffff:ffff:ffff:ffff:ffff,CA +2620:fb::,2620:fb::ffff:ffff:ffff:ffff:ffff,US +2620:fb:8000::,2620:fb:8000:ffff:ffff:ffff:ffff:ffff,US +2620:fc::,2620:fc::ffff:ffff:ffff:ffff:ffff,CA +2620:fc:8000::,2620:fc:8000:ffff:ffff:ffff:ffff:ffff,US +2620:fd::,2620:fd::ffff:ffff:ffff:ffff:ffff,CA +2620:fd:8000::,2620:fd:8000:ffff:ffff:ffff:ffff:ffff,US +2620:fe::,2620:fe:ff:ffff:ffff:ffff:ffff:ffff,US +2620:fe:8000::,2620:fe:8000:ffff:ffff:ffff:ffff:ffff,US +2620:ff::,2620:ff::ffff:ffff:ffff:ffff:ffff,US +2620:ff:8000::,2620:ff:8000:ffff:ffff:ffff:ffff:ffff,US +2620:100::,2620:100:f:ffff:ffff:ffff:ffff:ffff,US 2620:100:1000::,2620:100:1001:ffff:ffff:ffff:ffff:ffff,US 2620:100:3000::,2620:100:3007:ffff:ffff:ffff:ffff:ffff,US 2620:100:4000::,2620:100:403f:ffff:ffff:ffff:ffff:ffff,US @@ -5121,7 +9797,9 @@ 2620:101:6000::,2620:101:6001:ffff:ffff:ffff:ffff:ffff,US 2620:101:7000::,2620:101:7001:ffff:ffff:ffff:ffff:ffff,US 2620:101:8000::,2620:101:80ff:ffff:ffff:ffff:ffff:ffff,US -2620:101:9000::,2620:101:900f:ffff:ffff:ffff:ffff:ffff,US +2620:101:9000::,2620:101:9004:ffff:ffff:ffff:ffff:ffff,US +2620:101:9005::,2620:101:9005:ffff:ffff:ffff:ffff:ffff,CA +2620:101:9006::,2620:101:900f:ffff:ffff:ffff:ffff:ffff,US 2620:101:a000::,2620:101:a001:ffff:ffff:ffff:ffff:ffff,US 2620:101:b000::,2620:101:b07f:ffff:ffff:ffff:ffff:ffff,US 2620:101:c000::,2620:101:c00f:ffff:ffff:ffff:ffff:ffff,CA @@ -5143,7 +9821,6 @@ 2620:102:d000::,2620:102:d07f:ffff:ffff:ffff:ffff:ffff,US 2620:102:e000::,2620:102:e00f:ffff:ffff:ffff:ffff:ffff,US 2620:102:f000::,2620:102:f003:ffff:ffff:ffff:ffff:ffff,US -2620:103::,2620:103:7:ffff:ffff:ffff:ffff:ffff,US 2620:103:1000::,2620:103:100f:ffff:ffff:ffff:ffff:ffff,US 2620:103:2000::,2620:103:200f:ffff:ffff:ffff:ffff:ffff,CA 2620:103:3000::,2620:103:30ff:ffff:ffff:ffff:ffff:ffff,US @@ -5162,7 +9839,8 @@ 2620:104:1000::,2620:104:100f:ffff:ffff:ffff:ffff:ffff,US 2620:104:2000::,2620:104:20ff:ffff:ffff:ffff:ffff:ffff,US 2620:104:3000::,2620:104:300f:ffff:ffff:ffff:ffff:ffff,US -2620:104:4000::,2620:104:400f:ffff:ffff:ffff:ffff:ffff,US +2620:104:4000::,2620:104:4000:ffff:ffff:ffff:ffff:ffff,GB +2620:104:4001::,2620:104:400f:ffff:ffff:ffff:ffff:ffff,US 2620:104:5000::,2620:104:500f:ffff:ffff:ffff:ffff:ffff,US 2620:104:6000::,2620:104:600f:ffff:ffff:ffff:ffff:ffff,US 2620:104:7000::,2620:104:70ff:ffff:ffff:ffff:ffff:ffff,US @@ -5426,7 +10104,7 @@ 2620:115::,2620:115:f:ffff:ffff:ffff:ffff:ffff,US 2620:115:1000::,2620:115:100f:ffff:ffff:ffff:ffff:ffff,US 2620:115:2000::,2620:115:200f:ffff:ffff:ffff:ffff:ffff,US -2620:115:3000::,2620:115:300f:ffff:ffff:ffff:ffff:ffff,KY +2620:115:3000::,2620:115:300f:ffff:ffff:ffff:ffff:ffff,US 2620:115:4000::,2620:115:40ff:ffff:ffff:ffff:ffff:ffff,US 2620:115:5000::,2620:115:500f:ffff:ffff:ffff:ffff:ffff,US 2620:115:6000::,2620:115:600f:ffff:ffff:ffff:ffff:ffff,US @@ -5526,6 +10204,41 @@ 2620:11b:4000::,2620:11b:40ff:ffff:ffff:ffff:ffff:ffff,US 2620:11b:5000::,2620:11b:500f:ffff:ffff:ffff:ffff:ffff,US 2620:11b:6000::,2620:11b:600f:ffff:ffff:ffff:ffff:ffff,US +2620:11b:7000::,2620:11b:700f:ffff:ffff:ffff:ffff:ffff,US +2620:11b:8000::,2620:11b:80ff:ffff:ffff:ffff:ffff:ffff,US +2620:11b:9000::,2620:11b:900f:ffff:ffff:ffff:ffff:ffff,US +2620:11b:a000::,2620:11b:a00f:ffff:ffff:ffff:ffff:ffff,US +2620:11b:b000::,2620:11b:b00f:ffff:ffff:ffff:ffff:ffff,US +2620:11b:c000::,2620:11b:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:11b:d000::,2620:11b:d0ff:ffff:ffff:ffff:ffff:ffff,US +2620:11b:e000::,2620:11b:e0ff:ffff:ffff:ffff:ffff:ffff,US +2620:11b:f000::,2620:11b:f0ff:ffff:ffff:ffff:ffff:ffff,US +2620:11c::,2620:11c:f:ffff:ffff:ffff:ffff:ffff,US +2620:11c:1000::,2620:11c:10ff:ffff:ffff:ffff:ffff:ffff,BB +2620:11c:2000::,2620:11c:20ff:ffff:ffff:ffff:ffff:ffff,CA +2620:11c:3000::,2620:11c:30ff:ffff:ffff:ffff:ffff:ffff,US +2620:11c:4000::,2620:11c:40ff:ffff:ffff:ffff:ffff:ffff,US +2620:11c:5000::,2620:11c:500f:ffff:ffff:ffff:ffff:ffff,US +2620:11c:6000::,2620:11c:600f:ffff:ffff:ffff:ffff:ffff,US +2620:11c:7000::,2620:11c:700f:ffff:ffff:ffff:ffff:ffff,US +2620:11c:8000::,2620:11c:80ff:ffff:ffff:ffff:ffff:ffff,US +2620:11c:9000::,2620:11c:900f:ffff:ffff:ffff:ffff:ffff,US +2620:11c:a000::,2620:11c:a00f:ffff:ffff:ffff:ffff:ffff,US +2620:11c:b000::,2620:11c:b00f:ffff:ffff:ffff:ffff:ffff,US +2620:11c:c000::,2620:11c:c00f:ffff:ffff:ffff:ffff:ffff,CA +2620:11c:d000::,2620:11c:d00f:ffff:ffff:ffff:ffff:ffff,US +2620:11c:e000::,2620:11c:e00f:ffff:ffff:ffff:ffff:ffff,US +2620:11c:f000::,2620:11c:f00f:ffff:ffff:ffff:ffff:ffff,US +2620:11d::,2620:11d:f:ffff:ffff:ffff:ffff:ffff,US +2620:11d:1000::,2620:11d:100f:ffff:ffff:ffff:ffff:ffff,US +2620:11d:2000::,2620:11d:20ff:ffff:ffff:ffff:ffff:ffff,US +2620:11d:3000::,2620:11d:300f:ffff:ffff:ffff:ffff:ffff,US +2620:11d:4000::,2620:11d:400f:ffff:ffff:ffff:ffff:ffff,US +2620:11d:5000::,2620:11d:500f:ffff:ffff:ffff:ffff:ffff,US +2620:11d:6000::,2620:11d:60ff:ffff:ffff:ffff:ffff:ffff,US +2620:11d:7000::,2620:11d:700f:ffff:ffff:ffff:ffff:ffff,US +2620:11d:8000::,2620:11d:80ff:ffff:ffff:ffff:ffff:ffff,US +2620:11d:9000::,2620:11d:900f:ffff:ffff:ffff:ffff:ffff,US 2620:140::,2620:140:3ff:ffff:ffff:ffff:ffff:ffff,US 2620:141::,2620:141:fff:ffff:ffff:ffff:ffff:ffff,US 2620:143::,2620:143:7ff:ffff:ffff:ffff:ffff:ffff,US @@ -5575,7 +10288,7 @@ 2620:176::,2620:177:fff:ffff:ffff:ffff:ffff:ffff,US 2620:178::,2620:178:fff:ffff:ffff:ffff:ffff:ffff,US 2620:179::,2620:179:fff:ffff:ffff:ffff:ffff:ffff,US -2620:17a::,2620:17a:fff:ffff:ffff:ffff:ffff:ffff,US +2620:17a::,2620:17a:fff:ffff:ffff:ffff:ffff:ffff,FR 2620:17b::,2620:17b:fff:ffff:ffff:ffff:ffff:ffff,US 2620:17c::,2620:17c:fff:ffff:ffff:ffff:ffff:ffff,US 2620:17e::,2620:17e:fff:ffff:ffff:ffff:ffff:ffff,US @@ -5587,6 +10300,12 @@ 2620:1d0::,2620:1d0:ffff:ffff:ffff:ffff:ffff:ffff,US 2620:1e0::,2620:1e1:fff:ffff:ffff:ffff:ffff:ffff,US 2620:1e2::,2620:1e2:fff:ffff:ffff:ffff:ffff:ffff,US +2620:1e3::,2620:1e3:fff:ffff:ffff:ffff:ffff:ffff,US +2620:1e4::,2620:1e4:ffff:ffff:ffff:ffff:ffff:ffff,CA +2620:1e5::,2620:1e5:fff:ffff:ffff:ffff:ffff:ffff,US +2620:1e6::,2620:1e6:fff:ffff:ffff:ffff:ffff:ffff,US +2620:1e7::,2620:1e7:fff:ffff:ffff:ffff:ffff:ffff,US +2620:1e8::,2620:1e8:fff:ffff:ffff:ffff:ffff:ffff,US 2620:1f0::,2620:1f1:fff:ffff:ffff:ffff:ffff:ffff,US 2620:1f2::,2620:1f4:fff:ffff:ffff:ffff:ffff:ffff,US 2620:1f5::,2620:1f5:fff:ffff:ffff:ffff:ffff:ffff,CA @@ -5875,84 +10594,104 @@ 2801:10::,2801:10:7:ffff:ffff:ffff:ffff:ffff,AR 2801:10:2000::,2801:10:2000:ffff:ffff:ffff:ffff:ffff,AR 2801:10:4000::,2801:10:4000:ffff:ffff:ffff:ffff:ffff,AR +2801:10:6000::,2801:10:6000:ffff:ffff:ffff:ffff:ffff,HN 2801:10:8000::,2801:10:8000:ffff:ffff:ffff:ffff:ffff,AR 2801:10:a000::,2801:10:a000:ffff:ffff:ffff:ffff:ffff,AR 2801:10:c000::,2801:10:c000:ffff:ffff:ffff:ffff:ffff,CO 2801:11::,2801:11::ffff:ffff:ffff:ffff:ffff,AR 2801:11:2000::,2801:11:2000:ffff:ffff:ffff:ffff:ffff,AR 2801:11:4000::,2801:11:4000:ffff:ffff:ffff:ffff:ffff,CO +2801:11:6000::,2801:11:6000:ffff:ffff:ffff:ffff:ffff,AR 2801:11:8000::,2801:11:8000:ffff:ffff:ffff:ffff:ffff,CO 2801:11:a000::,2801:11:a000:ffff:ffff:ffff:ffff:ffff,VE 2801:11:c000::,2801:11:c000:ffff:ffff:ffff:ffff:ffff,AR 2801:12::,2801:12::ffff:ffff:ffff:ffff:ffff,PY 2801:12:2000::,2801:12:2000:ffff:ffff:ffff:ffff:ffff,HN 2801:12:4000::,2801:12:4000:ffff:ffff:ffff:ffff:ffff,CO +2801:12:6000::,2801:12:6000:ffff:ffff:ffff:ffff:ffff,SV 2801:12:8000::,2801:12:8000:ffff:ffff:ffff:ffff:ffff,AR -2801:12:a000::,2801:12:a000:ffff:ffff:ffff:ffff:ffff,CL +2801:12:a000::,2801:12:a00f:ffff:ffff:ffff:ffff:ffff,CL 2801:12:c000::,2801:12:c000:ffff:ffff:ffff:ffff:ffff,AR 2801:13::,2801:13::ffff:ffff:ffff:ffff:ffff,VE 2801:13:2000::,2801:13:2000:ffff:ffff:ffff:ffff:ffff,AR 2801:13:4000::,2801:13:4000:ffff:ffff:ffff:ffff:ffff,CL +2801:13:6000::,2801:13:6000:ffff:ffff:ffff:ffff:ffff,GT 2801:13:8000::,2801:13:8000:ffff:ffff:ffff:ffff:ffff,SV +2801:13:a000::,2801:13:a000:ffff:ffff:ffff:ffff:ffff,CO 2801:13:c000::,2801:13:c000:ffff:ffff:ffff:ffff:ffff,TT 2801:14::,2801:14::ffff:ffff:ffff:ffff:ffff,CO 2801:14:2000::,2801:14:2000:ffff:ffff:ffff:ffff:ffff,AR 2801:14:4000::,2801:14:4000:ffff:ffff:ffff:ffff:ffff,CO +2801:14:6000::,2801:14:6000:ffff:ffff:ffff:ffff:ffff,BO 2801:14:a000::,2801:14:a001:ffff:ffff:ffff:ffff:ffff,UY 2801:14:c000::,2801:14:c000:ffff:ffff:ffff:ffff:ffff,BO 2801:15::,2801:15::ffff:ffff:ffff:ffff:ffff,EC 2801:15:2000::,2801:15:2000:ffff:ffff:ffff:ffff:ffff,CR 2801:15:4000::,2801:15:4000:ffff:ffff:ffff:ffff:ffff,CO +2801:15:6000::,2801:15:6000:ffff:ffff:ffff:ffff:ffff,SV 2801:15:8000::,2801:15:8000:ffff:ffff:ffff:ffff:ffff,CR +2801:15:a000::,2801:15:a000:ffff:ffff:ffff:ffff:ffff,DO 2801:15:c000::,2801:15:c000:ffff:ffff:ffff:ffff:ffff,GT 2801:16::,2801:16::ffff:ffff:ffff:ffff:ffff,CW 2801:16:2000::,2801:16:2000:ffff:ffff:ffff:ffff:ffff,HN 2801:16:4000::,2801:16:4000:ffff:ffff:ffff:ffff:ffff,AR +2801:16:6000::,2801:16:6000:ffff:ffff:ffff:ffff:ffff,AR 2801:16:8000::,2801:16:8000:ffff:ffff:ffff:ffff:ffff,CO 2801:16:a000::,2801:16:a000:ffff:ffff:ffff:ffff:ffff,CR 2801:16:c000::,2801:16:c000:ffff:ffff:ffff:ffff:ffff,AR 2801:17::,2801:17::ffff:ffff:ffff:ffff:ffff,CL 2801:17:2000::,2801:17:2000:ffff:ffff:ffff:ffff:ffff,PY 2801:17:4000::,2801:17:4000:ffff:ffff:ffff:ffff:ffff,CO +2801:17:6000::,2801:17:6000:ffff:ffff:ffff:ffff:ffff,AR 2801:17:8000::,2801:17:8000:ffff:ffff:ffff:ffff:ffff,CR +2801:17:a000::,2801:17:a000:ffff:ffff:ffff:ffff:ffff,HT 2801:17:c000::,2801:17:c000:ffff:ffff:ffff:ffff:ffff,PA 2801:18::,2801:18::ffff:ffff:ffff:ffff:ffff,CR 2801:18:2000::,2801:18:2000:ffff:ffff:ffff:ffff:ffff,CO 2801:18:4000::,2801:18:4000:ffff:ffff:ffff:ffff:ffff,CO +2801:18:6000::,2801:18:6000:ffff:ffff:ffff:ffff:ffff,AR 2801:18:8000::,2801:18:8000:ffff:ffff:ffff:ffff:ffff,AR 2801:18:a000::,2801:18:a000:ffff:ffff:ffff:ffff:ffff,BO 2801:18:c000::,2801:18:c000:ffff:ffff:ffff:ffff:ffff,AR 2801:19::,2801:19::ffff:ffff:ffff:ffff:ffff,AR 2801:19:2000::,2801:19:2000:ffff:ffff:ffff:ffff:ffff,CL 2801:19:4000::,2801:19:4000:ffff:ffff:ffff:ffff:ffff,PY +2801:19:6000::,2801:19:6000:ffff:ffff:ffff:ffff:ffff,CW 2801:19:8000::,2801:19:8000:ffff:ffff:ffff:ffff:ffff,EC 2801:19:a000::,2801:19:a000:ffff:ffff:ffff:ffff:ffff,BO 2801:19:c000::,2801:19:c000:ffff:ffff:ffff:ffff:ffff,AR 2801:1a::,2801:1a::ffff:ffff:ffff:ffff:ffff,CO 2801:1a:2000::,2801:1a:2000:ffff:ffff:ffff:ffff:ffff,AR 2801:1a:4000::,2801:1a:4000:ffff:ffff:ffff:ffff:ffff,CO +2801:1a:6000::,2801:1a:6000:ffff:ffff:ffff:ffff:ffff,CR 2801:1a:8000::,2801:1a:8000:ffff:ffff:ffff:ffff:ffff,CL 2801:1a:a000::,2801:1a:a000:ffff:ffff:ffff:ffff:ffff,AR 2801:1a:c000::,2801:1a:c000:ffff:ffff:ffff:ffff:ffff,CO 2801:1b::,2801:1b::ffff:ffff:ffff:ffff:ffff,CR 2801:1b:2000::,2801:1b:2000:ffff:ffff:ffff:ffff:ffff,UY 2801:1b:4000::,2801:1b:4000:ffff:ffff:ffff:ffff:ffff,CL +2801:1b:6000::,2801:1b:6000:ffff:ffff:ffff:ffff:ffff,CL 2801:1b:8000::,2801:1b:8000:ffff:ffff:ffff:ffff:ffff,CL +2801:1b:a000::,2801:1b:a000:ffff:ffff:ffff:ffff:ffff,AR 2801:1b:c000::,2801:1b:c000:ffff:ffff:ffff:ffff:ffff,PA 2801:1c::,2801:1c::ffff:ffff:ffff:ffff:ffff,PY 2801:1c:2000::,2801:1c:2000:ffff:ffff:ffff:ffff:ffff,PE 2801:1c:4000::,2801:1c:4000:ffff:ffff:ffff:ffff:ffff,CO +2801:1c:6000::,2801:1c:6000:ffff:ffff:ffff:ffff:ffff,PA 2801:1c:8000::,2801:1c:8000:ffff:ffff:ffff:ffff:ffff,EC 2801:1c:a000::,2801:1c:a000:ffff:ffff:ffff:ffff:ffff,CO 2801:1c:c000::,2801:1c:c000:ffff:ffff:ffff:ffff:ffff,HN 2801:1d::,2801:1d::ffff:ffff:ffff:ffff:ffff,PY 2801:1d:2000::,2801:1d:2000:ffff:ffff:ffff:ffff:ffff,GT 2801:1d:4000::,2801:1d:4000:ffff:ffff:ffff:ffff:ffff,TT +2801:1d:6000::,2801:1d:6000:ffff:ffff:ffff:ffff:ffff,NI 2801:1d:8000::,2801:1d:8000:ffff:ffff:ffff:ffff:ffff,AR +2801:1d:a000::,2801:1d:a000:ffff:ffff:ffff:ffff:ffff,CR 2801:1d:c000::,2801:1d:c000:ffff:ffff:ffff:ffff:ffff,AR 2801:1e::,2801:1e::ffff:ffff:ffff:ffff:ffff,EC 2801:1e:2000::,2801:1e:2000:ffff:ffff:ffff:ffff:ffff,AR 2801:1e:4000::,2801:1e:4007:ffff:ffff:ffff:ffff:ffff,AR +2801:1e:6000::,2801:1e:6000:ffff:ffff:ffff:ffff:ffff,CO 2801:1e:8000::,2801:1e:8000:ffff:ffff:ffff:ffff:ffff,CR 2801:1e:a000::,2801:1e:a000:ffff:ffff:ffff:ffff:ffff,AR 2801:1e:c000::,2801:1e:c000:ffff:ffff:ffff:ffff:ffff,AR @@ -5960,6 +10699,7 @@ 2801:1f:2000::,2801:1f:2000:ffff:ffff:ffff:ffff:ffff,CR 2801:1f:4000::,2801:1f:4000:ffff:ffff:ffff:ffff:ffff,CR 2801:1f:8000::,2801:1f:8000:ffff:ffff:ffff:ffff:ffff,AR +2801:1f:a000::,2801:1f:a000:ffff:ffff:ffff:ffff:ffff,CL 2801:1f:c000::,2801:1f:c000:ffff:ffff:ffff:ffff:ffff,CR 2801:80::,2801:80::ffff:ffff:ffff:ffff:ffff,BR 2801:80:10::,2801:80:10:ffff:ffff:ffff:ffff:ffff,BR @@ -6137,7 +10877,6 @@ 2801:80:b10::,2801:80:b10:ffff:ffff:ffff:ffff:ffff,BR 2801:80:b20::,2801:80:b20:ffff:ffff:ffff:ffff:ffff,BR 2801:80:b30::,2801:80:b30:ffff:ffff:ffff:ffff:ffff,BR -2801:80:b40::,2801:80:b40:ffff:ffff:ffff:ffff:ffff,BR 2801:80:b50::,2801:80:b50:ffff:ffff:ffff:ffff:ffff,BR 2801:80:b60::,2801:80:b60:ffff:ffff:ffff:ffff:ffff,BR 2801:80:b70::,2801:80:b70:ffff:ffff:ffff:ffff:ffff,BR @@ -6151,6 +10890,39 @@ 2801:80:c10::,2801:80:c10:ffff:ffff:ffff:ffff:ffff,BR 2801:80:c20::,2801:80:c20:ffff:ffff:ffff:ffff:ffff,BR 2801:80:c30::,2801:80:c30:ffff:ffff:ffff:ffff:ffff,BR +2801:80:c40::,2801:80:c40:ffff:ffff:ffff:ffff:ffff,BR +2801:80:c50::,2801:80:c50:ffff:ffff:ffff:ffff:ffff,BR +2801:80:c60::,2801:80:c60:ffff:ffff:ffff:ffff:ffff,BR +2801:80:c70::,2801:80:c70:ffff:ffff:ffff:ffff:ffff,BR +2801:80:c80::,2801:80:c80:ffff:ffff:ffff:ffff:ffff,BR +2801:80:c90::,2801:80:c90:ffff:ffff:ffff:ffff:ffff,BR +2801:80:ca0::,2801:80:ca0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:cb0::,2801:80:cb0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:cc0::,2801:80:cc0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:cd0::,2801:80:cd0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:ce0::,2801:80:ce0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:cf0::,2801:80:cf0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:d00::,2801:80:d00:ffff:ffff:ffff:ffff:ffff,BR +2801:80:d10::,2801:80:d10:ffff:ffff:ffff:ffff:ffff,BR +2801:80:d20::,2801:80:d2f:ffff:ffff:ffff:ffff:ffff,BR +2801:80:d40::,2801:80:d40:ffff:ffff:ffff:ffff:ffff,BR +2801:80:d50::,2801:80:d50:ffff:ffff:ffff:ffff:ffff,BR +2801:80:d60::,2801:80:d6f:ffff:ffff:ffff:ffff:ffff,BR +2801:80:d80::,2801:80:d80:ffff:ffff:ffff:ffff:ffff,BR +2801:80:d90::,2801:80:d90:ffff:ffff:ffff:ffff:ffff,BR +2801:80:da0::,2801:80:daf:ffff:ffff:ffff:ffff:ffff,BR +2801:80:dc0::,2801:80:dcf:ffff:ffff:ffff:ffff:ffff,BR +2801:80:de0::,2801:80:de0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:df0::,2801:80:df0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:e00::,2801:80:e00:ffff:ffff:ffff:ffff:ffff,BR +2801:80:e10::,2801:80:e10:ffff:ffff:ffff:ffff:ffff,BR +2801:80:e20::,2801:80:e20:ffff:ffff:ffff:ffff:ffff,BR +2801:80:e30::,2801:80:e30:ffff:ffff:ffff:ffff:ffff,BR +2801:80:e40::,2801:80:e40:ffff:ffff:ffff:ffff:ffff,BR +2801:80:e50::,2801:80:e50:ffff:ffff:ffff:ffff:ffff,BR +2801:80:e60::,2801:80:e60:ffff:ffff:ffff:ffff:ffff,BR +2801:80:e70::,2801:80:e70:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1000::,2801:80:10ff:ffff:ffff:ffff:ffff:ffff,BR 2801:82::,2801:82:ffff:ffff:ffff:ffff:ffff:ffff,BR 2801:84::,2801:84:ffff:ffff:ffff:ffff:ffff:ffff,BR 2801:86::,2801:86:ffff:ffff:ffff:ffff:ffff:ffff,BR @@ -6205,10 +10977,12 @@ 2801:120::,2801:120:ffff:ffff:ffff:ffff:ffff:ffff,AR 2801:130::,2801:130:fff:ffff:ffff:ffff:ffff:ffff,CO 2801:140::,2801:140:ffff:ffff:ffff:ffff:ffff:ffff,AR +2801:148::,2801:148:ff:ffff:ffff:ffff:ffff:ffff,AR 2801:150::,2801:150:ffff:ffff:ffff:ffff:ffff:ffff,PE 2801:160::,2801:160:ff:ffff:ffff:ffff:ffff:ffff,CO 2801:170::,2801:170:fff:ffff:ffff:ffff:ffff:ffff,CO 2801:180::,2801:180:f:ffff:ffff:ffff:ffff:ffff,PA +2801:188::,2801:188:f:ffff:ffff:ffff:ffff:ffff,AR 2801:190::,2801:190:fff:ffff:ffff:ffff:ffff:ffff,CO 2801:1a0::,2801:1a0:3f:ffff:ffff:ffff:ffff:ffff,CO 2801:1b0::,2801:1b0:ff:ffff:ffff:ffff:ffff:ffff,CO @@ -6224,6 +10998,7 @@ 2803:200::,2803:200:ffff:ffff:ffff:ffff:ffff:ffff,PA 2803:280::,2803:280:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:300::,2803:300:ffff:ffff:ffff:ffff:ffff:ffff,DO +2803:380::,2803:380:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:400::,2803:400:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:480::,2803:480:ffff:ffff:ffff:ffff:ffff:ffff,EC 2803:500::,2803:500:ffff:ffff:ffff:ffff:ffff:ffff,PE @@ -6231,6 +11006,7 @@ 2803:600::,2803:600:ffff:ffff:ffff:ffff:ffff:ffff,PA 2803:680::,2803:680:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:700::,2803:700:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:780::,2803:780:ffff:ffff:ffff:ffff:ffff:ffff,VE 2803:800::,2803:800:ffff:ffff:ffff:ffff:ffff:ffff,NI 2803:880::,2803:880:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:900::,2803:900:ffff:ffff:ffff:ffff:ffff:ffff,AR @@ -6238,6 +11014,7 @@ 2803:a00::,2803:a00:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:a80::,2803:a80:ffff:ffff:ffff:ffff:ffff:ffff,CO 2803:b00::,2803:b00:ffff:ffff:ffff:ffff:ffff:ffff,EC +2803:b80::,2803:b80:ffff:ffff:ffff:ffff:ffff:ffff,PA 2803:c00::,2803:c00:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:c80::,2803:c80:ffff:ffff:ffff:ffff:ffff:ffff,PY 2803:d00::,2803:d00:ffff:ffff:ffff:ffff:ffff:ffff,GY @@ -6252,13 +11029,14 @@ 2803:1200::,2803:1200:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:1280::,2803:1280:ffff:ffff:ffff:ffff:ffff:ffff,PE 2803:1300::,2803:1300:ffff:ffff:ffff:ffff:ffff:ffff,CR +2803:1380::,2803:1380:ffff:ffff:ffff:ffff:ffff:ffff,HN 2803:1400::,2803:1400:ffff:ffff:ffff:ffff:ffff:ffff,DO -2803:1480::,2803:1480:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:1500::,2803:1500:ffff:ffff:ffff:ffff:ffff:ffff,TT 2803:1580::,2803:1580:ffff:ffff:ffff:ffff:ffff:ffff,CO 2803:1600::,2803:1600:ffff:ffff:ffff:ffff:ffff:ffff,BQ 2803:1680::,2803:1680:ffff:ffff:ffff:ffff:ffff:ffff,GF 2803:1700::,2803:1700:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:1780::,2803:1780:ffff:ffff:ffff:ffff:ffff:ffff,CO 2803:1800::,2803:1800:ffff:ffff:ffff:ffff:ffff:ffff,CO 2803:1880::,2803:1880:ffff:ffff:ffff:ffff:ffff:ffff,PE 2803:1900::,2803:1900:ffff:ffff:ffff:ffff:ffff:ffff,AR @@ -6266,8 +11044,10 @@ 2803:1a00::,2803:1a00:ffff:ffff:ffff:ffff:ffff:ffff,CO 2803:1a80::,2803:1a80:ffff:ffff:ffff:ffff:ffff:ffff,CR 2803:1b00::,2803:1b00:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:1b80::,2803:1b80:ffff:ffff:ffff:ffff:ffff:ffff,TT 2803:1c80::,2803:1c80:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:1d00::,2803:1d00:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:1d80::,2803:1d80:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:1e00::,2803:1e00:ffff:ffff:ffff:ffff:ffff:ffff,NI 2803:1e80::,2803:1e80:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:1f00::,2803:1f00:ffff:ffff:ffff:ffff:ffff:ffff,AR @@ -6278,6 +11058,7 @@ 2803:2200::,2803:2200:ffff:ffff:ffff:ffff:ffff:ffff,EC 2803:2280::,2803:2280:ffff:ffff:ffff:ffff:ffff:ffff,BZ 2803:2300::,2803:2300:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:2380::,2803:2380:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:2400::,2803:2400:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:2480::,2803:2480:ffff:ffff:ffff:ffff:ffff:ffff,PE 2803:2500::,2803:2500:ffff:ffff:ffff:ffff:ffff:ffff,PE @@ -6285,6 +11066,7 @@ 2803:2600::,2803:2600:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:2680::,2803:2680:ffff:ffff:ffff:ffff:ffff:ffff,UY 2803:2700::,2803:2700:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:2780::,2803:2780:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:2800::,2803:2800:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:2880::,2803:2880:ffff:ffff:ffff:ffff:ffff:ffff,BO 2803:2900::,2803:2900:ffff:ffff:ffff:ffff:ffff:ffff,PA @@ -6292,9 +11074,11 @@ 2803:2a00::,2803:2a00:ffff:ffff:ffff:ffff:ffff:ffff,PY 2803:2a80::,2803:2a80:ffff:ffff:ffff:ffff:ffff:ffff,CO 2803:2b00::,2803:2b00:ffff:ffff:ffff:ffff:ffff:ffff,PA +2803:2b80::,2803:2b80:ffff:ffff:ffff:ffff:ffff:ffff,DO 2803:2c00::,2803:2c00:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:2c80::,2803:2c80:ffff:ffff:ffff:ffff:ffff:ffff,VE 2803:2d00::,2803:2d00:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:2d80::,2803:2d80:ffff:ffff:ffff:ffff:ffff:ffff,PA 2803:2e00::,2803:2e00:ffff:ffff:ffff:ffff:ffff:ffff,EC 2803:2e80::,2803:2e80:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:2f00::,2803:2f00:ffff:ffff:ffff:ffff:ffff:ffff,AR @@ -6305,6 +11089,7 @@ 2803:3200::,2803:3200:ffff:ffff:ffff:ffff:ffff:ffff,CR 2803:3280::,2803:3280:ffff:ffff:ffff:ffff:ffff:ffff,GT 2803:3300::,2803:3300:ffff:ffff:ffff:ffff:ffff:ffff,PE +2803:3380::,2803:3380:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:3400::,2803:3400:ffff:ffff:ffff:ffff:ffff:ffff,PA 2803:3480::,2803:3480:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:3500::,2803:3500:ffff:ffff:ffff:ffff:ffff:ffff,AR @@ -6319,9 +11104,11 @@ 2803:3a00::,2803:3a00:ffff:ffff:ffff:ffff:ffff:ffff,GT 2803:3a80::,2803:3a80:ffff:ffff:ffff:ffff:ffff:ffff,HN 2803:3b00::,2803:3b00:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:3b80::,2803:3b80:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:3c00::,2803:3c00:ffff:ffff:ffff:ffff:ffff:ffff,EC 2803:3c80::,2803:3c80:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:3d00::,2803:3d00:ffff:ffff:ffff:ffff:ffff:ffff,BZ +2803:3d80::,2803:3d80:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:3e00::,2803:3e00:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:3e80::,2803:3e80:ffff:ffff:ffff:ffff:ffff:ffff,CO 2803:3f00::,2803:3f00:ffff:ffff:ffff:ffff:ffff:ffff,HN @@ -6332,6 +11119,7 @@ 2803:4200::,2803:4200:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:4280::,2803:4280:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:4300::,2803:4300:ffff:ffff:ffff:ffff:ffff:ffff,PA +2803:4380::,2803:4380:ffff:ffff:ffff:ffff:ffff:ffff,BO 2803:4400::,2803:4400:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:4480::,2803:4480:ffff:ffff:ffff:ffff:ffff:ffff,PE 2803:4500::,2803:4500:ffff:ffff:ffff:ffff:ffff:ffff,CW @@ -6339,6 +11127,7 @@ 2803:4600::,2803:4600:ffff:ffff:ffff:ffff:ffff:ffff,HN 2803:4680::,2803:4680:ffff:ffff:ffff:ffff:ffff:ffff,TT 2803:4700::,2803:4700:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:4780::,2803:4780:ffff:ffff:ffff:ffff:ffff:ffff,PE 2803:4800::,2803:4800:ffff:ffff:ffff:ffff:ffff:ffff,PE 2803:4880::,2803:4880:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:4900::,2803:4900:ffff:ffff:ffff:ffff:ffff:ffff,BQ @@ -6346,6 +11135,7 @@ 2803:4a00::,2803:4a00:ffff:ffff:ffff:ffff:ffff:ffff,CR 2803:4a80::,2803:4a80:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:4b00::,2803:4b00:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:4b80::,2803:4b80:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:4c00::,2803:4c00:ffff:ffff:ffff:ffff:ffff:ffff,EC 2803:4c80::,2803:4c80:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:4d00::,2803:4d00:ffff:ffff:ffff:ffff:ffff:ffff,CL @@ -6360,6 +11150,7 @@ 2803:5200::,2803:5200:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:5280::,2803:5280:ffff:ffff:ffff:ffff:ffff:ffff,DO 2803:5300::,2803:5300:ffff:ffff:ffff:ffff:ffff:ffff,GT +2803:5380::,2803:5380:ffff:ffff:ffff:ffff:ffff:ffff,HN 2803:5400::,2803:5400:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:5480::,2803:5480:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:5500::,2803:5500:ffff:ffff:ffff:ffff:ffff:ffff,AR @@ -6367,15 +11158,18 @@ 2803:5600::,2803:5600:ffff:ffff:ffff:ffff:ffff:ffff,HN 2803:5680::,2803:5680:ffff:ffff:ffff:ffff:ffff:ffff,VE 2803:5700::,2803:5700:ffff:ffff:ffff:ffff:ffff:ffff,BO +2803:5780::,2803:5780:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:5880::,2803:5880:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:5900::,2803:5900:ffff:ffff:ffff:ffff:ffff:ffff,GY +2803:5900::,2803:5900:ffff:ffff:ffff:ffff:ffff:ffff,GF 2803:5980::,2803:5980:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:5a00::,2803:5a00:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:5a80::,2803:5a80:ffff:ffff:ffff:ffff:ffff:ffff,DO 2803:5b00::,2803:5b00:ffff:ffff:ffff:ffff:ffff:ffff,CR +2803:5b80::,2803:5b80:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:5c00::,2803:5c00:ffff:ffff:ffff:ffff:ffff:ffff,BO 2803:5c80::,2803:5c80:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:5d00::,2803:5d00:ffff:ffff:ffff:ffff:ffff:ffff,SV +2803:5d80::,2803:5d80:ffff:ffff:ffff:ffff:ffff:ffff,BZ 2803:5e00::,2803:5e00:ffff:ffff:ffff:ffff:ffff:ffff,BO 2803:5e80::,2803:5e80:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:5f00::,2803:5f00:ffff:ffff:ffff:ffff:ffff:ffff,AR @@ -6386,6 +11180,7 @@ 2803:6200::,2803:6200:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:6280::,2803:6280:ffff:ffff:ffff:ffff:ffff:ffff,PA 2803:6300::,2803:6300:ffff:ffff:ffff:ffff:ffff:ffff,GT +2803:6380::,2803:6380:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:6400::,2803:6400:ffff:ffff:ffff:ffff:ffff:ffff,DO 2803:6480::,2803:6480:ffff:ffff:ffff:ffff:ffff:ffff,BZ 2803:6500::,2803:6500:ffff:ffff:ffff:ffff:ffff:ffff,PE @@ -6393,6 +11188,7 @@ 2803:6600::,2803:6600:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:6680::,2803:6680:ffff:ffff:ffff:ffff:ffff:ffff,VE 2803:6700::,2803:6700:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:6780::,2803:6780:ffff:ffff:ffff:ffff:ffff:ffff,SV 2803:6800::,2803:6800:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:6880::,2803:6880:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:6900::,2803:6900:ffff:ffff:ffff:ffff:ffff:ffff,CR @@ -6400,9 +11196,11 @@ 2803:6a00::,2803:6a00:ffff:ffff:ffff:ffff:ffff:ffff,EC 2803:6a80::,2803:6a80:ffff:ffff:ffff:ffff:ffff:ffff,NI 2803:6b00::,2803:6b00:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:6b80::,2803:6b80:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:6c00::,2803:6c00:ffff:ffff:ffff:ffff:ffff:ffff,HN 2803:6c80::,2803:6c80:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:6d00::,2803:6d00:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:6d80::,2803:6d80:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:6e00::,2803:6e00:ffff:ffff:ffff:ffff:ffff:ffff,SR 2803:6e80::,2803:6e80:ffff:ffff:ffff:ffff:ffff:ffff,HN 2803:6f00::,2803:6f00:ffff:ffff:ffff:ffff:ffff:ffff,CL @@ -6413,6 +11211,7 @@ 2803:7200::,2803:7200:ffff:ffff:ffff:ffff:ffff:ffff,HN 2803:7280::,2803:7280:ffff:ffff:ffff:ffff:ffff:ffff,PA 2803:7300::,2803:7300:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:7380::,2803:7380:ffff:ffff:ffff:ffff:ffff:ffff,SX 2803:7400::,2803:7400:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:7480::,2803:7480:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:7500::,2803:7500:ffff:ffff:ffff:ffff:ffff:ffff,CL @@ -6427,9 +11226,11 @@ 2803:7a00::,2803:7a00:ffff:ffff:ffff:ffff:ffff:ffff,CR 2803:7a80::,2803:7a80:ffff:ffff:ffff:ffff:ffff:ffff,CR 2803:7b00::,2803:7b00:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:7b80::,2803:7b80:ffff:ffff:ffff:ffff:ffff:ffff,PE 2803:7c00::,2803:7c00:ffff:ffff:ffff:ffff:ffff:ffff,CR 2803:7c80::,2803:7c80:ffff:ffff:ffff:ffff:ffff:ffff,PA 2803:7d00::,2803:7d00:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:7d80::,2803:7d80:ffff:ffff:ffff:ffff:ffff:ffff,PY 2803:7e00::,2803:7e00:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:7e80::,2803:7e80:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:7f00::,2803:7f00:ffff:ffff:ffff:ffff:ffff:ffff,CO @@ -6440,6 +11241,7 @@ 2803:8200::,2803:8200:ffff:ffff:ffff:ffff:ffff:ffff,HN 2803:8280::,2803:8280:ffff:ffff:ffff:ffff:ffff:ffff,VE 2803:8300::,2803:8300:ffff:ffff:ffff:ffff:ffff:ffff,EC +2803:8380::,2803:8380:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:8400::,2803:8400:ffff:ffff:ffff:ffff:ffff:ffff,CO 2803:8480::,2803:8480:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:8500::,2803:8500:ffff:ffff:ffff:ffff:ffff:ffff,AR @@ -6447,13 +11249,14 @@ 2803:8600::,2803:8600:ffff:ffff:ffff:ffff:ffff:ffff,HT 2803:8680::,2803:8680:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:8700::,2803:8700:ffff:ffff:ffff:ffff:ffff:ffff,CR +2803:8780::,2803:8780:ffff:ffff:ffff:ffff:ffff:ffff,BZ 2803:8800::,2803:8800:ffff:ffff:ffff:ffff:ffff:ffff,CR 2803:8880::,2803:8880:ffff:ffff:ffff:ffff:ffff:ffff,NI 2803:8900::,2803:8900:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:8980::,2803:8980:ffff:ffff:ffff:ffff:ffff:ffff,CO -2803:8a00::,2803:8a00:ffff:ffff:ffff:ffff:ffff:ffff,EC 2803:8a80::,2803:8a80:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:8b00::,2803:8b00:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:8b80::,2803:8b80:ffff:ffff:ffff:ffff:ffff:ffff,CO 2803:8c00::,2803:8c00:ffff:ffff:ffff:ffff:ffff:ffff,BZ 2803:8c80::,2803:8c80:ffff:ffff:ffff:ffff:ffff:ffff,PA 2803:8d00::,2803:8d00:ffff:ffff:ffff:ffff:ffff:ffff,AR @@ -6468,6 +11271,7 @@ 2803:9200::,2803:9200:ffff:ffff:ffff:ffff:ffff:ffff,SV 2803:9280::,2803:9280:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:9300::,2803:9300:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:9380::,2803:9380:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:9400::,2803:9400:ffff:ffff:ffff:ffff:ffff:ffff,BO 2803:9480::,2803:9480:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:9500::,2803:9500:ffff:ffff:ffff:ffff:ffff:ffff,AR @@ -6475,6 +11279,7 @@ 2803:9600::,2803:9600:ffff:ffff:ffff:ffff:ffff:ffff,CW 2803:9680::,2803:9680:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:9700::,2803:9700:ffff:ffff:ffff:ffff:ffff:ffff,EC +2803:9780::,2803:9780:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:9800::,2803:9800:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:9880::,2803:9880:ffff:ffff:ffff:ffff:ffff:ffff,BZ 2803:9900::,2803:9900:ffff:ffff:ffff:ffff:ffff:ffff,CL @@ -6482,9 +11287,11 @@ 2803:9a00::,2803:9a00:ffff:ffff:ffff:ffff:ffff:ffff,BZ 2803:9a80::,2803:9a80:ffff:ffff:ffff:ffff:ffff:ffff,CO 2803:9b00::,2803:9b00:ffff:ffff:ffff:ffff:ffff:ffff,DO +2803:9b80::,2803:9b80:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:9c00::,2803:9c00:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:9c80::,2803:9c80:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:9d00::,2803:9d00:ffff:ffff:ffff:ffff:ffff:ffff,SV +2803:9d80::,2803:9d80:ffff:ffff:ffff:ffff:ffff:ffff,SV 2803:9e00::,2803:9e00:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:9e80::,2803:9e80:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:9f00::,2803:9f00:ffff:ffff:ffff:ffff:ffff:ffff,AR @@ -6495,6 +11302,7 @@ 2803:a200::,2803:a200:ffff:ffff:ffff:ffff:ffff:ffff,SR 2803:a280::,2803:a280:ffff:ffff:ffff:ffff:ffff:ffff,DO 2803:a300::,2803:a300:ffff:ffff:ffff:ffff:ffff:ffff,BZ +2803:a380::,2803:a380:ffff:ffff:ffff:ffff:ffff:ffff,PA 2803:a400::,2803:a400:ffff:ffff:ffff:ffff:ffff:ffff,EC 2803:a480::,2803:a480:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:a500::,2803:a500:ffff:ffff:ffff:ffff:ffff:ffff,AR @@ -6502,6 +11310,7 @@ 2803:a600::,2803:a600:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:a680::,2803:a680:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:a700::,2803:a700:ffff:ffff:ffff:ffff:ffff:ffff,HN +2803:a780::,2803:a780:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:a800::,2803:a800:ffff:ffff:ffff:ffff:ffff:ffff,CR 2803:a880::,2803:a880:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:a900::,2803:a900:ffff:ffff:ffff:ffff:ffff:ffff,AR @@ -6509,9 +11318,11 @@ 2803:aa00::,2803:aa00:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:aa80::,2803:aa80:ffff:ffff:ffff:ffff:ffff:ffff,CR 2803:ab00::,2803:ab00:ffff:ffff:ffff:ffff:ffff:ffff,DO +2803:ab80::,2803:ab80:ffff:ffff:ffff:ffff:ffff:ffff,PE 2803:ac00::,2803:ac00:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:ac80::,2803:ac80:ffff:ffff:ffff:ffff:ffff:ffff,CO 2803:ad00::,2803:ad00:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:ad80::,2803:ad80:ffff:ffff:ffff:ffff:ffff:ffff,PA 2803:ae00::,2803:ae00:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:ae80::,2803:ae80:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:af00::,2803:af00:ffff:ffff:ffff:ffff:ffff:ffff,AR @@ -6522,6 +11333,7 @@ 2803:b200::,2803:b200:ffff:ffff:ffff:ffff:ffff:ffff,UY 2803:b280::,2803:b280:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:b300::,2803:b300:ffff:ffff:ffff:ffff:ffff:ffff,PY +2803:b380::,2803:b380:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:b400::,2803:b400:ffff:ffff:ffff:ffff:ffff:ffff,VE 2803:b480::,2803:b480:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:b500::,2803:b500:ffff:ffff:ffff:ffff:ffff:ffff,VE @@ -6536,9 +11348,11 @@ 2803:ba00::,2803:ba00:ffff:ffff:ffff:ffff:ffff:ffff,GT 2803:ba80::,2803:ba80:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:bb00::,2803:bb00:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:bb80::,2803:bb80:ffff:ffff:ffff:ffff:ffff:ffff,VE 2803:bc00::,2803:bc00:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:bc80::,2803:bc80:ffff:ffff:ffff:ffff:ffff:ffff,CO 2803:bd00::,2803:bd00:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:bd80::,2803:bd80:ffff:ffff:ffff:ffff:ffff:ffff,PA 2803:be00::,2803:be00:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:be80::,2803:be80:ffff:ffff:ffff:ffff:ffff:ffff,CO 2803:bf00::,2803:bf00:ffff:ffff:ffff:ffff:ffff:ffff,AR @@ -6549,6 +11363,7 @@ 2803:c200::,2803:c200:ffff:ffff:ffff:ffff:ffff:ffff,PE 2803:c280::,2803:c280:ffff:ffff:ffff:ffff:ffff:ffff,EC 2803:c300::,2803:c300:ffff:ffff:ffff:ffff:ffff:ffff,GT +2803:c380::,2803:c380:ffff:ffff:ffff:ffff:ffff:ffff,HN 2803:c400::,2803:c400:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:c480::,2803:c480:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:c500::,2803:c500:ffff:ffff:ffff:ffff:ffff:ffff,AR @@ -6556,6 +11371,7 @@ 2803:c600::,2803:c600:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:c680::,2803:c680:ffff:ffff:ffff:ffff:ffff:ffff,HT 2803:c700::,2803:c700:ffff:ffff:ffff:ffff:ffff:ffff,GF +2803:c780::,2803:c780:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:c800::,2803:c800:ffff:ffff:ffff:ffff:ffff:ffff,GT 2803:c880::,2803:c880:ffff:ffff:ffff:ffff:ffff:ffff,HN 2803:c900::,2803:c900:ffff:ffff:ffff:ffff:ffff:ffff,AR @@ -6563,9 +11379,11 @@ 2803:ca00::,2803:ca00:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:ca80::,2803:ca80:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:cb00::,2803:cb00:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:cb80::,2803:cb80:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:cc00::,2803:cc00:ffff:ffff:ffff:ffff:ffff:ffff,CO 2803:cc80::,2803:cc80:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:cd00::,2803:cd00:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:cd80::,2803:cd80:ffff:ffff:ffff:ffff:ffff:ffff,TT 2803:ce00::,2803:ce00:ffff:ffff:ffff:ffff:ffff:ffff,HN 2803:ce80::,2803:ce80:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:cf00::,2803:cf00:ffff:ffff:ffff:ffff:ffff:ffff,AR @@ -6576,6 +11394,7 @@ 2803:d200::,2803:d200:ffff:ffff:ffff:ffff:ffff:ffff,CR 2803:d280::,2803:d280:ffff:ffff:ffff:ffff:ffff:ffff,PY 2803:d300::,2803:d300:ffff:ffff:ffff:ffff:ffff:ffff,PA +2803:d380::,2803:d380:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:d400::,2803:d400:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:d480::,2803:d480:ffff:ffff:ffff:ffff:ffff:ffff,VE 2803:d500::,2803:d500:ffff:ffff:ffff:ffff:ffff:ffff,BZ @@ -6590,9 +11409,11 @@ 2803:da00::,2803:da00:ffff:ffff:ffff:ffff:ffff:ffff,GY 2803:da80::,2803:da80:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:db00::,2803:db00:ffff:ffff:ffff:ffff:ffff:ffff,HN +2803:db80::,2803:db80:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:dc00::,2803:dc00:ffff:ffff:ffff:ffff:ffff:ffff,CO 2803:dc80::,2803:dc80:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:dd00::,2803:dd00:ffff:ffff:ffff:ffff:ffff:ffff,PA +2803:dd80::,2803:dd80:ffff:ffff:ffff:ffff:ffff:ffff,VE 2803:de00::,2803:de00:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:de80::,2803:de80:ffff:ffff:ffff:ffff:ffff:ffff,CO 2803:df00::,2803:df00:ffff:ffff:ffff:ffff:ffff:ffff,SV @@ -6603,6 +11424,7 @@ 2803:e200::,2803:e200:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:e280::,2803:e280:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:e300::,2803:e300:ffff:ffff:ffff:ffff:ffff:ffff,CR +2803:e380::,2803:e380:ffff:ffff:ffff:ffff:ffff:ffff,HN 2803:e400::,2803:e400:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:e480::,2803:e480:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:e500::,2803:e500:ffff:ffff:ffff:ffff:ffff:ffff,PE @@ -6610,6 +11432,7 @@ 2803:e600::,2803:e600:ffff:ffff:ffff:ffff:ffff:ffff,PA 2803:e680::,2803:e680:ffff:ffff:ffff:ffff:ffff:ffff,HN 2803:e700::,2803:e700:ffff:ffff:ffff:ffff:ffff:ffff,HN +2803:e780::,2803:e780:ffff:ffff:ffff:ffff:ffff:ffff,PY 2803:e800::,2803:e800:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:e880::,2803:e880:ffff:ffff:ffff:ffff:ffff:ffff,GT 2803:e900::,2803:e900:ffff:ffff:ffff:ffff:ffff:ffff,AR @@ -6617,9 +11440,10 @@ 2803:ea00::,2803:ea00:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:ea80::,2803:ea80:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:eb00::,2803:eb00:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:ec00::,2803:ec00:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:eb80::,2803:eb80:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:ec80::,2803:ec80:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:ed00::,2803:ed00:ffff:ffff:ffff:ffff:ffff:ffff,PE +2803:ed80::,2803:ed80:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:ee00::,2803:ee00:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:ee80::,2803:ee80:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:ef00::,2803:ef00:ffff:ffff:ffff:ffff:ffff:ffff,PA @@ -6630,6 +11454,7 @@ 2803:f200::,2803:f200:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:f280::,2803:f280:ffff:ffff:ffff:ffff:ffff:ffff,DO 2803:f300::,2803:f300:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:f380::,2803:f380:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:f400::,2803:f400:ffff:ffff:ffff:ffff:ffff:ffff,HN 2803:f480::,2803:f480:ffff:ffff:ffff:ffff:ffff:ffff,CO 2803:f500::,2803:f500:ffff:ffff:ffff:ffff:ffff:ffff,CW @@ -6644,8 +11469,11 @@ 2803:fa00::,2803:fa00:ffff:ffff:ffff:ffff:ffff:ffff,BO 2803:fa80::,2803:fa80:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:fb00::,2803:fb00:ffff:ffff:ffff:ffff:ffff:ffff,PA +2803:fb80::,2803:fb80:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:fc00::,2803:fc00:ffff:ffff:ffff:ffff:ffff:ffff,PY 2803:fc80::,2803:fc80:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:fd00::,2803:fd00:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:fd80::,2803:fd80:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:fe00::,2803:fe00:ffff:ffff:ffff:ffff:ffff:ffff,CO 2803:fe80::,2803:fe80:ffff:ffff:ffff:ffff:ffff:ffff,PE 2803:ff00::,2803:ff00:ffff:ffff:ffff:ffff:ffff:ffff,AR @@ -7050,7 +11878,6 @@ 2804:670::,2804:670:ffff:ffff:ffff:ffff:ffff:ffff,BR 2804:674::,2804:674:ffff:ffff:ffff:ffff:ffff:ffff,BR 2804:678::,2804:678:ffff:ffff:ffff:ffff:ffff:ffff,BR -2804:67c::,2804:67c:ffff:ffff:ffff:ffff:ffff:ffff,BR 2804:680::,2804:680:ffff:ffff:ffff:ffff:ffff:ffff,BR 2804:684::,2804:684:ffff:ffff:ffff:ffff:ffff:ffff,BR 2804:688::,2804:688:ffff:ffff:ffff:ffff:ffff:ffff,BR @@ -8381,15 +13208,326 @@ 2804:1b78::,2804:1b78:ffff:ffff:ffff:ffff:ffff:ffff,BR 2804:1b7c::,2804:1b7c:ffff:ffff:ffff:ffff:ffff:ffff,BR 2804:1b80::,2804:1b80:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1b84::,2804:1b84:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1b88::,2804:1b88:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1b8c::,2804:1b8c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1b90::,2804:1b90:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1b94::,2804:1b94:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1b98::,2804:1b98:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1b9c::,2804:1b9c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1ba0::,2804:1ba0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1ba4::,2804:1ba4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1ba8::,2804:1ba8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1bac::,2804:1bac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1bb0::,2804:1bb0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1bb4::,2804:1bb4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1bb8::,2804:1bb8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1bbc::,2804:1bbc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1bc0::,2804:1bc0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1bc4::,2804:1bc4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1bc8::,2804:1bc8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1bcc::,2804:1bcc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1bd0::,2804:1bd0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1bd4::,2804:1bd4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1bd8::,2804:1bd8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1bdc::,2804:1bdc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1be0::,2804:1be0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1be4::,2804:1be4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1be8::,2804:1be8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1bec::,2804:1bec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1bf0::,2804:1bf0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1bf4::,2804:1bf4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1bf8::,2804:1bf8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1bfc::,2804:1bfc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c00::,2804:1c00:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c04::,2804:1c04:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c08::,2804:1c08:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c0c::,2804:1c0c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c10::,2804:1c10:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c14::,2804:1c14:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c18::,2804:1c18:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c1c::,2804:1c1c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c20::,2804:1c20:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c24::,2804:1c24:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c28::,2804:1c28:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c2c::,2804:1c2c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c30::,2804:1c30:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c34::,2804:1c34:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c38::,2804:1c38:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c3c::,2804:1c3c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c40::,2804:1c40:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c44::,2804:1c44:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c48::,2804:1c48:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c4c::,2804:1c4c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c50::,2804:1c50:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c54::,2804:1c54:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c58::,2804:1c58:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c5c::,2804:1c5c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c60::,2804:1c60:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c64::,2804:1c64:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c68::,2804:1c68:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c6c::,2804:1c6c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c70::,2804:1c70:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c74::,2804:1c74:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c78::,2804:1c78:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c7c::,2804:1c7c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c80::,2804:1c80:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c84::,2804:1c84:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c88::,2804:1c88:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c8c::,2804:1c8c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c90::,2804:1c90:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c94::,2804:1c94:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c98::,2804:1c98:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1c9c::,2804:1c9c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1ca0::,2804:1ca0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1ca4::,2804:1ca4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1ca8::,2804:1ca8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1cac::,2804:1cac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1cb0::,2804:1cb0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1cb4::,2804:1cb4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1cb8::,2804:1cb8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1cbc::,2804:1cbc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1cc0::,2804:1cc0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1cc4::,2804:1cc4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1cc8::,2804:1cc8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1ccc::,2804:1ccc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1cd0::,2804:1cd0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1cd4::,2804:1cd4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1cd8::,2804:1cd8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1cdc::,2804:1cdc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1ce0::,2804:1ce0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1ce4::,2804:1ce4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1ce8::,2804:1ce8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1cec::,2804:1cec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1cf0::,2804:1cf0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1cf4::,2804:1cf4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1cf8::,2804:1cf8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1cfc::,2804:1cfc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1d00::,2804:1d00:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1d04::,2804:1d04:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1d08::,2804:1d08:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1d0c::,2804:1d0c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1d10::,2804:1d10:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1d14::,2804:1d14:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1d18::,2804:1d18:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1d1c::,2804:1d1c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1d20::,2804:1d20:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1d24::,2804:1d24:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1d28::,2804:1d28:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1d2c::,2804:1d2c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1d30::,2804:1d30:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1d34::,2804:1d34:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1d38::,2804:1d38:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1d3c::,2804:1d3c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1d40::,2804:1d40:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1d44::,2804:1d44:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1d48::,2804:1d48:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1d4c::,2804:1d4c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1d50::,2804:1d50:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1d54::,2804:1d54:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1d58::,2804:1d58:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1d5c::,2804:1d5c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1d60::,2804:1d60:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1d64::,2804:1d64:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1d68::,2804:1d68:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1d6c::,2804:1d6c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1d70::,2804:1d70:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1d74::,2804:1d74:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1d78::,2804:1d78:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1d7c::,2804:1d7c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1d80::,2804:1d80:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1d84::,2804:1d84:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1d88::,2804:1d88:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1d8c::,2804:1d8c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1d90::,2804:1d90:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1d94::,2804:1d94:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1d98::,2804:1d98:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1d9c::,2804:1d9c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1da0::,2804:1da0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1da4::,2804:1da4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1da8::,2804:1da8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1dac::,2804:1dac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1db0::,2804:1db0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1db4::,2804:1db4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1db8::,2804:1db8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1dbc::,2804:1dbc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1dc0::,2804:1dc0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1dc4::,2804:1dc4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1dc8::,2804:1dc8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1dcc::,2804:1dcc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1dd0::,2804:1dd0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1dd4::,2804:1dd4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1dd8::,2804:1dd8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1ddc::,2804:1ddc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1de0::,2804:1de0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1de4::,2804:1de4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1de8::,2804:1de8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1dec::,2804:1dec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1df0::,2804:1df0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1df4::,2804:1df4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1df8::,2804:1df8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1dfc::,2804:1dfc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e00::,2804:1e00:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e04::,2804:1e04:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e08::,2804:1e08:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e0c::,2804:1e0c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e10::,2804:1e10:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e14::,2804:1e14:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e18::,2804:1e18:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e1c::,2804:1e1c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e20::,2804:1e20:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e24::,2804:1e24:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e28::,2804:1e28:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e2c::,2804:1e2c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e30::,2804:1e30:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e34::,2804:1e34:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e38::,2804:1e38:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e3c::,2804:1e3c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e40::,2804:1e40:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e44::,2804:1e44:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e48::,2804:1e48:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e4c::,2804:1e4c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e50::,2804:1e50:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e54::,2804:1e54:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e58::,2804:1e58:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e5c::,2804:1e5c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e60::,2804:1e60:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e64::,2804:1e64:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e68::,2804:1e68:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e6c::,2804:1e6c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e70::,2804:1e70:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e74::,2804:1e74:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e78::,2804:1e78:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e7c::,2804:1e7c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e80::,2804:1e80:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e84::,2804:1e84:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e88::,2804:1e88:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e8c::,2804:1e8c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e90::,2804:1e90:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e94::,2804:1e94:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e98::,2804:1e98:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1e9c::,2804:1e9c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1ea0::,2804:1ea0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1ea4::,2804:1ea4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1ea8::,2804:1ea8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1eac::,2804:1eac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1eb0::,2804:1eb0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1eb4::,2804:1eb4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1eb8::,2804:1eb8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1ebc::,2804:1ebc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1ec0::,2804:1ec0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1ec4::,2804:1ec4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1ec8::,2804:1ec8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1ecc::,2804:1ecc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1ed0::,2804:1ed0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1ed4::,2804:1ed4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1ed8::,2804:1ed8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1edc::,2804:1edc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1ee0::,2804:1ee0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1ee4::,2804:1ee4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1ee8::,2804:1ee8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1eec::,2804:1eec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1ef0::,2804:1ef0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1ef4::,2804:1ef4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1ef8::,2804:1ef8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1efc::,2804:1efc:ffff:ffff:ffff:ffff:ffff:ffff,BR 2804:1f00::,2804:1f00:ffff:ffff:ffff:ffff:ffff:ffff,BR 2804:1f02::,2804:1f02:ffff:ffff:ffff:ffff:ffff:ffff,BR 2804:1f04::,2804:1f04:ffff:ffff:ffff:ffff:ffff:ffff,BR 2804:1f06::,2804:1f06:ffff:ffff:ffff:ffff:ffff:ffff,BR 2804:1f08::,2804:1f08:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1f0a::,2804:1f0a:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1f0c::,2804:1f0c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1f0e::,2804:1f0e:1fff:ffff:ffff:ffff:ffff:ffff,BR +2804:2000::,2804:2000:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2004::,2804:2004:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2008::,2804:2008:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:200c::,2804:200c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2010::,2804:2010:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2014::,2804:2014:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2018::,2804:2018:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:201c::,2804:201c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2020::,2804:2020:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2024::,2804:2024:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2028::,2804:2028:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:202c::,2804:202c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2030::,2804:2030:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2034::,2804:2034:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2038::,2804:2038:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:203c::,2804:203c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2040::,2804:2040:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2044::,2804:2044:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2048::,2804:2048:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:204c::,2804:204c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2050::,2804:2050:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2054::,2804:2054:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2058::,2804:2058:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:205c::,2804:205c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2060::,2804:2060:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2064::,2804:2064:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2068::,2804:2068:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:206c::,2804:206c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2070::,2804:2070:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2074::,2804:2074:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2078::,2804:2078:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:207c::,2804:207c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2080::,2804:2080:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2084::,2804:2084:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2088::,2804:2088:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:208c::,2804:208c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2090::,2804:2090:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2094::,2804:2094:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2098::,2804:2098:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:209c::,2804:209c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:20a0::,2804:20a0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:20a4::,2804:20a4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:20a8::,2804:20a8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:20ac::,2804:20ac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:20b0::,2804:20b0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:20b4::,2804:20b4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:20b8::,2804:20b8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:20bc::,2804:20bc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:20c0::,2804:20c0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:20c4::,2804:20c4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:20c8::,2804:20c8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:20cc::,2804:20cc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:20d0::,2804:20d0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:20d4::,2804:20d4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:20d8::,2804:20d8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:20dc::,2804:20dc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:20e0::,2804:20e0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:20e4::,2804:20e4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:20e8::,2804:20e8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:20ec::,2804:20ec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:20f0::,2804:20f0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:20f4::,2804:20f4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:20f8::,2804:20f8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:20fc::,2804:20fc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2100::,2804:2100:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2104::,2804:2104:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2108::,2804:2108:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:210c::,2804:210c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2110::,2804:2110:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2114::,2804:2114:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2118::,2804:2118:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:211c::,2804:211c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2120::,2804:2120:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2124::,2804:2124:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2128::,2804:2128:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:212c::,2804:212c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2130::,2804:2130:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2134::,2804:2134:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2138::,2804:2138:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:213c::,2804:213c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2140::,2804:2140:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2144::,2804:2144:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2148::,2804:2148:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:214c::,2804:214c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:2150::,2804:2150:ffff:ffff:ffff:ffff:ffff:ffff,BR 2806::,2806:f:ffff:ffff:ffff:ffff:ffff:ffff,MX 2806:200::,2806:200:ffff:ffff:ffff:ffff:ffff:ffff,MX 2806:210::,2806:216::ffff:ffff:ffff:ffff:ffff,MX -2806:217::,2806:218:ffff:ffff:ffff:ffff:ffff:ffff,MX +2806:217::,2806:21c:ffff:ffff:ffff:ffff:ffff:ffff,MX 2806:220::,2806:220:ffff:ffff:ffff:ffff:ffff:ffff,MX 2806:230::,2806:230:ffff:ffff:ffff:ffff:ffff:ffff,MX 2806:238::,2806:238::ffff:ffff:ffff:ffff:ffff,MX @@ -8481,7 +13619,6 @@ 2a00:e10::,2a00:e10:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a00:e18::,2a00:e18:ffff:ffff:ffff:ffff:ffff:ffff,NO 2a00:e20::,2a00:e20:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:e28::,2a00:e28:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a00:e30::,2a00:e30:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a00:e38::,2a00:e38:ffff:ffff:ffff:ffff:ffff:ffff,BE 2a00:e40::,2a00:e40:ffff:ffff:ffff:ffff:ffff:ffff,BG @@ -8545,7 +13682,6 @@ 2a00:1020::,2a00:1020:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a00:1028::,2a00:1028:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a00:1030::,2a00:1030:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:1038::,2a00:1038:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a00:1040::,2a00:1040:ffff:ffff:ffff:ffff:ffff:ffff,DK 2a00:1048::,2a00:1048:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a00:1050::,2a00:1050:ffff:ffff:ffff:ffff:ffff:ffff,DE @@ -8793,7 +13929,7 @@ 2a00:1878::,2a00:1878:ffff:ffff:ffff:ffff:ffff:ffff,HU 2a00:1880::,2a00:1880:ffff:ffff:ffff:ffff:ffff:ffff,TR 2a00:1888::,2a00:1888:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:1890::,2a00:1890:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:1890::,2a00:1897:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a00:1898::,2a00:1898:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a00:18a0::,2a00:18a0:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a00:18a8::,2a00:18a8:ffff:ffff:ffff:ffff:ffff:ffff,FR @@ -8809,7 +13945,7 @@ 2a00:18f8::,2a00:18f8:ffff:ffff:ffff:ffff:ffff:ffff,SA 2a00:1900::,2a00:1900:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a00:1908::,2a00:1908:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a00:1910::,2a00:1910:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:1910::,2a00:1917:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a00:1918::,2a00:191f:ffff:ffff:ffff:ffff:ffff:ffff,SA 2a00:1920::,2a00:1920:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a00:1928::,2a00:1928:ffff:ffff:ffff:ffff:ffff:ffff,DE @@ -9113,7 +14249,7 @@ 2a00:4a80::,2a00:4a80:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a00:4aa0::,2a00:4aa0:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a00:4ac0::,2a00:4ac0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a00:4ae0::,2a00:4ae0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:4ae0::,2a00:4ae7:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a00:4b00::,2a00:4b00:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a00:4b40::,2a00:4b40:ffff:ffff:ffff:ffff:ffff:ffff,SK 2a00:4b60::,2a00:4b60:ffff:ffff:ffff:ffff:ffff:ffff,CY @@ -9124,7 +14260,6 @@ 2a00:4c00::,2a00:4c00:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a00:4c20::,2a00:4c20:ffff:ffff:ffff:ffff:ffff:ffff,LT 2a00:4c40::,2a00:4c40:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:4c60::,2a00:4c60:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a00:4c80::,2a00:4c87:ffff:ffff:ffff:ffff:ffff:ffff,PT 2a00:4ca0::,2a00:4ca0:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a00:4cc0::,2a00:4cc7:ffff:ffff:ffff:ffff:ffff:ffff,FI @@ -9240,7 +14375,7 @@ 2a00:5b40::,2a00:5b40:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a00:5b60::,2a00:5b60:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a00:5b80::,2a00:5b87:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:5ba0::,2a00:5ba0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:5ba0::,2a00:5ba7:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a00:5bc0::,2a00:5bc0:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a00:5be0::,2a00:5be0:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a00:5c00::,2a00:5c00:ffff:ffff:ffff:ffff:ffff:ffff,ES @@ -9285,7 +14420,7 @@ 2a00:6140::,2a00:6140:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a00:6160::,2a00:6160:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a00:6180::,2a00:6180:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a00:61a0::,2a00:61a0:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a00:61a0::,2a00:61a7:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a00:61c0::,2a00:61c7:ffff:ffff:ffff:ffff:ffff:ffff,RS 2a00:61e0::,2a00:61e0:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a00:6200::,2a00:6200:ffff:ffff:ffff:ffff:ffff:ffff,FR @@ -9322,8 +14457,7 @@ 2a00:65e0::,2a00:65e0:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a00:6600::,2a00:6600:ffff:ffff:ffff:ffff:ffff:ffff,BH 2a00:6620::,2a00:6620:ffff:ffff:ffff:ffff:ffff:ffff,GR -2a00:6640::,2a00:6640:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:6660::,2a00:6660:ffff:ffff:ffff:ffff:ffff:ffff,LV +2a00:6640::,2a00:6647:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a00:6680::,2a00:6680:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a00:66a0::,2a00:66a0:ffff:ffff:ffff:ffff:ffff:ffff,IL 2a00:66e0::,2a00:66e0:ffff:ffff:ffff:ffff:ffff:ffff,TR @@ -9402,7 +14536,9 @@ 2a00:70e0::,2a00:70e0:ffff:ffff:ffff:ffff:ffff:ffff,UA 2a00:7100::,2a00:7100:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a00:7120::,2a00:7120:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a00:7140::,2a00:7147:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:7140::,2a00:7143:ff:ffff:ffff:ffff:ffff:ffff,NL +2a00:7143:100::,2a00:7143:100:ffff:ffff:ffff:ffff:ffff,US +2a00:7143:101::,2a00:7147:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a00:7160::,2a00:7160:ffff:ffff:ffff:ffff:ffff:ffff,KG 2a00:7180::,2a00:7180:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a00:71a0::,2a00:71a0:ffff:ffff:ffff:ffff:ffff:ffff,BA @@ -9444,7 +14580,7 @@ 2a00:7660::,2a00:7660:ffff:ffff:ffff:ffff:ffff:ffff,DK 2a00:7680::,2a00:7680:ffff:ffff:ffff:ffff:ffff:ffff,SA 2a00:76a0::,2a00:76a0:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a00:76c0::,2a00:76c0:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a00:76c0::,2a00:76c7:ffff:ffff:ffff:ffff:ffff:ffff,IR 2a00:76e0::,2a00:76e0:ffff:ffff:ffff:ffff:ffff:ffff,JO 2a00:7700::,2a00:7700:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a00:7720::,2a00:7720:ffff:ffff:ffff:ffff:ffff:ffff,ES @@ -9529,7 +14665,7 @@ 2a00:81e0::,2a00:81e0:ffff:ffff:ffff:ffff:ffff:ffff,LV 2a00:8200::,2a00:8200:ffff:ffff:ffff:ffff:ffff:ffff,DK 2a00:8220::,2a00:8220:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a00:8240::,2a00:8240:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:8240::,2a00:8247:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a00:8260::,2a00:8260:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a00:8280::,2a00:8280:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a00:82a0::,2a00:82a0:ffff:ffff:ffff:ffff:ffff:ffff,BG @@ -9691,7 +14827,7 @@ 2a00:97a0::,2a00:97a0:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a00:97c0::,2a00:97c0:ffff:ffff:ffff:ffff:ffff:ffff,NO 2a00:97e0::,2a00:97e0:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a00:9800::,2a00:9800:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:9800::,2a00:9801:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a00:9820::,2a00:9820:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a00:9840::,2a00:9840:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a00:9860::,2a00:9860:ffff:ffff:ffff:ffff:ffff:ffff,HR @@ -9806,7 +14942,6 @@ 2a00:a6a0::,2a00:a6a0:ffff:ffff:ffff:ffff:ffff:ffff,AT 2a00:a6c0::,2a00:a6c0:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a00:a6e0::,2a00:a6e0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:a700::,2a00:a700:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a00:a720::,2a00:a720:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a00:a740::,2a00:a740:ffff:ffff:ffff:ffff:ffff:ffff,IE 2a00:a760::,2a00:a760:ffff:ffff:ffff:ffff:ffff:ffff,SE @@ -9852,7 +14987,7 @@ 2a00:ace0::,2a00:ace0:ffff:ffff:ffff:ffff:ffff:ffff,BE 2a00:ad00::,2a00:ad00:ffff:ffff:ffff:ffff:ffff:ffff,RS 2a00:ad20::,2a00:ad20:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:ad40::,2a00:ad40:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:ad40::,2a00:ad47:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a00:ad60::,2a00:ad60:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a00:ad80::,2a00:ad87:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a00:adc0::,2a00:adc0:ffff:ffff:ffff:ffff:ffff:ffff,CH @@ -9922,7 +15057,6 @@ 2a00:b640::,2a00:b640:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a00:b660::,2a00:b660:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a00:b680::,2a00:b680:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a00:b6a0::,2a00:b6a0:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a00:b6c0::,2a00:b6c0:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a00:b6e0::,2a00:b6e0:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a00:b700::,2a00:b700:ffff:ffff:ffff:ffff:ffff:ffff,RU @@ -9982,7 +15116,7 @@ 2a00:bde0::,2a00:bde0:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a00:be00::,2a00:be00:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a00:be20::,2a00:be20:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:be40::,2a00:be40:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a00:be40::,2a00:be47:ffff:ffff:ffff:ffff:ffff:ffff,NO 2a00:be60::,2a00:be60:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a00:be80::,2a00:be80:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a00:bea0::,2a00:bea0:ffff:ffff:ffff:ffff:ffff:ffff,AE @@ -10001,10 +15135,16 @@ 2a00:c0a0::,2a00:c0a0:ffff:ffff:ffff:ffff:ffff:ffff,AZ 2a00:c0c0::,2a00:c0c0:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a00:c0e0::,2a00:c0e0:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a00:c100::,2a00:c1ff:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:c100::,2a00:c100:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a00:c120::,2a00:c120:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:c140::,2a00:c140:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:c160::,2a00:c160:ffff:ffff:ffff:ffff:ffff:ffff,AL +2a00:c180::,2a00:c180:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a00:c1a0::,2a00:c1a0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:c1c0::,2a00:c1c0:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a00:c1e0::,2a00:c1e7:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a00:c200::,2a00:c200:ffff:ffff:ffff:ffff:ffff:ffff,UA 2a00:c220::,2a00:c220:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:c240::,2a00:c240:ffff:ffff:ffff:ffff:ffff:ffff,AE 2a00:c260::,2a00:c260:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a00:c280::,2a00:c280:ffff:ffff:ffff:ffff:ffff:ffff,IL 2a00:c2a0::,2a00:c2a0:ffff:ffff:ffff:ffff:ffff:ffff,GB @@ -10059,7 +15199,7 @@ 2a00:c920::,2a00:c920:ffff:ffff:ffff:ffff:ffff:ffff,BE 2a00:c940::,2a00:c940:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a00:c960::,2a00:c960:ffff:ffff:ffff:ffff:ffff:ffff,GR -2a00:c980::,2a00:c980:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:c980::,2a00:c987:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a00:c9a0::,2a00:c9a0:ffff:ffff:ffff:ffff:ffff:ffff,HU 2a00:c9c0::,2a00:c9c0:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a00:c9e0::,2a00:c9e0:ffff:ffff:ffff:ffff:ffff:ffff,IQ @@ -10072,8 +15212,6 @@ 2a00:cae0::,2a00:cae0:ffff:ffff:ffff:ffff:ffff:ffff,HU 2a00:cb00::,2a00:cb00:ffff:ffff:ffff:ffff:ffff:ffff,BA 2a00:cb20::,2a00:cb20:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a00:cb40::,2a00:cb40:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a00:cb60::,2a00:cb60:ffff:ffff:ffff:ffff:ffff:ffff,TR 2a00:cb80::,2a00:cb80:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a00:cba0::,2a00:cba0:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a00:cbc0::,2a00:cbc0:ffff:ffff:ffff:ffff:ffff:ffff,RU @@ -10231,7 +15369,6 @@ 2a00:dfa0::,2a00:dfa0:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a00:dfc0::,2a00:dfc0:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a00:dfe0::,2a00:dfe7:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a00:e000::,2a00:e000:ffff:ffff:ffff:ffff:ffff:ffff,IR 2a00:e020::,2a00:e020:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a00:e040::,2a00:e040:ffff:ffff:ffff:ffff:ffff:ffff,BE 2a00:e060::,2a00:e060:ffff:ffff:ffff:ffff:ffff:ffff,DE @@ -10289,7 +15426,8 @@ 2a00:e760::,2a00:e760:ffff:ffff:ffff:ffff:ffff:ffff,BE 2a00:e780::,2a00:e780:ffff:ffff:ffff:ffff:ffff:ffff,UA 2a00:e7a0::,2a00:e7a0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:e7c0::,2a00:e7c0:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a00:e7c0::,2a00:e7c0::ffff:ffff:ffff:ffff:ffff,LT +2a00:e7c0:1::,2a00:e7c0:ffff:ffff:ffff:ffff:ffff:ffff,DK 2a00:e7e0::,2a00:e7e0:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a00:e800::,2a00:e807:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a00:e840::,2a00:e840:ffff:ffff:ffff:ffff:ffff:ffff,FR @@ -10380,7 +15518,6 @@ 2a00:f3a0::,2a00:f3a0:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a00:f3c0::,2a00:f3c0:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a00:f3e0::,2a00:f3e0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:f400::,2a00:f400:ffff:ffff:ffff:ffff:ffff:ffff,LU 2a00:f420::,2a00:f420:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a00:f440::,2a00:f440:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a00:f460::,2a00:f460:ffff:ffff:ffff:ffff:ffff:ffff,RU @@ -10473,12 +15610,47 @@ 2a00:ffa0::,2a00:ffa0:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a00:ffc0::,2a00:ffc0:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a00:ffe0::,2a00:ffe0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01::,2a01:ff:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a01::,2a01::ffff:ffff:ffff:ffff:ffff:ffff,FR +2a01:8::,2a01:8:ffff:ffff:ffff:ffff:ffff:ffff,PT +2a01:10::,2a01:10:ffff:ffff:ffff:ffff:ffff:ffff,PT +2a01:18::,2a01:18:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a01:20::,2a01:20:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a01:28::,2a01:28:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a01:30::,2a01:30:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:38::,2a01:38:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a01:40::,2a01:40:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:48::,2a01:48:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a01:50::,2a01:50:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:58::,2a01:58:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a01:68::,2a01:68:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a01:70::,2a01:70:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:78::,2a01:78:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:80::,2a01:80:ffff:ffff:ffff:ffff:ffff:ffff,EE +2a01:88::,2a01:88:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a01:90::,2a01:90:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:98::,2a01:98:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:a0::,2a01:a0:ffff:ffff:ffff:ffff:ffff:ffff,MT +2a01:a8::,2a01:a8:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a01:b0::,2a01:b1:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a01:b8::,2a01:b8:ffff:ffff:ffff:ffff:ffff:ffff,VA +2a01:c0::,2a01:c0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:c8::,2a01:c8:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a01:d0::,2a01:d0:9008:ffff:ffff:ffff:ffff:ffff,UA +2a01:d0:9009::,2a01:d0:9009:ffff:ffff:ffff:ffff:ffff,RU +2a01:d0:900a::,2a01:d0:92ea:ffff:ffff:ffff:ffff:ffff,UA +2a01:d0:92eb::,2a01:d0:92eb:ffff:ffff:ffff:ffff:ffff,RU +2a01:d0:92ec::,2a01:d0:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a01:d8::,2a01:d8:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:e0::,2a01:e0:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a01:e8::,2a01:e8:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a01:f0::,2a01:f0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a01:f8::,2a01:f8:ffff:ffff:ffff:ffff:ffff:ffff,AT 2a01:100::,2a01:100:ffff:ffff:ffff:ffff:ffff:ffff,AT 2a01:108::,2a01:108:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a01:110:10::,2a01:110:10:ffff:ffff:ffff:ffff:ffff,GB +2a01:110:8008::,2a01:110:8008:ffff:ffff:ffff:ffff:ffff,GB 2a01:120::,2a01:120:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:130::,2a01:130:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:138::,2a01:13f:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:130::,2a01:13f:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a01:140::,2a01:140:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a01:148::,2a01:148:ffff:ffff:ffff:ffff:ffff:ffff,IE 2a01:150::,2a01:150:ffff:ffff:ffff:ffff:ffff:ffff,GB @@ -10496,7 +15668,7 @@ 2a01:1b0::,2a01:1b0:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a01:1b8::,2a01:1b8:ffff:ffff:ffff:ffff:ffff:ffff,EE 2a01:1c0::,2a01:1c0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a01:1c8::,2a01:1c8:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a01:1c8::,2a01:1cf:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a01:1d0::,2a01:1d0:ffff:ffff:ffff:ffff:ffff:ffff,JO 2a01:1d8::,2a01:1d8:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a01:1e0::,2a01:1e0:ffff:ffff:ffff:ffff:ffff:ffff,IE @@ -10529,23 +15701,25 @@ 2a01:2c0::,2a01:2c0:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a01:2c8::,2a01:2c8:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a01:2d0::,2a01:2d0:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a01:2d8::,2a01:2d8:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a01:2d8::,2a01:2df:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a01:2e0::,2a01:2ef:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a01:300:22::,2a01:300:22:ffff:ffff:ffff:ffff:ffff,GB 2a01:308::,2a01:308:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a01:310::,2a01:310:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a01:320::,2a01:320:ffff:ffff:ffff:ffff:ffff:ffff,MD 2a01:328::,2a01:328:ffff:ffff:ffff:ffff:ffff:ffff,SK 2a01:330::,2a01:330:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a01:338::,2a01:338:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a01:340::,2a01:340:ffff:ffff:ffff:ffff:ffff:ffff,NO 2a01:348::,2a01:348:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a01:350::,2a01:350:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:358::,2a01:358:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a01:358::,2a01:35f:ffff:ffff:ffff:ffff:ffff:ffff,TR 2a01:360::,2a01:360:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a01:368::,2a01:36f:ffff:ffff:ffff:ffff:ffff:ffff,HU 2a01:378::,2a01:378:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a01:380::,2a01:380:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:388::,2a01:38f:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:388::,2a01:388:250:ffff:ffff:ffff:ffff:ffff,GB +2a01:388:251::,2a01:388:251:ffff:ffff:ffff:ffff:ffff,NL +2a01:388:252::,2a01:38f:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a01:390::,2a01:390:ffff:ffff:ffff:ffff:ffff:ffff,SK 2a01:398::,2a01:398:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a01:3a0::,2a01:3a7:ffff:ffff:ffff:ffff:ffff:ffff,DK @@ -10576,7 +15750,7 @@ 2a01:488::,2a01:488:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a01:490::,2a01:490:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a01:498::,2a01:498:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a01:4a0::,2a01:4a8:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:4a0::,2a01:4af:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a01:4b0::,2a01:4b0:ffff:ffff:ffff:ffff:ffff:ffff,IE 2a01:4c0::,2a01:4c0:ffff:ffff:ffff:ffff:ffff:ffff,BE 2a01:4c8::,2a01:4cf:ffff:ffff:ffff:ffff:ffff:ffff,GB @@ -10585,7 +15759,9 @@ 2a01:4e0::,2a01:4e7:ffff:ffff:ffff:ffff:ffff:ffff,LV 2a01:4e8::,2a01:4e8:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a01:4f0::,2a01:4f0:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a01:4f8::,2a01:4ff:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:4f8::,2a01:4f8:12f:ffff:ffff:ffff:ffff:ffff,DE +2a01:4f8:130::,2a01:4f8:130:ffff:ffff:ffff:ffff:ffff,AT +2a01:4f8:131::,2a01:4ff:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a01:500::,2a01:500:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a01:508::,2a01:508:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a01:510::,2a01:510:ffff:ffff:ffff:ffff:ffff:ffff,CZ @@ -10676,9 +15852,11 @@ 2a01:7e8::,2a01:7e8:ffff:ffff:ffff:ffff:ffff:ffff,DK 2a01:7f0::,2a01:7f0:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a01:7f8::,2a01:7f8:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:800::,2a01:8ff:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:800::,2a01:838:fffe:ffff:ffff:ffff:ffff:ffff,DE +2a01:838:ffff::,2a01:838:ffff:ffff:ffff:ffff:ffff:ffff,MT +2a01:839::,2a01:8ff:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a01:c00::,2a01:c3f:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:e00::,2a01:eff:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a01:e00::,2a01:e3f:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a01:1000::,2a01:17ff:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a01:2000::,2a01:2fff:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a01:4000::,2a01:4000:ffff:ffff:ffff:ffff:ffff:ffff,AM @@ -10704,7 +15882,6 @@ 2a01:4300::,2a01:4300:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a01:4320::,2a01:4320:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a01:4340::,2a01:4340:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a01:4360::,2a01:4360:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a01:4380::,2a01:4380:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a01:43a0::,2a01:43a0:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a01:43c0::,2a01:43c0:ffff:ffff:ffff:ffff:ffff:ffff,IQ @@ -10724,7 +15901,6 @@ 2a01:45c0::,2a01:45c0:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a01:45e0::,2a01:45e0:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a01:4600::,2a01:4600:ffff:ffff:ffff:ffff:ffff:ffff,BH -2a01:4620::,2a01:4620:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a01:4640::,2a01:4640:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a01:4660::,2a01:4660:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a01:4680::,2a01:4680:ffff:ffff:ffff:ffff:ffff:ffff,RS @@ -10750,7 +15926,6 @@ 2a01:4920::,2a01:4920:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a01:4940::,2a01:4940:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a01:4960::,2a01:4960:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a01:4980::,2a01:4980:ffff:ffff:ffff:ffff:ffff:ffff,HU 2a01:49a0::,2a01:49a0:ffff:ffff:ffff:ffff:ffff:ffff,IS 2a01:49c0::,2a01:49c0:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a01:49e0::,2a01:49e0:ffff:ffff:ffff:ffff:ffff:ffff,AZ @@ -10813,7 +15988,6 @@ 2a01:5140::,2a01:5140:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a01:5160::,2a01:5160:ffff:ffff:ffff:ffff:ffff:ffff,ME 2a01:5180::,2a01:5180:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:51a0::,2a01:51a0:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a01:51c0::,2a01:51c7:ffff:ffff:ffff:ffff:ffff:ffff,FI 2a01:5200::,2a01:5200:ffff:ffff:ffff:ffff:ffff:ffff,SK 2a01:5220::,2a01:5220:ffff:ffff:ffff:ffff:ffff:ffff,RU @@ -10850,7 +16024,7 @@ 2a01:5620::,2a01:5620:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a01:5640::,2a01:5640:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a01:5660::,2a01:5660:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a01:5680::,2a01:5680:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:5680::,2a01:5687:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a01:56a0::,2a01:56a0:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a01:56c0::,2a01:56c7:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a01:56e0::,2a01:56e0:ffff:ffff:ffff:ffff:ffff:ffff,PL @@ -10863,7 +16037,6 @@ 2a01:57c0::,2a01:57c0:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a01:57e0::,2a01:57e0:ffff:ffff:ffff:ffff:ffff:ffff,SA 2a01:5800::,2a01:5800:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a01:5820::,2a01:5820:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a01:5840::,2a01:5840:ffff:ffff:ffff:ffff:ffff:ffff,IR 2a01:5860::,2a01:5860:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a01:58a0::,2a01:58a0:ffff:ffff:ffff:ffff:ffff:ffff,IQ @@ -10876,9 +16049,7 @@ 2a01:59c0::,2a01:59c0:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a01:59e0::,2a01:59e0:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a01:5a00::,2a01:5a00:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a01:5a20::,2a01:5a20:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a01:5a40::,2a01:5a40:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:5a60::,2a01:5a60:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a01:5a80::,2a01:5a80:ffff:ffff:ffff:ffff:ffff:ffff,US 2a01:5aa0::,2a01:5aa0:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a01:5ac0::,2a01:5ac0:ffff:ffff:ffff:ffff:ffff:ffff,GB @@ -11081,7 +16252,6 @@ 2a01:7400::,2a01:7400:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a01:7420::,2a01:7420:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a01:7440::,2a01:7440:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:7460::,2a01:7460:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a01:7480::,2a01:7480:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a01:74a0::,2a01:74a0:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a01:74c0::,2a01:74c0:ffff:ffff:ffff:ffff:ffff:ffff,DE @@ -11113,7 +16283,6 @@ 2a01:7820::,2a01:7820:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a01:7840::,2a01:7840:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a01:7860::,2a01:7860:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:7880::,2a01:7880:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a01:78a0::,2a01:78a0:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a01:78c0::,2a01:78c0:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a01:78e0::,2a01:78e0:ffff:ffff:ffff:ffff:ffff:ffff,GB @@ -11164,7 +16333,6 @@ 2a01:7ec0::,2a01:7ec0:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a01:7ee0::,2a01:7ee0:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a01:7f00::,2a01:7f00:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a01:7f20::,2a01:7f20:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a01:7f40::,2a01:7f40:ffff:ffff:ffff:ffff:ffff:ffff,KW 2a01:7f60::,2a01:7f60:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a01:7f80::,2a01:7f80:ffff:ffff:ffff:ffff:ffff:ffff,PS @@ -11232,8 +16400,7 @@ 2a01:8780::,2a01:8787:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a01:87c0::,2a01:87c0:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a01:87e0::,2a01:87e0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:8800::,2a01:8800:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:8820::,2a01:8820:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a01:8800::,2a01:8807:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a01:8840::,2a01:8840:ffff:ffff:ffff:ffff:ffff:ffff,IE 2a01:8860::,2a01:8860:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a01:8880::,2a01:8880:ffff:ffff:ffff:ffff:ffff:ffff,BG @@ -11272,7 +16439,7 @@ 2a01:8ca0::,2a01:8ca0:ffff:ffff:ffff:ffff:ffff:ffff,LV 2a01:8cc0::,2a01:8cc0:ffff:ffff:ffff:ffff:ffff:ffff,AT 2a01:8ce0::,2a01:8ce0:ffff:ffff:ffff:ffff:ffff:ffff,KZ -2a01:8d00::,2a01:8d00:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a01:8d00::,2a01:8d03:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a01:8d20::,2a01:8d20:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a01:8d40::,2a01:8d47:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a01:8d80::,2a01:8d80:ffff:ffff:ffff:ffff:ffff:ffff,NO @@ -11289,7 +16456,7 @@ 2a01:8f00::,2a01:8f00:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a01:8f20::,2a01:8f20:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a01:8f40::,2a01:8f40:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a01:8f60::,2a01:8f60:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a01:8f60::,2a01:8f67:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a01:8f80::,2a01:8f80:ffff:ffff:ffff:ffff:ffff:ffff,IE 2a01:8fa0::,2a01:8fa0:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a01:8fc0::,2a01:8fc0:ffff:ffff:ffff:ffff:ffff:ffff,CZ @@ -11318,7 +16485,6 @@ 2a01:92c0::,2a01:92c0:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a01:92e0::,2a01:92e0:ffff:ffff:ffff:ffff:ffff:ffff,IL 2a01:9300::,2a01:9300:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a01:9320::,2a01:9320:ffff:ffff:ffff:ffff:ffff:ffff,HU 2a01:9340::,2a01:9340:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a01:9360::,2a01:9360:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a01:9380::,2a01:9380:ffff:ffff:ffff:ffff:ffff:ffff,PL @@ -11453,7 +16619,6 @@ 2a01:a400::,2a01:a400:ffff:ffff:ffff:ffff:ffff:ffff,JE 2a01:a420::,2a01:a420:ffff:ffff:ffff:ffff:ffff:ffff,TR 2a01:a440::,2a01:a440:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a01:a460::,2a01:a460:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a01:a4a0::,2a01:a4a0:ffff:ffff:ffff:ffff:ffff:ffff,LU 2a01:a4c0::,2a01:a4c0:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a01:a4e0::,2a01:a4e0:ffff:ffff:ffff:ffff:ffff:ffff,CZ @@ -11597,7 +16762,6 @@ 2a01:b700::,2a01:b700:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a01:b720::,2a01:b720:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a01:b740::,2a01:b740:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a01:b760::,2a01:b760:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a01:b780::,2a01:b780:ffff:ffff:ffff:ffff:ffff:ffff,MK 2a01:b7a0::,2a01:b7a0:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a01:b7c0::,2a01:b7c0:ffff:ffff:ffff:ffff:ffff:ffff,CH @@ -11625,7 +16789,6 @@ 2a01:ba80::,2a01:ba80:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a01:baa0::,2a01:baa0:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a01:bac0::,2a01:bac0:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a01:bae0::,2a01:bae0:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a01:bb20::,2a01:bb20:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a01:bb40::,2a01:bb40:ffff:ffff:ffff:ffff:ffff:ffff,NO 2a01:bb60::,2a01:bb60:ffff:ffff:ffff:ffff:ffff:ffff,NL @@ -11712,7 +16875,6 @@ 2a02:188::,2a02:18f:ffff:ffff:ffff:ffff:ffff:ffff,DK 2a02:190::,2a02:190:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a02:198::,2a02:198:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a02:1a0::,2a02:1a7:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a02:1a8::,2a02:1a8:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a02:1b8::,2a02:1b8:ffff:ffff:ffff:ffff:ffff:ffff,AT 2a02:1c0::,2a02:1c0:ffff:ffff:ffff:ffff:ffff:ffff,BG @@ -11726,7 +16888,7 @@ 2a02:200::,2a02:200:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a02:208::,2a02:208:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a02:210::,2a02:210:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:218::,2a02:218:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:218::,2a02:21f:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a02:220::,2a02:220:ffff:ffff:ffff:ffff:ffff:ffff,IE 2a02:228::,2a02:22f:ffff:ffff:ffff:ffff:ffff:ffff,NO 2a02:230::,2a02:230:ffff:ffff:ffff:ffff:ffff:ffff,GB @@ -11734,7 +16896,7 @@ 2a02:240::,2a02:240:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a02:248::,2a02:248:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a02:250::,2a02:250:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a02:258::,2a02:258:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:258::,2a02:25f:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a02:260::,2a02:260:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a02:268::,2a02:268:ffff:ffff:ffff:ffff:ffff:ffff,TR 2a02:270::,2a02:270:ffff:ffff:ffff:ffff:ffff:ffff,NO @@ -11798,7 +16960,7 @@ 2a02:450::,2a02:450:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a02:458::,2a02:458:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a02:460::,2a02:460:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a02:468::,2a02:468:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:468::,2a02:46f:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a02:470::,2a02:470:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a02:478::,2a02:478:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a02:480::,2a02:480:ffff:ffff:ffff:ffff:ffff:ffff,TR @@ -11813,16 +16975,48 @@ 2a02:4d0::,2a02:4d0:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a02:4d8::,2a02:4d8:ffff:ffff:ffff:ffff:ffff:ffff,LU 2a02:4e0::,2a02:4e0:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a02:4e8::,2a02:4e8:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:4e8::,2a02:4e8:3:ffff:ffff:ffff:ffff:ffff,GB +2a02:4e8:4::,2a02:4e8:4:ffff:ffff:ffff:ffff:ffff,CA +2a02:4e8:5::,2a02:4e8:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a02:4f0::,2a02:4f0:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a02:4f8::,2a02:4f8:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:500::,2a02:5ff:ffff:ffff:ffff:ffff:ffff:ffff,GR +2a02:500::,2a02:500:ffff:ffff:ffff:ffff:ffff:ffff,LV +2a02:508::,2a02:508:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a02:518::,2a02:518:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:520::,2a02:520:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:530::,2a02:530:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:538::,2a02:538:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a02:540::,2a02:540:ffff:ffff:ffff:ffff:ffff:ffff,CY +2a02:548::,2a02:548:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:550::,2a02:550:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:558::,2a02:558:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a02:560::,2a02:560:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:568::,2a02:568:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:570::,2a02:570:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a02:578::,2a02:578:5001:ffff:ffff:ffff:ffff:ffff,BE +2a02:578:5002::,2a02:578:5002:ffff:ffff:ffff:ffff:ffff,RU +2a02:578:5003::,2a02:578:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a02:580::,2a02:580:d3ab:ffff:ffff:ffff:ffff:ffff,GR +2a02:580:d3ac::,2a02:580:d3ac:ffff:ffff:ffff:ffff:ffff,FR +2a02:580:d3ad::,2a02:587:ffff:ffff:ffff:ffff:ffff:ffff,GR +2a02:588::,2a02:588:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:590::,2a02:590:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:598::,2a02:598:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a02:5a0::,2a02:5a0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:5b0::,2a02:5b0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:5b8::,2a02:5b8:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:5c0::,2a02:5c0:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a02:5c8::,2a02:5c8:ffff:ffff:ffff:ffff:ffff:ffff,GR +2a02:5d0::,2a02:5d0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:5d8::,2a02:5d8:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a02:5e0::,2a02:5e0:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a02:5f0::,2a02:5f0:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a02:5f8::,2a02:5f8:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a02:600::,2a02:600:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a02:608::,2a02:608:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a02:610::,2a02:610:ffff:ffff:ffff:ffff:ffff:ffff,LV 2a02:618::,2a02:618:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a02:620::,2a02:620:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a02:628::,2a02:628:ffff:ffff:ffff:ffff:ffff:ffff,PT 2a02:630::,2a02:630:ffff:ffff:ffff:ffff:ffff:ffff,DK 2a02:638::,2a02:638:ffff:ffff:ffff:ffff:ffff:ffff,GI 2a02:640::,2a02:640:ffff:ffff:ffff:ffff:ffff:ffff,CY @@ -11892,7 +17086,7 @@ 2a02:840::,2a02:840:ffff:ffff:ffff:ffff:ffff:ffff,SI 2a02:848::,2a02:848:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a02:850::,2a02:850:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a02:858::,2a02:858:ffff:ffff:ffff:ffff:ffff:ffff,GR +2a02:858::,2a02:85f:ffff:ffff:ffff:ffff:ffff:ffff,GR 2a02:860::,2a02:860:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a02:868::,2a02:868:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a02:870::,2a02:870:ffff:ffff:ffff:ffff:ffff:ffff,PT @@ -11913,7 +17107,38 @@ 2a02:8e8::,2a02:8e8:ffff:ffff:ffff:ffff:ffff:ffff,DK 2a02:8f0::,2a02:8f0:ffff:ffff:ffff:ffff:ffff:ffff,PT 2a02:8f8::,2a02:8f8:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a02:900::,2a02:a00:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:900::,2a02:900:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a02:908::,2a02:908:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:910::,2a02:910:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a02:918::,2a02:918:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:920::,2a02:920:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a02:928::,2a02:928:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:930::,2a02:930:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:938::,2a02:93f:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:940::,2a02:940:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a02:950::,2a02:957:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a02:958::,2a02:958:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:960::,2a02:960:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:968::,2a02:968:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:970::,2a02:970:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a02:978::,2a02:978:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:980::,2a02:980:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a02:988::,2a02:988:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:990::,2a02:990:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:998::,2a02:998:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:9a0::,2a02:9a0:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a02:9a8::,2a02:9a8:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:9b0::,2a02:9b0:ffff:ffff:ffff:ffff:ffff:ffff,SA +2a02:9b8::,2a02:9b9:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a02:9c0::,2a02:9c0:ffff:ffff:ffff:ffff:ffff:ffff,JO +2a02:9c8::,2a02:9c8:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a02:9d0::,2a02:9d0:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a02:9d8::,2a02:9d8:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:9e0::,2a02:9e0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:9e8::,2a02:9e8:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:9f0::,2a02:9f0:ffff:ffff:ffff:ffff:ffff:ffff,IS +2a02:9f8::,2a02:9f8:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:a00::,2a02:a00:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a02:a08::,2a02:a08:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a02:a10::,2a02:a10:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a02:a18::,2a02:a18:ffff:ffff:ffff:ffff:ffff:ffff,NO @@ -11946,13 +17171,13 @@ 2a02:af0::,2a02:af0:ffff:ffff:ffff:ffff:ffff:ffff,AT 2a02:af8::,2a02:af8:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a02:b00::,2a02:b00:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:b08::,2a02:b08:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:b08::,2a02:b0f:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a02:b10::,2a02:b10:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a02:b18::,2a02:b18:ffff:ffff:ffff:ffff:ffff:ffff,AT 2a02:b20::,2a02:b20:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a02:b28::,2a02:b28:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a02:b30::,2a02:b30:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:b48::,2a02:b48:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a02:b48::,2a02:b4f:ffff:ffff:ffff:ffff:ffff:ffff,UA 2a02:b50::,2a02:b50:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a02:b58::,2a02:b58:ffff:ffff:ffff:ffff:ffff:ffff,RS 2a02:b60::,2a02:b60:ffff:ffff:ffff:ffff:ffff:ffff,IQ @@ -12095,9 +17320,8 @@ 2a02:fe0::,2a02:fe7:ffff:ffff:ffff:ffff:ffff:ffff,NO 2a02:fe8::,2a02:fe8:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a02:ff0::,2a02:ff0:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a02:ff8::,2a02:ff8:ffff:ffff:ffff:ffff:ffff:ffff,IR 2a02:1000::,2a02:103f:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:1200::,2a02:12ff:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a02:1200::,2a02:121f:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a02:1300::,2a02:1300:ffff:ffff:ffff:ffff:ffff:ffff,IS 2a02:1308::,2a02:1308:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a02:1310::,2a02:1310:ffff:ffff:ffff:ffff:ffff:ffff,GB @@ -12144,7 +17368,7 @@ 2a02:1650::,2a02:1650:ffff:ffff:ffff:ffff:ffff:ffff,SA 2a02:1658::,2a02:1658:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a02:1660::,2a02:1660:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a02:1668::,2a02:1668:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:1668::,2a02:166f:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a02:1670::,2a02:1670:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a02:1678::,2a02:1678:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a02:1680::,2a02:1680:ffff:ffff:ffff:ffff:ffff:ffff,NL @@ -12154,7 +17378,7 @@ 2a02:16a8::,2a02:16a8:ffff:ffff:ffff:ffff:ffff:ffff,AT 2a02:16b0::,2a02:16b0:ffff:ffff:ffff:ffff:ffff:ffff,KW 2a02:16b8::,2a02:16b8:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a02:16c0::,2a02:16c0:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a02:16c0::,2a02:16c7:ffff:ffff:ffff:ffff:ffff:ffff,IR 2a02:16c8::,2a02:16c8:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a02:16d0::,2a02:16d0:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a02:16d8::,2a02:16d8:ffff:ffff:ffff:ffff:ffff:ffff,LV @@ -12193,7 +17417,38 @@ 2a02:17f0::,2a02:17f0:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a02:17f8::,2a02:17f8:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a02:1800::,2a02:18ff:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a02:2000::,2a02:20ff:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:2000::,2a02:2000:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a02:2008::,2a02:2008:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:2010::,2a02:2010:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a02:2018::,2a02:2018:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:2020::,2a02:2020:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a02:2028::,2a02:2028:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:2030::,2a02:2030:ffff:ffff:ffff:ffff:ffff:ffff,BA +2a02:2038::,2a02:2038:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:2040::,2a02:2040:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:2048::,2a02:2048:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a02:2050::,2a02:2050:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:2058::,2a02:2058:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:2060::,2a02:2060:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:2068::,2a02:2068:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a02:2070::,2a02:2070:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:2078::,2a02:2078:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a02:2080::,2a02:2080:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:2088::,2a02:2088:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a02:2090::,2a02:2090:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:2098::,2a02:209f:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:20a0::,2a02:20a0:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a02:20a8::,2a02:20a8:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:20b0::,2a02:20b0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:20b8::,2a02:20b8:ffff:ffff:ffff:ffff:ffff:ffff,HR +2a02:20c0::,2a02:20c0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:20c8::,2a02:20c8:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a02:20d0::,2a02:20d0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:20d8::,2a02:20d8:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:20e0::,2a02:20e7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:20e8::,2a02:20e8:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:20f0::,2a02:20f0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:20f8::,2a02:20f8:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a02:2100::,2a02:2100:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a02:2108::,2a02:2108:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a02:2110::,2a02:2110:ffff:ffff:ffff:ffff:ffff:ffff,GB @@ -12240,7 +17495,7 @@ 2a02:2278::,2a02:2278:ffff:ffff:ffff:ffff:ffff:ffff,UA 2a02:2280::,2a02:2280:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a02:2288::,2a02:2288:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:2290::,2a02:2290:ffff:ffff:ffff:ffff:ffff:ffff,LU +2a02:2290::,2a02:2297:ffff:ffff:ffff:ffff:ffff:ffff,LU 2a02:2298::,2a02:2298:ffff:ffff:ffff:ffff:ffff:ffff,GR 2a02:22a0::,2a02:22a0:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a02:22a8::,2a02:22a8:ffff:ffff:ffff:ffff:ffff:ffff,RU @@ -12309,7 +17564,7 @@ 2a02:24b8::,2a02:24bf:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a02:24c0::,2a02:24c0:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a02:24c8::,2a02:24c8:ffff:ffff:ffff:ffff:ffff:ffff,SA -2a02:24d0::,2a02:24d0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:24d0::,2a02:24d7:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a02:24d8::,2a02:24d8:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a02:24e0::,2a02:24e0:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a02:24e8::,2a02:24e8:ffff:ffff:ffff:ffff:ffff:ffff,CH @@ -12333,7 +17588,6 @@ 2a02:2580::,2a02:2587:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a02:2588::,2a02:2588:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a02:2590::,2a02:2590:ffff:ffff:ffff:ffff:ffff:ffff,SI -2a02:2598::,2a02:2598:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a02:25a0::,2a02:25a0:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a02:25a8::,2a02:25af:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a02:25b0::,2a02:25b0:ffff:ffff:ffff:ffff:ffff:ffff,CZ @@ -12373,13 +17627,46 @@ 2a02:26c0::,2a02:26c0:ffff:ffff:ffff:ffff:ffff:ffff,TR 2a02:26c8::,2a02:26c8:ffff:ffff:ffff:ffff:ffff:ffff,PT 2a02:26d0::,2a02:26d0:ffff:ffff:ffff:ffff:ffff:ffff,PS -2a02:26d8::,2a02:26d8:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a02:26e0::,2a02:26e0:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a02:26e8::,2a02:26e8:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a02:26f8::,2a02:26ff:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:2700::,2a02:27ff:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a02:2700::,2a02:2700:ffff:ffff:ffff:ffff:ffff:ffff,IQ +2a02:2708::,2a02:2708:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:2710::,2a02:2710:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a02:2718::,2a02:271f:ffff:ffff:ffff:ffff:ffff:ffff,YE +2a02:2720::,2a02:2720:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a02:2728::,2a02:2728:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a02:2730::,2a02:2730:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a02:2738::,2a02:2738:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:2740::,2a02:2740:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a02:2748::,2a02:2748:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:2750::,2a02:2750:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a02:2760::,2a02:2760:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:2768::,2a02:2768:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:2770::,2a02:2770:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:2778::,2a02:2778:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:2780::,2a02:2780:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a02:2788::,2a02:2788:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a02:2790::,2a02:2790:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a02:2798::,2a02:2798:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:27a0::,2a02:27a0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:27a8::,2a02:27af:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a02:27b0::,2a02:27b0:ffff:ffff:ffff:ffff:ffff:ffff,BA +2a02:27b8::,2a02:27b8:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a02:27c0::,2a02:27c0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:27c8::,2a02:27c8:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:27d0::,2a02:27d0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:27d8::,2a02:27d8:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a02:27e0::,2a02:27e0:ffff:ffff:ffff:ffff:ffff:ffff,PT +2a02:27e8::,2a02:27e8:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a02:27f0::,2a02:27f0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:27f8::,2a02:27f8:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a02:2800::,2a02:2800:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:2808::,2a02:2808:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a02:2808::,2a02:2808:1005:ffff:ffff:ffff:ffff:ffff,CZ +2a02:2808:1006::,2a02:2808:1006:ffff:ffff:ffff:ffff:ffff,RU +2a02:2808:1007::,2a02:2808:2800:ffff:ffff:ffff:ffff:ffff,CZ +2a02:2808:2801::,2a02:2808:2801:ffff:ffff:ffff:ffff:ffff,RU +2a02:2808:2802::,2a02:2808:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a02:2810::,2a02:2810:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a02:2818::,2a02:2818:ffff:ffff:ffff:ffff:ffff:ffff,UA 2a02:2820::,2a02:2820:ffff:ffff:ffff:ffff:ffff:ffff,CH @@ -12413,8 +17700,7 @@ 2a02:2900::,2a02:2900:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a02:2908::,2a02:2908:ffff:ffff:ffff:ffff:ffff:ffff,OM 2a02:2910::,2a02:2910:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:2918::,2a02:2918:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:2920::,2a02:2920:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:2918::,2a02:2920:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a02:2928::,2a02:2928:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a02:2930::,2a02:2930:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a02:2938::,2a02:2938:ffff:ffff:ffff:ffff:ffff:ffff,NL @@ -12482,7 +17768,7 @@ 2a02:2b30::,2a02:2b30:ffff:ffff:ffff:ffff:ffff:ffff,UA 2a02:2b38::,2a02:2b38:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a02:2b40::,2a02:2b47:ffff:ffff:ffff:ffff:ffff:ffff,SI -2a02:2b48::,2a02:2b48:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a02:2b48::,2a02:2b4f:ffff:ffff:ffff:ffff:ffff:ffff,NO 2a02:2b50::,2a02:2b50:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a02:2b58::,2a02:2b58:ffff:ffff:ffff:ffff:ffff:ffff,IR 2a02:2b80::,2a02:2b80:ffff:ffff:ffff:ffff:ffff:ffff,DE @@ -12511,12 +17797,16 @@ 2a02:2dc0::,2a02:2dc0:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a02:2de0::,2a02:2de0:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a02:2e00::,2a02:2e1f:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a02:2f00::,2a02:2fff:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a02:2f00::,2a02:2f0f:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a02:2f80::,2a02:2f80:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a02:2fa0::,2a02:2fa0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:2fc0::,2a02:2fc7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:2fe0::,2a02:2fe0:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a02:3000::,2a02:31ff:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a02:4000::,2a02:4000:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a02:4020::,2a02:4020:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a02:4040::,2a02:4040:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:4060::,2a02:4060:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a02:4060::,2a02:4067:ffff:ffff:ffff:ffff:ffff:ffff,NO 2a02:4080::,2a02:4080:ffff:ffff:ffff:ffff:ffff:ffff,LB 2a02:40a0::,2a02:40a0:ffff:ffff:ffff:ffff:ffff:ffff,IL 2a02:40c0::,2a02:40c0:ffff:ffff:ffff:ffff:ffff:ffff,NL @@ -12573,7 +17863,7 @@ 2a02:4780::,2a02:4780:ffff:ffff:ffff:ffff:ffff:ffff,LT 2a02:47a0::,2a02:47a0:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a02:47c0::,2a02:47c0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:47e0::,2a02:47e0:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a02:47e0::,2a02:47e7:ffff:ffff:ffff:ffff:ffff:ffff,BE 2a02:4800::,2a02:4800:ffff:ffff:ffff:ffff:ffff:ffff,RO 2a02:4820::,2a02:4820:ffff:ffff:ffff:ffff:ffff:ffff,FI 2a02:4840::,2a02:4840:ffff:ffff:ffff:ffff:ffff:ffff,LV @@ -12733,7 +18023,7 @@ 2a02:5d20::,2a02:5d20:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a02:5d40::,2a02:5d47:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a02:5d60::,2a02:5d60:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:5d80::,2a02:5d80:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:5d80::,2a02:5d87:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a02:5da0::,2a02:5da0:ffff:ffff:ffff:ffff:ffff:ffff,NO 2a02:5dc0::,2a02:5dc0:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a02:5de0::,2a02:5de0:ffff:ffff:ffff:ffff:ffff:ffff,FI @@ -12751,7 +18041,6 @@ 2a02:5f80::,2a02:5f80:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a02:5fa0::,2a02:5fa0:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a02:5fc0::,2a02:5fc0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a02:5fe0::,2a02:5fe0:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a02:6000::,2a02:6000:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a02:6020::,2a02:6020:ffff:ffff:ffff:ffff:ffff:ffff,BA 2a02:6040::,2a02:6040:ffff:ffff:ffff:ffff:ffff:ffff,IR @@ -12815,9 +18104,7 @@ 2a02:67c0::,2a02:67c0:ffff:ffff:ffff:ffff:ffff:ffff,SY 2a02:67e0::,2a02:67e0:ffff:ffff:ffff:ffff:ffff:ffff,BE 2a02:6800::,2a02:6800:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a02:6820::,2a02:6820:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a02:6840::,2a02:6840:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:6860::,2a02:6860:ffff:ffff:ffff:ffff:ffff:ffff,TR 2a02:6880::,2a02:6880:ffff:ffff:ffff:ffff:ffff:ffff,IE 2a02:68a0::,2a02:68a0:ffff:ffff:ffff:ffff:ffff:ffff,EE 2a02:68c0::,2a02:68c0:ffff:ffff:ffff:ffff:ffff:ffff,FR @@ -12887,7 +18174,6 @@ 2a02:7120::,2a02:7120:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a02:7140::,2a02:7140:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a02:7160::,2a02:7160:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a02:7180::,2a02:7180:ffff:ffff:ffff:ffff:ffff:ffff,BE 2a02:71a0::,2a02:71a0:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a02:71c0::,2a02:71c0:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a02:71e0::,2a02:71e0:ffff:ffff:ffff:ffff:ffff:ffff,SI @@ -12910,9 +18196,7 @@ 2a02:7420::,2a02:7420:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a02:7440::,2a02:7440:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a02:7460::,2a02:7460:ffff:ffff:ffff:ffff:ffff:ffff,MQ -2a02:7480::,2a02:7480:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a02:74a0::,2a02:74a0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:74c0::,2a02:74c0:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a02:74e0::,2a02:74e0:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a02:7500::,2a02:7500:ffff:ffff:ffff:ffff:ffff:ffff,KW 2a02:7520::,2a02:7520:ffff:ffff:ffff:ffff:ffff:ffff,DE @@ -12941,7 +18225,7 @@ 2a02:7800::,2a02:7800:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a02:7820::,2a02:7820:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a02:7840::,2a02:7840:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a02:7860::,2a02:7860:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a02:7860::,2a02:7867:ffff:ffff:ffff:ffff:ffff:ffff,BE 2a02:7880::,2a02:7880:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a02:78a0::,2a02:78a0:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a02:78c0::,2a02:78c0:ffff:ffff:ffff:ffff:ffff:ffff,DE @@ -12999,13 +18283,22 @@ 2a02:7fa0::,2a02:7fa0:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a02:7fc0::,2a02:7fc0:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a02:7fe0::,2a02:7fe0:ffff:ffff:ffff:ffff:ffff:ffff,IS -2a02:8000::,2a02:821f:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:8010::,2a02:8017:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:8020::,2a02:8023:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:8040::,2a02:8043:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a02:8060::,2a02:8061:ffff:ffff:ffff:ffff:ffff:ffff,AD +2a02:8070::,2a02:8071:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:8080::,2a02:8087:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a02:80c0::,2a02:80c3:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:80e0::,2a02:80e3:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a02:8100::,2a02:811f:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:8200::,2a02:821f:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a02:8300::,2a02:830f:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a02:8380::,2a02:838f:ffff:ffff:ffff:ffff:ffff:ffff,AT 2a02:8400::,2a02:847f:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a02:8800::,2a02:88ff:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a02:9000::,2a02:91ff:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a02:a000::,2a02:a0ff:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a02:a000::,2a02:a03f:ffff:ffff:ffff:ffff:ffff:ffff,BE 2a02:a200::,2a02:a21f:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a02:a300::,2a02:a31f:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a02:a400::,2a02:a47f:ffff:ffff:ffff:ffff:ffff:ffff,NL @@ -13048,7 +18341,6 @@ 2a02:c3c0::,2a02:c3c7:ffff:ffff:ffff:ffff:ffff:ffff,BH 2a02:c400::,2a02:c407:ffff:ffff:ffff:ffff:ffff:ffff,BH 2a02:c440::,2a02:c447:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:c480::,2a02:c487:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a02:c4c0::,2a02:c4c7:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a02:c500::,2a02:c507:ffff:ffff:ffff:ffff:ffff:ffff,GR 2a02:c540::,2a02:c547:ffff:ffff:ffff:ffff:ffff:ffff,NL @@ -13172,9 +18464,7 @@ 2a02:e180::,2a02:e187:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a02:e1c0::,2a02:e1c7:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a02:e200::,2a02:e203:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a02:e220::,2a02:e223:ffff:ffff:ffff:ffff:ffff:ffff,SA 2a02:e240::,2a02:e247:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:e280::,2a02:e287:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a02:e2c0::,2a02:e2c7:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a02:e300::,2a02:e307:ffff:ffff:ffff:ffff:ffff:ffff,BY 2a02:e340::,2a02:e347:ffff:ffff:ffff:ffff:ffff:ffff,NO @@ -13183,12 +18473,10 @@ 2a02:e400::,2a02:e407:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a02:e440::,2a02:e447:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a02:e480::,2a02:e487:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:e4c0::,2a02:e4c7:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a02:e500::,2a02:e507:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a02:e540::,2a02:e547:ffff:ffff:ffff:ffff:ffff:ffff,RS 2a02:e580::,2a02:e587:ffff:ffff:ffff:ffff:ffff:ffff,NO 2a02:e5c0::,2a02:e5c7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a02:e600::,2a02:e603:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a02:e620::,2a02:e623:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a02:e640::,2a02:e647:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a02:e680::,2a02:e687:ffff:ffff:ffff:ffff:ffff:ffff,JO @@ -13200,10 +18488,8 @@ 2a02:e840::,2a02:e847:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a02:e880::,2a02:e887:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a02:e900::,2a02:e907:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a02:e940::,2a02:e947:ffff:ffff:ffff:ffff:ffff:ffff,RO 2a02:e980::,2a02:e987:ffff:ffff:ffff:ffff:ffff:ffff,IL 2a02:e9c0::,2a02:e9c7:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a02:ea00::,2a02:ea07:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a02:ea40::,2a02:ea47:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a02:ea80::,2a02:ea87:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a02:eac0::,2a02:eac7:ffff:ffff:ffff:ffff:ffff:ffff,PL @@ -13234,7 +18520,9 @@ 2a02:f0c0::,2a02:f0c7:ffff:ffff:ffff:ffff:ffff:ffff,JO 2a02:f100::,2a02:f107:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a02:f140::,2a02:f147:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a02:f180::,2a02:f187:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:f180::,2a02:f181:2fff:ffff:ffff:ffff:ffff:ffff,FR +2a02:f181:3000::,2a02:f181:3000:ffff:ffff:ffff:ffff:ffff,RO +2a02:f181:3001::,2a02:f187:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a02:f1c0::,2a02:f1c7:ffff:ffff:ffff:ffff:ffff:ffff,UA 2a02:f200::,2a02:f207:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a02:f240::,2a02:f247:ffff:ffff:ffff:ffff:ffff:ffff,IR @@ -13299,7 +18587,6 @@ 2a03:a0::,2a03:a0:ffff:ffff:ffff:ffff:ffff:ffff,HR 2a03:c0::,2a03:c0:ffff:ffff:ffff:ffff:ffff:ffff,DK 2a03:e0::,2a03:e0:ffff:ffff:ffff:ffff:ffff:ffff,SK -2a03:100::,2a03:100:ffff:ffff:ffff:ffff:ffff:ffff,LV 2a03:120::,2a03:120:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a03:140::,2a03:140:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a03:160::,2a03:160:ffff:ffff:ffff:ffff:ffff:ffff,CH @@ -13331,7 +18618,7 @@ 2a03:4c0::,2a03:4c0:ffff:ffff:ffff:ffff:ffff:ffff,IE 2a03:4e0::,2a03:4e0:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a03:500::,2a03:500:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:520::,2a03:520:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a03:520::,2a03:527:ffff:ffff:ffff:ffff:ffff:ffff,NO 2a03:540::,2a03:540:ffff:ffff:ffff:ffff:ffff:ffff,UZ 2a03:560::,2a03:560:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a03:580::,2a03:580:ffff:ffff:ffff:ffff:ffff:ffff,CH @@ -13354,7 +18641,7 @@ 2a03:7a0::,2a03:7a0:ffff:ffff:ffff:ffff:ffff:ffff,ME 2a03:7c0::,2a03:7c0:ffff:ffff:ffff:ffff:ffff:ffff,PS 2a03:7e0::,2a03:7e0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:800::,2a03:800:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:800::,2a03:807:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a03:820::,2a03:820:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a03:840::,2a03:840:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a03:860::,2a03:860:ffff:ffff:ffff:ffff:ffff:ffff,DE @@ -13396,7 +18683,6 @@ 2a03:d20::,2a03:d20:ffff:ffff:ffff:ffff:ffff:ffff,IR 2a03:d40::,2a03:d40:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a03:d60::,2a03:d60:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a03:d80::,2a03:d80:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a03:da0::,2a03:da0:ffff:ffff:ffff:ffff:ffff:ffff,PT 2a03:dc0::,2a03:dc0:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a03:de0::,2a03:de0:ffff:ffff:ffff:ffff:ffff:ffff,BE @@ -13435,7 +18721,6 @@ 2a03:1240::,2a03:1240:ffff:ffff:ffff:ffff:ffff:ffff,UA 2a03:1260::,2a03:1260:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a03:1280::,2a03:1280:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a03:12a0::,2a03:12a0:ffff:ffff:ffff:ffff:ffff:ffff,BE 2a03:12c0::,2a03:12c0:ffff:ffff:ffff:ffff:ffff:ffff,NO 2a03:12e0::,2a03:12e0:ffff:ffff:ffff:ffff:ffff:ffff,AE 2a03:1300::,2a03:1300:ffff:ffff:ffff:ffff:ffff:ffff,CY @@ -13450,7 +18735,6 @@ 2a03:1420::,2a03:1420:ffff:ffff:ffff:ffff:ffff:ffff,AT 2a03:1440::,2a03:1440:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a03:1460::,2a03:1460:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:1480::,2a03:1480:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a03:14a0::,2a03:14a0:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a03:14c0::,2a03:14c0:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a03:14e0::,2a03:14e0:ffff:ffff:ffff:ffff:ffff:ffff,GB @@ -13489,7 +18773,7 @@ 2a03:1920::,2a03:1920:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a03:1940::,2a03:1940:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a03:1960::,2a03:1960:ffff:ffff:ffff:ffff:ffff:ffff,LT -2a03:1980::,2a03:1980:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a03:1980::,2a03:1987:ffff:ffff:ffff:ffff:ffff:ffff,BE 2a03:19a0::,2a03:19a0:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a03:19e0::,2a03:19e0:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a03:1a00::,2a03:1a00:ffff:ffff:ffff:ffff:ffff:ffff,NL @@ -13528,307 +18812,565 @@ 2a03:1e20::,2a03:1e20:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a03:1e40::,2a03:1e40:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a03:1e60::,2a03:1e60:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:1e80::,2a03:1e80:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:1e80::,2a03:1e87:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a03:1ea0::,2a03:1ea0:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a03:1ec0::,2a03:1ec0:ffff:ffff:ffff:ffff:ffff:ffff,BG 2a03:1ee0::,2a03:1ee0:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a03:1f00::,2a03:1f00:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a03:1f20::,2a03:1f20:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a03:1f40::,2a03:1f40:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a03:1f60::,2a03:1f60:ffff:ffff:ffff:ffff:ffff:ffff,AT 2a03:1f80::,2a03:1f80:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a03:1fa0::,2a03:1fa0:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a03:2000::,2a03:2000:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:2040::,2a03:2040:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a03:2020::,2a03:2020:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:2040::,2a03:2047:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a03:2060::,2a03:2060:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a03:2080::,2a03:2080:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:20a0::,2a03:20a0:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a03:20c0::,2a03:20c0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:20e0::,2a03:20e0:ffff:ffff:ffff:ffff:ffff:ffff,NO 2a03:2100::,2a03:2100:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a03:2120::,2a03:2120:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a03:2140::,2a03:2140:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:2160::,2a03:2160:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a03:2180::,2a03:2180:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a03:21a0::,2a03:21a0:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a03:21c0::,2a03:21c0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:21e0::,2a03:21e0:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a03:2200::,2a03:2200:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a03:2220::,2a03:2220:ffff:ffff:ffff:ffff:ffff:ffff,DK 2a03:2240::,2a03:2240:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a03:2260::,2a03:2267:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a03:2280::,2a03:2280:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:22a0::,2a03:22a0:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a03:22c0::,2a03:22c0:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a03:2300::,2a03:2300:ffff:ffff:ffff:ffff:ffff:ffff,AM +2a03:22e0::,2a03:22e0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:2300::,2a03:2307:ffff:ffff:ffff:ffff:ffff:ffff,AM +2a03:2320::,2a03:2320:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a03:2340::,2a03:2340:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:2360::,2a03:2360:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a03:2380::,2a03:2380:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:23a0::,2a03:23a0:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a03:23c0::,2a03:23c0:ffff:ffff:ffff:ffff:ffff:ffff,HR +2a03:23e0::,2a03:23e0:ffff:ffff:ffff:ffff:ffff:ffff,TR 2a03:2400::,2a03:2400:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:2420::,2a03:2420:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a03:2440::,2a03:2440:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:2460::,2a03:2460:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a03:2480::,2a03:2480:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:24a0::,2a03:24a0:ffff:ffff:ffff:ffff:ffff:ffff,LT 2a03:24c0::,2a03:24c0:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a03:24e0::,2a03:24e0:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a03:2500::,2a03:2500:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:2520::,2a03:2520:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a03:2540::,2a03:2540:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:2560::,2a03:2560:ffff:ffff:ffff:ffff:ffff:ffff,MK 2a03:2580::,2a03:2580:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:25a0::,2a03:25a0:ffff:ffff:ffff:ffff:ffff:ffff,NO 2a03:25c0::,2a03:25c0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:25e0::,2a03:25e0:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a03:2600::,2a03:2600:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a03:2620::,2a03:2620:ffff:ffff:ffff:ffff:ffff:ffff,TR 2a03:2640::,2a03:2640:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:2660::,2a03:2660:ffff:ffff:ffff:ffff:ffff:ffff,RS 2a03:2680::,2a03:2680:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:26a0::,2a03:26a0:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a03:26c0::,2a03:26c0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:26e0::,2a03:26e0:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a03:2700::,2a03:2700:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:2720::,2a03:2720:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a03:2740::,2a03:2740:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a03:2760::,2a03:2760:ffff:ffff:ffff:ffff:ffff:ffff,SK 2a03:2780::,2a03:2780:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a03:27a0::,2a03:27a0:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a03:27c0::,2a03:27c0:ffff:ffff:ffff:ffff:ffff:ffff,AM +2a03:27e0::,2a03:27e0:ffff:ffff:ffff:ffff:ffff:ffff,CY 2a03:2800::,2a03:2800:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:2820::,2a03:2820:ffff:ffff:ffff:ffff:ffff:ffff,GE 2a03:2840::,2a03:2840:ffff:ffff:ffff:ffff:ffff:ffff,US -2a03:2880::,2a03:2880:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a03:2860::,2a03:2860:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:2880::,2a03:2880:10:ffff:ffff:ffff:ffff:ffff,IE +2a03:2880:11::,2a03:2880:11:ffff:ffff:ffff:ffff:ffff,US +2a03:2880:12::,2a03:2880:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a03:28a0::,2a03:28a0:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a03:28c0::,2a03:28c0:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a03:28e0::,2a03:28e0:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a03:2900::,2a03:2900:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:2920::,2a03:2920:ffff:ffff:ffff:ffff:ffff:ffff,ME 2a03:2940::,2a03:2940:ffff:ffff:ffff:ffff:ffff:ffff,PS +2a03:2960::,2a03:2960:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a03:2980::,2a03:2980:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:29a0::,2a03:29a0:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a03:29c0::,2a03:29c0:ffff:ffff:ffff:ffff:ffff:ffff,EE +2a03:29e0::,2a03:29e0:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a03:2a00::,2a03:2a00:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:2a20::,2a03:2a20:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a03:2a40::,2a03:2a40:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a03:2a60::,2a03:2a60:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a03:2a80::,2a03:2a80:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a03:2aa0::,2a03:2aa0:ffff:ffff:ffff:ffff:ffff:ffff,AE 2a03:2ac0::,2a03:2ac0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:2ae0::,2a03:2ae0:ffff:ffff:ffff:ffff:ffff:ffff,UA 2a03:2b00::,2a03:2b00:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:2b20::,2a03:2b20:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a03:2b40::,2a03:2b40:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:2b60::,2a03:2b60:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a03:2b80::,2a03:2b80:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a03:2ba0::,2a03:2ba0:ffff:ffff:ffff:ffff:ffff:ffff,LU 2a03:2bc0::,2a03:2bc0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:2be0::,2a03:2be0:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a03:2c00::,2a03:2c00:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:2c20::,2a03:2c20:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a03:2c40::,2a03:2c40:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:2c60::,2a03:2c60:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a03:2c80::,2a03:2c80:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:2ca0::,2a03:2ca0:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a03:2cc0::,2a03:2cc0:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a03:2d00::,2a03:2d00:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:2d20::,2a03:2d20:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:2d60::,2a03:2d60:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a03:2d80::,2a03:2d80:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:2da0::,2a03:2da0:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a03:2dc0::,2a03:2dc0:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a03:2de0::,2a03:2de0:ffff:ffff:ffff:ffff:ffff:ffff,AL 2a03:2e00::,2a03:2e00:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:2e20::,2a03:2e20:ffff:ffff:ffff:ffff:ffff:ffff,LV 2a03:2e40::,2a03:2e40:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:2e60::,2a03:2e60:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:2ea0::,2a03:2ea0:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a03:2ec0::,2a03:2ec0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:2ee0::,2a03:2ee0:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a03:2f00::,2a03:2f00:ffff:ffff:ffff:ffff:ffff:ffff,LU +2a03:2f20::,2a03:2f20:ffff:ffff:ffff:ffff:ffff:ffff,IR 2a03:2f40::,2a03:2f40:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a03:2f60::,2a03:2f60:ffff:ffff:ffff:ffff:ffff:ffff,HU 2a03:2f80::,2a03:2f80:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a03:2fa0::,2a03:2fa0:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a03:2fc0::,2a03:2fc0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:2fe0::,2a03:2fe0:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a03:3000::,2a03:3000:ffff:ffff:ffff:ffff:ffff:ffff,BY +2a03:3020::,2a03:3020:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a03:3040::,2a03:3040:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a03:3060::,2a03:3060:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:30a0::,2a03:30a0:ffff:ffff:ffff:ffff:ffff:ffff,FI 2a03:30c0::,2a03:30c0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:30e0::,2a03:30e0:ffff:ffff:ffff:ffff:ffff:ffff,GE 2a03:3100::,2a03:3100:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:3120::,2a03:3120:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a03:3140::,2a03:3140:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a03:3160::,2a03:3160:ffff:ffff:ffff:ffff:ffff:ffff,AT 2a03:3180::,2a03:3180:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a03:31a0::,2a03:31a0:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a03:31c0::,2a03:31c0:ffff:ffff:ffff:ffff:ffff:ffff,BE 2a03:3200::,2a03:3200:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:3220::,2a03:3220:ffff:ffff:ffff:ffff:ffff:ffff,FI 2a03:3240::,2a03:3240:ffff:ffff:ffff:ffff:ffff:ffff,UZ +2a03:3260::,2a03:3260:ffff:ffff:ffff:ffff:ffff:ffff,NO 2a03:3280::,2a03:3280:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:32a0::,2a03:32a0:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a03:32c0::,2a03:32c0:ffff:ffff:ffff:ffff:ffff:ffff,KZ +2a03:32e0::,2a03:32e0:ffff:ffff:ffff:ffff:ffff:ffff,RO 2a03:3300::,2a03:3300:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:3320::,2a03:3320:ffff:ffff:ffff:ffff:ffff:ffff,BA 2a03:3340::,2a03:3340:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a03:3360::,2a03:3360:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a03:3380::,2a03:3380:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a03:33a0::,2a03:33a0:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a03:33c0::,2a03:33c0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:33e0::,2a03:33e0:ffff:ffff:ffff:ffff:ffff:ffff,AL 2a03:3400::,2a03:3400:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:3420::,2a03:3420:ffff:ffff:ffff:ffff:ffff:ffff,LI 2a03:3440::,2a03:3440:ffff:ffff:ffff:ffff:ffff:ffff,LV +2a03:3460::,2a03:3460:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a03:3480::,2a03:3480:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:34a0::,2a03:34a0:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a03:34c0::,2a03:34c0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:34e0::,2a03:34e0:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a03:3500::,2a03:3500:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:3520::,2a03:3520:ffff:ffff:ffff:ffff:ffff:ffff,TR 2a03:3540::,2a03:3547:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a03:3580::,2a03:3580:ffff:ffff:ffff:ffff:ffff:ffff,GE +2a03:35a0::,2a03:35a0:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a03:35c0::,2a03:35c0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:35e0::,2a03:35e0:ffff:ffff:ffff:ffff:ffff:ffff,TR 2a03:3600::,2a03:3600:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a03:3620::,2a03:3620:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a03:3640::,2a03:3640:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:3660::,2a03:3660:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a03:3680::,2a03:3680:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:36a0::,2a03:36a0:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a03:36c0::,2a03:36c0:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a03:36e0::,2a03:36e0:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a03:3700::,2a03:3700:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:3720::,2a03:3720:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a03:3760::,2a03:3760:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a03:37a0::,2a03:37a0:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a03:37c0::,2a03:37c0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:37e0::,2a03:37e0:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a03:3800::,2a03:3800:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a03:3820::,2a03:3820:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a03:3840::,2a03:3847:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a03:3880::,2a03:3880:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:38a0::,2a03:38a0:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a03:38c0::,2a03:38c0:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a03:38e0::,2a03:38e0:ffff:ffff:ffff:ffff:ffff:ffff,LU 2a03:3900::,2a03:3900:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:3920::,2a03:3920:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a03:3940::,2a03:3940:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:3960::,2a03:3960:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a03:3980::,2a03:3980:ffff:ffff:ffff:ffff:ffff:ffff,BY 2a03:39c0::,2a03:39c0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:39e0::,2a03:39e0:ffff:ffff:ffff:ffff:ffff:ffff,HR 2a03:3a00::,2a03:3a00:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a03:3a20::,2a03:3a20:ffff:ffff:ffff:ffff:ffff:ffff,AE 2a03:3a40::,2a03:3a40:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a03:3a80::,2a03:3a80:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:3aa0::,2a03:3aa0:ffff:ffff:ffff:ffff:ffff:ffff,AL 2a03:3ac0::,2a03:3ac0:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a03:3ae0::,2a03:3ae0:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a03:3b00::,2a03:3b00:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:3b20::,2a03:3b20:ffff:ffff:ffff:ffff:ffff:ffff,CY 2a03:3b40::,2a03:3b40:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a03:3b60::,2a03:3b60:ffff:ffff:ffff:ffff:ffff:ffff,IR 2a03:3b80::,2a03:3b80:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a03:3ba0::,2a03:3ba0:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a03:3bc0::,2a03:3bc0:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a03:3be0::,2a03:3be0:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a03:3c00::,2a03:3c00:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:3c20::,2a03:3c20:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a03:3c40::,2a03:3c40:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:3c60::,2a03:3c60:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a03:3c80::,2a03:3c80:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:3ca0::,2a03:3ca0:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a03:3cc0::,2a03:3cc7:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a03:3d00::,2a03:3d00:ffff:ffff:ffff:ffff:ffff:ffff,AM +2a03:3d20::,2a03:3d20:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a03:3d40::,2a03:3d40:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:3d60::,2a03:3d60:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a03:3d80::,2a03:3d80:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:3da0::,2a03:3da0:ffff:ffff:ffff:ffff:ffff:ffff,HU 2a03:3dc0::,2a03:3dc0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:3e00::,2a03:3e00:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:3de0::,2a03:3de0:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:3e00::,2a03:3e07:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a03:3e40::,2a03:3e40:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:3e60::,2a03:3e60:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a03:3e80::,2a03:3e80:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:3ea0::,2a03:3ea0:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a03:3ec0::,2a03:3ec0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:3ee0::,2a03:3ee0:ffff:ffff:ffff:ffff:ffff:ffff,JO 2a03:3f00::,2a03:3f00:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a03:3f20::,2a03:3f20:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a03:3f40::,2a03:3f40:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:3f60::,2a03:3f60:ffff:ffff:ffff:ffff:ffff:ffff,PT 2a03:3f80::,2a03:3f80:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:3fa0::,2a03:3fa0:ffff:ffff:ffff:ffff:ffff:ffff,DK 2a03:3fc0::,2a03:3fc0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:3fe0::,2a03:3fe0:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a03:4000::,2a03:4000:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:4020::,2a03:4020:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a03:4040::,2a03:4040:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:4060::,2a03:4060:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a03:4080::,2a03:4080:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:40a0::,2a03:40a0:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a03:40c0::,2a03:40c0:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a03:40e0::,2a03:40e0:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a03:4100::,2a03:4107:ffff:ffff:ffff:ffff:ffff:ffff,RO 2a03:4140::,2a03:4140:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:4160::,2a03:4160:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a03:4180::,2a03:4180:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a03:41a0::,2a03:41a0:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a03:41c0::,2a03:41c0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:41e0::,2a03:41e0:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a03:4200::,2a03:4200:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:4220::,2a03:4220:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a03:4240::,2a03:4240:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:4260::,2a03:4260:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a03:4280::,2a03:4280:ffff:ffff:ffff:ffff:ffff:ffff,HR +2a03:42a0::,2a03:42a0:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a03:42c0::,2a03:42c0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:42e0::,2a03:42e0:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a03:4300::,2a03:4307:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a03:4340::,2a03:4340:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:4360::,2a03:4360:ffff:ffff:ffff:ffff:ffff:ffff,EE 2a03:4380::,2a03:4380:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a03:43a0::,2a03:43a0:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a03:43c0::,2a03:43c0:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a03:43e0::,2a03:43e0:ffff:ffff:ffff:ffff:ffff:ffff,LI 2a03:4400::,2a03:4400:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a03:4440::,2a03:4440:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a03:4460::,2a03:4460:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a03:4480::,2a03:4480:ffff:ffff:ffff:ffff:ffff:ffff,AZ +2a03:44a0::,2a03:44a0:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a03:44c0::,2a03:44c0:ffff:ffff:ffff:ffff:ffff:ffff,HU 2a03:4500::,2a03:4500:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:4520::,2a03:4520:ffff:ffff:ffff:ffff:ffff:ffff,GE 2a03:4540::,2a03:4540:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:4560::,2a03:4560:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a03:4580::,2a03:4580:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:45a0::,2a03:45a0:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a03:45c0::,2a03:45c0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:45e0::,2a03:45e0:ffff:ffff:ffff:ffff:ffff:ffff,GE 2a03:4600::,2a03:4600:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:4620::,2a03:4620:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a03:4640::,2a03:4640:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:4680::,2a03:4680:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a03:4680::,2a03:4687:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a03:46a0::,2a03:46a0:ffff:ffff:ffff:ffff:ffff:ffff,BG 2a03:46c0::,2a03:46c0:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a03:46e0::,2a03:46e0:ffff:ffff:ffff:ffff:ffff:ffff,UZ 2a03:4700::,2a03:4700:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:4720::,2a03:4720:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a03:4740::,2a03:4740:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:4760::,2a03:4760:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a03:4780::,2a03:4780:ffff:ffff:ffff:ffff:ffff:ffff,KW +2a03:47a0::,2a03:47a0:ffff:ffff:ffff:ffff:ffff:ffff,SK 2a03:47c0::,2a03:47c7:ffff:ffff:ffff:ffff:ffff:ffff,IQ 2a03:4800::,2a03:4800:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:4820::,2a03:4820:ffff:ffff:ffff:ffff:ffff:ffff,GE 2a03:4840::,2a03:4847:ffff:ffff:ffff:ffff:ffff:ffff,AL 2a03:4880::,2a03:4880:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:48a0::,2a03:48a0:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a03:48c0::,2a03:48c0:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a03:48e0::,2a03:48e0:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a03:4900::,2a03:4900:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:4920::,2a03:4920:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a03:4940::,2a03:4940:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a03:4960::,2a03:4960:ffff:ffff:ffff:ffff:ffff:ffff,RS 2a03:4980::,2a03:4980:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:49a0::,2a03:49a0:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a03:49c0::,2a03:49c0:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a03:4a00::,2a03:4a00:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:49e0::,2a03:49e0:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a03:4a20::,2a03:4a20:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a03:4a40::,2a03:4a40:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:4a60::,2a03:4a60:ffff:ffff:ffff:ffff:ffff:ffff,SA 2a03:4a80::,2a03:4a80:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:4aa0::,2a03:4aa0:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a03:4ac0::,2a03:4ac0:ffff:ffff:ffff:ffff:ffff:ffff,KZ +2a03:4ae0::,2a03:4ae0:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a03:4b00::,2a03:4b00:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a03:4b20::,2a03:4b20:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a03:4b40::,2a03:4b40:ffff:ffff:ffff:ffff:ffff:ffff,IQ 2a03:4b80::,2a03:4b80:ffff:ffff:ffff:ffff:ffff:ffff,AL 2a03:4bc0::,2a03:4bc0:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a03:4c00::,2a03:4c07:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a03:4c40::,2a03:4c40:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a03:4c60::,2a03:4c60:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a03:4c80::,2a03:4c80:ffff:ffff:ffff:ffff:ffff:ffff,LI +2a03:4ca0::,2a03:4ca0:ffff:ffff:ffff:ffff:ffff:ffff,HU 2a03:4cc0::,2a03:4cc0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:4ce0::,2a03:4ce0:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a03:4d00::,2a03:4d00:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:4d20::,2a03:4d20:ffff:ffff:ffff:ffff:ffff:ffff,FI 2a03:4d40::,2a03:4d40:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:4d60::,2a03:4d60:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a03:4d80::,2a03:4d80:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:4da0::,2a03:4da0:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a03:4dc0::,2a03:4dc0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:4de0::,2a03:4de0:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a03:4e00::,2a03:4e00:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:4e20::,2a03:4e20:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a03:4e40::,2a03:4e40:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a03:4e60::,2a03:4e60:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a03:4e80::,2a03:4e80:ffff:ffff:ffff:ffff:ffff:ffff,GE +2a03:4ea0::,2a03:4ea0:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a03:4ec0::,2a03:4ec0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:4ee0::,2a03:4ee0:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a03:4f00::,2a03:4f00:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:4f20::,2a03:4f20:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a03:4f40::,2a03:4f40:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:4f60::,2a03:4f60:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a03:4f80::,2a03:4f80:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:4fa0::,2a03:4fa0:ffff:ffff:ffff:ffff:ffff:ffff,TR 2a03:5000::,2a03:5000:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:5020::,2a03:5020:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a03:5040::,2a03:5040:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:5060::,2a03:5060:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a03:5080::,2a03:5080:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:50a0::,2a03:50a0:ffff:ffff:ffff:ffff:ffff:ffff,FI 2a03:50c0::,2a03:50c0:ffff:ffff:ffff:ffff:ffff:ffff,GI +2a03:50e0::,2a03:50e0:ffff:ffff:ffff:ffff:ffff:ffff,MT 2a03:5100::,2a03:5100:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a03:5120::,2a03:5120:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a03:5140::,2a03:5140:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:5160::,2a03:5160:ffff:ffff:ffff:ffff:ffff:ffff,TR 2a03:5180::,2a03:5180:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a03:51a0::,2a03:51a0:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a03:51c0::,2a03:51c0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:51e0::,2a03:51e0:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a03:5200::,2a03:5200:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:5220::,2a03:5220:ffff:ffff:ffff:ffff:ffff:ffff,GR 2a03:5240::,2a03:5240:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:5260::,2a03:5260:ffff:ffff:ffff:ffff:ffff:ffff,LI 2a03:5280::,2a03:5280:ffff:ffff:ffff:ffff:ffff:ffff,AT 2a03:52c0::,2a03:52c0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:52e0::,2a03:52e0:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a03:5300::,2a03:5307:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:5360::,2a03:5360:ffff:ffff:ffff:ffff:ffff:ffff,LI 2a03:5380::,2a03:5380:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:53a0::,2a03:53a0:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a03:53c0::,2a03:53c0:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a03:53e0::,2a03:53e0:ffff:ffff:ffff:ffff:ffff:ffff,UA 2a03:5400::,2a03:5400:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a03:5420::,2a03:5420:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a03:5440::,2a03:5440:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a03:5460::,2a03:5460:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a03:5480::,2a03:5480:ffff:ffff:ffff:ffff:ffff:ffff,LI 2a03:54c0::,2a03:54c0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:54e0::,2a03:54e0:ffff:ffff:ffff:ffff:ffff:ffff,AT 2a03:5500::,2a03:5501:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:5520::,2a03:5520:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a03:5540::,2a03:5540:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:5560::,2a03:5560:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a03:5580::,2a03:5587:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a03:55c0::,2a03:55c0:ffff:ffff:ffff:ffff:ffff:ffff,BE 2a03:5600::,2a03:5600:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:5620::,2a03:5620:ffff:ffff:ffff:ffff:ffff:ffff,AM 2a03:5640::,2a03:5640:ffff:ffff:ffff:ffff:ffff:ffff,LU 2a03:5680::,2a03:5680:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a03:56c0::,2a03:56c0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:56e0::,2a03:56e0:ffff:ffff:ffff:ffff:ffff:ffff,BG 2a03:5700::,2a03:5700:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:5720::,2a03:5720:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a03:5740::,2a03:5740:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:5760::,2a03:5760:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a03:5780::,2a03:5780:ffff:ffff:ffff:ffff:ffff:ffff,KW +2a03:57a0::,2a03:57a0:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a03:57c0::,2a03:57c0:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a03:57e0::,2a03:57e0:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a03:5800::,2a03:5800:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:5820::,2a03:5820:ffff:ffff:ffff:ffff:ffff:ffff,EE 2a03:5840::,2a03:5840:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:5860::,2a03:5860:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a03:5880::,2a03:5880:ffff:ffff:ffff:ffff:ffff:ffff,EE +2a03:58a0::,2a03:58a0:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a03:58c0::,2a03:58c0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:58e0::,2a03:58e0:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a03:5900::,2a03:5907:ffff:ffff:ffff:ffff:ffff:ffff,LB 2a03:5940::,2a03:5940:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:5960::,2a03:5960:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a03:5980::,2a03:5980:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:59a0::,2a03:59a0:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a03:59c0::,2a03:59c0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:59e0::,2a03:59e0:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a03:5a00::,2a03:5a07:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:5a60::,2a03:5a60:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a03:5a80::,2a03:5a80:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:5aa0::,2a03:5aa0:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a03:5ac0::,2a03:5ac0:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a03:5ae0::,2a03:5ae0:ffff:ffff:ffff:ffff:ffff:ffff,HU 2a03:5b00::,2a03:5b00:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a03:5b20::,2a03:5b20:ffff:ffff:ffff:ffff:ffff:ffff,RE 2a03:5b40::,2a03:5b40:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:5b60::,2a03:5b60:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a03:5b80::,2a03:5b80:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a03:5bc0::,2a03:5bc0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:5be0::,2a03:5be0:ffff:ffff:ffff:ffff:ffff:ffff,BY 2a03:5c00::,2a03:5c00:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:5c40::,2a03:5c40:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:5c20::,2a03:5c20:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:5c60::,2a03:5c60:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a03:5c80::,2a03:5c80:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a03:5cc0::,2a03:5cc0:ffff:ffff:ffff:ffff:ffff:ffff,BA +2a03:5ca0::,2a03:5ca0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:5ce0::,2a03:5ce0:ffff:ffff:ffff:ffff:ffff:ffff,BG 2a03:5d00::,2a03:5d07:ffff:ffff:ffff:ffff:ffff:ffff,TR 2a03:5d40::,2a03:5d40:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:5d60::,2a03:5d60:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a03:5d80::,2a03:5d80:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:5da0::,2a03:5da0:ffff:ffff:ffff:ffff:ffff:ffff,GR 2a03:5dc0::,2a03:5dc0:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a03:5de0::,2a03:5de0:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a03:5e20::,2a03:5e20:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a03:5e40::,2a03:5e40:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a03:5e60::,2a03:5e60:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a03:5e80::,2a03:5e80:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a03:5ea0::,2a03:5ea0:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a03:5ec0::,2a03:5ec0:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a03:5ee0::,2a03:5ee0:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a03:5f00::,2a03:5f00:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a03:5f20::,2a03:5f20:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:5f60::,2a03:5f60:ffff:ffff:ffff:ffff:ffff:ffff,HU 2a03:5f80::,2a03:5f80:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:5fa0::,2a03:5fa0:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a03:5fc0::,2a03:5fc0:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a03:5fe0::,2a03:5fe0:ffff:ffff:ffff:ffff:ffff:ffff,RS 2a03:6000::,2a03:6000:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:6020::,2a03:6020:ffff:ffff:ffff:ffff:ffff:ffff,AZ 2a03:6040::,2a03:6040:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:6060::,2a03:6060:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a03:6080::,2a03:6087:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a03:60c0::,2a03:60c0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:60e0::,2a03:60e0:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a03:6100::,2a03:6100:ffff:ffff:ffff:ffff:ffff:ffff,HR +2a03:6120::,2a03:6120:ffff:ffff:ffff:ffff:ffff:ffff,UA 2a03:6140::,2a03:6140:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:6160::,2a03:6160:ffff:ffff:ffff:ffff:ffff:ffff,AZ 2a03:6180::,2a03:6180:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a03:61a0::,2a03:61a0:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a03:61c0::,2a03:61c0:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a03:6200::,2a03:6200:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:6220::,2a03:6220:ffff:ffff:ffff:ffff:ffff:ffff,HR 2a03:6240::,2a03:6240:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a03:6260::,2a03:6260:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:62a0::,2a03:62a0:ffff:ffff:ffff:ffff:ffff:ffff,AU 2a03:62c0::,2a03:62c0:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:62e0::,2a03:62e0:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a03:6300::,2a03:6300:ffff:ffff:ffff:ffff:ffff:ffff,UA 2a03:6340::,2a03:6340:ffff:ffff:ffff:ffff:ffff:ffff,KZ 2a03:6380::,2a03:6380:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a03:63a0::,2a03:63a7:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a03:63c0::,2a03:63c0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:63e0::,2a03:63e0:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a03:6400::,2a03:6400:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:6420::,2a03:6420:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a03:6440::,2a03:6440:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:6460::,2a03:6460:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a03:6480::,2a03:6480:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:64a0::,2a03:64a0:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a03:64c0::,2a03:64c0:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a03:64e0::,2a03:64e0:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a03:6500::,2a03:6500:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:6520::,2a03:6520:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a03:6540::,2a03:6540:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a03:6560::,2a03:6560:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a03:6580::,2a03:6580:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:65a0::,2a03:65a0:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a03:65c0::,2a03:65c0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:65e0::,2a03:65e0:ffff:ffff:ffff:ffff:ffff:ffff,AT 2a03:6600::,2a03:6600:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a03:6620::,2a03:6620:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a03:6640::,2a03:6640:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a03:6660::,2a03:6660:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a03:6680::,2a03:6680:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a03:66a0::,2a03:66a0:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a03:66c0::,2a03:66c0:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:66e0::,2a03:66e0:ffff:ffff:ffff:ffff:ffff:ffff,DK 2a03:6700::,2a03:6707:ffff:ffff:ffff:ffff:ffff:ffff,KW 2a03:6740::,2a03:6740:ffff:ffff:ffff:ffff:ffff:ffff,LV +2a03:6760::,2a03:6760:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a03:6780::,2a03:6780:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a03:67a0::,2a03:67a0:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a03:67c0::,2a03:67c0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:67e0::,2a03:67e0:ffff:ffff:ffff:ffff:ffff:ffff,LT 2a03:6800::,2a03:6800:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a03:6820::,2a03:6820:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a03:6840::,2a03:6840:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:6860::,2a03:6860:ffff:ffff:ffff:ffff:ffff:ffff,BE 2a03:6880::,2a03:6880:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:68a0::,2a03:68a0:ffff:ffff:ffff:ffff:ffff:ffff,BE 2a03:68c0::,2a03:68c0:ffff:ffff:ffff:ffff:ffff:ffff,CY +2a03:68e0::,2a03:68e0:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a03:6900::,2a03:6900:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a03:6920::,2a03:6920:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a03:6940::,2a03:6940:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:6960::,2a03:6960:ffff:ffff:ffff:ffff:ffff:ffff,DK 2a03:6980::,2a03:6980:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:69a0::,2a03:69a0:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a03:69c0::,2a03:69c0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:6a00::,2a03:6a00:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:6a00::,2a03:6a07:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a03:6a40::,2a03:6a40:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a03:6a80::,2a03:6a80:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a03:6ac0::,2a03:6ac0:ffff:ffff:ffff:ffff:ffff:ffff,IQ 2a03:6b00::,2a03:6b00:ffff:ffff:ffff:ffff:ffff:ffff,JO 2a03:6b40::,2a03:6b40:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a03:6b80::,2a03:6b80:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a03:6bc0::,2a03:6bc7:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a03:6c00::,2a03:6c00:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a03:6c40::,2a03:6c40:ffff:ffff:ffff:ffff:ffff:ffff,TR 2a03:6c80::,2a03:6c80:ffff:ffff:ffff:ffff:ffff:ffff,FR @@ -14100,7 +19642,6 @@ 2a03:b240::,2a03:b240:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a03:b280::,2a03:b280:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a03:b300::,2a03:b300:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:b340::,2a03:b340:ffff:ffff:ffff:ffff:ffff:ffff,IR 2a03:b380::,2a03:b380:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a03:b3c0::,2a03:b3c0:ffff:ffff:ffff:ffff:ffff:ffff,TR 2a03:b400::,2a03:b400:ffff:ffff:ffff:ffff:ffff:ffff,DE @@ -14200,7 +19741,6 @@ 2a03:cb80::,2a03:cb80:ffff:ffff:ffff:ffff:ffff:ffff,BA 2a03:cbc0::,2a03:cbc7:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a03:cc00::,2a03:cc00:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a03:cc40::,2a03:cc40:ffff:ffff:ffff:ffff:ffff:ffff,DK 2a03:cc80::,2a03:cc80:ffff:ffff:ffff:ffff:ffff:ffff,BA 2a03:ccc0::,2a03:ccc0:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a03:cd00::,2a03:cd00:ffff:ffff:ffff:ffff:ffff:ffff,US @@ -14214,14 +19754,14 @@ 2a03:cf40::,2a03:cf40:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a03:cf80::,2a03:cf80:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a03:cfc0::,2a03:cfc0:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a03:d000::,2a03:d000:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a03:d000::,2a03:d007:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a03:d040::,2a03:d040:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a03:d080::,2a03:d080:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a03:d0c0::,2a03:d0c0:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a03:d100::,2a03:d100:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a03:d140::,2a03:d140:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a03:d180::,2a03:d180:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a03:d1c0::,2a03:d1c0:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:d1c0::,2a03:d1c7:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a03:d200::,2a03:d200:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a03:d280::,2a03:d280:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a03:d2c0::,2a03:d2c0:ffff:ffff:ffff:ffff:ffff:ffff,IT @@ -14231,7 +19771,9 @@ 2a03:d3c0::,2a03:d3c0:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a03:d400::,2a03:d400:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a03:d440::,2a03:d440:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a03:d480::,2a03:d480:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:d480::,2a03:d480::ffff:ffff:ffff:ffff:ffff,GB +2a03:d480:1::,2a03:d480:1:ffff:ffff:ffff:ffff:ffff,IM +2a03:d480:2::,2a03:d480:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a03:d4c0::,2a03:d4c0:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a03:d500::,2a03:d500:ffff:ffff:ffff:ffff:ffff:ffff,NO 2a03:d540::,2a03:d540:ffff:ffff:ffff:ffff:ffff:ffff,SE @@ -14531,13 +20073,11 @@ 2a04:2000::,2a04:2007:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a04:2040::,2a04:2047:ffff:ffff:ffff:ffff:ffff:ffff,RO 2a04:2080::,2a04:2087:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a04:20c0::,2a04:20c7:ffff:ffff:ffff:ffff:ffff:ffff,TR 2a04:2100::,2a04:2107:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a04:2140::,2a04:2147:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a04:2180::,2a04:2187:ffff:ffff:ffff:ffff:ffff:ffff,LT 2a04:21c0::,2a04:21c7:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a04:2200::,2a04:2207:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:2240::,2a04:2247:ffff:ffff:ffff:ffff:ffff:ffff,BH 2a04:2280::,2a04:2287:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a04:22c0::,2a04:22c7:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a04:2300::,2a04:2307:ffff:ffff:ffff:ffff:ffff:ffff,SE @@ -14790,7 +20330,6 @@ 2a04:6540::,2a04:6547:ffff:ffff:ffff:ffff:ffff:ffff,NO 2a04:6580::,2a04:6587:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a04:65c0::,2a04:65c7:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a04:6600::,2a04:6607:ffff:ffff:ffff:ffff:ffff:ffff,NO 2a04:6640::,2a04:6647:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a04:6650::,2a04:6651:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a04:6680::,2a04:6687:ffff:ffff:ffff:ffff:ffff:ffff,TR @@ -14805,7 +20344,6 @@ 2a04:68c0::,2a04:68c7:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a04:6900::,2a04:6907:ffff:ffff:ffff:ffff:ffff:ffff,UA 2a04:6940::,2a04:6947:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:6980::,2a04:6987:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a04:69c0::,2a04:69c7:ffff:ffff:ffff:ffff:ffff:ffff,MK 2a04:6a00::,2a04:6a07:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a04:6a40::,2a04:6a47:ffff:ffff:ffff:ffff:ffff:ffff,RU @@ -14819,7 +20357,6 @@ 2a04:6c40::,2a04:6c47:ffff:ffff:ffff:ffff:ffff:ffff,BE 2a04:6c80::,2a04:6c87:ffff:ffff:ffff:ffff:ffff:ffff,RO 2a04:6cc0::,2a04:6cc7:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a04:6d00::,2a04:6d07:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a04:6d40::,2a04:6d47:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a04:6d80::,2a04:6d87:ffff:ffff:ffff:ffff:ffff:ffff,PT 2a04:6dc0::,2a04:6dc7:ffff:ffff:ffff:ffff:ffff:ffff,NL @@ -14864,7 +20401,6 @@ 2a04:7740::,2a04:7747:ffff:ffff:ffff:ffff:ffff:ffff,IQ 2a04:7780::,2a04:7787:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a04:77c0::,2a04:77c7:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a04:7800::,2a04:7807:ffff:ffff:ffff:ffff:ffff:ffff,DK 2a04:7840::,2a04:7847:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a04:7880::,2a04:7887:ffff:ffff:ffff:ffff:ffff:ffff,NO 2a04:78c0::,2a04:78c3:ffff:ffff:ffff:ffff:ffff:ffff,DE @@ -14930,7 +20466,6 @@ 2a04:8740::,2a04:8747:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a04:8780::,2a04:8787:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a04:87c0::,2a04:87c7:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a04:8800::,2a04:8807:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a04:8840::,2a04:8847:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a04:8880::,2a04:8887:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a04:88c0::,2a04:88c7:ffff:ffff:ffff:ffff:ffff:ffff,RU @@ -15043,7 +20578,6 @@ 2a04:a3c0::,2a04:a3c7:ffff:ffff:ffff:ffff:ffff:ffff,DK 2a04:a400::,2a04:a407:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a04:a440::,2a04:a440:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:a450::,2a04:a451:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a04:a460::,2a04:a461:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a04:a470::,2a04:a471:ffff:ffff:ffff:ffff:ffff:ffff,DK 2a04:a480::,2a04:a487:ffff:ffff:ffff:ffff:ffff:ffff,FR @@ -15069,7 +20603,6 @@ 2a04:a980::,2a04:a987:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a04:a9c0::,2a04:a9c7:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a04:aa00::,2a04:aa07:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a04:aa40::,2a04:aa47:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a04:aa80::,2a04:aa87:ffff:ffff:ffff:ffff:ffff:ffff,SA 2a04:aac0::,2a04:aac7:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a04:ab00::,2a04:ab07:ffff:ffff:ffff:ffff:ffff:ffff,GB @@ -15147,7 +20680,6 @@ 2a04:be80::,2a04:be87:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a04:bec0::,2a04:bec7:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a04:bf00::,2a04:bf07:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a04:bf40::,2a04:bf47:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a04:bf80::,2a04:bf87:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a04:bfc0::,2a04:bfc7:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a04:c000::,2a04:c007:ffff:ffff:ffff:ffff:ffff:ffff,CH @@ -15182,7 +20714,6 @@ 2a04:c800::,2a04:c807:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a04:c840::,2a04:c847:ffff:ffff:ffff:ffff:ffff:ffff,AZ 2a04:c880::,2a04:c887:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a04:c8c0::,2a04:c8c7:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a04:c900::,2a04:c907:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a04:c940::,2a04:c947:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a04:c980::,2a04:c987:ffff:ffff:ffff:ffff:ffff:ffff,GB @@ -15249,7 +20780,6 @@ 2a04:d900::,2a04:d907:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a04:d940::,2a04:d947:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a04:d980::,2a04:d987:ffff:ffff:ffff:ffff:ffff:ffff,IL -2a04:d9c0::,2a04:d9c7:ffff:ffff:ffff:ffff:ffff:ffff,RO 2a04:da00::,2a04:da07:ffff:ffff:ffff:ffff:ffff:ffff,AE 2a04:da40::,2a04:da47:ffff:ffff:ffff:ffff:ffff:ffff,IR 2a04:da80::,2a04:da87:ffff:ffff:ffff:ffff:ffff:ffff,GB @@ -15311,9 +20841,7 @@ 2a04:e900::,2a04:e907:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a04:e940::,2a04:e947:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a04:e980::,2a04:e987:ffff:ffff:ffff:ffff:ffff:ffff,IL -2a04:e9c0::,2a04:e9c7:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a04:ea00::,2a04:ea07:ffff:ffff:ffff:ffff:ffff:ffff,AE -2a04:ea40::,2a04:ea47:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a04:ea80::,2a04:ea87:ffff:ffff:ffff:ffff:ffff:ffff,LB 2a04:eac0::,2a04:eac7:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a04:eb00::,2a04:eb07:ffff:ffff:ffff:ffff:ffff:ffff,LT @@ -15321,6 +20849,7 @@ 2a04:eb80::,2a04:eb87:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a04:ebc0::,2a04:ebc7:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a04:ec00::,2a04:ec01:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a04:ec10::,2a04:ec11:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a04:ec20::,2a04:ec23:ffff:ffff:ffff:ffff:ffff:ffff,RS 2a04:ec40::,2a04:ec47:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a04:ec80::,2a04:ec87:ffff:ffff:ffff:ffff:ffff:ffff,DE @@ -15349,7 +20878,6 @@ 2a04:f280::,2a04:f287:ffff:ffff:ffff:ffff:ffff:ffff,BG 2a04:f2c0::,2a04:f2c7:ffff:ffff:ffff:ffff:ffff:ffff,BA 2a04:f300::,2a04:f300:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a04:f320::,2a04:f323:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a04:f340::,2a04:f347:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a04:f380::,2a04:f387:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a04:f3c0::,2a04:f3c7:ffff:ffff:ffff:ffff:ffff:ffff,FR @@ -15383,7 +20911,6 @@ 2a04:fbc0::,2a04:fbc7:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a04:fc00::,2a04:fc07:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a04:fc40::,2a04:fc47:ffff:ffff:ffff:ffff:ffff:ffff,LU -2a04:fc80::,2a04:fc87:ffff:ffff:ffff:ffff:ffff:ffff,IR 2a04:fcc0::,2a04:fcc7:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a04:fd00::,2a04:fd07:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a04:ff40::,2a04:ff47:ffff:ffff:ffff:ffff:ffff:ffff,AT @@ -15412,6 +20939,567 @@ 2a05:500::,2a05:507:ffff:ffff:ffff:ffff:ffff:ffff,UA 2a05:540::,2a05:547:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a05:580::,2a05:587:ffff:ffff:ffff:ffff:ffff:ffff,AE +2a05:5c0::,2a05:5c7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a05:600::,2a05:607:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a05:640::,2a05:647:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:680::,2a05:687:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:6c0::,2a05:6c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:700::,2a05:707:ffff:ffff:ffff:ffff:ffff:ffff,LU +2a05:740::,2a05:747:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a05:780::,2a05:787:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:7c0::,2a05:7c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:800::,2a05:807:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a05:840::,2a05:843:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:860::,2a05:863:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:880::,2a05:887:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:8c0::,2a05:8c7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a05:900::,2a05:907:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:940::,2a05:947:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:980::,2a05:987:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a05:9c0::,2a05:9c7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:a00::,2a05:a07:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a05:a40::,2a05:a47:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a05:a80::,2a05:a87:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a05:ac0::,2a05:ac7:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a05:b00::,2a05:b07:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a05:b40::,2a05:b47:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:b80::,2a05:b87:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:bc0::,2a05:bc7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:c00::,2a05:c07:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a05:c40::,2a05:c47:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a05:c80::,2a05:c87:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a05:cc0::,2a05:cc7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:d00::,2a05:d07:ffff:ffff:ffff:ffff:ffff:ffff,CY +2a05:d40::,2a05:d47:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:d80::,2a05:d87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:dc0::,2a05:dc7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a05:e00::,2a05:e07:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:e40::,2a05:e47:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a05:e80::,2a05:e87:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a05:ec0::,2a05:ec7:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a05:f00::,2a05:f07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:f40::,2a05:f47:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:f80::,2a05:f87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:fc0::,2a05:fc7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:1000::,2a05:1007:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:1040::,2a05:1047:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:1080::,2a05:1087:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:10c0::,2a05:10c7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a05:1100::,2a05:1107:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:1140::,2a05:1147:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a05:1180::,2a05:1187:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:11c0::,2a05:11c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:1200::,2a05:1203:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a05:1220::,2a05:1223:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a05:1240::,2a05:1247:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:1280::,2a05:1287:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a05:12c0::,2a05:12c7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a05:1300::,2a05:1307:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:1340::,2a05:1347:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a05:1380::,2a05:1387:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a05:13c0::,2a05:13c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:1400::,2a05:1407:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a05:1440::,2a05:1447:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:1480::,2a05:1487:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a05:14c0::,2a05:14c7:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a05:1540::,2a05:1547:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a05:1580::,2a05:1587:ffff:ffff:ffff:ffff:ffff:ffff,LT +2a05:15c0::,2a05:15c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:1600::,2a05:1607:ffff:ffff:ffff:ffff:ffff:ffff,LU +2a05:1640::,2a05:1647:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a05:1680::,2a05:1687:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:16c0::,2a05:16c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:1700::,2a05:1707:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:1740::,2a05:1747:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:1780::,2a05:1787:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a05:17c0::,2a05:17c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:1800::,2a05:1807:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:1840::,2a05:1847:ffff:ffff:ffff:ffff:ffff:ffff,HR +2a05:1880::,2a05:1887:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a05:18c0::,2a05:18c7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a05:1900::,2a05:1907:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:1940::,2a05:1947:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a05:1980::,2a05:1987:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a05:19c0::,2a05:19c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:1a00::,2a05:1a3f:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a05:1c00::,2a05:1c07:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a05:1c40::,2a05:1c47:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a05:1c80::,2a05:1c87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:1cc0::,2a05:1cc7:ffff:ffff:ffff:ffff:ffff:ffff,EE +2a05:1d00::,2a05:1d07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:1d40::,2a05:1d43:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a05:1d60::,2a05:1d63:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:1d80::,2a05:1d87:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a05:1e00::,2a05:1e07:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a05:1e40::,2a05:1e47:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a05:1e80::,2a05:1e87:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:1ec0::,2a05:1ec7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:1f00::,2a05:1f07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:1f40::,2a05:1f47:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a05:1f80::,2a05:1f87:ffff:ffff:ffff:ffff:ffff:ffff,BA +2a05:1fc0::,2a05:1fc7:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a05:2000::,2a05:2007:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a05:2040::,2a05:2047:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:2080::,2a05:2087:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:20c0::,2a05:20c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:2100::,2a05:2107:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a05:2140::,2a05:2147:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a05:2180::,2a05:2187:ffff:ffff:ffff:ffff:ffff:ffff,TM +2a05:21c0::,2a05:21c7:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a05:2200::,2a05:2207:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:2240::,2a05:2247:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a05:2280::,2a05:2287:ffff:ffff:ffff:ffff:ffff:ffff,SI +2a05:2300::,2a05:2307:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:2340::,2a05:2347:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:2380::,2a05:2387:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a05:23c0::,2a05:23c7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a05:2400::,2a05:2407:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a05:2440::,2a05:2447:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a05:2480::,2a05:2487:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:24c0::,2a05:24c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:2500::,2a05:2507:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:2540::,2a05:2547:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a05:2580::,2a05:2587:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a05:25c0::,2a05:25c7:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a05:2600::,2a05:2607:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a05:2640::,2a05:2647:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:2680::,2a05:2687:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:26c0::,2a05:26c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:2700::,2a05:2707:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a05:2740::,2a05:2747:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a05:2780::,2a05:2787:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a05:27c0::,2a05:27c7:ffff:ffff:ffff:ffff:ffff:ffff,KZ +2a05:2800::,2a05:2807:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a05:2880::,2a05:2887:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a05:28c0::,2a05:28c7:ffff:ffff:ffff:ffff:ffff:ffff,PT +2a05:2900::,2a05:2907:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:2940::,2a05:2947:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:2980::,2a05:2987:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:29c0::,2a05:29c7:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a05:2a00::,2a05:2a07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:2a40::,2a05:2a47:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a05:2a80::,2a05:2a87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:2ac0::,2a05:2ac7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a05:2b00::,2a05:2b07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:2b40::,2a05:2b47:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:2b80::,2a05:2b87:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:2bc0::,2a05:2bc7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:2c00::,2a05:2c03:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a05:2c20::,2a05:2c23:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a05:2c40::,2a05:2c47:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:2c80::,2a05:2c87:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a05:2cc0::,2a05:2cc7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:2d00::,2a05:2d07:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:2d40::,2a05:2d47:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a05:2d80::,2a05:2d87:ffff:ffff:ffff:ffff:ffff:ffff,US +2a05:2dc0::,2a05:2dc7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:2e00::,2a05:2e07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:2e40::,2a05:2e47:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a05:2e80::,2a05:2e87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:2ec0::,2a05:2ec7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:2f00::,2a05:2f07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:2f80::,2a05:2f87:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a05:2fc0::,2a05:2fc7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:3000::,2a05:3007:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a05:3040::,2a05:3047:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a05:3080::,2a05:3087:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a05:30c0::,2a05:30c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:3100::,2a05:3107:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a05:3140::,2a05:3147:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:3180::,2a05:3187:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:31c0::,2a05:31c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:3240::,2a05:3247:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:3280::,2a05:3287:ffff:ffff:ffff:ffff:ffff:ffff,SA +2a05:32c0::,2a05:32c7:ffff:ffff:ffff:ffff:ffff:ffff,PS +2a05:3300::,2a05:3307:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:3340::,2a05:3347:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:3380::,2a05:3387:ffff:ffff:ffff:ffff:ffff:ffff,YE +2a05:33c0::,2a05:33c7:ffff:ffff:ffff:ffff:ffff:ffff,SI +2a05:3400::,2a05:3407:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a05:3440::,2a05:3447:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a05:3480::,2a05:3487:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:34c0::,2a05:34c7:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a05:3500::,2a05:3507:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a05:3540::,2a05:3547:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:3580::,2a05:3587:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:35c0::,2a05:35c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:3640::,2a05:3647:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a05:3680::,2a05:3687:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a05:36c0::,2a05:36c7:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a05:3700::,2a05:3707:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:3740::,2a05:3747:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:3780::,2a05:3787:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a05:37c0::,2a05:37c7:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a05:3800::,2a05:3807:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a05:3840::,2a05:3847:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a05:3880::,2a05:3887:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a05:38c0::,2a05:38c7:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a05:3900::,2a05:3907:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a05:3940::,2a05:3941:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:3950::,2a05:3951:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a05:3960::,2a05:3963:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:3980::,2a05:3987:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:39c0::,2a05:39c7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a05:3a00::,2a05:3a07:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a05:3a40::,2a05:3a47:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a05:3a80::,2a05:3a87:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:3ac0::,2a05:3ac7:ffff:ffff:ffff:ffff:ffff:ffff,GR +2a05:3b00::,2a05:3b07:ffff:ffff:ffff:ffff:ffff:ffff,US +2a05:3b40::,2a05:3b47:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:3b80::,2a05:3b87:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:3bc0::,2a05:3bc7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:3c00::,2a05:3c07:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a05:3c40::,2a05:3c47:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:3c80::,2a05:3c87:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a05:3cc0::,2a05:3cc7:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a05:3d00::,2a05:3d07:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a05:3d40::,2a05:3d47:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a05:3d80::,2a05:3d87:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a05:3dc0::,2a05:3dc7:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a05:3e00::,2a05:3e07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:3e40::,2a05:3e47:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a05:3e80::,2a05:3e87:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:3ec0::,2a05:3ec7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a05:3f00::,2a05:3f07:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a05:3f40::,2a05:3f47:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:3f80::,2a05:3f87:ffff:ffff:ffff:ffff:ffff:ffff,GR +2a05:3fc0::,2a05:3fc7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:4000::,2a05:4007:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:4040::,2a05:4047:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:4080::,2a05:4087:ffff:ffff:ffff:ffff:ffff:ffff,EE +2a05:40c0::,2a05:40c7:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a05:4100::,2a05:4107:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a05:4140::,2a05:4147:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:4180::,2a05:4187:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a05:41c0::,2a05:41c7:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a05:4200::,2a05:4207:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:4240::,2a05:4247:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a05:4280::,2a05:4287:ffff:ffff:ffff:ffff:ffff:ffff,EE +2a05:42c0::,2a05:42c7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a05:4300::,2a05:4307:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:4340::,2a05:4347:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:4380::,2a05:4387:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:43c0::,2a05:43c7:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a05:4400::,2a05:4407:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a05:4440::,2a05:4447:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a05:4480::,2a05:4487:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a05:44c0::,2a05:44c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:4500::,2a05:4507:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a05:4580::,2a05:4587:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:45c0::,2a05:45c7:ffff:ffff:ffff:ffff:ffff:ffff,UZ +2a05:4600::,2a05:4607:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a05:4640::,2a05:4647:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a05:4680::,2a05:4687:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:46c0::,2a05:46c7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:4700::,2a05:4707:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a05:4740::,2a05:4747:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a05:4780::,2a05:4787:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:47c0::,2a05:47c7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:4800::,2a05:4807:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:4840::,2a05:4847:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:4880::,2a05:4887:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:48c0::,2a05:48c7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a05:4900::,2a05:4907:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a05:4940::,2a05:4947:ffff:ffff:ffff:ffff:ffff:ffff,SI +2a05:4980::,2a05:4987:ffff:ffff:ffff:ffff:ffff:ffff,RS +2a05:49c0::,2a05:49c7:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a05:4a00::,2a05:4a07:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a05:4a40::,2a05:4a47:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:4a80::,2a05:4a87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:4ac0::,2a05:4ac7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a05:4b00::,2a05:4b07:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a05:4b40::,2a05:4b47:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:4b80::,2a05:4b87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:4bc0::,2a05:4bc7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:4c00::,2a05:4c07:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a05:4c40::,2a05:4c47:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:4c80::,2a05:4c87:ffff:ffff:ffff:ffff:ffff:ffff,MD +2a05:4cc0::,2a05:4cc7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:4d00::,2a05:4d07:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a05:4d80::,2a05:4d87:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a05:4dc0::,2a05:4dc7:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a05:4e00::,2a05:4e07:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a05:4e40::,2a05:4e47:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a05:4ec0::,2a05:4ec7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:4f00::,2a05:4f07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:4f40::,2a05:4f47:ffff:ffff:ffff:ffff:ffff:ffff,HR +2a05:4f80::,2a05:4f87:ffff:ffff:ffff:ffff:ffff:ffff,RS +2a05:4fc0::,2a05:4fc7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:5000::,2a05:5007:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:5040::,2a05:5047:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a05:5080::,2a05:5087:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:50c0::,2a05:50c7:ffff:ffff:ffff:ffff:ffff:ffff,IQ +2a05:5100::,2a05:5107:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:5140::,2a05:5147:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:5180::,2a05:5187:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:51c0::,2a05:51c7:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a05:5200::,2a05:5207:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:5240::,2a05:5247:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:5280::,2a05:5283:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a05:52a0::,2a05:52a3:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:52c0::,2a05:52c7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:5300::,2a05:5307:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a05:5340::,2a05:5347:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:5380::,2a05:5387:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a05:53c0::,2a05:53c7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:5400::,2a05:5407:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a05:5440::,2a05:5447:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a05:5480::,2a05:5487:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:54c0::,2a05:54c7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:5500::,2a05:5507:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a05:5540::,2a05:5547:ffff:ffff:ffff:ffff:ffff:ffff,LV +2a05:5580::,2a05:5587:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a05:55c0::,2a05:55c7:ffff:ffff:ffff:ffff:ffff:ffff,IQ +2a05:5600::,2a05:5607:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:5640::,2a05:5647:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:5680::,2a05:5687:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a05:56c0::,2a05:56c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:5740::,2a05:5747:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a05:5780::,2a05:5787:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a05:57c0::,2a05:57c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:5800::,2a05:5807:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:5840::,2a05:5847:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:5880::,2a05:5887:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a05:58c0::,2a05:58c7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:5900::,2a05:5907:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:5940::,2a05:5947:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:5980::,2a05:5987:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a05:59c0::,2a05:59c7:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:5a00::,2a05:5a07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:5a40::,2a05:5a47:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:5a80::,2a05:5a87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:5b00::,2a05:5b07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:5b40::,2a05:5b47:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:5b80::,2a05:5b87:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a05:5bc0::,2a05:5bc7:ffff:ffff:ffff:ffff:ffff:ffff,MK +2a05:5c00::,2a05:5c07:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:5c40::,2a05:5c47:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:5c80::,2a05:5c87:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a05:5cc0::,2a05:5cc7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a05:5d00::,2a05:5d07:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:5d40::,2a05:5d47:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a05:5d80::,2a05:5d87:ffff:ffff:ffff:ffff:ffff:ffff,MK +2a05:5dc0::,2a05:5dc7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:5e00::,2a05:5e07:ffff:ffff:ffff:ffff:ffff:ffff,AE +2a05:5e40::,2a05:5e47:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a05:5e80::,2a05:5e87:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a05:5ec0::,2a05:5ec7:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a05:5f00::,2a05:5f07:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:5f40::,2a05:5f47:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a05:5f80::,2a05:5f87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:5fc0::,2a05:5fc7:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a05:6000::,2a05:6007:ffff:ffff:ffff:ffff:ffff:ffff,GE +2a05:6040::,2a05:6047:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:6080::,2a05:6087:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a05:60c0::,2a05:60c7:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a05:6100::,2a05:6107:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a05:6140::,2a05:6147:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:6180::,2a05:6187:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a05:61c0::,2a05:61c7:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a05:6200::,2a05:6207:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:6240::,2a05:6247:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:6280::,2a05:6287:ffff:ffff:ffff:ffff:ffff:ffff,LT +2a05:62c0::,2a05:62c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:6300::,2a05:6307:ffff:ffff:ffff:ffff:ffff:ffff,LT +2a05:6340::,2a05:6347:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:6380::,2a05:6387:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a05:63c0::,2a05:63c7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:6400::,2a05:6407:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a05:6440::,2a05:6447:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:64c0::,2a05:64c7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a05:6500::,2a05:6507:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a05:6540::,2a05:6547:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:6580::,2a05:6587:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a05:65c0::,2a05:65c7:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a05:6600::,2a05:6607:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a05:6640::,2a05:6647:ffff:ffff:ffff:ffff:ffff:ffff,VA +2a05:6680::,2a05:6687:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a05:66c0::,2a05:66c7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:6700::,2a05:6707:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a05:6740::,2a05:6747:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a05:6800::,2a05:6807:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a05:6840::,2a05:6847:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:6880::,2a05:6887:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:68c0::,2a05:68c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:6900::,2a05:6907:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:6940::,2a05:6947:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a05:6980::,2a05:6987:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:69c0::,2a05:69c7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:6a00::,2a05:6a07:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a05:6a40::,2a05:6a47:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:6a80::,2a05:6a87:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a05:6ac0::,2a05:6ac7:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a05:6b00::,2a05:6b07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:6b80::,2a05:6b87:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a05:6bc0::,2a05:6bc7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:6c00::,2a05:6c07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:6c40::,2a05:6c47:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:6c80::,2a05:6c87:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:6cc0::,2a05:6cc7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:6d00::,2a05:6d07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:6d40::,2a05:6d47:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a05:6d80::,2a05:6d87:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:6dc0::,2a05:6dc7:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a05:6e00::,2a05:6e07:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:6e80::,2a05:6e87:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:6ec0::,2a05:6ec7:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a05:6f00::,2a05:6f07:ffff:ffff:ffff:ffff:ffff:ffff,IS +2a05:6f40::,2a05:6f47:ffff:ffff:ffff:ffff:ffff:ffff,AE +2a05:6f80::,2a05:6f87:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a05:6fc0::,2a05:6fc7:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a05:7000::,2a05:7007:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a05:7040::,2a05:7047:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:7080::,2a05:7087:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a05:70c0::,2a05:70c7:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a05:7100::,2a05:7107:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a05:7140::,2a05:7147:ffff:ffff:ffff:ffff:ffff:ffff,MD +2a05:7180::,2a05:7187:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:71c0::,2a05:71c7:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a05:7200::,2a05:7207:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a05:7240::,2a05:7247:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:7280::,2a05:7287:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:72c0::,2a05:72c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:7300::,2a05:7307:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:7380::,2a05:7387:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:73c0::,2a05:73c7:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a05:7400::,2a05:7407:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:7440::,2a05:7447:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a05:7480::,2a05:7487:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a05:74c0::,2a05:74c7:ffff:ffff:ffff:ffff:ffff:ffff,JO +2a05:7500::,2a05:7507:ffff:ffff:ffff:ffff:ffff:ffff,JO +2a05:7540::,2a05:7547:ffff:ffff:ffff:ffff:ffff:ffff,PT +2a05:7580::,2a05:7587:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a05:75c0::,2a05:75c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:7600::,2a05:7607:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:7640::,2a05:7647:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:7680::,2a05:7687:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:76c0::,2a05:76c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:7700::,2a05:7707:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a05:7740::,2a05:7747:ffff:ffff:ffff:ffff:ffff:ffff,SI +2a05:7780::,2a05:7787:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:77c0::,2a05:77c7:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a05:7800::,2a05:7807:ffff:ffff:ffff:ffff:ffff:ffff,PT +2a05:7840::,2a05:7847:ffff:ffff:ffff:ffff:ffff:ffff,RS +2a05:7880::,2a05:7887:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a05:78c0::,2a05:78c7:ffff:ffff:ffff:ffff:ffff:ffff,SA +2a05:7900::,2a05:7907:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a05:7940::,2a05:7947:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:7980::,2a05:7987:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a05:79c0::,2a05:79c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:7a00::,2a05:7a07:ffff:ffff:ffff:ffff:ffff:ffff,IQ +2a05:7a40::,2a05:7a47:ffff:ffff:ffff:ffff:ffff:ffff,YE +2a05:7a80::,2a05:7a87:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:7b00::,2a05:7b07:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a05:7b40::,2a05:7b47:ffff:ffff:ffff:ffff:ffff:ffff,ME +2a05:7b80::,2a05:7b87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:7bc0::,2a05:7bc7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:7c00::,2a05:7c07:ffff:ffff:ffff:ffff:ffff:ffff,RS +2a05:7c40::,2a05:7c47:ffff:ffff:ffff:ffff:ffff:ffff,LU +2a05:7c80::,2a05:7c87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:7cc0::,2a05:7cc7:ffff:ffff:ffff:ffff:ffff:ffff,LT +2a05:7d00::,2a05:7d07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:7d40::,2a05:7d47:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a05:7d80::,2a05:7d87:ffff:ffff:ffff:ffff:ffff:ffff,YE +2a05:7dc0::,2a05:7dc1:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:7dd0::,2a05:7dd1:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a05:7de0::,2a05:7de3:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a05:7e00::,2a05:7e07:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a05:7e40::,2a05:7e47:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:7e80::,2a05:7e87:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:7ec0::,2a05:7ec7:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a05:7f00::,2a05:7f07:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a05:7f40::,2a05:7f47:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a05:7f80::,2a05:7f87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:7fc0::,2a05:7fc7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:8000::,2a05:8007:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a05:8040::,2a05:8047:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a05:8080::,2a05:8087:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a05:80c0::,2a05:80c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:8100::,2a05:8107:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:8140::,2a05:8147:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a05:8180::,2a05:8187:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a05:81c0::,2a05:81c7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:8280::,2a05:8287:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:82c0::,2a05:82c7:ffff:ffff:ffff:ffff:ffff:ffff,AZ +2a05:8300::,2a05:8307:ffff:ffff:ffff:ffff:ffff:ffff,AL +2a05:8340::,2a05:8347:ffff:ffff:ffff:ffff:ffff:ffff,AZ +2a05:8380::,2a05:8387:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a05:83c0::,2a05:83c7:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a05:8400::,2a05:8407:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:8440::,2a05:8447:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:8480::,2a05:8487:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a05:8500::,2a05:8507:ffff:ffff:ffff:ffff:ffff:ffff,CY +2a05:8540::,2a05:8547:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a05:8580::,2a05:8587:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a05:85c0::,2a05:85c7:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a05:8600::,2a05:8607:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a05:8640::,2a05:8647:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a05:8680::,2a05:8687:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:86c0::,2a05:86c7:ffff:ffff:ffff:ffff:ffff:ffff,GE +2a05:8700::,2a05:8707:ffff:ffff:ffff:ffff:ffff:ffff,LV +2a05:8740::,2a05:8747:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a05:8780::,2a05:8787:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:87c0::,2a05:87c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:8800::,2a05:8807:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a05:8840::,2a05:8847:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a05:8880::,2a05:8883:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a05:88c0::,2a05:88c7:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a05:8900::,2a05:8907:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a05:8940::,2a05:8947:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:8980::,2a05:8987:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:89c0::,2a05:89c7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:8a00::,2a05:8a07:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a05:8a40::,2a05:8a47:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:8a80::,2a05:8a87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:8ac0::,2a05:8ac7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:8b00::,2a05:8b07:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a05:8b40::,2a05:8b47:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a05:8b80::,2a05:8b87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:8bc0::,2a05:8bc7:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:8c00::,2a05:8c07:ffff:ffff:ffff:ffff:ffff:ffff,GI +2a05:8c40::,2a05:8c47:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a05:8c80::,2a05:8c87:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a05:8cc0::,2a05:8cc7:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a05:8d00::,2a05:8d07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:8d40::,2a05:8d47:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a05:8d80::,2a05:8d87:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a05:8dc0::,2a05:8dc7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:8e00::,2a05:8e07:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a05:8e40::,2a05:8e47:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:8e80::,2a05:8e87:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:8ec0::,2a05:8ec7:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a05:8f00::,2a05:8f07:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a05:8f40::,2a05:8f47:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:8f80::,2a05:8f87:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a05:8fc0::,2a05:8fc7:ffff:ffff:ffff:ffff:ffff:ffff,RS +2a05:9000::,2a05:9007:ffff:ffff:ffff:ffff:ffff:ffff,SA +2a05:9040::,2a05:9047:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a05:9080::,2a05:9087:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a05:90c0::,2a05:90c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:9100::,2a05:9107:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a05:9140::,2a05:9147:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a05:9180::,2a05:9187:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a05:91c0::,2a05:91c7:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a05:9200::,2a05:9207:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a05:9240::,2a05:9247:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a05:9280::,2a05:9287:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:92c0::,2a05:92c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:9300::,2a05:9307:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:9340::,2a05:9347:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:9380::,2a05:9387:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:93c0::,2a05:93c7:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a05:9400::,2a05:9407:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a05:9440::,2a05:9447:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:9480::,2a05:9487:ffff:ffff:ffff:ffff:ffff:ffff,IQ +2a05:94c0::,2a05:94c7:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a05:9500::,2a05:9507:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a05:9540::,2a05:9547:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a05:9580::,2a05:9587:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a05:95c0::,2a05:95c7:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a05:9600::,2a05:9607:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a05:9640::,2a05:9647:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:9680::,2a05:9687:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a05:96c0::,2a05:96c7:ffff:ffff:ffff:ffff:ffff:ffff,NL 2c0e::,2c0e:fff:ffff:ffff:ffff:ffff:ffff:ffff,EG 2c0e:2000::,2c0e:200f:ffff:ffff:ffff:ffff:ffff:ffff,ZA 2c0f:f600::,2c0f:f600:ffff:ffff:ffff:ffff:ffff:ffff,GN @@ -15453,12 +21541,31 @@ 2c0f:f720::,2c0f:f720:ffff:ffff:ffff:ffff:ffff:ffff,ZA 2c0f:f728::,2c0f:f728:ffff:ffff:ffff:ffff:ffff:ffff,BW 2c0f:f730::,2c0f:f730:ffff:ffff:ffff:ffff:ffff:ffff,TZ +2c0f:f738::,2c0f:f738:ffff:ffff:ffff:ffff:ffff:ffff,MU +2c0f:f740::,2c0f:f740:ffff:ffff:ffff:ffff:ffff:ffff,AO +2c0f:f748::,2c0f:f748:ffff:ffff:ffff:ffff:ffff:ffff,MU +2c0f:f750::,2c0f:f750:ffff:ffff:ffff:ffff:ffff:ffff,UG +2c0f:f758::,2c0f:f758:ffff:ffff:ffff:ffff:ffff:ffff,ZW +2c0f:f760::,2c0f:f760:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f768::,2c0f:f768:ffff:ffff:ffff:ffff:ffff:ffff,NG +2c0f:f770::,2c0f:f770:ffff:ffff:ffff:ffff:ffff:ffff,BJ +2c0f:f778::,2c0f:f778:ffff:ffff:ffff:ffff:ffff:ffff,NA +2c0f:f780::,2c0f:f780:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f788::,2c0f:f788:ffff:ffff:ffff:ffff:ffff:ffff,BI +2c0f:f798::,2c0f:f798:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f7a0::,2c0f:f7a0:ffff:ffff:ffff:ffff:ffff:ffff,ZW +2c0f:f7a8::,2c0f:f7af:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f7b0::,2c0f:f7b0:ffff:ffff:ffff:ffff:ffff:ffff,TZ +2c0f:f7b8::,2c0f:f7b8:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f7c0::,2c0f:f7c0:ffff:ffff:ffff:ffff:ffff:ffff,GH +2c0f:f7c8::,2c0f:f7c8:ffff:ffff:ffff:ffff:ffff:ffff,TN +2c0f:f7d0::,2c0f:f7d0:ffff:ffff:ffff:ffff:ffff:ffff,CM 2c0f:f800::,2c0f:f80f:ffff:ffff:ffff:ffff:ffff:ffff,ZA 2c0f:f810::,2c0f:f810:ffff:ffff:ffff:ffff:ffff:ffff,AO 2c0f:f818::,2c0f:f818:ffff:ffff:ffff:ffff:ffff:ffff,BJ 2c0f:f820::,2c0f:f820:ffff:ffff:ffff:ffff:ffff:ffff,GH 2c0f:f828::,2c0f:f828:ffff:ffff:ffff:ffff:ffff:ffff,AO -2c0f:f830::,2c0f:f830:ffff:ffff:ffff:ffff:ffff:ffff,ZW +2c0f:f830::,2c0f:f830:ffff:ffff:ffff:ffff:ffff:ffff,MU 2c0f:f838::,2c0f:f838:ffff:ffff:ffff:ffff:ffff:ffff,ZA 2c0f:f840::,2c0f:f840:ffff:ffff:ffff:ffff:ffff:ffff,GQ 2c0f:f848::,2c0f:f848:ffff:ffff:ffff:ffff:ffff:ffff,GH @@ -15480,7 +21587,7 @@ 2c0f:f8d8::,2c0f:f8d8:ffff:ffff:ffff:ffff:ffff:ffff,BW 2c0f:f8e0::,2c0f:f8e0:ffff:ffff:ffff:ffff:ffff:ffff,MU 2c0f:f8e8::,2c0f:f8e8:ffff:ffff:ffff:ffff:ffff:ffff,GH -2c0f:f8f0::,2c0f:f8f0:ffff:ffff:ffff:ffff:ffff:ffff,ZW +2c0f:f8f0::,2c0f:f8f0:ffff:ffff:ffff:ffff:ffff:ffff,MU 2c0f:f8f8::,2c0f:f8f8:ffff:ffff:ffff:ffff:ffff:ffff,SO 2c0f:f900::,2c0f:f900:ffff:ffff:ffff:ffff:ffff:ffff,ML 2c0f:f908::,2c0f:f908:ffff:ffff:ffff:ffff:ffff:ffff,BI @@ -15535,7 +21642,6 @@ 2c0f:fab0::,2c0f:fabf:ffff:ffff:ffff:ffff:ffff:ffff,TN 2c0f:fac0::,2c0f:fac0:ffff:ffff:ffff:ffff:ffff:ffff,MW 2c0f:fac8::,2c0f:fac8:ffff:ffff:ffff:ffff:ffff:ffff,BW -2c0f:fad0::,2c0f:fad0:ffff:ffff:ffff:ffff:ffff:ffff,RW 2c0f:fad8::,2c0f:fad8:ffff:ffff:ffff:ffff:ffff:ffff,KE 2c0f:fae0::,2c0f:fae0:ffff:ffff:ffff:ffff:ffff:ffff,CM 2c0f:fae8::,2c0f:fae8:ffff:ffff:ffff:ffff:ffff:ffff,KE @@ -15606,7 +21712,6 @@ 2c0f:fd58::,2c0f:fd58:ffff:ffff:ffff:ffff:ffff:ffff,ZA 2c0f:fd60::,2c0f:fd60:ffff:ffff:ffff:ffff:ffff:ffff,UG 2c0f:fd68::,2c0f:fd68:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:fd70::,2c0f:fd70:ffff:ffff:ffff:ffff:ffff:ffff,UG 2c0f:fd78::,2c0f:fd78:ffff:ffff:ffff:ffff:ffff:ffff,BI 2c0f:fd80::,2c0f:fd80:ffff:ffff:ffff:ffff:ffff:ffff,BF 2c0f:fd88::,2c0f:fd88:ffff:ffff:ffff:ffff:ffff:ffff,GH @@ -15620,7 +21725,6 @@ 2c0f:fdc8::,2c0f:fdc8:ffff:ffff:ffff:ffff:ffff:ffff,ZA 2c0f:fdd0::,2c0f:fdd0:ffff:ffff:ffff:ffff:ffff:ffff,ZA 2c0f:fdd8::,2c0f:fdd8:ffff:ffff:ffff:ffff:ffff:ffff,ZA -2c0f:fde0::,2c0f:fde0:ffff:ffff:ffff:ffff:ffff:ffff,MW 2c0f:fde8::,2c0f:fde8:ffff:ffff:ffff:ffff:ffff:ffff,MW 2c0f:fdf0::,2c0f:fdf0:ffff:ffff:ffff:ffff:ffff:ffff,ZA 2c0f:fdf8::,2c0f:fdf8:ffff:ffff:ffff:ffff:ffff:ffff,ZA diff --git a/src/ext/ht.h b/src/ext/ht.h index ee64e557f4..9b3bcaf91b 100644 --- a/src/ext/ht.h +++ b/src/ext/ht.h @@ -1,6 +1,6 @@ /* Copyright (c) 2002, Christopher Clark. * Copyright (c) 2005-2006, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See license at end. */ /* Based on ideas by Christopher Clark and interfaces from Niels Provos. */ diff --git a/src/ext/tinytest_demo.c b/src/ext/tinytest_demo.c index 634e112cb8..c07f099791 100644 --- a/src/ext/tinytest_demo.c +++ b/src/ext/tinytest_demo.c @@ -74,13 +74,13 @@ test_strcmp(void *data) values of the failing things. Fail unless strcmp("abc, "abc") == 0 */ - tt_int_op(strcmp("abc", "abc"), ==, 0); + tt_int_op(strcmp("abc", "abc"), OP_EQ, 0); /* Fail unless strcmp("abc, "abcd") is less than 0 */ - tt_int_op(strcmp("abc", "abcd"), < , 0); + tt_int_op(strcmp("abc", "abcd"), OP_LT, 0); /* Incidentally, there's a test_str_op that uses strcmp internally. */ - tt_str_op("abc", <, "abcd"); + tt_str_op("abc", OP_LT, "abcd"); /* Every test-case function needs to finish with an "end:" @@ -153,11 +153,11 @@ test_memcpy(void *ptr) /* Let's make sure that memcpy does what we'd like. */ strcpy(db->buffer1, "String 0"); memcpy(db->buffer2, db->buffer1, sizeof(db->buffer1)); - tt_str_op(db->buffer1, ==, db->buffer2); + tt_str_op(db->buffer1, OP_EQ, db->buffer2); /* tt_mem_op() does a memcmp, as opposed to the strcmp in tt_str_op() */ db->buffer2[100] = 3; /* Make the buffers unequal */ - tt_mem_op(db->buffer1, <, db->buffer2, sizeof(db->buffer1)); + tt_mem_op(db->buffer1, OP_LT, db->buffer2, sizeof(db->buffer1)); /* Now we've allocated memory that's referenced by a local variable. The end block of the function will clean it up. */ @@ -165,7 +165,7 @@ test_memcpy(void *ptr) tt_assert(mem); /* Another rather trivial test. */ - tt_str_op(db->buffer1, !=, mem); + tt_str_op(db->buffer1, OP_NE, mem); end: /* This time our end block has something to do. */ @@ -186,9 +186,9 @@ test_timeout(void *ptr) #endif t2 = time(NULL); - tt_int_op(t2-t1, >=, 4); + tt_int_op(t2-t1, OP_GE, 4); - tt_int_op(t2-t1, <=, 6); + tt_int_op(t2-t1, OP_LE, 6); end: ; diff --git a/src/ext/trunnel/trunnel-impl.h b/src/ext/trunnel/trunnel-impl.h index c88ee3988e..8714fded9f 100644 --- a/src/ext/trunnel/trunnel-impl.h +++ b/src/ext/trunnel/trunnel-impl.h @@ -5,7 +5,7 @@ /* trunnel-impl.h -- Implementation helpers for trunnel, included by * generated trunnel files * - * Copyright 2014, The Tor Project, Inc. + * Copyright 2014-2015, The Tor Project, Inc. * See license at the end of this file for copying information. */ diff --git a/src/ext/trunnel/trunnel.c b/src/ext/trunnel/trunnel.c index a18d67584e..735323798f 100644 --- a/src/ext/trunnel/trunnel.c +++ b/src/ext/trunnel/trunnel.c @@ -4,7 +4,7 @@ */ /* trunnel.c -- Helper functions to implement trunnel. * - * Copyright 2014, The Tor Project, Inc. + * Copyright 2014-2015, The Tor Project, Inc. * See license at the end of this file for copying information. * * See trunnel-impl.h for documentation of these functions. diff --git a/src/ext/trunnel/trunnel.h b/src/ext/trunnel/trunnel.h index f51cade03f..22c1ed80c9 100644 --- a/src/ext/trunnel/trunnel.h +++ b/src/ext/trunnel/trunnel.h @@ -5,7 +5,7 @@ /* trunnel.h -- Public declarations for trunnel, to be included * in trunnel header files. - * Copyright 2014, The Tor Project, Inc. + * Copyright 2014-2015, The Tor Project, Inc. * See license at the end of this file for copying information. */ diff --git a/src/or/Makefile.nmake b/src/or/Makefile.nmake index 523bf3306b..2ac98cd372 100644 --- a/src/or/Makefile.nmake +++ b/src/or/Makefile.nmake @@ -63,6 +63,7 @@ LIBTOR_OBJECTS = \ routerlist.obj \ routerparse.obj \ routerset.obj \ + scheduler.obj \ statefile.obj \ status.obj \ transports.obj diff --git a/src/or/addressmap.c b/src/or/addressmap.c index d7ac7c8ec7..9c29fb2acb 100644 --- a/src/or/addressmap.c +++ b/src/or/addressmap.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define ADDRESSMAP_PRIVATE @@ -94,7 +94,7 @@ addressmap_ent_free(void *_ent) tor_free(ent); } -/** Free storage held by a virtaddress_entry_t* entry in <b>ent</b>. */ +/** Free storage held by a virtaddress_entry_t* entry in <b>_ent</b>. */ static void addressmap_virtaddress_ent_free(void *_ent) { @@ -104,11 +104,13 @@ addressmap_virtaddress_ent_free(void *_ent) ent = _ent; tor_free(ent->ipv4_address); + tor_free(ent->ipv6_address); tor_free(ent->hostname_address); tor_free(ent); } -/** Free storage held by a virtaddress_entry_t* entry in <b>ent</b>. */ +/** Remove <b>address</b> (which must map to <b>ent</b>) from the + * virtual address map. */ static void addressmap_virtaddress_remove(const char *address, addressmap_entry_t *ent) { @@ -120,9 +122,11 @@ addressmap_virtaddress_remove(const char *address, addressmap_entry_t *ent) if (ve) { if (!strcmp(address, ve->ipv4_address)) tor_free(ve->ipv4_address); + if (!strcmp(address, ve->ipv6_address)) + tor_free(ve->ipv6_address); if (!strcmp(address, ve->hostname_address)) tor_free(ve->hostname_address); - if (!ve->ipv4_address && !ve->hostname_address) { + if (!ve->ipv4_address && !ve->ipv6_address && !ve->hostname_address) { tor_free(ve); strmap_remove(virtaddress_reversemap, ent->new_address); } @@ -131,7 +135,7 @@ addressmap_virtaddress_remove(const char *address, addressmap_entry_t *ent) } /** Remove <b>ent</b> (which must be mapped to by <b>address</b>) from the - * client address maps. */ + * client address maps, and then free it. */ static void addressmap_ent_remove(const char *address, addressmap_entry_t *ent) { @@ -226,6 +230,8 @@ addressmap_address_should_automap(const char *address, return 0; SMARTLIST_FOREACH_BEGIN(suffix_list, const char *, suffix) { + if (!strcmp(suffix, ".")) + return 1; if (!strcasecmpend(address, suffix)) return 1; } SMARTLIST_FOREACH_END(suffix); @@ -384,13 +390,35 @@ addressmap_rewrite(char *address, size_t maxlen, goto done; } - if (ent && ent->source == ADDRMAPSRC_DNS) { - sa_family_t f; - tor_addr_t tmp; - f = tor_addr_parse(&tmp, ent->new_address); - if (f == AF_INET && !(flags & AMR_FLAG_USE_IPV4_DNS)) - goto done; - else if (f == AF_INET6 && !(flags & AMR_FLAG_USE_IPV6_DNS)) + switch (ent->source) { + case ADDRMAPSRC_DNS: + { + sa_family_t f; + tor_addr_t tmp; + f = tor_addr_parse(&tmp, ent->new_address); + if (f == AF_INET && !(flags & AMR_FLAG_USE_IPV4_DNS)) + goto done; + else if (f == AF_INET6 && !(flags & AMR_FLAG_USE_IPV6_DNS)) + goto done; + } + break; + case ADDRMAPSRC_CONTROLLER: + case ADDRMAPSRC_TORRC: + if (!(flags & AMR_FLAG_USE_MAPADDRESS)) + goto done; + break; + case ADDRMAPSRC_AUTOMAP: + if (!(flags & AMR_FLAG_USE_AUTOMAP)) + goto done; + break; + case ADDRMAPSRC_TRACKEXIT: + if (!(flags & AMR_FLAG_USE_TRACKEXIT)) + goto done; + break; + case ADDRMAPSRC_NONE: + default: + log_warn(LD_BUG, "Unknown addrmap source value %d. Ignoring it.", + (int) ent->source); goto done; } @@ -425,7 +453,7 @@ addressmap_rewrite(char *address, size_t maxlen, if (exit_source_out) *exit_source_out = exit_source; if (expires_out) - *expires_out = TIME_MAX; + *expires_out = expires; return (rewrites > 0); } @@ -449,6 +477,8 @@ addressmap_rewrite_reverse(char *address, size_t maxlen, unsigned flags, return 0; else if (f == AF_INET6 && !(flags & AMR_FLAG_USE_IPV6_DNS)) return 0; + /* FFFF we should reverse-map virtual addresses even if we haven't + * enabled DNS cacheing. */ } tor_asprintf(&s, "REVERSE[%s]", address); @@ -496,7 +526,7 @@ addressmap_have_mapping(const char *address, int update_expiry) * equal to <b>address</b>, or any address ending with a period followed by * <b>address</b>. If <b>wildcard_addr</b> and <b>wildcard_new_addr</b> are * both true, the mapping will rewrite addresses that end with - * ".<b>address</b>" into ones that end with ".<b>new_address</b>." + * ".<b>address</b>" into ones that end with ".<b>new_address</b>". * * If <b>new_address</b> is NULL, or <b>new_address</b> is equal to * <b>address</b> and <b>wildcard_addr</b> is equal to @@ -535,9 +565,9 @@ addressmap_register(const char *address, char *new_address, time_t expires, if (expires > 1) { log_info(LD_APP,"Temporary addressmap ('%s' to '%s') not performed, " "since it's already mapped to '%s'", - safe_str_client(address), - safe_str_client(new_address), - safe_str_client(ent->new_address)); + safe_str_client(address), + safe_str_client(new_address), + safe_str_client(ent->new_address)); tor_free(new_address); return; } @@ -670,10 +700,10 @@ client_dns_set_addressmap(entry_connection_t *for_conn, return; /* If address was an IP address already, don't add a mapping. */ if (tor_addr_family(val) == AF_INET) { - if (! for_conn->cache_ipv4_answers) + if (! for_conn->entry_cfg.cache_ipv4_answers) return; } else if (tor_addr_family(val) == AF_INET6) { - if (! for_conn->cache_ipv6_answers) + if (! for_conn->entry_cfg.cache_ipv6_answers) return; } @@ -702,8 +732,8 @@ client_dns_set_reverse_addressmap(entry_connection_t *for_conn, { tor_addr_t tmp_addr; sa_family_t f = tor_addr_parse(&tmp_addr, address); - if ((f == AF_INET && ! for_conn->cache_ipv4_answers) || - (f == AF_INET6 && ! for_conn->cache_ipv6_answers)) + if ((f == AF_INET && ! for_conn->entry_cfg.cache_ipv4_answers) || + (f == AF_INET6 && ! for_conn->entry_cfg.cache_ipv6_answers)) return; } tor_asprintf(&s, "REVERSE[%s]", address); @@ -738,6 +768,12 @@ parse_virtual_addr_network(const char *val, sa_family_t family, const int max_bits = ipv6 ? 40 : 16; virtual_addr_conf_t *conf = ipv6 ? &virtaddr_conf_ipv6 : &virtaddr_conf_ipv4; + if (!val || val[0] == '\0') { + if (msg) + tor_asprintf(msg, "Value not present (%s) after VirtualAddressNetwork%s", + val?"Empty":"NULL", ipv6?"IPv6":""); + return -1; + } if (tor_addr_parse_mask_ports(val, 0, &addr, &bits, NULL, NULL) < 0) { if (msg) tor_asprintf(msg, "Error parsing VirtualAddressNetwork%s %s", @@ -839,8 +875,8 @@ get_random_virtual_addr(const virtual_addr_conf_t *conf, tor_addr_t *addr_out) } /** Return a newly allocated string holding an address of <b>type</b> - * (one of RESOLVED_TYPE_{IPV4|HOSTNAME}) that has not yet been mapped, - * and that is very unlikely to be the address of any real host. + * (one of RESOLVED_TYPE_{IPV4|IPV6|HOSTNAME}) that has not yet been + * mapped, and that is very unlikely to be the address of any real host. * * May return NULL if we have run out of virtual addresses. */ @@ -888,7 +924,7 @@ addressmap_get_virtual_address(int type) /* XXXX This code is to make sure I didn't add an undecorated version * by mistake. I hope it's needless. */ char tmp[TOR_ADDR_BUF_LEN]; - tor_addr_to_str(buf, &addr, sizeof(tmp), 0); + tor_addr_to_str(tmp, &addr, sizeof(tmp), 0); if (strmap_get(addressmap, tmp)) { log_warn(LD_BUG, "%s wasn't in the addressmap, but %s was.", buf, tmp); @@ -945,7 +981,7 @@ addressmap_register_virtual_address(int type, char *new_address) !strcasecmp(new_address, ent->new_address)) { tor_free(new_address); tor_assert(!vent_needs_to_be_added); - return tor_strdup(*addrp); + return *addrp; } else { log_warn(LD_BUG, "Internal confusion: I thought that '%s' was mapped to by " @@ -969,6 +1005,8 @@ addressmap_register_virtual_address(int type, char *new_address) strmap_set(virtaddress_reversemap, new_address, vent); addressmap_register(*addrp, new_address, 2, ADDRMAPSRC_AUTOMAP, 0, 0); + /* FFFF register corresponding reverse mapping. */ + #if 0 { /* Try to catch possible bugs */ diff --git a/src/or/addressmap.h b/src/or/addressmap.h index 598f7b0e3e..ff108df024 100644 --- a/src/or/addressmap.h +++ b/src/or/addressmap.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TOR_ADDRESSMAP_H @@ -16,8 +16,11 @@ void addressmap_clean(time_t now); void addressmap_clear_configured(void); void addressmap_clear_transient(void); void addressmap_free_all(void); -#define AMR_FLAG_USE_IPV4_DNS (1u<<0) -#define AMR_FLAG_USE_IPV6_DNS (1u<<1) +#define AMR_FLAG_USE_IPV4_DNS (1u<<0) +#define AMR_FLAG_USE_IPV6_DNS (1u<<1) +#define AMR_FLAG_USE_MAPADDRESS (1u<<2) +#define AMR_FLAG_USE_AUTOMAP (1u<<3) +#define AMR_FLAG_USE_TRACKEXIT (1u<<4) int addressmap_rewrite(char *address, size_t maxlen, unsigned flags, time_t *expires_out, addressmap_entry_source_t *exit_source_out); diff --git a/src/or/buffers.c b/src/or/buffers.c index bd33fe451d..ca0e815e33 100644 --- a/src/or/buffers.c +++ b/src/or/buffers.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -562,8 +562,8 @@ buf_clear(buf_t *buf) } /** Return the number of bytes stored in <b>buf</b> */ -size_t -buf_datalen(const buf_t *buf) +MOCK_IMPL(size_t, +buf_datalen, (const buf_t *buf)) { return buf->datalen; } @@ -2063,9 +2063,7 @@ parse_socks(const char *data, size_t datalen, socks_request_t *req, socks_request_set_socks5_error(req, SOCKS5_NOT_ALLOWED); return -1; } - } - - if (!string_is_valid_hostname(req->address)) { + } else if (!string_is_valid_hostname(req->address)) { socks_request_set_socks5_error(req, SOCKS5_GENERAL_ERROR); log_warn(LD_PROTOCOL, diff --git a/src/or/buffers.h b/src/or/buffers.h index 9c2c7d0e9d..6dd3d1762b 100644 --- a/src/or/buffers.h +++ b/src/or/buffers.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -24,7 +24,7 @@ void buf_shrink(buf_t *buf); size_t buf_shrink_freelists(int free_all); void buf_dump_freelist_sizes(int severity); -size_t buf_datalen(const buf_t *buf); +MOCK_DECL(size_t, buf_datalen, (const buf_t *buf)); size_t buf_allocation(const buf_t *buf); size_t buf_slack(const buf_t *buf); diff --git a/src/or/channel.c b/src/or/channel.c index 13a122662a..bf0387f10e 100644 --- a/src/or/channel.c +++ b/src/or/channel.c @@ -1,4 +1,4 @@ -/* * Copyright (c) 2012-2014, The Tor Project, Inc. */ +/* * Copyright (c) 2012-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -13,6 +13,9 @@ #define TOR_CHANNEL_INTERNAL_ +/* This one's for stuff only channel.c and the test suite should see */ +#define CHANNEL_PRIVATE_ + #include "or.h" #include "channel.h" #include "channeltls.h" @@ -29,29 +32,7 @@ #include "rephist.h" #include "router.h" #include "routerlist.h" - -/* Cell queue structure */ - -typedef struct cell_queue_entry_s cell_queue_entry_t; -struct cell_queue_entry_s { - TOR_SIMPLEQ_ENTRY(cell_queue_entry_s) next; - enum { - CELL_QUEUE_FIXED, - CELL_QUEUE_VAR, - CELL_QUEUE_PACKED - } type; - union { - struct { - cell_t *cell; - } fixed; - struct { - var_cell_t *var_cell; - } var; - struct { - packed_cell_t *packed_cell; - } packed; - } u; -}; +#include "scheduler.h" /* Global lists of channels */ @@ -75,6 +56,59 @@ static smartlist_t *finished_listeners = NULL; /* Counter for ID numbers */ static uint64_t n_channels_allocated = 0; +/* + * Channel global byte/cell counters, for statistics and for scheduler high + * /low-water marks. + */ + +/* + * Total number of cells ever given to any channel with the + * channel_write_*_cell() functions. + */ + +static uint64_t n_channel_cells_queued = 0; + +/* + * Total number of cells ever passed to a channel lower layer with the + * write_*_cell() methods. + */ + +static uint64_t n_channel_cells_passed_to_lower_layer = 0; + +/* + * Current number of cells in all channel queues; should be + * n_channel_cells_queued - n_channel_cells_passed_to_lower_layer. + */ + +static uint64_t n_channel_cells_in_queues = 0; + +/* + * Total number of bytes for all cells ever queued to a channel and + * counted in n_channel_cells_queued. + */ + +static uint64_t n_channel_bytes_queued = 0; + +/* + * Total number of bytes for all cells ever passed to a channel lower layer + * and counted in n_channel_cells_passed_to_lower_layer. + */ + +static uint64_t n_channel_bytes_passed_to_lower_layer = 0; + +/* + * Current number of bytes in all channel queues; should be + * n_channel_bytes_queued - n_channel_bytes_passed_to_lower_layer. + */ + +static uint64_t n_channel_bytes_in_queues = 0; + +/* + * Current total estimated queue size *including lower layer queues and + * transmit overhead* + */ + +STATIC uint64_t estimated_total_queue_size = 0; /* Digest->channel map * @@ -112,7 +146,6 @@ HT_GENERATE2(channel_idmap, channel_idmap_entry_s, node, channel_idmap_hash, channel_idmap_eq, 0.5, tor_reallocarray_, tor_free_); static cell_queue_entry_t * cell_queue_entry_dup(cell_queue_entry_t *q); -static void cell_queue_entry_free(cell_queue_entry_t *q, int handed_off); #if 0 static int cell_queue_entry_is_padding(cell_queue_entry_t *q); #endif @@ -123,6 +156,8 @@ cell_queue_entry_new_var(var_cell_t *var_cell); static int is_destroy_cell(channel_t *chan, const cell_queue_entry_t *q, circid_t *circid_out); +static void channel_assert_counter_consistency(void); + /* Functions to maintain the digest map */ static void channel_add_to_digest_map(channel_t *chan); static void channel_remove_from_digest_map(channel_t *chan); @@ -140,6 +175,8 @@ channel_free_list(smartlist_t *channels, int mark_for_close); static void channel_listener_free_list(smartlist_t *channels, int mark_for_close); static void channel_listener_force_free(channel_listener_t *chan_l); +static size_t channel_get_cell_queue_entry_size(channel_t *chan, + cell_queue_entry_t *q); static void channel_write_cell_queue_entry(channel_t *chan, cell_queue_entry_t *q); @@ -378,8 +415,7 @@ channel_register(channel_t *chan) smartlist_add(all_channels, chan); /* Is it finished? */ - if (chan->state == CHANNEL_STATE_CLOSED || - chan->state == CHANNEL_STATE_ERROR) { + if (CHANNEL_FINISHED(chan)) { /* Put it in the finished list, creating it if necessary */ if (!finished_channels) finished_channels = smartlist_new(); smartlist_add(finished_channels, chan); @@ -388,7 +424,7 @@ channel_register(channel_t *chan) if (!active_channels) active_channels = smartlist_new(); smartlist_add(active_channels, chan); - if (chan->state != CHANNEL_STATE_CLOSING) { + if (!CHANNEL_IS_CLOSING(chan)) { /* It should have a digest set */ if (!tor_digest_is_zero(chan->identity_digest)) { /* Yeah, we're good, add it to the map */ @@ -423,8 +459,7 @@ channel_unregister(channel_t *chan) if (!(chan->registered)) return; /* Is it finished? */ - if (chan->state == CHANNEL_STATE_CLOSED || - chan->state == CHANNEL_STATE_ERROR) { + if (CHANNEL_FINISHED(chan)) { /* Get it out of the finished list */ if (finished_channels) smartlist_remove(finished_channels, chan); } else { @@ -440,9 +475,7 @@ channel_unregister(channel_t *chan) /* Should it be in the digest map? */ if (!tor_digest_is_zero(chan->identity_digest) && - !(chan->state == CHANNEL_STATE_CLOSING || - chan->state == CHANNEL_STATE_CLOSED || - chan->state == CHANNEL_STATE_ERROR)) { + !(CHANNEL_CONDEMNED(chan))) { /* Remove it */ channel_remove_from_digest_map(chan); } @@ -542,9 +575,7 @@ channel_add_to_digest_map(channel_t *chan) tor_assert(chan); /* Assert that the state makes sense */ - tor_assert(!(chan->state == CHANNEL_STATE_CLOSING || - chan->state == CHANNEL_STATE_CLOSED || - chan->state == CHANNEL_STATE_ERROR)); + tor_assert(!CHANNEL_CONDEMNED(chan)); /* Assert that there is a digest */ tor_assert(!tor_digest_is_zero(chan->identity_digest)); @@ -746,6 +777,9 @@ channel_init(channel_t *chan) /* It hasn't been open yet. */ chan->has_been_open = 0; + + /* Scheduler state is idle */ + chan->scheduler_state = SCHED_CHAN_IDLE; } /** @@ -779,8 +813,8 @@ channel_free(channel_t *chan) if (!chan) return; /* It must be closed or errored */ - tor_assert(chan->state == CHANNEL_STATE_CLOSED || - chan->state == CHANNEL_STATE_ERROR); + tor_assert(CHANNEL_FINISHED(chan)); + /* It must be deregistered */ tor_assert(!(chan->registered)); @@ -788,6 +822,9 @@ channel_free(channel_t *chan) "Freeing channel " U64_FORMAT " at %p", U64_PRINTF_ARG(chan->global_identifier), chan); + /* Get this one out of the scheduler */ + scheduler_release_channel(chan); + /* * Get rid of cmux policy before we do anything, so cmux policies don't * see channels in weird half-freed states. @@ -863,6 +900,9 @@ channel_force_free(channel_t *chan) "Force-freeing channel " U64_FORMAT " at %p", U64_PRINTF_ARG(chan->global_identifier), chan); + /* Get this one out of the scheduler */ + scheduler_release_channel(chan); + /* * Get rid of cmux policy before we do anything, so cmux policies don't * see channels in weird half-freed states. @@ -988,9 +1028,7 @@ channel_get_cell_handler(channel_t *chan) { tor_assert(chan); - if (chan->state == CHANNEL_STATE_OPENING || - chan->state == CHANNEL_STATE_OPEN || - chan->state == CHANNEL_STATE_MAINT) + if (CHANNEL_CAN_HANDLE_CELLS(chan)) return chan->cell_handler; return NULL; @@ -1008,9 +1046,7 @@ channel_get_var_cell_handler(channel_t *chan) { tor_assert(chan); - if (chan->state == CHANNEL_STATE_OPENING || - chan->state == CHANNEL_STATE_OPEN || - chan->state == CHANNEL_STATE_MAINT) + if (CHANNEL_CAN_HANDLE_CELLS(chan)) return chan->var_cell_handler; return NULL; @@ -1033,9 +1069,7 @@ channel_set_cell_handlers(channel_t *chan, int try_again = 0; tor_assert(chan); - tor_assert(chan->state == CHANNEL_STATE_OPENING || - chan->state == CHANNEL_STATE_OPEN || - chan->state == CHANNEL_STATE_MAINT); + tor_assert(CHANNEL_CAN_HANDLE_CELLS(chan)); log_debug(LD_CHANNEL, "Setting cell_handler callback for channel %p to %p", @@ -1089,9 +1123,8 @@ channel_mark_for_close(channel_t *chan) tor_assert(chan->close != NULL); /* If it's already in CLOSING, CLOSED or ERROR, this is a no-op */ - if (chan->state == CHANNEL_STATE_CLOSING || - chan->state == CHANNEL_STATE_CLOSED || - chan->state == CHANNEL_STATE_ERROR) return; + if (CHANNEL_CONDEMNED(chan)) + return; log_debug(LD_CHANNEL, "Closing channel %p (global ID " U64_FORMAT ") " @@ -1170,9 +1203,8 @@ channel_close_from_lower_layer(channel_t *chan) tor_assert(chan != NULL); /* If it's already in CLOSING, CLOSED or ERROR, this is a no-op */ - if (chan->state == CHANNEL_STATE_CLOSING || - chan->state == CHANNEL_STATE_CLOSED || - chan->state == CHANNEL_STATE_ERROR) return; + if (CHANNEL_CONDEMNED(chan)) + return; log_debug(LD_CHANNEL, "Closing channel %p (global ID " U64_FORMAT ") " @@ -1230,9 +1262,8 @@ channel_close_for_error(channel_t *chan) tor_assert(chan != NULL); /* If it's already in CLOSING, CLOSED or ERROR, this is a no-op */ - if (chan->state == CHANNEL_STATE_CLOSING || - chan->state == CHANNEL_STATE_CLOSED || - chan->state == CHANNEL_STATE_ERROR) return; + if (CHANNEL_CONDEMNED(chan)) + return; log_debug(LD_CHANNEL, "Closing channel %p due to lower-layer error", @@ -1288,18 +1319,16 @@ void channel_closed(channel_t *chan) { tor_assert(chan); - tor_assert(chan->state == CHANNEL_STATE_CLOSING || - chan->state == CHANNEL_STATE_CLOSED || - chan->state == CHANNEL_STATE_ERROR); + tor_assert(CHANNEL_CONDEMNED(chan)); /* No-op if already inactive */ - if (chan->state == CHANNEL_STATE_CLOSED || - chan->state == CHANNEL_STATE_ERROR) return; + if (CHANNEL_FINISHED(chan)) + return; /* Inform any pending (not attached) circs that they should * give up. */ if (! chan->has_been_open) - circuit_n_chan_done(chan, 0); + circuit_n_chan_done(chan, 0, 0); /* Now close all the attached circuits on it. */ circuit_unlink_all_from_channel(chan, END_CIRC_REASON_CHANNEL_CLOSED); @@ -1357,10 +1386,7 @@ channel_clear_identity_digest(channel_t *chan) "global ID " U64_FORMAT, chan, U64_PRINTF_ARG(chan->global_identifier)); - state_not_in_map = - (chan->state == CHANNEL_STATE_CLOSING || - chan->state == CHANNEL_STATE_CLOSED || - chan->state == CHANNEL_STATE_ERROR); + state_not_in_map = CHANNEL_CONDEMNED(chan); if (!state_not_in_map && chan->registered && !tor_digest_is_zero(chan->identity_digest)) @@ -1393,10 +1419,8 @@ channel_set_identity_digest(channel_t *chan, identity_digest ? hex_str(identity_digest, DIGEST_LEN) : "(null)"); - state_not_in_map = - (chan->state == CHANNEL_STATE_CLOSING || - chan->state == CHANNEL_STATE_CLOSED || - chan->state == CHANNEL_STATE_ERROR); + state_not_in_map = CHANNEL_CONDEMNED(chan); + was_in_digest_map = !state_not_in_map && chan->registered && @@ -1446,10 +1470,7 @@ channel_clear_remote_end(channel_t *chan) "global ID " U64_FORMAT, chan, U64_PRINTF_ARG(chan->global_identifier)); - state_not_in_map = - (chan->state == CHANNEL_STATE_CLOSING || - chan->state == CHANNEL_STATE_CLOSED || - chan->state == CHANNEL_STATE_ERROR); + state_not_in_map = CHANNEL_CONDEMNED(chan); if (!state_not_in_map && chan->registered && !tor_digest_is_zero(chan->identity_digest)) @@ -1485,10 +1506,8 @@ channel_set_remote_end(channel_t *chan, identity_digest ? hex_str(identity_digest, DIGEST_LEN) : "(null)"); - state_not_in_map = - (chan->state == CHANNEL_STATE_CLOSING || - chan->state == CHANNEL_STATE_CLOSED || - chan->state == CHANNEL_STATE_ERROR); + state_not_in_map = CHANNEL_CONDEMNED(chan); + was_in_digest_map = !state_not_in_map && chan->registered && @@ -1548,7 +1567,7 @@ cell_queue_entry_dup(cell_queue_entry_t *q) * them) or not (we should free). */ -static void +STATIC void cell_queue_entry_free(cell_queue_entry_t *q, int handed_off) { if (!q) return; @@ -1666,6 +1685,36 @@ cell_queue_entry_new_var(var_cell_t *var_cell) } /** + * Ask how big the cell contained in a cell_queue_entry_t is + */ + +static size_t +channel_get_cell_queue_entry_size(channel_t *chan, cell_queue_entry_t *q) +{ + size_t rv = 0; + + tor_assert(chan); + tor_assert(q); + + switch (q->type) { + case CELL_QUEUE_FIXED: + rv = get_cell_network_size(chan->wide_circ_ids); + break; + case CELL_QUEUE_VAR: + rv = get_var_cell_header_size(chan->wide_circ_ids) + + (q->u.var.var_cell ? q->u.var.var_cell->payload_len : 0); + break; + case CELL_QUEUE_PACKED: + rv = get_cell_network_size(chan->wide_circ_ids); + break; + default: + tor_assert(1); + } + + return rv; +} + +/** * Write to a channel based on a cell_queue_entry_t * * Given a cell_queue_entry_t filled out by the caller, try to send the cell @@ -1677,14 +1726,13 @@ channel_write_cell_queue_entry(channel_t *chan, cell_queue_entry_t *q) { int result = 0, sent = 0; cell_queue_entry_t *tmp = NULL; + size_t cell_bytes; tor_assert(chan); tor_assert(q); /* Assert that the state makes sense for a cell write */ - tor_assert(chan->state == CHANNEL_STATE_OPENING || - chan->state == CHANNEL_STATE_OPEN || - chan->state == CHANNEL_STATE_MAINT); + tor_assert(CHANNEL_CAN_HANDLE_CELLS(chan)); { circid_t circ_id; @@ -1693,9 +1741,12 @@ channel_write_cell_queue_entry(channel_t *chan, cell_queue_entry_t *q) } } + /* For statistical purposes, figure out how big this cell is */ + cell_bytes = channel_get_cell_queue_entry_size(chan, q); + /* Can we send it right out? If so, try */ if (TOR_SIMPLEQ_EMPTY(&chan->outgoing_queue) && - chan->state == CHANNEL_STATE_OPEN) { + CHANNEL_IS_OPEN(chan)) { /* Pick the right write function for this cell type and save the result */ switch (q->type) { case CELL_QUEUE_FIXED: @@ -1726,6 +1777,13 @@ channel_write_cell_queue_entry(channel_t *chan, cell_queue_entry_t *q) channel_timestamp_drained(chan); /* Update the counter */ ++(chan->n_cells_xmitted); + chan->n_bytes_xmitted += cell_bytes; + /* Update global counters */ + ++n_channel_cells_queued; + ++n_channel_cells_passed_to_lower_layer; + n_channel_bytes_queued += cell_bytes; + n_channel_bytes_passed_to_lower_layer += cell_bytes; + channel_assert_counter_consistency(); } } @@ -1737,8 +1795,16 @@ channel_write_cell_queue_entry(channel_t *chan, cell_queue_entry_t *q) */ tmp = cell_queue_entry_dup(q); TOR_SIMPLEQ_INSERT_TAIL(&chan->outgoing_queue, tmp, next); + /* Update global counters */ + ++n_channel_cells_queued; + ++n_channel_cells_in_queues; + n_channel_bytes_queued += cell_bytes; + n_channel_bytes_in_queues += cell_bytes; + channel_assert_counter_consistency(); + /* Update channel queue size */ + chan->bytes_in_queue += cell_bytes; /* Try to process the queue? */ - if (chan->state == CHANNEL_STATE_OPEN) channel_flush_cells(chan); + if (CHANNEL_IS_OPEN(chan)) channel_flush_cells(chan); } } @@ -1759,7 +1825,7 @@ channel_write_cell(channel_t *chan, cell_t *cell) tor_assert(chan); tor_assert(cell); - if (chan->state == CHANNEL_STATE_CLOSING) { + if (CHANNEL_IS_CLOSING(chan)) { log_debug(LD_CHANNEL, "Discarding cell_t %p on closing channel %p with " "global ID "U64_FORMAT, cell, chan, U64_PRINTF_ARG(chan->global_identifier)); @@ -1775,6 +1841,9 @@ channel_write_cell(channel_t *chan, cell_t *cell) q.type = CELL_QUEUE_FIXED; q.u.fixed.cell = cell; channel_write_cell_queue_entry(chan, &q); + + /* Update the queue size estimate */ + channel_update_xmit_queue_size(chan); } /** @@ -1793,7 +1862,7 @@ channel_write_packed_cell(channel_t *chan, packed_cell_t *packed_cell) tor_assert(chan); tor_assert(packed_cell); - if (chan->state == CHANNEL_STATE_CLOSING) { + if (CHANNEL_IS_CLOSING(chan)) { log_debug(LD_CHANNEL, "Discarding packed_cell_t %p on closing channel %p " "with global ID "U64_FORMAT, packed_cell, chan, U64_PRINTF_ARG(chan->global_identifier)); @@ -1810,6 +1879,9 @@ channel_write_packed_cell(channel_t *chan, packed_cell_t *packed_cell) q.type = CELL_QUEUE_PACKED; q.u.packed.packed_cell = packed_cell; channel_write_cell_queue_entry(chan, &q); + + /* Update the queue size estimate */ + channel_update_xmit_queue_size(chan); } /** @@ -1829,7 +1901,7 @@ channel_write_var_cell(channel_t *chan, var_cell_t *var_cell) tor_assert(chan); tor_assert(var_cell); - if (chan->state == CHANNEL_STATE_CLOSING) { + if (CHANNEL_IS_CLOSING(chan)) { log_debug(LD_CHANNEL, "Discarding var_cell_t %p on closing channel %p " "with global ID "U64_FORMAT, var_cell, chan, U64_PRINTF_ARG(chan->global_identifier)); @@ -1846,6 +1918,9 @@ channel_write_var_cell(channel_t *chan, var_cell_t *var_cell) q.type = CELL_QUEUE_VAR; q.u.var.var_cell = var_cell; channel_write_cell_queue_entry(chan, &q); + + /* Update the queue size estimate */ + channel_update_xmit_queue_size(chan); } /** @@ -1941,6 +2016,41 @@ channel_change_state(channel_t *chan, channel_state_t to_state) } } + /* + * If we're going to a closed/closing state, we don't need scheduling any + * more; in CHANNEL_STATE_MAINT we can't accept writes. + */ + if (to_state == CHANNEL_STATE_CLOSING || + to_state == CHANNEL_STATE_CLOSED || + to_state == CHANNEL_STATE_ERROR) { + scheduler_release_channel(chan); + } else if (to_state == CHANNEL_STATE_MAINT) { + scheduler_channel_doesnt_want_writes(chan); + } + + /* + * If we're closing, this channel no longer counts toward the global + * estimated queue size; if we're open, it now does. + */ + if ((to_state == CHANNEL_STATE_CLOSING || + to_state == CHANNEL_STATE_CLOSED || + to_state == CHANNEL_STATE_ERROR) && + (from_state == CHANNEL_STATE_OPEN || + from_state == CHANNEL_STATE_MAINT)) { + estimated_total_queue_size -= chan->bytes_in_queue; + } + + /* + * If we're opening, this channel now does count toward the global + * estimated queue size. + */ + if ((to_state == CHANNEL_STATE_OPEN || + to_state == CHANNEL_STATE_MAINT) && + !(from_state == CHANNEL_STATE_OPEN || + from_state == CHANNEL_STATE_MAINT)) { + estimated_total_queue_size += chan->bytes_in_queue; + } + /* Tell circuits if we opened and stuff */ if (to_state == CHANNEL_STATE_OPEN) { channel_do_open_actions(chan); @@ -2056,12 +2166,13 @@ channel_listener_change_state(channel_listener_t *chan_l, #define MAX_CELLS_TO_GET_FROM_CIRCUITS_FOR_UNLIMITED 256 -ssize_t -channel_flush_some_cells(channel_t *chan, ssize_t num_cells) +MOCK_IMPL(ssize_t, +channel_flush_some_cells, (channel_t *chan, ssize_t num_cells)) { unsigned int unlimited = 0; ssize_t flushed = 0; int num_cells_from_circs, clamped_num_cells; + int q_len_before, q_len_after; tor_assert(chan); @@ -2069,7 +2180,7 @@ channel_flush_some_cells(channel_t *chan, ssize_t num_cells) if (!unlimited && num_cells <= flushed) goto done; /* If we aren't in CHANNEL_STATE_OPEN, nothing goes through */ - if (chan->state == CHANNEL_STATE_OPEN) { + if (CHANNEL_IS_OPEN(chan)) { /* Try to flush as much as we can that's already queued */ flushed += channel_flush_some_cells_from_outgoing_queue(chan, (unlimited ? -1 : num_cells - flushed)); @@ -2087,14 +2198,45 @@ channel_flush_some_cells(channel_t *chan, ssize_t num_cells) clamped_num_cells = (int)(num_cells - flushed); } } + + /* + * Keep track of the change in queue size; we have to count cells + * channel_flush_from_first_active_circuit() writes out directly, + * but not double-count ones we might get later in + * channel_flush_some_cells_from_outgoing_queue() + */ + q_len_before = chan_cell_queue_len(&(chan->outgoing_queue)); + /* Try to get more cells from any active circuits */ num_cells_from_circs = channel_flush_from_first_active_circuit( chan, clamped_num_cells); - /* If it claims we got some, process the queue again */ + q_len_after = chan_cell_queue_len(&(chan->outgoing_queue)); + + /* + * If it claims we got some, adjust the flushed counter and consider + * processing the queue again + */ if (num_cells_from_circs > 0) { - flushed += channel_flush_some_cells_from_outgoing_queue(chan, - (unlimited ? -1 : num_cells - flushed)); + /* + * Adjust flushed by the number of cells counted in + * num_cells_from_circs that didn't go to the cell queue. + */ + + if (q_len_after > q_len_before) { + num_cells_from_circs -= (q_len_after - q_len_before); + if (num_cells_from_circs < 0) num_cells_from_circs = 0; + } + + flushed += num_cells_from_circs; + + /* Now process the queue if necessary */ + + if ((q_len_after > q_len_before) && + (unlimited || (flushed < num_cells))) { + flushed += channel_flush_some_cells_from_outgoing_queue(chan, + (unlimited ? -1 : num_cells - flushed)); + } } } } @@ -2117,6 +2259,8 @@ channel_flush_some_cells_from_outgoing_queue(channel_t *chan, unsigned int unlimited = 0; ssize_t flushed = 0; cell_queue_entry_t *q = NULL; + size_t cell_size; + int free_q = 0, handed_off = 0; tor_assert(chan); tor_assert(chan->write_cell); @@ -2127,11 +2271,15 @@ channel_flush_some_cells_from_outgoing_queue(channel_t *chan, if (!unlimited && num_cells <= flushed) return 0; /* If we aren't in CHANNEL_STATE_OPEN, nothing goes through */ - if (chan->state == CHANNEL_STATE_OPEN) { + if (CHANNEL_IS_OPEN(chan)) { while ((unlimited || num_cells > flushed) && NULL != (q = TOR_SIMPLEQ_FIRST(&chan->outgoing_queue))) { + free_q = 0; + handed_off = 0; if (1) { + /* Figure out how big it is for statistical purposes */ + cell_size = channel_get_cell_queue_entry_size(chan, q); /* * Okay, we have a good queue entry, try to give it to the lower * layer. @@ -2144,8 +2292,9 @@ channel_flush_some_cells_from_outgoing_queue(channel_t *chan, ++flushed; channel_timestamp_xmit(chan); ++(chan->n_cells_xmitted); - cell_queue_entry_free(q, 1); - q = NULL; + chan->n_bytes_xmitted += cell_size; + free_q = 1; + handed_off = 1; } /* Else couldn't write it; leave it on the queue */ } else { @@ -2156,8 +2305,8 @@ channel_flush_some_cells_from_outgoing_queue(channel_t *chan, "(global ID " U64_FORMAT ").", chan, U64_PRINTF_ARG(chan->global_identifier)); /* Throw it away */ - cell_queue_entry_free(q, 0); - q = NULL; + free_q = 1; + handed_off = 0; } break; case CELL_QUEUE_PACKED: @@ -2167,8 +2316,9 @@ channel_flush_some_cells_from_outgoing_queue(channel_t *chan, ++flushed; channel_timestamp_xmit(chan); ++(chan->n_cells_xmitted); - cell_queue_entry_free(q, 1); - q = NULL; + chan->n_bytes_xmitted += cell_size; + free_q = 1; + handed_off = 1; } /* Else couldn't write it; leave it on the queue */ } else { @@ -2179,8 +2329,8 @@ channel_flush_some_cells_from_outgoing_queue(channel_t *chan, "(global ID " U64_FORMAT ").", chan, U64_PRINTF_ARG(chan->global_identifier)); /* Throw it away */ - cell_queue_entry_free(q, 0); - q = NULL; + free_q = 1; + handed_off = 0; } break; case CELL_QUEUE_VAR: @@ -2190,8 +2340,9 @@ channel_flush_some_cells_from_outgoing_queue(channel_t *chan, ++flushed; channel_timestamp_xmit(chan); ++(chan->n_cells_xmitted); - cell_queue_entry_free(q, 1); - q = NULL; + chan->n_bytes_xmitted += cell_size; + free_q = 1; + handed_off = 1; } /* Else couldn't write it; leave it on the queue */ } else { @@ -2202,8 +2353,8 @@ channel_flush_some_cells_from_outgoing_queue(channel_t *chan, "(global ID " U64_FORMAT ").", chan, U64_PRINTF_ARG(chan->global_identifier)); /* Throw it away */ - cell_queue_entry_free(q, 0); - q = NULL; + free_q = 1; + handed_off = 0; } break; default: @@ -2213,12 +2364,32 @@ channel_flush_some_cells_from_outgoing_queue(channel_t *chan, "(global ID " U64_FORMAT "; ignoring it." " Someone should fix this.", q->type, chan, U64_PRINTF_ARG(chan->global_identifier)); - cell_queue_entry_free(q, 0); - q = NULL; + free_q = 1; + handed_off = 0; } - /* if q got NULLed out, we used it and should remove the queue entry */ - if (!q) TOR_SIMPLEQ_REMOVE_HEAD(&chan->outgoing_queue, next); + /* + * if free_q is set, we used it and should remove the queue entry; + * we have to do the free down here so TOR_SIMPLEQ_REMOVE_HEAD isn't + * accessing freed memory + */ + if (free_q) { + TOR_SIMPLEQ_REMOVE_HEAD(&chan->outgoing_queue, next); + /* + * ...and we handed a cell off to the lower layer, so we should + * update the counters. + */ + ++n_channel_cells_passed_to_lower_layer; + --n_channel_cells_in_queues; + n_channel_bytes_passed_to_lower_layer += cell_size; + n_channel_bytes_in_queues -= cell_size; + channel_assert_counter_consistency(); + /* Update the channel's queue size too */ + chan->bytes_in_queue -= cell_size; + /* Finally, free q */ + cell_queue_entry_free(q, handed_off); + q = NULL; + } /* No cell removed from list, so we can't go on any further */ else break; } @@ -2230,6 +2401,9 @@ channel_flush_some_cells_from_outgoing_queue(channel_t *chan, channel_timestamp_drained(chan); } + /* Update the estimate queue size */ + channel_update_xmit_queue_size(chan); + return flushed; } @@ -2352,8 +2526,9 @@ void channel_do_open_actions(channel_t *chan) { tor_addr_t remote_addr; - int started_here, not_using = 0; + int started_here; time_t now = time(NULL); + int close_origin_circuits = 0; tor_assert(chan); @@ -2370,8 +2545,7 @@ channel_do_open_actions(channel_t *chan) log_debug(LD_OR, "New entry guard was reachable, but closing this " "connection so we can retry the earlier entry guards."); - circuit_n_chan_done(chan, 0); - not_using = 1; + close_origin_circuits = 1; } router_set_status(chan->identity_digest, 1); } else { @@ -2391,7 +2565,7 @@ channel_do_open_actions(channel_t *chan) } } - if (!not_using) circuit_n_chan_done(chan, 1); + circuit_n_chan_done(chan, 1, close_origin_circuits); } /** @@ -2462,9 +2636,8 @@ channel_process_cells(channel_t *chan) { cell_queue_entry_t *q; tor_assert(chan); - tor_assert(chan->state == CHANNEL_STATE_CLOSING || - chan->state == CHANNEL_STATE_MAINT || - chan->state == CHANNEL_STATE_OPEN); + tor_assert(CHANNEL_IS_CLOSING(chan) || CHANNEL_IS_MAINT(chan) || + CHANNEL_IS_OPEN(chan)); log_debug(LD_CHANNEL, "Processing as many incoming cells as we can for channel %p", @@ -2531,7 +2704,7 @@ channel_queue_cell(channel_t *chan, cell_t *cell) tor_assert(chan); tor_assert(cell); - tor_assert(chan->state == CHANNEL_STATE_OPEN); + tor_assert(CHANNEL_IS_OPEN(chan)); /* Do we need to queue it, or can we just call the handler right away? */ if (!(chan->cell_handler)) need_to_queue = 1; @@ -2541,8 +2714,9 @@ channel_queue_cell(channel_t *chan, cell_t *cell) /* Timestamp for receiving */ channel_timestamp_recv(chan); - /* Update the counter */ + /* Update the counters */ ++(chan->n_cells_recved); + chan->n_bytes_recved += get_cell_network_size(chan->wide_circ_ids); /* If we don't need to queue we can just call cell_handler */ if (!need_to_queue) { @@ -2584,7 +2758,7 @@ channel_queue_var_cell(channel_t *chan, var_cell_t *var_cell) tor_assert(chan); tor_assert(var_cell); - tor_assert(chan->state == CHANNEL_STATE_OPEN); + tor_assert(CHANNEL_IS_OPEN(chan)); /* Do we need to queue it, or can we just call the handler right away? */ if (!(chan->var_cell_handler)) need_to_queue = 1; @@ -2596,6 +2770,8 @@ channel_queue_var_cell(channel_t *chan, var_cell_t *var_cell) /* Update the counter */ ++(chan->n_cells_recved); + chan->n_bytes_recved += get_var_cell_header_size(chan->wide_circ_ids) + + var_cell->payload_len; /* If we don't need to queue we can just call cell_handler */ if (!need_to_queue) { @@ -2645,6 +2821,19 @@ packed_cell_is_destroy(channel_t *chan, return 0; } +/** + * Assert that the global channel stats counters are internally consistent + */ + +static void +channel_assert_counter_consistency(void) +{ + tor_assert(n_channel_cells_queued == + (n_channel_cells_in_queues + n_channel_cells_passed_to_lower_layer)); + tor_assert(n_channel_bytes_queued == + (n_channel_bytes_in_queues + n_channel_bytes_passed_to_lower_layer)); +} + /** DOCDOC */ static int is_destroy_cell(channel_t *chan, @@ -2692,10 +2881,7 @@ channel_send_destroy(circid_t circ_id, channel_t *chan, int reason) } /* Check to make sure we can send on this channel first */ - if (!(chan->state == CHANNEL_STATE_CLOSING || - chan->state == CHANNEL_STATE_CLOSED || - chan->state == CHANNEL_STATE_ERROR) && - chan->cmux) { + if (!CHANNEL_CONDEMNED(chan) && chan->cmux) { channel_note_destroy_pending(chan, circ_id); circuitmux_append_destroy_cell(chan, chan->cmux, circ_id, reason); log_debug(LD_OR, @@ -2727,6 +2913,19 @@ channel_dumpstats(int severity) { if (all_channels && smartlist_len(all_channels) > 0) { tor_log(severity, LD_GENERAL, + "Channels have queued " U64_FORMAT " bytes in " U64_FORMAT " cells, " + "and handed " U64_FORMAT " bytes in " U64_FORMAT " cells to the lower" + " layer.", + U64_PRINTF_ARG(n_channel_bytes_queued), + U64_PRINTF_ARG(n_channel_cells_queued), + U64_PRINTF_ARG(n_channel_bytes_passed_to_lower_layer), + U64_PRINTF_ARG(n_channel_cells_passed_to_lower_layer)); + tor_log(severity, LD_GENERAL, + "There are currently " U64_FORMAT " bytes in " U64_FORMAT " cells " + "in channel queues.", + U64_PRINTF_ARG(n_channel_bytes_in_queues), + U64_PRINTF_ARG(n_channel_cells_in_queues)); + tor_log(severity, LD_GENERAL, "Dumping statistics about %d channels:", smartlist_len(all_channels)); tor_log(severity, LD_GENERAL, @@ -2872,9 +3071,7 @@ channel_free_list(smartlist_t *channels, int mark_for_close) } channel_unregister(curr); if (mark_for_close) { - if (!(curr->state == CHANNEL_STATE_CLOSING || - curr->state == CHANNEL_STATE_CLOSED || - curr->state == CHANNEL_STATE_ERROR)) { + if (!CHANNEL_CONDEMNED(curr)) { channel_mark_for_close(curr); } channel_force_free(curr); @@ -3088,9 +3285,7 @@ channel_get_for_extend(const char *digest, tor_assert(tor_memeq(chan->identity_digest, digest, DIGEST_LEN)); - if (chan->state == CHANNEL_STATE_CLOSING || - chan->state == CHANNEL_STATE_CLOSED || - chan->state == CHANNEL_STATE_ERROR) + if (CHANNEL_CONDEMNED(chan)) continue; /* Never return a channel on which the other end appears to be @@ -3100,7 +3295,7 @@ channel_get_for_extend(const char *digest, } /* Never return a non-open connection. */ - if (chan->state != CHANNEL_STATE_OPEN) { + if (!CHANNEL_IS_OPEN(chan)) { /* If the address matches, don't launch a new connection for this * circuit. */ if (channel_matches_target_addr_for_extend(chan, target_addr)) @@ -3200,7 +3395,7 @@ channel_listener_describe_transport(channel_listener_t *chan_l) /** * Return the number of entries in <b>queue</b> */ -static int +STATIC int chan_cell_queue_len(const chan_cell_queue_t *queue) { int r = 0; @@ -3216,8 +3411,8 @@ chan_cell_queue_len(const chan_cell_queue_t *queue) * Dump statistics for one channel to the log */ -void -channel_dump_statistics(channel_t *chan, int severity) +MOCK_IMPL(void, +channel_dump_statistics, (channel_t *chan, int severity)) { double avg, interval, age; time_t now = time(NULL); @@ -3369,12 +3564,22 @@ channel_dump_statistics(channel_t *chan, int severity) /* Describe counters and rates */ tor_log(severity, LD_GENERAL, " * Channel " U64_FORMAT " has received " - U64_FORMAT " cells and transmitted " U64_FORMAT, + U64_FORMAT " bytes in " U64_FORMAT " cells and transmitted " + U64_FORMAT " bytes in " U64_FORMAT " cells", U64_PRINTF_ARG(chan->global_identifier), + U64_PRINTF_ARG(chan->n_bytes_recved), U64_PRINTF_ARG(chan->n_cells_recved), + U64_PRINTF_ARG(chan->n_bytes_xmitted), U64_PRINTF_ARG(chan->n_cells_xmitted)); if (now > chan->timestamp_created && chan->timestamp_created > 0) { + if (chan->n_bytes_recved > 0) { + avg = (double)(chan->n_bytes_recved) / age; + tor_log(severity, LD_GENERAL, + " * Channel " U64_FORMAT " has averaged %f " + "bytes received per second", + U64_PRINTF_ARG(chan->global_identifier), avg); + } if (chan->n_cells_recved > 0) { avg = (double)(chan->n_cells_recved) / age; if (avg >= 1.0) { @@ -3390,6 +3595,13 @@ channel_dump_statistics(channel_t *chan, int severity) U64_PRINTF_ARG(chan->global_identifier), interval); } } + if (chan->n_bytes_xmitted > 0) { + avg = (double)(chan->n_bytes_xmitted) / age; + tor_log(severity, LD_GENERAL, + " * Channel " U64_FORMAT " has averaged %f " + "bytes transmitted per second", + U64_PRINTF_ARG(chan->global_identifier), avg); + } if (chan->n_cells_xmitted > 0) { avg = (double)(chan->n_cells_xmitted) / age; if (avg >= 1.0) { @@ -3807,6 +4019,50 @@ channel_mark_outgoing(channel_t *chan) chan->is_incoming = 0; } +/************************ + * Flow control queries * + ***********************/ + +/* + * Get the latest estimate for the total queue size of all open channels + */ + +uint64_t +channel_get_global_queue_estimate(void) +{ + return estimated_total_queue_size; +} + +/* + * Estimate the number of writeable cells + * + * Ask the lower layer for an estimate of how many cells it can accept, and + * then subtract the length of our outgoing_queue, if any, to produce an + * estimate of the number of cells this channel can accept for writes. + */ + +int +channel_num_cells_writeable(channel_t *chan) +{ + int result; + + tor_assert(chan); + tor_assert(chan->num_cells_writeable); + + if (chan->state == CHANNEL_STATE_OPEN) { + /* Query lower layer */ + result = chan->num_cells_writeable(chan); + /* Subtract cell queue length, if any */ + result -= chan_cell_queue_len(&chan->outgoing_queue); + if (result < 0) result = 0; + } else { + /* No cells are writeable in any other state */ + result = 0; + } + + return result; +} + /********************* * Timestamp updates * ********************/ @@ -4209,3 +4465,87 @@ channel_set_circid_type(channel_t *chan, } } +/** + * Update the estimated number of bytes queued to transmit for this channel, + * and notify the scheduler. The estimate includes both the channel queue and + * the queue size reported by the lower layer, and an overhead estimate + * optionally provided by the lower layer. + */ + +void +channel_update_xmit_queue_size(channel_t *chan) +{ + uint64_t queued, adj; + double overhead; + + tor_assert(chan); + tor_assert(chan->num_bytes_queued); + + /* + * First, get the number of bytes we have queued without factoring in + * lower-layer overhead. + */ + queued = chan->num_bytes_queued(chan) + chan->bytes_in_queue; + /* Next, adjust by the overhead factor, if any is available */ + if (chan->get_overhead_estimate) { + overhead = chan->get_overhead_estimate(chan); + if (overhead >= 1.0f) { + queued *= overhead; + } else { + /* Ignore silly overhead factors */ + log_notice(LD_CHANNEL, "Ignoring silly overhead factor %f", overhead); + } + } + + /* Now, compare to the previous estimate */ + if (queued > chan->bytes_queued_for_xmit) { + adj = queued - chan->bytes_queued_for_xmit; + log_debug(LD_CHANNEL, + "Increasing queue size for channel " U64_FORMAT " by " U64_FORMAT + " from " U64_FORMAT " to " U64_FORMAT, + U64_PRINTF_ARG(chan->global_identifier), + U64_PRINTF_ARG(adj), + U64_PRINTF_ARG(chan->bytes_queued_for_xmit), + U64_PRINTF_ARG(queued)); + /* Update the channel's estimate */ + chan->bytes_queued_for_xmit = queued; + + /* Update the global queue size estimate if appropriate */ + if (chan->state == CHANNEL_STATE_OPEN || + chan->state == CHANNEL_STATE_MAINT) { + estimated_total_queue_size += adj; + log_debug(LD_CHANNEL, + "Increasing global queue size by " U64_FORMAT " for channel " + U64_FORMAT ", new size is " U64_FORMAT, + U64_PRINTF_ARG(adj), U64_PRINTF_ARG(chan->global_identifier), + U64_PRINTF_ARG(estimated_total_queue_size)); + /* Tell the scheduler we're increasing the queue size */ + scheduler_adjust_queue_size(chan, 1, adj); + } + } else if (queued < chan->bytes_queued_for_xmit) { + adj = chan->bytes_queued_for_xmit - queued; + log_debug(LD_CHANNEL, + "Decreasing queue size for channel " U64_FORMAT " by " U64_FORMAT + " from " U64_FORMAT " to " U64_FORMAT, + U64_PRINTF_ARG(chan->global_identifier), + U64_PRINTF_ARG(adj), + U64_PRINTF_ARG(chan->bytes_queued_for_xmit), + U64_PRINTF_ARG(queued)); + /* Update the channel's estimate */ + chan->bytes_queued_for_xmit = queued; + + /* Update the global queue size estimate if appropriate */ + if (chan->state == CHANNEL_STATE_OPEN || + chan->state == CHANNEL_STATE_MAINT) { + estimated_total_queue_size -= adj; + log_debug(LD_CHANNEL, + "Decreasing global queue size by " U64_FORMAT " for channel " + U64_FORMAT ", new size is " U64_FORMAT, + U64_PRINTF_ARG(adj), U64_PRINTF_ARG(chan->global_identifier), + U64_PRINTF_ARG(estimated_total_queue_size)); + /* Tell the scheduler we're decreasing the queue size */ + scheduler_adjust_queue_size(chan, -1, adj); + } + } +} + diff --git a/src/or/channel.h b/src/or/channel.h index 4cd8f4391e..ecc2a092e4 100644 --- a/src/or/channel.h +++ b/src/or/channel.h @@ -1,4 +1,4 @@ -/* * Copyright (c) 2012-2014, The Tor Project, Inc. */ +/* * Copyright (c) 2012-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -57,6 +57,32 @@ struct channel_s { CHANNEL_CLOSE_FOR_ERROR } reason_for_closing; + /** State variable for use by the scheduler */ + enum { + /* + * The channel is not open, or it has a full output buffer but no queued + * cells. + */ + SCHED_CHAN_IDLE = 0, + /* + * The channel has space on its output buffer to write, but no queued + * cells. + */ + SCHED_CHAN_WAITING_FOR_CELLS, + /* + * The scheduler has queued cells but no output buffer space to write. + */ + SCHED_CHAN_WAITING_TO_WRITE, + /* + * The scheduler has both queued cells and output buffer space, and is + * eligible for the scheduler loop. + */ + SCHED_CHAN_PENDING + } scheduler_state; + + /** Heap index for use by the scheduler */ + int sched_heap_idx; + /** Timestamps for both cell channels and listeners */ time_t timestamp_created; /* Channel created */ time_t timestamp_active; /* Any activity */ @@ -79,6 +105,11 @@ struct channel_s { /* Methods implemented by the lower layer */ /** + * Ask the lower layer for an estimate of the average overhead for + * transmissions on this channel. + */ + double (*get_overhead_estimate)(channel_t *); + /* * Ask the underlying transport what the remote endpoint address is, in * a tor_addr_t. This is optional and subclasses may leave this NULL. * If they implement it, they should write the address out to the @@ -110,7 +141,11 @@ struct channel_s { int (*matches_extend_info)(channel_t *, extend_info_t *); /** Check if this channel matches a target address when extending */ int (*matches_target)(channel_t *, const tor_addr_t *); - /** Write a cell to an open channel */ + /* Ask the lower layer how many bytes it has queued but not yet sent */ + size_t (*num_bytes_queued)(channel_t *); + /* Ask the lower layer how many cells can be written */ + int (*num_cells_writeable)(channel_t *); + /* Write a cell to an open channel */ int (*write_cell)(channel_t *, cell_t *); /** Write a packed cell to an open channel */ int (*write_packed_cell)(channel_t *, packed_cell_t *); @@ -198,8 +233,16 @@ struct channel_s { uint64_t dirreq_id; /** Channel counters for cell channels */ - uint64_t n_cells_recved; - uint64_t n_cells_xmitted; + uint64_t n_cells_recved, n_bytes_recved; + uint64_t n_cells_xmitted, n_bytes_xmitted; + + /** Our current contribution to the scheduler's total xmit queue */ + uint64_t bytes_queued_for_xmit; + + /** Number of bytes in this channel's cell queue; does not include + * lower-layer queueing. + */ + uint64_t bytes_in_queue; }; struct channel_listener_s { @@ -311,6 +354,36 @@ void channel_set_cmux_policy_everywhere(circuitmux_policy_t *pol); #ifdef TOR_CHANNEL_INTERNAL_ +#ifdef CHANNEL_PRIVATE_ +/* Cell queue structure (here rather than channel.c for test suite use) */ + +typedef struct cell_queue_entry_s cell_queue_entry_t; +struct cell_queue_entry_s { + TOR_SIMPLEQ_ENTRY(cell_queue_entry_s) next; + enum { + CELL_QUEUE_FIXED, + CELL_QUEUE_VAR, + CELL_QUEUE_PACKED + } type; + union { + struct { + cell_t *cell; + } fixed; + struct { + var_cell_t *var_cell; + } var; + struct { + packed_cell_t *packed_cell; + } packed; + } u; +}; + +/* Cell queue functions for benefit of test suite */ +STATIC int chan_cell_queue_len(const chan_cell_queue_t *queue); + +STATIC void cell_queue_entry_free(cell_queue_entry_t *q, int handed_off); +#endif + /* Channel operations for subclasses and internal use only */ /* Initialize a newly allocated channel - do this first in subclass @@ -384,7 +457,8 @@ void channel_queue_var_cell(channel_t *chan, var_cell_t *var_cell); void channel_flush_cells(channel_t *chan); /* Request from lower layer for more cells if available */ -ssize_t channel_flush_some_cells(channel_t *chan, ssize_t num_cells); +MOCK_DECL(ssize_t, channel_flush_some_cells, + (channel_t *chan, ssize_t num_cells)); /* Query if data available on this channel */ int channel_more_to_flush(channel_t *chan); @@ -431,11 +505,44 @@ channel_t * channel_find_by_remote_digest(const char *identity_digest); channel_t * channel_next_with_digest(channel_t *chan); /* + * Helper macros to lookup state of given channel. + */ + +#define CHANNEL_IS_CLOSED(chan) (channel_is_in_state((chan), \ + CHANNEL_STATE_CLOSED)) +#define CHANNEL_IS_OPENING(chan) (channel_is_in_state((chan), \ + CHANNEL_STATE_OPENING)) +#define CHANNEL_IS_OPEN(chan) (channel_is_in_state((chan), \ + CHANNEL_STATE_OPEN)) +#define CHANNEL_IS_MAINT(chan) (channel_is_in_state((chan), \ + CHANNEL_STATE_MAINT)) +#define CHANNEL_IS_CLOSING(chan) (channel_is_in_state((chan), \ + CHANNEL_STATE_CLOSING)) +#define CHANNEL_IS_ERROR(chan) (channel_is_in_state((chan), \ + CHANNEL_STATE_ERROR)) + +#define CHANNEL_FINISHED(chan) (CHANNEL_IS_CLOSED(chan) || \ + CHANNEL_IS_ERROR(chan)) + +#define CHANNEL_CONDEMNED(chan) (CHANNEL_IS_CLOSING(chan) || \ + CHANNEL_FINISHED(chan)) + +#define CHANNEL_CAN_HANDLE_CELLS(chan) (CHANNEL_IS_OPENING(chan) || \ + CHANNEL_IS_OPEN(chan) || \ + CHANNEL_IS_MAINT(chan)) + +static INLINE int +channel_is_in_state(channel_t *chan, channel_state_t state) +{ + return chan->state == state; +} + +/* * Metadata queries/updates */ const char * channel_describe_transport(channel_t *chan); -void channel_dump_statistics(channel_t *chan, int severity); +MOCK_DECL(void, channel_dump_statistics, (channel_t *chan, int severity)); void channel_dump_transport_statistics(channel_t *chan, int severity); const char * channel_get_actual_remote_descr(channel_t *chan); const char * channel_get_actual_remote_address(channel_t *chan); @@ -458,6 +565,7 @@ unsigned int channel_num_circuits(channel_t *chan); void channel_set_circid_type(channel_t *chan, crypto_pk_t *identity_rcvd, int consider_identity); void channel_timestamp_client(channel_t *chan); +void channel_update_xmit_queue_size(channel_t *chan); const char * channel_listener_describe_transport(channel_listener_t *chan_l); void channel_listener_dump_statistics(channel_listener_t *chan_l, @@ -465,6 +573,10 @@ void channel_listener_dump_statistics(channel_listener_t *chan_l, void channel_listener_dump_transport_statistics(channel_listener_t *chan_l, int severity); +/* Flow control queries */ +uint64_t channel_get_global_queue_estimate(void); +int channel_num_cells_writeable(channel_t *chan); + /* Timestamp queries */ time_t channel_when_created(channel_t *chan); time_t channel_when_last_active(channel_t *chan); diff --git a/src/or/channeltls.c b/src/or/channeltls.c index db044aee56..e194c1c4df 100644 --- a/src/or/channeltls.c +++ b/src/or/channeltls.c @@ -1,4 +1,4 @@ -/* * Copyright (c) 2012-2014, The Tor Project, Inc. */ +/* * Copyright (c) 2012-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -25,6 +25,7 @@ #include "relay.h" #include "router.h" #include "routerlist.h" +#include "scheduler.h" /** How many CELL_PADDING cells have we received, ever? */ uint64_t stats_n_padding_cells_processed = 0; @@ -54,6 +55,7 @@ static void channel_tls_common_init(channel_tls_t *tlschan); static void channel_tls_close_method(channel_t *chan); static const char * channel_tls_describe_transport_method(channel_t *chan); static void channel_tls_free_method(channel_t *chan); +static double channel_tls_get_overhead_estimate_method(channel_t *chan); static int channel_tls_get_remote_addr_method(channel_t *chan, tor_addr_t *addr_out); static int @@ -67,6 +69,8 @@ channel_tls_matches_extend_info_method(channel_t *chan, extend_info_t *extend_info); static int channel_tls_matches_target_method(channel_t *chan, const tor_addr_t *target); +static int channel_tls_num_cells_writeable_method(channel_t *chan); +static size_t channel_tls_num_bytes_queued_method(channel_t *chan); static int channel_tls_write_cell_method(channel_t *chan, cell_t *cell); static int channel_tls_write_packed_cell_method(channel_t *chan, @@ -116,6 +120,7 @@ channel_tls_common_init(channel_tls_t *tlschan) chan->close = channel_tls_close_method; chan->describe_transport = channel_tls_describe_transport_method; chan->free = channel_tls_free_method; + chan->get_overhead_estimate = channel_tls_get_overhead_estimate_method; chan->get_remote_addr = channel_tls_get_remote_addr_method; chan->get_remote_descr = channel_tls_get_remote_descr_method; chan->get_transport_name = channel_tls_get_transport_name_method; @@ -123,6 +128,8 @@ channel_tls_common_init(channel_tls_t *tlschan) chan->is_canonical = channel_tls_is_canonical_method; chan->matches_extend_info = channel_tls_matches_extend_info_method; chan->matches_target = channel_tls_matches_target_method; + chan->num_bytes_queued = channel_tls_num_bytes_queued_method; + chan->num_cells_writeable = channel_tls_num_cells_writeable_method; chan->write_cell = channel_tls_write_cell_method; chan->write_packed_cell = channel_tls_write_packed_cell_method; chan->write_var_cell = channel_tls_write_var_cell_method; @@ -435,6 +442,40 @@ channel_tls_free_method(channel_t *chan) } /** + * Get an estimate of the average TLS overhead for the upper layer + */ + +static double +channel_tls_get_overhead_estimate_method(channel_t *chan) +{ + double overhead = 1.0f; + channel_tls_t *tlschan = BASE_CHAN_TO_TLS(chan); + + tor_assert(tlschan); + tor_assert(tlschan->conn); + + /* Just return 1.0f if we don't have sensible data */ + if (tlschan->conn->bytes_xmitted > 0 && + tlschan->conn->bytes_xmitted_by_tls >= + tlschan->conn->bytes_xmitted) { + overhead = ((double)(tlschan->conn->bytes_xmitted_by_tls)) / + ((double)(tlschan->conn->bytes_xmitted)); + + /* + * Never estimate more than 2.0; otherwise we get silly large estimates + * at the very start of a new TLS connection. + */ + if (overhead > 2.0f) overhead = 2.0f; + } + + log_debug(LD_CHANNEL, + "Estimated overhead ratio for TLS chan " U64_FORMAT " is %f", + U64_PRINTF_ARG(chan->global_identifier), overhead); + + return overhead; +} + +/** * Get the remote address of a channel_tls_t * * This implements the get_remote_addr method for channel_tls_t; copy the @@ -673,6 +714,53 @@ channel_tls_matches_target_method(channel_t *chan, } /** + * Tell the upper layer how many bytes we have queued and not yet + * sent. + */ + +static size_t +channel_tls_num_bytes_queued_method(channel_t *chan) +{ + channel_tls_t *tlschan = BASE_CHAN_TO_TLS(chan); + + tor_assert(tlschan); + tor_assert(tlschan->conn); + + return connection_get_outbuf_len(TO_CONN(tlschan->conn)); +} + +/** + * Tell the upper layer how many cells we can accept to write + * + * This implements the num_cells_writeable method for channel_tls_t; it + * returns an estimate of the number of cells we can accept with + * channel_tls_write_*_cell(). + */ + +static int +channel_tls_num_cells_writeable_method(channel_t *chan) +{ + size_t outbuf_len; + ssize_t n; + channel_tls_t *tlschan = BASE_CHAN_TO_TLS(chan); + size_t cell_network_size; + + tor_assert(tlschan); + tor_assert(tlschan->conn); + + cell_network_size = get_cell_network_size(tlschan->conn->wide_circ_ids); + outbuf_len = connection_get_outbuf_len(TO_CONN(tlschan->conn)); + /* Get the number of cells */ + n = CEIL_DIV(OR_CONN_HIGHWATER - outbuf_len, cell_network_size); + if (n < 0) n = 0; +#if SIZEOF_SIZE_T > SIZEOF_INT + if (n > INT_MAX) n = INT_MAX; +#endif + + return (int)n; +} + +/** * Write a cell to a channel_tls_t * * This implements the write_cell method for channel_tls_t; given a @@ -852,13 +940,13 @@ channel_tls_handle_state_change_on_orconn(channel_tls_t *chan, base_chan = TLS_CHAN_TO_BASE(chan); - /* Make sure the base connection state makes sense - shouldn't be error, - * closed or listening. */ + /* Make sure the base connection state makes sense - shouldn't be error + * or closed. */ - tor_assert(base_chan->state == CHANNEL_STATE_OPENING || - base_chan->state == CHANNEL_STATE_OPEN || - base_chan->state == CHANNEL_STATE_MAINT || - base_chan->state == CHANNEL_STATE_CLOSING); + tor_assert(CHANNEL_IS_OPENING(base_chan) || + CHANNEL_IS_OPEN(base_chan) || + CHANNEL_IS_MAINT(base_chan) || + CHANNEL_IS_CLOSING(base_chan)); /* Did we just go to state open? */ if (state == OR_CONN_STATE_OPEN) { @@ -867,69 +955,21 @@ channel_tls_handle_state_change_on_orconn(channel_tls_t *chan, * CHANNEL_STATE_MAINT on this. */ channel_change_state(base_chan, CHANNEL_STATE_OPEN); + /* We might have just become writeable; check and tell the scheduler */ + if (connection_or_num_cells_writeable(conn) > 0) { + scheduler_channel_wants_writes(base_chan); + } } else { /* * Not open, so from CHANNEL_STATE_OPEN we go to CHANNEL_STATE_MAINT, * otherwise no change. */ - if (base_chan->state == CHANNEL_STATE_OPEN) { + if (CHANNEL_IS_OPEN(base_chan)) { channel_change_state(base_chan, CHANNEL_STATE_MAINT); } } } -/** - * Flush cells from a channel_tls_t - * - * Try to flush up to about num_cells cells, and return how many we flushed. - */ - -ssize_t -channel_tls_flush_some_cells(channel_tls_t *chan, ssize_t num_cells) -{ - ssize_t flushed = 0; - - tor_assert(chan); - - if (flushed >= num_cells) goto done; - - /* - * If channel_tls_t ever buffers anything below the channel_t layer, flush - * that first here. - */ - - flushed += channel_flush_some_cells(TLS_CHAN_TO_BASE(chan), - num_cells - flushed); - - /* - * If channel_tls_t ever buffers anything below the channel_t layer, check - * how much we actually got and push it on down here. - */ - - done: - return flushed; -} - -/** - * Check if a channel_tls_t has anything to flush - * - * Return true if there is any more to flush on this channel (cells in queue - * or active circuits). - */ - -int -channel_tls_more_to_flush(channel_tls_t *chan) -{ - tor_assert(chan); - - /* - * If channel_tls_t ever buffers anything below channel_t, the - * check for that should go here first. - */ - - return channel_more_to_flush(TLS_CHAN_TO_BASE(chan)); -} - #ifdef KEEP_TIMING_STATS /** diff --git a/src/or/channeltls.h b/src/or/channeltls.h index 06be6fa555..507429420b 100644 --- a/src/or/channeltls.h +++ b/src/or/channeltls.h @@ -1,4 +1,4 @@ -/* * Copyright (c) 2012-2014, The Tor Project, Inc. */ +/* * Copyright (c) 2012-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -40,8 +40,6 @@ channel_t * channel_tls_to_base(channel_tls_t *tlschan); channel_tls_t * channel_tls_from_base(channel_t *chan); /* Things for connection_or.c to call back into */ -ssize_t channel_tls_flush_some_cells(channel_tls_t *chan, ssize_t num_cells); -int channel_tls_more_to_flush(channel_tls_t *chan); void channel_tls_handle_cell(cell_t *cell, or_connection_t *conn); void channel_tls_handle_state_change_on_orconn(channel_tls_t *chan, or_connection_t *conn, diff --git a/src/or/circpathbias.c b/src/or/circpathbias.c index a6858a3460..a0115cc6ec 100644 --- a/src/or/circpathbias.c +++ b/src/or/circpathbias.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "or.h" @@ -768,8 +768,8 @@ pathbias_send_usable_probe(circuit_t *circ) /* Can't probe if the channel isn't open */ if (circ->n_chan == NULL || - (circ->n_chan->state != CHANNEL_STATE_OPEN - && circ->n_chan->state != CHANNEL_STATE_MAINT)) { + (!CHANNEL_IS_OPEN(circ->n_chan) + && !CHANNEL_IS_MAINT(circ->n_chan))) { log_info(LD_CIRC, "Skipping pathbias probe for circuit %d: Channel is not open.", ocirc->global_identifier); diff --git a/src/or/circpathbias.h b/src/or/circpathbias.h index bb8846353c..9e973850d5 100644 --- a/src/or/circpathbias.h +++ b/src/or/circpathbias.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/circuitbuild.c b/src/or/circuitbuild.c index 42c4870e87..6d5bbbf16c 100644 --- a/src/or/circuitbuild.c +++ b/src/or/circuitbuild.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -14,6 +14,7 @@ #include "or.h" #include "channel.h" #include "circpathbias.h" +#define CIRCUITBUILD_PRIVATE #include "circuitbuild.h" #include "circuitlist.h" #include "circuitstats.h" @@ -550,9 +551,13 @@ circuit_handle_first_hop(origin_circuit_t *circ) * open and get them to send their create cells forward. * * Status is 1 if connect succeeded, or 0 if connect failed. + * + * Close_origin_circuits is 1 if we should close all the origin circuits + * through this channel, or 0 otherwise. (This happens when we want to retry + * an older guard.) */ void -circuit_n_chan_done(channel_t *chan, int status) +circuit_n_chan_done(channel_t *chan, int status, int close_origin_circuits) { smartlist_t *pending_circs; int err_reason = 0; @@ -590,6 +595,11 @@ circuit_n_chan_done(channel_t *chan, int status) circuit_mark_for_close(circ, END_CIRC_REASON_CHANNEL_CLOSED); continue; } + if (close_origin_circuits && CIRCUIT_IS_ORIGIN(circ)) { + log_info(LD_CIRC,"Channel deprecated for origin circs; closing circ."); + circuit_mark_for_close(circ, END_CIRC_REASON_CHANNEL_CLOSED); + continue; + } log_debug(LD_CIRC, "Found circ, sending create cell."); /* circuit_deliver_create_cell will set n_circ_id and add us to * chan_circuid_circuit_map, so we don't need to call @@ -671,7 +681,7 @@ circuit_deliver_create_cell(circuit_t *circ, const create_cell_t *create_cell, if (CIRCUIT_IS_ORIGIN(circ)) { /* Update began timestamp for circuits starting their first hop */ if (TO_ORIGIN_CIRCUIT(circ)->cpath->state == CPATH_STATE_CLOSED) { - if (circ->n_chan->state != CHANNEL_STATE_OPEN) { + if (!CHANNEL_IS_OPEN(circ->n_chan)) { log_warn(LD_CIRC, "Got first hop for a circuit without an opened channel. " "State: %s.", channel_state_to_string(circ->n_chan->state)); @@ -943,9 +953,9 @@ circuit_send_next_onion_skin(origin_circuit_t *circ) circuit_rep_hist_note_result(circ); circuit_has_opened(circ); /* do other actions as necessary */ - if (!can_complete_circuit && !circ->build_state->onehop_tunnel) { + if (!have_completed_a_circuit() && !circ->build_state->onehop_tunnel) { const or_options_t *options = get_options(); - can_complete_circuit=1; + note_that_we_completed_a_circuit(); /* FFFF Log a count of known routers here */ log_notice(LD_GENERAL, "Tor has successfully opened a circuit. " @@ -1033,7 +1043,8 @@ circuit_note_clock_jumped(int seconds_elapsed) seconds_elapsed >=0 ? "forward" : "backward"); control_event_general_status(LOG_WARN, "CLOCK_JUMPED TIME=%d", seconds_elapsed); - can_complete_circuit=0; /* so it'll log when it works again */ + /* so we log when it works again */ + note_that_we_maybe_cant_complete_circuits(); control_event_client_status(severity, "CIRCUIT_NOT_ESTABLISHED REASON=%s", "CLOCK_JUMPED"); circuit_mark_all_unused_circs(); @@ -1376,8 +1387,10 @@ onionskin_answer(or_circuit_t *circ, log_debug(LD_CIRC,"Finished sending '%s' cell.", circ->is_first_hop ? "created_fast" : "created"); - if (!channel_is_local(circ->p_chan) && - !channel_is_outgoing(circ->p_chan)) { + /* Ignore the local bit when testing - many test networks run on local + * addresses */ + if ((!channel_is_local(circ->p_chan) || get_options()->TestingTorNetwork) + && !channel_is_outgoing(circ->p_chan)) { /* record that we could process create cells from a non-local conn * that we didn't initiate; presumably this means that create cells * can reach us too. */ @@ -1861,7 +1874,7 @@ onion_pick_cpath_exit(origin_circuit_t *circ, extend_info_t *exit) choose_good_exit_server(circ->base_.purpose, state->need_uptime, state->need_capacity, state->is_internal); if (!node) { - log_warn(LD_CIRC,"failed to choose an exit server"); + log_warn(LD_CIRC,"Failed to choose an exit server"); return -1; } exit = extend_info_from_node(node, 0); @@ -1988,7 +2001,8 @@ choose_good_middle_server(uint8_t purpose, tor_assert(CIRCUIT_PURPOSE_MIN_ <= purpose && purpose <= CIRCUIT_PURPOSE_MAX_); - log_debug(LD_CIRC, "Contemplating intermediate hop: random choice."); + log_debug(LD_CIRC, "Contemplating intermediate hop %d: random choice.", + cur_len); excluded = smartlist_new(); if ((r = build_state_get_exit_node(state))) { nodelist_add_node_and_family(excluded, r); @@ -2050,9 +2064,18 @@ choose_good_entry_server(uint8_t purpose, cpath_build_state_t *state) smartlist_add(excluded, (void*)node); }); } - /* and exclude current entry guards and their families, if applicable */ + /* and exclude current entry guards and their families, + * unless we're in a test network, and excluding guards + * would exclude all nodes (i.e. we're in an incredibly small tor network, + * or we're using TestingAuthVoteGuard *). + * This is an incomplete fix, but is no worse than the previous behaviour, + * and only applies to minimal, testing tor networks + * (so it's no less secure) */ /*XXXX025 use the using_as_guard flag to accomplish this.*/ - if (options->UseEntryGuards) { + if (options->UseEntryGuards + && (!options->TestingTorNetwork || + smartlist_len(nodelist_get_list()) > smartlist_len(get_entry_guards()) + )) { SMARTLIST_FOREACH(get_entry_guards(), const entry_guard_t *, entry, { if ((node = node_get_by_id(entry->identity))) { diff --git a/src/or/circuitbuild.h b/src/or/circuitbuild.h index e70cdc5825..c72016d530 100644 --- a/src/or/circuitbuild.h +++ b/src/or/circuitbuild.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -22,7 +22,8 @@ origin_circuit_t *circuit_establish_circuit(uint8_t purpose, extend_info_t *exit, int flags); int circuit_handle_first_hop(origin_circuit_t *circ); -void circuit_n_chan_done(channel_t *chan, int status); +void circuit_n_chan_done(channel_t *chan, int status, + int close_origin_circuits); int inform_testing_reachability(void); int circuit_timeout_want_to_count_circ(origin_circuit_t *circ); int circuit_send_next_onion_skin(origin_circuit_t *circ); diff --git a/src/or/circuitlist.c b/src/or/circuitlist.c index d9da1e7f88..d964e66922 100644 --- a/src/or/circuitlist.c +++ b/src/or/circuitlist.c @@ -1,7 +1,7 @@ /* Copyright 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -302,8 +302,8 @@ channel_note_destroy_pending(channel_t *chan, circid_t id) /** Called to indicate that a DESTROY is no longer pending on <b>chan</b> with * circuit ID <b>id</b> -- typically, because it has been sent. */ -void -channel_note_destroy_not_pending(channel_t *chan, circid_t id) +MOCK_IMPL(void, channel_note_destroy_not_pending, + (channel_t *chan, circid_t id)) { circuit_t *circ = circuit_get_by_circid_channel_even_if_marked(id,chan); if (circ) { @@ -745,6 +745,7 @@ circuit_free(circuit_t *circ) { void *mem; size_t memlen; + int should_free = 1; if (!circ) return; @@ -784,6 +785,8 @@ circuit_free(circuit_t *circ) memlen = sizeof(or_circuit_t); tor_assert(circ->magic == OR_CIRCUIT_MAGIC); + should_free = (ocirc->workqueue_entry == NULL); + crypto_cipher_free(ocirc->p_crypto); crypto_digest_free(ocirc->p_digest); crypto_cipher_free(ocirc->n_crypto); @@ -826,8 +829,18 @@ circuit_free(circuit_t *circ) * "active" checks will be violated. */ cell_queue_clear(&circ->n_chan_cells); - memwipe(mem, 0xAA, memlen); /* poison memory */ - tor_free(mem); + if (should_free) { + memwipe(mem, 0xAA, memlen); /* poison memory */ + tor_free(mem); + } else { + /* If we made it here, this is an or_circuit_t that still has a pending + * cpuworker request which we weren't able to cancel. Instead, set up + * the magic value so that when the reply comes back, we'll know to discard + * the reply and free this structure. + */ + memwipe(mem, 0xAA, memlen); + circ->magic = DEAD_CIRCUIT_MAGIC; + } } /** Deallocate the linked list circ-><b>cpath</b>, and remove the cpath from @@ -1719,36 +1732,40 @@ circuit_mark_for_close_, (circuit_t *circ, int reason, int line, tor_assert(circ->state == CIRCUIT_STATE_OPEN); tor_assert(ocirc->build_state->chosen_exit); tor_assert(ocirc->rend_data); - /* treat this like getting a nack from it */ - log_info(LD_REND, "Failed intro circ %s to %s (awaiting ack). %s", - safe_str_client(ocirc->rend_data->onion_address), - safe_str_client(build_state_get_exit_nickname(ocirc->build_state)), - timed_out ? "Recording timeout." : "Removing from descriptor."); - rend_client_report_intro_point_failure(ocirc->build_state->chosen_exit, - ocirc->rend_data, - timed_out ? - INTRO_POINT_FAILURE_TIMEOUT : - INTRO_POINT_FAILURE_GENERIC); + if (orig_reason != END_CIRC_REASON_IP_NOW_REDUNDANT) { + /* treat this like getting a nack from it */ + log_info(LD_REND, "Failed intro circ %s to %s (awaiting ack). %s", + safe_str_client(ocirc->rend_data->onion_address), + safe_str_client(build_state_get_exit_nickname(ocirc->build_state)), + timed_out ? "Recording timeout." : "Removing from descriptor."); + rend_client_report_intro_point_failure(ocirc->build_state->chosen_exit, + ocirc->rend_data, + timed_out ? + INTRO_POINT_FAILURE_TIMEOUT : + INTRO_POINT_FAILURE_GENERIC); + } } else if (circ->purpose == CIRCUIT_PURPOSE_C_INTRODUCING && reason != END_CIRC_REASON_TIMEOUT) { origin_circuit_t *ocirc = TO_ORIGIN_CIRCUIT(circ); if (ocirc->build_state->chosen_exit && ocirc->rend_data) { - log_info(LD_REND, "Failed intro circ %s to %s " - "(building circuit to intro point). " - "Marking intro point as possibly unreachable.", - safe_str_client(ocirc->rend_data->onion_address), - safe_str_client(build_state_get_exit_nickname(ocirc->build_state))); - rend_client_report_intro_point_failure(ocirc->build_state->chosen_exit, - ocirc->rend_data, - INTRO_POINT_FAILURE_UNREACHABLE); + if (orig_reason != END_CIRC_REASON_IP_NOW_REDUNDANT) { + log_info(LD_REND, "Failed intro circ %s to %s " + "(building circuit to intro point). " + "Marking intro point as possibly unreachable.", + safe_str_client(ocirc->rend_data->onion_address), + safe_str_client(build_state_get_exit_nickname( + ocirc->build_state))); + rend_client_report_intro_point_failure(ocirc->build_state->chosen_exit, + ocirc->rend_data, + INTRO_POINT_FAILURE_UNREACHABLE); + } } } + if (circ->n_chan) { circuit_clear_cell_queue(circ, circ->n_chan); /* Only send destroy if the channel isn't closing anyway */ - if (!(circ->n_chan->state == CHANNEL_STATE_CLOSING || - circ->n_chan->state == CHANNEL_STATE_CLOSED || - circ->n_chan->state == CHANNEL_STATE_ERROR)) { + if (!CHANNEL_CONDEMNED(circ->n_chan)) { channel_send_destroy(circ->n_circ_id, circ->n_chan, reason); } circuitmux_detach_circuit(circ->n_chan->cmux, circ); @@ -1780,9 +1797,7 @@ circuit_mark_for_close_, (circuit_t *circ, int reason, int line, if (or_circ->p_chan) { circuit_clear_cell_queue(circ, or_circ->p_chan); /* Only send destroy if the channel isn't closing anyway */ - if (!(or_circ->p_chan->state == CHANNEL_STATE_CLOSING || - or_circ->p_chan->state == CHANNEL_STATE_CLOSED || - or_circ->p_chan->state == CHANNEL_STATE_ERROR)) { + if (!CHANNEL_CONDEMNED(or_circ->p_chan)) { channel_send_destroy(or_circ->p_circ_id, or_circ->p_chan, reason); } circuitmux_detach_circuit(or_circ->p_chan->cmux, circ); diff --git a/src/or/circuitlist.h b/src/or/circuitlist.h index addaa725d4..4e600da57d 100644 --- a/src/or/circuitlist.h +++ b/src/or/circuitlist.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -72,7 +72,8 @@ void circuit_free_all(void); void circuits_handle_oom(size_t current_allocation); void channel_note_destroy_pending(channel_t *chan, circid_t id); -void channel_note_destroy_not_pending(channel_t *chan, circid_t id); +MOCK_DECL(void, channel_note_destroy_not_pending, + (channel_t *chan, circid_t id)); #ifdef CIRCUITLIST_PRIVATE STATIC void circuit_free(circuit_t *circ); diff --git a/src/or/circuitmux.c b/src/or/circuitmux.c index 663711c6c0..a77bffac90 100644 --- a/src/or/circuitmux.c +++ b/src/or/circuitmux.c @@ -1,4 +1,4 @@ -/* * Copyright (c) 2012-2014, The Tor Project, Inc. */ +/* * Copyright (c) 2012-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -621,8 +621,8 @@ circuitmux_clear_policy(circuitmux_t *cmux) * Return the policy currently installed on a circuitmux_t */ -const circuitmux_policy_t * -circuitmux_get_policy(circuitmux_t *cmux) +MOCK_IMPL(const circuitmux_policy_t *, +circuitmux_get_policy, (circuitmux_t *cmux)) { tor_assert(cmux); @@ -896,8 +896,8 @@ circuitmux_num_cells_for_circuit(circuitmux_t *cmux, circuit_t *circ) * Query total number of available cells on a circuitmux */ -unsigned int -circuitmux_num_cells(circuitmux_t *cmux) +MOCK_IMPL(unsigned int, +circuitmux_num_cells, (circuitmux_t *cmux)) { tor_assert(cmux); @@ -1951,3 +1951,51 @@ circuitmux_count_queued_destroy_cells(const channel_t *chan, return n_destroy_cells; } +/** + * Compare cmuxes to see which is more preferred; return < 0 if + * cmux_1 has higher priority (i.e., cmux_1 < cmux_2 in the scheduler's + * sort order), > 0 if cmux_2 has higher priority, or 0 if they are + * equally preferred. + * + * If the cmuxes have different cmux policies or the policy does not + * support the cmp_cmux method, return 0. + */ + +MOCK_IMPL(int, +circuitmux_compare_muxes, (circuitmux_t *cmux_1, circuitmux_t *cmux_2)) +{ + const circuitmux_policy_t *policy; + + tor_assert(cmux_1); + tor_assert(cmux_2); + + if (cmux_1 == cmux_2) { + /* Equivalent because they're the same cmux */ + return 0; + } + + if (cmux_1->policy && cmux_2->policy) { + if (cmux_1->policy == cmux_2->policy) { + policy = cmux_1->policy; + + if (policy->cmp_cmux) { + /* Okay, we can compare! */ + return policy->cmp_cmux(cmux_1, cmux_1->policy_data, + cmux_2, cmux_2->policy_data); + } else { + /* + * Equivalent because the policy doesn't know how to compare between + * muxes. + */ + return 0; + } + } else { + /* Equivalent because they have different policies */ + return 0; + } + } else { + /* Equivalent because one or both are missing a policy */ + return 0; + } +} + diff --git a/src/or/circuitmux.h b/src/or/circuitmux.h index eade2486a2..837e3961bf 100644 --- a/src/or/circuitmux.h +++ b/src/or/circuitmux.h @@ -1,4 +1,4 @@ -/* * Copyright (c) 2012-2014, The Tor Project, Inc. */ +/* * Copyright (c) 2012-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -57,6 +57,9 @@ struct circuitmux_policy_s { /* Choose a circuit */ circuit_t * (*pick_active_circuit)(circuitmux_t *cmux, circuitmux_policy_data_t *pol_data); + /* Optional: channel comparator for use by the scheduler */ + int (*cmp_cmux)(circuitmux_t *cmux_1, circuitmux_policy_data_t *pol_data_1, + circuitmux_t *cmux_2, circuitmux_policy_data_t *pol_data_2); }; /* @@ -105,7 +108,8 @@ void circuitmux_free(circuitmux_t *cmux); /* Policy control */ void circuitmux_clear_policy(circuitmux_t *cmux); -const circuitmux_policy_t * circuitmux_get_policy(circuitmux_t *cmux); +MOCK_DECL(const circuitmux_policy_t *, + circuitmux_get_policy, (circuitmux_t *cmux)); void circuitmux_set_policy(circuitmux_t *cmux, const circuitmux_policy_t *pol); @@ -117,7 +121,7 @@ int circuitmux_is_circuit_attached(circuitmux_t *cmux, circuit_t *circ); int circuitmux_is_circuit_active(circuitmux_t *cmux, circuit_t *circ); unsigned int circuitmux_num_cells_for_circuit(circuitmux_t *cmux, circuit_t *circ); -unsigned int circuitmux_num_cells(circuitmux_t *cmux); +MOCK_DECL(unsigned int, circuitmux_num_cells, (circuitmux_t *cmux)); unsigned int circuitmux_num_circuits(circuitmux_t *cmux); unsigned int circuitmux_num_active_circuits(circuitmux_t *cmux); @@ -148,5 +152,9 @@ void circuitmux_append_destroy_cell(channel_t *chan, void circuitmux_mark_destroyed_circids_usable(circuitmux_t *cmux, channel_t *chan); +/* Optional interchannel comparisons for scheduling */ +MOCK_DECL(int, circuitmux_compare_muxes, + (circuitmux_t *cmux_1, circuitmux_t *cmux_2)); + #endif /* TOR_CIRCUITMUX_H */ diff --git a/src/or/circuitmux_ewma.c b/src/or/circuitmux_ewma.c index 49d899e5e7..1c0318de06 100644 --- a/src/or/circuitmux_ewma.c +++ b/src/or/circuitmux_ewma.c @@ -1,4 +1,4 @@ -/* * Copyright (c) 2012-2014, The Tor Project, Inc. */ +/* * Copyright (c) 2012-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -187,6 +187,9 @@ ewma_notify_xmit_cells(circuitmux_t *cmux, static circuit_t * ewma_pick_active_circuit(circuitmux_t *cmux, circuitmux_policy_data_t *pol_data); +static int +ewma_cmp_cmux(circuitmux_t *cmux_1, circuitmux_policy_data_t *pol_data_1, + circuitmux_t *cmux_2, circuitmux_policy_data_t *pol_data_2); /*** EWMA global variables ***/ @@ -209,7 +212,8 @@ circuitmux_policy_t ewma_policy = { /*.notify_circ_inactive =*/ ewma_notify_circ_inactive, /*.notify_set_n_cells =*/ NULL, /* EWMA doesn't need this */ /*.notify_xmit_cells =*/ ewma_notify_xmit_cells, - /*.pick_active_circuit =*/ ewma_pick_active_circuit + /*.pick_active_circuit =*/ ewma_pick_active_circuit, + /*.cmp_cmux =*/ ewma_cmp_cmux }; /*** EWMA method implementations using the below EWMA helper functions ***/ @@ -453,6 +457,58 @@ ewma_pick_active_circuit(circuitmux_t *cmux, return circ; } +/** + * Compare two EWMA cmuxes, and return -1, 0 or 1 to indicate which should + * be more preferred - see circuitmux_compare_muxes() of circuitmux.c. + */ + +static int +ewma_cmp_cmux(circuitmux_t *cmux_1, circuitmux_policy_data_t *pol_data_1, + circuitmux_t *cmux_2, circuitmux_policy_data_t *pol_data_2) +{ + ewma_policy_data_t *p1 = NULL, *p2 = NULL; + cell_ewma_t *ce1 = NULL, *ce2 = NULL; + + tor_assert(cmux_1); + tor_assert(pol_data_1); + tor_assert(cmux_2); + tor_assert(pol_data_2); + + p1 = TO_EWMA_POL_DATA(pol_data_1); + p2 = TO_EWMA_POL_DATA(pol_data_1); + + if (p1 != p2) { + /* Get the head cell_ewma_t from each queue */ + if (smartlist_len(p1->active_circuit_pqueue) > 0) { + ce1 = smartlist_get(p1->active_circuit_pqueue, 0); + } + + if (smartlist_len(p2->active_circuit_pqueue) > 0) { + ce2 = smartlist_get(p2->active_circuit_pqueue, 0); + } + + /* Got both of them? */ + if (ce1 != NULL && ce2 != NULL) { + /* Pick whichever one has the better best circuit */ + return compare_cell_ewma_counts(ce1, ce2); + } else { + if (ce1 != NULL ) { + /* We only have a circuit on cmux_1, so prefer it */ + return -1; + } else if (ce2 != NULL) { + /* We only have a circuit on cmux_2, so prefer it */ + return 1; + } else { + /* No circuits at all; no preference */ + return 0; + } + } + } else { + /* We got identical params */ + return 0; + } +} + /** Helper for sorting cell_ewma_t values in their priority queue. */ static int compare_cell_ewma_counts(const void *p1, const void *p2) diff --git a/src/or/circuitmux_ewma.h b/src/or/circuitmux_ewma.h index ce78a8ef0d..3feef834dd 100644 --- a/src/or/circuitmux_ewma.h +++ b/src/or/circuitmux_ewma.h @@ -1,4 +1,4 @@ -/* * Copyright (c) 2012-2014, The Tor Project, Inc. */ +/* * Copyright (c) 2012-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/circuitstats.c b/src/or/circuitstats.c index a136278e58..18cb1c8484 100644 --- a/src/or/circuitstats.c +++ b/src/or/circuitstats.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define CIRCUITSTATS_PRIVATE diff --git a/src/or/circuitstats.h b/src/or/circuitstats.h index 7cef4f7fb1..fe05a24e97 100644 --- a/src/or/circuitstats.h +++ b/src/or/circuitstats.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/circuituse.c b/src/or/circuituse.c index 441a8fcbb5..612b536bad 100644 --- a/src/or/circuituse.c +++ b/src/or/circuituse.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -200,7 +200,7 @@ circuit_is_better(const origin_circuit_t *oa, const origin_circuit_t *ob, return 1; } else { if (a->timestamp_dirty || - timercmp(&a->timestamp_began, &b->timestamp_began, >)) + timercmp(&a->timestamp_began, &b->timestamp_began, OP_GT)) return 1; if (ob->build_state->is_internal) /* XXX023 what the heck is this internal thing doing here. I @@ -514,7 +514,7 @@ circuit_expire_building(void) if (TO_ORIGIN_CIRCUIT(victim)->hs_circ_has_timed_out) cutoff = hs_extremely_old_cutoff; - if (timercmp(&victim->timestamp_began, &cutoff, >)) + if (timercmp(&victim->timestamp_began, &cutoff, OP_GT)) continue; /* it's still young, leave it alone */ /* We need to double-check the opened state here because @@ -524,7 +524,7 @@ circuit_expire_building(void) * aren't either. */ if (!any_opened_circs && victim->state != CIRCUIT_STATE_OPEN) { /* It's still young enough that we wouldn't close it, right? */ - if (timercmp(&victim->timestamp_began, &close_cutoff, >)) { + if (timercmp(&victim->timestamp_began, &close_cutoff, OP_GT)) { if (!TO_ORIGIN_CIRCUIT(victim)->relaxed_timeout) { int first_hop_succeeded = TO_ORIGIN_CIRCUIT(victim)->cpath->state == CPATH_STATE_OPEN; @@ -672,7 +672,7 @@ circuit_expire_building(void) * it off at, we probably had a suspend event along this codepath, * and we should discard the value. */ - if (timercmp(&victim->timestamp_began, &extremely_old_cutoff, <)) { + if (timercmp(&victim->timestamp_began, &extremely_old_cutoff, OP_LT)) { log_notice(LD_CIRC, "Extremely large value for circuit build timeout: %lds. " "Assuming clock jump. Purpose %d (%s)", @@ -1024,9 +1024,11 @@ circuit_predict_and_launch_new(void) /* Second, see if we need any more exit circuits. */ /* check if we know of a port that's been requested recently - * and no circuit is currently available that can handle it. */ + * and no circuit is currently available that can handle it. + * Exits (obviously) require an exit circuit. */ if (!circuit_all_predicted_ports_handled(now, &port_needs_uptime, - &port_needs_capacity)) { + &port_needs_capacity) + && router_have_consensus_path() == CONSENSUS_PATH_EXIT) { if (port_needs_uptime) flags |= CIRCLAUNCH_NEED_UPTIME; if (port_needs_capacity) @@ -1038,8 +1040,10 @@ circuit_predict_and_launch_new(void) return; } - /* Third, see if we need any more hidden service (server) circuits. */ - if (num_rend_services() && num_uptime_internal < 3) { + /* Third, see if we need any more hidden service (server) circuits. + * HS servers only need an internal circuit. */ + if (num_rend_services() && num_uptime_internal < 3 + && router_have_consensus_path() != CONSENSUS_PATH_UNKNOWN) { flags = (CIRCLAUNCH_NEED_CAPACITY | CIRCLAUNCH_NEED_UPTIME | CIRCLAUNCH_IS_INTERNAL); log_info(LD_CIRC, @@ -1050,11 +1054,13 @@ circuit_predict_and_launch_new(void) return; } - /* Fourth, see if we need any more hidden service (client) circuits. */ + /* Fourth, see if we need any more hidden service (client) circuits. + * HS clients only need an internal circuit. */ if (rep_hist_get_predicted_internal(now, &hidserv_needs_uptime, &hidserv_needs_capacity) && ((num_uptime_internal<2 && hidserv_needs_uptime) || - num_internal<2)) { + num_internal<2) + && router_have_consensus_path() != CONSENSUS_PATH_UNKNOWN) { if (hidserv_needs_uptime) flags |= CIRCLAUNCH_NEED_UPTIME; if (hidserv_needs_capacity) @@ -1071,15 +1077,23 @@ circuit_predict_and_launch_new(void) /* Finally, check to see if we still need more circuits to learn * a good build timeout. But if we're close to our max number we * want, don't do another -- we want to leave a few slots open so - * we can still build circuits preemptively as needed. */ - if (num < MAX_UNUSED_OPEN_CIRCUITS-2 && - ! circuit_build_times_disabled() && - circuit_build_times_needs_circuits_now(get_circuit_build_times())) { - flags = CIRCLAUNCH_NEED_CAPACITY; - log_info(LD_CIRC, - "Have %d clean circs need another buildtime test circ.", num); - circuit_launch(CIRCUIT_PURPOSE_C_GENERAL, flags); - return; + * we can still build circuits preemptively as needed. + * XXXX make the assumption that build timeout streams should be + * created whenever we can build internal circuits. */ + if (router_have_consensus_path() != CONSENSUS_PATH_UNKNOWN) { + if (num < MAX_UNUSED_OPEN_CIRCUITS-2 && + ! circuit_build_times_disabled() && + circuit_build_times_needs_circuits_now(get_circuit_build_times())) { + flags = CIRCLAUNCH_NEED_CAPACITY; + /* if there are no exits in the consensus, make timeout + * circuits internal */ + if (router_have_consensus_path() == CONSENSUS_PATH_INTERNAL) + flags |= CIRCLAUNCH_IS_INTERNAL; + log_info(LD_CIRC, + "Have %d clean circs need another buildtime test circ.", num); + circuit_launch(CIRCUIT_PURPOSE_C_GENERAL, flags); + return; + } } } @@ -1096,11 +1110,17 @@ circuit_build_needed_circs(time_t now) { const or_options_t *options = get_options(); - /* launch a new circ for any pending streams that need one */ - connection_ap_attach_pending(); + /* launch a new circ for any pending streams that need one + * XXXX make the assumption that (some) AP streams (i.e. HS clients) + * don't require an exit circuit, review in #13814. + * This allows HSs to function in a consensus without exits. */ + if (router_have_consensus_path() != CONSENSUS_PATH_UNKNOWN) + connection_ap_attach_pending(); - /* make sure any hidden services have enough intro points */ - rend_services_introduce(); + /* make sure any hidden services have enough intro points + * HS intro point streams only require an internal circuit */ + if (router_have_consensus_path() != CONSENSUS_PATH_UNKNOWN) + rend_services_introduce(); circuit_expire_old_circs_as_needed(now); @@ -1255,7 +1275,7 @@ circuit_expire_old_circuits_clientside(void) if (circ->purpose != CIRCUIT_PURPOSE_PATH_BIAS_TESTING) circuit_mark_for_close(circ, END_CIRC_REASON_FINISHED); } else if (!circ->timestamp_dirty && circ->state == CIRCUIT_STATE_OPEN) { - if (timercmp(&circ->timestamp_began, &cutoff, <)) { + if (timercmp(&circ->timestamp_began, &cutoff, OP_LT)) { if (circ->purpose == CIRCUIT_PURPOSE_C_GENERAL || circ->purpose == CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT || circ->purpose == CIRCUIT_PURPOSE_S_ESTABLISH_INTRO || @@ -1632,6 +1652,16 @@ circuit_launch(uint8_t purpose, int flags) return circuit_launch_by_extend_info(purpose, NULL, flags); } +/** DOCDOC */ +static int +have_enough_path_info(int need_exit) +{ + if (need_exit) + return router_have_consensus_path() == CONSENSUS_PATH_EXIT; + else + return router_have_consensus_path() != CONSENSUS_PATH_UNKNOWN; +} + /** Launch a new circuit with purpose <b>purpose</b> and exit node * <b>extend_info</b> (or NULL to select a random exit node). If flags * contains CIRCLAUNCH_NEED_UPTIME, choose among routers with high uptime. If @@ -1646,10 +1676,14 @@ circuit_launch_by_extend_info(uint8_t purpose, { origin_circuit_t *circ; int onehop_tunnel = (flags & CIRCLAUNCH_ONEHOP_TUNNEL) != 0; - - if (!onehop_tunnel && !router_have_minimum_dir_info()) { - log_debug(LD_CIRC,"Haven't fetched enough directory info yet; canceling " - "circuit launch."); + int have_path = have_enough_path_info(! (flags & CIRCLAUNCH_IS_INTERNAL) ); + + if (!onehop_tunnel && (!router_have_minimum_dir_info() || !have_path)) { + log_debug(LD_CIRC,"Haven't %s yet; canceling " + "circuit launch.", + !router_have_minimum_dir_info() ? + "fetched enough directory info" : + "received a consensus with exits"); return NULL; } @@ -1806,7 +1840,9 @@ circuit_get_open_circ_or_launch(entry_connection_t *conn, return 1; /* we're happy */ } - if (!want_onehop && !router_have_minimum_dir_info()) { + int have_path = have_enough_path_info(!need_internal); + + if (!want_onehop && (!router_have_minimum_dir_info() || !have_path)) { if (!connection_get_by_type(CONN_TYPE_DIR)) { int severity = LOG_NOTICE; /* FFFF if this is a tunneled directory fetch, don't yell @@ -1814,14 +1850,20 @@ circuit_get_open_circ_or_launch(entry_connection_t *conn, if (entry_list_is_constrained(options) && entries_known_but_down(options)) { log_fn(severity, LD_APP|LD_DIR, - "Application request when we haven't used client functionality " - "lately. Optimistically trying known %s again.", + "Application request when we haven't %s. " + "Optimistically trying known %s again.", + !router_have_minimum_dir_info() ? + "used client functionality lately" : + "received a consensus with exits", options->UseBridges ? "bridges" : "entrynodes"); entries_retry_all(options); } else if (!options->UseBridges || any_bridge_descriptors_known()) { log_fn(severity, LD_APP|LD_DIR, - "Application request when we haven't used client functionality " - "lately. Optimistically trying directory fetches again."); + "Application request when we haven't %s. " + "Optimistically trying directory fetches again.", + !router_have_minimum_dir_info() ? + "used client functionality lately" : + "received a consensus with exits"); routerlist_retry_directory_downloads(time(NULL)); } } @@ -2012,7 +2054,7 @@ circuit_get_open_circ_or_launch(entry_connection_t *conn, circ->rend_data = rend_data_dup(ENTRY_TO_EDGE_CONN(conn)->rend_data); if (circ->base_.purpose == CIRCUIT_PURPOSE_C_ESTABLISH_REND && circ->base_.state == CIRCUIT_STATE_OPEN) - rend_client_rendcirc_has_opened(circ); + circuit_has_opened(circ); } } } /* endif (!circ) */ @@ -2324,7 +2366,7 @@ connection_ap_handshake_attach_circuit(entry_connection_t *conn) tor_assert(rendcirc); /* one is already established, attach */ log_info(LD_REND, - "rend joined circ %d already here. attaching. " + "rend joined circ %u already here. attaching. " "(stream %d sec old)", (unsigned)rendcirc->base_.n_circ_id, conn_age); /* Mark rendezvous circuits as 'newly dirty' every time you use diff --git a/src/or/circuituse.h b/src/or/circuituse.h index ce044d30dc..a59f478ac8 100644 --- a/src/or/circuituse.h +++ b/src/or/circuituse.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/command.c b/src/or/command.c index 268c495371..c4a0f9baeb 100644 --- a/src/or/command.c +++ b/src/or/command.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -310,7 +310,7 @@ command_process_create_cell(cell_t *cell, channel_t *chan) /* hand it off to the cpuworkers, and then return. */ if (connection_or_digest_is_known_relay(chan->identity_digest)) rep_hist_note_circuit_handshake_requested(create_cell->handshake_type); - if (assign_onionskin_to_cpuworker(NULL, circ, create_cell) < 0) { + if (assign_onionskin_to_cpuworker(circ, create_cell) < 0) { log_debug(LD_GENERAL,"Failed to hand off onionskin. Closing."); circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_RESOURCELIMIT); return; @@ -438,6 +438,7 @@ command_process_created_cell(cell_t *cell, channel_t *chan) static void command_process_relay_cell(cell_t *cell, channel_t *chan) { + const or_options_t *options = get_options(); circuit_t *circ; int reason, direction; @@ -511,6 +512,14 @@ command_process_relay_cell(cell_t *cell, channel_t *chan) direction==CELL_DIRECTION_OUT?"forward":"backward"); circuit_mark_for_close(circ, -reason); } + + /* If this is a cell in an RP circuit, count it as part of the + hidden service stats */ + if (options->HiddenServiceStatistics && + !CIRCUIT_IS_ORIGIN(circ) && + TO_OR_CIRCUIT(circ)->circuit_carries_hs_traffic_stats) { + rep_hist_seen_new_rp_cell(); + } } /** Process a 'destroy' <b>cell</b> that just arrived from diff --git a/src/or/command.h b/src/or/command.h index 509b4a0e9f..bea96261bb 100644 --- a/src/or/command.h +++ b/src/or/command.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/config.c b/src/or/config.c index ca56b6dcd1..568baec703 100644 --- a/src/or/config.c +++ b/src/or/config.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -11,6 +11,7 @@ #define CONFIG_PRIVATE #include "or.h" +#include "compat.h" #include "addressmap.h" #include "channel.h" #include "circuitbuild.h" @@ -43,6 +44,7 @@ #include "util.h" #include "routerlist.h" #include "routerset.h" +#include "scheduler.h" #include "statefile.h" #include "transports.h" #include "ext_orport.h" @@ -53,6 +55,16 @@ #include "procmon.h" +#ifdef HAVE_SYSTEMD +# if defined(__COVERITY__) && !defined(__INCLUDE_LEVEL__) +/* Systemd's use of gcc's __INCLUDE_LEVEL__ extension macro appears to confuse + * Coverity. Here's a kludge to unconfuse it. + */ +# define __INCLUDE_LEVEL__ 2 +# endif +#include <systemd/sd-daemon.h> +#endif + /* From main.c */ extern int quiet_level; @@ -63,7 +75,6 @@ static config_abbrev_t option_abbrevs_[] = { PLURAL(AuthDirBadExitCC), PLURAL(AuthDirInvalidCC), PLURAL(AuthDirRejectCC), - PLURAL(ExitNode), PLURAL(EntryNode), PLURAL(ExcludeNode), PLURAL(FirewallPort), @@ -189,6 +200,8 @@ static config_var_t option_vars_[] = { V(ControlPortWriteToFile, FILENAME, NULL), V(ControlSocket, LINELIST, NULL), V(ControlSocketsGroupWritable, BOOL, "0"), + V(SocksSocket, LINELIST, NULL), + V(SocksSocketsGroupWritable, BOOL, "0"), V(CookieAuthentication, BOOL, "0"), V(CookieAuthFileGroupReadable, BOOL, "0"), V(CookieAuthFile, STRING, NULL), @@ -227,6 +240,7 @@ static config_var_t option_vars_[] = { V(ExitPolicyRejectPrivate, BOOL, "1"), V(ExitPortStatistics, BOOL, "0"), V(ExtendAllowPrivateAddresses, BOOL, "0"), + V(ExitRelay, AUTOBOOL, "auto"), VPORT(ExtORPort, LINELIST, NULL), V(ExtORPortCookieAuthFile, STRING, NULL), V(ExtORPortCookieAuthFileGroupReadable, BOOL, "0"), @@ -267,6 +281,8 @@ static config_var_t option_vars_[] = { VAR("HiddenServicePort", LINELIST_S, RendConfigLines, NULL), VAR("HiddenServiceVersion",LINELIST_S, RendConfigLines, NULL), VAR("HiddenServiceAuthorizeClient",LINELIST_S,RendConfigLines, NULL), + VAR("HiddenServiceAllowUnknownPorts",LINELIST_S, RendConfigLines, NULL), + V(HiddenServiceStatistics, BOOL, "0"), V(HidServAuth, LINELIST, NULL), V(CloseHSClientCircuitsImmediatelyOnTimeout, BOOL, "0"), V(CloseHSServiceRendCircuitsImmediatelyOnTimeout, BOOL, "0"), @@ -368,6 +384,9 @@ static config_var_t option_vars_[] = { V(ServerDNSSearchDomains, BOOL, "0"), V(ServerDNSTestAddresses, CSV, "www.google.com,www.mit.edu,www.yahoo.com,www.slashdot.org"), + V(SchedulerLowWaterMark__, MEMUNIT, "100 MB"), + V(SchedulerHighWaterMark__, MEMUNIT, "101 MB"), + V(SchedulerMaxFlushCells__, UINT, "1000"), V(ShutdownWaitLength, INTERVAL, "30 seconds"), V(SocksListenAddress, LINELIST, NULL), V(SocksPolicy, LINELIST, NULL), @@ -377,7 +396,7 @@ static config_var_t option_vars_[] = { OBSOLETE("StrictEntryNodes"), OBSOLETE("StrictExitNodes"), V(StrictNodes, BOOL, "0"), - V(Support022HiddenServices, AUTOBOOL, "auto"), + OBSOLETE("Support022HiddenServices"), V(TestSocks, BOOL, "0"), V(TokenBucketRefillInterval, MSEC_INTERVAL, "100 msec"), V(Tor2webMode, BOOL, "0"), @@ -421,7 +440,7 @@ static config_var_t option_vars_[] = { VAR("__HashedControlSessionPassword", LINELIST, HashedControlSessionPassword, NULL), VAR("__OwningControllerProcess",STRING,OwningControllerProcess, NULL), - V(MinUptimeHidServDirectoryV2, INTERVAL, "25 hours"), + V(MinUptimeHidServDirectoryV2, INTERVAL, "96 hours"), V(VoteOnHidServDirectoriesV2, BOOL, "1"), V(TestingServerDownloadSchedule, CSV_INTERVAL, "0, 0, 0, 60, 60, 120, " "300, 900, 2147483647"), @@ -442,6 +461,7 @@ static config_var_t option_vars_[] = { V(TestingCertMaxDownloadTries, UINT, "8"), V(TestingDirAuthVoteExit, ROUTERSET, NULL), V(TestingDirAuthVoteGuard, ROUTERSET, NULL), + V(TestingDirAuthVoteHSDir, ROUTERSET, NULL), VAR("___UsingTestNetworkDefaults", BOOL, UsingTestNetworkDefaults_, "0"), { NULL, CONFIG_TYPE_OBSOLETE, 0, NULL } @@ -464,7 +484,7 @@ static const config_var_t testing_tor_network_defaults[] = { V(V3AuthVotingInterval, INTERVAL, "5 minutes"), V(V3AuthVoteDelay, INTERVAL, "20 seconds"), V(V3AuthDistDelay, INTERVAL, "20 seconds"), - V(TestingV3AuthInitialVotingInterval, INTERVAL, "5 minutes"), + V(TestingV3AuthInitialVotingInterval, INTERVAL, "150 seconds"), V(TestingV3AuthInitialVoteDelay, INTERVAL, "20 seconds"), V(TestingV3AuthInitialDistDelay, INTERVAL, "20 seconds"), V(TestingV3AuthVotingStartOffset, INTERVAL, "0"), @@ -490,6 +510,7 @@ static const config_var_t testing_tor_network_defaults[] = { V(TestingEnableCellStatsEvent, BOOL, "1"), V(TestingEnableTbEmptyEvent, BOOL, "1"), VAR("___UsingTestNetworkDefaults", BOOL, UsingTestNetworkDefaults_, "1"), + V(RendPostPeriod, INTERVAL, "2 minutes"), { NULL, CONFIG_TYPE_OBSOLETE, 0, NULL } }; @@ -824,22 +845,22 @@ add_default_trusted_dir_authorities(dirinfo_type_t type) "moria1 orport=9101 " "v3ident=D586D18309DED4CD6D57C18FDB97EFA96D330566 " "128.31.0.39:9131 9695 DFC3 5FFE B861 329B 9F1A B04C 4639 7020 CE31", - "tor26 orport=443 v3ident=14C131DFC5C6F93646BE72FA1401C02A8DF2E8B4 " + "tor26 orport=443 " + "v3ident=14C131DFC5C6F93646BE72FA1401C02A8DF2E8B4 " "86.59.21.38:80 847B 1F85 0344 D787 6491 A548 92F9 0493 4E4E B85D", - "dizum orport=443 v3ident=E8A9C45EDE6D711294FADF8E7951F4DE6CA56B58 " + "dizum orport=443 " + "v3ident=E8A9C45EDE6D711294FADF8E7951F4DE6CA56B58 " "194.109.206.212:80 7EA6 EAD6 FD83 083C 538F 4403 8BBF A077 587D D755", - "Tonga orport=443 bridge 82.94.251.203:80 " - "4A0C CD2D DC79 9508 3D73 F5D6 6710 0C8A 5831 F16D", - "turtles orport=9090 " - "v3ident=27B6B5996C426270A5C95488AA5BCEB6BCC86956 " - "76.73.17.194:9030 F397 038A DC51 3361 35E7 B80B D99C A384 4360 292B", + "Tonga orport=443 bridge " + "82.94.251.203:80 4A0C CD2D DC79 9508 3D73 F5D6 6710 0C8A 5831 F16D", "gabelmoo orport=443 " "v3ident=ED03BB616EB2F60BEC80151114BB25CEF515B226 " "131.188.40.189:80 F204 4413 DAC2 E02E 3D6B CF47 35A1 9BCA 1DE9 7281", "dannenberg orport=443 " "v3ident=585769C78764D58426B8B52B6651A5A71137189A " "193.23.244.244:80 7BE6 83E6 5D48 1413 21C5 ED92 F075 C553 64AC 7123", - "urras orport=80 v3ident=80550987E1D626E3EBA5E5E75A458DE0626D088C " + "urras orport=80 " + "v3ident=80550987E1D626E3EBA5E5E75A458DE0626D088C " "208.83.223.34:443 0AD3 FA88 4D18 F89E EA2D 89C0 1937 9E0E 7FD9 4417", "maatuska orport=80 " "v3ident=49015F787433103580E3B66A1707A00E60F2D15B " @@ -847,6 +868,9 @@ add_default_trusted_dir_authorities(dirinfo_type_t type) "Faravahar orport=443 " "v3ident=EFCBE720AB3A82B99F9E953CD5BF50F7EEFC7B97 " "154.35.32.5:80 CF6D 0AAF B385 BE71 B8E1 11FC 5CFF 4B47 9237 33BC", + "longclaw orport=443 " + "v3ident=23D15D965BC35114467363C165C4F724B64B4F66 " + "199.254.238.52:80 74A9 1064 6BCE EFBC D2E8 74FC 1DC9 9743 0F96 8145", NULL }; for (i=0; authorities[i]; i++) { @@ -1007,6 +1031,11 @@ options_act_reversible(const or_options_t *old_options, char **msg) start_daemon(); } +#ifdef HAVE_SYSTEMD + /* Our PID may have changed, inform supervisor */ + sd_notifyf(0, "MAINPID=%ld\n", (long int)getpid()); +#endif + #ifndef HAVE_SYS_UN_H if (options->ControlSocket || options->ControlSocketsGroupWritable) { *msg = tor_strdup("Unix domain sockets (ControlSocket) not supported " @@ -1021,6 +1050,20 @@ options_act_reversible(const or_options_t *old_options, char **msg) } #endif +#ifndef HAVE_SYS_UN_H + if (options->SocksSocket || options->SocksSocketsGroupWritable) { + *msg = tor_strdup("Unix domain sockets (SocksSocket) not supported " + "on this OS/with this build."); + goto rollback; + } +#else + if (options->SocksSocketsGroupWritable && !options->SocksSocket) { + *msg = tor_strdup("Setting SocksSocketGroupWritable without setting" + "a SocksSocket makes no sense."); + goto rollback; + } +#endif + if (running_tor) { int n_ports=0; /* We need to set the connection limit before we can open the listeners. */ @@ -1042,6 +1085,14 @@ options_act_reversible(const or_options_t *old_options, char **msg) if (running_tor && !libevent_initialized) { init_libevent(options); libevent_initialized = 1; + + /* + * Initialize the scheduler - this has to come after + * options_init_from_torrc() sets up libevent - why yes, that seems + * completely sensible to hide the libevent setup in the option parsing + * code! It also needs to happen before init_keys(), so it needs to + * happen here too. How yucky. */ + scheduler_init(); } /* Adjust the port configuration so we can launch listeners. */ @@ -1071,6 +1122,8 @@ options_act_reversible(const or_options_t *old_options, char **msg) "non-control network connections. Shutting down all existing " "connections."); connection_mark_all_noncontrol_connections(); + /* We can't complete circuits until the network is re-enabled. */ + note_that_we_maybe_cant_complete_circuits(); } } @@ -1521,6 +1574,12 @@ options_act(const or_options_t *old_options) return -1; } + /* Set up scheduler thresholds */ + scheduler_set_watermarks((uint32_t)options->SchedulerLowWaterMark__, + (uint32_t)options->SchedulerHighWaterMark__, + (options->SchedulerMaxFlushCells__ > 0) ? + options->SchedulerMaxFlushCells__ : 1000); + /* Set up accounting */ if (accounting_parse_options(options, 0)<0) { log_warn(LD_CONFIG,"Error in accounting options"); @@ -1668,10 +1727,10 @@ options_act(const or_options_t *old_options) if (server_mode(options) && !server_mode(old_options)) { ip_address_changed(0); - if (can_complete_circuit || !any_predicted_circuits(time(NULL))) + if (have_completed_a_circuit() || !any_predicted_circuits(time(NULL))) inform_testing_reachability(); } - cpuworkers_rotate(); + cpuworkers_rotate_keyinfo(); if (dns_reset()) return -1; } else { @@ -1691,6 +1750,7 @@ options_act(const or_options_t *old_options) if (options->CellStatistics || options->DirReqStatistics || options->EntryStatistics || options->ExitPortStatistics || options->ConnDirectionStatistics || + options->HiddenServiceStatistics || options->BridgeAuthoritativeDir) { time_t now = time(NULL); int print_notice = 0; @@ -1699,6 +1759,7 @@ options_act(const or_options_t *old_options) if (!public_server_mode(options)) { options->CellStatistics = 0; options->EntryStatistics = 0; + options->HiddenServiceStatistics = 0; options->ExitPortStatistics = 0; } @@ -1744,6 +1805,11 @@ options_act(const or_options_t *old_options) options->ConnDirectionStatistics) { rep_hist_conn_stats_init(now); } + if ((!old_options || !old_options->HiddenServiceStatistics) && + options->HiddenServiceStatistics) { + log_info(LD_CONFIG, "Configured to measure hidden service statistics."); + rep_hist_hs_stats_init(now); + } if ((!old_options || !old_options->BridgeAuthoritativeDir) && options->BridgeAuthoritativeDir) { rep_hist_desc_stats_init(now); @@ -1755,6 +1821,8 @@ options_act(const or_options_t *old_options) "data directory in 24 hours from now."); } + /* If we used to have statistics enabled but we just disabled them, + stop gathering them. */ if (old_options && old_options->CellStatistics && !options->CellStatistics) rep_hist_buffer_stats_term(); @@ -1764,6 +1832,9 @@ options_act(const or_options_t *old_options) if (old_options && old_options->EntryStatistics && !options->EntryStatistics) geoip_entry_stats_term(); + if (old_options && old_options->HiddenServiceStatistics && + !options->HiddenServiceStatistics) + rep_hist_hs_stats_term(); if (old_options && old_options->ExitPortStatistics && !options->ExitPortStatistics) rep_hist_exit_stats_term(); @@ -1796,7 +1867,7 @@ options_act(const or_options_t *old_options) directory_fetches_dir_info_early(old_options)) || !bool_eq(directory_fetches_dir_info_later(options), directory_fetches_dir_info_later(old_options))) { - /* Make sure update_router_have_min_dir_info gets called. */ + /* Make sure update_router_have_minimum_dir_info() gets called. */ router_dir_info_changed(); /* We might need to download a new consensus status later or sooner than * we had expected. */ @@ -2010,7 +2081,7 @@ print_usage(void) printf( "Copyright (c) 2001-2004, Roger Dingledine\n" "Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson\n" -"Copyright (c) 2007-2014, The Tor Project, Inc.\n\n" +"Copyright (c) 2007-2015, The Tor Project, Inc.\n\n" "tor -f <torrc> [args]\n" "See man page for options, or https://www.torproject.org/ for " "documentation.\n"); @@ -2050,7 +2121,33 @@ reset_last_resolved_addr(void) } /** - * Use <b>options-\>Address</b> to guess our public IP address. + * Attempt getting our non-local (as judged by tor_addr_is_internal() + * function) IP address using following techniques, listed in + * order from best (most desirable, try first) to worst (least + * desirable, try if everything else fails). + * + * First, attempt using <b>options-\>Address</b> to get our + * non-local IP address. + * + * If <b>options-\>Address</b> represents a non-local IP address, + * consider it ours. + * + * If <b>options-\>Address</b> is a DNS name that resolves to + * a non-local IP address, consider this IP address ours. + * + * If <b>options-\>Address</b> is NULL, fall back to getting local + * hostname and using it in above-described ways to try and + * get our IP address. + * + * In case local hostname cannot be resolved to a non-local IP + * address, try getting an IP address of network interface + * in hopes it will be non-local one. + * + * Fail if one or more of the following is true: + * - DNS name in <b>options-\>Address</b> cannot be resolved. + * - <b>options-\>Address</b> is a local host address. + * - Attempt to getting local hostname fails. + * - Attempt to getting network interface address fails. * * Return 0 if all is well, or -1 if we can't find a suitable * public IP address. @@ -2059,6 +2156,11 @@ reset_last_resolved_addr(void) * - Put our public IP address (in host order) into *<b>addr_out</b>. * - If <b>method_out</b> is non-NULL, set *<b>method_out</b> to a static * string describing how we arrived at our answer. + * - "CONFIGURED" - parsed from IP address string in + * <b>options-\>Address</b> + * - "RESOLVED" - resolved from DNS name in <b>options-\>Address</b> + * - "GETHOSTNAME" - resolved from a local hostname. + * - "INTERFACE" - retrieved from a network interface. * - If <b>hostname_out</b> is non-NULL, and we resolved a hostname to * get our address, set *<b>hostname_out</b> to a newly allocated string * holding that hostname. (If we didn't get our address by resolving a @@ -2097,7 +2199,7 @@ resolve_my_address(int warn_severity, const or_options_t *options, explicit_ip = 0; /* it's implicit */ explicit_hostname = 0; /* it's implicit */ - if (gethostname(hostname, sizeof(hostname)) < 0) { + if (tor_gethostname(hostname, sizeof(hostname)) < 0) { log_fn(warn_severity, LD_NET,"Error obtaining local hostname"); return -1; } @@ -2264,8 +2366,8 @@ resolve_my_address(int warn_severity, const or_options_t *options, /** Return true iff <b>addr</b> is judged to be on the same network as us, or * on a private network. */ -int -is_local_addr(const tor_addr_t *addr) +MOCK_IMPL(int, +is_local_addr, (const tor_addr_t *addr)) { if (tor_addr_is_internal(addr, 0)) return 1; @@ -2424,6 +2526,7 @@ compute_publishserverdescriptor(or_options_t *options) /** Lowest allowable value for RendPostPeriod; if this is too low, hidden * services can overload the directory system. */ #define MIN_REND_POST_PERIOD (10*60) +#define MIN_REND_POST_PERIOD_TESTING (5) /** Higest allowable value for PredictedPortsRelevanceTime; if this is * too high, our selection of exits will decrease for an extended @@ -2548,11 +2651,6 @@ options_validate(or_options_t *old_options, or_options_t *options, REJECT("Failed to resolve/guess local address. See logs for details."); } -#ifndef _WIN32 - if (options->RunAsDaemon && torrc_fname && path_is_relative(torrc_fname)) - REJECT("Can't use a relative path to torrc when RunAsDaemon is set."); -#endif - if (server_mode(options) && options->RendConfigLines) log_warn(LD_CONFIG, "Tor is currently configured as a relay and a hidden service. " @@ -2574,20 +2672,24 @@ options_validate(or_options_t *old_options, or_options_t *options, if (!strcasecmp(options->TransProxyType, "default")) { options->TransProxyType_parsed = TPT_DEFAULT; } else if (!strcasecmp(options->TransProxyType, "pf-divert")) { -#ifndef __OpenBSD__ - REJECT("pf-divert is a OpenBSD-specific feature."); +#if !defined(__OpenBSD__) && !defined( DARWIN ) + /* Later versions of OS X have pf */ + REJECT("pf-divert is a OpenBSD-specific " + "and OS X/Darwin-specific feature."); #else options->TransProxyType_parsed = TPT_PF_DIVERT; #endif } else if (!strcasecmp(options->TransProxyType, "tproxy")) { -#ifndef __linux__ +#if !defined(__linux__) REJECT("TPROXY is a Linux-specific feature."); #else options->TransProxyType_parsed = TPT_TPROXY; #endif } else if (!strcasecmp(options->TransProxyType, "ipfw")) { -#ifndef __FreeBSD__ - REJECT("ipfw is a FreeBSD-specific feature."); +#if !defined(__FreeBSD__) && !defined( DARWIN ) + /* Earlier versions of OS X have ipfw */ + REJECT("ipfw is a FreeBSD-specific" + "and OS X/Darwin-specific feature."); #else options->TransProxyType_parsed = TPT_IPFW; #endif @@ -2618,6 +2720,17 @@ options_validate(or_options_t *old_options, or_options_t *options, routerset_union(options->ExcludeExitNodesUnion_,options->ExcludeNodes); } + if (options->SchedulerLowWaterMark__ == 0 || + options->SchedulerLowWaterMark__ > UINT32_MAX) { + log_warn(LD_GENERAL, "Bad SchedulerLowWaterMark__ option"); + return -1; + } else if (options->SchedulerHighWaterMark__ <= + options->SchedulerLowWaterMark__ || + options->SchedulerHighWaterMark__ > UINT32_MAX) { + log_warn(LD_GENERAL, "Bad SchedulerHighWaterMark option"); + return -1; + } + if (options->NodeFamilies) { options->NodeFamilySets = smartlist_new(); for (cl = options->NodeFamilies; cl; cl = cl->next) { @@ -2828,6 +2941,7 @@ options_validate(or_options_t *old_options, or_options_t *options, options->MaxMemInQueues = compute_real_max_mem_in_queues(options->MaxMemInQueues_raw, server_mode(options)); + options->MaxMemInQueues_low_threshold = (options->MaxMemInQueues / 4) * 3; options->AllowInvalid_ = 0; @@ -2892,10 +3006,13 @@ options_validate(or_options_t *old_options, or_options_t *options, options->MinUptimeHidServDirectoryV2 = 0; } - if (options->RendPostPeriod < MIN_REND_POST_PERIOD) { + const int min_rendpostperiod = + options->TestingTorNetwork ? + MIN_REND_POST_PERIOD_TESTING : MIN_REND_POST_PERIOD; + if (options->RendPostPeriod < min_rendpostperiod) { log_warn(LD_CONFIG, "RendPostPeriod option is too short; " - "raising to %d seconds.", MIN_REND_POST_PERIOD); - options->RendPostPeriod = MIN_REND_POST_PERIOD; + "raising to %d seconds.", min_rendpostperiod); + options->RendPostPeriod = min_rendpostperiod;; } if (options->RendPostPeriod > MAX_DIR_PERIOD) { @@ -3363,19 +3480,68 @@ options_validate(or_options_t *old_options, or_options_t *options, if (options->V3AuthVoteDelay + options->V3AuthDistDelay >= options->V3AuthVotingInterval/2) { - REJECT("V3AuthVoteDelay plus V3AuthDistDelay must be less than half " - "V3AuthVotingInterval"); + /* + This doesn't work, but it seems like it should: + what code is preventing the interval being less than twice the lead-up? + if (options->TestingTorNetwork) { + if (options->V3AuthVoteDelay + options->V3AuthDistDelay >= + options->V3AuthVotingInterval) { + REJECT("V3AuthVoteDelay plus V3AuthDistDelay must be less than " + "V3AuthVotingInterval"); + } else { + COMPLAIN("V3AuthVoteDelay plus V3AuthDistDelay is more than half " + "V3AuthVotingInterval. This may lead to " + "consensus instability, particularly if clocks drift."); + } + } else { + */ + REJECT("V3AuthVoteDelay plus V3AuthDistDelay must be less than half " + "V3AuthVotingInterval"); + /* + } + */ + } + + if (options->V3AuthVoteDelay < MIN_VOTE_SECONDS) { + if (options->TestingTorNetwork) { + if (options->V3AuthVoteDelay < MIN_VOTE_SECONDS_TESTING) { + REJECT("V3AuthVoteDelay is way too low."); + } else { + COMPLAIN("V3AuthVoteDelay is very low. " + "This may lead to failure to vote for a consensus."); + } + } else { + REJECT("V3AuthVoteDelay is way too low."); + } + } + + if (options->V3AuthDistDelay < MIN_DIST_SECONDS) { + if (options->TestingTorNetwork) { + if (options->V3AuthDistDelay < MIN_DIST_SECONDS_TESTING) { + REJECT("V3AuthDistDelay is way too low."); + } else { + COMPLAIN("V3AuthDistDelay is very low. " + "This may lead to missing votes in a consensus."); + } + } else { + REJECT("V3AuthDistDelay is way too low."); + } } - if (options->V3AuthVoteDelay < MIN_VOTE_SECONDS) - REJECT("V3AuthVoteDelay is way too low."); - if (options->V3AuthDistDelay < MIN_DIST_SECONDS) - REJECT("V3AuthDistDelay is way too low."); if (options->V3AuthNIntervalsValid < 2) REJECT("V3AuthNIntervalsValid must be at least 2."); if (options->V3AuthVotingInterval < MIN_VOTE_INTERVAL) { - REJECT("V3AuthVotingInterval is insanely low."); + if (options->TestingTorNetwork) { + if (options->V3AuthVotingInterval < MIN_VOTE_INTERVAL_TESTING) { + REJECT("V3AuthVotingInterval is insanely low."); + } else { + COMPLAIN("V3AuthVotingInterval is very low. " + "This may lead to failure to synchronise for a consensus."); + } + } else { + REJECT("V3AuthVotingInterval is insanely low."); + } } else if (options->V3AuthVotingInterval > 24*60*60) { REJECT("V3AuthVotingInterval is insanely high."); } else if (((24*60*60) % options->V3AuthVotingInterval) != 0) { @@ -3397,15 +3563,6 @@ options_validate(or_options_t *old_options, or_options_t *options, AF_INET6, 1, msg)<0) return -1; - if (options->AutomapHostsSuffixes) { - SMARTLIST_FOREACH(options->AutomapHostsSuffixes, char *, suf, - { - size_t len = strlen(suf); - if (len && suf[len-1] == '.') - suf[len-1] = '\0'; - }); - } - if (options->TestingTorNetwork && !(options->DirAuthorities || (options->AlternateDirAuthority && @@ -3450,26 +3607,27 @@ options_validate(or_options_t *old_options, or_options_t *options, CHECK_DEFAULT(TestingCertMaxDownloadTries); #undef CHECK_DEFAULT - if (options->TestingV3AuthInitialVotingInterval < MIN_VOTE_INTERVAL) { + if (options->TestingV3AuthInitialVotingInterval + < MIN_VOTE_INTERVAL_TESTING_INITIAL) { REJECT("TestingV3AuthInitialVotingInterval is insanely low."); } else if (((30*60) % options->TestingV3AuthInitialVotingInterval) != 0) { REJECT("TestingV3AuthInitialVotingInterval does not divide evenly into " "30 minutes."); } - if (options->TestingV3AuthInitialVoteDelay < MIN_VOTE_SECONDS) { + if (options->TestingV3AuthInitialVoteDelay < MIN_VOTE_SECONDS_TESTING) { REJECT("TestingV3AuthInitialVoteDelay is way too low."); } - if (options->TestingV3AuthInitialDistDelay < MIN_DIST_SECONDS) { + if (options->TestingV3AuthInitialDistDelay < MIN_DIST_SECONDS_TESTING) { REJECT("TestingV3AuthInitialDistDelay is way too low."); } if (options->TestingV3AuthInitialVoteDelay + options->TestingV3AuthInitialDistDelay >= - options->TestingV3AuthInitialVotingInterval/2) { + options->TestingV3AuthInitialVotingInterval) { REJECT("TestingV3AuthInitialVoteDelay plus TestingV3AuthInitialDistDelay " - "must be less than half TestingV3AuthInitialVotingInterval"); + "must be less than TestingV3AuthInitialVotingInterval"); } if (options->TestingV3AuthVotingStartOffset > @@ -3477,6 +3635,8 @@ options_validate(or_options_t *old_options, or_options_t *options, options->V3AuthVotingInterval)) { REJECT("TestingV3AuthVotingStartOffset is higher than the voting " "interval."); + } else if (options->TestingV3AuthVotingStartOffset < 0) { + REJECT("TestingV3AuthVotingStartOffset must be non-negative."); } if (options->TestingAuthDirTimeToLearnReachability < 0) { @@ -3797,6 +3957,7 @@ options_transition_affects_descriptor(const or_options_t *old_options, !opt_streq(old_options->Nickname,new_options->Nickname) || !opt_streq(old_options->Address,new_options->Address) || !config_lines_eq(old_options->ExitPolicy,new_options->ExitPolicy) || + old_options->ExitRelay != new_options->ExitRelay || old_options->ExitPolicyRejectPrivate != new_options->ExitPolicyRejectPrivate || old_options->IPv6Exit != new_options->IPv6Exit || @@ -3885,7 +4046,10 @@ get_windows_conf_root(void) static const char * get_default_conf_file(int defaults_file) { -#ifdef _WIN32 +#ifdef DISABLE_SYSTEM_TORRC + (void) defaults_file; + return NULL; +#elif defined(_WIN32) if (defaults_file) { static char defaults_path[MAX_PATH+1]; tor_snprintf(defaults_path, MAX_PATH, "%s\\torrc-defaults", @@ -4012,21 +4176,28 @@ find_torrc_filename(config_line_t *cmd_arg, if (*using_default_fname) { /* didn't find one, try CONFDIR */ const char *dflt = get_default_conf_file(defaults_file); - if (dflt && file_status(dflt) == FN_FILE) { + file_status_t st = file_status(dflt); + if (dflt && (st == FN_FILE || st == FN_EMPTY)) { fname = tor_strdup(dflt); } else { #ifndef _WIN32 char *fn = NULL; - if (!defaults_file) + if (!defaults_file) { fn = expand_filename("~/.torrc"); - if (fn && file_status(fn) == FN_FILE) { - fname = fn; + } + if (fn) { + file_status_t hmst = file_status(fn); + if (hmst == FN_FILE || hmst == FN_EMPTY || dflt == NULL) { + fname = fn; + } else { + tor_free(fn); + fname = tor_strdup(dflt); + } } else { - tor_free(fn); - fname = tor_strdup(dflt); + fname = dflt ? tor_strdup(dflt) : NULL; } #else - fname = tor_strdup(dflt); + fname = dflt ? tor_strdup(dflt) : NULL; #endif } } @@ -4049,16 +4220,20 @@ load_torrc_from_disk(config_line_t *cmd_arg, int defaults_file) int ignore_missing_torrc = 0; char **fname_var = defaults_file ? &torrc_defaults_fname : &torrc_fname; - fname = find_torrc_filename(cmd_arg, defaults_file, - &using_default_torrc, &ignore_missing_torrc); - tor_assert(fname); - log_debug(LD_CONFIG, "Opening config file \"%s\"", fname); - - tor_free(*fname_var); - *fname_var = fname; + if (*fname_var == NULL) { + fname = find_torrc_filename(cmd_arg, defaults_file, + &using_default_torrc, &ignore_missing_torrc); + tor_free(*fname_var); + *fname_var = fname; + } else { + fname = *fname_var; + } + log_debug(LD_CONFIG, "Opening config file \"%s\"", fname?fname:"<NULL>"); /* Open config file */ - if (file_status(fname) != FN_FILE || + file_status_t st = fname ? file_status(fname) : FN_EMPTY; + if (fname == NULL || + !(st == FN_FILE || st == FN_EMPTY) || !(cf = read_file_to_str(fname,0,NULL))) { if (using_default_torrc == 1 || ignore_missing_torrc) { if (!defaults_file) @@ -4347,7 +4522,7 @@ options_init_from_string(const char *cf_defaults, const char *cf, return err; } -/** Return the location for our configuration file. +/** Return the location for our configuration file. May return NULL. */ const char * get_torrc_fname(int defaults_fname) @@ -5201,14 +5376,6 @@ parse_dir_authority_line(const char *line, dirinfo_type_t required_type, fingerprint, (int)strlen(fingerprint)); goto err; } - if (!strcmp(fingerprint, "E623F7625FBE0C87820F11EC5F6D5377ED816294")) { - /* a known bad fingerprint. refuse to use it. We can remove this - * clause once Tor 0.1.2.17 is obsolete. */ - log_warn(LD_CONFIG, "Dangerous dirserver line. To correct, erase your " - "torrc file (%s), or reinstall Tor and use the default torrc.", - get_torrc_fname(0)); - goto err; - } if (base16_decode(digest, DIGEST_LEN, fingerprint, HEX_DIGEST_LEN)<0) { log_warn(LD_CONFIG, "Unable to decode DirAuthority key digest."); goto err; @@ -5338,12 +5505,13 @@ parse_dir_fallback_line(const char *line, /** Allocate and return a new port_cfg_t with reasonable defaults. */ static port_cfg_t * -port_cfg_new(void) +port_cfg_new(size_t namelen) { - port_cfg_t *cfg = tor_malloc_zero(sizeof(port_cfg_t)); - cfg->ipv4_traffic = 1; - cfg->cache_ipv4_answers = 1; - cfg->prefer_ipv6_virtaddr = 1; + tor_assert(namelen <= SIZE_T_CEILING - sizeof(port_cfg_t) - 1); + port_cfg_t *cfg = tor_malloc_zero(sizeof(port_cfg_t) + namelen + 1); + cfg->entry_cfg.ipv4_traffic = 1; + cfg->entry_cfg.cache_ipv4_answers = 1; + cfg->entry_cfg.prefer_ipv6_virtaddr = 1; return cfg; } @@ -5450,6 +5618,7 @@ warn_nonlocal_controller_ports(smartlist_t *ports, unsigned forbid) #define CL_PORT_SERVER_OPTIONS (1u<<3) #define CL_PORT_FORBID_NONLOCAL (1u<<4) #define CL_PORT_TAKES_HOSTNAMES (1u<<5) +#define CL_PORT_IS_UNIXSOCKET (1u<<6) /** * Parse port configuration for a single port type. @@ -5497,7 +5666,7 @@ parse_port_config(smartlist_t *out, int listener_type, const char *defaultaddr, int defaultport, - unsigned flags) + const unsigned flags) { smartlist_t *elts; int retval = -1; @@ -5510,6 +5679,7 @@ parse_port_config(smartlist_t *out, const unsigned allow_spurious_listenaddr = flags & CL_PORT_ALLOW_EXTRA_LISTENADDR; const unsigned takes_hostnames = flags & CL_PORT_TAKES_HOSTNAMES; + const unsigned is_unix_socket = flags & CL_PORT_IS_UNIXSOCKET; int got_zero_port=0, got_nonzero_port=0; /* FooListenAddress is deprecated; let's make it work like it used to work, @@ -5546,14 +5716,14 @@ parse_port_config(smartlist_t *out, if (use_server_options && out) { /* Add a no_listen port. */ - port_cfg_t *cfg = port_cfg_new(); + port_cfg_t *cfg = port_cfg_new(0); cfg->type = listener_type; cfg->port = mainport; tor_addr_make_unspec(&cfg->addr); /* Server ports default to 0.0.0.0 */ - cfg->no_listen = 1; - cfg->bind_ipv4_only = 1; - cfg->ipv4_traffic = 1; - cfg->prefer_ipv6_virtaddr = 1; + cfg->server_cfg.no_listen = 1; + cfg->server_cfg.bind_ipv4_only = 1; + cfg->entry_cfg.ipv4_traffic = 1; + cfg->entry_cfg.prefer_ipv6_virtaddr = 1; smartlist_add(out, cfg); } @@ -5566,13 +5736,13 @@ parse_port_config(smartlist_t *out, return -1; } if (out) { - port_cfg_t *cfg = port_cfg_new(); + port_cfg_t *cfg = port_cfg_new(0); cfg->type = listener_type; cfg->port = port ? port : mainport; tor_addr_copy(&cfg->addr, &addr); - cfg->session_group = SESSION_GROUP_UNSET; - cfg->isolation_flags = ISO_DEFAULT; - cfg->no_advertise = 1; + cfg->entry_cfg.session_group = SESSION_GROUP_UNSET; + cfg->entry_cfg.isolation_flags = ISO_DEFAULT; + cfg->server_cfg.no_advertise = 1; smartlist_add(out, cfg); } } @@ -5591,13 +5761,19 @@ parse_port_config(smartlist_t *out, /* No ListenAddress lines. If there's no FooPort, then maybe make a default * one. */ if (! ports) { - if (defaultport && out) { - port_cfg_t *cfg = port_cfg_new(); + if (defaultport && defaultaddr && out) { + port_cfg_t *cfg = port_cfg_new(is_unix_socket ? strlen(defaultaddr) : 0); cfg->type = listener_type; - cfg->port = defaultport; - tor_addr_parse(&cfg->addr, defaultaddr); - cfg->session_group = SESSION_GROUP_UNSET; - cfg->isolation_flags = ISO_DEFAULT; + if (is_unix_socket) { + tor_addr_make_unspec(&cfg->addr); + memcpy(cfg->unix_addr, defaultaddr, strlen(defaultaddr) + 1); + cfg->is_unix_addr = 1; + } else { + cfg->port = defaultport; + tor_addr_parse(&cfg->addr, defaultaddr); + } + cfg->entry_cfg.session_group = SESSION_GROUP_UNSET; + cfg->entry_cfg.isolation_flags = ISO_DEFAULT; smartlist_add(out, cfg); } return 0; @@ -5638,7 +5814,13 @@ parse_port_config(smartlist_t *out, /* Now parse the addr/port value */ addrport = smartlist_get(elts, 0); - if (!strcmp(addrport, "auto")) { + if (is_unix_socket) { + /* leave it as it is. */ + if (!strcmp(addrport, "0")) + port = 0; + else + port = 1; + } else if (!strcmp(addrport, "auto")) { port = CFG_AUTO_PORT; tor_addr_parse(&addr, defaultaddr); } else if (!strcasecmpend(addrport, ":auto")) { @@ -5823,28 +6005,35 @@ parse_port_config(smartlist_t *out, } if (out && port) { - port_cfg_t *cfg = port_cfg_new(); - tor_addr_copy(&cfg->addr, &addr); - cfg->port = port; + size_t namelen = is_unix_socket ? strlen(addrport) : 0; + port_cfg_t *cfg = port_cfg_new(namelen); + if (is_unix_socket) { + tor_addr_make_unspec(&cfg->addr); + memcpy(cfg->unix_addr, addrport, strlen(addrport) + 1); + cfg->is_unix_addr = 1; + } else { + tor_addr_copy(&cfg->addr, &addr); + cfg->port = port; + } cfg->type = listener_type; - cfg->isolation_flags = isolation; - cfg->session_group = sessiongroup; - cfg->no_advertise = no_advertise; - cfg->no_listen = no_listen; - cfg->all_addrs = all_addrs; - cfg->bind_ipv4_only = bind_ipv4_only; - cfg->bind_ipv6_only = bind_ipv6_only; - cfg->ipv4_traffic = ipv4_traffic; - cfg->ipv6_traffic = ipv6_traffic; - cfg->prefer_ipv6 = prefer_ipv6; - cfg->cache_ipv4_answers = cache_ipv4; - cfg->cache_ipv6_answers = cache_ipv6; - cfg->use_cached_ipv4_answers = use_cached_ipv4; - cfg->use_cached_ipv6_answers = use_cached_ipv6; - cfg->prefer_ipv6_virtaddr = prefer_ipv6_automap; - cfg->socks_prefer_no_auth = prefer_no_auth; + cfg->entry_cfg.isolation_flags = isolation; + cfg->entry_cfg.session_group = sessiongroup; + cfg->server_cfg.no_advertise = no_advertise; + cfg->server_cfg.no_listen = no_listen; + cfg->server_cfg.all_addrs = all_addrs; + cfg->server_cfg.bind_ipv4_only = bind_ipv4_only; + cfg->server_cfg.bind_ipv6_only = bind_ipv6_only; + cfg->entry_cfg.ipv4_traffic = ipv4_traffic; + cfg->entry_cfg.ipv6_traffic = ipv6_traffic; + cfg->entry_cfg.prefer_ipv6 = prefer_ipv6; + cfg->entry_cfg.cache_ipv4_answers = cache_ipv4; + cfg->entry_cfg.cache_ipv6_answers = cache_ipv6; + cfg->entry_cfg.use_cached_ipv4_answers = use_cached_ipv4; + cfg->entry_cfg.use_cached_ipv6_answers = use_cached_ipv6; + cfg->entry_cfg.prefer_ipv6_virtaddr = prefer_ipv6_automap; + cfg->entry_cfg.socks_prefer_no_auth = prefer_no_auth; if (! (isolation & ISO_SOCKSAUTH)) - cfg->socks_prefer_no_auth = 1; + cfg->entry_cfg.socks_prefer_no_auth = 1; smartlist_add(out, cfg); } @@ -5875,29 +6064,6 @@ parse_port_config(smartlist_t *out, return retval; } -/** Parse a list of config_line_t for an AF_UNIX unix socket listener option - * from <b>cfg</b> and add them to <b>out</b>. No fancy options are - * supported: the line contains nothing but the path to the AF_UNIX socket. */ -static int -parse_unix_socket_config(smartlist_t *out, const config_line_t *cfg, - int listener_type) -{ - - if (!out) - return 0; - - for ( ; cfg; cfg = cfg->next) { - size_t len = strlen(cfg->value); - port_cfg_t *port = tor_malloc_zero(sizeof(port_cfg_t) + len + 1); - port->is_unix_addr = 1; - memcpy(port->unix_addr, cfg->value, len+1); - port->type = listener_type; - smartlist_add(out, port); - } - - return 0; -} - /** Return the number of ports which are actually going to listen with type * <b>listenertype</b>. Do not count no_listen ports. Do not count unix * sockets. */ @@ -5906,7 +6072,7 @@ count_real_listeners(const smartlist_t *ports, int listenertype) { int n = 0; SMARTLIST_FOREACH_BEGIN(ports, port_cfg_t *, port) { - if (port->no_listen || port->is_unix_addr) + if (port->server_cfg.no_listen || port->is_unix_addr) continue; if (port->type != listenertype) continue; @@ -5986,12 +6152,21 @@ parse_ports(or_options_t *options, int validate_only, "configuration"); goto err; } - if (parse_unix_socket_config(ports, - options->ControlSocket, - CONN_TYPE_CONTROL_LISTENER) < 0) { + + if (parse_port_config(ports, options->ControlSocket, NULL, + "ControlSocket", + CONN_TYPE_CONTROL_LISTENER, NULL, 0, + control_port_flags | CL_PORT_IS_UNIXSOCKET) < 0) { *msg = tor_strdup("Invalid ControlSocket configuration"); goto err; } + if (parse_port_config(ports, options->SocksSocket, NULL, + "SocksSocket", + CONN_TYPE_AP_LISTENER, NULL, 0, + CL_PORT_IS_UNIXSOCKET) < 0) { + *msg = tor_strdup("Invalid SocksSocket configuration"); + goto err; + } } if (! options->ClientOnly) { if (parse_port_config(ports, @@ -6035,6 +6210,8 @@ parse_ports(or_options_t *options, int validate_only, !! count_real_listeners(ports, CONN_TYPE_OR_LISTENER); options->SocksPort_set = !! count_real_listeners(ports, CONN_TYPE_AP_LISTENER); + options->SocksSocket_set = + !! count_real_listeners(ports, CONN_TYPE_AP_LISTENER); options->TransPort_set = !! count_real_listeners(ports, CONN_TYPE_AP_TRANS_LISTENER); options->NATDPort_set = @@ -6082,25 +6259,25 @@ check_server_ports(const smartlist_t *ports, SMARTLIST_FOREACH_BEGIN(ports, const port_cfg_t *, port) { if (port->type == CONN_TYPE_DIR_LISTENER) { - if (! port->no_advertise) + if (! port->server_cfg.no_advertise) ++n_dirport_advertised; - if (! port->no_listen) + if (! port->server_cfg.no_listen) ++n_dirport_listeners; } else if (port->type == CONN_TYPE_OR_LISTENER) { - if (! port->no_advertise) { + if (! port->server_cfg.no_advertise) { ++n_orport_advertised; if (tor_addr_family(&port->addr) == AF_INET || (tor_addr_family(&port->addr) == AF_UNSPEC && - !port->bind_ipv6_only)) + !port->server_cfg.bind_ipv6_only)) ++n_orport_advertised_ipv4; } - if (! port->no_listen) + if (! port->server_cfg.no_listen) ++n_orport_listeners; } else { continue; } #ifndef _WIN32 - if (!port->no_listen && port->port < 1024) + if (!port->server_cfg.no_listen && port->port < 1024) ++n_low_port; #endif } SMARTLIST_FOREACH_END(port); @@ -6178,7 +6355,7 @@ get_first_listener_addrport_string(int listener_type) return NULL; SMARTLIST_FOREACH_BEGIN(configured_ports, const port_cfg_t *, cfg) { - if (cfg->no_listen) + if (cfg->server_cfg.no_listen) continue; if (cfg->type == listener_type && @@ -6225,12 +6402,12 @@ get_first_advertised_port_by_type_af(int listener_type, int address_family) return 0; SMARTLIST_FOREACH_BEGIN(configured_ports, const port_cfg_t *, cfg) { if (cfg->type == listener_type && - !cfg->no_advertise && + !cfg->server_cfg.no_advertise && (tor_addr_family(&cfg->addr) == address_family || tor_addr_family(&cfg->addr) == AF_UNSPEC)) { if (tor_addr_family(&cfg->addr) != AF_UNSPEC || - (address_family == AF_INET && !cfg->bind_ipv6_only) || - (address_family == AF_INET6 && !cfg->bind_ipv4_only)) { + (address_family == AF_INET && !cfg->server_cfg.bind_ipv6_only) || + (address_family == AF_INET6 && !cfg->server_cfg.bind_ipv4_only)) { return cfg->port; } } @@ -6314,10 +6491,13 @@ write_configuration_file(const char *fname, const or_options_t *options) char *old_val=NULL, *new_val=NULL, *new_conf=NULL; int rename_old = 0, r; - tor_assert(fname); + if (!fname) + return -1; switch (file_status(fname)) { + /* create backups of old config files, even if they're empty */ case FN_FILE: + case FN_EMPTY: old_val = read_file_to_str(fname, 0, NULL); if (!old_val || strcmpstart(old_val, GENERATED_FILE_PREFIX)) { rename_old = 1; diff --git a/src/or/config.h b/src/or/config.h index 6cc81ab948..6bd3eb5734 100644 --- a/src/or/config.h +++ b/src/or/config.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -33,7 +33,7 @@ void reset_last_resolved_addr(void); int resolve_my_address(int warn_severity, const or_options_t *options, uint32_t *addr_out, const char **method_out, char **hostname_out); -int is_local_addr(const tor_addr_t *addr); +MOCK_DECL(int, is_local_addr, (const tor_addr_t *addr)); void options_init(or_options_t *options); #define OPTIONS_DUMP_MINIMAL 1 diff --git a/src/or/confparse.c b/src/or/confparse.c index 8ee985c92a..ac21df25cb 100644 --- a/src/or/confparse.c +++ b/src/or/confparse.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "or.h" diff --git a/src/or/confparse.h b/src/or/confparse.h index 3712924ac7..83c0f75b52 100644 --- a/src/or/confparse.h +++ b/src/or/confparse.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TOR_CONFPARSE_H diff --git a/src/or/connection.c b/src/or/connection.c index c9c371c001..f26ada096b 100644 --- a/src/or/connection.c +++ b/src/or/connection.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -29,7 +29,6 @@ #include "connection_edge.h" #include "connection_or.h" #include "control.h" -#include "cpuworker.h" #include "directory.h" #include "dirserv.h" #include "dns.h" @@ -57,6 +56,11 @@ #include <pwd.h> #endif +#ifdef HAVE_SYS_UN_H +#include <sys/socket.h> +#include <sys/un.h> +#endif + static connection_t *connection_listener_new( const struct sockaddr *listensockaddr, socklen_t listensocklen, int type, @@ -130,7 +134,6 @@ conn_type_to_string(int type) case CONN_TYPE_AP: return "Socks"; case CONN_TYPE_DIR_LISTENER: return "Directory listener"; case CONN_TYPE_DIR: return "Directory"; - case CONN_TYPE_CPUWORKER: return "CPU worker"; case CONN_TYPE_CONTROL_LISTENER: return "Control listener"; case CONN_TYPE_CONTROL: return "Control"; case CONN_TYPE_EXT_OR: return "Extended OR"; @@ -213,12 +216,6 @@ conn_state_to_string(int type, int state) case DIR_CONN_STATE_SERVER_WRITING: return "writing"; } break; - case CONN_TYPE_CPUWORKER: - switch (state) { - case CPUWORKER_STATE_IDLE: return "idle"; - case CPUWORKER_STATE_BUSY_ONION: return "busy with onion"; - } - break; case CONN_TYPE_CONTROL: switch (state) { case CONTROL_CONN_STATE_OPEN: return "open (protocol v1)"; @@ -248,7 +245,6 @@ connection_type_uses_bufferevent(connection_t *conn) case CONN_TYPE_CONTROL: case CONN_TYPE_OR: case CONN_TYPE_EXT_OR: - case CONN_TYPE_CPUWORKER: return 1; default: return 0; @@ -305,9 +301,11 @@ entry_connection_new(int type, int socket_family) * in a little while. Otherwise, we're doing this as a linked connection * of some kind, and we should set it up here based on the socket family */ if (socket_family == AF_INET) - entry_conn->ipv4_traffic_ok = 1; + entry_conn->entry_cfg.ipv4_traffic = 1; else if (socket_family == AF_INET6) - entry_conn->ipv6_traffic_ok = 1; + entry_conn->entry_cfg.ipv6_traffic = 1; + else if (socket_family == AF_UNIX) + entry_conn->is_socks_socket = 1; return entry_conn; } @@ -516,9 +514,10 @@ connection_free_(connection_t *conn) buf_free(conn->outbuf); } else { if (conn->socket_family == AF_UNIX) { - /* For now only control ports can be Unix domain sockets + /* For now only control and SOCKS ports can be Unix domain sockets * and listeners at the same time */ - tor_assert(conn->type == CONN_TYPE_CONTROL_LISTENER); + tor_assert(conn->type == CONN_TYPE_CONTROL_LISTENER || + conn->type == CONN_TYPE_AP_LISTENER); if (unlink(conn->address) < 0 && errno != ENOENT) { log_warn(LD_NET, "Could not unlink %s: %s", conn->address, @@ -544,8 +543,7 @@ connection_free_(connection_t *conn) or_conn, TLS_CHAN_TO_BASE(or_conn->chan), U64_PRINTF_ARG( TLS_CHAN_TO_BASE(or_conn->chan)->global_identifier)); - if (!(TLS_CHAN_TO_BASE(or_conn->chan)->state == CHANNEL_STATE_CLOSED || - TLS_CHAN_TO_BASE(or_conn->chan)->state == CHANNEL_STATE_ERROR)) { + if (!CHANNEL_FINISHED(TLS_CHAN_TO_BASE(or_conn->chan))) { channel_close_for_error(TLS_CHAN_TO_BASE(or_conn->chan)); } @@ -575,8 +573,10 @@ connection_free_(connection_t *conn) tor_free(control_conn->incoming_cmd); } - tor_free(conn->read_event); /* Probably already freed by connection_free. */ - tor_free(conn->write_event); /* Probably already freed by connection_free. */ + /* Probably already freed by connection_free. */ + tor_event_free(conn->read_event); + tor_event_free(conn->write_event); + conn->read_event = conn->write_event = NULL; IF_HAS_BUFFEREVENT(conn, { /* This was a workaround to handle bugs in some old versions of libevent * where callbacks can occur after calling bufferevent_free(). Setting @@ -914,13 +914,57 @@ warn_too_many_conns(void) } #ifdef HAVE_SYS_UN_H + +#define UNIX_SOCKET_PURPOSE_CONTROL_SOCKET 0 +#define UNIX_SOCKET_PURPOSE_SOCKS_SOCKET 1 + +/** Check if the purpose isn't one of the ones we know what to do with */ + +static int +is_valid_unix_socket_purpose(int purpose) +{ + int valid = 0; + + switch (purpose) { + case UNIX_SOCKET_PURPOSE_CONTROL_SOCKET: + case UNIX_SOCKET_PURPOSE_SOCKS_SOCKET: + valid = 1; + break; + } + + return valid; +} + +/** Return a string description of a unix socket purpose */ +static const char * +unix_socket_purpose_to_string(int purpose) +{ + const char *s = "unknown-purpose socket"; + + switch (purpose) { + case UNIX_SOCKET_PURPOSE_CONTROL_SOCKET: + s = "control socket"; + break; + case UNIX_SOCKET_PURPOSE_SOCKS_SOCKET: + s = "SOCKS socket"; + break; + } + + return s; +} + /** Check whether we should be willing to open an AF_UNIX socket in * <b>path</b>. Return 0 if we should go ahead and -1 if we shouldn't. */ static int -check_location_for_unix_socket(const or_options_t *options, const char *path) +check_location_for_unix_socket(const or_options_t *options, const char *path, + int purpose) { int r = -1; - char *p = tor_strdup(path); + char *p = NULL; + + tor_assert(is_valid_unix_socket_purpose(purpose)); + + p = tor_strdup(path); cpd_check_t flags = CPD_CHECK_MODE_ONLY; if (get_parent_directory(p)<0 || p[0] != '/') { log_warn(LD_GENERAL, "Bad unix socket address '%s'. Tor does not support " @@ -928,18 +972,23 @@ check_location_for_unix_socket(const or_options_t *options, const char *path) goto done; } - if (options->ControlSocketsGroupWritable) + if ((purpose == UNIX_SOCKET_PURPOSE_CONTROL_SOCKET && + options->ControlSocketsGroupWritable) || + (purpose == UNIX_SOCKET_PURPOSE_SOCKS_SOCKET && + options->SocksSocketsGroupWritable)) { flags |= CPD_GROUP_OK; + } if (check_private_dir(p, flags, options->User) < 0) { char *escpath, *escdir; escpath = esc_for_log(path); escdir = esc_for_log(p); - log_warn(LD_GENERAL, "Before Tor can create a control socket in %s, the " - "directory %s needs to exist, and to be accessible only by the " - "user%s account that is running Tor. (On some Unix systems, " - "anybody who can list a socket can connect to it, so Tor is " - "being careful.)", escpath, escdir, + log_warn(LD_GENERAL, "Before Tor can create a %s in %s, the directory " + "%s needs to exist, and to be accessible only by the user%s " + "account that is running Tor. (On some Unix systems, anybody " + "who can list a socket can connect to it, so Tor is being " + "careful.)", + unix_socket_purpose_to_string(purpose), escpath, escdir, options->ControlSocketsGroupWritable ? " and group" : ""); tor_free(escpath); tor_free(escdir); @@ -1022,15 +1071,15 @@ connection_listener_new(const struct sockaddr *listensockaddr, static int global_next_session_group = SESSION_GROUP_FIRST_AUTO; tor_addr_t addr; - if (get_n_open_sockets() >= get_options()->ConnLimit_-1) { + if (get_n_open_sockets() >= options->ConnLimit_-1) { warn_too_many_conns(); return NULL; } if (listensockaddr->sa_family == AF_INET || listensockaddr->sa_family == AF_INET6) { - int is_tcp = (type != CONN_TYPE_AP_DNS_LISTENER); - if (is_tcp) + int is_stream = (type != CONN_TYPE_AP_DNS_LISTENER); + if (is_stream) start_reading = 1; tor_addr_from_sockaddr(&addr, listensockaddr, &usePort); @@ -1039,10 +1088,10 @@ connection_listener_new(const struct sockaddr *listensockaddr, conn_type_to_string(type), fmt_addrport(&addr, usePort)); s = tor_open_socket_nonblocking(tor_addr_family(&addr), - is_tcp ? SOCK_STREAM : SOCK_DGRAM, - is_tcp ? IPPROTO_TCP: IPPROTO_UDP); + is_stream ? SOCK_STREAM : SOCK_DGRAM, + is_stream ? IPPROTO_TCP: IPPROTO_UDP); if (!SOCKET_OK(s)) { - log_warn(LD_NET,"Socket creation failed: %s", + log_warn(LD_NET, "Socket creation failed: %s", tor_socket_strerror(tor_socket_errno(-1))); goto err; } @@ -1099,7 +1148,7 @@ connection_listener_new(const struct sockaddr *listensockaddr, goto err; } - if (is_tcp) { + if (is_stream) { if (tor_listen(s) < 0) { log_warn(LD_NET, "Could not listen on %s:%u: %s", address, usePort, tor_socket_strerror(tor_socket_errno(s))); @@ -1122,15 +1171,25 @@ connection_listener_new(const struct sockaddr *listensockaddr, tor_addr_from_sockaddr(&addr2, (struct sockaddr*)&ss, &gotPort); } #ifdef HAVE_SYS_UN_H + /* + * AF_UNIX generic setup stuff (this covers both CONN_TYPE_CONTROL_LISTENER + * and CONN_TYPE_AP_LISTENER cases) + */ } else if (listensockaddr->sa_family == AF_UNIX) { + /* We want to start reading for both AF_UNIX cases */ start_reading = 1; - /* For now only control ports can be Unix domain sockets + /* For now only control ports or SOCKS ports can be Unix domain sockets * and listeners at the same time */ - tor_assert(type == CONN_TYPE_CONTROL_LISTENER); + tor_assert(type == CONN_TYPE_CONTROL_LISTENER || + type == CONN_TYPE_AP_LISTENER); - if (check_location_for_unix_socket(options, address) < 0) - goto err; + if (check_location_for_unix_socket(options, address, + (type == CONN_TYPE_CONTROL_LISTENER) ? + UNIX_SOCKET_PURPOSE_CONTROL_SOCKET : + UNIX_SOCKET_PURPOSE_SOCKS_SOCKET) < 0) { + goto err; + } log_notice(LD_NET, "Opening %s on %s", conn_type_to_string(type), address); @@ -1142,17 +1201,20 @@ connection_listener_new(const struct sockaddr *listensockaddr, strerror(errno)); goto err; } + s = tor_open_socket_nonblocking(AF_UNIX, SOCK_STREAM, 0); if (! SOCKET_OK(s)) { log_warn(LD_NET,"Socket creation failed: %s.", strerror(errno)); goto err; } - if (bind(s, listensockaddr, (socklen_t)sizeof(struct sockaddr_un)) == -1) { + if (bind(s, listensockaddr, + (socklen_t)sizeof(struct sockaddr_un)) == -1) { log_warn(LD_NET,"Bind to %s failed: %s.", address, tor_socket_strerror(tor_socket_errno(s))); goto err; } + #ifdef HAVE_PWD_H if (options->User) { pw = tor_getpwnam(options->User); @@ -1167,13 +1229,27 @@ connection_listener_new(const struct sockaddr *listensockaddr, } } #endif - if (options->ControlSocketsGroupWritable) { + + if ((type == CONN_TYPE_CONTROL_LISTENER && + options->ControlSocketsGroupWritable) || + (type == CONN_TYPE_AP_LISTENER && + options->SocksSocketsGroupWritable)) { /* We need to use chmod; fchmod doesn't work on sockets on all * platforms. */ if (chmod(address, 0660) < 0) { log_warn(LD_FS,"Unable to make %s group-writable.", address); goto err; } + } else if ((type == CONN_TYPE_CONTROL_LISTENER && + !(options->ControlSocketsGroupWritable)) || + (type == CONN_TYPE_AP_LISTENER && + !(options->SocksSocketsGroupWritable))) { + /* We need to use chmod; fchmod doesn't work on sockets on all + * platforms. */ + if (chmod(address, 0600) < 0) { + log_warn(LD_FS,"Unable to make %s group-writable.", address); + goto err; + } } if (listen(s, SOMAXCONN) < 0) { @@ -1181,8 +1257,6 @@ connection_listener_new(const struct sockaddr *listensockaddr, tor_socket_strerror(tor_socket_errno(s))); goto err; } -#else - (void)options; #endif /* HAVE_SYS_UN_H */ } else { log_err(LD_BUG, "Got unexpected address family %d.", @@ -1199,10 +1273,10 @@ connection_listener_new(const struct sockaddr *listensockaddr, conn->port = gotPort; tor_addr_copy(&conn->addr, &addr); - if (port_cfg->isolation_flags) { - lis_conn->isolation_flags = port_cfg->isolation_flags; - if (port_cfg->session_group >= 0) { - lis_conn->session_group = port_cfg->session_group; + if (port_cfg->entry_cfg.isolation_flags) { + lis_conn->entry_cfg.isolation_flags = port_cfg->entry_cfg.isolation_flags; + if (port_cfg->entry_cfg.session_group >= 0) { + lis_conn->entry_cfg.session_group = port_cfg->entry_cfg.session_group; } else { /* This can wrap after around INT_MAX listeners are opened. But I don't * believe that matters, since you would need to open a ridiculous @@ -1210,23 +1284,17 @@ connection_listener_new(const struct sockaddr *listensockaddr, * hit this. An OR with a dozen ports open, for example, would have to * close and re-open its listeners every second for 4 years nonstop. */ - lis_conn->session_group = global_next_session_group--; + lis_conn->entry_cfg.session_group = global_next_session_group--; } } - if (type == CONN_TYPE_AP_LISTENER) { - lis_conn->socks_ipv4_traffic = port_cfg->ipv4_traffic; - lis_conn->socks_ipv6_traffic = port_cfg->ipv6_traffic; - lis_conn->socks_prefer_ipv6 = port_cfg->prefer_ipv6; - } else { - lis_conn->socks_ipv4_traffic = 1; - lis_conn->socks_ipv6_traffic = 1; + + memcpy(&lis_conn->entry_cfg, &port_cfg->entry_cfg, sizeof(entry_port_cfg_t)); + + if (type != CONN_TYPE_AP_LISTENER) { + lis_conn->entry_cfg.ipv4_traffic = 1; + lis_conn->entry_cfg.ipv6_traffic = 1; + lis_conn->entry_cfg.prefer_ipv6 = 0; } - lis_conn->cache_ipv4_answers = port_cfg->cache_ipv4_answers; - lis_conn->cache_ipv6_answers = port_cfg->cache_ipv6_answers; - lis_conn->use_cached_ipv4_answers = port_cfg->use_cached_ipv4_answers; - lis_conn->use_cached_ipv6_answers = port_cfg->use_cached_ipv6_answers; - lis_conn->prefer_ipv6_virtaddr = port_cfg->prefer_ipv6_virtaddr; - lis_conn->socks_prefer_no_auth = port_cfg->socks_prefer_no_auth; if (connection_add(conn) < 0) { /* no space, forget it */ log_warn(LD_NET,"connection_add for listener failed. Giving up."); @@ -1293,6 +1361,8 @@ check_sockaddr(const struct sockaddr *sa, int len, int level) "Address for new connection has address/port equal to zero."); ok = 0; } + } else if (sa->sa_family == AF_UNIX) { + ok = 1; } else { ok = 0; } @@ -1377,7 +1447,8 @@ connection_handle_listener_read(connection_t *conn, int new_type) return 0; } - if (conn->socket_family == AF_INET || conn->socket_family == AF_INET6) { + if (conn->socket_family == AF_INET || conn->socket_family == AF_INET6 || + (conn->socket_family == AF_UNIX && new_type == CONN_TYPE_AP)) { tor_addr_t addr; uint16_t port; if (check_sockaddr(remote, remotelen, LOG_INFO)<0) { @@ -1418,18 +1489,21 @@ connection_handle_listener_read(connection_t *conn, int new_type) newconn->port = port; newconn->address = tor_dup_addr(&addr); - if (new_type == CONN_TYPE_AP) { - TO_ENTRY_CONN(newconn)->socks_request->socks_prefer_no_auth = - TO_LISTENER_CONN(conn)->socks_prefer_no_auth; + if (new_type == CONN_TYPE_AP && conn->socket_family != AF_UNIX) { + log_info(LD_NET, "New SOCKS connection opened from %s.", + fmt_and_decorate_addr(&addr)); + } + if (new_type == CONN_TYPE_AP && conn->socket_family == AF_UNIX) { + newconn->port = 0; + newconn->address = tor_strdup(conn->address); + log_info(LD_NET, "New SOCKS SocksSocket connection opened"); } if (new_type == CONN_TYPE_CONTROL) { log_notice(LD_CONTROL, "New control connection opened from %s.", fmt_and_decorate_addr(&addr)); } - } else if (conn->socket_family == AF_UNIX) { - /* For now only control ports can be Unix domain sockets - * and listeners at the same time */ + } else if (conn->socket_family == AF_UNIX && conn->type != CONN_TYPE_AP) { tor_assert(conn->type == CONN_TYPE_CONTROL_LISTENER); tor_assert(new_type == CONN_TYPE_CONTROL); log_notice(LD_CONTROL, "New control connection opened."); @@ -1484,25 +1558,16 @@ connection_init_accepted_conn(connection_t *conn, return rv; break; case CONN_TYPE_AP: - TO_ENTRY_CONN(conn)->isolation_flags = listener->isolation_flags; - TO_ENTRY_CONN(conn)->session_group = listener->session_group; + memcpy(&TO_ENTRY_CONN(conn)->entry_cfg, &listener->entry_cfg, + sizeof(entry_port_cfg_t)); TO_ENTRY_CONN(conn)->nym_epoch = get_signewnym_epoch(); TO_ENTRY_CONN(conn)->socks_request->listener_type = listener->base_.type; - TO_ENTRY_CONN(conn)->ipv4_traffic_ok = listener->socks_ipv4_traffic; - TO_ENTRY_CONN(conn)->ipv6_traffic_ok = listener->socks_ipv6_traffic; - TO_ENTRY_CONN(conn)->prefer_ipv6_traffic = listener->socks_prefer_ipv6; - TO_ENTRY_CONN(conn)->cache_ipv4_answers = listener->cache_ipv4_answers; - TO_ENTRY_CONN(conn)->cache_ipv6_answers = listener->cache_ipv6_answers; - TO_ENTRY_CONN(conn)->use_cached_ipv4_answers = - listener->use_cached_ipv4_answers; - TO_ENTRY_CONN(conn)->use_cached_ipv6_answers = - listener->use_cached_ipv6_answers; - TO_ENTRY_CONN(conn)->prefer_ipv6_virtaddr = - listener->prefer_ipv6_virtaddr; switch (TO_CONN(listener)->type) { case CONN_TYPE_AP_LISTENER: conn->state = AP_CONN_STATE_SOCKS_WAIT; + TO_ENTRY_CONN(conn)->socks_request->socks_prefer_no_auth = + listener->entry_cfg.socks_prefer_no_auth; break; case CONN_TYPE_AP_TRANS_LISTENER: TO_ENTRY_CONN(conn)->is_transparent_ap = 1; @@ -1525,37 +1590,31 @@ connection_init_accepted_conn(connection_t *conn, return 0; } -/** Take conn, make a nonblocking socket; try to connect to - * addr:port (they arrive in *host order*). If fail, return -1 and if - * applicable put your best guess about errno into *<b>socket_error</b>. - * Else assign s to conn-\>s: if connected return 1, if EAGAIN return 0. - * - * address is used to make the logs useful. - * - * On success, add conn to the list of polled connections. - */ -int -connection_connect(connection_t *conn, const char *address, - const tor_addr_t *addr, uint16_t port, int *socket_error) + +static int +connection_connect_sockaddr(connection_t *conn, + const struct sockaddr *sa, + socklen_t sa_len, + const struct sockaddr *bindaddr, + socklen_t bindaddr_len, + int *socket_error) { tor_socket_t s; int inprogress = 0; - struct sockaddr_storage addrbuf; - struct sockaddr *dest_addr; - int dest_addr_len; const or_options_t *options = get_options(); int protocol_family; + tor_assert(conn); + tor_assert(sa); + tor_assert(socket_error); + if (get_n_open_sockets() >= get_options()->ConnLimit_-1) { warn_too_many_conns(); *socket_error = SOCK_ERRNO(ENOBUFS); return -1; } - if (tor_addr_family(addr) == AF_INET6) - protocol_family = PF_INET6; - else - protocol_family = PF_INET; + protocol_family = sa->sa_family; if (get_options()->DisableNetwork) { /* We should never even try to connect anyplace if DisableNetwork is set. @@ -1568,7 +1627,7 @@ connection_connect(connection_t *conn, const char *address, return -1; } - s = tor_open_socket_nonblocking(protocol_family,SOCK_STREAM,IPPROTO_TCP); + s = tor_open_socket_nonblocking(protocol_family, SOCK_STREAM, 0); if (! SOCKET_OK(s)) { *socket_error = tor_socket_errno(-1); log_warn(LD_NET,"Error creating network socket: %s", @@ -1581,6 +1640,74 @@ connection_connect(connection_t *conn, const char *address, tor_socket_strerror(errno)); } + if (bindaddr && bind(s, bindaddr, bindaddr_len) < 0) { + *socket_error = tor_socket_errno(s); + log_warn(LD_NET,"Error binding network socket: %s", + tor_socket_strerror(*socket_error)); + tor_close_socket(s); + return -1; + } + + tor_assert(options); + if (options->ConstrainedSockets) + set_constrained_socket_buffers(s, (int)options->ConstrainedSockSize); + + if (connect(s, sa, sa_len) < 0) { + int e = tor_socket_errno(s); + if (!ERRNO_IS_CONN_EINPROGRESS(e)) { + /* yuck. kill it. */ + *socket_error = e; + log_info(LD_NET, + "connect() to socket failed: %s", + tor_socket_strerror(e)); + tor_close_socket(s); + return -1; + } else { + inprogress = 1; + } + } + + /* it succeeded. we're connected. */ + log_fn(inprogress ? LOG_DEBUG : LOG_INFO, LD_NET, + "Connection to socket %s (sock "TOR_SOCKET_T_FORMAT").", + inprogress ? "in progress" : "established", s); + conn->s = s; + if (connection_add_connecting(conn) < 0) { + /* no space, forget it */ + *socket_error = SOCK_ERRNO(ENOBUFS); + return -1; + } + return inprogress ? 0 : 1; + +} + + +/** Take conn, make a nonblocking socket; try to connect to + * addr:port (they arrive in *host order*). If fail, return -1 and if + * applicable put your best guess about errno into *<b>socket_error</b>. + * Else assign s to conn-\>s: if connected return 1, if EAGAIN return 0. + * + * address is used to make the logs useful. + * + * On success, add conn to the list of polled connections. + */ +int +connection_connect(connection_t *conn, const char *address, + const tor_addr_t *addr, uint16_t port, int *socket_error) +{ + struct sockaddr_storage addrbuf; + struct sockaddr_storage bind_addr_ss; + struct sockaddr *bind_addr = NULL; + struct sockaddr *dest_addr; + int dest_addr_len, bind_addr_len = 0; + const or_options_t *options = get_options(); + int protocol_family; + + if (tor_addr_family(addr) == AF_INET6) + protocol_family = PF_INET6; + else + protocol_family = PF_INET; + if (!tor_addr_is_loopback(addr)) { const tor_addr_t *ext_addr = NULL; if (protocol_family == AF_INET && @@ -1590,33 +1717,21 @@ connection_connect(connection_t *conn, const char *address, !tor_addr_is_null(&options->OutboundBindAddressIPv6_)) ext_addr = &options->OutboundBindAddressIPv6_; if (ext_addr) { - struct sockaddr_storage ext_addr_sa; socklen_t ext_addr_len = 0; - memset(&ext_addr_sa, 0, sizeof(ext_addr_sa)); - ext_addr_len = tor_addr_to_sockaddr(ext_addr, 0, - (struct sockaddr *) &ext_addr_sa, - sizeof(ext_addr_sa)); + memset(&bind_addr_ss, 0, sizeof(bind_addr_ss)); + bind_addr_len = tor_addr_to_sockaddr(ext_addr, 0, + (struct sockaddr *) &bind_addr_ss, + sizeof(bind_addr_ss)); if (ext_addr_len == 0) { log_warn(LD_NET, "Error converting OutboundBindAddress %s into sockaddr. " "Ignoring.", fmt_and_decorate_addr(ext_addr)); } else { - if (bind(s, (struct sockaddr *) &ext_addr_sa, ext_addr_len) < 0) { - *socket_error = tor_socket_errno(s); - log_warn(LD_NET,"Error binding network socket to %s: %s", - fmt_and_decorate_addr(ext_addr), - tor_socket_strerror(*socket_error)); - tor_close_socket(s); - return -1; - } + bind_addr = (struct sockaddr *)&bind_addr_ss; } } } - tor_assert(options); - if (options->ConstrainedSockets) - set_constrained_socket_buffers(s, (int)options->ConstrainedSockSize); - memset(&addrbuf,0,sizeof(addrbuf)); dest_addr = (struct sockaddr*) &addrbuf; dest_addr_len = tor_addr_to_sockaddr(addr, port, dest_addr, sizeof(addrbuf)); @@ -1625,36 +1740,51 @@ connection_connect(connection_t *conn, const char *address, log_debug(LD_NET, "Connecting to %s:%u.", escaped_safe_str_client(address), port); - if (connect(s, dest_addr, (socklen_t)dest_addr_len) < 0) { - int e = tor_socket_errno(s); - if (!ERRNO_IS_CONN_EINPROGRESS(e)) { - /* yuck. kill it. */ - *socket_error = e; - log_info(LD_NET, - "connect() to %s:%u failed: %s", - escaped_safe_str_client(address), - port, tor_socket_strerror(e)); - tor_close_socket(s); - return -1; - } else { - inprogress = 1; - } - } + return connection_connect_sockaddr(conn, dest_addr, dest_addr_len, + bind_addr, bind_addr_len, socket_error); +} - /* it succeeded. we're connected. */ - log_fn(inprogress?LOG_DEBUG:LOG_INFO, LD_NET, - "Connection to %s:%u %s (sock "TOR_SOCKET_T_FORMAT").", - escaped_safe_str_client(address), - port, inprogress?"in progress":"established", s); - conn->s = s; - if (connection_add_connecting(conn) < 0) { - /* no space, forget it */ - *socket_error = SOCK_ERRNO(ENOBUFS); +#ifdef HAVE_SYS_UN_H + +/** Take conn, make a nonblocking socket; try to connect to + * an AF_UNIX socket at socket_path. If fail, return -1 and if applicable + * put your best guess about errno into *<b>socket_error</b>. Else assign s + * to conn-\>s: if connected return 1, if EAGAIN return 0. + * + * On success, add conn to the list of polled connections. + */ +int +connection_connect_unix(connection_t *conn, const char *socket_path, + int *socket_error) +{ + struct sockaddr_un dest_addr; + + tor_assert(socket_path); + + /* Check that we'll be able to fit it into dest_addr later */ + if (strlen(socket_path) + 1 > sizeof(dest_addr.sun_path)) { + log_warn(LD_NET, + "Path %s is too long for an AF_UNIX socket\n", + escaped_safe_str_client(socket_path)); + *socket_error = SOCK_ERRNO(ENAMETOOLONG); return -1; } - return inprogress ? 0 : 1; + + memset(&dest_addr, 0, sizeof(dest_addr)); + dest_addr.sun_family = AF_UNIX; + strlcpy(dest_addr.sun_path, socket_path, sizeof(dest_addr.sun_path)); + + log_debug(LD_NET, + "Connecting to AF_UNIX socket at %s.", + escaped_safe_str_client(socket_path)); + + return connection_connect_sockaddr(conn, + (struct sockaddr *)&dest_addr, sizeof(dest_addr), + NULL, 0, socket_error); } +#endif /* defined(HAVE_SYS_UN_H) */ + /** Convert state number to string representation for logging purposes. */ static const char * @@ -2185,7 +2315,7 @@ retry_listener_ports(smartlist_t *old_conns, (conn->socket_family == AF_UNIX && ! wanted->is_unix_addr)) continue; - if (wanted->no_listen) + if (wanted->server_cfg.no_listen) continue; /* We don't want to open a listener for this one */ if (wanted->is_unix_addr) { @@ -2226,7 +2356,7 @@ retry_listener_ports(smartlist_t *old_conns, connection_t *conn; int real_port = port->port == CFG_AUTO_PORT ? 0 : port->port; tor_assert(real_port <= UINT16_MAX); - if (port->no_listen) + if (port->server_cfg.no_listen) continue; if (port->is_unix_addr) { @@ -2348,7 +2478,6 @@ connection_mark_all_noncontrol_connections(void) if (conn->marked_for_close) continue; switch (conn->type) { - case CONN_TYPE_CPUWORKER: case CONN_TYPE_CONTROL_LISTENER: case CONN_TYPE_CONTROL: break; @@ -2391,6 +2520,7 @@ connection_is_rate_limited(connection_t *conn) return 0; /* Internal connection */ else if (! options->CountPrivateBandwidth && (tor_addr_family(&conn->addr) == AF_UNSPEC || /* no address */ + tor_addr_family(&conn->addr) == AF_UNIX || /* no address */ tor_addr_is_internal(&conn->addr, 0))) return 0; /* Internal address */ else @@ -3839,6 +3969,8 @@ connection_handle_write_impl(connection_t *conn, int force) tor_tls_get_n_raw_bytes(or_conn->tls, &n_read, &n_written); log_debug(LD_GENERAL, "After TLS write of %d: %ld read, %ld written", result, (long)n_read, (long)n_written); + or_conn->bytes_xmitted += result; + or_conn->bytes_xmitted_by_tls += n_written; /* So we notice bytes were written even on error */ /* XXXX024 This cast is safe since we can never write INT_MAX bytes in a * single set of TLS operations. But it looks kinda ugly. If we refactor @@ -4439,8 +4571,6 @@ connection_process_inbuf(connection_t *conn, int package_partial) package_partial); case CONN_TYPE_DIR: return connection_dir_process_inbuf(TO_DIR_CONN(conn)); - case CONN_TYPE_CPUWORKER: - return connection_cpu_process_inbuf(conn); case CONN_TYPE_CONTROL: return connection_control_process_inbuf(TO_CONTROL_CONN(conn)); default: @@ -4500,8 +4630,6 @@ connection_finished_flushing(connection_t *conn) return connection_edge_finished_flushing(TO_EDGE_CONN(conn)); case CONN_TYPE_DIR: return connection_dir_finished_flushing(TO_DIR_CONN(conn)); - case CONN_TYPE_CPUWORKER: - return connection_cpu_finished_flushing(conn); case CONN_TYPE_CONTROL: return connection_control_finished_flushing(TO_CONTROL_CONN(conn)); default: @@ -4557,8 +4685,6 @@ connection_reached_eof(connection_t *conn) return connection_edge_reached_eof(TO_EDGE_CONN(conn)); case CONN_TYPE_DIR: return connection_dir_reached_eof(TO_DIR_CONN(conn)); - case CONN_TYPE_CPUWORKER: - return connection_cpu_reached_eof(conn); case CONN_TYPE_CONTROL: return connection_control_reached_eof(TO_CONTROL_CONN(conn)); default: @@ -4764,10 +4890,6 @@ assert_connection_ok(connection_t *conn, time_t now) tor_assert(conn->purpose >= DIR_PURPOSE_MIN_); tor_assert(conn->purpose <= DIR_PURPOSE_MAX_); break; - case CONN_TYPE_CPUWORKER: - tor_assert(conn->state >= CPUWORKER_STATE_MIN_); - tor_assert(conn->state <= CPUWORKER_STATE_MAX_); - break; case CONN_TYPE_CONTROL: tor_assert(conn->state >= CONTROL_CONN_STATE_MIN_); tor_assert(conn->state <= CONTROL_CONN_STATE_MAX_); @@ -4868,9 +4990,7 @@ proxy_type_to_string(int proxy_type) } /** Call connection_free_() on every connection in our array, and release all - * storage held by connection.c. This is used by cpuworkers and dnsworkers - * when they fork, so they don't keep resources held open (especially - * sockets). + * storage held by connection.c. * * Don't do the checks in connection_free(), because they will * fail. diff --git a/src/or/connection.h b/src/or/connection.h index 7cdfd3e253..50bea51e5b 100644 --- a/src/or/connection.h +++ b/src/or/connection.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -89,6 +89,13 @@ int connection_connect(connection_t *conn, const char *address, const tor_addr_t *addr, uint16_t port, int *socket_error); +#ifdef HAVE_SYS_UN_H + +int connection_connect_unix(connection_t *conn, const char *socket_path, + int *socket_error); + +#endif /* defined(HAVE_SYS_UN_H) */ + /** Maximum size of information that we can fit into SOCKS5 username or password fields. */ #define MAX_SOCKS5_AUTH_FIELD_SIZE 255 diff --git a/src/or/connection_edge.c b/src/or/connection_edge.c index 14b391180e..9690653d59 100644 --- a/src/or/connection_edge.c +++ b/src/or/connection_edge.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -46,6 +46,19 @@ #ifdef HAVE_LINUX_NETFILTER_IPV4_H #include <linux/netfilter_ipv4.h> #define TRANS_NETFILTER +#define TRANS_NETFILTER_IPV4 +#endif + +#ifdef HAVE_LINUX_IF_H +#include <linux/if.h> +#endif + +#ifdef HAVE_LINUX_NETFILTER_IPV6_IP6_TABLES_H +#include <linux/netfilter_ipv6/ip6_tables.h> +#if defined(IP6T_SO_ORIGINAL_DST) +#define TRANS_NETFILTER +#define TRANS_NETFILTER_IPV6 +#endif #endif #if defined(HAVE_NET_IF_H) && defined(HAVE_NET_PFVAR_H) @@ -744,8 +757,9 @@ connection_ap_fail_onehop(const char *failed_digest, /* we don't know the digest; have to compare addr:port */ tor_addr_t addr; if (!build_state || !build_state->chosen_exit || - !entry_conn->socks_request || !entry_conn->socks_request->address) + !entry_conn->socks_request) { continue; + } if (tor_addr_parse(&addr, entry_conn->socks_request->address)<0 || !tor_addr_eq(&build_state->chosen_exit->addr, &addr) || build_state->chosen_exit->port != entry_conn->socks_request->port) @@ -894,78 +908,102 @@ connection_ap_rewrite_and_attach_if_allowed(entry_connection_t *conn, return connection_ap_handshake_rewrite_and_attach(conn, circ, cpath); } -/** Connection <b>conn</b> just finished its socks handshake, or the - * controller asked us to take care of it. If <b>circ</b> is defined, - * then that's where we'll want to attach it. Otherwise we have to - * figure it out ourselves. - * - * First, parse whether it's a .exit address, remap it, and so on. Then - * if it's for a general circuit, try to attach it to a circuit (or launch - * one as needed), else if it's for a rendezvous circuit, fetch a - * rendezvous descriptor first (or attach/launch a circuit if the - * rendezvous descriptor is already here and fresh enough). - * - * The stream will exit from the hop - * indicated by <b>cpath</b>, or from the last hop in circ's cpath if - * <b>cpath</b> is NULL. +/* Try to perform any map-based rewriting of the target address in + * <b>conn</b>, filling in the fields of <b>out</b> as we go, and modifying + * conn->socks_request.address as appropriate. */ -int -connection_ap_handshake_rewrite_and_attach(entry_connection_t *conn, - origin_circuit_t *circ, - crypt_path_t *cpath) +STATIC void +connection_ap_handshake_rewrite(entry_connection_t *conn, + rewrite_result_t *out) { socks_request_t *socks = conn->socks_request; - hostname_type_t addresstype; const or_options_t *options = get_options(); tor_addr_t addr_tmp; - /* We set this to true if this is an address we should automatically - * remap to a local address in VirtualAddrNetwork */ - int automap = 0; - char orig_address[MAX_SOCKS_ADDR_LEN]; - time_t map_expires = TIME_MAX; - time_t now = time(NULL); - connection_t *base_conn = ENTRY_TO_CONN(conn); - addressmap_entry_source_t exit_source = ADDRMAPSRC_NONE; - tor_strlower(socks->address); /* normalize it */ - strlcpy(orig_address, socks->address, sizeof(orig_address)); + /* Initialize all the fields of 'out' to reasonable defaults */ + out->automap = 0; + out->exit_source = ADDRMAPSRC_NONE; + out->map_expires = TIME_MAX; + out->end_reason = 0; + out->should_close = 0; + out->orig_address[0] = 0; + + /* We convert all incoming addresses to lowercase. */ + tor_strlower(socks->address); + /* Remember the original address. */ + strlcpy(out->orig_address, socks->address, sizeof(out->orig_address)); log_debug(LD_APP,"Client asked for %s:%d", safe_str_client(socks->address), socks->port); + /* Check for whether this is a .exit address. By default, those are + * disallowed when they're coming straight from the client, but you're + * allowed to have them in MapAddress commands and so forth. */ if (!strcmpend(socks->address, ".exit") && !options->AllowDotExit) { log_warn(LD_APP, "The \".exit\" notation is disabled in Tor due to " "security risks. Set AllowDotExit in your torrc to enable " "it (at your own risk)."); control_event_client_status(LOG_WARN, "SOCKS_BAD_HOSTNAME HOSTNAME=%s", escaped(socks->address)); - connection_mark_unattached_ap(conn, END_STREAM_REASON_TORPROTOCOL); - return -1; + out->end_reason = END_STREAM_REASON_TORPROTOCOL; + out->should_close = 1; + return; } - if (! conn->original_dest_address) + /* Remember the original address so we can tell the user about what + * they actually said, not just what it turned into. */ + if (! conn->original_dest_address) { + /* Is the 'if' necessary here? XXXX */ conn->original_dest_address = tor_strdup(conn->socks_request->address); + } + /* First, apply MapAddress and MAPADDRESS mappings. We need to do + * these only for non-reverse lookups, since they don't exist for those. + * We need to do this before we consider automapping, since we might + * e.g. resolve irc.oftc.net into irconionaddress.onion, at which point + * we'd need to automap it. */ + if (socks->command != SOCKS_COMMAND_RESOLVE_PTR) { + const unsigned rewrite_flags = AMR_FLAG_USE_MAPADDRESS; + if (addressmap_rewrite(socks->address, sizeof(socks->address), + rewrite_flags, &out->map_expires, &out->exit_source)) { + control_event_stream_status(conn, STREAM_EVENT_REMAP, + REMAP_STREAM_SOURCE_CACHE); + } + } + + /* Now, handle automapping. Automapping happens when we're asked to + * resolve a hostname, and AutomapHostsOnResolve is set, and + * the hostname has a suffix listed in AutomapHostsSuffixes. + */ if (socks->command == SOCKS_COMMAND_RESOLVE && tor_addr_parse(&addr_tmp, socks->address)<0 && options->AutomapHostsOnResolve) { - automap = addressmap_address_should_automap(socks->address, options); - if (automap) { + /* Check the suffix... */ + out->automap = addressmap_address_should_automap(socks->address, options); + if (out->automap) { + /* If we get here, then we should apply an automapping for this. */ const char *new_addr; + /* We return an IPv4 address by default, or an IPv6 address if we + * are allowed to do so. */ int addr_type = RESOLVED_TYPE_IPV4; if (conn->socks_request->socks_version != 4) { - if (!conn->ipv4_traffic_ok || - (conn->ipv6_traffic_ok && conn->prefer_ipv6_traffic) || - conn->prefer_ipv6_virtaddr) + if (!conn->entry_cfg.ipv4_traffic || + (conn->entry_cfg.ipv6_traffic && conn->entry_cfg.prefer_ipv6) || + conn->entry_cfg.prefer_ipv6_virtaddr) addr_type = RESOLVED_TYPE_IPV6; } + /* Okay, register the target address as automapped, and find the new + * address we're supposed to give as a resolve answer. (Return a cached + * value if we've looked up this address before. + */ new_addr = addressmap_register_virtual_address( addr_type, tor_strdup(socks->address)); if (! new_addr) { log_warn(LD_APP, "Unable to automap address %s", escaped_safe_str(socks->address)); - connection_mark_unattached_ap(conn, END_STREAM_REASON_INTERNAL); - return -1; + out->end_reason = END_STREAM_REASON_INTERNAL; + out->should_close = 1; + return; } log_info(LD_APP, "Automapping %s to %s", escaped_safe_str_client(socks->address), @@ -974,28 +1012,35 @@ connection_ap_handshake_rewrite_and_attach(entry_connection_t *conn, } } + /* Now handle reverse lookups, if they're in the cache. This doesn't + * happen too often, since client-side DNS caching is off by default. */ if (socks->command == SOCKS_COMMAND_RESOLVE_PTR) { unsigned rewrite_flags = 0; - if (conn->use_cached_ipv4_answers) + if (conn->entry_cfg.use_cached_ipv4_answers) rewrite_flags |= AMR_FLAG_USE_IPV4_DNS; - if (conn->use_cached_ipv6_answers) + if (conn->entry_cfg.use_cached_ipv6_answers) rewrite_flags |= AMR_FLAG_USE_IPV6_DNS; if (addressmap_rewrite_reverse(socks->address, sizeof(socks->address), - rewrite_flags, &map_expires)) { + rewrite_flags, &out->map_expires)) { char *result = tor_strdup(socks->address); /* remember _what_ is supposed to have been resolved. */ tor_snprintf(socks->address, sizeof(socks->address), "REVERSE[%s]", - orig_address); + out->orig_address); connection_ap_handshake_socks_resolved(conn, RESOLVED_TYPE_HOSTNAME, strlen(result), (uint8_t*)result, -1, - map_expires); - connection_mark_unattached_ap(conn, - END_STREAM_REASON_DONE | - END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED); - return 0; + out->map_expires); + tor_free(result); + out->end_reason = END_STREAM_REASON_DONE | + END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED; + out->should_close = 1; + return; } + + /* Hang on, did we find an answer saying that this is a reverse lookup for + * an internal address? If so, we should reject it if we're condigured to + * do so. */ if (options->ClientDNSRejectInternalAddresses) { /* Don't let people try to do a reverse lookup on 10.0.0.1. */ tor_addr_t addr; @@ -1005,43 +1050,108 @@ connection_ap_handshake_rewrite_and_attach(entry_connection_t *conn, if (ok == 1 && tor_addr_is_internal(&addr, 0)) { connection_ap_handshake_socks_resolved(conn, RESOLVED_TYPE_ERROR, 0, NULL, -1, TIME_MAX); - connection_mark_unattached_ap(conn, - END_STREAM_REASON_SOCKSPROTOCOL | - END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED); - return -1; + out->end_reason = END_STREAM_REASON_SOCKSPROTOCOL | + END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED; + out->should_close = 1; + return; } } - } else if (!automap) { - /* For address map controls, remap the address. */ - unsigned rewrite_flags = 0; - if (conn->use_cached_ipv4_answers) + } + + /* If we didn't automap it before, then this is still the address + * that came straight from the user, mapped according to any + * MapAddress/MAPADDRESS commands. Now other mappings, including + * previously registered Automap entries, TrackHostExits entries, + * and client-side DNS cache entries (not recommended). + */ + if (socks->command != SOCKS_COMMAND_RESOLVE_PTR && + !out->automap) { + unsigned rewrite_flags = AMR_FLAG_USE_AUTOMAP | AMR_FLAG_USE_TRACKEXIT; + addressmap_entry_source_t exit_source2; + if (conn->entry_cfg.use_cached_ipv4_answers) rewrite_flags |= AMR_FLAG_USE_IPV4_DNS; - if (conn->use_cached_ipv6_answers) + if (conn->entry_cfg.use_cached_ipv6_answers) rewrite_flags |= AMR_FLAG_USE_IPV6_DNS; if (addressmap_rewrite(socks->address, sizeof(socks->address), - rewrite_flags, &map_expires, &exit_source)) { + rewrite_flags, &out->map_expires, &exit_source2)) { control_event_stream_status(conn, STREAM_EVENT_REMAP, REMAP_STREAM_SOURCE_CACHE); } + if (out->exit_source == ADDRMAPSRC_NONE) { + /* If it wasn't a .exit before, maybe it turned into a .exit. Remember + * the original source of a .exit. */ + out->exit_source = exit_source2; + } } - if (!automap && address_is_in_virtual_range(socks->address)) { - /* This address was probably handed out by client_dns_get_unmapped_address, - * but the mapping was discarded for some reason. We *don't* want to send - * the address through Tor; that's likely to fail, and may leak - * information. + /* Check to see whether we're about to use an address in the virtual + * range without actually having gotten it from an Automap. */ + if (!out->automap && address_is_in_virtual_range(socks->address)) { + /* This address was probably handed out by + * client_dns_get_unmapped_address, but the mapping was discarded for some + * reason. Or the user typed in a virtual address range manually. We + * *don't* want to send the address through Tor; that's likely to fail, + * and may leak information. */ log_warn(LD_APP,"Missing mapping for virtual address '%s'. Refusing.", safe_str_client(socks->address)); - connection_mark_unattached_ap(conn, END_STREAM_REASON_INTERNAL); - return -1; + out->end_reason = END_STREAM_REASON_INTERNAL; + out->should_close = 1; + return; + } +} + +/** Connection <b>conn</b> just finished its socks handshake, or the + * controller asked us to take care of it. If <b>circ</b> is defined, + * then that's where we'll want to attach it. Otherwise we have to + * figure it out ourselves. + * + * First, parse whether it's a .exit address, remap it, and so on. Then + * if it's for a general circuit, try to attach it to a circuit (or launch + * one as needed), else if it's for a rendezvous circuit, fetch a + * rendezvous descriptor first (or attach/launch a circuit if the + * rendezvous descriptor is already here and fresh enough). + * + * The stream will exit from the hop + * indicated by <b>cpath</b>, or from the last hop in circ's cpath if + * <b>cpath</b> is NULL. + */ +int +connection_ap_handshake_rewrite_and_attach(entry_connection_t *conn, + origin_circuit_t *circ, + crypt_path_t *cpath) +{ + socks_request_t *socks = conn->socks_request; + const or_options_t *options = get_options(); + connection_t *base_conn = ENTRY_TO_CONN(conn); + time_t now = time(NULL); + rewrite_result_t rr; + + memset(&rr, 0, sizeof(rr)); + connection_ap_handshake_rewrite(conn,&rr); + + if (rr.should_close) { + /* connection_ap_handshake_rewrite told us to close the connection, + * either because it sent back an answer, or because it sent back an + * error */ + connection_mark_unattached_ap(conn, rr.end_reason); + if (END_STREAM_REASON_DONE == (rr.end_reason & END_STREAM_REASON_MASK)) + return 0; + else + return -1; } + const time_t map_expires = rr.map_expires; + const int automap = rr.automap; + const addressmap_entry_source_t exit_source = rr.exit_source; + /* Parse the address provided by SOCKS. Modify it in-place if it * specifies a hidden-service (.onion) or particular exit node (.exit). */ - addresstype = parse_extended_hostname(socks->address); + const hostname_type_t addresstype = parse_extended_hostname(socks->address); + /* Now see whether the hostname is bogus. This could happen because of an + * onion hostname whose format we don't recognize. */ if (addresstype == BAD_HOSTNAME) { control_event_client_status(LOG_WARN, "SOCKS_BAD_HOSTNAME HOSTNAME=%s", escaped(socks->address)); @@ -1049,16 +1159,21 @@ connection_ap_handshake_rewrite_and_attach(entry_connection_t *conn, return -1; } + /* If this is a .exit hostname, strip off the .name.exit part, and + * see whether we're going to connect there, and otherwise handle it. + * (The ".exit" part got stripped off by "parse_extended_hostname"). + * + * We'll set chosen_exit_name and/or close the connection as appropriate. + */ if (addresstype == EXIT_HOSTNAME) { - /* foo.exit -- modify conn->chosen_exit_node to specify the exit - * node, and conn->address to hold only the address portion. */ - char *s = strrchr(socks->address,'.'); - - /* If StrictNodes is not set, then .exit overrides ExcludeNodes. */ + /* If StrictNodes is not set, then .exit overrides ExcludeNodes but + * not ExcludeExitNodes. */ routerset_t *excludeset = options->StrictNodes ? options->ExcludeExitNodesUnion_ : options->ExcludeExitNodes; - const node_t *node; + const node_t *node = NULL; + /* If this .exit was added by an AUTOMAP, then it came straight from + * a user. Make sure that options->AllowDotExit permits that. */ if (exit_source == ADDRMAPSRC_AUTOMAP && !options->AllowDotExit) { /* Whoops; this one is stale. It must have gotten added earlier, * when AllowDotExit was on. */ @@ -1071,6 +1186,8 @@ connection_ap_handshake_rewrite_and_attach(entry_connection_t *conn, return -1; } + /* Double-check to make sure there are no .exits coming from + * impossible/weird sources. */ if (exit_source == ADDRMAPSRC_DNS || (exit_source == ADDRMAPSRC_NONE && !options->AllowDotExit)) { /* It shouldn't be possible to get a .exit address from any of these @@ -1085,9 +1202,12 @@ connection_ap_handshake_rewrite_and_attach(entry_connection_t *conn, } tor_assert(!automap); + /* Now, find the character before the .(name) part. */ + char *s = strrchr(socks->address,'.'); if (s) { /* The address was of the form "(stuff).(name).exit */ if (s[1] != '\0') { + /* Looks like a real .exit one. */ conn->chosen_exit_name = tor_strdup(s+1); node = node_get_by_nickname(conn->chosen_exit_name, 1); @@ -1106,7 +1226,8 @@ connection_ap_handshake_rewrite_and_attach(entry_connection_t *conn, return -1; } } else { - /* It looks like they just asked for "foo.exit". */ + /* It looks like they just asked for "foo.exit". That's a special + * form that means (foo's address).foo.exit. */ conn->chosen_exit_name = tor_strdup(socks->address); node = node_get_by_nickname(conn->chosen_exit_name, 1); @@ -1115,6 +1236,7 @@ connection_ap_handshake_rewrite_and_attach(entry_connection_t *conn, node_get_address_string(node, socks->address, sizeof(socks->address)); } } + /* Now make sure that the chosen exit exists... */ if (!node) { log_warn(LD_APP, @@ -1136,8 +1258,12 @@ connection_ap_handshake_rewrite_and_attach(entry_connection_t *conn, implies no. */ } + /* Now, handle everything that isn't a .onion address. */ if (addresstype != ONION_HOSTNAME) { - /* not a hidden-service request (i.e. normal or .exit) */ + /* Not a hidden-service request. It's either a hostname or an IP, + * possibly with a .exit that we stripped off. */ + + /* Check for funny characters in the address. */ if (address_is_invalid_destination(socks->address, 1)) { control_event_client_status(LOG_WARN, "SOCKS_BAD_HOSTNAME HOSTNAME=%s", escaped(socks->address)); @@ -1148,6 +1274,8 @@ connection_ap_handshake_rewrite_and_attach(entry_connection_t *conn, return -1; } + /* If we're running in Tor2webMode, we don't allow anything BUT .onion + * addresses. */ if (options->Tor2webMode) { log_warn(LD_APP, "Refusing to connect to non-hidden-service hostname %s " "because tor2web mode is enabled.", @@ -1156,12 +1284,15 @@ connection_ap_handshake_rewrite_and_attach(entry_connection_t *conn, return -1; } + /* See if this is a hostname lookup that we can answer immediately. + * (For example, an attempt to look up the IP address for an IP address.) + */ if (socks->command == SOCKS_COMMAND_RESOLVE) { tor_addr_t answer; /* Reply to resolves immediately if we can. */ if (tor_addr_parse(&answer, socks->address) >= 0) {/* is it an IP? */ /* remember _what_ is supposed to have been resolved. */ - strlcpy(socks->address, orig_address, sizeof(socks->address)); + strlcpy(socks->address, rr.orig_address, sizeof(socks->address)); connection_ap_handshake_socks_resolved_addr(conn, &answer, -1, map_expires); connection_mark_unattached_ap(conn, @@ -1172,14 +1303,22 @@ connection_ap_handshake_rewrite_and_attach(entry_connection_t *conn, tor_assert(!automap); rep_hist_note_used_resolve(now); /* help predict this next time */ } else if (socks->command == SOCKS_COMMAND_CONNECT) { + /* Special handling for attempts to connect */ tor_assert(!automap); + /* Don't allow connections to port 0. */ if (socks->port == 0) { log_notice(LD_APP,"Application asked to connect to port 0. Refusing."); connection_mark_unattached_ap(conn, END_STREAM_REASON_TORPROTOCOL); return -1; } + /* You can't make connections to internal addresses, by default. + * Exceptions are begindir requests (where the address is meaningless, + * or cases where you've hand-configured a particular exit, thereby + * making the local address meaningful. */ if (options->ClientRejectInternalAddresses && !conn->use_begindir && !conn->chosen_exit_name && !circ) { + /* If we reach this point then we don't want to allow internal + * addresses. Check if we got one. */ tor_addr_t addr; if (tor_addr_hostname_is_local(socks->address) || (tor_addr_parse(&addr, socks->address) >= 0 && @@ -1214,39 +1353,58 @@ connection_ap_handshake_rewrite_and_attach(entry_connection_t *conn, connection_mark_unattached_ap(conn, END_STREAM_REASON_PRIVATE_ADDR); return -1; } - } + } /* end "if we should check for internal addresses" */ + /* Okay. We're still doing a CONNECT, and it wasn't a private + * address. Do special handling for literal IP addresses */ { tor_addr_t addr; /* XXX Duplicate call to tor_addr_parse. */ if (tor_addr_parse(&addr, socks->address) >= 0) { + /* If we reach this point, it's an IPv4 or an IPv6 address. */ sa_family_t family = tor_addr_family(&addr); - if ((family == AF_INET && ! conn->ipv4_traffic_ok) || - (family == AF_INET6 && ! conn->ipv4_traffic_ok)) { + + if ((family == AF_INET && ! conn->entry_cfg.ipv4_traffic) || + (family == AF_INET6 && ! conn->entry_cfg.ipv6_traffic)) { + /* You can't do an IPv4 address on a v6-only socks listener, + * or vice versa. */ log_warn(LD_NET, "Rejecting SOCKS request for an IP address " "family that this listener does not support."); connection_mark_unattached_ap(conn, END_STREAM_REASON_ENTRYPOLICY); return -1; } else if (family == AF_INET6 && socks->socks_version == 4) { + /* You can't make a socks4 request to an IPv6 address. Socks4 + * doesn't support that. */ log_warn(LD_NET, "Rejecting SOCKS4 request for an IPv6 address."); connection_mark_unattached_ap(conn, END_STREAM_REASON_ENTRYPOLICY); return -1; - } else if (socks->socks_version == 4 && !conn->ipv4_traffic_ok) { + } else if (socks->socks_version == 4 && + !conn->entry_cfg.ipv4_traffic) { + /* You can't do any kind of Socks4 request when IPv4 is forbidden. + * + * XXX raise this check outside the enclosing block? */ log_warn(LD_NET, "Rejecting SOCKS4 request on a listener with " "no IPv4 traffic supported."); connection_mark_unattached_ap(conn, END_STREAM_REASON_ENTRYPOLICY); return -1; } else if (family == AF_INET6) { - conn->ipv4_traffic_ok = 0; + /* Tell the exit: we won't accept any ipv4 connection to an IPv6 + * address. */ + conn->entry_cfg.ipv4_traffic = 0; } else if (family == AF_INET) { - conn->ipv6_traffic_ok = 0; + /* Tell the exit: we won't accept any ipv6 connection to an IPv4 + * address. */ + conn->entry_cfg.ipv6_traffic = 0; } } } if (socks->socks_version == 4) - conn->ipv6_traffic_ok = 0; + conn->entry_cfg.ipv6_traffic = 0; + /* Still handling CONNECT. Now, check for exit enclaves. (Which we + * don't do on BEGINDIR, or there is a chosen exit.) + */ if (!conn->use_begindir && !conn->chosen_exit_name && !circ) { /* see if we can find a suitable enclave exit */ const node_t *r = @@ -1263,11 +1421,13 @@ connection_ap_handshake_rewrite_and_attach(entry_connection_t *conn, } } - /* warn or reject if it's using a dangerous port */ + /* Still handling CONNECT: warn or reject if it's using a dangerous + * port. */ if (!conn->use_begindir && !conn->chosen_exit_name && !circ) if (consider_plaintext_ports(conn, socks->port) < 0) return -1; + /* Remember the port so that we do predicted requests there. */ if (!conn->use_begindir) { /* help predict this next time */ rep_hist_note_used_port(now, socks->port); @@ -1276,25 +1436,41 @@ connection_ap_handshake_rewrite_and_attach(entry_connection_t *conn, rep_hist_note_used_resolve(now); /* help predict this next time */ /* no extra processing needed */ } else { + /* We should only be doing CONNECT or RESOLVE! */ tor_fragile_assert(); } + + /* Okay. At this point we've set chosen_exit_name if needed, rewritten the + * address, and decided not to reject it for any number of reasons. Now + * mark the connection as waiting for a circuit, and try to attach it! + */ base_conn->state = AP_CONN_STATE_CIRCUIT_WAIT; - if ((circ && connection_ap_handshake_attach_chosen_circuit( - conn, circ, cpath) < 0) || - (!circ && - connection_ap_handshake_attach_circuit(conn) < 0)) { + + /* If we were given a circuit to attach to, try to attach. Otherwise, + * try to find a good one and attach to that. */ + int rv; + if (circ) + rv = connection_ap_handshake_attach_chosen_circuit(conn, circ, cpath); + else + rv = connection_ap_handshake_attach_circuit(conn); + + /* If the above function returned 0 then we're waiting for a circuit. + * if it returned 1, we're attached. Both are okay. But if it returned + * -1, there was an error, so make sure the connection is marked, and + * return -1. */ + if (rv < 0) { if (!base_conn->marked_for_close) connection_mark_unattached_ap(conn, END_STREAM_REASON_CANT_ATTACH); return -1; } + return 0; } else { - /* it's a hidden-service request */ - rend_cache_entry_t *entry; - int r; - rend_service_authorization_t *client_auth; - rend_data_t *rend_data; + /* If we get here, it's a request for a .onion address! */ tor_assert(!automap); + + /* Check whether it's RESOLVE or RESOLVE_PTR. We don't handle those + * for hidden service addresses. */ if (SOCKS_COMMAND_IS_RESOLVE(socks->command)) { /* if it's a resolve request, fail it right now, rather than * building all the circuits and then realizing it won't work. */ @@ -1308,6 +1484,8 @@ connection_ap_handshake_rewrite_and_attach(entry_connection_t *conn, return -1; } + /* If we were passed a circuit, then we need to fail. .onion addresses + * only work when we launch our own circuits for now. */ if (circ) { log_warn(LD_CONTROL, "Attachstream to a circuit is not " "supported for .onion addresses currently. Failing."); @@ -1315,15 +1493,22 @@ connection_ap_handshake_rewrite_and_attach(entry_connection_t *conn, return -1; } - ENTRY_TO_EDGE_CONN(conn)->rend_data = rend_data = + /* Fill in the rend_data field so we can start doing a connection to + * a hidden service. */ + rend_data_t *rend_data = ENTRY_TO_EDGE_CONN(conn)->rend_data = tor_malloc_zero(sizeof(rend_data_t)); strlcpy(rend_data->onion_address, socks->address, sizeof(rend_data->onion_address)); log_info(LD_REND,"Got a hidden service request for ID '%s'", safe_str_client(rend_data->onion_address)); - /* see if we already have it cached */ - r = rend_cache_lookup_entry(rend_data->onion_address, -1, &entry); - if (r<0) { + + /* see if we already have a hidden service descriptor cached for this + * address. */ + rend_cache_entry_t *entry = NULL; + const int rend_cache_lookup_result = + rend_cache_lookup_entry(rend_data->onion_address, -1, &entry); + if (rend_cache_lookup_result < 0) { + /* We should already have rejected this address! */ log_warn(LD_BUG,"Invalid service name '%s'", safe_str_client(rend_data->onion_address)); connection_mark_unattached_ap(conn, END_STREAM_REASON_TORPROTOCOL); @@ -1334,8 +1519,10 @@ connection_ap_handshake_rewrite_and_attach(entry_connection_t *conn, * a stable circuit yet, but we know we'll need *something*. */ rep_hist_note_used_internal(now, 0, 1); - /* Look up if we have client authorization for it. */ - client_auth = rend_client_lookup_service_authorization( + /* Look up if we have client authorization configured for this hidden + * service. If we do, associate it with the rend_data. */ + rend_service_authorization_t *client_auth = + rend_client_lookup_service_authorization( rend_data->onion_address); if (client_auth) { log_info(LD_REND, "Using previously configured client authorization " @@ -1344,12 +1531,16 @@ connection_ap_handshake_rewrite_and_attach(entry_connection_t *conn, client_auth->descriptor_cookie, REND_DESC_COOKIE_LEN); rend_data->auth_type = client_auth->auth_type; } - if (r==0) { + + /* Now, we either launch an attempt to connect to the hidden service, + * or we launch an attempt to look up its descriptor, depending on + * whether we had the descriptor. */ + if (rend_cache_lookup_result == 0) { base_conn->state = AP_CONN_STATE_RENDDESC_WAIT; log_info(LD_REND, "Unknown descriptor %s. Fetching.", safe_str_client(rend_data->onion_address)); rend_client_refetch_v2_renddesc(rend_data); - } else { /* r > 0 */ + } else { /* rend_cache_lookup_result > 0 */ base_conn->state = AP_CONN_STATE_CIRCUIT_WAIT; log_info(LD_REND, "Descriptor is here. Great."); if (connection_ap_handshake_attach_circuit(conn) < 0) { @@ -1360,6 +1551,7 @@ connection_ap_handshake_rewrite_and_attach(entry_connection_t *conn, } return 0; } + return 0; /* unreached but keeps the compiler happy */ } @@ -1400,10 +1592,29 @@ destination_from_socket(entry_connection_t *conn, socks_request_t *req) struct sockaddr_storage orig_dst; socklen_t orig_dst_len = sizeof(orig_dst); tor_addr_t addr; + int rv; #ifdef TRANS_NETFILTER - if (getsockopt(ENTRY_TO_CONN(conn)->s, SOL_IP, SO_ORIGINAL_DST, - (struct sockaddr*)&orig_dst, &orig_dst_len) < 0) { + switch (ENTRY_TO_CONN(conn)->socket_family) { +#ifdef TRANS_NETFILTER_IPV4 + case AF_INET: + rv = getsockopt(ENTRY_TO_CONN(conn)->s, SOL_IP, SO_ORIGINAL_DST, + (struct sockaddr*)&orig_dst, &orig_dst_len); + break; +#endif +#ifdef TRANS_NETFILTER_IPV6 + case AF_INET6: + rv = getsockopt(ENTRY_TO_CONN(conn)->s, SOL_IPV6, IP6T_SO_ORIGINAL_DST, + (struct sockaddr*)&orig_dst, &orig_dst_len); + break; +#endif + default: + log_warn(LD_BUG, + "Received transparent data from an unsuported socket family %d", + ENTRY_TO_CONN(conn)->socket_family); + return -1; + } + if (rv < 0) { int e = tor_socket_errno(ENTRY_TO_CONN(conn)->s); log_warn(LD_NET, "getsockopt() failed: %s", tor_socket_strerror(e)); return -1; @@ -1793,19 +2004,19 @@ connection_ap_get_begincell_flags(entry_connection_t *ap_conn) return 0; /* If only IPv4 is supported, no flags */ - if (ap_conn->ipv4_traffic_ok && !ap_conn->ipv6_traffic_ok) + if (ap_conn->entry_cfg.ipv4_traffic && !ap_conn->entry_cfg.ipv6_traffic) return 0; if (! cpath_layer || ! cpath_layer->extend_info) return 0; - if (!ap_conn->ipv4_traffic_ok) + if (!ap_conn->entry_cfg.ipv4_traffic) flags |= BEGIN_FLAG_IPV4_NOT_OK; exitnode = node_get_by_id(cpath_layer->extend_info->identity_digest); - if (ap_conn->ipv6_traffic_ok && exitnode) { + if (ap_conn->entry_cfg.ipv6_traffic && exitnode) { tor_addr_t a; tor_addr_make_null(&a, AF_INET6); if (compare_tor_addr_to_node_policy(&a, ap_conn->socks_request->port, @@ -1820,7 +2031,7 @@ connection_ap_get_begincell_flags(entry_connection_t *ap_conn) if (flags == BEGIN_FLAG_IPV6_OK) { /* When IPv4 and IPv6 are both allowed, consider whether to say we * prefer IPv6. Otherwise there's no point in declaring a preference */ - if (ap_conn->prefer_ipv6_traffic) + if (ap_conn->entry_cfg.prefer_ipv6) flags |= BEGIN_FLAG_IPV6_PREFERRED; } @@ -2057,8 +2268,8 @@ connection_ap_make_link(connection_t *partner, /* Populate isolation fields. */ conn->socks_request->listener_type = CONN_TYPE_DIR_LISTENER; conn->original_dest_address = tor_strdup(address); - conn->session_group = session_group; - conn->isolation_flags = isolation_flags; + conn->entry_cfg.session_group = session_group; + conn->entry_cfg.isolation_flags = isolation_flags; base_conn->address = tor_strdup("(Tor_internal)"); tor_addr_make_unspec(&base_conn->addr); @@ -2461,7 +2672,7 @@ connection_exit_begin_conn(cell_t *cell, circuit_t *circ) relay_header_unpack(&rh, cell->payload); if (rh.length > RELAY_PAYLOAD_SIZE) - return -1; + return -END_CIRC_REASON_TORPROTOCOL; /* Note: we have to use relay_send_command_from_edge here, not * connection_edge_end or connection_edge_send_command, since those require @@ -2479,7 +2690,7 @@ connection_exit_begin_conn(cell_t *cell, circuit_t *circ) r = begin_cell_parse(cell, &bcell, &end_reason); if (r < -1) { - return -1; + return -END_CIRC_REASON_TORPROTOCOL; } else if (r == -1) { tor_free(bcell.address); relay_send_end_cell_from_edge(rh.stream_id, circ, end_reason, NULL); @@ -2577,15 +2788,31 @@ connection_exit_begin_conn(cell_t *cell, circuit_t *circ) n_stream->rend_data = rend_data_dup(origin_circ->rend_data); tor_assert(connection_edge_is_rendezvous_stream(n_stream)); assert_circuit_ok(circ); - if (rend_service_set_connection_addr_port(n_stream, origin_circ) < 0) { + + const int r = rend_service_set_connection_addr_port(n_stream, origin_circ); + if (r < 0) { log_info(LD_REND,"Didn't find rendezvous service (port %d)", n_stream->base_.port); + /* Send back reason DONE because we want to make hidden service port + * scanning harder thus instead of returning that the exit policy + * didn't match, which makes it obvious that the port is closed, + * return DONE and kill the circuit. That way, a user (malicious or + * not) needs one circuit per bad port unless it matches the policy of + * the hidden service. */ relay_send_end_cell_from_edge(rh.stream_id, circ, - END_STREAM_REASON_EXITPOLICY, + END_STREAM_REASON_DONE, origin_circ->cpath->prev); connection_free(TO_CONN(n_stream)); tor_free(address); - return 0; + + /* Drop the circuit here since it might be someone deliberately + * scanning the hidden service ports. Note that this mitigates port + * scanning by adding more work on the attacker side to successfully + * scan but does not fully solve it. */ + if (r < -1) + return END_CIRC_AT_ORIGIN; + else + return 0; } assert_circuit_ok(circ); log_debug(LD_REND,"Finished assigning addr/port"); @@ -2713,7 +2940,7 @@ connection_exit_connect(edge_connection_t *edge_conn) const tor_addr_t *addr; uint16_t port; connection_t *conn = TO_CONN(edge_conn); - int socket_error = 0; + int socket_error = 0, result; if ( (!connection_edge_is_rendezvous_stream(edge_conn) && router_compare_to_my_exit_policy(&edge_conn->base_.addr, @@ -2728,14 +2955,36 @@ connection_exit_connect(edge_connection_t *edge_conn) return; } - addr = &conn->addr; - port = conn->port; +#ifdef HAVE_SYS_UN_H + if (conn->socket_family != AF_UNIX) { +#else + { +#endif /* defined(HAVE_SYS_UN_H) */ + addr = &conn->addr; + port = conn->port; + + if (tor_addr_family(addr) == AF_INET6) + conn->socket_family = AF_INET6; + + log_debug(LD_EXIT, "about to try connecting"); + result = connection_connect(conn, conn->address, + addr, port, &socket_error); +#ifdef HAVE_SYS_UN_H + } else { + /* + * In the AF_UNIX case, we expect to have already had conn->port = 1, + * tor_addr_make_unspec(conn->addr) (cf. the way we mark in the incoming + * case in connection_handle_listener_read()), and conn->address should + * have the socket path to connect to. + */ + tor_assert(conn->address && strlen(conn->address) > 0); - if (tor_addr_family(addr) == AF_INET6) - conn->socket_family = AF_INET6; + log_debug(LD_EXIT, "about to try connecting"); + result = connection_connect_unix(conn, conn->address, &socket_error); +#endif /* defined(HAVE_SYS_UN_H) */ + } - log_debug(LD_EXIT,"about to try connecting"); - switch (connection_connect(conn, conn->address, addr, port, &socket_error)) { + switch (result) { case -1: { int reason = errno_to_stream_end_reason(socket_error); connection_edge_end(edge_conn, reason); @@ -2903,10 +3152,10 @@ connection_ap_can_use_exit(const entry_connection_t *conn, const node_t *exit) addr_policy_result_t r; if (0 == tor_addr_parse(&addr, conn->socks_request->address)) { addrp = &addr; - } else if (!conn->ipv4_traffic_ok && conn->ipv6_traffic_ok) { + } else if (!conn->entry_cfg.ipv4_traffic && conn->entry_cfg.ipv6_traffic) { tor_addr_make_null(&addr, AF_INET6); addrp = &addr; - } else if (conn->ipv4_traffic_ok && !conn->ipv6_traffic_ok) { + } else if (conn->entry_cfg.ipv4_traffic && !conn->entry_cfg.ipv6_traffic) { tor_addr_make_null(&addr, AF_INET); addrp = &addr; } @@ -3012,7 +3261,7 @@ int connection_edge_compatible_with_circuit(const entry_connection_t *conn, const origin_circuit_t *circ) { - const uint8_t iso = conn->isolation_flags; + const uint8_t iso = conn->entry_cfg.isolation_flags; const socks_request_t *sr = conn->socks_request; /* If circ has never been used for an isolated connection, we can @@ -3061,7 +3310,8 @@ connection_edge_compatible_with_circuit(const entry_connection_t *conn, if ((iso & ISO_CLIENTADDR) && !tor_addr_eq(&ENTRY_TO_CONN(conn)->addr, &circ->client_addr)) return 0; - if ((iso & ISO_SESSIONGRP) && conn->session_group != circ->session_group) + if ((iso & ISO_SESSIONGRP) && + conn->entry_cfg.session_group != circ->session_group) return 0; if ((iso & ISO_NYM_EPOCH) && conn->nym_epoch != circ->nym_epoch) return 0; @@ -3100,7 +3350,7 @@ connection_edge_update_circuit_isolation(const entry_connection_t *conn, circ->client_proto_type = conn->socks_request->listener_type; circ->client_proto_socksver = conn->socks_request->socks_version; tor_addr_copy(&circ->client_addr, &ENTRY_TO_CONN(conn)->addr); - circ->session_group = conn->session_group; + circ->session_group = conn->entry_cfg.session_group; circ->nym_epoch = conn->nym_epoch; circ->socks_username = sr->username ? tor_memdup(sr->username, sr->usernamelen) : NULL; @@ -3127,7 +3377,7 @@ connection_edge_update_circuit_isolation(const entry_connection_t *conn, mixed |= ISO_CLIENTPROTO; if (!tor_addr_eq(&ENTRY_TO_CONN(conn)->addr, &circ->client_addr)) mixed |= ISO_CLIENTADDR; - if (conn->session_group != circ->session_group) + if (conn->entry_cfg.session_group != circ->session_group) mixed |= ISO_SESSIONGRP; if (conn->nym_epoch != circ->nym_epoch) mixed |= ISO_NYM_EPOCH; @@ -3135,7 +3385,7 @@ connection_edge_update_circuit_isolation(const entry_connection_t *conn, if (dry_run) return mixed; - if ((mixed & conn->isolation_flags) != 0) { + if ((mixed & conn->entry_cfg.isolation_flags) != 0) { log_warn(LD_BUG, "Updating a circuit with seemingly incompatible " "isolation flags."); } diff --git a/src/or/connection_edge.h b/src/or/connection_edge.h index 5071086a41..7c0b9c0767 100644 --- a/src/or/connection_edge.h +++ b/src/or/connection_edge.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -143,6 +143,30 @@ STATIC int begin_cell_parse(const cell_t *cell, begin_cell_t *bcell, STATIC int connected_cell_format_payload(uint8_t *payload_out, const tor_addr_t *addr, uint32_t ttl); + +typedef struct { + /** Original address, after we lowercased it but before we started + * mapping it. + */ + char orig_address[MAX_SOCKS_ADDR_LEN]; + /** True iff the address has been automatically remapped to a local + * address in VirtualAddrNetwork. (Only set true when we do a resolve + * and get a virtual address; not when we connect to the address.) */ + int automap; + /** If this connection has a .exit address, who put it there? */ + addressmap_entry_source_t exit_source; + /** If we've rewritten the address, when does this map expire? */ + time_t map_expires; + /** If we should close the connection, this is the end_reason to pass + * to connection_mark_unattached_ap */ + int end_reason; + /** True iff we should close the connection, either because of error or + * because of successful early RESOLVED reply. */ + int should_close; +} rewrite_result_t; + +STATIC void connection_ap_handshake_rewrite(entry_connection_t *conn, + rewrite_result_t *out); #endif #endif diff --git a/src/or/connection_or.c b/src/or/connection_or.c index 29b88041b7..85462d899d 100644 --- a/src/or/connection_or.c +++ b/src/or/connection_or.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -38,6 +38,8 @@ #include "router.h" #include "routerlist.h" #include "ext_orport.h" +#include "scheduler.h" + #ifdef USE_BUFFEREVENTS #include <event2/bufferevent_ssl.h> #endif @@ -574,48 +576,51 @@ connection_or_process_inbuf(or_connection_t *conn) return ret; } -/** When adding cells to an OR connection's outbuf, keep adding until the - * outbuf is at least this long, or we run out of cells. */ -#define OR_CONN_HIGHWATER (32*1024) - -/** Add cells to an OR connection's outbuf whenever the outbuf's data length - * drops below this size. */ -#define OR_CONN_LOWWATER (16*1024) - /** Called whenever we have flushed some data on an or_conn: add more data * from active circuits. */ int connection_or_flushed_some(or_connection_t *conn) { - size_t datalen, temp; - ssize_t n, flushed; - size_t cell_network_size = get_cell_network_size(conn->wide_circ_ids); + size_t datalen; + + /* The channel will want to update its estimated queue size */ + channel_update_xmit_queue_size(TLS_CHAN_TO_BASE(conn->chan)); /* If we're under the low water mark, add cells until we're just over the * high water mark. */ datalen = connection_get_outbuf_len(TO_CONN(conn)); if (datalen < OR_CONN_LOWWATER) { - while ((conn->chan) && channel_tls_more_to_flush(conn->chan)) { - /* Compute how many more cells we want at most */ - n = CEIL_DIV(OR_CONN_HIGHWATER - datalen, cell_network_size); - /* Bail out if we don't want any more */ - if (n <= 0) break; - /* We're still here; try to flush some more cells */ - flushed = channel_tls_flush_some_cells(conn->chan, n); - /* Bail out if it says it didn't flush anything */ - if (flushed <= 0) break; - /* How much in the outbuf now? */ - temp = connection_get_outbuf_len(TO_CONN(conn)); - /* Bail out if we didn't actually increase the outbuf size */ - if (temp <= datalen) break; - /* Update datalen for the next iteration */ - datalen = temp; - } + /* Let the scheduler know */ + scheduler_channel_wants_writes(TLS_CHAN_TO_BASE(conn->chan)); } return 0; } +/** This is for channeltls.c to ask how many cells we could accept if + * they were available. */ +ssize_t +connection_or_num_cells_writeable(or_connection_t *conn) +{ + size_t datalen, cell_network_size; + ssize_t n = 0; + + tor_assert(conn); + + /* + * If we're under the high water mark, we're potentially + * writeable; note this is different from the calculation above + * used to trigger when to start writing after we've stopped. + */ + datalen = connection_get_outbuf_len(TO_CONN(conn)); + if (datalen < OR_CONN_HIGHWATER) { + cell_network_size = get_cell_network_size(conn->wide_circ_ids); + n = CEIL_DIV(OR_CONN_HIGHWATER - datalen, cell_network_size); + } + + return n; +} + /** Connection <b>conn</b> has finished writing and has no bytes left on * its outbuf. * @@ -1144,9 +1149,7 @@ connection_or_notify_error(or_connection_t *conn, if (conn->chan) { chan = TLS_CHAN_TO_BASE(conn->chan); /* Don't transition if we're already in closing, closed or error */ - if (!(chan->state == CHANNEL_STATE_CLOSING || - chan->state == CHANNEL_STATE_CLOSED || - chan->state == CHANNEL_STATE_ERROR)) { + if (!CHANNEL_CONDEMNED(chan)) { channel_close_for_error(chan); } } @@ -1169,10 +1172,10 @@ connection_or_notify_error(or_connection_t *conn, * * Return the launched conn, or NULL if it failed. */ -or_connection_t * -connection_or_connect(const tor_addr_t *_addr, uint16_t port, - const char *id_digest, - channel_tls_t *chan) + +MOCK_IMPL(or_connection_t *, +connection_or_connect, (const tor_addr_t *_addr, uint16_t port, + const char *id_digest, channel_tls_t *chan)) { or_connection_t *conn; const or_options_t *options = get_options(); @@ -1305,9 +1308,7 @@ connection_or_close_normally(or_connection_t *orconn, int flush) if (orconn->chan) { chan = TLS_CHAN_TO_BASE(orconn->chan); /* Don't transition if we're already in closing, closed or error */ - if (!(chan->state == CHANNEL_STATE_CLOSING || - chan->state == CHANNEL_STATE_CLOSED || - chan->state == CHANNEL_STATE_ERROR)) { + if (!CHANNEL_CONDEMNED(chan)) { channel_close_from_lower_layer(chan); } } @@ -1328,9 +1329,7 @@ connection_or_close_for_error(or_connection_t *orconn, int flush) if (orconn->chan) { chan = TLS_CHAN_TO_BASE(orconn->chan); /* Don't transition if we're already in closing, closed or error */ - if (!(chan->state == CHANNEL_STATE_CLOSING || - chan->state == CHANNEL_STATE_CLOSED || - chan->state == CHANNEL_STATE_ERROR)) { + if (!CHANNEL_CONDEMNED(chan)) { channel_close_for_error(chan); } } diff --git a/src/or/connection_or.h b/src/or/connection_or.h index 1ceabdaa4b..fc261c6bac 100644 --- a/src/or/connection_or.h +++ b/src/or/connection_or.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -24,6 +24,7 @@ void connection_or_set_bad_connections(const char *digest, int force); void connection_or_block_renegotiation(or_connection_t *conn); int connection_or_reached_eof(or_connection_t *conn); int connection_or_process_inbuf(or_connection_t *conn); +ssize_t connection_or_num_cells_writeable(or_connection_t *conn); int connection_or_flushed_some(or_connection_t *conn); int connection_or_finished_flushing(or_connection_t *conn); int connection_or_finished_connecting(or_connection_t *conn); @@ -36,9 +37,10 @@ void connection_or_connect_failed(or_connection_t *conn, int reason, const char *msg); void connection_or_notify_error(or_connection_t *conn, int reason, const char *msg); -or_connection_t *connection_or_connect(const tor_addr_t *addr, uint16_t port, - const char *id_digest, - channel_tls_t *chan); +MOCK_DECL(or_connection_t *, + connection_or_connect, + (const tor_addr_t *addr, uint16_t port, + const char *id_digest, channel_tls_t *chan)); void connection_or_close_normally(or_connection_t *orconn, int flush); void connection_or_close_for_error(or_connection_t *orconn, int flush); diff --git a/src/or/control.c b/src/or/control.c index e3f913177b..e963aeab7f 100644 --- a/src/or/control.c +++ b/src/or/control.c @@ -1,5 +1,5 @@ /* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -1263,6 +1263,7 @@ static const struct signal_t signal_table[] = { { SIGTERM, "INT" }, { SIGNEWNYM, "NEWNYM" }, { SIGCLEARDNSCACHE, "CLEARDNSCACHE"}, + { SIGHEARTBEAT, "HEARTBEAT"}, { 0, NULL }, }; @@ -1437,10 +1438,16 @@ getinfo_helper_misc(control_connection_t *conn, const char *question, (void) conn; if (!strcmp(question, "version")) { *answer = tor_strdup(get_version()); + } else if (!strcmp(question, "bw-event-cache")) { + *answer = get_bw_samples(); } else if (!strcmp(question, "config-file")) { - *answer = tor_strdup(get_torrc_fname(0)); + const char *a = get_torrc_fname(0); + if (a) + *answer = tor_strdup(a); } else if (!strcmp(question, "config-defaults-file")) { - *answer = tor_strdup(get_torrc_fname(1)); + const char *a = get_torrc_fname(1); + if (a) + *answer = tor_strdup(a); } else if (!strcmp(question, "config-text")) { *answer = options_dump(get_options(), OPTIONS_DUMP_MINIMAL); } else if (!strcmp(question, "info/names")) { @@ -1875,6 +1882,20 @@ circuit_describe_status_for_controller(origin_circuit_t *circ) smartlist_add_asprintf(descparts, "TIME_CREATED=%s", tbuf); } + // Show username and/or password if available. + if (circ->socks_username_len > 0) { + char* socks_username_escaped = esc_for_log_len(circ->socks_username, + (size_t) circ->socks_username_len); + smartlist_add_asprintf(descparts, "SOCKS_USERNAME=%s", socks_username_escaped); + tor_free(socks_username_escaped); + } + if (circ->socks_password_len > 0) { + char* socks_password_escaped = esc_for_log_len(circ->socks_password, + (size_t) circ->socks_password_len); + smartlist_add_asprintf(descparts, "SOCKS_PASSWORD=%s", socks_password_escaped); + tor_free(socks_password_escaped); + } + rv = smartlist_join_strings(descparts, " ", 0, NULL); SMARTLIST_FOREACH(descparts, char *, cp, tor_free(cp)); @@ -2015,7 +2036,7 @@ getinfo_helper_events(control_connection_t *control_conn, /* Note that status/ is not a catch-all for events; there's only supposed * to be a status GETINFO if there's a corresponding STATUS event. */ if (!strcmp(question, "status/circuit-established")) { - *answer = tor_strdup(can_complete_circuit ? "1" : "0"); + *answer = tor_strdup(have_completed_a_circuit() ? "1" : "0"); } else if (!strcmp(question, "status/enough-dir-info")) { *answer = tor_strdup(router_have_minimum_dir_info() ? "1" : "0"); } else if (!strcmp(question, "status/good-server-descriptor") || @@ -2112,6 +2133,7 @@ typedef struct getinfo_item_t { * to answer them. */ static const getinfo_item_t getinfo_items[] = { ITEM("version", misc, "The current version of Tor."), + ITEM("bw-event-cache", misc, "Cached BW events for a short interval."), ITEM("config-file", misc, "Current location of the \"torrc\" file."), ITEM("config-defaults-file", misc, "Current location of the defaults file."), ITEM("config-text", misc, @@ -2464,6 +2486,14 @@ handle_control_extendcircuit(control_connection_t *conn, uint32_t len, goto done; } + if (smartlist_len(args) < 2) { + connection_printf_to_buf(conn, + "512 syntax error: not enough arguments.\r\n"); + SMARTLIST_FOREACH(args, char *, cp, tor_free(cp)); + smartlist_free(args); + goto done; + } + smartlist_split_string(router_nicknames, smartlist_get(args,1), ",", 0, 0); SMARTLIST_FOREACH(args, char *, cp, tor_free(cp)); @@ -4146,11 +4176,29 @@ control_event_tb_empty(const char *bucket, uint32_t read_empty_time, return 0; } +/* about 5 minutes worth. */ +#define N_BW_EVENTS_TO_CACHE 300 +/* Index into cached_bw_events to next write. */ +static int next_measurement_idx = 0; +/* number of entries set in n_measurements */ +static int n_measurements = 0; +static struct cached_bw_event_s { + uint32_t n_read; + uint32_t n_written; +} cached_bw_events[N_BW_EVENTS_TO_CACHE]; + /** A second or more has elapsed: tell any interested control * connections how much bandwidth we used. */ int control_event_bandwidth_used(uint32_t n_read, uint32_t n_written) { + cached_bw_events[next_measurement_idx].n_read = n_read; + cached_bw_events[next_measurement_idx].n_written = n_written; + if (++next_measurement_idx == N_BW_EVENTS_TO_CACHE) + next_measurement_idx = 0; + if (n_measurements < N_BW_EVENTS_TO_CACHE) + ++n_measurements; + if (EVENT_IS_INTERESTING(EVENT_BANDWIDTH_USED)) { send_control_event(EVENT_BANDWIDTH_USED, ALL_FORMATS, "650 BW %lu %lu\r\n", @@ -4161,6 +4209,35 @@ control_event_bandwidth_used(uint32_t n_read, uint32_t n_written) return 0; } +STATIC char * +get_bw_samples(void) +{ + int i; + int idx = (next_measurement_idx + N_BW_EVENTS_TO_CACHE - n_measurements) + % N_BW_EVENTS_TO_CACHE; + tor_assert(0 <= idx && idx < N_BW_EVENTS_TO_CACHE); + + smartlist_t *elements = smartlist_new(); + + for (i = 0; i < n_measurements; ++i) { + tor_assert(0 <= idx && idx < N_BW_EVENTS_TO_CACHE); + const struct cached_bw_event_s *bwe = &cached_bw_events[idx]; + + smartlist_add_asprintf(elements, "%u,%u", + (unsigned)bwe->n_read, + (unsigned)bwe->n_written); + + idx = (idx + 1) % N_BW_EVENTS_TO_CACHE; + } + + char *result = smartlist_join_strings(elements, " ", 0, NULL); + + SMARTLIST_FOREACH(elements, char *, cp, tor_free(cp)); + smartlist_free(elements); + + return result; +} + /** Called when we are sending a log message to the controllers: suspend * sending further log messages to the controllers until we're done. Used by * CONN_LOG_PROTECT. */ @@ -4454,6 +4531,9 @@ control_event_signal(uintptr_t signal) case SIGCLEARDNSCACHE: signal_string = "CLEARDNSCACHE"; break; + case SIGHEARTBEAT: + signal_string = "HEARTBEAT"; + break; default: log_warn(LD_BUG, "Unrecognized signal %lu in control_event_signal", (unsigned long)signal); @@ -4803,23 +4883,43 @@ bootstrap_status_to_string(bootstrap_status_t s, const char **tag, break; case BOOTSTRAP_STATUS_REQUESTING_DESCRIPTORS: *tag = "requesting_descriptors"; - *summary = "Asking for relay descriptors"; + /* XXXX this appears to incorrectly report internal on most loads */ + *summary = router_have_consensus_path() == CONSENSUS_PATH_INTERNAL ? + "Asking for relay descriptors for internal paths" : + "Asking for relay descriptors"; break; + /* If we're sure there are no exits in the consensus, + * inform the controller by adding "internal" + * to the status summaries. + * (We only check this while loading descriptors, + * so we may not know in the earlier stages.) + * But if there are exits, we can't be sure whether + * we're creating internal or exit paths/circuits. + * XXXX Or should be use different tags or statuses + * for internal and exit/all? */ case BOOTSTRAP_STATUS_LOADING_DESCRIPTORS: *tag = "loading_descriptors"; - *summary = "Loading relay descriptors"; + *summary = router_have_consensus_path() == CONSENSUS_PATH_INTERNAL ? + "Loading relay descriptors for internal paths" : + "Loading relay descriptors"; break; case BOOTSTRAP_STATUS_CONN_OR: *tag = "conn_or"; - *summary = "Connecting to the Tor network"; + *summary = router_have_consensus_path() == CONSENSUS_PATH_INTERNAL ? + "Connecting to the Tor network internally" : + "Connecting to the Tor network"; break; case BOOTSTRAP_STATUS_HANDSHAKE_OR: *tag = "handshake_or"; - *summary = "Finishing handshake with first hop"; + *summary = router_have_consensus_path() == CONSENSUS_PATH_INTERNAL ? + "Finishing handshake with first hop of internal circuit" : + "Finishing handshake with first hop"; break; case BOOTSTRAP_STATUS_CIRCUIT_CREATE: *tag = "circuit_create"; - *summary = "Establishing a Tor circuit"; + *summary = router_have_consensus_path() == CONSENSUS_PATH_INTERNAL ? + "Establishing an internal Tor circuit" : + "Establishing a Tor circuit"; break; case BOOTSTRAP_STATUS_DONE: *tag = "done"; @@ -5096,20 +5196,30 @@ control_event_hs_descriptor_requested(const rend_data_t *rend_query, void control_event_hs_descriptor_receive_end(const char *action, const rend_data_t *rend_query, - const char *id_digest) + const char *id_digest, + const char *reason) { + char *reason_field = NULL; + if (!action || !rend_query || !id_digest) { log_warn(LD_BUG, "Called with action==%p, rend_query==%p, " "id_digest==%p", action, rend_query, id_digest); return; } + if (reason) { + tor_asprintf(&reason_field, " REASON=%s", reason); + } + send_control_event(EVENT_HS_DESC, ALL_FORMATS, - "650 HS_DESC %s %s %s %s\r\n", + "650 HS_DESC %s %s %s %s%s\r\n", action, rend_query->onion_address, rend_auth_type_to_string(rend_query->auth_type), - node_describe_longname_by_id(id_digest)); + node_describe_longname_by_id(id_digest), + reason_field ? reason_field : ""); + + tor_free(reason_field); } /** send HS_DESC RECEIVED event @@ -5125,23 +5235,27 @@ control_event_hs_descriptor_received(const rend_data_t *rend_query, rend_query, id_digest); return; } - control_event_hs_descriptor_receive_end("RECEIVED", rend_query, id_digest); + control_event_hs_descriptor_receive_end("RECEIVED", rend_query, + id_digest, NULL); } -/** send HS_DESC FAILED event - * - * called when request for hidden service descriptor returned failure. +/** Send HS_DESC event to inform controller that query <b>rend_query</b> + * failed to retrieve hidden service descriptor identified by + * <b>id_digest</b>. If <b>reason</b> is not NULL, add it to REASON= + * field. */ void control_event_hs_descriptor_failed(const rend_data_t *rend_query, - const char *id_digest) + const char *id_digest, + const char *reason) { if (!rend_query || !id_digest) { log_warn(LD_BUG, "Called with rend_query==%p, id_digest==%p", rend_query, id_digest); return; } - control_event_hs_descriptor_receive_end("FAILED", rend_query, id_digest); + control_event_hs_descriptor_receive_end("FAILED", rend_query, + id_digest, reason); } /** Free any leftover allocated memory of the control.c subsystem. */ diff --git a/src/or/control.h b/src/or/control.h index 0c92d5503d..8c9f7bbdc9 100644 --- a/src/or/control.h +++ b/src/or/control.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -108,11 +108,13 @@ void control_event_hs_descriptor_requested(const rend_data_t *rend_query, const char *hs_dir); void control_event_hs_descriptor_receive_end(const char *action, const rend_data_t *rend_query, - const char *hs_dir); + const char *hs_dir, + const char *reason); void control_event_hs_descriptor_received(const rend_data_t *rend_query, const char *hs_dir); void control_event_hs_descriptor_failed(const rend_data_t *rend_query, - const char *hs_dir); + const char *hs_dir, + const char *reason); void control_free_all(void); @@ -201,6 +203,7 @@ void append_cell_stats_by_command(smartlist_t *event_parts, const uint64_t *number_to_include); void format_cell_stats(char **event_string, circuit_t *circ, cell_stats_t *cell_stats); +STATIC char *get_bw_samples(void); #endif #endif diff --git a/src/or/cpuworker.c b/src/or/cpuworker.c index 568d9e42d8..3ddb37a262 100644 --- a/src/or/cpuworker.c +++ b/src/or/cpuworker.c @@ -1,88 +1,102 @@ /* Copyright (c) 2003-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** * \file cpuworker.c - * \brief Implements a farm of 'CPU worker' processes to perform - * CPU-intensive tasks in another thread or process, to not - * interrupt the main thread. + * \brief Uses the workqueue/threadpool code to farm CPU-intensive activities + * out to subprocesses. * * Right now, we only use this for processing onionskins. **/ #include "or.h" -#include "buffers.h" #include "channel.h" -#include "channeltls.h" #include "circuitbuild.h" #include "circuitlist.h" -#include "config.h" -#include "connection.h" #include "connection_or.h" +#include "config.h" #include "cpuworker.h" #include "main.h" #include "onion.h" #include "rephist.h" #include "router.h" +#include "workqueue.h" -/** The maximum number of cpuworker processes we will keep around. */ -#define MAX_CPUWORKERS 16 -/** The minimum number of cpuworker processes we will keep around. */ -#define MIN_CPUWORKERS 1 - -/** The tag specifies which circuit this onionskin was from. */ -#define TAG_LEN 12 +#ifdef HAVE_EVENT2_EVENT_H +#include <event2/event.h> +#else +#include <event.h> +#endif -/** How many cpuworkers we have running right now. */ -static int num_cpuworkers=0; -/** How many of the running cpuworkers have an assigned task right now. */ -static int num_cpuworkers_busy=0; -/** We need to spawn new cpuworkers whenever we rotate the onion keys - * on platforms where execution contexts==processes. This variable stores - * the last time we got a key rotation event. */ -static time_t last_rotation_time=0; +static void queue_pending_tasks(void); -static void cpuworker_main(void *data) ATTR_NORETURN; -static int spawn_cpuworker(void); -static void spawn_enough_cpuworkers(void); -static void process_pending_task(connection_t *cpuworker); +typedef struct worker_state_s { + int generation; + server_onion_keys_t *onion_keys; +} worker_state_t; -/** Initialize the cpuworker subsystem. - */ -void -cpu_init(void) +static void * +worker_state_new(void *arg) { - cpuworkers_rotate(); + worker_state_t *ws; + (void)arg; + ws = tor_malloc_zero(sizeof(worker_state_t)); + ws->onion_keys = server_onion_keys_new(); + return ws; } - -/** Called when we're done sending a request to a cpuworker. */ -int -connection_cpu_finished_flushing(connection_t *conn) +static void +worker_state_free(void *arg) { - tor_assert(conn); - tor_assert(conn->type == CONN_TYPE_CPUWORKER); - return 0; + worker_state_t *ws = arg; + server_onion_keys_free(ws->onion_keys); + tor_free(ws); } -/** Pack global_id and circ_id; set *tag to the result. (See note on - * cpuworker_main for wire format.) */ +static replyqueue_t *replyqueue = NULL; +static threadpool_t *threadpool = NULL; +static struct event *reply_event = NULL; + +static tor_weak_rng_t request_sample_rng = TOR_WEAK_RNG_INIT; + +static int total_pending_tasks = 0; +static int max_pending_tasks = 128; + static void -tag_pack(uint8_t *tag, uint64_t chan_id, circid_t circ_id) +replyqueue_process_cb(evutil_socket_t sock, short events, void *arg) { - /*XXXX RETHINK THIS WHOLE MESS !!!! !NM NM NM NM*/ - /*XXXX DOUBLEPLUSTHIS!!!! AS AS AS AS*/ - set_uint64(tag, chan_id); - set_uint32(tag+8, circ_id); + replyqueue_t *rq = arg; + (void) sock; + (void) events; + replyqueue_process(rq); } -/** Unpack <b>tag</b> into addr, port, and circ_id. +/** Initialize the cpuworker subsystem. */ -static void -tag_unpack(const uint8_t *tag, uint64_t *chan_id, circid_t *circ_id) +void +cpu_init(void) { - *chan_id = get_uint64(tag); - *circ_id = get_uint32(tag+8); + if (!replyqueue) { + replyqueue = replyqueue_new(0); + } + if (!reply_event) { + reply_event = tor_event_new(tor_libevent_get_base(), + replyqueue_get_socket(replyqueue), + EV_READ|EV_PERSIST, + replyqueue_process_cb, + replyqueue); + event_add(reply_event, NULL); + } + if (!threadpool) { + threadpool = threadpool_new(get_num_cpus(get_options()), + replyqueue, + worker_state_new, + worker_state_free, + NULL); + } + /* Total voodoo. Can we make this more sensible? */ + max_pending_tasks = get_num_cpus(get_options()) * 64; + crypto_seed_weak_rng(&request_sample_rng); } /** Magic numbers to make sure our cpuworker_requests don't grow any @@ -94,10 +108,6 @@ tag_unpack(const uint8_t *tag, uint64_t *chan_id, circid_t *circ_id) typedef struct cpuworker_request_t { /** Magic number; must be CPUWORKER_REQUEST_MAGIC. */ uint32_t magic; - /** Opaque tag to identify the job */ - uint8_t tag[TAG_LEN]; - /** Task code. Must be one of CPUWORKER_TASK_* */ - uint8_t task; /** Flag: Are we timing this request? */ unsigned timed : 1; @@ -114,8 +124,7 @@ typedef struct cpuworker_request_t { typedef struct cpuworker_reply_t { /** Magic number; must be CPUWORKER_REPLY_MAGIC. */ uint32_t magic; - /** Opaque tag to identify the job; matches the request's tag.*/ - uint8_t tag[TAG_LEN]; + /** True iff we got a successful request. */ uint8_t success; @@ -142,42 +151,39 @@ typedef struct cpuworker_reply_t { uint8_t rend_auth_material[DIGEST_LEN]; } cpuworker_reply_t; -/** Called when the onion key has changed and we need to spawn new - * cpuworkers. Close all currently idle cpuworkers, and mark the last - * rotation time as now. - */ -void -cpuworkers_rotate(void) +typedef struct cpuworker_job_u { + or_circuit_t *circ; + union { + cpuworker_request_t request; + cpuworker_reply_t reply; + } u; +} cpuworker_job_t; + +static int +update_state_threadfn(void *state_, void *work_) { - connection_t *cpuworker; - while ((cpuworker = connection_get_by_type_state(CONN_TYPE_CPUWORKER, - CPUWORKER_STATE_IDLE))) { - connection_mark_for_close(cpuworker); - --num_cpuworkers; - } - last_rotation_time = time(NULL); - if (server_mode(get_options())) - spawn_enough_cpuworkers(); + worker_state_t *state = state_; + worker_state_t *update = work_; + server_onion_keys_free(state->onion_keys); + state->onion_keys = update->onion_keys; + update->onion_keys = NULL; + ++state->generation; + return WQ_RPL_REPLY; } -/** If the cpuworker closes the connection, - * mark it as closed and spawn a new one as needed. */ -int -connection_cpu_reached_eof(connection_t *conn) +/** Called when the onion key has changed so update all CPU worker(s) with + * new function pointers with which a new state will be generated. + */ +void +cpuworkers_rotate_keyinfo(void) { - log_warn(LD_GENERAL,"Read eof. CPU worker died unexpectedly."); - if (conn->state != CPUWORKER_STATE_IDLE) { - /* the circ associated with this cpuworker will have to wait until - * it gets culled in run_connection_housekeeping(), since we have - * no way to find out which circ it was. */ - log_warn(LD_GENERAL,"...and it left a circuit queued; abandoning circ."); - num_cpuworkers_busy--; + if (threadpool_queue_update(threadpool, + worker_state_new, + update_state_threadfn, + worker_state_free, + NULL)) { + log_warn(LD_OR, "Failed to queue key update for worker threads."); } - num_cpuworkers--; - spawn_enough_cpuworkers(); /* try to regrow. hope we don't end up - spinning. */ - connection_mark_for_close(conn); - return 0; } /** Indexed by handshake type: how many onionskins have we processed and @@ -197,8 +203,6 @@ static uint64_t onionskins_usec_roundtrip[MAX_ONION_HANDSHAKE_TYPE+1]; * time. (microseconds) */ #define MAX_BELIEVABLE_ONIONSKIN_DELAY (2*1000*1000) -static tor_weak_rng_t request_sample_rng = TOR_WEAK_RNG_INIT; - /** Return true iff we'd like to measure a handshake of type * <b>onionskin_type</b>. Call only from the main thread. */ static int @@ -286,428 +290,271 @@ cpuworker_log_onionskin_overhead(int severity, int onionskin_type, onionskin_type_name, (unsigned)overhead, relative_overhead*100); } -/** Called when we get data from a cpuworker. If the answer is not complete, - * wait for a complete answer. If the answer is complete, - * process it as appropriate. - */ -int -connection_cpu_process_inbuf(connection_t *conn) -{ - uint64_t chan_id; - circid_t circ_id; - channel_t *p_chan = NULL; - circuit_t *circ; - - tor_assert(conn); - tor_assert(conn->type == CONN_TYPE_CPUWORKER); - - if (!connection_get_inbuf_len(conn)) - return 0; - - if (conn->state == CPUWORKER_STATE_BUSY_ONION) { - cpuworker_reply_t rpl; - if (connection_get_inbuf_len(conn) < sizeof(cpuworker_reply_t)) - return 0; /* not yet */ - tor_assert(connection_get_inbuf_len(conn) == sizeof(cpuworker_reply_t)); - - connection_fetch_from_buf((void*)&rpl,sizeof(cpuworker_reply_t),conn); - - tor_assert(rpl.magic == CPUWORKER_REPLY_MAGIC); - - if (rpl.timed && rpl.success && - rpl.handshake_type <= MAX_ONION_HANDSHAKE_TYPE) { - /* Time how long this request took. The handshake_type check should be - needless, but let's leave it in to be safe. */ - struct timeval tv_end, tv_diff; - int64_t usec_roundtrip; - tor_gettimeofday(&tv_end); - timersub(&tv_end, &rpl.started_at, &tv_diff); - usec_roundtrip = ((int64_t)tv_diff.tv_sec)*1000000 + tv_diff.tv_usec; - if (usec_roundtrip >= 0 && - usec_roundtrip < MAX_BELIEVABLE_ONIONSKIN_DELAY) { - ++onionskins_n_processed[rpl.handshake_type]; - onionskins_usec_internal[rpl.handshake_type] += rpl.n_usec; - onionskins_usec_roundtrip[rpl.handshake_type] += usec_roundtrip; - if (onionskins_n_processed[rpl.handshake_type] >= 500000) { - /* Scale down every 500000 handshakes. On a busy server, that's - * less impressive than it sounds. */ - onionskins_n_processed[rpl.handshake_type] /= 2; - onionskins_usec_internal[rpl.handshake_type] /= 2; - onionskins_usec_roundtrip[rpl.handshake_type] /= 2; - } - } - } - /* parse out the circ it was talking about */ - tag_unpack(rpl.tag, &chan_id, &circ_id); - circ = NULL; - log_debug(LD_OR, - "Unpacking cpuworker reply, chan_id is " U64_FORMAT - ", circ_id is %u", - U64_PRINTF_ARG(chan_id), (unsigned)circ_id); - p_chan = channel_find_by_global_id(chan_id); - - if (p_chan) - circ = circuit_get_by_circid_channel(circ_id, p_chan); - - if (rpl.success == 0) { - log_debug(LD_OR, - "decoding onionskin failed. " - "(Old key or bad software.) Closing."); - if (circ) - circuit_mark_for_close(circ, END_CIRC_REASON_TORPROTOCOL); - goto done_processing; - } - if (!circ) { - /* This happens because somebody sends us a destroy cell and the - * circuit goes away, while the cpuworker is working. This is also - * why our tag doesn't include a pointer to the circ, because we'd - * never know if it's still valid. - */ - log_debug(LD_OR,"processed onion for a circ that's gone. Dropping."); - goto done_processing; - } - tor_assert(! CIRCUIT_IS_ORIGIN(circ)); - if (onionskin_answer(TO_OR_CIRCUIT(circ), - &rpl.created_cell, - (const char*)rpl.keys, - rpl.rend_auth_material) < 0) { - log_warn(LD_OR,"onionskin_answer failed. Closing."); - circuit_mark_for_close(circ, END_CIRC_REASON_INTERNAL); - goto done_processing; - } - log_debug(LD_OR,"onionskin_answer succeeded. Yay."); - } else { - tor_assert(0); /* don't ask me to do handshakes yet */ - } - - done_processing: - conn->state = CPUWORKER_STATE_IDLE; - num_cpuworkers_busy--; - if (conn->timestamp_created < last_rotation_time) { - connection_mark_for_close(conn); - num_cpuworkers--; - spawn_enough_cpuworkers(); - } else { - process_pending_task(conn); - } - return 0; -} - -/** Implement a cpuworker. 'data' is an fdarray as returned by socketpair. - * Read and writes from fdarray[1]. Reads requests, writes answers. - * - * Request format: - * cpuworker_request_t. - * Response format: - * cpuworker_reply_t - */ +/** Handle a reply from the worker threads. */ static void -cpuworker_main(void *data) +cpuworker_onion_handshake_replyfn(void *work_) { - /* For talking to the parent thread/process */ - tor_socket_t *fdarray = data; - tor_socket_t fd; - - /* variables for onion processing */ - server_onion_keys_t onion_keys; - cpuworker_request_t req; + cpuworker_job_t *job = work_; cpuworker_reply_t rpl; - - fd = fdarray[1]; /* this side is ours */ - tor_free(data); - - setup_server_onion_keys(&onion_keys); - - for (;;) { - if (read_all(fd, (void *)&req, sizeof(req), 1) != sizeof(req)) { - log_info(LD_OR, "read request failed. Exiting."); - goto end; - } - tor_assert(req.magic == CPUWORKER_REQUEST_MAGIC); - - memset(&rpl, 0, sizeof(rpl)); - - if (req.task == CPUWORKER_TASK_ONION) { - const create_cell_t *cc = &req.create_cell; - created_cell_t *cell_out = &rpl.created_cell; - struct timeval tv_start = {0,0}, tv_end; - int n; - rpl.timed = req.timed; - rpl.started_at = req.started_at; - rpl.handshake_type = cc->handshake_type; - if (req.timed) - tor_gettimeofday(&tv_start); - n = onion_skin_server_handshake(cc->handshake_type, - cc->onionskin, cc->handshake_len, - &onion_keys, - cell_out->reply, - rpl.keys, CPATH_KEY_MATERIAL_LEN, - rpl.rend_auth_material); - if (n < 0) { - /* failure */ - log_debug(LD_OR,"onion_skin_server_handshake failed."); - memset(&rpl, 0, sizeof(rpl)); - memcpy(rpl.tag, req.tag, TAG_LEN); - rpl.success = 0; - } else { - /* success */ - log_debug(LD_OR,"onion_skin_server_handshake succeeded."); - memcpy(rpl.tag, req.tag, TAG_LEN); - cell_out->handshake_len = n; - switch (cc->cell_type) { - case CELL_CREATE: - cell_out->cell_type = CELL_CREATED; break; - case CELL_CREATE2: - cell_out->cell_type = CELL_CREATED2; break; - case CELL_CREATE_FAST: - cell_out->cell_type = CELL_CREATED_FAST; break; - default: - tor_assert(0); - goto end; - } - rpl.success = 1; - } - rpl.magic = CPUWORKER_REPLY_MAGIC; - if (req.timed) { - struct timeval tv_diff; - int64_t usec; - tor_gettimeofday(&tv_end); - timersub(&tv_end, &tv_start, &tv_diff); - usec = ((int64_t)tv_diff.tv_sec)*1000000 + tv_diff.tv_usec; - if (usec < 0 || usec > MAX_BELIEVABLE_ONIONSKIN_DELAY) - rpl.n_usec = MAX_BELIEVABLE_ONIONSKIN_DELAY; - else - rpl.n_usec = (uint32_t) usec; + or_circuit_t *circ = NULL; + + --total_pending_tasks; + + /* Could avoid this, but doesn't matter. */ + memcpy(&rpl, &job->u.reply, sizeof(rpl)); + + tor_assert(rpl.magic == CPUWORKER_REPLY_MAGIC); + + if (rpl.timed && rpl.success && + rpl.handshake_type <= MAX_ONION_HANDSHAKE_TYPE) { + /* Time how long this request took. The handshake_type check should be + needless, but let's leave it in to be safe. */ + struct timeval tv_end, tv_diff; + int64_t usec_roundtrip; + tor_gettimeofday(&tv_end); + timersub(&tv_end, &rpl.started_at, &tv_diff); + usec_roundtrip = ((int64_t)tv_diff.tv_sec)*1000000 + tv_diff.tv_usec; + if (usec_roundtrip >= 0 && + usec_roundtrip < MAX_BELIEVABLE_ONIONSKIN_DELAY) { + ++onionskins_n_processed[rpl.handshake_type]; + onionskins_usec_internal[rpl.handshake_type] += rpl.n_usec; + onionskins_usec_roundtrip[rpl.handshake_type] += usec_roundtrip; + if (onionskins_n_processed[rpl.handshake_type] >= 500000) { + /* Scale down every 500000 handshakes. On a busy server, that's + * less impressive than it sounds. */ + onionskins_n_processed[rpl.handshake_type] /= 2; + onionskins_usec_internal[rpl.handshake_type] /= 2; + onionskins_usec_roundtrip[rpl.handshake_type] /= 2; } - if (write_all(fd, (void*)&rpl, sizeof(rpl), 1) != sizeof(rpl)) { - log_err(LD_BUG,"writing response buf failed. Exiting."); - goto end; - } - log_debug(LD_OR,"finished writing response."); - } else if (req.task == CPUWORKER_TASK_SHUTDOWN) { - log_info(LD_OR,"Clean shutdown: exiting"); - goto end; } - memwipe(&req, 0, sizeof(req)); - memwipe(&rpl, 0, sizeof(req)); } - end: - memwipe(&req, 0, sizeof(req)); - memwipe(&rpl, 0, sizeof(req)); - release_server_onion_keys(&onion_keys); - tor_close_socket(fd); - crypto_thread_cleanup(); - spawn_exit(); -} -/** Launch a new cpuworker. Return 0 if we're happy, -1 if we failed. - */ -static int -spawn_cpuworker(void) -{ - tor_socket_t *fdarray; - tor_socket_t fd; - connection_t *conn; - int err; - - fdarray = tor_calloc(2, sizeof(tor_socket_t)); - if ((err = tor_socketpair(AF_UNIX, SOCK_STREAM, 0, fdarray)) < 0) { - log_warn(LD_NET, "Couldn't construct socketpair for cpuworker: %s", - tor_socket_strerror(-err)); - tor_free(fdarray); - return -1; - } + circ = job->circ; - tor_assert(SOCKET_OK(fdarray[0])); - tor_assert(SOCKET_OK(fdarray[1])); + log_debug(LD_OR, + "Unpacking cpuworker reply %p, circ=%p, success=%d", + job, circ, rpl.success); - fd = fdarray[0]; - if (spawn_func(cpuworker_main, (void*)fdarray) < 0) { - tor_close_socket(fdarray[0]); - tor_close_socket(fdarray[1]); - tor_free(fdarray); - return -1; + if (circ->base_.magic == DEAD_CIRCUIT_MAGIC) { + /* The circuit was supposed to get freed while the reply was + * pending. Instead, it got left for us to free so that we wouldn't freak + * out when the job->circ field wound up pointing to nothing. */ + log_debug(LD_OR, "Circuit died while reply was pending. Freeing memory."); + circ->base_.magic = 0; + tor_free(circ); + goto done_processing; } - log_debug(LD_OR,"just spawned a cpu worker."); - conn = connection_new(CONN_TYPE_CPUWORKER, AF_UNIX); + circ->workqueue_entry = NULL; - /* set up conn so it's got all the data we need to remember */ - conn->s = fd; - conn->address = tor_strdup("localhost"); - tor_addr_make_unspec(&conn->addr); - - if (set_socket_nonblocking(fd) == -1) { - connection_free(conn); /* this closes fd */ - return -1; + if (TO_CIRCUIT(circ)->marked_for_close) { + /* We already marked this circuit; we can't call it open. */ + log_debug(LD_OR,"circuit is already marked."); + goto done_processing; } - if (connection_add(conn) < 0) { /* no space, forget it */ - log_warn(LD_NET,"connection_add for cpuworker failed. Giving up."); - connection_free(conn); /* this closes fd */ - return -1; + if (rpl.success == 0) { + log_debug(LD_OR, + "decoding onionskin failed. " + "(Old key or bad software.) Closing."); + if (circ) + circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_TORPROTOCOL); + goto done_processing; } - conn->state = CPUWORKER_STATE_IDLE; - connection_start_reading(conn); + if (onionskin_answer(circ, + &rpl.created_cell, + (const char*)rpl.keys, + rpl.rend_auth_material) < 0) { + log_warn(LD_OR,"onionskin_answer failed. Closing."); + circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_INTERNAL); + goto done_processing; + } + log_debug(LD_OR,"onionskin_answer succeeded. Yay."); - return 0; /* success */ + done_processing: + memwipe(&rpl, 0, sizeof(rpl)); + memwipe(job, 0, sizeof(*job)); + tor_free(job); + queue_pending_tasks(); } -/** If we have too few or too many active cpuworkers, try to spawn new ones - * or kill idle ones. - */ -static void -spawn_enough_cpuworkers(void) +/** Implementation function for onion handshake requests. */ +static int +cpuworker_onion_handshake_threadfn(void *state_, void *work_) { - int num_cpuworkers_needed = get_num_cpus(get_options()); - int reseed = 0; + worker_state_t *state = state_; + cpuworker_job_t *job = work_; - if (num_cpuworkers_needed < MIN_CPUWORKERS) - num_cpuworkers_needed = MIN_CPUWORKERS; - if (num_cpuworkers_needed > MAX_CPUWORKERS) - num_cpuworkers_needed = MAX_CPUWORKERS; + /* variables for onion processing */ + server_onion_keys_t *onion_keys = state->onion_keys; + cpuworker_request_t req; + cpuworker_reply_t rpl; - while (num_cpuworkers < num_cpuworkers_needed) { - if (spawn_cpuworker() < 0) { - log_warn(LD_GENERAL,"Cpuworker spawn failed. Will try again later."); - return; + memcpy(&req, &job->u.request, sizeof(req)); + + tor_assert(req.magic == CPUWORKER_REQUEST_MAGIC); + memset(&rpl, 0, sizeof(rpl)); + + const create_cell_t *cc = &req.create_cell; + created_cell_t *cell_out = &rpl.created_cell; + struct timeval tv_start = {0,0}, tv_end; + int n; + rpl.timed = req.timed; + rpl.started_at = req.started_at; + rpl.handshake_type = cc->handshake_type; + if (req.timed) + tor_gettimeofday(&tv_start); + n = onion_skin_server_handshake(cc->handshake_type, + cc->onionskin, cc->handshake_len, + onion_keys, + cell_out->reply, + rpl.keys, CPATH_KEY_MATERIAL_LEN, + rpl.rend_auth_material); + if (n < 0) { + /* failure */ + log_debug(LD_OR,"onion_skin_server_handshake failed."); + memset(&rpl, 0, sizeof(rpl)); + rpl.success = 0; + } else { + /* success */ + log_debug(LD_OR,"onion_skin_server_handshake succeeded."); + cell_out->handshake_len = n; + switch (cc->cell_type) { + case CELL_CREATE: + cell_out->cell_type = CELL_CREATED; break; + case CELL_CREATE2: + cell_out->cell_type = CELL_CREATED2; break; + case CELL_CREATE_FAST: + cell_out->cell_type = CELL_CREATED_FAST; break; + default: + tor_assert(0); + return WQ_RPL_SHUTDOWN; } - num_cpuworkers++; - reseed++; + rpl.success = 1; } + rpl.magic = CPUWORKER_REPLY_MAGIC; + if (req.timed) { + struct timeval tv_diff; + int64_t usec; + tor_gettimeofday(&tv_end); + timersub(&tv_end, &tv_start, &tv_diff); + usec = ((int64_t)tv_diff.tv_sec)*1000000 + tv_diff.tv_usec; + if (usec < 0 || usec > MAX_BELIEVABLE_ONIONSKIN_DELAY) + rpl.n_usec = MAX_BELIEVABLE_ONIONSKIN_DELAY; + else + rpl.n_usec = (uint32_t) usec; + } + + memcpy(&job->u.reply, &rpl, sizeof(rpl)); - if (reseed) - crypto_seed_weak_rng(&request_sample_rng); + memwipe(&req, 0, sizeof(req)); + memwipe(&rpl, 0, sizeof(req)); + return WQ_RPL_REPLY; } -/** Take a pending task from the queue and assign it to 'cpuworker'. */ +/** Take pending tasks from the queue and assign them to cpuworkers. */ static void -process_pending_task(connection_t *cpuworker) +queue_pending_tasks(void) { or_circuit_t *circ; create_cell_t *onionskin = NULL; - tor_assert(cpuworker); + while (total_pending_tasks < max_pending_tasks) { + circ = onion_next_task(&onionskin); - /* for now only process onion tasks */ - - circ = onion_next_task(&onionskin); - if (!circ) - return; - if (assign_onionskin_to_cpuworker(cpuworker, circ, onionskin)) - log_warn(LD_OR,"assign_to_cpuworker failed. Ignoring."); -} - -/** How long should we let a cpuworker stay busy before we give - * up on it and decide that we have a bug or infinite loop? - * This value is high because some servers with low memory/cpu - * sometimes spend an hour or more swapping, and Tor starves. */ -#define CPUWORKER_BUSY_TIMEOUT (60*60*12) + if (!circ) + return; -/** We have a bug that I can't find. Sometimes, very rarely, cpuworkers get - * stuck in the 'busy' state, even though the cpuworker process thinks of - * itself as idle. I don't know why. But here's a workaround to kill any - * cpuworker that's been busy for more than CPUWORKER_BUSY_TIMEOUT. - */ -static void -cull_wedged_cpuworkers(void) -{ - time_t now = time(NULL); - smartlist_t *conns = get_connection_array(); - SMARTLIST_FOREACH_BEGIN(conns, connection_t *, conn) { - if (!conn->marked_for_close && - conn->type == CONN_TYPE_CPUWORKER && - conn->state == CPUWORKER_STATE_BUSY_ONION && - conn->timestamp_lastwritten + CPUWORKER_BUSY_TIMEOUT < now) { - log_notice(LD_BUG, - "closing wedged cpuworker. Can somebody find the bug?"); - num_cpuworkers_busy--; - num_cpuworkers--; - connection_mark_for_close(conn); - } - } SMARTLIST_FOREACH_END(conn); + if (assign_onionskin_to_cpuworker(circ, onionskin)) + log_warn(LD_OR,"assign_to_cpuworker failed. Ignoring."); + } } /** Try to tell a cpuworker to perform the public key operations necessary to * respond to <b>onionskin</b> for the circuit <b>circ</b>. * - * If <b>cpuworker</b> is defined, assert that he's idle, and use him. Else, - * look for an idle cpuworker and use him. If none idle, queue task onto the - * pending onion list and return. Return 0 if we successfully assign the - * task, or -1 on failure. + * Return 0 if we successfully assign the task, or -1 on failure. */ int -assign_onionskin_to_cpuworker(connection_t *cpuworker, - or_circuit_t *circ, +assign_onionskin_to_cpuworker(or_circuit_t *circ, create_cell_t *onionskin) { + workqueue_entry_t *queue_entry; + cpuworker_job_t *job; cpuworker_request_t req; - time_t now = approx_time(); - static time_t last_culled_cpuworkers = 0; int should_time; - /* Checking for wedged cpuworkers requires a linear search over all - * connections, so let's do it only once a minute. - */ -#define CULL_CPUWORKERS_INTERVAL 60 - - if (last_culled_cpuworkers + CULL_CPUWORKERS_INTERVAL <= now) { - cull_wedged_cpuworkers(); - spawn_enough_cpuworkers(); - last_culled_cpuworkers = now; + if (!circ->p_chan) { + log_info(LD_OR,"circ->p_chan gone. Failing circ."); + tor_free(onionskin); + return -1; } - if (1) { - if (num_cpuworkers_busy == num_cpuworkers) { - log_debug(LD_OR,"No idle cpuworkers. Queuing."); - if (onion_pending_add(circ, onionskin) < 0) { - tor_free(onionskin); - return -1; - } - return 0; - } - - if (!cpuworker) - cpuworker = connection_get_by_type_state(CONN_TYPE_CPUWORKER, - CPUWORKER_STATE_IDLE); - - tor_assert(cpuworker); - - if (!circ->p_chan) { - log_info(LD_OR,"circ->p_chan gone. Failing circ."); + if (total_pending_tasks >= max_pending_tasks) { + log_debug(LD_OR,"No idle cpuworkers. Queuing."); + if (onion_pending_add(circ, onionskin) < 0) { tor_free(onionskin); return -1; } + return 0; + } - if (connection_or_digest_is_known_relay(circ->p_chan->identity_digest)) - rep_hist_note_circuit_handshake_assigned(onionskin->handshake_type); + if (connection_or_digest_is_known_relay(circ->p_chan->identity_digest)) + rep_hist_note_circuit_handshake_assigned(onionskin->handshake_type); - should_time = should_time_request(onionskin->handshake_type); - memset(&req, 0, sizeof(req)); - req.magic = CPUWORKER_REQUEST_MAGIC; - tag_pack(req.tag, circ->p_chan->global_identifier, - circ->p_circ_id); - req.timed = should_time; + should_time = should_time_request(onionskin->handshake_type); + memset(&req, 0, sizeof(req)); + req.magic = CPUWORKER_REQUEST_MAGIC; + req.timed = should_time; - cpuworker->state = CPUWORKER_STATE_BUSY_ONION; - /* touch the lastwritten timestamp, since that's how we check to - * see how long it's been since we asked the question, and sometimes - * we check before the first call to connection_handle_write(). */ - cpuworker->timestamp_lastwritten = now; - num_cpuworkers_busy++; + memcpy(&req.create_cell, onionskin, sizeof(create_cell_t)); - req.task = CPUWORKER_TASK_ONION; - memcpy(&req.create_cell, onionskin, sizeof(create_cell_t)); + tor_free(onionskin); - tor_free(onionskin); + if (should_time) + tor_gettimeofday(&req.started_at); - if (should_time) - tor_gettimeofday(&req.started_at); + job = tor_malloc_zero(sizeof(cpuworker_job_t)); + job->circ = circ; + memcpy(&job->u.request, &req, sizeof(req)); + memwipe(&req, 0, sizeof(req)); - connection_write_to_buf((void*)&req, sizeof(req), cpuworker); - memwipe(&req, 0, sizeof(req)); + ++total_pending_tasks; + queue_entry = threadpool_queue_work(threadpool, + cpuworker_onion_handshake_threadfn, + cpuworker_onion_handshake_replyfn, + job); + if (!queue_entry) { + log_warn(LD_BUG, "Couldn't queue work on threadpool"); + tor_free(job); + return -1; } + + log_debug(LD_OR, "Queued task %p (qe=%p, circ=%p)", + job, queue_entry, job->circ); + + circ->workqueue_entry = queue_entry; + return 0; } +/** If <b>circ</b> has a pending handshake that hasn't been processed yet, + * remove it from the worker queue. */ +void +cpuworker_cancel_circ_handshake(or_circuit_t *circ) +{ + cpuworker_job_t *job; + if (circ->workqueue_entry == NULL) + return; + + job = workqueue_entry_cancel(circ->workqueue_entry); + if (job) { + /* It successfully cancelled. */ + memwipe(job, 0xe0, sizeof(*job)); + tor_free(job); + } + + circ->workqueue_entry = NULL; +} + diff --git a/src/or/cpuworker.h b/src/or/cpuworker.h index f7f1d8346b..70a595e472 100644 --- a/src/or/cpuworker.h +++ b/src/or/cpuworker.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -13,19 +13,17 @@ #define TOR_CPUWORKER_H void cpu_init(void); -void cpuworkers_rotate(void); -int connection_cpu_finished_flushing(connection_t *conn); -int connection_cpu_reached_eof(connection_t *conn); -int connection_cpu_process_inbuf(connection_t *conn); +void cpuworkers_rotate_keyinfo(void); + struct create_cell_t; -int assign_onionskin_to_cpuworker(connection_t *cpuworker, - or_circuit_t *circ, +int assign_onionskin_to_cpuworker(or_circuit_t *circ, struct create_cell_t *onionskin); uint64_t estimated_usec_for_onionskins(uint32_t n_requests, uint16_t onionskin_type); void cpuworker_log_onionskin_overhead(int severity, int onionskin_type, const char *onionskin_type_name); +void cpuworker_cancel_circ_handshake(or_circuit_t *circ); #endif diff --git a/src/or/directory.c b/src/or/directory.c index df9e7f8ad3..d2b6b86f6d 100644 --- a/src/or/directory.c +++ b/src/or/directory.c @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "or.h" @@ -20,6 +20,7 @@ #include "networkstatus.h" #include "nodelist.h" #include "policies.h" +#include "relay.h" #include "rendclient.h" #include "rendcommon.h" #include "rephist.h" @@ -63,8 +64,6 @@ static void directory_send_command(dir_connection_t *conn, time_t if_modified_since); static int directory_handle_command(dir_connection_t *conn); static int body_is_plausible(const char *body, size_t body_len, int purpose); -static int purpose_needs_anonymity(uint8_t dir_purpose, - uint8_t router_purpose); static char *http_get_header(const char *headers, const char *which); static void http_set_address_origin(const char *headers, connection_t *conn); static void connection_dir_download_routerdesc_failed(dir_connection_t *conn); @@ -119,7 +118,7 @@ static void directory_initiate_command_rend(const tor_addr_t *addr, /** Return true iff the directory purpose <b>dir_purpose</b> (and if it's * fetching descriptors, it's fetching them for <b>router_purpose</b>) * must use an anonymous connection to a directory. */ -static int +STATIC int purpose_needs_anonymity(uint8_t dir_purpose, uint8_t router_purpose) { if (get_options()->AllDirActionsPrivate) @@ -197,6 +196,46 @@ dir_conn_purpose_to_string(int purpose) return "(unknown)"; } +/** Return the requisite directory information types. */ +STATIC dirinfo_type_t +dir_fetch_type(int dir_purpose, int router_purpose, const char *resource) +{ + dirinfo_type_t type; + switch (dir_purpose) { + case DIR_PURPOSE_FETCH_EXTRAINFO: + type = EXTRAINFO_DIRINFO; + if (router_purpose == ROUTER_PURPOSE_BRIDGE) + type |= BRIDGE_DIRINFO; + else + type |= V3_DIRINFO; + break; + case DIR_PURPOSE_FETCH_SERVERDESC: + if (router_purpose == ROUTER_PURPOSE_BRIDGE) + type = BRIDGE_DIRINFO; + else + type = V3_DIRINFO; + break; + case DIR_PURPOSE_FETCH_STATUS_VOTE: + case DIR_PURPOSE_FETCH_DETACHED_SIGNATURES: + case DIR_PURPOSE_FETCH_CERTIFICATE: + type = V3_DIRINFO; + break; + case DIR_PURPOSE_FETCH_CONSENSUS: + type = V3_DIRINFO; + if (resource && !strcmp(resource, "microdesc")) + type |= MICRODESC_DIRINFO; + break; + case DIR_PURPOSE_FETCH_MICRODESC: + type = MICRODESC_DIRINFO; + break; + default: + log_warn(LD_BUG, "Unexpected purpose %d", (int)dir_purpose); + type = NO_DIRINFO; + break; + } + return type; +} + /** Return true iff <b>identity_digest</b> is the digest of a router which * says that it caches extrainfos. (If <b>is_authority</b> we always * believe that to be true.) */ @@ -385,47 +424,21 @@ directory_pick_generic_dirserver(dirinfo_type_t type, int pds_flags, * Use <b>pds_flags</b> as arguments to router_pick_directory_server() * or router_pick_trusteddirserver(). */ -void -directory_get_from_dirserver(uint8_t dir_purpose, uint8_t router_purpose, - const char *resource, int pds_flags) +MOCK_IMPL(void, directory_get_from_dirserver, (uint8_t dir_purpose, + uint8_t router_purpose, + const char *resource, + int pds_flags)) { const routerstatus_t *rs = NULL; const or_options_t *options = get_options(); int prefer_authority = directory_fetches_from_authorities(options); int require_authority = 0; int get_via_tor = purpose_needs_anonymity(dir_purpose, router_purpose); - dirinfo_type_t type; + dirinfo_type_t type = dir_fetch_type(dir_purpose, router_purpose, resource); time_t if_modified_since = 0; - /* FFFF we could break this switch into its own function, and call - * it elsewhere in directory.c. -RD */ - switch (dir_purpose) { - case DIR_PURPOSE_FETCH_EXTRAINFO: - type = EXTRAINFO_DIRINFO | - (router_purpose == ROUTER_PURPOSE_BRIDGE ? BRIDGE_DIRINFO : - V3_DIRINFO); - break; - case DIR_PURPOSE_FETCH_SERVERDESC: - type = (router_purpose == ROUTER_PURPOSE_BRIDGE ? BRIDGE_DIRINFO : - V3_DIRINFO); - break; - case DIR_PURPOSE_FETCH_STATUS_VOTE: - case DIR_PURPOSE_FETCH_DETACHED_SIGNATURES: - case DIR_PURPOSE_FETCH_CERTIFICATE: - type = V3_DIRINFO; - break; - case DIR_PURPOSE_FETCH_CONSENSUS: - type = V3_DIRINFO; - if (resource && !strcmp(resource,"microdesc")) - type |= MICRODESC_DIRINFO; - break; - case DIR_PURPOSE_FETCH_MICRODESC: - type = MICRODESC_DIRINFO; - break; - default: - log_warn(LD_BUG, "Unexpected purpose %d", (int)dir_purpose); - return; - } + if (type == NO_DIRINFO) + return; if (dir_purpose == DIR_PURPOSE_FETCH_CONSENSUS) { int flav = FLAV_NS; @@ -433,18 +446,33 @@ directory_get_from_dirserver(uint8_t dir_purpose, uint8_t router_purpose, if (resource) flav = networkstatus_parse_flavor_name(resource); + /* DEFAULT_IF_MODIFIED_SINCE_DELAY is 1/20 of the default consensus + * period of 1 hour. + */ +#define DEFAULT_IF_MODIFIED_SINCE_DELAY (180) if (flav != -1) { /* IF we have a parsed consensus of this type, we can do an * if-modified-time based on it. */ v = networkstatus_get_latest_consensus_by_flavor(flav); - if (v) - if_modified_since = v->valid_after + 180; + if (v) { + /* In networks with particularly short V3AuthVotingIntervals, + * ask for the consensus if it's been modified since half the + * V3AuthVotingInterval of the most recent consensus. */ + time_t ims_delay = DEFAULT_IF_MODIFIED_SINCE_DELAY; + if (v->fresh_until > v->valid_after + && ims_delay > (v->fresh_until - v->valid_after)/2) { + ims_delay = (v->fresh_until - v->valid_after)/2; + } + if_modified_since = v->valid_after + ims_delay; + } } else { /* Otherwise it might be a consensus we don't parse, but which we * do cache. Look at the cached copy, perhaps. */ cached_dir_t *cd = dirserv_get_consensus(resource); + /* We have no method of determining the voting interval from an + * unparsed consensus, so we use the default. */ if (cd) - if_modified_since = cd->published + 180; + if_modified_since = cd->published + DEFAULT_IF_MODIFIED_SINCE_DELAY; } } @@ -510,20 +538,16 @@ directory_get_from_dirserver(uint8_t dir_purpose, uint8_t router_purpose, /* */ rs = directory_pick_generic_dirserver(type, pds_flags, dir_purpose); - if (!rs) { - /*XXXX024 I'm pretty sure this can never do any good, since - * rs isn't set. */ + if (!rs) get_via_tor = 1; /* last resort: try routing it via Tor */ - } } } - } else { /* get_via_tor */ + } + + if (get_via_tor) { /* Never use fascistfirewall; we're going via Tor. */ - if (1) { - /* anybody with a non-zero dirport will do. Disregard firewalls. */ - pds_flags |= PDS_IGNORE_FASCISTFIREWALL; - rs = router_pick_directory_server(type, pds_flags); - } + pds_flags |= PDS_IGNORE_FASCISTFIREWALL; + rs = router_pick_directory_server(type, pds_flags); } /* If we have any hope of building an indirect conn, we know some router @@ -1255,7 +1279,8 @@ directory_send_command(dir_connection_t *conn, return; } - if (strlen(proxystring) + strlen(url) >= 4096) { + /* warn in the non-tunneled case */ + if (direct && (strlen(proxystring) + strlen(url) >= 4096)) { log_warn(LD_BUG, "Squid does not like URLs longer than 4095 bytes, and this " "one is %d bytes long: %s%s", @@ -2073,9 +2098,10 @@ connection_dir_client_reached_eof(dir_connection_t *conn) } if (conn->base_.purpose == DIR_PURPOSE_FETCH_RENDDESC_V2) { - #define SEND_HS_DESC_FAILED_EVENT() ( \ + #define SEND_HS_DESC_FAILED_EVENT(reason) ( \ control_event_hs_descriptor_failed(conn->rend_data, \ - conn->identity_digest) ) + conn->identity_digest, \ + reason) ) tor_assert(conn->rend_data); log_info(LD_REND,"Received rendezvous descriptor (size %d, status %d " "(%s))", @@ -2090,7 +2116,7 @@ connection_dir_client_reached_eof(dir_connection_t *conn) "Retrying at another directory."); /* We'll retry when connection_about_to_close_connection() * cleans this dir conn up. */ - SEND_HS_DESC_FAILED_EVENT(); + SEND_HS_DESC_FAILED_EVENT("BAD_DESC"); break; case RCS_OKAY: default: @@ -2109,14 +2135,14 @@ connection_dir_client_reached_eof(dir_connection_t *conn) * connection_about_to_close_connection() cleans this conn up. */ log_info(LD_REND,"Fetching v2 rendezvous descriptor failed: " "Retrying at another directory."); - SEND_HS_DESC_FAILED_EVENT(); + SEND_HS_DESC_FAILED_EVENT("NOT_FOUND"); break; case 400: log_warn(LD_REND, "Fetching v2 rendezvous descriptor failed: " "http status 400 (%s). Dirserver didn't like our " "v2 rendezvous query? Retrying at another directory.", escaped(reason)); - SEND_HS_DESC_FAILED_EVENT(); + SEND_HS_DESC_FAILED_EVENT("QUERY_REJECTED"); break; default: log_warn(LD_REND, "Fetching v2 rendezvous descriptor failed: " @@ -2125,7 +2151,7 @@ connection_dir_client_reached_eof(dir_connection_t *conn) "Retrying at another directory.", status_code, escaped(reason), conn->base_.address, conn->base_.port); - SEND_HS_DESC_FAILED_EVENT(); + SEND_HS_DESC_FAILED_EVENT("UNEXPECTED"); break; } } @@ -2184,12 +2210,15 @@ connection_dir_reached_eof(dir_connection_t *conn) */ #define MAX_DIRECTORY_OBJECT_SIZE (10*(1<<20)) +#define MAX_VOTE_DL_SIZE (MAX_DIRECTORY_OBJECT_SIZE * 5) + /** Read handler for directory connections. (That's connections <em>to</em> * directory servers and connections <em>at</em> directory servers.) */ int connection_dir_process_inbuf(dir_connection_t *conn) { + size_t max_size; tor_assert(conn); tor_assert(conn->base_.type == CONN_TYPE_DIR); @@ -2208,9 +2237,15 @@ connection_dir_process_inbuf(dir_connection_t *conn) return 0; } - if (connection_get_inbuf_len(TO_CONN(conn)) > MAX_DIRECTORY_OBJECT_SIZE) { - log_warn(LD_HTTP, "Too much data received from directory connection: " - "denial of service attempt, or you need to upgrade?"); + max_size = + (TO_CONN(conn)->purpose == DIR_PURPOSE_FETCH_STATUS_VOTE) ? + MAX_VOTE_DL_SIZE : MAX_DIRECTORY_OBJECT_SIZE; + + if (connection_get_inbuf_len(TO_CONN(conn)) > max_size) { + log_warn(LD_HTTP, + "Too much data received from directory connection (%s): " + "denial of service attempt, or you need to upgrade?", + conn->base_.address); connection_mark_for_close(TO_CONN(conn)); return -1; } @@ -2255,6 +2290,7 @@ write_http_status_line(dir_connection_t *conn, int status, log_warn(LD_BUG,"status line too long."); return; } + log_debug(LD_DIRSERV,"Wrote status 'HTTP/1.0 %d %s'", status, reason_phrase); connection_write_to_buf(buf, strlen(buf), TO_CONN(conn)); } @@ -2520,6 +2556,24 @@ client_likes_consensus(networkstatus_t *v, const char *want_url) return (have >= need_at_least); } +/** Return the compression level we should use for sending a compressed + * response of size <b>n_bytes</b>. */ +static zlib_compression_level_t +choose_compression_level(ssize_t n_bytes) +{ + if (! have_been_under_memory_pressure()) { + return HIGH_COMPRESSION; /* we have plenty of RAM. */ + } else if (n_bytes < 0) { + return HIGH_COMPRESSION; /* unknown; might be big. */ + } else if (n_bytes < 1024) { + return LOW_COMPRESSION; + } else if (n_bytes < 2048) { + return MEDIUM_COMPRESSION; + } else { + return HIGH_COMPRESSION; + } +} + /** Helper function: called when a dirserver gets a complete HTTP GET * request. Look for a request for a directory or for a rendezvous * service descriptor. On finding one, write a response into @@ -2551,8 +2605,11 @@ directory_handle_command_get(dir_connection_t *conn, const char *headers, if ((header = http_get_header(headers, "If-Modified-Since: "))) { struct tm tm; if (parse_http_time(header, &tm) == 0) { - if (tor_timegm(&tm, &if_modified_since)<0) + if (tor_timegm(&tm, &if_modified_since)<0) { if_modified_since = 0; + } else { + log_debug(LD_DIRSERV, "If-Modified-Since is '%s'.", escaped(header)); + } } /* The correct behavior on a malformed If-Modified-Since header is to * act as if no If-Modified-Since header had been given. */ @@ -2702,7 +2759,7 @@ directory_handle_command_get(dir_connection_t *conn, const char *headers, smartlist_len(dir_fps) == 1 ? lifetime : 0); conn->fingerprint_stack = dir_fps; if (! compressed) - conn->zlib_state = tor_zlib_new(0, ZLIB_METHOD); + conn->zlib_state = tor_zlib_new(0, ZLIB_METHOD, HIGH_COMPRESSION); /* Prime the connection with some data. */ conn->dir_spool_src = DIR_SPOOL_NETWORKSTATUS; @@ -2790,7 +2847,8 @@ directory_handle_command_get(dir_connection_t *conn, const char *headers, if (smartlist_len(items)) { if (compressed) { - conn->zlib_state = tor_zlib_new(1, ZLIB_METHOD); + conn->zlib_state = tor_zlib_new(1, ZLIB_METHOD, + choose_compression_level(estimated_len)); SMARTLIST_FOREACH(items, const char *, c, connection_write_to_buf_zlib(c, strlen(c), conn, 0)); connection_write_to_buf_zlib("", 0, conn, 1); @@ -2839,7 +2897,8 @@ directory_handle_command_get(dir_connection_t *conn, const char *headers, conn->fingerprint_stack = fps; if (compressed) - conn->zlib_state = tor_zlib_new(1, ZLIB_METHOD); + conn->zlib_state = tor_zlib_new(1, ZLIB_METHOD, + choose_compression_level(dlen)); connection_dirserv_flushed_some(conn); goto done; @@ -2907,7 +2966,8 @@ directory_handle_command_get(dir_connection_t *conn, const char *headers, } write_http_response_header(conn, -1, compressed, cache_lifetime); if (compressed) - conn->zlib_state = tor_zlib_new(1, ZLIB_METHOD); + conn->zlib_state = tor_zlib_new(1, ZLIB_METHOD, + choose_compression_level(dlen)); /* Prime the connection with some data. */ connection_dirserv_flushed_some(conn); } @@ -2982,7 +3042,8 @@ directory_handle_command_get(dir_connection_t *conn, const char *headers, write_http_response_header(conn, compressed?-1:len, compressed, 60*60); if (compressed) { - conn->zlib_state = tor_zlib_new(1, ZLIB_METHOD); + conn->zlib_state = tor_zlib_new(1, ZLIB_METHOD, + choose_compression_level(len)); SMARTLIST_FOREACH(certs, authority_cert_t *, c, connection_write_to_buf_zlib(c->cache_info.signed_descriptor_body, c->cache_info.signed_descriptor_len, diff --git a/src/or/directory.h b/src/or/directory.h index d78046912c..4899eb5c8c 100644 --- a/src/or/directory.h +++ b/src/or/directory.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -16,9 +16,10 @@ int directories_have_accepted_server_descriptor(void); void directory_post_to_dirservers(uint8_t dir_purpose, uint8_t router_purpose, dirinfo_type_t type, const char *payload, size_t payload_len, size_t extrainfo_len); -void directory_get_from_dirserver(uint8_t dir_purpose, uint8_t router_purpose, - const char *resource, - int pds_flags); +MOCK_DECL(void, directory_get_from_dirserver, (uint8_t dir_purpose, + uint8_t router_purpose, + const char *resource, + int pds_flags)); void directory_get_from_all_authorities(uint8_t dir_purpose, uint8_t router_purpose, const char *resource); @@ -120,7 +121,12 @@ int download_status_get_n_failures(const download_status_t *dls); #ifdef TOR_UNIT_TESTS /* Used only by directory.c and test_dir.c */ + STATIC int parse_http_url(const char *headers, char **url); +STATIC int purpose_needs_anonymity(uint8_t dir_purpose, + uint8_t router_purpose); +STATIC dirinfo_type_t dir_fetch_type(int dir_purpose, int router_purpose, + const char *resource); #endif #endif diff --git a/src/or/dirserv.c b/src/or/dirserv.c index 730f005a96..b694f8af77 100644 --- a/src/or/dirserv.c +++ b/src/or/dirserv.c @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define DIRSERV_PRIVATE @@ -512,7 +512,7 @@ dirserv_add_multiple_descriptors(const char *desc, uint8_t purpose, if (!n_parsed) { *msg = "No descriptors found in your POST."; if (WRA_WAS_ADDED(r)) - r = ROUTER_WAS_NOT_NEW; + r = ROUTER_IS_ALREADY_KNOWN; } else { *msg = "(no message)"; } @@ -574,7 +574,7 @@ dirserv_add_descriptor(routerinfo_t *ri, const char **msg, const char *source) ri->cache_info.signed_descriptor_body, ri->cache_info.signed_descriptor_len, *msg); routerinfo_free(ri); - return ROUTER_WAS_NOT_NEW; + return ROUTER_IS_ALREADY_KNOWN; } /* Make a copy of desc, since router_add_to_routerlist might free @@ -646,7 +646,7 @@ dirserv_add_extrainfo(extrainfo_t *ei, const char **msg) if ((r = routerinfo_incompatible_with_extrainfo(ri, ei, NULL, msg))) { extrainfo_free(ei); - return r < 0 ? ROUTER_WAS_NOT_NEW : ROUTER_BAD_EI; + return r < 0 ? ROUTER_IS_ALREADY_KNOWN : ROUTER_BAD_EI; } router_add_extrainfo_to_routerlist(ei, msg, 0, 0); return ROUTER_ADDED_SUCCESSFULLY; @@ -733,7 +733,7 @@ running_long_enough_to_decide_unreachable(void) } /** Each server needs to have passed a reachability test no more - * than this number of seconds ago, or he is listed as down in + * than this number of seconds ago, or it is listed as down in * the directory. */ #define REACHABLE_TIMEOUT (45*60) @@ -887,12 +887,26 @@ static int router_is_active(const routerinfo_t *ri, const node_t *node, time_t now) { time_t cutoff = now - ROUTER_MAX_AGE_TO_PUBLISH; - if (ri->cache_info.published_on < cutoff) + if (ri->cache_info.published_on < cutoff) { return 0; - if (!node->is_running || !node->is_valid || ri->is_hibernating) + } + if (!node->is_running || !node->is_valid || ri->is_hibernating) { return 0; - if (!ri->bandwidthcapacity) + } + /* Only require bandwith capacity in non-test networks, or + * if TestingTorNetwork, and TestingMinExitFlagThreshold is non-zero */ + if (!ri->bandwidthcapacity) { + if (get_options()->TestingTorNetwork) { + if (get_options()->TestingMinExitFlagThreshold > 0) { + /* If we're in a TestingTorNetwork, and TestingMinExitFlagThreshold is, + * then require bandwidthcapacity */ + return 0; + } + } else { + /* If we're not in a TestingTorNetwork, then require bandwidthcapacity */ return 0; + } + } return 1; } @@ -1037,7 +1051,7 @@ directory_fetches_dir_info_later(const or_options_t *options) } /** Return true iff we want to fetch and keep certificates for authorities - * that we don't acknowledge as aurthorities ourself. + * that we don't acknowledge as authorities ourself. */ int directory_caches_unknown_auth_certs(const or_options_t *options) @@ -1498,7 +1512,7 @@ dirserv_compute_performance_thresholds(routerlist_t *rl, (unsigned long)guard_tk, (unsigned long)guard_bandwidth_including_exits_kb, (unsigned long)guard_bandwidth_excluding_exits_kb, - enough_mtbf_info ? "" : " don't "); + enough_mtbf_info ? "" : " don't"); tor_free(uptimes); tor_free(mtbfs); @@ -2099,9 +2113,10 @@ set_routerstatus_from_routerinfo(routerstatus_t *rs, rs->ipv6_orport = ri->ipv6_orport; } - /* Iff we are in a testing network, use TestingDirAuthVoteExit to - give out Exit flags, and TestingDirAuthVoteGuard to - give out Guard flags. */ + /* Iff we are in a testing network, use TestingDirAuthVoteExit, + TestingDirAuthVoteGuard, and TestingDirAuthVoteHSDir to + give out the Exit, Guard, and HSDir flags, respectively. + But don't set the corresponding node flags. */ if (options->TestingTorNetwork) { if (routerset_contains_routerstatus(options->TestingDirAuthVoteExit, rs, 0)) { @@ -2109,9 +2124,15 @@ set_routerstatus_from_routerinfo(routerstatus_t *rs, } if (routerset_contains_routerstatus(options->TestingDirAuthVoteGuard, - rs, 0)) { + rs, 0)) { rs->is_possible_guard = 1; } + + if (routerset_contains_routerstatus(options->TestingDirAuthVoteHSDir, + rs, 0)) { + /* TestingDirAuthVoteHSDir respects VoteOnHidServDirectoriesV2 */ + rs->is_hs_dir = vote_on_hsdirs; + } } } @@ -2246,7 +2267,7 @@ int dirserv_read_measured_bandwidths(const char *from_file, smartlist_t *routerstatuses) { - char line[256]; + char line[512]; FILE *fp = tor_fopen_cloexec(from_file, "r"); int applied_lines = 0; time_t file_time, now; @@ -3182,7 +3203,7 @@ connection_dirserv_add_networkstatus_bytes_to_outbuf(dir_connection_t *conn) if (uncompressing && ! conn->zlib_state && conn->fingerprint_stack && smartlist_len(conn->fingerprint_stack)) { - conn->zlib_state = tor_zlib_new(0, ZLIB_METHOD); + conn->zlib_state = tor_zlib_new(0, ZLIB_METHOD, HIGH_COMPRESSION); } } if (r) return r; diff --git a/src/or/dirserv.h b/src/or/dirserv.h index 57cec3401f..d4ce54260c 100644 --- a/src/or/dirserv.h +++ b/src/or/dirserv.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/dirvote.c b/src/or/dirvote.c index 39505a4f9e..f0dcc88070 100644 --- a/src/or/dirvote.c +++ b/src/or/dirvote.c @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define DIRVOTE_PRIVATE @@ -1107,8 +1107,12 @@ networkstatus_compute_consensus(smartlist_t *votes, vote_seconds = median_int(votesec_list, n_votes); dist_seconds = median_int(distsec_list, n_votes); - tor_assert(valid_after+MIN_VOTE_INTERVAL <= fresh_until); - tor_assert(fresh_until+MIN_VOTE_INTERVAL <= valid_until); + tor_assert(valid_after + + (get_options()->TestingTorNetwork ? + MIN_VOTE_INTERVAL_TESTING : MIN_VOTE_INTERVAL) <= fresh_until); + tor_assert(fresh_until + + (get_options()->TestingTorNetwork ? + MIN_VOTE_INTERVAL_TESTING : MIN_VOTE_INTERVAL) <= valid_until); tor_assert(vote_seconds >= MIN_VOTE_SECONDS); tor_assert(dist_seconds >= MIN_DIST_SECONDS); @@ -2706,7 +2710,7 @@ dirvote_add_vote(const char *vote_body, const char **msg_out, int *status_out) goto discard; } else if (v->vote->published < vote->published) { log_notice(LD_DIR, "Replacing an older pending vote from this " - "directory."); + "directory (%s)", vi->address); cached_dir_decref(v->vote_body); networkstatus_vote_free(v->vote); v->vote_body = new_cached_dir(tor_strndup(vote_body, diff --git a/src/or/dirvote.h b/src/or/dirvote.h index 5d44ba4320..8908336fa1 100644 --- a/src/or/dirvote.h +++ b/src/or/dirvote.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -14,12 +14,42 @@ #include "testsupport.h" +/* + * Ideally, assuming synced clocks, we should only need 1 second for each of: + * - Vote + * - Distribute + * - Consensus Publication + * As we can gather descriptors continuously. + * (Could we even go as far as publishing the previous consensus, + * in the same second that we vote for the next one?) + * But we're not there yet: these are the lowest working values at this time. + */ + /** Lowest allowable value for VoteSeconds. */ #define MIN_VOTE_SECONDS 2 +/** Lowest allowable value for VoteSeconds when TestingTorNetwork is 1 */ +#define MIN_VOTE_SECONDS_TESTING 2 + /** Lowest allowable value for DistSeconds. */ #define MIN_DIST_SECONDS 2 -/** Smallest allowable voting interval. */ +/** Lowest allowable value for DistSeconds when TestingTorNetwork is 1 */ +#define MIN_DIST_SECONDS_TESTING 2 + +/** Lowest allowable voting interval. */ #define MIN_VOTE_INTERVAL 300 +/** Lowest allowable voting interval when TestingTorNetwork is 1: + * Voting Interval can be: + * 10, 12, 15, 18, 20, 24, 25, 30, 36, 40, 45, 50, 60, ... + * Testing Initial Voting Interval can be: + * 5, 6, 8, 9, or any of the possible values for Voting Interval, + * as they both need to evenly divide 30 minutes. + * If clock desynchronisation is an issue, use an interval of at least: + * 18 * drift in seconds, to allow for a clock slop factor */ +#define MIN_VOTE_INTERVAL_TESTING \ + (((MIN_VOTE_SECONDS_TESTING)+(MIN_DIST_SECONDS_TESTING)+1)*2) + +#define MIN_VOTE_INTERVAL_TESTING_INITIAL \ + ((MIN_VOTE_SECONDS_TESTING)+(MIN_DIST_SECONDS_TESTING)+1) /** The lowest consensus method that we currently support. */ #define MIN_SUPPORTED_CONSENSUS_METHOD 13 diff --git a/src/or/dns.c b/src/or/dns.c index 7bf64dc4ff..cc4a169422 100644 --- a/src/or/dns.c +++ b/src/or/dns.c @@ -1,6 +1,6 @@ /* Copyright (c) 2003-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -558,6 +558,8 @@ purge_expired_resolves(time_t now) /* Connections should only be pending if they have no socket. */ tor_assert(!SOCKET_OK(pend->conn->base_.s)); pendconn = pend->conn; + /* Prevent double-remove */ + pendconn->base_.state = EXIT_CONN_STATE_RESOLVEFAILED; if (!pendconn->base_.marked_for_close) { connection_edge_end(pendconn, END_STREAM_REASON_TIMEOUT); circuit_detach_stream(circuit_get_by_edge_conn(pendconn), pendconn); @@ -1133,7 +1135,9 @@ connection_dns_remove(edge_connection_t *conn) return; /* more are pending */ } } - tor_assert(0); /* not reachable unless onlyconn not in pending list */ + log_warn(LD_BUG, "Connection (fd "TOR_SOCKET_T_FORMAT") was not waiting " + "for a resolve of %s, but we tried to remove it.", + conn->base_.s, escaped_safe_str(conn->base_.address)); } } diff --git a/src/or/dns.h b/src/or/dns.h index cabbb9ba09..b13ab0f890 100644 --- a/src/or/dns.h +++ b/src/or/dns.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/dnsserv.c b/src/or/dnsserv.c index 3d63874a65..f7710908bd 100644 --- a/src/or/dnsserv.c +++ b/src/or/dnsserv.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2007-2014, The Tor Project, Inc. */ +/* Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -141,13 +141,13 @@ evdns_server_callback(struct evdns_server_request *req, void *data_) } if (q->type == EVDNS_TYPE_A || q->type == EVDNS_QTYPE_ALL) { - entry_conn->ipv4_traffic_ok = 1; - entry_conn->ipv6_traffic_ok = 0; - entry_conn->prefer_ipv6_traffic = 0; + entry_conn->entry_cfg.ipv4_traffic = 1; + entry_conn->entry_cfg.ipv6_traffic = 0; + entry_conn->entry_cfg.prefer_ipv6 = 0; } else if (q->type == EVDNS_TYPE_AAAA) { - entry_conn->ipv4_traffic_ok = 0; - entry_conn->ipv6_traffic_ok = 1; - entry_conn->prefer_ipv6_traffic = 1; + entry_conn->entry_cfg.ipv4_traffic = 0; + entry_conn->entry_cfg.ipv6_traffic = 1; + entry_conn->entry_cfg.prefer_ipv6 = 1; } strlcpy(entry_conn->socks_request->address, q->name, @@ -155,8 +155,8 @@ evdns_server_callback(struct evdns_server_request *req, void *data_) entry_conn->socks_request->listener_type = listener->base_.type; entry_conn->dns_server_request = req; - entry_conn->isolation_flags = listener->isolation_flags; - entry_conn->session_group = listener->session_group; + entry_conn->entry_cfg.isolation_flags = listener->entry_cfg.isolation_flags; + entry_conn->entry_cfg.session_group = listener->entry_cfg.session_group; entry_conn->nym_epoch = get_signewnym_epoch(); if (connection_add(ENTRY_TO_CONN(entry_conn)) < 0) { @@ -232,9 +232,9 @@ dnsserv_launch_request(const char *name, int reverse, entry_conn->socks_request->listener_type = CONN_TYPE_CONTROL_LISTENER; entry_conn->original_dest_address = tor_strdup(name); - entry_conn->session_group = SESSION_GROUP_CONTROL_RESOLVE; + entry_conn->entry_cfg.session_group = SESSION_GROUP_CONTROL_RESOLVE; entry_conn->nym_epoch = get_signewnym_epoch(); - entry_conn->isolation_flags = ISO_DEFAULT; + entry_conn->entry_cfg.isolation_flags = ISO_DEFAULT; if (connection_add(TO_CONN(conn))<0) { log_warn(LD_APP, "Couldn't register dummy connection for RESOLVE request"); diff --git a/src/or/dnsserv.h b/src/or/dnsserv.h index c8074dfaa0..09ad5d7759 100644 --- a/src/or/dnsserv.h +++ b/src/or/dnsserv.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/entrynodes.c b/src/or/entrynodes.c index b18aabe1f4..5b0e342662 100644 --- a/src/or/entrynodes.c +++ b/src/or/entrynodes.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -1319,7 +1319,7 @@ entry_guards_parse_state(or_state_t *state, int set, char **msg) "EntryGuardDownSince/UnlistedSince without EntryGuard"); break; } - if (parse_iso_time(line->value, &when)<0) { + if (parse_iso_time_(line->value, &when, 0)<0) { *msg = tor_strdup("Unable to parse entry nodes: " "Bad time in EntryGuardDownSince/UnlistedSince"); break; @@ -1523,6 +1523,13 @@ entry_guards_parse_state(or_state_t *state, int set, char **msg) return *msg ? -1 : 0; } +/** How long will we let a change in our guard nodes stay un-saved + * when we are trying to avoid disk writes? */ +#define SLOW_GUARD_STATE_FLUSH_TIME 600 +/** How long will we let a change in our guard nodes stay un-saved + * when we are not trying to avoid disk writes? */ +#define FAST_GUARD_STATE_FLUSH_TIME 30 + /** Our list of entry guards has changed, or some element of one * of our entry guards has changed. Write the changes to disk within * the next few minutes. @@ -1533,8 +1540,12 @@ entry_guards_changed(void) time_t when; entry_guards_dirty = 1; + if (get_options()->AvoidDiskWrites) + when = time(NULL) + SLOW_GUARD_STATE_FLUSH_TIME; + else + when = time(NULL) + FAST_GUARD_STATE_FLUSH_TIME; + /* or_state_save() will call entry_guards_update_state(). */ - when = get_options()->AvoidDiskWrites ? time(NULL) + 3600 : time(NULL)+600; or_state_mark_dirty(get_or_state(), when); } diff --git a/src/or/entrynodes.h b/src/or/entrynodes.h index 5416398430..7f3a4fb29c 100644 --- a/src/or/entrynodes.h +++ b/src/or/entrynodes.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/eventdns_tor.h b/src/or/eventdns_tor.h index b135a534fc..9d51f0960e 100644 --- a/src/or/eventdns_tor.h +++ b/src/or/eventdns_tor.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2007-2014, The Tor Project, Inc. */ +/* Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TOR_EVENTDNS_TOR_H diff --git a/src/or/ext_orport.c b/src/or/ext_orport.c index 9b550ee90e..e8c8aa60a4 100644 --- a/src/or/ext_orport.c +++ b/src/or/ext_orport.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012, The Tor Project, Inc. */ +/* Copyright (c) 2012-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/ext_orport.h b/src/or/ext_orport.h index 277bbfdbcf..8b2542f937 100644 --- a/src/or/ext_orport.h +++ b/src/or/ext_orport.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef EXT_ORPORT_H diff --git a/src/or/fp_pair.c b/src/or/fp_pair.c index fc7d107ba7..42bebcd847 100644 --- a/src/or/fp_pair.c +++ b/src/or/fp_pair.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2014, The Tor Project, Inc. */ +/* Copyright (c) 2013-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "or.h" diff --git a/src/or/fp_pair.h b/src/or/fp_pair.h index 67b94fb6b4..0830ab1f36 100644 --- a/src/or/fp_pair.h +++ b/src/or/fp_pair.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2014, The Tor Project, Inc. */ +/* Copyright (c) 2013-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/geoip.c b/src/or/geoip.c index c02343d489..5564b72a04 100644 --- a/src/or/geoip.c +++ b/src/or/geoip.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2007-2014, The Tor Project, Inc. */ +/* Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/geoip.h b/src/or/geoip.h index cec19ea564..683ec073b2 100644 --- a/src/or/geoip.h +++ b/src/or/geoip.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/hibernate.c b/src/or/hibernate.c index 4f0660c2dc..356e11f6ec 100644 --- a/src/or/hibernate.c +++ b/src/or/hibernate.c @@ -1,5 +1,5 @@ /* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/hibernate.h b/src/or/hibernate.h index 0616e11c57..b9e619c5ad 100644 --- a/src/or/hibernate.h +++ b/src/or/hibernate.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/include.am b/src/or/include.am index 0f53f007f0..b44e1099dc 100644 --- a/src/or/include.am +++ b/src/or/include.am @@ -74,6 +74,7 @@ LIBTOR_A_SOURCES = \ src/or/routerlist.c \ src/or/routerparse.c \ src/or/routerset.c \ + src/or/scheduler.c \ src/or/statefile.c \ src/or/status.c \ src/or/onion_ntor.c \ @@ -110,7 +111,7 @@ src_or_tor_LDADD = src/or/libtor.a src/common/libor.a \ src/common/libor-crypto.a $(LIBDONNA) \ src/common/libor-event.a \ @TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ @TOR_LIBEVENT_LIBS@ @TOR_OPENSSL_LIBS@ \ - @TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@ + @TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@ @TOR_SYSTEMD_LIBS@ if COVERAGE_ENABLED src_or_tor_cov_SOURCES = src/or/tor_main.c @@ -121,7 +122,10 @@ src_or_tor_cov_LDADD = src/or/libtor-testing.a src/common/libor-testing.a \ src/common/libor-crypto-testing.a $(LIBDONNA) \ src/common/libor-event-testing.a \ @TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ @TOR_LIBEVENT_LIBS@ @TOR_OPENSSL_LIBS@ \ - @TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@ + @TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@ @TOR_SYSTEMD_LIBS@ +TESTING_TOR_BINARY = ./src/or/tor-cov +else +TESTING_TOR_BINARY = ./src/or/tor endif ORHEADERS = \ @@ -179,6 +183,7 @@ ORHEADERS = \ src/or/routerlist.h \ src/or/routerset.h \ src/or/routerparse.h \ + src/or/scheduler.h \ src/or/statefile.h \ src/or/status.h diff --git a/src/or/main.c b/src/or/main.c index 5a4e0a3e2d..136043c117 100644 --- a/src/or/main.c +++ b/src/or/main.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -53,6 +53,7 @@ #include "router.h" #include "routerlist.h" #include "routerparse.h" +#include "scheduler.h" #include "statefile.h" #include "status.h" #include "util_process.h" @@ -74,6 +75,16 @@ #include <event2/bufferevent.h> #endif +#ifdef HAVE_SYSTEMD +# if defined(__COVERITY__) && !defined(__INCLUDE_LEVEL__) +/* Systemd's use of gcc's __INCLUDE_LEVEL__ extension macro appears to confuse + * Coverity. Here's a kludge to unconfuse it. + */ +# define __INCLUDE_LEVEL__ 2 +# endif +#include <systemd/sd-daemon.h> +#endif + void evdns_shutdown(int); /********* PROTOTYPES **********/ @@ -150,7 +161,7 @@ static int called_loop_once = 0; * any longer (a big time jump happened, when we notice our directory is * heinously out-of-date, etc. */ -int can_complete_circuit=0; +static int can_complete_circuits = 0; /** How often do we check for router descriptors that we should download * when we have too little directory info? */ @@ -171,11 +182,11 @@ int quiet_level = 0; /********* END VARIABLES ************/ /**************************************************************************** -* -* This section contains accessors and other methods on the connection_array -* variables (which are global within this file and unavailable outside it). -* -****************************************************************************/ + * + * This section contains accessors and other methods on the connection_array + * variables (which are global within this file and unavailable outside it). + * + ****************************************************************************/ #if 0 && defined(USE_BUFFEREVENTS) static void @@ -223,6 +234,31 @@ set_buffer_lengths_to_zero(tor_socket_t s) } #endif +/** Return 1 if we have successfully built a circuit, and nothing has changed + * to make us think that maybe we can't. + */ +int +have_completed_a_circuit(void) +{ + return can_complete_circuits; +} + +/** Note that we have successfully built a circuit, so that reachability + * testing and introduction points and so on may be attempted. */ +void +note_that_we_completed_a_circuit(void) +{ + can_complete_circuits = 1; +} + +/** Note that something has happened (like a clock jump, or DisableNetwork) to + * make us think that maybe we can't complete circuits. */ +void +note_that_we_maybe_cant_complete_circuits(void) +{ + can_complete_circuits = 0; +} + /** Add <b>conn</b> to the array of connections that we can poll on. The * connection's socket must be set; the connection starts out * non-reading and non-writing. @@ -355,6 +391,10 @@ connection_remove(connection_t *conn) (int)conn->s, conn_type_to_string(conn->type), smartlist_len(connection_array)); + if (conn->type == CONN_TYPE_AP && conn->socket_family == AF_UNIX) { + log_info(LD_NET, "Closing SOCKS SocksSocket connection"); + } + control_event_conn_bandwidth(conn); tor_assert(conn->conn_array_index >= 0); @@ -999,7 +1039,7 @@ directory_info_has_arrived(time_t now, int from_cache) } if (server_mode(options) && !net_is_disabled() && !from_cache && - (can_complete_circuit || !any_predicted_circuits(now))) + (have_completed_a_circuit() || !any_predicted_circuits(now))) consider_testing_reachability(1, 1); } @@ -1231,7 +1271,7 @@ run_scheduled_events(time_t now) get_onion_key_set_at()+MIN_ONION_KEY_LIFETIME < now) { log_info(LD_GENERAL,"Rotating onion key."); rotate_onion_key(); - cpuworkers_rotate(); + cpuworkers_rotate_keyinfo(); if (router_rebuild_descriptor(1)<0) { log_info(LD_CONFIG, "Couldn't rebuild router descriptor"); } @@ -1358,6 +1398,11 @@ run_scheduled_events(time_t now) if (next_write && next_write < next_time_to_write_stats_files) next_time_to_write_stats_files = next_write; } + if (options->HiddenServiceStatistics) { + time_t next_write = rep_hist_hs_stats_write(time_to_write_stats_files); + if (next_write && next_write < next_time_to_write_stats_files) + next_time_to_write_stats_files = next_write; + } if (options->ExitPortStatistics) { time_t next_write = rep_hist_exit_stats_write(time_to_write_stats_files); if (next_write && next_write < next_time_to_write_stats_files) @@ -1402,7 +1447,7 @@ run_scheduled_events(time_t now) if (time_to_clean_caches < now) { rep_history_clean(now - options->RephistTrackTime); rend_cache_clean(now); - rend_cache_clean_v2_descs_as_dir(now); + rend_cache_clean_v2_descs_as_dir(now, 0); microdesc_cache_rebuild(NULL, 0); #define CLEAN_CACHES_INTERVAL (30*60) time_to_clean_caches = now + CLEAN_CACHES_INTERVAL; @@ -1436,7 +1481,7 @@ run_scheduled_events(time_t now) /* also, check religiously for reachability, if it's within the first * 20 minutes of our uptime. */ if (is_server && - (can_complete_circuit || !any_predicted_circuits(now)) && + (have_completed_a_circuit() || !any_predicted_circuits(now)) && !we_are_hibernating()) { if (stats_n_seconds_working < TIMEOUT_UNTIL_UNREACHABILITY_COMPLAINT) { consider_testing_reachability(1, dirport_reachability_count==0); @@ -1549,7 +1594,7 @@ run_scheduled_events(time_t now) circuit_close_all_marked(); /* 7. And upload service descriptors if necessary. */ - if (can_complete_circuit && !net_is_disabled()) { + if (have_completed_a_circuit() && !net_is_disabled()) { rend_consider_services_upload(now); rend_consider_descriptor_republication(); } @@ -1680,7 +1725,7 @@ second_elapsed_callback(periodic_timer_t *timer, void *arg) if (server_mode(options) && !net_is_disabled() && seconds_elapsed > 0 && - can_complete_circuit && + have_completed_a_circuit() && stats_n_seconds_working / TIMEOUT_UNTIL_UNREACHABILITY_COMPLAINT != (stats_n_seconds_working+seconds_elapsed) / TIMEOUT_UNTIL_UNREACHABILITY_COMPLAINT) { @@ -1728,6 +1773,19 @@ second_elapsed_callback(periodic_timer_t *timer, void *arg) current_second = now; /* remember which second it is, for next time */ } +#ifdef HAVE_SYSTEMD_209 +static periodic_timer_t *systemd_watchdog_timer = NULL; + +/** Libevent callback: invoked to reset systemd watchdog. */ +static void +systemd_watchdog_callback(periodic_timer_t *timer, void *arg) +{ + (void)timer; + (void)arg; + sd_notify(0, "WATCHDOG=1"); +} +#endif + #ifndef USE_BUFFEREVENTS /** Timer: used to invoke refill_callback(). */ static periodic_timer_t *refill_timer = NULL; @@ -1902,9 +1960,9 @@ do_hup(void) * force a retry there. */ if (server_mode(options)) { - /* Restart cpuworker and dnsworker processes, so they get up-to-date + /* Update cpuworker and dnsworker processes, so they get up-to-date * configuration options. */ - cpuworkers_rotate(); + cpuworkers_rotate_keyinfo(); dns_reset(); } return 0; @@ -1996,6 +2054,28 @@ do_main_loop(void) tor_assert(second_timer); } +#ifdef HAVE_SYSTEMD_209 + uint64_t watchdog_delay; + /* set up systemd watchdog notification. */ + if (sd_watchdog_enabled(1, &watchdog_delay) > 0) { + if (! systemd_watchdog_timer) { + struct timeval watchdog; + /* The manager will "act on" us if we don't send them a notification + * every 'watchdog_delay' microseconds. So, send notifications twice + * that often. */ + watchdog_delay /= 2; + watchdog.tv_sec = watchdog_delay / 1000000; + watchdog.tv_usec = watchdog_delay % 1000000; + + systemd_watchdog_timer = periodic_timer_new(tor_libevent_get_base(), + &watchdog, + systemd_watchdog_callback, + NULL); + tor_assert(systemd_watchdog_timer); + } + } +#endif + #ifndef USE_BUFFEREVENTS if (!refill_timer) { struct timeval refill_interval; @@ -2012,6 +2092,11 @@ do_main_loop(void) } #endif +#ifdef HAVE_SYSTEMD + log_notice(LD_GENERAL, "Signaling readiness to systemd"); + sd_notify(0, "READY=1"); +#endif + for (;;) { if (nt_service_is_stopping()) return 0; @@ -2090,6 +2175,9 @@ process_signal(uintptr_t sig) tor_cleanup(); exit(0); } +#ifdef HAVE_SYSTEMD + sd_notify(0, "STOPPING=1"); +#endif hibernate_begin_shutdown(); break; #ifdef SIGPIPE @@ -2109,11 +2197,17 @@ process_signal(uintptr_t sig) control_event_signal(sig); break; case SIGHUP: +#ifdef HAVE_SYSTEMD + sd_notify(0, "RELOADING=1"); +#endif if (do_hup() < 0) { log_warn(LD_CONFIG,"Restart failed (config error?). Exiting."); tor_cleanup(); exit(1); } +#ifdef HAVE_SYSTEMD + sd_notify(0, "READY=1"); +#endif control_event_signal(sig); break; #ifdef SIGCHLD @@ -2137,6 +2231,10 @@ process_signal(uintptr_t sig) addressmap_clear_transient(); control_event_signal(sig); break; + case SIGHEARTBEAT: + log_heartbeat(time(NULL)); + control_event_signal(sig); + break; } } @@ -2553,6 +2651,7 @@ tor_free_all(int postfork) channel_tls_free_all(); channel_free_all(); connection_free_all(); + scheduler_free_all(); buf_shrink_freelists(1); memarea_clear_freelist(); nodelist_free_all(); diff --git a/src/or/main.h b/src/or/main.h index e918517b82..f77b4711c5 100644 --- a/src/or/main.h +++ b/src/or/main.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -12,7 +12,9 @@ #ifndef TOR_MAIN_H #define TOR_MAIN_H -extern int can_complete_circuit; +int have_completed_a_circuit(void); +void note_that_we_completed_a_circuit(void); +void note_that_we_maybe_cant_complete_circuits(void); int connection_add_impl(connection_t *conn, int is_connecting); #define connection_add(conn) connection_add_impl((conn), 0) diff --git a/src/or/microdesc.c b/src/or/microdesc.c index 7b826008b5..0511e870d1 100644 --- a/src/or/microdesc.c +++ b/src/or/microdesc.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2014, The Tor Project, Inc. */ +/* Copyright (c) 2009-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "or.h" diff --git a/src/or/microdesc.h b/src/or/microdesc.h index fdfe8922ab..08571e4bd5 100644 --- a/src/or/microdesc.h +++ b/src/or/microdesc.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/networkstatus.c b/src/or/networkstatus.c index 21efdd129d..59ba1e6cb7 100644 --- a/src/or/networkstatus.c +++ b/src/or/networkstatus.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -832,6 +832,10 @@ update_consensus_networkstatus_fetch_time_impl(time_t now, int flav) a crazy-fast voting interval, though, 2 minutes may be too much. */ min_sec_before_caching = interval/16; + /* make sure we always delay by at least a second before caching */ + if (min_sec_before_caching == 0) { + min_sec_before_caching = 1; + } } if (directory_fetches_dir_info_early(options)) { @@ -863,8 +867,17 @@ update_consensus_networkstatus_fetch_time_impl(time_t now, int flav) dl_interval = (c->valid_until - start) - min_sec_before_caching; } } + /* catch low dl_interval in crazy-fast networks */ if (dl_interval < 1) dl_interval = 1; + /* catch late start in crazy-fast networks */ + if (start+dl_interval >= c->valid_until) + start = c->valid_until - dl_interval - 1; + log_debug(LD_DIR, + "fresh_until: %ld start: %ld " + "dl_interval: %ld valid_until: %ld ", + (long)c->fresh_until, (long)start, dl_interval, + (long)c->valid_until); /* We must not try to replace c while it's still fresh: */ tor_assert(c->fresh_until < start); /* We must download the next one before c is invalid: */ diff --git a/src/or/networkstatus.h b/src/or/networkstatus.h index a087a79ac3..d6e9e37013 100644 --- a/src/or/networkstatus.h +++ b/src/or/networkstatus.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/nodelist.c b/src/or/nodelist.c index 53abc820f5..249c198214 100644 --- a/src/or/nodelist.c +++ b/src/or/nodelist.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "or.h" @@ -24,6 +24,23 @@ static void nodelist_drop_node(node_t *node, int remove_from_ht); static void node_free(node_t *node); + +/** count_usable_descriptors counts descriptors with these flag(s) + */ +typedef enum { + /* All descriptors regardless of flags */ + USABLE_DESCRIPTOR_ALL = 0, + /* Only descriptors with the Exit flag */ + USABLE_DESCRIPTOR_EXIT_ONLY = 1 +} usable_descriptor_t; +static void count_usable_descriptors(int *num_present, + int *num_usable, + smartlist_t *descs_out, + const networkstatus_t *consensus, + const or_options_t *options, + time_t now, + routerset_t *in_set, + usable_descriptor_t exit_only); static void update_router_have_minimum_dir_info(void); static double get_frac_paths_needed_for_circs(const or_options_t *options, const networkstatus_t *ns); @@ -1256,20 +1273,28 @@ router_set_status(const char *digest, int up) } /** True iff, the last time we checked whether we had enough directory info - * to build circuits, the answer was "yes". */ + * to build circuits, the answer was "yes". If there are no exits in the + * consensus, we act as if we have 100% of the exit directory info. */ static int have_min_dir_info = 0; + +/** Does the consensus contain nodes that can exit? */ +static consensus_path_type_t have_consensus_path = CONSENSUS_PATH_UNKNOWN; + /** True iff enough has changed since the last time we checked whether we had * enough directory info to build circuits that our old answer can no longer * be trusted. */ static int need_to_update_have_min_dir_info = 1; /** String describing what we're missing before we have enough directory * info. */ -static char dir_info_status[256] = ""; - -/** Return true iff we have enough networkstatus and router information to - * start building circuits. Right now, this means "more than half the - * networkstatus documents, and at least 1/4 of expected routers." */ -//XXX should consider whether we have enough exiting nodes here. +static char dir_info_status[512] = ""; + +/** Return true iff we have enough consensus information to + * start building circuits. Right now, this means "a consensus that's + * less than a day old, and at least 60% of router descriptors (configurable), + * weighted by bandwidth. Treat the exit fraction as 100% if there are + * no exits in the consensus." + * To obtain the final weighted bandwidth, we multiply the + * weighted bandwidth fraction for each position (guard, middle, exit). */ int router_have_minimum_dir_info(void) { @@ -1291,6 +1316,24 @@ router_have_minimum_dir_info(void) return have_min_dir_info; } +/** Set to CONSENSUS_PATH_EXIT if there is at least one exit node + * in the consensus. We update this flag in compute_frac_paths_available if + * there is at least one relay that has an Exit flag in the consensus. + * Used to avoid building exit circuits when they will almost certainly fail. + * Set to CONSENSUS_PATH_INTERNAL if there are no exits in the consensus. + * (This situation typically occurs during bootstrap of a test network.) + * Set to CONSENSUS_PATH_UNKNOWN if we have never checked, or have + * reason to believe our last known value was invalid or has expired. + * If we're in a network with TestingDirAuthVoteExit set, + * this can cause router_have_consensus_path() to be set to + * CONSENSUS_PATH_EXIT, even if there are no nodes with accept exit policies. + */ +consensus_path_type_t +router_have_consensus_path(void) +{ + return have_consensus_path; +} + /** Called when our internal view of the directory has changed. This can be * when the authorities change, networkstatuses change, the list of routerdescs * changes, or number of running routers changes. @@ -1313,20 +1356,23 @@ get_dir_info_status_string(void) /** Iterate over the servers listed in <b>consensus</b>, and count how many of * them seem like ones we'd use, and how many of <em>those</em> we have * descriptors for. Store the former in *<b>num_usable</b> and the latter in - * *<b>num_present</b>. If <b>in_set</b> is non-NULL, only consider those - * routers in <b>in_set</b>. If <b>exit_only</b> is true, only consider nodes - * with the Exit flag. If *descs_out is present, add a node_t for each - * usable descriptor to it. + * *<b>num_present</b>. + * If <b>in_set</b> is non-NULL, only consider those routers in <b>in_set</b>. + * If <b>exit_only</b> is USABLE_DESCRIPTOR_EXIT_ONLY, only consider nodes + * with the Exit flag. + * If *<b>descs_out</b> is present, add a node_t for each usable descriptor + * to it. */ static void count_usable_descriptors(int *num_present, int *num_usable, smartlist_t *descs_out, const networkstatus_t *consensus, const or_options_t *options, time_t now, - routerset_t *in_set, int exit_only) + routerset_t *in_set, + usable_descriptor_t exit_only) { const int md = (consensus->flavor == FLAV_MICRODESC); - *num_present = 0, *num_usable=0; + *num_present = 0, *num_usable = 0; SMARTLIST_FOREACH_BEGIN(consensus->routerstatus_list, routerstatus_t *, rs) { @@ -1334,7 +1380,7 @@ count_usable_descriptors(int *num_present, int *num_usable, if (!node) continue; /* This would be a bug: every entry in the consensus is * supposed to have a node. */ - if (exit_only && ! rs->is_exit) + if (exit_only == USABLE_DESCRIPTOR_EXIT_ONLY && ! rs->is_exit) continue; if (in_set && ! routerset_contains_routerstatus(in_set, rs, -1)) continue; @@ -1358,11 +1404,21 @@ count_usable_descriptors(int *num_present, int *num_usable, log_debug(LD_DIR, "%d usable, %d present (%s%s).", *num_usable, *num_present, - md ? "microdesc" : "desc", exit_only ? " exits" : "s"); + md ? "microdesc" : "desc", + exit_only == USABLE_DESCRIPTOR_EXIT_ONLY ? " exits" : "s"); } /** Return an estimate of which fraction of usable paths through the Tor - * network we have available for use. */ + * network we have available for use. + * Count how many routers seem like ones we'd use, and how many of + * <em>those</em> we have descriptors for. Store the former in + * *<b>num_usable_out</b> and the latter in *<b>num_present_out</b>. + * If **<b>status_out</b> is present, allocate a new string and print the + * available percentages of guard, middle, and exit nodes to it, noting + * whether there are exits in the consensus. + * If there are no guards in the consensus, + * we treat the exit fraction as 100%. + */ static double compute_frac_paths_available(const networkstatus_t *consensus, const or_options_t *options, time_t now, @@ -1375,14 +1431,19 @@ compute_frac_paths_available(const networkstatus_t *consensus, smartlist_t *myexits= smartlist_new(); smartlist_t *myexits_unflagged = smartlist_new(); double f_guard, f_mid, f_exit, f_myexit, f_myexit_unflagged; - int np, nu; /* Ignored */ + double f_path = 0.0; + /* Used to determine whether there are any exits in the consensus */ + int np = 0; + /* Used to determine whether there are any exits with descriptors */ + int nu = 0; const int authdir = authdir_mode_v3(options); count_usable_descriptors(num_present_out, num_usable_out, - mid, consensus, options, now, NULL, 0); + mid, consensus, options, now, NULL, + USABLE_DESCRIPTOR_ALL); if (options->EntryNodes) { count_usable_descriptors(&np, &nu, guards, consensus, options, now, - options->EntryNodes, 0); + options->EntryNodes, USABLE_DESCRIPTOR_ALL); } else { SMARTLIST_FOREACH(mid, const node_t *, node, { if (authdir) { @@ -1395,22 +1456,78 @@ compute_frac_paths_available(const networkstatus_t *consensus, }); } - /* All nodes with exit flag */ + /* All nodes with exit flag + * If we're in a network with TestingDirAuthVoteExit set, + * this can cause false positives on have_consensus_path, + * incorrectly setting it to CONSENSUS_PATH_EXIT. This is + * an unavoidable feature of forcing authorities to declare + * certain nodes as exits. + */ count_usable_descriptors(&np, &nu, exits, consensus, options, now, - NULL, 1); + NULL, USABLE_DESCRIPTOR_EXIT_ONLY); + log_debug(LD_NET, + "%s: %d present, %d usable", + "exits", + np, + nu); + + /* We need at least 1 exit present in the consensus to consider + * building exit paths */ + /* Update our understanding of whether the consensus has exits */ + consensus_path_type_t old_have_consensus_path = have_consensus_path; + have_consensus_path = ((np > 0) ? + CONSENSUS_PATH_EXIT : + CONSENSUS_PATH_INTERNAL); + + if (have_consensus_path == CONSENSUS_PATH_INTERNAL + && old_have_consensus_path != have_consensus_path) { + log_notice(LD_NET, + "The current consensus has no exit nodes. " + "Tor can only build internal paths, " + "such as paths to hidden services."); + + /* However, exit nodes can reachability self-test using this consensus, + * join the network, and appear in a later consensus. This will allow + * the network to build exit paths, such as paths for world wide web + * browsing (as distinct from hidden service web browsing). */ + } + /* All nodes with exit flag in ExitNodes option */ count_usable_descriptors(&np, &nu, myexits, consensus, options, now, - options->ExitNodes, 1); + options->ExitNodes, USABLE_DESCRIPTOR_EXIT_ONLY); + log_debug(LD_NET, + "%s: %d present, %d usable", + "myexits", + np, + nu); + /* Now compute the nodes in the ExitNodes option where which we don't know * what their exit policy is, or we know it permits something. */ count_usable_descriptors(&np, &nu, myexits_unflagged, consensus, options, now, - options->ExitNodes, 0); + options->ExitNodes, USABLE_DESCRIPTOR_ALL); + log_debug(LD_NET, + "%s: %d present, %d usable", + "myexits_unflagged (initial)", + np, + nu); + SMARTLIST_FOREACH_BEGIN(myexits_unflagged, const node_t *, node) { - if (node_has_descriptor(node) && node_exit_policy_rejects_all(node)) + if (node_has_descriptor(node) && node_exit_policy_rejects_all(node)) { SMARTLIST_DEL_CURRENT(myexits_unflagged, node); + /* this node is not actually an exit */ + np--; + /* this node is unusable as an exit */ + nu--; + } } SMARTLIST_FOREACH_END(node); + log_debug(LD_NET, + "%s: %d present, %d usable", + "myexits_unflagged (final)", + np, + nu); + f_guard = frac_nodes_with_descriptors(guards, WEIGHT_FOR_GUARD); f_mid = frac_nodes_with_descriptors(mid, WEIGHT_FOR_MID); f_exit = frac_nodes_with_descriptors(exits, WEIGHT_FOR_EXIT); @@ -1418,6 +1535,12 @@ compute_frac_paths_available(const networkstatus_t *consensus, f_myexit_unflagged= frac_nodes_with_descriptors(myexits_unflagged,WEIGHT_FOR_EXIT); + log_debug(LD_NET, + "f_exit: %.2f, f_myexit: %.2f, f_myexit_unflagged: %.2f", + f_exit, + f_myexit, + f_myexit_unflagged); + /* If our ExitNodes list has eliminated every possible Exit node, and there * were some possible Exit nodes, then instead consider nodes that permit * exiting to some ports. */ @@ -1439,16 +1562,28 @@ compute_frac_paths_available(const networkstatus_t *consensus, if (f_myexit < f_exit) f_exit = f_myexit; + /* if the consensus has no exits, treat the exit fraction as 100% */ + if (router_have_consensus_path() != CONSENSUS_PATH_EXIT) { + f_exit = 1.0; + } + + f_path = f_guard * f_mid * f_exit; + if (status_out) tor_asprintf(status_out, "%d%% of guards bw, " "%d%% of midpoint bw, and " - "%d%% of exit bw", + "%d%% of exit bw%s = " + "%d%% of path bw", (int)(f_guard*100), (int)(f_mid*100), - (int)(f_exit*100)); + (int)(f_exit*100), + (router_have_consensus_path() == CONSENSUS_PATH_EXIT ? + "" : + " (no exits in consensus)"), + (int)(f_path*100)); - return f_guard * f_mid * f_exit; + return f_path; } /** We just fetched a new set of descriptors. Compute how far through @@ -1521,6 +1656,9 @@ update_router_have_minimum_dir_info(void) using_md = consensus->flavor == FLAV_MICRODESC; +#define NOTICE_DIR_INFO_STATUS_INTERVAL (60) + + /* Check fraction of available paths */ { char *status = NULL; int num_present=0, num_usable=0; @@ -1529,16 +1667,37 @@ update_router_have_minimum_dir_info(void) &status); if (paths < get_frac_paths_needed_for_circs(options,consensus)) { - tor_snprintf(dir_info_status, sizeof(dir_info_status), - "We need more %sdescriptors: we have %d/%d, and " - "can only build %d%% of likely paths. (We have %s.)", - using_md?"micro":"", num_present, num_usable, - (int)(paths*100), status); - /* log_notice(LD_NET, "%s", dir_info_status); */ + /* these messages can be excessive in testing networks */ + static ratelim_t last_warned = + RATELIM_INIT(NOTICE_DIR_INFO_STATUS_INTERVAL); + char *suppression_msg = NULL; + if ((suppression_msg = rate_limit_log(&last_warned, time(NULL)))) { + tor_snprintf(dir_info_status, sizeof(dir_info_status), + "We need more %sdescriptors: we have %d/%d, and " + "can only build %d%% of likely paths. (We have %s.)", + using_md?"micro":"", num_present, num_usable, + (int)(paths*100), status); + log_warn(LD_NET, "%s%s", dir_info_status, suppression_msg); + tor_free(suppression_msg); + } tor_free(status); res = 0; control_event_bootstrap(BOOTSTRAP_STATUS_REQUESTING_DESCRIPTORS, 0); goto done; + } else { + /* these messages can be excessive in testing networks */ + static ratelim_t last_warned = + RATELIM_INIT(NOTICE_DIR_INFO_STATUS_INTERVAL); + char *suppression_msg = NULL; + if ((suppression_msg = rate_limit_log(&last_warned, time(NULL)))) { + tor_snprintf(dir_info_status, sizeof(dir_info_status), + "We have enough %sdescriptors: we have %d/%d, and " + "can build %d%% of likely paths. (We have %s.)", + using_md?"micro":"", num_present, num_usable, + (int)(paths*100), status); + log_info(LD_NET, "%s%s", dir_info_status, suppression_msg); + tor_free(suppression_msg); + } } tor_free(status); @@ -1546,12 +1705,16 @@ update_router_have_minimum_dir_info(void) } done: + + /* If paths have just become available in this update. */ if (res && !have_min_dir_info) { log_notice(LD_DIR, "We now have enough directory information to build circuits."); control_event_client_status(LOG_NOTICE, "ENOUGH_DIR_INFO"); control_event_bootstrap(BOOTSTRAP_STATUS_CONN_OR, 0); } + + /* If paths have just become unavailable in this update. */ if (!res && have_min_dir_info) { int quiet = directory_too_idle_to_fetch_descriptors(options, now); tor_log(quiet ? LOG_INFO : LOG_NOTICE, LD_DIR, @@ -1562,8 +1725,8 @@ update_router_have_minimum_dir_info(void) * is back up and usable, and b) disable some activities that Tor * should only do while circuits are working, like reachability tests * and fetching bridge descriptors only over circuits. */ - can_complete_circuit = 0; - + note_that_we_maybe_cant_complete_circuits(); + have_consensus_path = CONSENSUS_PATH_UNKNOWN; control_event_client_status(LOG_NOTICE, "NOT_ENOUGH_DIR_INFO"); } have_min_dir_info = res; diff --git a/src/or/nodelist.h b/src/or/nodelist.h index 48b0e94be0..a131e0dd4e 100644 --- a/src/or/nodelist.h +++ b/src/or/nodelist.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -79,7 +79,37 @@ int node_is_unreliable(const node_t *router, int need_uptime, int router_exit_policy_all_nodes_reject(const tor_addr_t *addr, uint16_t port, int need_uptime); void router_set_status(const char *digest, int up); + +/** router_have_minimum_dir_info tests to see if we have enough + * descriptor information to create circuits. + * If there are exits in the consensus, we wait until we have enough + * info to create exit paths before creating any circuits. If there are + * no exits in the consensus, we wait for enough info to create internal + * paths, and should avoid creating exit paths, as they will simply fail. + * We make sure we create all available circuit types at the same time. */ int router_have_minimum_dir_info(void); + +/** Set to CONSENSUS_PATH_EXIT if there is at least one exit node + * in the consensus. We update this flag in compute_frac_paths_available if + * there is at least one relay that has an Exit flag in the consensus. + * Used to avoid building exit circuits when they will almost certainly fail. + * Set to CONSENSUS_PATH_INTERNAL if there are no exits in the consensus. + * (This situation typically occurs during bootstrap of a test network.) + * Set to CONSENSUS_PATH_UNKNOWN if we have never checked, or have + * reason to believe our last known value was invalid or has expired. + */ +typedef enum { + /* we haven't checked yet, or we have invalidated our previous check */ + CONSENSUS_PATH_UNKNOWN = -1, + /* The consensus only has internal relays, and we should only + * create internal paths, circuits, streams, ... */ + CONSENSUS_PATH_INTERNAL = 0, + /* The consensus has at least one exit, and can therefore (potentially) + * create exit and internal paths, circuits, streams, ... */ + CONSENSUS_PATH_EXIT = 1 +} consensus_path_type_t; +consensus_path_type_t router_have_consensus_path(void); + void router_dir_info_changed(void); const char *get_dir_info_status_string(void); int count_loading_descriptors_progress(void); diff --git a/src/or/ntmain.c b/src/or/ntmain.c index ea6ec3b03e..833d870041 100644 --- a/src/or/ntmain.c +++ b/src/or/ntmain.c @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "or.h" diff --git a/src/or/ntmain.h b/src/or/ntmain.h index 68565e17ca..eb55a296f6 100644 --- a/src/or/ntmain.h +++ b/src/or/ntmain.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/onion.c b/src/or/onion.c index b8f85f9194..43fb63c832 100644 --- a/src/or/onion.c +++ b/src/or/onion.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -295,6 +295,8 @@ onion_pending_remove(or_circuit_t *circ) victim = circ->onionqueue_entry; if (victim) onion_queue_entry_remove(victim); + + cpuworker_cancel_circ_handshake(circ); } /** Remove a queue entry <b>victim</b> from the queue, unlinking it from @@ -339,25 +341,25 @@ clear_pending_onions(void) /* ============================================================ */ -/** Fill in a server_onion_keys_t object at <b>keys</b> with all of the keys +/** Return a new server_onion_keys_t object with all of the keys * and other info we might need to do onion handshakes. (We make a copy of * our keys for each cpuworker to avoid race conditions with the main thread, * and to avoid locking) */ -void -setup_server_onion_keys(server_onion_keys_t *keys) +server_onion_keys_t * +server_onion_keys_new(void) { - memset(keys, 0, sizeof(server_onion_keys_t)); + server_onion_keys_t *keys = tor_malloc_zero(sizeof(server_onion_keys_t)); memcpy(keys->my_identity, router_get_my_id_digest(), DIGEST_LEN); dup_onion_keys(&keys->onion_key, &keys->last_onion_key); keys->curve25519_key_map = construct_ntor_key_map(); keys->junk_keypair = tor_malloc_zero(sizeof(curve25519_keypair_t)); curve25519_keypair_generate(keys->junk_keypair, 0); + return keys; } -/** Release all storage held in <b>keys</b>, but do not free <b>keys</b> - * itself (as it's likely to be stack-allocated.) */ +/** Release all storage held in <b>keys</b>. */ void -release_server_onion_keys(server_onion_keys_t *keys) +server_onion_keys_free(server_onion_keys_t *keys) { if (! keys) return; @@ -366,7 +368,8 @@ release_server_onion_keys(server_onion_keys_t *keys) crypto_pk_free(keys->last_onion_key); ntor_key_map_free(keys->curve25519_key_map); tor_free(keys->junk_keypair); - memset(keys, 0, sizeof(server_onion_keys_t)); + memwipe(keys, 0, sizeof(server_onion_keys_t)); + tor_free(keys); } /** Release whatever storage is held in <b>state</b>, depending on its diff --git a/src/or/onion.h b/src/or/onion.h index 2fd86206e4..96050083f8 100644 --- a/src/or/onion.h +++ b/src/or/onion.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -30,8 +30,8 @@ typedef struct server_onion_keys_t { #define MAX_ONIONSKIN_CHALLENGE_LEN 255 #define MAX_ONIONSKIN_REPLY_LEN 255 -void setup_server_onion_keys(server_onion_keys_t *keys); -void release_server_onion_keys(server_onion_keys_t *keys); +server_onion_keys_t *server_onion_keys_new(void); +void server_onion_keys_free(server_onion_keys_t *keys); void onion_handshake_state_release(onion_handshake_state_t *state); diff --git a/src/or/onion_fast.c b/src/or/onion_fast.c index 0ca3e3a5a0..a52a11357c 100644 --- a/src/or/onion_fast.c +++ b/src/or/onion_fast.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/onion_fast.h b/src/or/onion_fast.h index 2fc605fc42..da3c217ae9 100644 --- a/src/or/onion_fast.h +++ b/src/or/onion_fast.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/onion_ntor.c b/src/or/onion_ntor.c index c028ed0ff9..7f58f4d758 100644 --- a/src/or/onion_ntor.c +++ b/src/or/onion_ntor.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2014, The Tor Project, Inc. */ +/* Copyright (c) 2012-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" diff --git a/src/or/onion_ntor.h b/src/or/onion_ntor.h index 29178e942d..230941c3c5 100644 --- a/src/or/onion_ntor.h +++ b/src/or/onion_ntor.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2014, The Tor Project, Inc. */ +/* Copyright (c) 2012-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TOR_ONION_NTOR_H diff --git a/src/or/onion_tap.c b/src/or/onion_tap.c index b3b2a008bc..8879a22ca2 100644 --- a/src/or/onion_tap.c +++ b/src/or/onion_tap.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/onion_tap.h b/src/or/onion_tap.h index 36fb649d60..f02a4f6f51 100644 --- a/src/or/onion_tap.h +++ b/src/or/onion_tap.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/or.h b/src/or/or.h index b95bfb15a9..49068784f9 100644 --- a/src/or/or.h +++ b/src/or/or.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -119,6 +119,7 @@ * conflict with system-defined signals. */ #define SIGNEWNYM 129 #define SIGCLEARDNSCACHE 130 +#define SIGHEARTBEAT 131 #if (SIZEOF_CELL_T != 0) /* On Irix, stdlib.h defines a cell_t type, so we need to make sure @@ -212,8 +213,7 @@ typedef enum { #define CONN_TYPE_DIR_LISTENER 8 /** Type for HTTP connections to the directory server. */ #define CONN_TYPE_DIR 9 -/** Connection from the main process to a CPU worker process. */ -#define CONN_TYPE_CPUWORKER 10 +/* Type 10 is unused. */ /** Type for listening for connections from user interface process. */ #define CONN_TYPE_CONTROL_LISTENER 11 /** Type for connections from user interface process. */ @@ -275,17 +275,6 @@ typedef enum { /** State for any listener connection. */ #define LISTENER_STATE_READY 0 -#define CPUWORKER_STATE_MIN_ 1 -/** State for a connection to a cpuworker process that's idle. */ -#define CPUWORKER_STATE_IDLE 1 -/** State for a connection to a cpuworker process that's processing a - * handshake. */ -#define CPUWORKER_STATE_BUSY_ONION 2 -#define CPUWORKER_STATE_MAX_ 2 - -#define CPUWORKER_TASK_ONION CPUWORKER_STATE_BUSY_ONION -#define CPUWORKER_TASK_SHUTDOWN 255 - #define OR_CONN_STATE_MIN_ 1 /** State for a connection to an OR: waiting for connect() to finish. */ #define OR_CONN_STATE_CONNECTING 1 @@ -676,6 +665,10 @@ typedef enum { /* Negative reasons are internal: we never send them in a DESTROY or TRUNCATE * call; they only go to the controller for tracking */ + +/* Closing introduction point that were opened in parallel. */ +#define END_CIRC_REASON_IP_NOW_REDUNDANT -4 + /** Our post-timeout circuit time measurement period expired. * We must give up now */ #define END_CIRC_REASON_MEASUREMENT_EXPIRED -3 @@ -1138,6 +1131,51 @@ typedef struct socks_request_t socks_request_t; #define generic_buffer_t buf_t #endif +typedef struct entry_port_cfg_t { + /* Client port types (socks, dns, trans, natd) only: */ + uint8_t isolation_flags; /**< Zero or more isolation flags */ + int session_group; /**< A session group, or -1 if this port is not in a + * session group. */ + + /* Socks only: */ + /** When both no-auth and user/pass are advertised by a SOCKS client, select + * no-auth. */ + unsigned int socks_prefer_no_auth : 1; + + /* Client port types only: */ + unsigned int ipv4_traffic : 1; + unsigned int ipv6_traffic : 1; + unsigned int prefer_ipv6 : 1; + + /** For a socks listener: should we cache IPv4/IPv6 DNS information that + * exit nodes tell us? + * + * @{ */ + unsigned int cache_ipv4_answers : 1; + unsigned int cache_ipv6_answers : 1; + /** @} */ + /** For a socks listeners: if we find an answer in our client-side DNS cache, + * should we use it? + * + * @{ */ + unsigned int use_cached_ipv4_answers : 1; + unsigned int use_cached_ipv6_answers : 1; + /** @} */ + /** For socks listeners: When we can automap an address to IPv4 or IPv6, + * do we prefer IPv6? */ + unsigned int prefer_ipv6_virtaddr : 1; + +} entry_port_cfg_t; + +typedef struct server_port_cfg_t { + /* Server port types (or, dir) only: */ + unsigned int no_advertise : 1; + unsigned int no_listen : 1; + unsigned int all_addrs : 1; + unsigned int bind_ipv4_only : 1; + unsigned int bind_ipv6_only : 1; +} server_port_cfg_t; + /* Values for connection_t.magic: used to make sure that downcasts (casts from * connection_t to foo_connection_t) are safe. */ #define BASE_CONNECTION_MAGIC 0x7C3C304Eu @@ -1273,52 +1311,7 @@ typedef struct listener_connection_t { * to the evdns_server_port it uses to listen to and answer connections. */ struct evdns_server_port *dns_server_port; - /** @name Isolation parameters - * - * For an AP listener, these fields describe how to isolate streams that - * arrive on the listener. - * - * @{ - */ - /** The session group for this listener. */ - int session_group; - /** One or more ISO_ flags to describe how to isolate streams. */ - uint8_t isolation_flags; - /**@}*/ - /** For SOCKS connections only: If this is set, we will choose "no - * authentication" instead of "username/password" authentication if both - * are offered. Used as input to parse_socks. */ - unsigned int socks_prefer_no_auth : 1; - - /** For a SOCKS listeners, these fields describe whether we should - * allow IPv4 and IPv6 addresses from our exit nodes, respectively. - * - * @{ - */ - unsigned int socks_ipv4_traffic : 1; - unsigned int socks_ipv6_traffic : 1; - /** @} */ - /** For a socks listener: should we tell the exit that we prefer IPv6 - * addresses? */ - unsigned int socks_prefer_ipv6 : 1; - - /** For a socks listener: should we cache IPv4/IPv6 DNS information that - * exit nodes tell us? - * - * @{ */ - unsigned int cache_ipv4_answers : 1; - unsigned int cache_ipv6_answers : 1; - /** @} */ - /** For a socks listeners: if we find an answer in our client-side DNS cache, - * should we use it? - * - * @{ */ - unsigned int use_cached_ipv4_answers : 1; - unsigned int use_cached_ipv6_answers : 1; - /** @} */ - /** For socks listeners: When we can automap an address to IPv4 or IPv6, - * do we prefer IPv6? */ - unsigned int prefer_ipv6_virtaddr : 1; + entry_port_cfg_t entry_cfg; } listener_connection_t; @@ -1426,6 +1419,18 @@ typedef struct or_handshake_state_t { /** Length of Extended ORPort connection identifier. */ #define EXT_OR_CONN_ID_LEN DIGEST_LEN /* 20 */ +/* + * OR_CONN_HIGHWATER and OR_CONN_LOWWATER moved from connection_or.c so + * channeltls.c can see them too. + */ + +/** When adding cells to an OR connection's outbuf, keep adding until the + * outbuf is at least this long, or we run out of cells. */ +#define OR_CONN_HIGHWATER (32*1024) + +/** Add cells to an OR connection's outbuf whenever the outbuf's data length + * drops below this size. */ +#define OR_CONN_LOWWATER (16*1024) /** Subtype of connection_t for an "OR connection" -- that is, one that speaks * cells over TLS. */ @@ -1517,6 +1522,12 @@ typedef struct or_connection_t { /** Last emptied write token bucket in msec since midnight; only used if * TB_EMPTY events are enabled. */ uint32_t write_emptied_time; + + /* + * Count the number of bytes flushed out on this orconn, and the number of + * bytes TLS actually sent - used for overhead estimation for scheduling. + */ + uint64_t bytes_xmitted, bytes_xmitted_by_tls; } or_connection_t; /** Subtype of connection_t for an "edge connection" -- that is, an entry (ap) @@ -1588,12 +1599,10 @@ typedef struct entry_connection_t { * only.) */ /* === Isolation related, AP only. === */ - /** AP only: based on which factors do we isolate this stream? */ - uint8_t isolation_flags; - /** AP only: what session group is this stream in? */ - int session_group; + entry_port_cfg_t entry_cfg; /** AP only: The newnym epoch in which we created this connection. */ unsigned nym_epoch; + /** AP only: The original requested address before we rewrote it. */ char *original_dest_address; /* Other fields to isolate on already exist. The ClientAddr is addr. The @@ -1652,33 +1661,8 @@ typedef struct entry_connection_t { */ unsigned int may_use_optimistic_data : 1; - /** Should we permit IPv4 and IPv6 traffic to use this connection? - * - * @{ */ - unsigned int ipv4_traffic_ok : 1; - unsigned int ipv6_traffic_ok : 1; - /** @} */ - /** Should we say we prefer IPv6 traffic? */ - unsigned int prefer_ipv6_traffic : 1; - - /** For a socks listener: should we cache IPv4/IPv6 DNS information that - * exit nodes tell us? - * - * @{ */ - unsigned int cache_ipv4_answers : 1; - unsigned int cache_ipv6_answers : 1; - /** @} */ - /** For a socks listeners: if we find an answer in our client-side DNS cache, - * should we use it? - * - * @{ */ - unsigned int use_cached_ipv4_answers : 1; - unsigned int use_cached_ipv6_answers : 1; - /** @} */ - /** For socks listeners: When we can automap an address to IPv4 or IPv6, - * do we prefer IPv6? */ - unsigned int prefer_ipv6_virtaddr : 1; - + /** Are we a socks SocksSocket listener? */ + unsigned int is_socks_socket:1; } entry_connection_t; typedef enum { @@ -2711,8 +2695,14 @@ typedef struct { time_t expiry_time; } cpath_build_state_t; +/** "magic" value for an origin_circuit_t */ #define ORIGIN_CIRCUIT_MAGIC 0x35315243u +/** "magic" value for an or_circuit_t */ #define OR_CIRCUIT_MAGIC 0x98ABC04Fu +/** "magic" value for a circuit that would have been freed by circuit_free, + * but which we're keeping around until a cpuworker reply arrives. See + * circuit_free() for more documentation. */ +#define DEAD_CIRCUIT_MAGIC 0xdeadc14c struct create_cell_t; @@ -3132,6 +3122,9 @@ typedef struct or_circuit_t { /** Pointer to an entry on the onion queue, if this circuit is waiting for a * chance to give an onionskin to a cpuworker. Used only in onion.c */ struct onion_queue_t *onionqueue_entry; + /** Pointer to a workqueue entry, if this circuit has given an onionskin to + * a cpuworker and is waiting for a response. Used only in cpuworker.c */ + struct workqueue_entry_s *workqueue_entry; /** The circuit_id used in the previous (backward) hop of this circuit. */ circid_t p_circ_id; @@ -3181,6 +3174,10 @@ typedef struct or_circuit_t { /** True iff this circuit was made with a CREATE_FAST cell. */ unsigned int is_first_hop : 1; + /** If set, this circuit carries HS traffic. Consider it in any HS + * statistics. */ + unsigned int circuit_carries_hs_traffic_stats : 1; + /** Number of cells that were removed from circuit queue; reset every * time when writing buffer stats to disk. */ uint32_t processed_cells; @@ -3315,44 +3312,9 @@ typedef struct port_cfg_t { uint8_t type; /**< One of CONN_TYPE_*_LISTENER */ unsigned is_unix_addr : 1; /**< True iff this is an AF_UNIX address. */ - /* Client port types (socks, dns, trans, natd) only: */ - uint8_t isolation_flags; /**< Zero or more isolation flags */ - int session_group; /**< A session group, or -1 if this port is not in a - * session group. */ - /* Socks only: */ - /** When both no-auth and user/pass are advertised by a SOCKS client, select - * no-auth. */ - unsigned int socks_prefer_no_auth : 1; + entry_port_cfg_t entry_cfg; - /* Server port types (or, dir) only: */ - unsigned int no_advertise : 1; - unsigned int no_listen : 1; - unsigned int all_addrs : 1; - unsigned int bind_ipv4_only : 1; - unsigned int bind_ipv6_only : 1; - - /* Client port types only: */ - unsigned int ipv4_traffic : 1; - unsigned int ipv6_traffic : 1; - unsigned int prefer_ipv6 : 1; - - /** For a socks listener: should we cache IPv4/IPv6 DNS information that - * exit nodes tell us? - * - * @{ */ - unsigned int cache_ipv4_answers : 1; - unsigned int cache_ipv6_answers : 1; - /** @} */ - /** For a socks listeners: if we find an answer in our client-side DNS cache, - * should we use it? - * - * @{ */ - unsigned int use_cached_ipv4_answers : 1; - unsigned int use_cached_ipv6_answers : 1; - /** @} */ - /** For socks listeners: When we can automap an address to IPv4 or IPv6, - * do we prefer IPv6? */ - unsigned int prefer_ipv6_virtaddr : 1; + server_port_cfg_t server_cfg; /* Unix sockets only: */ /** Path for an AF_UNIX address */ @@ -3501,6 +3463,10 @@ typedef struct { * for control connections. */ int ControlSocketsGroupWritable; /**< Boolean: Are control sockets g+rw? */ + config_line_t *SocksSocket; /**< List of Unix Domain Sockets to listen on + * for SOCKS connections. */ + + int SocksSocketsGroupWritable; /**< Boolean: Are SOCKS sockets g+rw? */ /** Ports to listen on for directory connections. */ config_line_t *DirPort_lines; config_line_t *DNSPort_lines; /**< Ports to listen on for DNS requests. */ @@ -3510,6 +3476,8 @@ typedef struct { uint64_t MaxMemInQueues_raw; uint64_t MaxMemInQueues;/**< If we have more memory than this allocated * for queues and buffers, run the OOM handler */ + /** Above this value, consider ourselves low on RAM. */ + uint64_t MaxMemInQueues_low_threshold; /** @name port booleans * @@ -3521,6 +3489,7 @@ typedef struct { */ unsigned int ORPort_set : 1; unsigned int SocksPort_set : 1; + unsigned int SocksSocket_set : 1; unsigned int TransPort_set : 1; unsigned int NATDPort_set : 1; unsigned int ControlPort_set : 1; @@ -3646,8 +3615,9 @@ typedef struct { * hostname ending with one of the suffixes in * <b>AutomapHostsSuffixes</b>, map it to a * virtual address. */ - smartlist_t *AutomapHostsSuffixes; /**< List of suffixes for - * <b>AutomapHostsOnResolve</b>. */ + /** List of suffixes for <b>AutomapHostsOnResolve</b>. The special value + * "." means "match everything." */ + smartlist_t *AutomapHostsSuffixes; int RendPostPeriod; /**< How often do we post each rendezvous service * descriptor? Remember to publish them independently. */ int KeepalivePeriod; /**< How often do we send padding cells to keep @@ -3938,6 +3908,10 @@ typedef struct { /** If true, the user wants us to collect statistics as entry node. */ int EntryStatistics; + /** If true, the user wants us to collect statistics as hidden service + * directory, introduction point, or rendezvous point. */ + int HiddenServiceStatistics; + /** If true, include statistics file contents in extra-info documents. */ int ExtraInfoStatistics; @@ -4071,6 +4045,11 @@ typedef struct { * regardless of uptime and bandwidth. */ routerset_t *TestingDirAuthVoteGuard; + /** Relays in a testing network which should be voted HSDir + * regardless of uptime and ORPort connectivity. + * Respects VoteOnHidServDirectoriesV2. */ + routerset_t *TestingDirAuthVoteHSDir; + /** Enable CONN_BW events. Only altered on testing networks. */ int TestingEnableConnBwEvent; @@ -4225,8 +4204,25 @@ typedef struct { /** How long (seconds) do we keep a guard before picking a new one? */ int GuardLifetime; - /** Should we send the timestamps that pre-023 hidden services want? */ - int Support022HiddenServices; + /** Low-water mark for global scheduler - start sending when estimated + * queued size falls below this threshold. + */ + uint64_t SchedulerLowWaterMark__; + /** High-water mark for global scheduler - stop sending when estimated + * queued size exceeds this threshold. + */ + uint64_t SchedulerHighWaterMark__; + /** Flush size for global scheduler - flush this many cells at a time + * when sending. + */ + int SchedulerMaxFlushCells__; + + /** Is this an exit node? This is a tristate, where "1" means "yes, and use + * the default exit policy if none is given" and "0" means "no; exit policy + * is 'reject *'" and "auto" (-1) means "same as 1, but warn the user." + * + * XXXX Eventually, the default will be 0. */ + int ExitRelay; } or_options_t; @@ -4898,7 +4894,8 @@ typedef struct rend_service_descriptor_t { /** A cached rendezvous descriptor. */ typedef struct rend_cache_entry_t { size_t len; /**< Length of <b>desc</b> */ - time_t received; /**< When was the descriptor received? */ + time_t last_served; /**< When did we last write this one to somebody? + * (HSDir only) */ char *desc; /**< Service descriptor */ rend_service_descriptor_t *parsed; /**< Parsed value of 'desc' */ } rend_cache_entry_t; @@ -4964,14 +4961,13 @@ typedef struct dir_server_t { * or extrainfo documents. * * Passed to router_pick_directory_server (et al) - * - * [XXXX NOTE: This option is only implemented for pick_trusteddirserver, - * not pick_directory_server. If we make it work on pick_directory_server - * too, we could conservatively make it only prevent multiple fetches to - * the same authority, or we could aggressively make it prevent multiple - * fetches to _any_ single directory server.] */ #define PDS_NO_EXISTING_SERVERDESC_FETCH (1<<3) +/** Flag to indicate that we should not use any directory authority to which + * we have an existing directory connection for downloading microdescs. + * + * Passed to router_pick_directory_server (et al) + */ #define PDS_NO_EXISTING_MICRODESC_FETCH (1<<4) /** This node is to be chosen as a directory guard, so don't choose any @@ -4999,15 +4995,31 @@ typedef enum { /** Return value for router_add_to_routerlist() and dirserv_add_descriptor() */ typedef enum was_router_added_t { + /* Router was added successfully. */ ROUTER_ADDED_SUCCESSFULLY = 1, + /* Router descriptor was added with warnings to submitter. */ ROUTER_ADDED_NOTIFY_GENERATOR = 0, + /* Extrainfo document was rejected because no corresponding router + * descriptor was found OR router descriptor was rejected because + * it was incompatible with its extrainfo document. */ ROUTER_BAD_EI = -1, - ROUTER_WAS_NOT_NEW = -2, + /* Router descriptor was rejected because it is already known. */ + ROUTER_IS_ALREADY_KNOWN = -2, + /* General purpose router was rejected, because it was not listed + * in consensus. */ ROUTER_NOT_IN_CONSENSUS = -3, + /* Router was neither in directory consensus nor in any of + * networkstatus documents. Caching it to access later. + * (Applies to fetched descriptors only.) */ ROUTER_NOT_IN_CONSENSUS_OR_NETWORKSTATUS = -4, + /* Router was rejected by directory authority. */ ROUTER_AUTHDIR_REJECTS = -5, + /* Bridge descriptor was rejected because such bridge was not one + * of the bridges we have listed in our configuration. */ ROUTER_WAS_NOT_WANTED = -6, - ROUTER_WAS_TOO_OLD = -7, + /* Router descriptor was rejected because it was older than + * OLD_ROUTER_DESC_MAX_AGE. */ + ROUTER_WAS_TOO_OLD = -7, /* note contrast with 'NOT_NEW' */ } was_router_added_t; /********************************* routerparse.c ************************/ diff --git a/src/or/policies.c b/src/or/policies.c index d10bebd79a..560b8cb4c3 100644 --- a/src/or/policies.c +++ b/src/or/policies.c @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -434,6 +434,33 @@ validate_addr_policies(const or_options_t *options, char **msg) REJECT("Error in ExitPolicy entry."); } + static int warned_about_exitrelay = 0; + + const int exitrelay_setting_is_auto = options->ExitRelay == -1; + const int policy_accepts_something = + ! (policy_is_reject_star(addr_policy, AF_INET) && + policy_is_reject_star(addr_policy, AF_INET6)); + + if (server_mode(options) && + ! warned_about_exitrelay && + exitrelay_setting_is_auto && + policy_accepts_something) { + /* Policy accepts something */ + warned_about_exitrelay = 1; + log_warn(LD_CONFIG, + "Tor is running as an exit relay%s. If you did not want this " + "behavior, please set the ExitRelay option to 0. If you do " + "want to run an exit Relay, please set the ExitRelay option " + "to 1 to disable this warning, and for forward compatibility.", + options->ExitPolicy == NULL ? + " with the default exit policy" : ""); + if (options->ExitPolicy == NULL) { + log_warn(LD_CONFIG, + "In a future version of Tor, ExitRelay 0 may become the " + "default when no ExitPolicy is given."); + } + } + /* The rest of these calls *append* to addr_policy. So don't actually * use the results for anything other than checking if they parse! */ if (parse_addr_policy(options->DirPolicy, &addr_policy, -1)) @@ -1022,6 +1049,9 @@ policies_parse_exit_policy(config_line_t *cfg, smartlist_t **dest, * * If <b>or_options->BridgeRelay</b> is false, add entries of default * Tor exit policy into <b>result</b> smartlist. + * + * If or_options->ExitRelay is false, then make our exit policy into + * "reject *:*" regardless. */ int policies_parse_exit_policy_from_options(const or_options_t *or_options, @@ -1030,6 +1060,12 @@ policies_parse_exit_policy_from_options(const or_options_t *or_options, { exit_policy_parser_cfg_t parser_cfg = 0; + if (or_options->ExitRelay == 0) { + append_exit_policy_string(result, "reject *4:*"); + append_exit_policy_string(result, "reject *6:*"); + return 0; + } + if (or_options->IPv6Exit) { parser_cfg |= EXIT_POLICY_IPV6_ENABLED; } diff --git a/src/or/policies.h b/src/or/policies.h index 90d94190dd..0225b57a2c 100644 --- a/src/or/policies.h +++ b/src/or/policies.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/reasons.c b/src/or/reasons.c index b0f1b65131..23ab6041a6 100644 --- a/src/or/reasons.c +++ b/src/or/reasons.c @@ -1,5 +1,5 @@ /* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -350,6 +350,8 @@ circuit_end_reason_to_control_string(int reason) return "NOSUCHSERVICE"; case END_CIRC_REASON_MEASUREMENT_EXPIRED: return "MEASUREMENT_EXPIRED"; + case END_CIRC_REASON_IP_NOW_REDUNDANT: + return "IP_NOW_REDUNDANT"; default: if (is_remote) { /* diff --git a/src/or/reasons.h b/src/or/reasons.h index 8b3694b05a..00a099061b 100644 --- a/src/or/reasons.h +++ b/src/or/reasons.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/relay.c b/src/or/relay.c index 05c7b3c955..8653d8c461 100644 --- a/src/or/relay.c +++ b/src/or/relay.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -39,6 +39,7 @@ #include "router.h" #include "routerlist.h" #include "routerparse.h" +#include "scheduler.h" static edge_connection_t *relay_lookup_conn(circuit_t *circ, cell_t *cell, cell_direction_t cell_direction, @@ -803,8 +804,10 @@ connection_ap_process_end_not_open( return 0; } - if ((tor_addr_family(&addr) == AF_INET && !conn->ipv4_traffic_ok) || - (tor_addr_family(&addr) == AF_INET6 && !conn->ipv6_traffic_ok)) { + if ((tor_addr_family(&addr) == AF_INET && + !conn->entry_cfg.ipv4_traffic) || + (tor_addr_family(&addr) == AF_INET6 && + !conn->entry_cfg.ipv6_traffic)) { log_fn(LOG_PROTOCOL_WARN, LD_APP, "Got an EXITPOLICY failure on a connection with a " "mismatched family. Closing."); @@ -1155,11 +1158,11 @@ connection_ap_handshake_socks_got_resolved_cell(entry_connection_t *conn, addr_hostname = addr; } } else if (tor_addr_family(&addr->addr) == AF_INET) { - if (!addr_ipv4 && conn->ipv4_traffic_ok) { + if (!addr_ipv4 && conn->entry_cfg.ipv4_traffic) { addr_ipv4 = addr; } } else if (tor_addr_family(&addr->addr) == AF_INET6) { - if (!addr_ipv6 && conn->ipv6_traffic_ok) { + if (!addr_ipv6 && conn->entry_cfg.ipv6_traffic) { addr_ipv6 = addr; } } @@ -1180,7 +1183,7 @@ connection_ap_handshake_socks_got_resolved_cell(entry_connection_t *conn, return; } - if (conn->prefer_ipv6_traffic) { + if (conn->entry_cfg.prefer_ipv6) { addr_best = addr_ipv6 ? addr_ipv6 : addr_ipv4; } else { addr_best = addr_ipv4 ? addr_ipv4 : addr_ipv6; @@ -1326,8 +1329,8 @@ connection_edge_process_relay_cell_not_open( return 0; } - if ((family == AF_INET && ! entry_conn->ipv4_traffic_ok) || - (family == AF_INET6 && ! entry_conn->ipv6_traffic_ok)) { + if ((family == AF_INET && ! entry_conn->entry_cfg.ipv4_traffic) || + (family == AF_INET6 && ! entry_conn->entry_cfg.ipv6_traffic)) { log_fn(LOG_PROTOCOL_WARN, LD_APP, "Got a connected cell to %s with unsupported address family." " Closing.", fmt_addr(&addr)); @@ -2432,6 +2435,12 @@ cell_queues_get_total_allocation(void) return total_cells_allocated * packed_cell_mem_cost(); } +/** How long after we've been low on memory should we try to conserve it? */ +#define MEMORY_PRESSURE_INTERVAL (30*60) + +/** The time at which we were last low on memory. */ +static time_t last_time_under_memory_pressure = 0; + /** Check whether we've got too much space used for cells. If so, * call the OOM handler and return 1. Otherwise, return 0. */ STATIC int @@ -2440,13 +2449,37 @@ cell_queues_check_size(void) size_t alloc = cell_queues_get_total_allocation(); alloc += buf_get_total_allocation(); alloc += tor_zlib_get_total_allocation(); - if (alloc >= get_options()->MaxMemInQueues) { - circuits_handle_oom(alloc); - return 1; + const size_t rend_cache_total = rend_cache_get_total_allocation(); + alloc += rend_cache_total; + if (alloc >= get_options()->MaxMemInQueues_low_threshold) { + last_time_under_memory_pressure = approx_time(); + if (alloc >= get_options()->MaxMemInQueues) { + /* If we're spending over 20% of the memory limit on hidden service + * descriptors, free them until we're down to 10%. + */ + if (rend_cache_total > get_options()->MaxMemInQueues / 5) { + const size_t bytes_to_remove = + rend_cache_total - (size_t)(get_options()->MaxMemInQueues / 10); + rend_cache_clean_v2_descs_as_dir(time(NULL), bytes_to_remove); + alloc -= rend_cache_total; + alloc += rend_cache_get_total_allocation(); + } + circuits_handle_oom(alloc); + return 1; + } } return 0; } +/** Return true if we've been under memory pressure in the last + * MEMORY_PRESSURE_INTERVAL seconds. */ +int +have_been_under_memory_pressure(void) +{ + return last_time_under_memory_pressure + MEMORY_PRESSURE_INTERVAL + < approx_time(); +} + /** * Update the number of cells available on the circuit's n_chan or p_chan's * circuit mux. @@ -2591,8 +2624,8 @@ packed_cell_get_circid(const packed_cell_t *cell, int wide_circ_ids) * queue of the first active circuit on <b>chan</b>, and write them to * <b>chan</b>->outbuf. Return the number of cells written. Advance * the active circuit pointer to the next active circuit in the ring. */ -int -channel_flush_from_first_active_circuit(channel_t *chan, int max) +MOCK_IMPL(int, +channel_flush_from_first_active_circuit, (channel_t *chan, int max)) { circuitmux_t *cmux = NULL; int n_flushed = 0; @@ -2868,14 +2901,8 @@ append_cell_to_circuit_queue(circuit_t *circ, channel_t *chan, log_debug(LD_GENERAL, "Made a circuit active."); } - if (!channel_has_queued_writes(chan)) { - /* There is no data at all waiting to be sent on the outbuf. Add a - * cell, so that we can notice when it gets flushed, flushed_some can - * get called, and we can start putting more data onto the buffer then. - */ - log_debug(LD_GENERAL, "Primed a buffer."); - channel_flush_from_first_active_circuit(chan, 1); - } + /* New way: mark this as having waiting cells for the scheduler */ + scheduler_channel_has_waiting_cells(chan); } /** Append an encoded value of <b>addr</b> to <b>payload_out</b>, which must diff --git a/src/or/relay.h b/src/or/relay.h index 73c399154d..cdc2a9ae19 100644 --- a/src/or/relay.h +++ b/src/or/relay.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -50,6 +50,8 @@ void clean_cell_pool(void); void dump_cell_pool_usage(int severity); size_t packed_cell_mem_cost(void); +int have_been_under_memory_pressure(void); + /* For channeltls.c */ void packed_cell_free(packed_cell_t *cell); @@ -64,7 +66,8 @@ void append_cell_to_circuit_queue(circuit_t *circ, channel_t *chan, cell_t *cell, cell_direction_t direction, streamid_t fromstream); void channel_unlink_all_circuits(channel_t *chan, smartlist_t *detached_out); -int channel_flush_from_first_active_circuit(channel_t *chan, int max); +MOCK_DECL(int, channel_flush_from_first_active_circuit, + (channel_t *chan, int max)); void assert_circuit_mux_okay(channel_t *chan); void update_circuit_on_cmux_(circuit_t *circ, cell_direction_t direction, const char *file, int lineno); diff --git a/src/or/rendclient.c b/src/or/rendclient.c index 10d13a37bb..0c02243828 100644 --- a/src/or/rendclient.c +++ b/src/or/rendclient.c @@ -1,5 +1,5 @@ /* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -130,16 +130,6 @@ rend_client_reextend_intro_circuit(origin_circuit_t *circ) return result; } -/** Return true iff we should send timestamps in our INTRODUCE1 cells */ -static int -rend_client_should_send_timestamp(void) -{ - if (get_options()->Support022HiddenServices >= 0) - return get_options()->Support022HiddenServices; - - return networkstatus_get_param(NULL, "Support022HiddenServices", 1, 0, 1); -} - /** Called when we're trying to connect an ap conn; sends an INTRODUCE1 cell * down introcirc if possible. */ @@ -251,14 +241,8 @@ rend_client_send_introduction(origin_circuit_t *introcirc, REND_DESC_COOKIE_LEN); v3_shift += 2+REND_DESC_COOKIE_LEN; } - if (rend_client_should_send_timestamp()) { - uint32_t now = (uint32_t)time(NULL); - now += 300; - now -= now % 600; - set_uint32(tmp+v3_shift+1, htonl(now)); - } else { - set_uint32(tmp+v3_shift+1, 0); - } + /* Once this held a timestamp. */ + set_uint32(tmp+v3_shift+1, 0); v3_shift += 4; } /* if version 2 only write version number */ else if (entry->parsed->protocols & (1<<2)) { @@ -370,8 +354,7 @@ rend_client_rendcirc_has_opened(origin_circuit_t *circ) } /** - * Called to close other intro circuits we launched in parallel - * due to timeout. + * Called to close other intro circuits we launched in parallel. */ static void rend_client_close_other_intros(const char *onion_address) @@ -388,7 +371,7 @@ rend_client_close_other_intros(const char *onion_address) log_info(LD_REND|LD_CIRC, "Closing introduction circuit %d that we " "built in parallel (Purpose %d).", oc->global_identifier, c->purpose); - circuit_mark_for_close(c, END_CIRC_REASON_TIMEOUT); + circuit_mark_for_close(c, END_CIRC_REASON_IP_NOW_REDUNDANT); } } } @@ -468,6 +451,13 @@ rend_client_introduction_acked(origin_circuit_t *circ, /* XXXX If that call failed, should we close the rend circuit, * too? */ return result; + } else { + /* Close circuit because no more intro points are usable thus not + * useful anymore. Change it's purpose before so we don't report an + * intro point failure again triggering an extra descriptor fetch. */ + circuit_change_purpose(TO_CIRCUIT(circ), + CIRCUIT_PURPOSE_C_INTRODUCE_ACKED); + circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_FINISHED); } } return 0; @@ -564,7 +554,12 @@ directory_clean_last_hid_serv_requests(time_t now) /** Remove all requests related to the hidden service named * <b>onion_address</b> from the history of times of requests to - * hidden service directories. */ + * hidden service directories. + * + * This is called from rend_client_note_connection_attempt_ended(), which + * must be idempotent, so any future changes to this function must leave + * it idempotent too. + */ static void purge_hid_serv_from_last_hid_serv_requests(const char *onion_address) { @@ -1093,8 +1088,11 @@ rend_client_desc_trynow(const char *query) /** Clear temporary state used only during an attempt to connect to * the hidden service named <b>onion_address</b>. Called when a - * connection attempt has ended; may be called occasionally at other - * times, and should be reasonably harmless. */ + * connection attempt has ended; it is possible for this to be called + * multiple times while handling an ended connection attempt, and + * any future changes to this function must ensure it remains + * idempotent. + */ void rend_client_note_connection_attempt_ended(const char *onion_address) { diff --git a/src/or/rendclient.h b/src/or/rendclient.h index 40d388c489..098c61d0a1 100644 --- a/src/or/rendclient.h +++ b/src/or/rendclient.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/rendcommon.c b/src/or/rendcommon.c index df74b745a2..866f4fb026 100644 --- a/src/or/rendcommon.c +++ b/src/or/rendcommon.c @@ -1,5 +1,5 @@ /* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -411,7 +411,7 @@ rend_desc_v2_is_parsable(rend_encoded_v2_service_descriptor_t *desc) &test_intro_content, &test_intro_size, &test_encoded_size, - &test_next, desc->desc_str); + &test_next, desc->desc_str, 1); rend_service_descriptor_free(test_parsed); tor_free(test_intro_content); return (res >= 0); @@ -704,6 +704,9 @@ static strmap_t *rend_cache = NULL; * directories. */ static digestmap_t *rend_cache_v2_dir = NULL; +/** DOCDOC */ +static size_t rend_cache_total_allocation = 0; + /** Initializes the service descriptor cache. */ void @@ -713,12 +716,64 @@ rend_cache_init(void) rend_cache_v2_dir = digestmap_new(); } +/** Return the approximate number of bytes needed to hold <b>e</b>. */ +static size_t +rend_cache_entry_allocation(const rend_cache_entry_t *e) +{ + if (!e) + return 0; + + /* This doesn't count intro_nodes or key size */ + return sizeof(*e) + e->len + sizeof(*e->parsed); +} + +/** DOCDOC */ +size_t +rend_cache_get_total_allocation(void) +{ + return rend_cache_total_allocation; +} + +/** Decrement the total bytes attributed to the rendezvous cache by n. */ +static void +rend_cache_decrement_allocation(size_t n) +{ + static int have_underflowed = 0; + + if (rend_cache_total_allocation >= n) { + rend_cache_total_allocation -= n; + } else { + rend_cache_total_allocation = 0; + if (! have_underflowed) { + have_underflowed = 1; + log_warn(LD_BUG, "Underflow in rend_cache_decrement_allocation"); + } + } +} + +/** Increase the total bytes attributed to the rendezvous cache by n. */ +static void +rend_cache_increment_allocation(size_t n) +{ + static int have_overflowed = 0; + if (rend_cache_total_allocation <= SIZE_MAX - n) { + rend_cache_total_allocation += n; + } else { + rend_cache_total_allocation = SIZE_MAX; + if (! have_overflowed) { + have_overflowed = 1; + log_warn(LD_BUG, "Overflow in rend_cache_increment_allocation"); + } + } +} + /** Helper: free storage held by a single service descriptor cache entry. */ static void rend_cache_entry_free(rend_cache_entry_t *e) { if (!e) return; + rend_cache_decrement_allocation(rend_cache_entry_allocation(e)); rend_service_descriptor_free(e->parsed); tor_free(e->desc); tor_free(e); @@ -740,6 +795,7 @@ rend_cache_free_all(void) digestmap_free(rend_cache_v2_dir, rend_cache_entry_free_); rend_cache = NULL; rend_cache_v2_dir = NULL; + rend_cache_total_allocation = 0; } /** Removes all old entries from the service descriptor cache. @@ -777,31 +833,46 @@ rend_cache_purge(void) } /** Remove all old v2 descriptors and those for which this hidden service - * directory is not responsible for any more. */ + * directory is not responsible for any more. + * + * If at all possible, remove at least <b>force_remove</b> bytes of data. + */ void -rend_cache_clean_v2_descs_as_dir(time_t now) +rend_cache_clean_v2_descs_as_dir(time_t now, size_t force_remove) { digestmap_iter_t *iter; time_t cutoff = now - REND_CACHE_MAX_AGE - REND_CACHE_MAX_SKEW; - for (iter = digestmap_iter_init(rend_cache_v2_dir); - !digestmap_iter_done(iter); ) { - const char *key; - void *val; - rend_cache_entry_t *ent; - digestmap_iter_get(iter, &key, &val); - ent = val; - if (ent->parsed->timestamp < cutoff || - !hid_serv_responsible_for_desc_id(key)) { - char key_base32[REND_DESC_ID_V2_LEN_BASE32 + 1]; - base32_encode(key_base32, sizeof(key_base32), key, DIGEST_LEN); - log_info(LD_REND, "Removing descriptor with ID '%s' from cache", - safe_str_client(key_base32)); - iter = digestmap_iter_next_rmv(rend_cache_v2_dir, iter); - rend_cache_entry_free(ent); - } else { - iter = digestmap_iter_next(rend_cache_v2_dir, iter); + const int LAST_SERVED_CUTOFF_STEP = 1800; + time_t last_served_cutoff = cutoff; + size_t bytes_removed = 0; + do { + for (iter = digestmap_iter_init(rend_cache_v2_dir); + !digestmap_iter_done(iter); ) { + const char *key; + void *val; + rend_cache_entry_t *ent; + digestmap_iter_get(iter, &key, &val); + ent = val; + if (ent->parsed->timestamp < cutoff || + ent->last_served < last_served_cutoff || + !hid_serv_responsible_for_desc_id(key)) { + char key_base32[REND_DESC_ID_V2_LEN_BASE32 + 1]; + base32_encode(key_base32, sizeof(key_base32), key, DIGEST_LEN); + log_info(LD_REND, "Removing descriptor with ID '%s' from cache", + safe_str_client(key_base32)); + bytes_removed += rend_cache_entry_allocation(ent); + iter = digestmap_iter_next_rmv(rend_cache_v2_dir, iter); + rend_cache_entry_free(ent); + } else { + iter = digestmap_iter_next(rend_cache_v2_dir, iter); + } } - } + + /* In case we didn't remove enough bytes, advance the cutoff a little. */ + last_served_cutoff += LAST_SERVED_CUTOFF_STEP; + if (last_served_cutoff > now) + break; + } while (bytes_removed < force_remove); } /** Determines whether <b>a</b> is in the interval of <b>b</b> (excluded) and @@ -903,6 +974,7 @@ rend_cache_lookup_v2_desc_as_dir(const char *desc_id, const char **desc) e = digestmap_get(rend_cache_v2_dir, desc_id_digest); if (e) { *desc = e->desc; + e->last_served = approx_time(); return 1; } return 0; @@ -924,6 +996,7 @@ rend_cache_lookup_v2_desc_as_dir(const char *desc_id, const char **desc) rend_cache_store_status_t rend_cache_store_v2_desc_as_dir(const char *desc) { + const or_options_t *options = get_options(); rend_service_descriptor_t *parsed; char desc_id[DIGEST_LEN]; char *intro_content; @@ -945,7 +1018,7 @@ rend_cache_store_v2_desc_as_dir(const char *desc) } while (rend_parse_v2_service_descriptor(&parsed, desc_id, &intro_content, &intro_size, &encoded_size, - &next_desc, current_desc) >= 0) { + &next_desc, current_desc, 1) >= 0) { number_parsed++; /* We don't care about the introduction points. */ tor_free(intro_content); @@ -985,24 +1058,35 @@ rend_cache_store_v2_desc_as_dir(const char *desc) if (e && !strcmp(desc, e->desc)) { log_info(LD_REND, "We already have this service descriptor with desc " "ID %s.", safe_str(desc_id_base32)); - e->received = time(NULL); goto skip; } /* Store received descriptor. */ if (!e) { e = tor_malloc_zero(sizeof(rend_cache_entry_t)); digestmap_set(rend_cache_v2_dir, desc_id, e); + /* Treat something just uploaded as having been served a little + * while ago, so that flooding with new descriptors doesn't help + * too much. + */ + e->last_served = approx_time() - 3600; } else { + rend_cache_decrement_allocation(rend_cache_entry_allocation(e)); rend_service_descriptor_free(e->parsed); tor_free(e->desc); } - e->received = time(NULL); e->parsed = parsed; e->desc = tor_strndup(current_desc, encoded_size); e->len = encoded_size; + rend_cache_increment_allocation(rend_cache_entry_allocation(e)); log_info(LD_REND, "Successfully stored service descriptor with desc ID " "'%s' and len %d.", safe_str(desc_id_base32), (int)encoded_size); + + /* Statistics: Note down this potentially new HS. */ + if (options->HiddenServiceStatistics) { + rep_hist_stored_maybe_new_hs(e->parsed->pk); + } + number_stored++; goto advance; skip: @@ -1084,7 +1168,7 @@ rend_cache_store_v2_desc_as_client(const char *desc, /* Parse the descriptor. */ if (rend_parse_v2_service_descriptor(&parsed, desc_id, &intro_content, &intro_size, &encoded_size, - &next_desc, desc) < 0) { + &next_desc, desc, 0) < 0) { log_warn(LD_REND, "Could not parse descriptor."); goto err; } @@ -1165,31 +1249,25 @@ rend_cache_store_v2_desc_as_client(const char *desc, /* Do we already have a newer descriptor? */ tor_snprintf(key, sizeof(key), "2%s", service_id); e = (rend_cache_entry_t*) strmap_get_lc(rend_cache, key); - if (e && e->parsed->timestamp > parsed->timestamp) { - log_info(LD_REND, "We already have a newer service descriptor for " + if (e && e->parsed->timestamp >= parsed->timestamp) { + log_info(LD_REND, "We already have a new enough service descriptor for " "service ID %s with the same desc ID and version.", safe_str_client(service_id)); goto okay; } - /* Do we already have this descriptor? */ - if (e && !strcmp(desc, e->desc)) { - log_info(LD_REND,"We already have this service descriptor %s.", - safe_str_client(service_id)); - e->received = time(NULL); - goto okay; - } if (!e) { e = tor_malloc_zero(sizeof(rend_cache_entry_t)); strmap_set_lc(rend_cache, key, e); } else { + rend_cache_decrement_allocation(rend_cache_entry_allocation(e)); rend_service_descriptor_free(e->parsed); tor_free(e->desc); } - e->received = time(NULL); e->parsed = parsed; e->desc = tor_malloc_zero(encoded_size + 1); strlcpy(e->desc, desc, encoded_size + 1); e->len = encoded_size; + rend_cache_increment_allocation(rend_cache_entry_allocation(e)); log_debug(LD_REND,"Successfully stored rend desc '%s', len %d.", safe_str_client(service_id), (int)encoded_size); return RCS_OKAY; diff --git a/src/or/rendcommon.h b/src/or/rendcommon.h index 186326a0c1..8396cc3551 100644 --- a/src/or/rendcommon.h +++ b/src/or/rendcommon.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -33,7 +33,7 @@ void rend_intro_point_free(rend_intro_point_t *intro); void rend_cache_init(void); void rend_cache_clean(time_t now); -void rend_cache_clean_v2_descs_as_dir(time_t now); +void rend_cache_clean_v2_descs_as_dir(time_t now, size_t min_to_remove); void rend_cache_purge(void); void rend_cache_free_all(void); int rend_valid_service_id(const char *query); @@ -51,7 +51,6 @@ rend_cache_store_status_t rend_cache_store_v2_desc_as_dir(const char *desc); rend_cache_store_status_t rend_cache_store_v2_desc_as_client(const char *desc, const char *desc_id_base32, const rend_data_t *rend_query); - int rend_encode_v2_descriptors(smartlist_t *descs_out, rend_service_descriptor_t *desc, time_t now, uint8_t period, rend_auth_type_t auth_type, @@ -64,6 +63,7 @@ int rend_id_is_in_interval(const char *a, const char *b, const char *c); void rend_get_descriptor_id_bytes(char *descriptor_id_out, const char *service_id, const char *secret_id_part); +size_t rend_cache_get_total_allocation(void); #endif diff --git a/src/or/rendmid.c b/src/or/rendmid.c index 6a701e7a77..9f6ff86c47 100644 --- a/src/or/rendmid.c +++ b/src/or/rendmid.c @@ -1,5 +1,5 @@ /* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -281,6 +281,7 @@ int rend_mid_rendezvous(or_circuit_t *circ, const uint8_t *request, size_t request_len) { + const or_options_t *options = get_options(); or_circuit_t *rend_circ; char hexid[9]; int reason = END_CIRC_REASON_INTERNAL; @@ -316,6 +317,12 @@ rend_mid_rendezvous(or_circuit_t *circ, const uint8_t *request, goto err; } + /* Statistics: Mark this circuit as an RP circuit so that we collect + stats from it. */ + if (options->HiddenServiceStatistics) { + circ->circuit_carries_hs_traffic_stats = 1; + } + /* Send the RENDEZVOUS2 cell to Alice. */ if (relay_send_command_from_edge(0, TO_CIRCUIT(rend_circ), RELAY_COMMAND_RENDEZVOUS2, diff --git a/src/or/rendmid.h b/src/or/rendmid.h index 25c711fa7b..6bd691a740 100644 --- a/src/or/rendmid.h +++ b/src/or/rendmid.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/rendservice.c b/src/or/rendservice.c index 3fed540e84..8d3f041759 100644 --- a/src/or/rendservice.c +++ b/src/or/rendservice.c @@ -1,5 +1,5 @@ /* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -16,6 +16,7 @@ #include "circuituse.h" #include "config.h" #include "directory.h" +#include "main.h" #include "networkstatus.h" #include "nodelist.h" #include "rendclient.h" @@ -65,9 +66,16 @@ static ssize_t rend_service_parse_intro_for_v3( * a real port on some IP. */ typedef struct rend_service_port_config_t { + /* The incoming HS virtual port we're mapping */ uint16_t virtual_port; + /* Is this an AF_UNIX port? */ + unsigned int is_unix_addr:1; + /* The outgoing TCP port to use, if !is_unix_addr */ uint16_t real_port; + /* The outgoing IPv4 or IPv6 address to use, if !is_unix_addr */ tor_addr_t real_addr; + /* The socket path to connect to, if is_unix_addr */ + char unix_addr[FLEXIBLE_ARRAY_MEMBER]; } rend_service_port_config_t; /** Try to maintain this many intro points per service by default. */ @@ -128,6 +136,9 @@ typedef struct rend_service_t { * when they do, this keeps us from launching multiple simultaneous attempts * to connect to the same rend point. */ replaycache_t *accepted_intro_dh_parts; + /** If true, we don't close circuits for making requests to unsupported + * ports. */ + int allow_unknown_ports; } rend_service_t; /** A list of rend_service_t's for services run on this OP. @@ -275,16 +286,48 @@ rend_add_service(rend_service_t *service) service->directory); for (i = 0; i < smartlist_len(service->ports); ++i) { p = smartlist_get(service->ports, i); - log_debug(LD_REND,"Service maps port %d to %s", - p->virtual_port, fmt_addrport(&p->real_addr, p->real_port)); + if (!(p->is_unix_addr)) { + log_debug(LD_REND, + "Service maps port %d to %s", + p->virtual_port, + fmt_addrport(&p->real_addr, p->real_port)); + } else { +#ifdef HAVE_SYS_UN_H + log_debug(LD_REND, + "Service maps port %d to socket at \"%s\"", + p->virtual_port, p->unix_addr); +#else + log_debug(LD_REND, + "Service maps port %d to an AF_UNIX socket, but we " + "have no AF_UNIX support on this platform. This is " + "probably a bug.", + p->virtual_port); +#endif /* defined(HAVE_SYS_UN_H) */ + } } } } +/** Return a new rend_service_port_config_t with its path set to + * <b>socket_path</b> or empty if <b>socket_path</b> is NULL */ +static rend_service_port_config_t * +rend_service_port_config_new(const char *socket_path) +{ + if (!socket_path) + return tor_malloc_zero(sizeof(rend_service_port_config_t)); + + const size_t pathlen = strlen(socket_path) + 1; + rend_service_port_config_t *conf = + tor_malloc_zero(sizeof(rend_service_port_config_t) + pathlen); + memcpy(conf->unix_addr, socket_path, pathlen); + conf->is_unix_addr = 1; + return conf; +} + /** Parses a real-port to virtual-port mapping and returns a new * rend_service_port_config_t. * - * The format is: VirtualPort (IP|RealPort|IP:RealPort)? + * The format is: VirtualPort (IP|RealPort|IP:RealPort|'socket':path)? * * IP defaults to 127.0.0.1; RealPort defaults to VirtualPort. */ @@ -298,6 +341,9 @@ parse_port_config(const char *string) tor_addr_t addr; const char *addrport; rend_service_port_config_t *result = NULL; + const char *socket_prefix = "socket:"; + unsigned int is_unix_addr = 0; + char *socket_path = NULL; sl = smartlist_new(); smartlist_split_string(sl, string, " ", @@ -320,7 +366,26 @@ parse_port_config(const char *string) tor_addr_from_ipv4h(&addr, 0x7F000001u); /* 127.0.0.1 */ } else { addrport = smartlist_get(sl,1); - if (strchr(addrport, ':') || strchr(addrport, '.')) { + /* If it starts with socket:, try to parse it as a socket path */ + if (!strcmpstart(addrport, socket_prefix)) { + if (strlen(addrport + strlen(socket_prefix)) > 0) { +#ifdef HAVE_SYS_UN_H + is_unix_addr = 1; + socket_path = tor_strdup(addrport + strlen(socket_prefix)); +#else + log_warn(LD_CONFIG, + "Hidden service port configuration %s is for an AF_UNIX " + "socket, but we have no support available on this platform", + escaped(addrport)); + goto err; +#endif /* defined(HAVE_SYS_UN_H) */ + } else { + log_warn(LD_CONFIG, + "Empty socket path in hidden service port configuration."); + goto err; + } + } else if (strchr(addrport, ':') || strchr(addrport, '.')) { + /* else try it as an IP:port pair if it has a : or . in it */ if (tor_addr_port_lookup(addrport, &addr, &p)<0) { log_warn(LD_CONFIG,"Unparseable address in hidden service port " "configuration."); @@ -339,13 +404,21 @@ parse_port_config(const char *string) } } - result = tor_malloc(sizeof(rend_service_port_config_t)); + /* Allow room for unix_addr */ + result = rend_service_port_config_new(socket_path); result->virtual_port = virtport; - result->real_port = realport; - tor_addr_copy(&result->real_addr, &addr); + result->is_unix_addr = is_unix_addr; + if (!is_unix_addr) { + result->real_port = realport; + tor_addr_copy(&result->real_addr, &addr); + result->unix_addr[0] = '\0'; + } + err: SMARTLIST_FOREACH(sl, char *, c, tor_free(c)); smartlist_free(sl); + if (socket_path) tor_free(socket_path); + return result; } @@ -372,101 +445,114 @@ rend_config_services(const or_options_t *options, int validate_only) if (!strcasecmp(line->key, "HiddenServiceDir")) { if (service) { /* register the one we just finished parsing */ if (validate_only) - rend_service_free(service); - else - rend_add_service(service); - } - service = tor_malloc_zero(sizeof(rend_service_t)); - service->directory = tor_strdup(line->value); - service->ports = smartlist_new(); - service->intro_period_started = time(NULL); - service->n_intro_points_wanted = NUM_INTRO_POINTS_DEFAULT; - continue; - } - if (!service) { - log_warn(LD_CONFIG, "%s with no preceding HiddenServiceDir directive", - line->key); - rend_service_free(service); - return -1; - } - if (!strcasecmp(line->key, "HiddenServicePort")) { - portcfg = parse_port_config(line->value); - if (!portcfg) { - rend_service_free(service); - return -1; - } - smartlist_add(service->ports, portcfg); - } else if (!strcasecmp(line->key, - "HiddenServiceDirGroupReadable")) { - service->dir_group_readable = (int)tor_parse_long(line->value, - 10, 0, 1, &ok, NULL); - if (!ok) { - log_warn(LD_CONFIG, - "HiddenServiceDirGroupReadable should be 0 or 1, not %s", - line->value); - rend_service_free(service); - return -1; - } - log_info(LD_CONFIG, - "HiddenServiceDirGroupReadable=%d for %s", - service->dir_group_readable, service->directory); - } else if (!strcasecmp(line->key, "HiddenServiceAuthorizeClient")) { - /* Parse auth type and comma-separated list of client names and add a - * rend_authorized_client_t for each client to the service's list - * of authorized clients. */ - smartlist_t *type_names_split, *clients; - const char *authname; - int num_clients; - if (service->auth_type != REND_NO_AUTH) { - log_warn(LD_CONFIG, "Got multiple HiddenServiceAuthorizeClient " - "lines for a single service."); - rend_service_free(service); - return -1; - } - type_names_split = smartlist_new(); - smartlist_split_string(type_names_split, line->value, " ", 0, 2); - if (smartlist_len(type_names_split) < 1) { - log_warn(LD_BUG, "HiddenServiceAuthorizeClient has no value. This " - "should have been prevented when parsing the " - "configuration."); - smartlist_free(type_names_split); - rend_service_free(service); - return -1; - } - authname = smartlist_get(type_names_split, 0); - if (!strcasecmp(authname, "basic")) { - service->auth_type = REND_BASIC_AUTH; - } else if (!strcasecmp(authname, "stealth")) { - service->auth_type = REND_STEALTH_AUTH; - } else { - log_warn(LD_CONFIG, "HiddenServiceAuthorizeClient contains " - "unrecognized auth-type '%s'. Only 'basic' or 'stealth' " - "are recognized.", - (char *) smartlist_get(type_names_split, 0)); - SMARTLIST_FOREACH(type_names_split, char *, cp, tor_free(cp)); - smartlist_free(type_names_split); - rend_service_free(service); - return -1; - } - service->clients = smartlist_new(); - if (smartlist_len(type_names_split) < 2) { - log_warn(LD_CONFIG, "HiddenServiceAuthorizeClient contains " - "auth-type '%s', but no client names.", - service->auth_type == REND_BASIC_AUTH ? "basic" : "stealth"); - SMARTLIST_FOREACH(type_names_split, char *, cp, tor_free(cp)); - smartlist_free(type_names_split); - continue; - } - clients = smartlist_new(); - smartlist_split_string(clients, smartlist_get(type_names_split, 1), - ",", SPLIT_SKIP_SPACE, 0); - SMARTLIST_FOREACH(type_names_split, char *, cp, tor_free(cp)); - smartlist_free(type_names_split); - /* Remove duplicate client names. */ - num_clients = smartlist_len(clients); - smartlist_sort_strings(clients); - smartlist_uniq_strings(clients); - if (smartlist_len(clients) < num_clients) { + rend_service_free(service); + else + rend_add_service(service); + } + service = tor_malloc_zero(sizeof(rend_service_t)); + service->directory = tor_strdup(line->value); + service->ports = smartlist_new(); + service->intro_period_started = time(NULL); + service->n_intro_points_wanted = NUM_INTRO_POINTS_DEFAULT; + continue; + } + if (!service) { + log_warn(LD_CONFIG, "%s with no preceding HiddenServiceDir directive", + line->key); + rend_service_free(service); + return -1; + } + if (!strcasecmp(line->key, "HiddenServicePort")) { + portcfg = parse_port_config(line->value); + if (!portcfg) { + rend_service_free(service); + return -1; + } + smartlist_add(service->ports, portcfg); + } else if (!strcasecmp(line->key, "HiddenServiceAllowUnknownPorts")) { + service->allow_unknown_ports = (int)tor_parse_long(line->value, + 10, 0, 1, &ok, NULL); + if (!ok) { + log_warn(LD_CONFIG, + "HiddenServiceAllowUnknownPorts should be 0 or 1, not %s", + line->value); + rend_service_free(service); + return -1; + } + log_info(LD_CONFIG, + "HiddenServiceAllowUnknownPorts=%d for %s", + (int)service->allow_unknown_ports, service->directory); + } else if (!strcasecmp(line->key, + "HiddenServiceDirGroupReadable")) { + service->dir_group_readable = (int)tor_parse_long(line->value, + 10, 0, 1, &ok, NULL); + if (!ok) { + log_warn(LD_CONFIG, + "HiddenServiceDirGroupReadable should be 0 or 1, not %s", + line->value); + rend_service_free(service); + return -1; + } + log_info(LD_CONFIG, + "HiddenServiceDirGroupReadable=%d for %s", + service->dir_group_readable, service->directory); + } else if (!strcasecmp(line->key, "HiddenServiceAuthorizeClient")) { + /* Parse auth type and comma-separated list of client names and add a + * rend_authorized_client_t for each client to the service's list + * of authorized clients. */ + smartlist_t *type_names_split, *clients; + const char *authname; + int num_clients; + if (service->auth_type != REND_NO_AUTH) { + log_warn(LD_CONFIG, "Got multiple HiddenServiceAuthorizeClient " + "lines for a single service."); + rend_service_free(service); + return -1; + } + type_names_split = smartlist_new(); + smartlist_split_string(type_names_split, line->value, " ", 0, 2); + if (smartlist_len(type_names_split) < 1) { + log_warn(LD_BUG, "HiddenServiceAuthorizeClient has no value. This " + "should have been prevented when parsing the " + "configuration."); + smartlist_free(type_names_split); + rend_service_free(service); + return -1; + } + authname = smartlist_get(type_names_split, 0); + if (!strcasecmp(authname, "basic")) { + service->auth_type = REND_BASIC_AUTH; + } else if (!strcasecmp(authname, "stealth")) { + service->auth_type = REND_STEALTH_AUTH; + } else { + log_warn(LD_CONFIG, "HiddenServiceAuthorizeClient contains " + "unrecognized auth-type '%s'. Only 'basic' or 'stealth' " + "are recognized.", + (char *) smartlist_get(type_names_split, 0)); + SMARTLIST_FOREACH(type_names_split, char *, cp, tor_free(cp)); + smartlist_free(type_names_split); + rend_service_free(service); + return -1; + } + service->clients = smartlist_new(); + if (smartlist_len(type_names_split) < 2) { + log_warn(LD_CONFIG, "HiddenServiceAuthorizeClient contains " + "auth-type '%s', but no client names.", + service->auth_type == REND_BASIC_AUTH ? "basic" : "stealth"); + SMARTLIST_FOREACH(type_names_split, char *, cp, tor_free(cp)); + smartlist_free(type_names_split); + continue; + } + clients = smartlist_new(); + smartlist_split_string(clients, smartlist_get(type_names_split, 1), + ",", SPLIT_SKIP_SPACE, 0); + SMARTLIST_FOREACH(type_names_split, char *, cp, tor_free(cp)); + smartlist_free(type_names_split); + /* Remove duplicate client names. */ + num_clients = smartlist_len(clients); + smartlist_sort_strings(clients); + smartlist_uniq_strings(clients); + if (smartlist_len(clients) < num_clients) { log_info(LD_CONFIG, "HiddenServiceAuthorizeClient contains %d " "duplicate client name(s); removing.", num_clients - smartlist_len(clients)); @@ -530,6 +616,16 @@ rend_config_services(const or_options_t *options, int validate_only) } } if (service) { + cpd_check_t check_opts = CPD_CHECK_MODE_ONLY|CPD_CHECK; + if (service->dir_group_readable) { + check_opts |= CPD_GROUP_READ; + } + + if (check_private_dir(service->directory, check_opts, options->User) < 0) { + rend_service_free(service); + return -1; + } + if (validate_only) { rend_service_free(service); } else { @@ -737,7 +833,7 @@ rend_service_load_keys(rend_service_t *s) s->directory); return -1; } - s->private_key = init_key_from_file(fname, 1, LOG_ERR); + s->private_key = init_key_from_file(fname, 1, LOG_ERR, 0); if (!s->private_key) return -1; @@ -1043,8 +1139,8 @@ rend_check_authorization(rend_service_t *service, } /* Allow the request. */ - log_debug(LD_REND, "Client %s authorized for service %s.", - auth_client->client_name, service->service_id); + log_info(LD_REND, "Client %s authorized for service %s.", + auth_client->client_name, service->service_id); return 1; } @@ -1516,8 +1612,7 @@ find_rp_for_intro(const rend_intro_cell_t *intro, } if (intro->version == 0 || intro->version == 1) { - if (intro->version == 1) rp_nickname = (const char *)(intro->u.v1.rp); - else rp_nickname = (const char *)(intro->u.v0.rp); + rp_nickname = (const char *)(intro->u.v0_v1.rp); node = node_get_by_nickname(rp_nickname, 0); if (!node) { @@ -1766,11 +1861,7 @@ rend_service_parse_intro_for_v0_or_v1( goto err; } - if (intro->version == 1) { - memcpy(intro->u.v1.rp, rp_nickname, endptr - rp_nickname + 1); - } else { - memcpy(intro->u.v0.rp, rp_nickname, endptr - rp_nickname + 1); - } + memcpy(intro->u.v0_v1.rp, rp_nickname, endptr - rp_nickname + 1); return ver_specific_len; @@ -3072,8 +3163,12 @@ rend_services_introduce(void) const or_options_t *options = get_options(); /* List of nodes we need to _exclude_ when choosing a new node to establish * an intro point to. */ - smartlist_t *exclude_nodes = smartlist_new(); + smartlist_t *exclude_nodes; + if (!have_completed_a_circuit()) + return; + + exclude_nodes = smartlist_new(); now = time(NULL); for (i=0; i < smartlist_len(rend_service_list); ++i) { @@ -3260,6 +3355,9 @@ rend_services_introduce(void) smartlist_free(exclude_nodes); } +#define MIN_REND_INITIAL_POST_DELAY (30) +#define MIN_REND_INITIAL_POST_DELAY_TESTING (5) + /** Regenerate and upload rendezvous service descriptors for all * services, if necessary. If the descriptor has been dirty enough * for long enough, definitely upload; else only upload when the @@ -3274,6 +3372,9 @@ rend_consider_services_upload(time_t now) int i; rend_service_t *service; int rendpostperiod = get_options()->RendPostPeriod; + int rendinitialpostdelay = (get_options()->TestingTorNetwork ? + MIN_REND_INITIAL_POST_DELAY_TESTING : + MIN_REND_INITIAL_POST_DELAY); if (!get_options()->PublishHidServDescriptors) return; @@ -3281,17 +3382,17 @@ rend_consider_services_upload(time_t now) for (i=0; i < smartlist_len(rend_service_list); ++i) { service = smartlist_get(rend_service_list, i); if (!service->next_upload_time) { /* never been uploaded yet */ - /* The fixed lower bound of 30 seconds ensures that the descriptor - * is stable before being published. See comment below. */ + /* The fixed lower bound of rendinitialpostdelay seconds ensures that + * the descriptor is stable before being published. See comment below. */ service->next_upload_time = - now + 30 + crypto_rand_int(2*rendpostperiod); + now + rendinitialpostdelay + crypto_rand_int(2*rendpostperiod); } if (service->next_upload_time < now || (service->desc_is_dirty && - service->desc_is_dirty < now-30)) { + service->desc_is_dirty < now-rendinitialpostdelay)) { /* if it's time, or if the directory servers have a wrong service - * descriptor and ours has been stable for 30 seconds, upload a - * new one of each format. */ + * descriptor and ours has been stable for rendinitialpostdelay seconds, + * upload a new one of each format. */ rend_service_update_descriptor(service); upload_service_descriptor(service); } @@ -3370,9 +3471,60 @@ rend_service_dump_stats(int severity) } } +#ifdef HAVE_SYS_UN_H + +/** Given <b>ports</b>, a smarlist containing rend_service_port_config_t, + * add the given <b>p</b>, a AF_UNIX port to the list. Return 0 on success + * else return -ENOSYS if AF_UNIX is not supported (see function in the + * #else statement below). */ +static int +add_unix_port(smartlist_t *ports, rend_service_port_config_t *p) +{ + tor_assert(ports); + tor_assert(p); + tor_assert(p->is_unix_addr); + + smartlist_add(ports, p); + return 0; +} + +/** Given <b>conn</b> set it to use the given port <b>p</b> values. Return 0 + * on success else return -ENOSYS if AF_UNIX is not supported (see function + * in the #else statement below). */ +static int +set_unix_port(edge_connection_t *conn, rend_service_port_config_t *p) +{ + tor_assert(conn); + tor_assert(p); + tor_assert(p->is_unix_addr); + + conn->base_.socket_family = AF_UNIX; + tor_addr_make_unspec(&conn->base_.addr); + conn->base_.port = 1; + conn->base_.address = tor_strdup(p->unix_addr); + return 0; +} + +#else /* defined(HAVE_SYS_UN_H) */ + +static int +set_unix_port(edge_connection_t *conn, rend_service_port_config_t *p) +{ + return -ENOSYS; +} + +static int +add_unix_port(smartlist_t *ports, rend_service_port_config_t *p) +{ + return -ENOSYS; +} + +#endif /* HAVE_SYS_UN_H */ + /** Given <b>conn</b>, a rendezvous exit stream, look up the hidden service for * 'circ', and look up the port and address based on conn-\>port. - * Assign the actual conn-\>addr and conn-\>port. Return -1 if failure, + * Assign the actual conn-\>addr and conn-\>port. Return -2 on failure + * for which the circuit should be closed, -1 on other failure, * or 0 for success. */ int @@ -3383,6 +3535,7 @@ rend_service_set_connection_addr_port(edge_connection_t *conn, char serviceid[REND_SERVICE_ID_LEN_BASE32+1]; smartlist_t *matching_ports; rend_service_port_config_t *chosen_port; + unsigned int warn_once = 0; tor_assert(circ->base_.purpose == CIRCUIT_PURPOSE_S_REND_JOINED); tor_assert(circ->rend_data); @@ -3395,24 +3548,53 @@ rend_service_set_connection_addr_port(edge_connection_t *conn, log_warn(LD_REND, "Couldn't find any service associated with pk %s on " "rendezvous circuit %u; closing.", serviceid, (unsigned)circ->base_.n_circ_id); - return -1; + return -2; } matching_ports = smartlist_new(); SMARTLIST_FOREACH(service->ports, rend_service_port_config_t *, p, { - if (conn->base_.port == p->virtual_port) { + if (conn->base_.port != p->virtual_port) { + continue; + } + if (!(p->is_unix_addr)) { smartlist_add(matching_ports, p); + } else { + if (add_unix_port(matching_ports, p)) { + if (!warn_once) { + /* Unix port not supported so warn only once. */ + log_warn(LD_REND, + "Saw AF_UNIX virtual port mapping for port %d on service " + "%s, which is unsupported on this platform. Ignoring it.", + conn->base_.port, serviceid); + } + warn_once++; + } } }); chosen_port = smartlist_choose(matching_ports); smartlist_free(matching_ports); if (chosen_port) { - tor_addr_copy(&conn->base_.addr, &chosen_port->real_addr); - conn->base_.port = chosen_port->real_port; + if (!(chosen_port->is_unix_addr)) { + /* Get a non-AF_UNIX connection ready for connection_exit_connect() */ + tor_addr_copy(&conn->base_.addr, &chosen_port->real_addr); + conn->base_.port = chosen_port->real_port; + } else { + if (set_unix_port(conn, chosen_port)) { + /* Simply impossible to end up here else we were able to add a Unix + * port without AF_UNIX support... ? */ + tor_assert(0); + } + } return 0; } - log_info(LD_REND, "No virtual port mapping exists for port %d on service %s", - conn->base_.port,serviceid); - return -1; + + log_info(LD_REND, + "No virtual port mapping exists for port %d on service %s", + conn->base_.port, serviceid); + + if (service->allow_unknown_ports) + return -1; + else + return -2; } diff --git a/src/or/rendservice.h b/src/or/rendservice.h index c2342ef573..754f7c358c 100644 --- a/src/or/rendservice.h +++ b/src/or/rendservice.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -38,13 +38,9 @@ struct rend_intro_cell_s { /* Version-specific parts */ union { struct { - /* Rendezvous point nickname */ - uint8_t rp[20]; - } v0; - struct { /* Rendezvous point nickname or hex-encoded key digest */ uint8_t rp[42]; - } v1; + } v0_v1; struct { /* The extend_info_t struct has everything v2 uses */ extend_info_t *extend_info; diff --git a/src/or/rephist.c b/src/or/rephist.c index f1e882729b..34908828a5 100644 --- a/src/or/rephist.c +++ b/src/or/rephist.c @@ -1,5 +1,5 @@ /* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -1131,9 +1131,7 @@ rep_hist_load_mtbf_data(time_t now) * totals? */ #define NUM_SECS_ROLLING_MEASURE 10 /** How large are the intervals for which we track and report bandwidth use? */ -/* XXXX Watch out! Before Tor 0.2.2.21-alpha, using any other value here would - * generate an unparseable state file. */ -#define NUM_SECS_BW_SUM_INTERVAL (15*60) +#define NUM_SECS_BW_SUM_INTERVAL (4*60*60) /** How far in the past do we remember and publish bandwidth use? */ #define NUM_SECS_BW_SUM_IS_VALID (24*60*60) /** How many bandwidth usage intervals do we remember? (derived) */ @@ -2908,11 +2906,227 @@ rep_hist_log_circuit_handshake_stats(time_t now) memset(onion_handshakes_requested, 0, sizeof(onion_handshakes_requested)); } +/* Hidden service statistics section */ + +/** Start of the current hidden service stats interval or 0 if we're + * not collecting hidden service statistics. */ +static time_t start_of_hs_stats_interval; + +/** Carries the various hidden service statistics, and any other + * information needed. */ +typedef struct hs_stats_t { + /** How many relay cells have we seen as rendezvous points? */ + int64_t rp_relay_cells_seen; + + /** Set of unique public key digests we've seen this stat period + * (could also be implemented as sorted smartlist). */ + digestmap_t *onions_seen_this_period; +} hs_stats_t; + +/** Our statistics structure singleton. */ +static hs_stats_t *hs_stats = NULL; + +/** Allocate, initialize and return an hs_stats_t structure. */ +static hs_stats_t * +hs_stats_new(void) +{ + hs_stats_t * hs_stats = tor_malloc_zero(sizeof(hs_stats_t)); + hs_stats->onions_seen_this_period = digestmap_new(); + + return hs_stats; +} + +/** Free an hs_stats_t structure. */ +static void +hs_stats_free(hs_stats_t *hs_stats) +{ + if (!hs_stats) { + return; + } + + digestmap_free(hs_stats->onions_seen_this_period, NULL); + tor_free(hs_stats); +} + +/** Initialize hidden service statistics. */ +void +rep_hist_hs_stats_init(time_t now) +{ + if (!hs_stats) { + hs_stats = hs_stats_new(); + } + + start_of_hs_stats_interval = now; +} + +/** Clear history of hidden service statistics and set the measurement + * interval start to <b>now</b>. */ +static void +rep_hist_reset_hs_stats(time_t now) +{ + if (!hs_stats) { + hs_stats = hs_stats_new(); + } + + hs_stats->rp_relay_cells_seen = 0; + + digestmap_free(hs_stats->onions_seen_this_period, NULL); + hs_stats->onions_seen_this_period = digestmap_new(); + + start_of_hs_stats_interval = now; +} + +/** Stop collecting hidden service stats in a way that we can re-start + * doing so in rep_hist_buffer_stats_init(). */ +void +rep_hist_hs_stats_term(void) +{ + rep_hist_reset_hs_stats(0); +} + +/** We saw a new HS relay cell, Count it! */ +void +rep_hist_seen_new_rp_cell(void) +{ + if (!hs_stats) { + return; // We're not collecting stats + } + + hs_stats->rp_relay_cells_seen++; +} + +/** As HSDirs, we saw another hidden service with public key + * <b>pubkey</b>. Check whether we have counted it before, if not + * count it now! */ +void +rep_hist_stored_maybe_new_hs(const crypto_pk_t *pubkey) +{ + char pubkey_hash[DIGEST_LEN]; + + if (!hs_stats) { + return; // We're not collecting stats + } + + /* Get the digest of the pubkey which will be used to detect whether + we've seen this hidden service before or not. */ + if (crypto_pk_get_digest(pubkey, pubkey_hash) < 0) { + /* This fail should not happen; key has been validated by + descriptor parsing code first. */ + return; + } + + /* Check if this is the first time we've seen this hidden + service. If it is, count it as new. */ + if (!digestmap_get(hs_stats->onions_seen_this_period, + pubkey_hash)) { + digestmap_set(hs_stats->onions_seen_this_period, + pubkey_hash, (void*)(uintptr_t)1); + } +} + +/* The number of cells that are supposed to be hidden from the adversary + * by adding noise from the Laplace distribution. This value, divided by + * EPSILON, is Laplace parameter b. */ +#define REND_CELLS_DELTA_F 2048 +/* Security parameter for obfuscating number of cells with a value between + * 0 and 1. Smaller values obfuscate observations more, but at the same + * time make statistics less usable. */ +#define REND_CELLS_EPSILON 0.3 +/* The number of cells that are supposed to be hidden from the adversary + * by rounding up to the next multiple of this number. */ +#define REND_CELLS_BIN_SIZE 1024 +/* The number of service identities that are supposed to be hidden from + * the adversary by adding noise from the Laplace distribution. This + * value, divided by EPSILON, is Laplace parameter b. */ +#define ONIONS_SEEN_DELTA_F 8 +/* Security parameter for obfuscating number of service identities with a + * value between 0 and 1. Smaller values obfuscate observations more, but + * at the same time make statistics less usable. */ +#define ONIONS_SEEN_EPSILON 0.3 +/* The number of service identities that are supposed to be hidden from + * the adversary by rounding up to the next multiple of this number. */ +#define ONIONS_SEEN_BIN_SIZE 8 + +/** Allocate and return a string containing hidden service stats that + * are meant to be placed in the extra-info descriptor. */ +static char * +rep_hist_format_hs_stats(time_t now) +{ + char t[ISO_TIME_LEN+1]; + char *hs_stats_string; + int64_t obfuscated_cells_seen; + int64_t obfuscated_onions_seen; + + obfuscated_cells_seen = round_int64_to_next_multiple_of( + hs_stats->rp_relay_cells_seen, + REND_CELLS_BIN_SIZE); + obfuscated_cells_seen = add_laplace_noise(obfuscated_cells_seen, + crypto_rand_double(), + REND_CELLS_DELTA_F, REND_CELLS_EPSILON); + obfuscated_onions_seen = round_int64_to_next_multiple_of(digestmap_size( + hs_stats->onions_seen_this_period), + ONIONS_SEEN_BIN_SIZE); + obfuscated_onions_seen = add_laplace_noise(obfuscated_onions_seen, + crypto_rand_double(), ONIONS_SEEN_DELTA_F, + ONIONS_SEEN_EPSILON); + + format_iso_time(t, now); + tor_asprintf(&hs_stats_string, "hidserv-stats-end %s (%d s)\n" + "hidserv-rend-relayed-cells "I64_FORMAT" delta_f=%d " + "epsilon=%.2f bin_size=%d\n" + "hidserv-dir-onions-seen "I64_FORMAT" delta_f=%d " + "epsilon=%.2f bin_size=%d\n", + t, (unsigned) (now - start_of_hs_stats_interval), + I64_PRINTF_ARG(obfuscated_cells_seen), REND_CELLS_DELTA_F, + REND_CELLS_EPSILON, REND_CELLS_BIN_SIZE, + I64_PRINTF_ARG(obfuscated_onions_seen), + ONIONS_SEEN_DELTA_F, + ONIONS_SEEN_EPSILON, ONIONS_SEEN_BIN_SIZE); + + return hs_stats_string; +} + +/** If 24 hours have passed since the beginning of the current HS + * stats period, write buffer stats to $DATADIR/stats/hidserv-stats + * (possibly overwriting an existing file) and reset counters. Return + * when we would next want to write buffer stats or 0 if we never want to + * write. */ +time_t +rep_hist_hs_stats_write(time_t now) +{ + char *str = NULL; + + if (!start_of_hs_stats_interval) { + return 0; /* Not initialized. */ + } + + if (start_of_hs_stats_interval + WRITE_STATS_INTERVAL > now) { + goto done; /* Not ready to write */ + } + + /* Generate history string. */ + str = rep_hist_format_hs_stats(now); + + /* Reset HS history. */ + rep_hist_reset_hs_stats(now); + + /* Try to write to disk. */ + if (!check_or_create_data_subdir("stats")) { + write_to_data_subdir("stats", "hidserv-stats", str, + "hidden service stats"); + } + + done: + tor_free(str); + return start_of_hs_stats_interval + WRITE_STATS_INTERVAL; +} + /** Free all storage held by the OR/link history caches, by the * bandwidth history arrays, by the port history, or by statistics . */ void rep_hist_free_all(void) { + hs_stats_free(hs_stats); digestmap_free(history_map, free_or_history); tor_free(read_array); tor_free(write_array); diff --git a/src/or/rephist.h b/src/or/rephist.h index d853fe2e00..42710c4ed6 100644 --- a/src/or/rephist.h +++ b/src/or/rephist.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -99,6 +99,13 @@ void rep_hist_note_circuit_handshake_requested(uint16_t type); void rep_hist_note_circuit_handshake_assigned(uint16_t type); void rep_hist_log_circuit_handshake_stats(time_t now); +void rep_hist_hs_stats_init(time_t now); +void rep_hist_hs_stats_term(void); +time_t rep_hist_hs_stats_write(time_t now); +char *rep_hist_get_hs_stats_string(void); +void rep_hist_seen_new_rp_cell(void); +void rep_hist_stored_maybe_new_hs(const crypto_pk_t *pubkey); + void rep_hist_free_all(void); #endif diff --git a/src/or/replaycache.c b/src/or/replaycache.c index 6d1b59101d..569e0736cb 100644 --- a/src/or/replaycache.c +++ b/src/or/replaycache.c @@ -1,4 +1,4 @@ - /* Copyright (c) 2012-2014, The Tor Project, Inc. */ + /* Copyright (c) 2012-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /* diff --git a/src/or/replaycache.h b/src/or/replaycache.h index 904fd45ff1..9b9daf3831 100644 --- a/src/or/replaycache.h +++ b/src/or/replaycache.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2014, The Tor Project, Inc. */ +/* Copyright (c) 2012-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/router.c b/src/or/router.c index 01838b4b3e..2ddaa895fc 100644 --- a/src/or/router.c +++ b/src/or/router.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define ROUTER_PRIVATE @@ -313,6 +313,7 @@ rotate_onion_key(void) time_t now; fname = get_datadir_fname2("keys", "secret_onion_key"); fname_prev = get_datadir_fname2("keys", "secret_onion_key.old"); + /* There isn't much point replacing an old key with an empty file */ if (file_status(fname) == FN_FILE) { if (replace_file(fname, fname_prev)) goto error; @@ -335,6 +336,7 @@ rotate_onion_key(void) fname_prev = get_datadir_fname2("keys", "secret_onion_key_ntor.old"); if (curve25519_keypair_generate(&new_curve25519_keypair, 1) < 0) goto error; + /* There isn't much point replacing an old key with an empty file */ if (file_status(fname) == FN_FILE) { if (replace_file(fname, fname_prev)) goto error; @@ -392,10 +394,12 @@ log_new_relay_greeting(void) /** Try to read an RSA key from <b>fname</b>. If <b>fname</b> doesn't exist * and <b>generate</b> is true, create a new RSA key and save it in * <b>fname</b>. Return the read/created key, or NULL on error. Log all - * errors at level <b>severity</b>. + * errors at level <b>severity</b>. If <b>log_greeting</b> is non-zero and a + * new key was created, log_new_relay_greeting() is called. */ crypto_pk_t * -init_key_from_file(const char *fname, int generate, int severity) +init_key_from_file(const char *fname, int generate, int severity, + int log_greeting) { crypto_pk_t *prkey = NULL; @@ -409,7 +413,11 @@ init_key_from_file(const char *fname, int generate, int severity) case FN_ERROR: tor_log(severity, LD_FS,"Can't read key from \"%s\"", fname); goto error; + /* treat empty key files as if the file doesn't exist, and, + * if generate is set, replace the empty file in + * crypto_pk_write_private_key_to_filename() */ case FN_NOENT: + case FN_EMPTY: if (generate) { if (!have_lockfile()) { if (try_locking(get_options(), 0)<0) { @@ -433,7 +441,9 @@ init_key_from_file(const char *fname, int generate, int severity) goto error; } log_info(LD_GENERAL, "Generated key seems valid"); - log_new_relay_greeting(); + if (log_greeting) { + log_new_relay_greeting(); + } if (crypto_pk_write_private_key_to_filename(prkey, fname)) { tor_log(severity, LD_FS, "Couldn't write generated key to \"%s\".", fname); @@ -460,10 +470,10 @@ init_key_from_file(const char *fname, int generate, int severity) } /** Load a curve25519 keypair from the file <b>fname</b>, writing it into - * <b>keys_out</b>. If the file isn't found and <b>generate</b> is true, - * create a new keypair and write it into the file. If there are errors, log - * them at level <b>severity</b>. Generate files using <b>tag</b> in their - * ASCII wrapper. */ + * <b>keys_out</b>. If the file isn't found, or is empty, and <b>generate</b> + * is true, create a new keypair and write it into the file. If there are + * errors, log them at level <b>severity</b>. Generate files using <b>tag</b> + * in their ASCII wrapper. */ static int init_curve25519_keypair_from_file(curve25519_keypair_t *keys_out, const char *fname, @@ -476,7 +486,10 @@ init_curve25519_keypair_from_file(curve25519_keypair_t *keys_out, case FN_ERROR: tor_log(severity, LD_FS,"Can't read key from \"%s\"", fname); goto error; + /* treat empty key files as if the file doesn't exist, and, if generate + * is set, replace the empty file in curve25519_keypair_write_to_file() */ case FN_NOENT: + case FN_EMPTY: if (generate) { if (!have_lockfile()) { if (try_locking(get_options(), 0)<0) { @@ -545,7 +558,7 @@ load_authority_keyset(int legacy, crypto_pk_t **key_out, fname = get_datadir_fname2("keys", legacy ? "legacy_signing_key" : "authority_signing_key"); - signing_key = init_key_from_file(fname, 0, LOG_INFO); + signing_key = init_key_from_file(fname, 0, LOG_INFO, 0); if (!signing_key) { log_warn(LD_DIR, "No version 3 directory key found in %s", fname); goto done; @@ -828,7 +841,7 @@ init_keys(void) /* 1b. Read identity key. Make it if none is found. */ keydir = get_datadir_fname2("keys", "secret_id_key"); log_info(LD_GENERAL,"Reading/making identity key \"%s\"...",keydir); - prkey = init_key_from_file(keydir, 1, LOG_ERR); + prkey = init_key_from_file(keydir, 1, LOG_ERR, 1); tor_free(keydir); if (!prkey) return -1; set_server_identity_key(prkey); @@ -851,7 +864,7 @@ init_keys(void) /* 2. Read onion key. Make it if none is found. */ keydir = get_datadir_fname2("keys", "secret_onion_key"); log_info(LD_GENERAL,"Reading/making onion key \"%s\"...",keydir); - prkey = init_key_from_file(keydir, 1, LOG_ERR); + prkey = init_key_from_file(keydir, 1, LOG_ERR, 1); tor_free(keydir); if (!prkey) return -1; set_onion_key(prkey); @@ -876,7 +889,9 @@ init_keys(void) keydir = get_datadir_fname2("keys", "secret_onion_key.old"); if (!lastonionkey && file_status(keydir) == FN_FILE) { - prkey = init_key_from_file(keydir, 1, LOG_ERR); /* XXXX Why 1? */ + /* Load keys from non-empty files only. + * Missing old keys won't be replaced with freshly generated keys. */ + prkey = init_key_from_file(keydir, 0, LOG_ERR, 0); if (prkey) lastonionkey = prkey; } @@ -897,6 +912,8 @@ init_keys(void) last_curve25519_onion_key.pubkey.public_key, CURVE25519_PUBKEY_LEN) && file_status(keydir) == FN_FILE) { + /* Load keys from non-empty files only. + * Missing old keys won't be replaced with freshly generated keys. */ init_curve25519_keypair_from_file(&last_curve25519_onion_key, keydir, 0, LOG_ERR, "onion"); } @@ -1219,6 +1236,11 @@ router_orport_found_reachable(void) " Publishing server descriptor." : ""); can_reach_or_port = 1; mark_my_descriptor_dirty("ORPort found reachable"); + /* This is a significant enough change to upload immediately, + * at least in a test network */ + if (get_options()->TestingTorNetwork == 1) { + reschedule_descriptor_update_check(); + } control_event_server_status(LOG_NOTICE, "REACHABILITY_SUCCEEDED ORADDRESS=%s:%d", address, me->or_port); @@ -1236,8 +1258,14 @@ router_dirport_found_reachable(void) log_notice(LD_DIRSERV,"Self-testing indicates your DirPort is reachable " "from the outside. Excellent."); can_reach_dir_port = 1; - if (decide_to_advertise_dirport(get_options(), me->dir_port)) + if (decide_to_advertise_dirport(get_options(), me->dir_port)) { mark_my_descriptor_dirty("DirPort found reachable"); + /* This is a significant enough change to upload immediately, + * at least in a test network */ + if (get_options()->TestingTorNetwork == 1) { + reschedule_descriptor_update_check(); + } + } control_event_server_status(LOG_NOTICE, "REACHABILITY_SUCCEEDED DIRADDRESS=%s:%d", address, me->dir_port); @@ -1820,8 +1848,8 @@ router_rebuild_descriptor(int force) const port_cfg_t *ipv6_orport = NULL; SMARTLIST_FOREACH_BEGIN(get_configured_ports(), const port_cfg_t *, p) { if (p->type == CONN_TYPE_OR_LISTENER && - ! p->no_advertise && - ! p->bind_ipv4_only && + ! p->server_cfg.no_advertise && + ! p->server_cfg.bind_ipv4_only && tor_addr_family(&p->addr) == AF_INET6) { if (! tor_addr_is_internal(&p->addr, 0)) { ipv6_orport = p; @@ -2562,8 +2590,9 @@ router_has_orport(const routerinfo_t *router, const tor_addr_port_t *orport) * <b>end_line</b>, ensure that its timestamp is not more than 25 hours in * the past or more than 1 hour in the future with respect to <b>now</b>, * and write the file contents starting with that line to *<b>out</b>. - * Return 1 for success, 0 if the file does not exist, or -1 if the file - * does not contain a line matching these criteria or other failure. */ + * Return 1 for success, 0 if the file does not exist or is empty, or -1 + * if the file does not contain a line matching these criteria or other + * failure. */ static int load_stats_file(const char *filename, const char *end_line, time_t now, char **out) @@ -2597,7 +2626,9 @@ load_stats_file(const char *filename, const char *end_line, time_t now, notfound: tor_free(contents); break; + /* treat empty stats files as if the file doesn't exist */ case FN_NOENT: + case FN_EMPTY: r = 0; break; case FN_ERROR: @@ -2654,6 +2685,11 @@ extrainfo_dump_to_string(char **s_out, extrainfo_t *extrainfo, "dirreq-stats-end", now, &contents) > 0) { smartlist_add(chunks, contents); } + if (options->HiddenServiceStatistics && + load_stats_file("stats"PATH_SEPARATOR"hidserv-stats", + "hidserv-stats-end", now, &contents) > 0) { + smartlist_add(chunks, contents); + } if (options->EntryStatistics && load_stats_file("stats"PATH_SEPARATOR"entry-stats", "entry-stats-end", now, &contents) > 0) { diff --git a/src/or/router.h b/src/or/router.h index 16d3845be1..8108ffb22f 100644 --- a/src/or/router.h +++ b/src/or/router.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -29,7 +29,7 @@ crypto_pk_t *get_my_v3_legacy_signing_key(void); void dup_onion_keys(crypto_pk_t **key, crypto_pk_t **last); void rotate_onion_key(void); crypto_pk_t *init_key_from_file(const char *fname, int generate, - int severity); + int severity, int log_greeting); void v3_authority_check_key_expiry(void); di_digest256_map_t *construct_ntor_key_map(void); diff --git a/src/or/routerlist.c b/src/or/routerlist.c index d81dae4676..fe92ac0050 100644 --- a/src/or/routerlist.c +++ b/src/or/routerlist.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -65,7 +65,7 @@ static int compute_weighted_bandwidths(const smartlist_t *sl, bandwidth_weight_rule_t rule, u64_dbl_t **bandwidths_out); static const routerstatus_t *router_pick_directory_server_impl( - dirinfo_type_t auth, int flags); + dirinfo_type_t auth, int flags, int *n_busy_out); static const routerstatus_t *router_pick_trusteddirserver_impl( const smartlist_t *sourcelist, dirinfo_type_t auth, int flags, int *n_busy_out); @@ -1206,6 +1206,7 @@ router_reload_router_list_impl(desc_store_t *store) tor_free(fname); fname = get_datadir_fname_suffix(store->fname_base, ".new"); + /* don't load empty files - we wouldn't get any data, even if we tried */ if (file_status(fname) == FN_FILE) contents = read_file_to_str(fname, RFTS_BIN|RFTS_IGNORE_MISSING, &st); if (contents) { @@ -1287,22 +1288,32 @@ router_get_fallback_dir_servers(void) const routerstatus_t * router_pick_directory_server(dirinfo_type_t type, int flags) { + int busy = 0; const routerstatus_t *choice; if (!routerlist) return NULL; - choice = router_pick_directory_server_impl(type, flags); + choice = router_pick_directory_server_impl(type, flags, &busy); if (choice || !(flags & PDS_RETRY_IF_NO_SERVERS)) return choice; + if (busy) { + /* If the reason that we got no server is that servers are "busy", + * we must be excluding good servers because we already have serverdesc + * fetches with them. Do not mark down servers up because of this. */ + tor_assert((flags & (PDS_NO_EXISTING_SERVERDESC_FETCH| + PDS_NO_EXISTING_MICRODESC_FETCH))); + return NULL; + } + log_info(LD_DIR, "No reachable router entries for dirservers. " "Trying them all again."); /* mark all authdirservers as up again */ mark_all_dirservers_up(fallback_dir_servers); /* try again */ - choice = router_pick_directory_server_impl(type, flags); + choice = router_pick_directory_server_impl(type, flags, NULL); return choice; } @@ -1412,11 +1423,15 @@ router_pick_dirserver_generic(smartlist_t *sourcelist, #define DIR_503_TIMEOUT (60*60) /** Pick a random running valid directory server/mirror from our - * routerlist. Arguments are as for router_pick_directory_server(), except - * that RETRY_IF_NO_SERVERS is ignored. + * routerlist. Arguments are as for router_pick_directory_server(), except: + * + * If <b>n_busy_out</b> is provided, set *<b>n_busy_out</b> to the number of + * directories that we excluded for no other reason than + * PDS_NO_EXISTING_SERVERDESC_FETCH or PDS_NO_EXISTING_MICRODESC_FETCH. */ static const routerstatus_t * -router_pick_directory_server_impl(dirinfo_type_t type, int flags) +router_pick_directory_server_impl(dirinfo_type_t type, int flags, + int *n_busy_out) { const or_options_t *options = get_options(); const node_t *result; @@ -1425,10 +1440,12 @@ router_pick_directory_server_impl(dirinfo_type_t type, int flags) smartlist_t *overloaded_direct, *overloaded_tunnel; time_t now = time(NULL); const networkstatus_t *consensus = networkstatus_get_latest_consensus(); - int requireother = ! (flags & PDS_ALLOW_SELF); - int fascistfirewall = ! (flags & PDS_IGNORE_FASCISTFIREWALL); - int for_guard = (flags & PDS_FOR_GUARD); - int try_excluding = 1, n_excluded = 0; + const int requireother = ! (flags & PDS_ALLOW_SELF); + const int fascistfirewall = ! (flags & PDS_IGNORE_FASCISTFIREWALL); + const int no_serverdesc_fetching =(flags & PDS_NO_EXISTING_SERVERDESC_FETCH); + const int no_microdesc_fetching = (flags & PDS_NO_EXISTING_MICRODESC_FETCH); + const int for_guard = (flags & PDS_FOR_GUARD); + int try_excluding = 1, n_excluded = 0, n_busy = 0; if (!consensus) return NULL; @@ -1475,7 +1492,24 @@ router_pick_directory_server_impl(dirinfo_type_t type, int flags) } /* XXXX IP6 proposal 118 */ - tor_addr_from_ipv4h(&addr, node->rs->addr); + tor_addr_from_ipv4h(&addr, status->addr); + + if (no_serverdesc_fetching && ( + connection_get_by_type_addr_port_purpose( + CONN_TYPE_DIR, &addr, status->dir_port, DIR_PURPOSE_FETCH_SERVERDESC) + || connection_get_by_type_addr_port_purpose( + CONN_TYPE_DIR, &addr, status->dir_port, DIR_PURPOSE_FETCH_EXTRAINFO) + )) { + ++n_busy; + continue; + } + + if (no_microdesc_fetching && connection_get_by_type_addr_port_purpose( + CONN_TYPE_DIR, &addr, status->dir_port, DIR_PURPOSE_FETCH_MICRODESC) + ) { + ++n_busy; + continue; + } is_overloaded = status->last_dir_503_at + DIR_503_TIMEOUT > now; @@ -1515,14 +1549,19 @@ router_pick_directory_server_impl(dirinfo_type_t type, int flags) smartlist_free(overloaded_direct); smartlist_free(overloaded_tunnel); - if (result == NULL && try_excluding && !options->StrictNodes && n_excluded) { + if (result == NULL && try_excluding && !options->StrictNodes && n_excluded + && !n_busy) { /* If we got no result, and we are excluding nodes, and StrictNodes is * not set, try again without excluding nodes. */ try_excluding = 0; n_excluded = 0; + n_busy = 0; goto retry_without_exclude; } + if (n_busy_out) + *n_busy_out = n_busy; + return result ? result->rs : NULL; } @@ -2030,9 +2069,10 @@ compute_weighted_bandwidths(const smartlist_t *sl, if (Wg < 0 || Wm < 0 || We < 0 || Wd < 0 || Wgb < 0 || Wmb < 0 || Wdb < 0 || Web < 0) { log_debug(LD_CIRC, - "Got negative bandwidth weights. Defaulting to old selection" + "Got negative bandwidth weights. Defaulting to naive selection" " algorithm."); - return -1; // Use old algorithm. + Wg = Wm = We = Wd = weight_scale; + Wgb = Wmb = Web = Wdb = weight_scale; } Wg /= weight_scale; @@ -2048,6 +2088,7 @@ compute_weighted_bandwidths(const smartlist_t *sl, bandwidths = tor_calloc(smartlist_len(sl), sizeof(u64_dbl_t)); // Cycle through smartlist and total the bandwidth. + static int warned_missing_bw = 0; SMARTLIST_FOREACH_BEGIN(sl, const node_t *, node) { int is_exit = 0, is_guard = 0, is_dir = 0, this_bw = 0; double weight = 1; @@ -2056,15 +2097,18 @@ compute_weighted_bandwidths(const smartlist_t *sl, is_dir = node_is_dir(node); if (node->rs) { if (!node->rs->has_bandwidth) { - tor_free(bandwidths); /* This should never happen, unless all the authorites downgrade * to 0.2.0 or rogue routerstatuses get inserted into our consensus. */ - log_warn(LD_BUG, - "Consensus is not listing bandwidths. Defaulting back to " - "old router selection algorithm."); - return -1; + if (! warned_missing_bw) { + log_warn(LD_BUG, + "Consensus is missing some bandwidths. Using a naive " + "router selection algorithm"); + warned_missing_bw = 1; + } + this_bw = 30000; /* Chosen arbitrarily */ + } else { + this_bw = kb_to_bytes(node->rs->bandwidth_kb); } - this_bw = kb_to_bytes(node->rs->bandwidth_kb); } else if (node->ri) { /* bridge or other descriptor not in our consensus */ this_bw = bridge_get_advertised_bandwidth_bounded(node->ri); @@ -2141,226 +2185,13 @@ frac_nodes_with_descriptors(const smartlist_t *sl, return present / total; } -/** Helper function: - * choose a random node_t element of smartlist <b>sl</b>, weighted by - * the advertised bandwidth of each element. - * - * If <b>rule</b>==WEIGHT_FOR_EXIT. we're picking an exit node: consider all - * nodes' bandwidth equally regardless of their Exit status, since there may - * be some in the list because they exit to obscure ports. If - * <b>rule</b>==NO_WEIGHTING, we're picking a non-exit node: weight - * exit-node's bandwidth less depending on the smallness of the fraction of - * Exit-to-total bandwidth. If <b>rule</b>==WEIGHT_FOR_GUARD, we're picking a - * guard node: consider all guard's bandwidth equally. Otherwise, weight - * guards proportionally less. - */ -static const node_t * -smartlist_choose_node_by_bandwidth(const smartlist_t *sl, - bandwidth_weight_rule_t rule) -{ - unsigned int i; - u64_dbl_t *bandwidths; - int is_exit; - int is_guard; - int is_fast; - double total_nonexit_bw = 0, total_exit_bw = 0; - double total_nonguard_bw = 0, total_guard_bw = 0; - double exit_weight; - double guard_weight; - int n_unknown = 0; - bitarray_t *fast_bits; - bitarray_t *exit_bits; - bitarray_t *guard_bits; - - // This function does not support WEIGHT_FOR_DIR - // or WEIGHT_FOR_MID - if (rule == WEIGHT_FOR_DIR || rule == WEIGHT_FOR_MID) { - rule = NO_WEIGHTING; - } - - /* Can't choose exit and guard at same time */ - tor_assert(rule == NO_WEIGHTING || - rule == WEIGHT_FOR_EXIT || - rule == WEIGHT_FOR_GUARD); - - if (smartlist_len(sl) == 0) { - log_info(LD_CIRC, - "Empty routerlist passed in to old node selection for rule %s", - bandwidth_weight_rule_to_string(rule)); - return NULL; - } - - /* First count the total bandwidth weight, and make a list - * of each value. We use UINT64_MAX to indicate "unknown". */ - bandwidths = tor_calloc(smartlist_len(sl), sizeof(u64_dbl_t)); - fast_bits = bitarray_init_zero(smartlist_len(sl)); - exit_bits = bitarray_init_zero(smartlist_len(sl)); - guard_bits = bitarray_init_zero(smartlist_len(sl)); - - /* Iterate over all the routerinfo_t or routerstatus_t, and */ - SMARTLIST_FOREACH_BEGIN(sl, const node_t *, node) { - /* first, learn what bandwidth we think i has */ - int is_known = 1; - uint32_t this_bw = 0; - i = node_sl_idx; - - is_exit = node_is_good_exit(node); - is_guard = node->is_possible_guard; - if (node->rs) { - if (node->rs->has_bandwidth) { - this_bw = kb_to_bytes(node->rs->bandwidth_kb); - } else { /* guess */ - is_known = 0; - } - } else if (node->ri) { - /* Must be a bridge if we're willing to use it */ - this_bw = bridge_get_advertised_bandwidth_bounded(node->ri); - } - - if (is_exit) - bitarray_set(exit_bits, i); - if (is_guard) - bitarray_set(guard_bits, i); - if (node->is_fast) - bitarray_set(fast_bits, i); - - if (is_known) { - bandwidths[i].dbl = this_bw; - if (is_guard) - total_guard_bw += this_bw; - else - total_nonguard_bw += this_bw; - if (is_exit) - total_exit_bw += this_bw; - else - total_nonexit_bw += this_bw; - } else { - ++n_unknown; - bandwidths[i].dbl = -1.0; - } - } SMARTLIST_FOREACH_END(node); - -#define EPSILON .1 - - /* Now, fill in the unknown values. */ - if (n_unknown) { - int32_t avg_fast, avg_slow; - if (total_exit_bw+total_nonexit_bw < EPSILON) { - /* if there's some bandwidth, there's at least one known router, - * so no worries about div by 0 here */ - int n_known = smartlist_len(sl)-n_unknown; - avg_fast = avg_slow = (int32_t) - ((total_exit_bw+total_nonexit_bw)/((uint64_t) n_known)); - } else { - avg_fast = 40000; - avg_slow = 20000; - } - for (i=0; i<(unsigned)smartlist_len(sl); ++i) { - if (bandwidths[i].dbl >= 0.0) - continue; - is_fast = bitarray_is_set(fast_bits, i); - is_exit = bitarray_is_set(exit_bits, i); - is_guard = bitarray_is_set(guard_bits, i); - bandwidths[i].dbl = is_fast ? avg_fast : avg_slow; - if (is_exit) - total_exit_bw += bandwidths[i].dbl; - else - total_nonexit_bw += bandwidths[i].dbl; - if (is_guard) - total_guard_bw += bandwidths[i].dbl; - else - total_nonguard_bw += bandwidths[i].dbl; - } - } - - /* If there's no bandwidth at all, pick at random. */ - if (total_exit_bw+total_nonexit_bw < EPSILON) { - tor_free(bandwidths); - tor_free(fast_bits); - tor_free(exit_bits); - tor_free(guard_bits); - return smartlist_choose(sl); - } - - /* Figure out how to weight exits and guards */ - { - double all_bw = U64_TO_DBL(total_exit_bw+total_nonexit_bw); - double exit_bw = U64_TO_DBL(total_exit_bw); - double guard_bw = U64_TO_DBL(total_guard_bw); - /* - * For detailed derivation of this formula, see - * http://archives.seul.org/or/dev/Jul-2007/msg00056.html - */ - if (rule == WEIGHT_FOR_EXIT || total_exit_bw<EPSILON) - exit_weight = 1.0; - else - exit_weight = 1.0 - all_bw/(3.0*exit_bw); - - if (rule == WEIGHT_FOR_GUARD || total_guard_bw<EPSILON) - guard_weight = 1.0; - else - guard_weight = 1.0 - all_bw/(3.0*guard_bw); - - if (exit_weight <= 0.0) - exit_weight = 0.0; - - if (guard_weight <= 0.0) - guard_weight = 0.0; - - for (i=0; i < (unsigned)smartlist_len(sl); i++) { - tor_assert(bandwidths[i].dbl >= 0.0); - - is_exit = bitarray_is_set(exit_bits, i); - is_guard = bitarray_is_set(guard_bits, i); - if (is_exit && is_guard) - bandwidths[i].dbl *= exit_weight * guard_weight; - else if (is_guard) - bandwidths[i].dbl *= guard_weight; - else if (is_exit) - bandwidths[i].dbl *= exit_weight; - } - } - -#if 0 - log_debug(LD_CIRC, "Total weighted bw = "U64_FORMAT - ", exit bw = "U64_FORMAT - ", nonexit bw = "U64_FORMAT", exit weight = %f " - "(for exit == %d)" - ", guard bw = "U64_FORMAT - ", nonguard bw = "U64_FORMAT", guard weight = %f " - "(for guard == %d)", - U64_PRINTF_ARG(total_bw), - U64_PRINTF_ARG(total_exit_bw), U64_PRINTF_ARG(total_nonexit_bw), - exit_weight, (int)(rule == WEIGHT_FOR_EXIT), - U64_PRINTF_ARG(total_guard_bw), U64_PRINTF_ARG(total_nonguard_bw), - guard_weight, (int)(rule == WEIGHT_FOR_GUARD)); -#endif - - scale_array_elements_to_u64(bandwidths, smartlist_len(sl), NULL); - - { - int idx = choose_array_element_by_weight(bandwidths, - smartlist_len(sl)); - tor_free(bandwidths); - tor_free(fast_bits); - tor_free(exit_bits); - tor_free(guard_bits); - return idx < 0 ? NULL : smartlist_get(sl, idx); - } -} - /** Choose a random element of status list <b>sl</b>, weighted by * the advertised bandwidth of each node */ const node_t * node_sl_choose_by_bandwidth(const smartlist_t *sl, bandwidth_weight_rule_t rule) { /*XXXX MOVE */ - const node_t *ret; - if ((ret = smartlist_choose_node_by_bandwidth_weights(sl, rule))) { - return ret; - } else { - return smartlist_choose_node_by_bandwidth(sl, rule); - } + return smartlist_choose_node_by_bandwidth_weights(sl, rule); } /** Return a random running node from the nodelist. Never @@ -2418,11 +2249,29 @@ router_choose_random_node(smartlist_t *excludedsmartlist, router_add_running_nodes_to_smartlist(sl, allow_invalid, need_uptime, need_capacity, need_guard, need_desc); + log_debug(LD_CIRC, + "We found %d running nodes.", + smartlist_len(sl)); + smartlist_subtract(sl,excludednodes); - if (excludedsmartlist) + log_debug(LD_CIRC, + "We removed %d excludednodes, leaving %d nodes.", + smartlist_len(excludednodes), + smartlist_len(sl)); + + if (excludedsmartlist) { smartlist_subtract(sl,excludedsmartlist); - if (excludedset) + log_debug(LD_CIRC, + "We removed %d excludedsmartlist, leaving %d nodes.", + smartlist_len(excludedsmartlist), + smartlist_len(sl)); + } + if (excludedset) { routerset_subtract_nodes(sl,excludedset); + log_debug(LD_CIRC, + "We removed excludedset, leaving %d nodes.", + smartlist_len(sl)); + } // Always weight by bandwidth choice = node_sl_choose_by_bandwidth(sl, rule); @@ -2942,9 +2791,10 @@ routerlist_insert(routerlist_t *rl, routerinfo_t *ri) * corresponding router in rl-\>routers or rl-\>old_routers. Return the status * of inserting <b>ei</b>. Free <b>ei</b> if it isn't inserted. */ MOCK_IMPL(STATIC was_router_added_t, -extrainfo_insert,(routerlist_t *rl, extrainfo_t *ei)) +extrainfo_insert,(routerlist_t *rl, extrainfo_t *ei, int warn_if_incompatible)) { was_router_added_t r; + const char *compatibility_error_msg; routerinfo_t *ri = rimap_get(rl->identity_map, ei->cache_info.identity_digest); signed_descriptor_t *sd = @@ -2961,9 +2811,16 @@ extrainfo_insert,(routerlist_t *rl, extrainfo_t *ei)) r = ROUTER_NOT_IN_CONSENSUS; goto done; } - if (routerinfo_incompatible_with_extrainfo(ri, ei, sd, NULL)) { + if (routerinfo_incompatible_with_extrainfo(ri, ei, sd, + &compatibility_error_msg)) { + const int severity = warn_if_incompatible ? LOG_WARN : LOG_INFO; r = (ri->cache_info.extrainfo_is_bogus) ? ROUTER_BAD_EI : ROUTER_NOT_IN_CONSENSUS; + + log_fn(severity,LD_DIR, + "router info incompatible with extra info (reason: %s)", + compatibility_error_msg); + goto done; } @@ -3376,7 +3233,7 @@ router_add_to_routerlist(routerinfo_t *router, const char **msg, router_describe(router)); *msg = "Router descriptor was not new."; routerinfo_free(router); - return ROUTER_WAS_NOT_NEW; + return ROUTER_IS_ALREADY_KNOWN; } } @@ -3461,7 +3318,7 @@ router_add_to_routerlist(routerinfo_t *router, const char **msg, &routerlist->desc_store); routerlist_insert_old(routerlist, router); *msg = "Router descriptor was not new."; - return ROUTER_WAS_NOT_NEW; + return ROUTER_IS_ALREADY_KNOWN; } else { /* Same key, and either new, or listed in the consensus. */ log_debug(LD_DIR, "Replacing entry for router %s", @@ -3508,7 +3365,7 @@ router_add_extrainfo_to_routerlist(extrainfo_t *ei, const char **msg, if (msg) *msg = NULL; /*XXXX023 Do something with msg */ - inserted = extrainfo_insert(router_get_routerlist(), ei); + inserted = extrainfo_insert(router_get_routerlist(), ei, !from_cache); if (WRA_WAS_ADDED(inserted) && !from_cache) signed_desc_append_to_journal(&ei->cache_info, @@ -4369,51 +4226,57 @@ list_pending_fpsk_downloads(fp_pair_map_t *result) * range.) If <b>source</b> is given, download from <b>source</b>; * otherwise, download from an appropriate random directory server. */ -static void -initiate_descriptor_downloads(const routerstatus_t *source, - int purpose, - smartlist_t *digests, - int lo, int hi, int pds_flags) +MOCK_IMPL(STATIC void, initiate_descriptor_downloads, + (const routerstatus_t *source, int purpose, smartlist_t *digests, + int lo, int hi, int pds_flags)) { - int i, n = hi-lo; char *resource, *cp; - size_t r_len; - - int digest_len = DIGEST_LEN, enc_digest_len = HEX_DIGEST_LEN; - char sep = '+'; - int b64_256 = 0; + int digest_len, enc_digest_len; + const char *sep; + int b64_256; + smartlist_t *tmp; if (purpose == DIR_PURPOSE_FETCH_MICRODESC) { /* Microdescriptors are downloaded by "-"-separated base64-encoded * 256-bit digests. */ digest_len = DIGEST256_LEN; - enc_digest_len = BASE64_DIGEST256_LEN; - sep = '-'; + enc_digest_len = BASE64_DIGEST256_LEN + 1; + sep = "-"; b64_256 = 1; + } else { + digest_len = DIGEST_LEN; + enc_digest_len = HEX_DIGEST_LEN + 1; + sep = "+"; + b64_256 = 0; } - if (n <= 0) - return; if (lo < 0) lo = 0; if (hi > smartlist_len(digests)) hi = smartlist_len(digests); - r_len = 8 + (enc_digest_len+1)*n; - cp = resource = tor_malloc(r_len); - memcpy(cp, "d/", 2); - cp += 2; - for (i = lo; i < hi; ++i) { + if (hi-lo <= 0) + return; + + tmp = smartlist_new(); + + for (; lo < hi; ++lo) { + cp = tor_malloc(enc_digest_len); if (b64_256) { - digest256_to_base64(cp, smartlist_get(digests, i)); + digest256_to_base64(cp, smartlist_get(digests, lo)); } else { - base16_encode(cp, r_len-(cp-resource), - smartlist_get(digests,i), digest_len); + base16_encode(cp, enc_digest_len, smartlist_get(digests, lo), + digest_len); } - cp += enc_digest_len; - *cp++ = sep; + smartlist_add(tmp, cp); } - memcpy(cp-1, ".z", 3); + + cp = smartlist_join_strings(tmp, sep, 0, NULL); + tor_asprintf(&resource, "d/%s.z", cp); + + SMARTLIST_FOREACH(tmp, char *, cp1, tor_free(cp1)); + smartlist_free(tmp); + tor_free(cp); if (source) { /* We know which authority we want. */ @@ -4428,14 +4291,28 @@ initiate_descriptor_downloads(const routerstatus_t *source, tor_free(resource); } -/** Max amount of hashes to download per request. - * Since squid does not like URLs >= 4096 bytes we limit it to 96. - * 4096 - strlen(http://255.255.255.255/tor/server/d/.z) == 4058 - * 4058/41 (40 for the hash and 1 for the + that separates them) => 98 - * So use 96 because it's a nice number. +/** Return the max number of hashes to put in a URL for a given request. */ -#define MAX_DL_PER_REQUEST 96 -#define MAX_MICRODESC_DL_PER_REQUEST 92 +static int +max_dl_per_request(const or_options_t *options, int purpose) +{ + /* Since squid does not like URLs >= 4096 bytes we limit it to 96. + * 4096 - strlen(http://255.255.255.255/tor/server/d/.z) == 4058 + * 4058/41 (40 for the hash and 1 for the + that separates them) => 98 + * So use 96 because it's a nice number. + */ + int max = 96; + if (purpose == DIR_PURPOSE_FETCH_MICRODESC) { + max = 92; + } + /* If we're going to tunnel our connections, we can ask for a lot more + * in a request. */ + if (!directory_fetches_from_authorities(options)) { + max = 500; + } + return max; +} + /** Don't split our requests so finely that we are requesting fewer than * this number per server. */ #define MIN_DL_PER_REQUEST 4 @@ -4457,92 +4334,89 @@ launch_descriptor_downloads(int purpose, smartlist_t *downloadable, const routerstatus_t *source, time_t now) { - int should_delay = 0, n_downloadable; const or_options_t *options = get_options(); const char *descname; + const int fetch_microdesc = (purpose == DIR_PURPOSE_FETCH_MICRODESC); + int n_downloadable = smartlist_len(downloadable); - tor_assert(purpose == DIR_PURPOSE_FETCH_SERVERDESC || - purpose == DIR_PURPOSE_FETCH_MICRODESC); + int i, n_per_request, max_dl_per_req; + const char *req_plural = "", *rtr_plural = ""; + int pds_flags = PDS_RETRY_IF_NO_SERVERS; - descname = (purpose == DIR_PURPOSE_FETCH_SERVERDESC) ? - "routerdesc" : "microdesc"; + tor_assert(fetch_microdesc || purpose == DIR_PURPOSE_FETCH_SERVERDESC); + descname = fetch_microdesc ? "microdesc" : "routerdesc"; + + if (!n_downloadable) + return; - n_downloadable = smartlist_len(downloadable); if (!directory_fetches_dir_info_early(options)) { if (n_downloadable >= MAX_DL_TO_DELAY) { log_debug(LD_DIR, "There are enough downloadable %ss to launch requests.", descname); - should_delay = 0; } else { - should_delay = (last_descriptor_download_attempted + - options->TestingClientMaxIntervalWithoutRequest) > now; - if (!should_delay && n_downloadable) { - if (last_descriptor_download_attempted) { - log_info(LD_DIR, - "There are not many downloadable %ss, but we've " - "been waiting long enough (%d seconds). Downloading.", - descname, - (int)(now-last_descriptor_download_attempted)); - } else { - log_info(LD_DIR, - "There are not many downloadable %ss, but we haven't " - "tried downloading descriptors recently. Downloading.", - descname); - } + + /* should delay */ + if ((last_descriptor_download_attempted + + options->TestingClientMaxIntervalWithoutRequest) > now) + return; + + if (last_descriptor_download_attempted) { + log_info(LD_DIR, + "There are not many downloadable %ss, but we've " + "been waiting long enough (%d seconds). Downloading.", + descname, + (int)(now-last_descriptor_download_attempted)); + } else { + log_info(LD_DIR, + "There are not many downloadable %ss, but we haven't " + "tried downloading descriptors recently. Downloading.", + descname); } } } - if (! should_delay && n_downloadable) { - int i, n_per_request; - const char *req_plural = "", *rtr_plural = ""; - int pds_flags = PDS_RETRY_IF_NO_SERVERS; - if (! authdir_mode_any_nonhidserv(options)) { - /* If we wind up going to the authorities, we want to only open one - * connection to each authority at a time, so that we don't overload - * them. We do this by setting PDS_NO_EXISTING_SERVERDESC_FETCH - * regardless of whether we're a cache or not; it gets ignored if we're - * not calling router_pick_trusteddirserver. - * - * Setting this flag can make initiate_descriptor_downloads() ignore - * requests. We need to make sure that we do in fact call - * update_router_descriptor_downloads() later on, once the connections - * have succeeded or failed. - */ - pds_flags |= (purpose == DIR_PURPOSE_FETCH_MICRODESC) ? - PDS_NO_EXISTING_MICRODESC_FETCH : - PDS_NO_EXISTING_SERVERDESC_FETCH; - } + if (!authdir_mode_any_nonhidserv(options)) { + /* If we wind up going to the authorities, we want to only open one + * connection to each authority at a time, so that we don't overload + * them. We do this by setting PDS_NO_EXISTING_SERVERDESC_FETCH + * regardless of whether we're a cache or not. + * + * Setting this flag can make initiate_descriptor_downloads() ignore + * requests. We need to make sure that we do in fact call + * update_router_descriptor_downloads() later on, once the connections + * have succeeded or failed. + */ + pds_flags |= fetch_microdesc ? + PDS_NO_EXISTING_MICRODESC_FETCH : + PDS_NO_EXISTING_SERVERDESC_FETCH; + } - n_per_request = CEIL_DIV(n_downloadable, MIN_REQUESTS); - if (purpose == DIR_PURPOSE_FETCH_MICRODESC) { - if (n_per_request > MAX_MICRODESC_DL_PER_REQUEST) - n_per_request = MAX_MICRODESC_DL_PER_REQUEST; - } else { - if (n_per_request > MAX_DL_PER_REQUEST) - n_per_request = MAX_DL_PER_REQUEST; - } - if (n_per_request < MIN_DL_PER_REQUEST) - n_per_request = MIN_DL_PER_REQUEST; - - if (n_downloadable > n_per_request) - req_plural = rtr_plural = "s"; - else if (n_downloadable > 1) - rtr_plural = "s"; - - log_info(LD_DIR, - "Launching %d request%s for %d %s%s, %d at a time", - CEIL_DIV(n_downloadable, n_per_request), req_plural, - n_downloadable, descname, rtr_plural, n_per_request); - smartlist_sort_digests(downloadable); - for (i=0; i < n_downloadable; i += n_per_request) { - initiate_descriptor_downloads(source, purpose, - downloadable, i, i+n_per_request, - pds_flags); - } - last_descriptor_download_attempted = now; + n_per_request = CEIL_DIV(n_downloadable, MIN_REQUESTS); + max_dl_per_req = max_dl_per_request(options, purpose); + + if (n_per_request > max_dl_per_req) + n_per_request = max_dl_per_req; + + if (n_per_request < MIN_DL_PER_REQUEST) + n_per_request = MIN_DL_PER_REQUEST; + + if (n_downloadable > n_per_request) + req_plural = rtr_plural = "s"; + else if (n_downloadable > 1) + rtr_plural = "s"; + + log_info(LD_DIR, + "Launching %d request%s for %d %s%s, %d at a time", + CEIL_DIV(n_downloadable, n_per_request), req_plural, + n_downloadable, descname, rtr_plural, n_per_request); + smartlist_sort_digests(downloadable); + for (i=0; i < n_downloadable; i += n_per_request) { + initiate_descriptor_downloads(source, purpose, + downloadable, i, i+n_per_request, + pds_flags); } + last_descriptor_download_attempted = now; } /** For any descriptor that we want that's currently listed in @@ -4722,7 +4596,7 @@ update_extrainfo_downloads(time_t now) routerlist_t *rl; smartlist_t *wanted; digestmap_t *pending; - int old_routers, i; + int old_routers, i, max_dl_per_req; int n_no_ei = 0, n_pending = 0, n_have = 0, n_delay = 0; if (! options->DownloadExtraInfo) return; @@ -4778,9 +4652,11 @@ update_extrainfo_downloads(time_t now) n_no_ei, n_have, n_delay, n_pending, smartlist_len(wanted)); smartlist_shuffle(wanted); - for (i = 0; i < smartlist_len(wanted); i += MAX_DL_PER_REQUEST) { + + max_dl_per_req = max_dl_per_request(options, DIR_PURPOSE_FETCH_EXTRAINFO); + for (i = 0; i < smartlist_len(wanted); i += max_dl_per_req) { initiate_descriptor_downloads(NULL, DIR_PURPOSE_FETCH_EXTRAINFO, - wanted, i, i + MAX_DL_PER_REQUEST, + wanted, i, i+max_dl_per_req, PDS_RETRY_IF_NO_SERVERS|PDS_NO_EXISTING_SERVERDESC_FETCH); } diff --git a/src/or/routerlist.h b/src/or/routerlist.h index c6151deb49..f106ca2316 100644 --- a/src/or/routerlist.h +++ b/src/or/routerlist.h @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -118,7 +118,7 @@ WRA_WAS_ADDED(was_router_added_t s) { static INLINE int WRA_WAS_OUTDATED(was_router_added_t s) { return (s == ROUTER_WAS_TOO_OLD || - s == ROUTER_WAS_NOT_NEW || + s == ROUTER_IS_ALREADY_KNOWN || s == ROUTER_NOT_IN_CONSENSUS || s == ROUTER_NOT_IN_CONSENSUS_OR_NETWORKSTATUS); } @@ -227,7 +227,11 @@ STATIC void scale_array_elements_to_u64(u64_dbl_t *entries, int n_entries, MOCK_DECL(int, router_descriptor_is_older_than, (const routerinfo_t *router, int seconds)); MOCK_DECL(STATIC was_router_added_t, extrainfo_insert, - (routerlist_t *rl, extrainfo_t *ei)); + (routerlist_t *rl, extrainfo_t *ei, int warn_if_incompatible)); + +MOCK_DECL(STATIC void, initiate_descriptor_downloads, + (const routerstatus_t *source, int purpose, smartlist_t *digests, + int lo, int hi, int pds_flags)); #endif diff --git a/src/or/routerparse.c b/src/or/routerparse.c index bc3b00226a..a2bc8fbb93 100644 --- a/src/or/routerparse.c +++ b/src/or/routerparse.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -2598,11 +2598,15 @@ networkstatus_parse_vote_from_string(const char *s, const char **eos_out, (int) tor_parse_long(tok->args[1], 10, 0, INT_MAX, &ok, NULL); if (!ok) goto err; - if (ns->valid_after + MIN_VOTE_INTERVAL > ns->fresh_until) { + if (ns->valid_after + + (get_options()->TestingTorNetwork ? + MIN_VOTE_INTERVAL_TESTING : MIN_VOTE_INTERVAL) > ns->fresh_until) { log_warn(LD_DIR, "Vote/consensus freshness interval is too short"); goto err; } - if (ns->valid_after + MIN_VOTE_INTERVAL*2 > ns->valid_until) { + if (ns->valid_after + + (get_options()->TestingTorNetwork ? + MIN_VOTE_INTERVAL_TESTING : MIN_VOTE_INTERVAL)*2 > ns->valid_until) { log_warn(LD_DIR, "Vote/consensus liveness interval is too short"); goto err; } @@ -4246,40 +4250,50 @@ tor_version_parse(const char *s, tor_version_t *out) char *eos=NULL; const char *cp=NULL; /* Format is: - * "Tor " ? NUM dot NUM dot NUM [ ( pre | rc | dot ) NUM [ - tag ] ] + * "Tor " ? NUM dot NUM [ dot NUM [ ( pre | rc | dot ) NUM ] ] [ - tag ] */ tor_assert(s); tor_assert(out); memset(out, 0, sizeof(tor_version_t)); - + out->status = VER_RELEASE; if (!strcasecmpstart(s, "Tor ")) s += 4; - /* Get major. */ - out->major = (int)strtol(s,&eos,10); - if (!eos || eos==s || *eos != '.') return -1; - cp = eos+1; - - /* Get minor */ - out->minor = (int) strtol(cp,&eos,10); - if (!eos || eos==cp || *eos != '.') return -1; - cp = eos+1; - - /* Get micro */ - out->micro = (int) strtol(cp,&eos,10); - if (!eos || eos==cp) return -1; - if (!*eos) { - out->status = VER_RELEASE; - out->patchlevel = 0; + cp = s; + +#define NUMBER(m) \ + do { \ + out->m = (int)strtol(cp, &eos, 10); \ + if (!eos || eos == cp) \ + return -1; \ + cp = eos; \ + } while (0) + +#define DOT() \ + do { \ + if (*cp != '.') \ + return -1; \ + ++cp; \ + } while (0) + + NUMBER(major); + DOT(); + NUMBER(minor); + if (*cp == 0) return 0; - } - cp = eos; + else if (*cp == '-') + goto status_tag; + DOT(); + NUMBER(micro); /* Get status */ - if (*cp == '.') { - out->status = VER_RELEASE; + if (*cp == 0) { + return 0; + } else if (*cp == '.') { ++cp; + } else if (*cp == '-') { + goto status_tag; } else if (0==strncmp(cp, "pre", 3)) { out->status = VER_PRE; cp += 3; @@ -4290,11 +4304,9 @@ tor_version_parse(const char *s, tor_version_t *out) return -1; } - /* Get patchlevel */ - out->patchlevel = (int) strtol(cp,&eos,10); - if (!eos || eos==cp) return -1; - cp = eos; + NUMBER(patchlevel); + status_tag: /* Get status tag. */ if (*cp == '-' || *cp == '.') ++cp; @@ -4330,6 +4342,8 @@ tor_version_parse(const char *s, tor_version_t *out) } return 0; +#undef NUMBER +#undef DOT } /** Compare two tor versions; Return <0 if a < b; 0 if a ==b, >0 if a > @@ -4417,6 +4431,9 @@ sort_version_list(smartlist_t *versions, int remove_duplicates) * to *<b>encoded_size_out</b>, and a pointer to the possibly next * descriptor to *<b>next_out</b>; return 0 for success (including validation) * and -1 for failure. + * + * If <b>as_hsdir</b> is 1, we're parsing this as an HSDir, and we should + * be strict about time formats. */ int rend_parse_v2_service_descriptor(rend_service_descriptor_t **parsed_out, @@ -4424,7 +4441,8 @@ rend_parse_v2_service_descriptor(rend_service_descriptor_t **parsed_out, char **intro_points_encrypted_out, size_t *intro_points_encrypted_size_out, size_t *encoded_size_out, - const char **next_out, const char *desc) + const char **next_out, const char *desc, + int as_hsdir) { rend_service_descriptor_t *result = tor_malloc_zero(sizeof(rend_service_descriptor_t)); @@ -4438,6 +4456,8 @@ rend_parse_v2_service_descriptor(rend_service_descriptor_t **parsed_out, char public_key_hash[DIGEST_LEN]; char test_desc_id[DIGEST_LEN]; memarea_t *area = NULL; + const int strict_time_fmt = as_hsdir; + tor_assert(desc); /* Check if desc starts correctly. */ if (strncmp(desc, "rendezvous-service-descriptor ", @@ -4532,7 +4552,7 @@ rend_parse_v2_service_descriptor(rend_service_descriptor_t **parsed_out, * descriptor. */ tok = find_by_keyword(tokens, R_PUBLICATION_TIME); tor_assert(tok->n_args == 1); - if (parse_iso_time(tok->args[0], &result->timestamp) < 0) { + if (parse_iso_time_(tok->args[0], &result->timestamp, strict_time_fmt) < 0) { log_warn(LD_REND, "Invalid publication time: '%s'", tok->args[0]); goto err; } diff --git a/src/or/routerparse.h b/src/or/routerparse.h index e950548f8c..18a7d2563c 100644 --- a/src/or/routerparse.h +++ b/src/or/routerparse.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -73,7 +73,8 @@ int rend_parse_v2_service_descriptor(rend_service_descriptor_t **parsed_out, char **intro_points_encrypted_out, size_t *intro_points_encrypted_size_out, size_t *encoded_size_out, - const char **next_out, const char *desc); + const char **next_out, const char *desc, + int as_hsdir); int rend_decrypt_introduction_points(char **ipos_decrypted, size_t *ipos_decrypted_size, const char *descriptor_cookie, diff --git a/src/or/routerset.c b/src/or/routerset.c index 38aed77ee9..99de11ed5e 100644 --- a/src/or/routerset.c +++ b/src/or/routerset.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define ROUTERSET_PRIVATE diff --git a/src/or/routerset.h b/src/or/routerset.h index a741eb5fda..8d41de8b6b 100644 --- a/src/or/routerset.h +++ b/src/or/routerset.h @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/scheduler.c b/src/or/scheduler.c new file mode 100644 index 0000000000..f3fbc4ad4e --- /dev/null +++ b/src/or/scheduler.c @@ -0,0 +1,711 @@ +/* * Copyright (c) 2013-2015, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file scheduler.c + * \brief Relay scheduling system + **/ + +#include "or.h" + +#define TOR_CHANNEL_INTERNAL_ /* For channel_flush_some_cells() */ +#include "channel.h" + +#include "compat_libevent.h" +#define SCHEDULER_PRIVATE_ +#include "scheduler.h" + +#ifdef HAVE_EVENT2_EVENT_H +#include <event2/event.h> +#else +#include <event.h> +#endif + +/* + * Scheduler high/low watermarks + */ + +static uint32_t sched_q_low_water = 16384; +static uint32_t sched_q_high_water = 32768; + +/* + * Maximum cells to flush in a single call to channel_flush_some_cells(); + * setting this low means more calls, but too high and we could overshoot + * sched_q_high_water. + */ + +static uint32_t sched_max_flush_cells = 16; + +/* + * Write scheduling works by keeping track of which channels can + * accept cells, and have cells to write. From the scheduler's perspective, + * a channel can be in four possible states: + * + * 1.) Not open for writes, no cells to send + * - Not much to do here, and the channel will have scheduler_state == + * SCHED_CHAN_IDLE + * - Transitions from: + * - Open for writes/has cells by simultaneously draining all circuit + * queues and filling the output buffer. + * - Transitions to: + * - Not open for writes/has cells by arrival of cells on an attached + * circuit (this would be driven from append_cell_to_circuit_queue()) + * - Open for writes/no cells by a channel type specific path; + * driven from connection_or_flushed_some() for channel_tls_t. + * + * 2.) Open for writes, no cells to send + * - Not much here either; this will be the state an idle but open channel + * can be expected to settle in. It will have scheduler_state == + * SCHED_CHAN_WAITING_FOR_CELLS + * - Transitions from: + * - Not open for writes/no cells by flushing some of the output + * buffer. + * - Open for writes/has cells by the scheduler moving cells from + * circuit queues to channel output queue, but not having enough + * to fill the output queue. + * - Transitions to: + * - Open for writes/has cells by arrival of new cells on an attached + * circuit, in append_cell_to_circuit_queue() + * + * 3.) Not open for writes, cells to send + * - This is the state of a busy circuit limited by output bandwidth; + * cells have piled up in the circuit queues waiting to be relayed. + * The channel will have scheduler_state == SCHED_CHAN_WAITING_TO_WRITE. + * - Transitions from: + * - Not open for writes/no cells by arrival of cells on an attached + * circuit + * - Open for writes/has cells by filling an output buffer without + * draining all cells from attached circuits + * - Transitions to: + * - Opens for writes/has cells by draining some of the output buffer + * via the connection_or_flushed_some() path (for channel_tls_t). + * + * 4.) Open for writes, cells to send + * - This connection is ready to relay some cells and waiting for + * the scheduler to choose it. The channel will have scheduler_state == + * SCHED_CHAN_PENDING. + * - Transitions from: + * - Not open for writes/has cells by the connection_or_flushed_some() + * path + * - Open for writes/no cells by the append_cell_to_circuit_queue() + * path + * - Transitions to: + * - Not open for writes/no cells by draining all circuit queues and + * simultaneously filling the output buffer. + * - Not open for writes/has cells by writing enough cells to fill the + * output buffer + * - Open for writes/no cells by draining all attached circuit queues + * without also filling the output buffer + * + * Other event-driven parts of the code move channels between these scheduling + * states by calling scheduler functions; the scheduler only runs on open-for- + * writes/has-cells channels and is the only path for those to transition to + * other states. The scheduler_run() function gives us the opportunity to do + * scheduling work, and is called from other scheduler functions whenever a + * state transition occurs, and periodically from the main event loop. + */ + +/* Scheduler global data structures */ + +/* + * We keep a list of channels that are pending - i.e, have cells to write + * and can accept them to send. The enum scheduler_state in channel_t + * is reserved for our use. + */ + +/* Pqueue of channels that can write and have cells (pending work) */ +STATIC smartlist_t *channels_pending = NULL; + +/* + * This event runs the scheduler from its callback, and is manually + * activated whenever a channel enters open for writes/cells to send. + */ + +STATIC struct event *run_sched_ev = NULL; + +/* + * Queue heuristic; this is not the queue size, but an 'effective queuesize' + * that ages out contributions from stalled channels. + */ + +STATIC uint64_t queue_heuristic = 0; + +/* + * Timestamp for last queue heuristic update + */ + +STATIC time_t queue_heuristic_timestamp = 0; + +/* Scheduler static function declarations */ + +static void scheduler_evt_callback(evutil_socket_t fd, + short events, void *arg); +static int scheduler_more_work(void); +static void scheduler_retrigger(void); +#if 0 +static void scheduler_trigger(void); +#endif + +/* Scheduler function implementations */ + +/** Free everything and shut down the scheduling system */ + +void +scheduler_free_all(void) +{ + log_debug(LD_SCHED, "Shutting down scheduler"); + + if (run_sched_ev) { + if (event_del(run_sched_ev) < 0) { + log_warn(LD_BUG, "Problem deleting run_sched_ev"); + } + tor_event_free(run_sched_ev); + run_sched_ev = NULL; + } + + if (channels_pending) { + smartlist_free(channels_pending); + channels_pending = NULL; + } +} + +/** + * Comparison function to use when sorting pending channels + */ + +MOCK_IMPL(STATIC int, +scheduler_compare_channels, (const void *c1_v, const void *c2_v)) +{ + channel_t *c1 = NULL, *c2 = NULL; + /* These are a workaround for -Wbad-function-cast throwing a fit */ + const circuitmux_policy_t *p1, *p2; + uintptr_t p1_i, p2_i; + + tor_assert(c1_v); + tor_assert(c2_v); + + c1 = (channel_t *)(c1_v); + c2 = (channel_t *)(c2_v); + + tor_assert(c1); + tor_assert(c2); + + if (c1 != c2) { + if (circuitmux_get_policy(c1->cmux) == + circuitmux_get_policy(c2->cmux)) { + /* Same cmux policy, so use the mux comparison */ + return circuitmux_compare_muxes(c1->cmux, c2->cmux); + } else { + /* + * Different policies; not important to get this edge case perfect + * because the current code never actually gives different channels + * different cmux policies anyway. Just use this arbitrary but + * definite choice. + */ + p1 = circuitmux_get_policy(c1->cmux); + p2 = circuitmux_get_policy(c2->cmux); + p1_i = (uintptr_t)p1; + p2_i = (uintptr_t)p2; + + return (p1_i < p2_i) ? -1 : 1; + } + } else { + /* c1 == c2, so always equal */ + return 0; + } +} + +/* + * Scheduler event callback; this should get triggered once per event loop + * if any scheduling work was created during the event loop. + */ + +static void +scheduler_evt_callback(evutil_socket_t fd, short events, void *arg) +{ + (void)fd; + (void)events; + (void)arg; + log_debug(LD_SCHED, "Scheduler event callback called"); + + tor_assert(run_sched_ev); + + /* Run the scheduler */ + scheduler_run(); + + /* Do we have more work to do? */ + if (scheduler_more_work()) scheduler_retrigger(); +} + +/** Mark a channel as no longer ready to accept writes */ + +MOCK_IMPL(void, +scheduler_channel_doesnt_want_writes,(channel_t *chan)) +{ + tor_assert(chan); + + tor_assert(channels_pending); + + /* If it's already in pending, we can put it in waiting_to_write */ + if (chan->scheduler_state == SCHED_CHAN_PENDING) { + /* + * It's in channels_pending, so it shouldn't be in any of + * the other lists. It can't write any more, so it goes to + * channels_waiting_to_write. + */ + smartlist_pqueue_remove(channels_pending, + scheduler_compare_channels, + STRUCT_OFFSET(channel_t, sched_heap_idx), + chan); + chan->scheduler_state = SCHED_CHAN_WAITING_TO_WRITE; + log_debug(LD_SCHED, + "Channel " U64_FORMAT " at %p went from pending " + "to waiting_to_write", + U64_PRINTF_ARG(chan->global_identifier), chan); + } else { + /* + * It's not in pending, so it can't become waiting_to_write; it's + * either not in any of the lists (nothing to do) or it's already in + * waiting_for_cells (remove it, can't write any more). + */ + if (chan->scheduler_state == SCHED_CHAN_WAITING_FOR_CELLS) { + chan->scheduler_state = SCHED_CHAN_IDLE; + log_debug(LD_SCHED, + "Channel " U64_FORMAT " at %p left waiting_for_cells", + U64_PRINTF_ARG(chan->global_identifier), chan); + } + } +} + +/** Mark a channel as having waiting cells */ + +MOCK_IMPL(void, +scheduler_channel_has_waiting_cells,(channel_t *chan)) +{ + int became_pending = 0; + + tor_assert(chan); + tor_assert(channels_pending); + + /* First, check if this one also writeable */ + if (chan->scheduler_state == SCHED_CHAN_WAITING_FOR_CELLS) { + /* + * It's in channels_waiting_for_cells, so it shouldn't be in any of + * the other lists. It has waiting cells now, so it goes to + * channels_pending. + */ + chan->scheduler_state = SCHED_CHAN_PENDING; + smartlist_pqueue_add(channels_pending, + scheduler_compare_channels, + STRUCT_OFFSET(channel_t, sched_heap_idx), + chan); + log_debug(LD_SCHED, + "Channel " U64_FORMAT " at %p went from waiting_for_cells " + "to pending", + U64_PRINTF_ARG(chan->global_identifier), chan); + became_pending = 1; + } else { + /* + * It's not in waiting_for_cells, so it can't become pending; it's + * either not in any of the lists (we add it to waiting_to_write) + * or it's already in waiting_to_write or pending (we do nothing) + */ + if (!(chan->scheduler_state == SCHED_CHAN_WAITING_TO_WRITE || + chan->scheduler_state == SCHED_CHAN_PENDING)) { + chan->scheduler_state = SCHED_CHAN_WAITING_TO_WRITE; + log_debug(LD_SCHED, + "Channel " U64_FORMAT " at %p entered waiting_to_write", + U64_PRINTF_ARG(chan->global_identifier), chan); + } + } + + /* + * If we made a channel pending, we potentially have scheduling work + * to do. + */ + if (became_pending) scheduler_retrigger(); +} + +/** Set up the scheduling system */ + +void +scheduler_init(void) +{ + log_debug(LD_SCHED, "Initting scheduler"); + + tor_assert(!run_sched_ev); + run_sched_ev = tor_event_new(tor_libevent_get_base(), -1, + 0, scheduler_evt_callback, NULL); + + channels_pending = smartlist_new(); + queue_heuristic = 0; + queue_heuristic_timestamp = approx_time(); +} + +/** Check if there's more scheduling work */ + +static int +scheduler_more_work(void) +{ + tor_assert(channels_pending); + + return ((scheduler_get_queue_heuristic() < sched_q_low_water) && + ((smartlist_len(channels_pending) > 0))) ? 1 : 0; +} + +/** Retrigger the scheduler in a way safe to use from the callback */ + +static void +scheduler_retrigger(void) +{ + tor_assert(run_sched_ev); + event_active(run_sched_ev, EV_TIMEOUT, 1); +} + +/** Notify the scheduler of a channel being closed */ + +MOCK_IMPL(void, +scheduler_release_channel,(channel_t *chan)) +{ + tor_assert(chan); + tor_assert(channels_pending); + + if (chan->scheduler_state == SCHED_CHAN_PENDING) { + smartlist_pqueue_remove(channels_pending, + scheduler_compare_channels, + STRUCT_OFFSET(channel_t, sched_heap_idx), + chan); + } + + chan->scheduler_state = SCHED_CHAN_IDLE; +} + +/** Run the scheduling algorithm if necessary */ + +MOCK_IMPL(void, +scheduler_run, (void)) +{ + int n_cells, n_chans_before, n_chans_after; + uint64_t q_len_before, q_heur_before, q_len_after, q_heur_after; + ssize_t flushed, flushed_this_time; + smartlist_t *to_readd = NULL; + channel_t *chan = NULL; + + log_debug(LD_SCHED, "We have a chance to run the scheduler"); + + if (scheduler_get_queue_heuristic() < sched_q_low_water) { + n_chans_before = smartlist_len(channels_pending); + q_len_before = channel_get_global_queue_estimate(); + q_heur_before = scheduler_get_queue_heuristic(); + + while (scheduler_get_queue_heuristic() <= sched_q_high_water && + smartlist_len(channels_pending) > 0) { + /* Pop off a channel */ + chan = smartlist_pqueue_pop(channels_pending, + scheduler_compare_channels, + STRUCT_OFFSET(channel_t, sched_heap_idx)); + tor_assert(chan); + + /* Figure out how many cells we can write */ + n_cells = channel_num_cells_writeable(chan); + if (n_cells > 0) { + log_debug(LD_SCHED, + "Scheduler saw pending channel " U64_FORMAT " at %p with " + "%d cells writeable", + U64_PRINTF_ARG(chan->global_identifier), chan, n_cells); + + flushed = 0; + while (flushed < n_cells && + scheduler_get_queue_heuristic() <= sched_q_high_water) { + flushed_this_time = + channel_flush_some_cells(chan, + MIN(sched_max_flush_cells, + (size_t) n_cells - flushed)); + if (flushed_this_time <= 0) break; + flushed += flushed_this_time; + } + + if (flushed < n_cells) { + /* We ran out of cells to flush */ + chan->scheduler_state = SCHED_CHAN_WAITING_FOR_CELLS; + log_debug(LD_SCHED, + "Channel " U64_FORMAT " at %p " + "entered waiting_for_cells from pending", + U64_PRINTF_ARG(chan->global_identifier), + chan); + } else { + /* The channel may still have some cells */ + if (channel_more_to_flush(chan)) { + /* The channel goes to either pending or waiting_to_write */ + if (channel_num_cells_writeable(chan) > 0) { + /* Add it back to pending later */ + if (!to_readd) to_readd = smartlist_new(); + smartlist_add(to_readd, chan); + log_debug(LD_SCHED, + "Channel " U64_FORMAT " at %p " + "is still pending", + U64_PRINTF_ARG(chan->global_identifier), + chan); + } else { + /* It's waiting to be able to write more */ + chan->scheduler_state = SCHED_CHAN_WAITING_TO_WRITE; + log_debug(LD_SCHED, + "Channel " U64_FORMAT " at %p " + "entered waiting_to_write from pending", + U64_PRINTF_ARG(chan->global_identifier), + chan); + } + } else { + /* No cells left; it can go to idle or waiting_for_cells */ + if (channel_num_cells_writeable(chan) > 0) { + /* + * It can still accept writes, so it goes to + * waiting_for_cells + */ + chan->scheduler_state = SCHED_CHAN_WAITING_FOR_CELLS; + log_debug(LD_SCHED, + "Channel " U64_FORMAT " at %p " + "entered waiting_for_cells from pending", + U64_PRINTF_ARG(chan->global_identifier), + chan); + } else { + /* + * We exactly filled up the output queue with all available + * cells; go to idle. + */ + chan->scheduler_state = SCHED_CHAN_IDLE; + log_debug(LD_SCHED, + "Channel " U64_FORMAT " at %p " + "become idle from pending", + U64_PRINTF_ARG(chan->global_identifier), + chan); + } + } + } + + log_debug(LD_SCHED, + "Scheduler flushed %d cells onto pending channel " + U64_FORMAT " at %p", + (int)flushed, U64_PRINTF_ARG(chan->global_identifier), + chan); + } else { + log_info(LD_SCHED, + "Scheduler saw pending channel " U64_FORMAT " at %p with " + "no cells writeable", + U64_PRINTF_ARG(chan->global_identifier), chan); + /* Put it back to WAITING_TO_WRITE */ + chan->scheduler_state = SCHED_CHAN_WAITING_TO_WRITE; + } + } + + /* Readd any channels we need to */ + if (to_readd) { + SMARTLIST_FOREACH_BEGIN(to_readd, channel_t *, chan) { + chan->scheduler_state = SCHED_CHAN_PENDING; + smartlist_pqueue_add(channels_pending, + scheduler_compare_channels, + STRUCT_OFFSET(channel_t, sched_heap_idx), + chan); + } SMARTLIST_FOREACH_END(chan); + smartlist_free(to_readd); + } + + n_chans_after = smartlist_len(channels_pending); + q_len_after = channel_get_global_queue_estimate(); + q_heur_after = scheduler_get_queue_heuristic(); + log_debug(LD_SCHED, + "Scheduler handled %d of %d pending channels, queue size from " + U64_FORMAT " to " U64_FORMAT ", queue heuristic from " + U64_FORMAT " to " U64_FORMAT, + n_chans_before - n_chans_after, n_chans_before, + U64_PRINTF_ARG(q_len_before), U64_PRINTF_ARG(q_len_after), + U64_PRINTF_ARG(q_heur_before), U64_PRINTF_ARG(q_heur_after)); + } +} + +/** Trigger the scheduling event so we run the scheduler later */ + +#if 0 +static void +scheduler_trigger(void) +{ + log_debug(LD_SCHED, "Triggering scheduler event"); + + tor_assert(run_sched_ev); + + event_add(run_sched_ev, EV_TIMEOUT, 1); +} +#endif + +/** Mark a channel as ready to accept writes */ + +void +scheduler_channel_wants_writes(channel_t *chan) +{ + int became_pending = 0; + + tor_assert(chan); + tor_assert(channels_pending); + + /* If it's already in waiting_to_write, we can put it in pending */ + if (chan->scheduler_state == SCHED_CHAN_WAITING_TO_WRITE) { + /* + * It can write now, so it goes to channels_pending. + */ + smartlist_pqueue_add(channels_pending, + scheduler_compare_channels, + STRUCT_OFFSET(channel_t, sched_heap_idx), + chan); + chan->scheduler_state = SCHED_CHAN_PENDING; + log_debug(LD_SCHED, + "Channel " U64_FORMAT " at %p went from waiting_to_write " + "to pending", + U64_PRINTF_ARG(chan->global_identifier), chan); + became_pending = 1; + } else { + /* + * It's not in SCHED_CHAN_WAITING_TO_WRITE, so it can't become pending; + * it's either idle and goes to WAITING_FOR_CELLS, or it's a no-op. + */ + if (!(chan->scheduler_state == SCHED_CHAN_WAITING_FOR_CELLS || + chan->scheduler_state == SCHED_CHAN_PENDING)) { + chan->scheduler_state = SCHED_CHAN_WAITING_FOR_CELLS; + log_debug(LD_SCHED, + "Channel " U64_FORMAT " at %p entered waiting_for_cells", + U64_PRINTF_ARG(chan->global_identifier), chan); + } + } + + /* + * If we made a channel pending, we potentially have scheduling work + * to do. + */ + if (became_pending) scheduler_retrigger(); +} + +/** + * Notify the scheduler that a channel's position in the pqueue may have + * changed + */ + +void +scheduler_touch_channel(channel_t *chan) +{ + tor_assert(chan); + + if (chan->scheduler_state == SCHED_CHAN_PENDING) { + /* Remove and re-add it */ + smartlist_pqueue_remove(channels_pending, + scheduler_compare_channels, + STRUCT_OFFSET(channel_t, sched_heap_idx), + chan); + smartlist_pqueue_add(channels_pending, + scheduler_compare_channels, + STRUCT_OFFSET(channel_t, sched_heap_idx), + chan); + } + /* else no-op, since it isn't in the queue */ +} + +/** + * Notify the scheduler of a queue size adjustment, to recalculate the + * queue heuristic. + */ + +void +scheduler_adjust_queue_size(channel_t *chan, char dir, uint64_t adj) +{ + time_t now = approx_time(); + + log_debug(LD_SCHED, + "Queue size adjustment by %s" U64_FORMAT " for channel " + U64_FORMAT, + (dir >= 0) ? "+" : "-", + U64_PRINTF_ARG(adj), + U64_PRINTF_ARG(chan->global_identifier)); + + /* Get the queue heuristic up to date */ + scheduler_update_queue_heuristic(now); + + /* Adjust as appropriate */ + if (dir >= 0) { + /* Increasing it */ + queue_heuristic += adj; + } else { + /* Decreasing it */ + if (queue_heuristic > adj) queue_heuristic -= adj; + else queue_heuristic = 0; + } + + log_debug(LD_SCHED, + "Queue heuristic is now " U64_FORMAT, + U64_PRINTF_ARG(queue_heuristic)); +} + +/** + * Query the current value of the queue heuristic + */ + +STATIC uint64_t +scheduler_get_queue_heuristic(void) +{ + time_t now = approx_time(); + + scheduler_update_queue_heuristic(now); + + return queue_heuristic; +} + +/** + * Adjust the queue heuristic value to the present time + */ + +STATIC void +scheduler_update_queue_heuristic(time_t now) +{ + time_t diff; + + if (queue_heuristic_timestamp == 0) { + /* + * Nothing we can sensibly do; must not have been initted properly. + * Oh well. + */ + queue_heuristic_timestamp = now; + } else if (queue_heuristic_timestamp < now) { + diff = now - queue_heuristic_timestamp; + /* + * This is a simple exponential age-out; the other proposed alternative + * was a linear age-out using the bandwidth history in rephist.c; I'm + * going with this out of concern that if an adversary can jam the + * scheduler long enough, it would cause the bandwidth to drop to + * zero and render the aging mechanism ineffective thereafter. + */ + if (0 <= diff && diff < 64) queue_heuristic >>= diff; + else queue_heuristic = 0; + + queue_heuristic_timestamp = now; + + log_debug(LD_SCHED, + "Queue heuristic is now " U64_FORMAT, + U64_PRINTF_ARG(queue_heuristic)); + } + /* else no update needed, or time went backward */ +} + +/** + * Set scheduler watermarks and flush size + */ + +void +scheduler_set_watermarks(uint32_t lo, uint32_t hi, uint32_t max_flush) +{ + /* Sanity assertions - caller should ensure these are true */ + tor_assert(lo > 0); + tor_assert(hi > lo); + tor_assert(max_flush > 0); + + sched_q_low_water = lo; + sched_q_high_water = hi; + sched_max_flush_cells = max_flush; +} + diff --git a/src/or/scheduler.h b/src/or/scheduler.h new file mode 100644 index 0000000000..70f6a39d4c --- /dev/null +++ b/src/or/scheduler.h @@ -0,0 +1,50 @@ +/* * Copyright (c) 2013-2015, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file scheduler.h + * \brief Header file for scheduler.c + **/ + +#ifndef TOR_SCHEDULER_H +#define TOR_SCHEDULER_H + +#include "or.h" +#include "channel.h" +#include "testsupport.h" + +/* Global-visibility scheduler functions */ + +/* Set up and shut down the scheduler from main.c */ +void scheduler_free_all(void); +void scheduler_init(void); +MOCK_DECL(void, scheduler_run, (void)); + +/* Mark channels as having cells or wanting/not wanting writes */ +MOCK_DECL(void,scheduler_channel_doesnt_want_writes,(channel_t *chan)); +MOCK_DECL(void,scheduler_channel_has_waiting_cells,(channel_t *chan)); +void scheduler_channel_wants_writes(channel_t *chan); + +/* Notify the scheduler of a channel being closed */ +MOCK_DECL(void,scheduler_release_channel,(channel_t *chan)); + +/* Notify scheduler of queue size adjustments */ +void scheduler_adjust_queue_size(channel_t *chan, char dir, uint64_t adj); + +/* Notify scheduler that a channel's queue position may have changed */ +void scheduler_touch_channel(channel_t *chan); + +/* Adjust the watermarks from config file*/ +void scheduler_set_watermarks(uint32_t lo, uint32_t hi, uint32_t max_flush); + +/* Things only scheduler.c and its test suite should see */ + +#ifdef SCHEDULER_PRIVATE_ +MOCK_DECL(STATIC int, scheduler_compare_channels, + (const void *c1_v, const void *c2_v)); +STATIC uint64_t scheduler_get_queue_heuristic(void); +STATIC void scheduler_update_queue_heuristic(time_t now); +#endif + +#endif /* !defined(TOR_SCHEDULER_H) */ + diff --git a/src/or/statefile.c b/src/or/statefile.c index 2ce53fdfca..dd1894beb7 100644 --- a/src/or/statefile.c +++ b/src/or/statefile.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define STATEFILE_PRIVATE @@ -323,7 +323,10 @@ or_state_load(void) goto done; } break; + /* treat empty state files as if the file doesn't exist, and generate + * a new state file, overwriting the empty file in or_state_save() */ case FN_NOENT: + case FN_EMPTY: break; case FN_ERROR: case FN_DIR: diff --git a/src/or/statefile.h b/src/or/statefile.h index 1f3aebee4f..8c790ea206 100644 --- a/src/or/statefile.h +++ b/src/or/statefile.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TOR_STATEFILE_H diff --git a/src/or/status.c b/src/or/status.c index c11d99ba7f..0717070a05 100644 --- a/src/or/status.c +++ b/src/or/status.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2010-2014, The Tor Project, Inc. */ +/* Copyright (c) 2010-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/status.h b/src/or/status.h index 451f343963..3dd8206e0f 100644 --- a/src/or/status.h +++ b/src/or/status.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2010-2014, The Tor Project, Inc. */ +/* Copyright (c) 2010-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TOR_STATUS_H diff --git a/src/or/tor_main.c b/src/or/tor_main.c index 9489cdca7f..af03b8c06a 100644 --- a/src/or/tor_main.c +++ b/src/or/tor_main.c @@ -1,6 +1,6 @@ /* Copyright 2001-2004 Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** String describing which Tor Git repository version the source was diff --git a/src/or/transports.c b/src/or/transports.c index 2623f807d0..6f07054ea8 100644 --- a/src/or/transports.c +++ b/src/or/transports.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2011-2014, The Tor Project, Inc. */ +/* Copyright (c) 2011-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -112,8 +112,6 @@ static void parse_method_error(const char *line, int is_server_method); #define parse_server_method_error(l) parse_method_error(l, 1) #define parse_client_method_error(l) parse_method_error(l, 0) -static INLINE void free_execve_args(char **arg); - /** Managed proxy protocol strings */ #define PROTO_ENV_ERROR "ENV-ERROR" #define PROTO_NEG_SUCCESS "VERSION" @@ -1502,7 +1500,7 @@ pt_kickstart_proxy, (const smartlist_t *transport_list, /** Frees the array of pointers in <b>arg</b> used as arguments to execve(2). */ -static INLINE void +STATIC void free_execve_args(char **arg) { char **tmp = arg; diff --git a/src/or/transports.h b/src/or/transports.h index 2958d5e187..7c69941496 100644 --- a/src/or/transports.h +++ b/src/or/transports.h @@ -1,6 +1,6 @@ /* Copyright (c) 2003-2004, Roger Dingledine * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -131,6 +131,8 @@ STATIC int configure_proxy(managed_proxy_t *mp); STATIC char* get_pt_proxy_uri(void); +STATIC void free_execve_args(char **arg); + #endif #endif diff --git a/src/test/Makefile.nmake b/src/test/Makefile.nmake index f6ee7f3f53..0435617683 100644 --- a/src/test/Makefile.nmake +++ b/src/test/Makefile.nmake @@ -11,11 +11,12 @@ LIBS = ..\..\..\build-alpha\lib\libevent.lib \ ws2_32.lib advapi32.lib shell32.lib \ crypt32.lib gdi32.lib user32.lib -TEST_OBJECTS = test.obj test_addr.obj test_containers.obj \ +TEST_OBJECTS = test.obj test_addr.obj test_channel.obj test_channeltls.obj \ + test_containers.obj \ test_controller_events.obj test_crypto.obj test_data.obj test_dir.obj \ test_checkdir.obj test_microdesc.obj test_pt.obj test_util.obj test_config.obj \ - test_cell_formats.obj test_replay.obj test_introduce.obj tinytest.obj \ - test_hs.obj + test_cell_formats.obj test_relay.obj test_replay.obj \ + test_scheduler.obj test_introduce.obj test_hs.obj tinytest.obj tinytest.obj: ..\ext\tinytest.c $(CC) $(CFLAGS) /D snprintf=_snprintf /c ..\ext\tinytest.c diff --git a/src/test/bench.c b/src/test/bench.c index 74af06c6e6..68870f8657 100644 --- a/src/test/bench.c +++ b/src/test/bench.c @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /* Ordinarily defined in tor_main.c; this bit is just here to provide one diff --git a/src/test/bt_test.py b/src/test/bt_test.py index 8290509fa7..0afe797a6d 100755 --- a/src/test/bt_test.py +++ b/src/test/bt_test.py @@ -1,4 +1,4 @@ -# Copyright 2013, The Tor Project, Inc +# Copyright 2013-2015, The Tor Project, Inc # See LICENSE for licensing information """ diff --git a/src/test/ed25519_exts_ref.py b/src/test/ed25519_exts_ref.py index 93dc49ee93..d5a3a79910 100644 --- a/src/test/ed25519_exts_ref.py +++ b/src/test/ed25519_exts_ref.py @@ -1,5 +1,5 @@ #!/usr/bin/python -# Copyright 2014, The Tor Project, Inc +# Copyright 2014-2015, The Tor Project, Inc # See LICENSE for licensing information """ diff --git a/src/test/fakechans.h b/src/test/fakechans.h new file mode 100644 index 0000000000..8fb8f420a8 --- /dev/null +++ b/src/test/fakechans.h @@ -0,0 +1,26 @@ + /* Copyright (c) 2014-2015, The Tor Project, Inc. */ + /* See LICENSE for licensing information */ + +#ifndef TOR_FAKECHANS_H +#define TOR_FAKECHANS_H + +/** + * \file fakechans.h + * \brief Declarations for fake channels for test suite use + */ + +void make_fake_cell(cell_t *c); +void make_fake_var_cell(var_cell_t *c); +channel_t * new_fake_channel(void); +void free_fake_channel(channel_t *c); + +/* Also exposes some a mock used by both test_channel.c and test_relay.c */ +void scheduler_channel_has_waiting_cells_mock(channel_t *ch); +void scheduler_release_channel_mock(channel_t *ch); + +/* Query some counters used by the exposed mocks */ +int get_mock_scheduler_has_waiting_cells_count(void); +int get_mock_scheduler_release_channel_count(void); + +#endif /* !defined(TOR_FAKECHANS_H) */ + diff --git a/src/test/include.am b/src/test/include.am index 9abf3094eb..595be0b7c2 100644 --- a/src/test/include.am +++ b/src/test/include.am @@ -1,8 +1,12 @@ -TESTS += src/test/test +TESTS += src/test/test src/test/test-slow noinst_PROGRAMS+= src/test/bench if UNITTESTS_ENABLED -noinst_PROGRAMS+= src/test/test src/test/test-child +noinst_PROGRAMS+= \ + src/test/test \ + src/test/test-slow \ + src/test/test-child \ + src/test/test_workqueue endif src_test_AM_CPPFLAGS = -DSHARE_DATADIR="\"$(datadir)\"" \ @@ -17,40 +21,57 @@ src_test_AM_CPPFLAGS = -DSHARE_DATADIR="\"$(datadir)\"" \ src_test_test_SOURCES = \ src/test/test.c \ + src/test/test_accounting.c \ src/test/test_addr.c \ + src/test/test_address.c \ src/test/test_buffers.c \ src/test/test_cell_formats.c \ + src/test/test_cell_queue.c \ + src/test/test_channel.c \ + src/test/test_channeltls.c \ + src/test/test_checkdir.c \ src/test/test_circuitlist.c \ src/test/test_circuitmux.c \ + src/test/test_config.c \ src/test/test_containers.c \ src/test/test_controller_events.c \ src/test/test_crypto.c \ - src/test/test_cell_queue.c \ src/test/test_data.c \ src/test/test_dir.c \ - src/test/test_checkdir.c \ + src/test/test_entryconn.c \ src/test/test_entrynodes.c \ src/test/test_extorport.c \ + src/test/test_hs.c \ src/test/test_introduce.c \ src/test/test_logging.c \ src/test/test_microdesc.c \ + src/test/test_nodelist.c \ src/test/test_oom.c \ - src/test/test_accounting.c \ src/test/test_options.c \ + src/test/test_policy.c \ src/test/test_pt.c \ + src/test/test_relay.c \ src/test/test_relaycell.c \ src/test/test_replay.c \ src/test/test_routerkeys.c \ + src/test/test_routerlist.c \ + src/test/test_routerset.c \ + src/test/test_scheduler.c \ src/test/test_socks.c \ - src/test/test_util.c \ - src/test/test_config.c \ - src/test/test_hs.c \ - src/test/test_nodelist.c \ - src/test/test_policy.c \ src/test/test_status.c \ - src/test/test_routerset.c \ + src/test/test_threads.c \ + src/test/test_util.c \ + src/test/testing_common.c \ src/ext/tinytest.c +src_test_test_slow_SOURCES = \ + src/test/test_slow.c \ + src/test/test_crypto_slow.c \ + src/test/test_util_slow.c \ + src/test/testing_common.c \ + src/ext/tinytest.c + + src_test_test_CFLAGS = $(AM_CFLAGS) $(TEST_CFLAGS) src_test_test_CPPFLAGS= $(src_test_AM_CPPFLAGS) @@ -58,13 +79,24 @@ src_test_test_CPPFLAGS= $(src_test_AM_CPPFLAGS) src_test_bench_SOURCES = \ src/test/bench.c +src_test_test_workqueue_SOURCES = \ + src/test/test_workqueue.c +src_test_test_workqueue_CPPFLAGS= $(src_test_AM_CPPFLAGS) +src_test_test_workqueue_CFLAGS = $(AM_CFLAGS) $(TEST_CFLAGS) + src_test_test_LDFLAGS = @TOR_LDFLAGS_zlib@ @TOR_LDFLAGS_openssl@ \ @TOR_LDFLAGS_libevent@ src_test_test_LDADD = src/or/libtor-testing.a src/common/libor-testing.a \ src/common/libor-crypto-testing.a $(LIBDONNA) \ src/common/libor-event-testing.a src/trunnel/libor-trunnel-testing.a \ @TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ @TOR_LIBEVENT_LIBS@ \ - @TOR_OPENSSL_LIBS@ @TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@ + @TOR_OPENSSL_LIBS@ @TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@ \ + @TOR_SYSTEMD_LIBS@ + +src_test_test_slow_CPPFLAGS = $(src_test_test_CPPFLAGS) +src_test_test_slow_CFLAGS = $(src_test_test_CFLAGS) +src_test_test_slow_LDADD = $(src_test_test_LDADD) +src_test_test_slow_LDFLAGS = $(src_test_test_LDFLAGS) src_test_bench_LDFLAGS = @TOR_LDFLAGS_zlib@ @TOR_LDFLAGS_openssl@ \ @TOR_LDFLAGS_libevent@ @@ -72,9 +104,20 @@ src_test_bench_LDADD = src/or/libtor.a src/common/libor.a \ src/common/libor-crypto.a $(LIBDONNA) \ src/common/libor-event.a \ @TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ @TOR_LIBEVENT_LIBS@ \ + @TOR_OPENSSL_LIBS@ @TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@ \ + @TOR_SYSTEMD_LIBS@ + +src_test_test_workqueue_LDFLAGS = @TOR_LDFLAGS_zlib@ @TOR_LDFLAGS_openssl@ \ + @TOR_LDFLAGS_libevent@ +src_test_test_workqueue_LDADD = src/or/libtor-testing.a \ + src/common/libor-testing.a \ + src/common/libor-crypto-testing.a $(LIBDONNA) \ + src/common/libor-event-testing.a \ + @TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ @TOR_LIBEVENT_LIBS@ \ @TOR_OPENSSL_LIBS@ @TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@ noinst_HEADERS+= \ + src/test/fakechans.h \ src/test/test.h \ src/test/test_descriptors.inc \ src/test/example_extrainfo.inc \ @@ -115,9 +158,11 @@ if USEPYTHON ./src/test/test-bt-cl assert | $(PYTHON) $(top_srcdir)/src/test/bt_test.py ./src/test/test-bt-cl crash | $(PYTHON) $(top_srcdir)/src/test/bt_test.py endif + $(top_srcdir)/src/test/zero_length_keys.sh EXTRA_DIST += \ src/test/bt_test.py \ src/test/ntor_ref.py \ src/test/slownacl_curve25519.py \ - src/test/test_cmdline_args.py + src/test/test_cmdline_args.py \ + src/test/zero_length_keys.sh diff --git a/src/test/ntor_ref.py b/src/test/ntor_ref.py index 7d6e43e716..e37637d92a 100755 --- a/src/test/ntor_ref.py +++ b/src/test/ntor_ref.py @@ -1,5 +1,5 @@ #!/usr/bin/python -# Copyright 2012-2013, The Tor Project, Inc +# Copyright 2012-2015, The Tor Project, Inc # See LICENSE for licensing information """ diff --git a/src/test/test-child.c b/src/test/test-child.c index 91ae5a66a5..2ce01ea9bb 100644 --- a/src/test/test-child.c +++ b/src/test/test-child.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2011-2014, The Tor Project, Inc. */ +/* Copyright (c) 2011-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include <stdio.h> diff --git a/src/test/test-network.sh b/src/test/test-network.sh index d28fbde80f..be57cafb7f 100755 --- a/src/test/test-network.sh +++ b/src/test/test-network.sh @@ -45,7 +45,7 @@ PATH="$TOR_DIR/src/or:$TOR_DIR/src/tools:$PATH" # Sleep some, waiting for the network to bootstrap. # TODO: Add chutney command 'bootstrap-status' and use that instead. -BOOTSTRAP_TIME=${BOOTSTRAP_TIME:-18} +BOOTSTRAP_TIME=${BOOTSTRAP_TIME:-25} $ECHO_N "$myname: sleeping for $BOOTSTRAP_TIME seconds" n=$BOOTSTRAP_TIME; while [ $n -gt 0 ]; do sleep 1; n=$(expr $n - 1); $ECHO_N . diff --git a/src/test/test.c b/src/test/test.c index 8b74c0a87a..ff4f517ac5 100644 --- a/src/test/test.c +++ b/src/test/test.c @@ -1,12 +1,8 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ -/* Ordinarily defined in tor_main.c; this bit is just here to provide one - * since we're not linking to tor_main.c */ -const char tor_git_revision[] = ""; - /** * \file test.c * \brief Unit tests for many pieces of the lower level Tor modules. @@ -67,171 +63,6 @@ double fabs(double x); #include "crypto_curve25519.h" #include "onion_ntor.h" -#ifdef USE_DMALLOC -#include <dmalloc.h> -#include <openssl/crypto.h> -#include "main.h" -#endif - -/** Set to true if any unit test has failed. Mostly, this is set by the macros - * in test.h */ -int have_failed = 0; - -/** Temporary directory (set up by setup_directory) under which we store all - * our files during testing. */ -static char temp_dir[256]; -#ifdef _WIN32 -#define pid_t int -#endif -static pid_t temp_dir_setup_in_pid = 0; - -/** Select and create the temporary directory we'll use to run our unit tests. - * Store it in <b>temp_dir</b>. Exit immediately if we can't create it. - * idempotent. */ -static void -setup_directory(void) -{ - static int is_setup = 0; - int r; - char rnd[256], rnd32[256]; - if (is_setup) return; - -/* Due to base32 limitation needs to be a multiple of 5. */ -#define RAND_PATH_BYTES 5 - crypto_rand(rnd, RAND_PATH_BYTES); - base32_encode(rnd32, sizeof(rnd32), rnd, RAND_PATH_BYTES); - -#ifdef _WIN32 - { - char buf[MAX_PATH]; - const char *tmp = buf; - const char *extra_backslash = ""; - /* If this fails, we're probably screwed anyway */ - if (!GetTempPathA(sizeof(buf),buf)) - tmp = "c:\\windows\\temp\\"; - if (strcmpend(tmp, "\\")) { - /* According to MSDN, it should be impossible for GetTempPath to give us - * an answer that doesn't end with \. But let's make sure. */ - extra_backslash = "\\"; - } - tor_snprintf(temp_dir, sizeof(temp_dir), - "%s%stor_test_%d_%s", tmp, extra_backslash, - (int)getpid(), rnd32); - r = mkdir(temp_dir); - } -#else - tor_snprintf(temp_dir, sizeof(temp_dir), "/tmp/tor_test_%d_%s", - (int) getpid(), rnd32); - r = mkdir(temp_dir, 0700); - if (!r) { - /* undo sticky bit so tests don't get confused. */ - r = chown(temp_dir, getuid(), getgid()); - } -#endif - if (r) { - fprintf(stderr, "Can't create directory %s:", temp_dir); - perror(""); - exit(1); - } - is_setup = 1; - temp_dir_setup_in_pid = getpid(); -} - -/** Return a filename relative to our testing temporary directory */ -const char * -get_fname(const char *name) -{ - static char buf[1024]; - setup_directory(); - if (!name) - return temp_dir; - tor_snprintf(buf,sizeof(buf),"%s/%s",temp_dir,name); - return buf; -} - -/* Remove a directory and all of its subdirectories */ -static void -rm_rf(const char *dir) -{ - struct stat st; - smartlist_t *elements; - - elements = tor_listdir(dir); - if (elements) { - SMARTLIST_FOREACH_BEGIN(elements, const char *, cp) { - char *tmp = NULL; - tor_asprintf(&tmp, "%s"PATH_SEPARATOR"%s", dir, cp); - if (0 == stat(tmp,&st) && (st.st_mode & S_IFDIR)) { - rm_rf(tmp); - } else { - if (unlink(tmp)) { - fprintf(stderr, "Error removing %s: %s\n", tmp, strerror(errno)); - } - } - tor_free(tmp); - } SMARTLIST_FOREACH_END(cp); - SMARTLIST_FOREACH(elements, char *, cp, tor_free(cp)); - smartlist_free(elements); - } - if (rmdir(dir)) - fprintf(stderr, "Error removing directory %s: %s\n", dir, strerror(errno)); -} - -/** Remove all files stored under the temporary directory, and the directory - * itself. Called by atexit(). */ -static void -remove_directory(void) -{ - if (getpid() != temp_dir_setup_in_pid) { - /* Only clean out the tempdir when the main process is exiting. */ - return; - } - - rm_rf(temp_dir); -} - -/** Define this if unit tests spend too much time generating public keys*/ -#undef CACHE_GENERATED_KEYS - -static crypto_pk_t *pregen_keys[5] = {NULL, NULL, NULL, NULL, NULL}; -#define N_PREGEN_KEYS ARRAY_LENGTH(pregen_keys) - -/** Generate and return a new keypair for use in unit tests. If we're using - * the key cache optimization, we might reuse keys: we only guarantee that - * keys made with distinct values for <b>idx</b> are different. The value of - * <b>idx</b> must be at least 0, and less than N_PREGEN_KEYS. */ -crypto_pk_t * -pk_generate(int idx) -{ -#ifdef CACHE_GENERATED_KEYS - tor_assert(idx < N_PREGEN_KEYS); - if (! pregen_keys[idx]) { - pregen_keys[idx] = crypto_pk_new(); - tor_assert(!crypto_pk_generate_key(pregen_keys[idx])); - } - return crypto_pk_dup_key(pregen_keys[idx]); -#else - crypto_pk_t *result; - (void) idx; - result = crypto_pk_new(); - tor_assert(!crypto_pk_generate_key(result)); - return result; -#endif -} - -/** Free all storage used for the cached key optimization. */ -static void -free_pregenerated_keys(void) -{ - unsigned idx; - for (idx = 0; idx < N_PREGEN_KEYS; ++idx) { - if (pregen_keys[idx]) { - crypto_pk_free(pregen_keys[idx]); - pregen_keys[idx] = NULL; - } - } -} - /** Run unit tests for the onion handshake code. */ static void test_onion_handshake(void *arg) @@ -277,9 +108,9 @@ test_onion_handshake(void *arg) memset(c_keys, 0, 40); tt_assert(! onion_skin_TAP_client_handshake(c_dh, s_buf, c_keys, 40)); - tt_mem_op(c_keys,==, s_keys, 40); + tt_mem_op(c_keys,OP_EQ, s_keys, 40); memset(s_buf, 0, 40); - tt_mem_op(c_keys,!=, s_buf, 40); + tt_mem_op(c_keys,OP_NE, s_buf, 40); } done: crypto_dh_free(c_dh); @@ -311,7 +142,7 @@ test_bad_onion_handshake(void *arg) memset(junk_buf, 0, sizeof(junk_buf)); crypto_pk_public_hybrid_encrypt(pk, junk_buf2, TAP_ONIONSKIN_CHALLENGE_LEN, junk_buf, DH_KEY_LEN, PK_PKCS1_OAEP_PADDING, 1); - tt_int_op(-1, ==, + tt_int_op(-1, OP_EQ, onion_skin_TAP_server_handshake(junk_buf2, pk, NULL, s_buf, s_keys, 40)); @@ -320,7 +151,7 @@ test_bad_onion_handshake(void *arg) memset(junk_buf2, 0, sizeof(junk_buf2)); crypto_pk_public_encrypt(pk, junk_buf2, sizeof(junk_buf2), junk_buf, 48, PK_PKCS1_OAEP_PADDING); - tt_int_op(-1, ==, + tt_int_op(-1, OP_EQ, onion_skin_TAP_server_handshake(junk_buf2, pk, NULL, s_buf, s_keys, 40)); @@ -329,36 +160,36 @@ test_bad_onion_handshake(void *arg) tt_assert(! onion_skin_TAP_create(pk, &c_dh, c_buf)); /* Server: Case 3: we just don't have the right key. */ - tt_int_op(-1, ==, + tt_int_op(-1, OP_EQ, onion_skin_TAP_server_handshake(c_buf, pk2, NULL, s_buf, s_keys, 40)); /* Server: Case 4: The RSA-encrypted portion is corrupt. */ c_buf[64] ^= 33; - tt_int_op(-1, ==, + tt_int_op(-1, OP_EQ, onion_skin_TAP_server_handshake(c_buf, pk, NULL, s_buf, s_keys, 40)); c_buf[64] ^= 33; /* (Let the server procede) */ - tt_int_op(0, ==, + tt_int_op(0, OP_EQ, onion_skin_TAP_server_handshake(c_buf, pk, NULL, s_buf, s_keys, 40)); /* Client: Case 1: The server sent back junk. */ s_buf[64] ^= 33; - tt_int_op(-1, ==, + tt_int_op(-1, OP_EQ, onion_skin_TAP_client_handshake(c_dh, s_buf, c_keys, 40)); s_buf[64] ^= 33; /* Let the client finish; make sure it can. */ - tt_int_op(0, ==, + tt_int_op(0, OP_EQ, onion_skin_TAP_client_handshake(c_dh, s_buf, c_keys, 40)); - tt_mem_op(s_keys,==, c_keys, 40); + tt_mem_op(s_keys,OP_EQ, c_keys, 40); /* Client: Case 2: The server sent back a degenerate DH. */ memset(s_buf, 0, sizeof(s_buf)); - tt_int_op(-1, ==, + tt_int_op(-1, OP_EQ, onion_skin_TAP_client_handshake(c_dh, s_buf, c_keys, 40)); done: @@ -395,24 +226,24 @@ test_ntor_handshake(void *arg) /* client handshake 1. */ memset(c_buf, 0, NTOR_ONIONSKIN_LEN); - tt_int_op(0, ==, onion_skin_ntor_create(node_id, server_pubkey, + tt_int_op(0, OP_EQ, onion_skin_ntor_create(node_id, server_pubkey, &c_state, c_buf)); /* server handshake */ memset(s_buf, 0, NTOR_REPLY_LEN); memset(s_keys, 0, 40); - tt_int_op(0, ==, onion_skin_ntor_server_handshake(c_buf, s_keymap, NULL, + tt_int_op(0, OP_EQ, onion_skin_ntor_server_handshake(c_buf, s_keymap, NULL, node_id, s_buf, s_keys, 400)); /* client handshake 2 */ memset(c_keys, 0, 40); - tt_int_op(0, ==, onion_skin_ntor_client_handshake(c_state, s_buf, + tt_int_op(0, OP_EQ, onion_skin_ntor_client_handshake(c_state, s_buf, c_keys, 400)); - tt_mem_op(c_keys,==, s_keys, 400); + tt_mem_op(c_keys,OP_EQ, s_keys, 400); memset(s_buf, 0, 40); - tt_mem_op(c_keys,!=, s_buf, 40); + tt_mem_op(c_keys,OP_NE, s_buf, 40); done: ntor_handshake_state_free(c_state); @@ -440,24 +271,24 @@ test_onion_queues(void *arg) create_cell_init(create2, CELL_CREATE, ONION_HANDSHAKE_TYPE_NTOR, NTOR_ONIONSKIN_LEN, buf2); - tt_int_op(0,==, onion_num_pending(ONION_HANDSHAKE_TYPE_TAP)); - tt_int_op(0,==, onion_pending_add(circ1, create1)); + tt_int_op(0,OP_EQ, onion_num_pending(ONION_HANDSHAKE_TYPE_TAP)); + tt_int_op(0,OP_EQ, onion_pending_add(circ1, create1)); create1 = NULL; - tt_int_op(1,==, onion_num_pending(ONION_HANDSHAKE_TYPE_TAP)); + tt_int_op(1,OP_EQ, onion_num_pending(ONION_HANDSHAKE_TYPE_TAP)); - tt_int_op(0,==, onion_num_pending(ONION_HANDSHAKE_TYPE_NTOR)); - tt_int_op(0,==, onion_pending_add(circ2, create2)); + tt_int_op(0,OP_EQ, onion_num_pending(ONION_HANDSHAKE_TYPE_NTOR)); + tt_int_op(0,OP_EQ, onion_pending_add(circ2, create2)); create2 = NULL; - tt_int_op(1,==, onion_num_pending(ONION_HANDSHAKE_TYPE_NTOR)); + tt_int_op(1,OP_EQ, onion_num_pending(ONION_HANDSHAKE_TYPE_NTOR)); - tt_ptr_op(circ2,==, onion_next_task(&onionskin)); - tt_int_op(1,==, onion_num_pending(ONION_HANDSHAKE_TYPE_TAP)); - tt_int_op(0,==, onion_num_pending(ONION_HANDSHAKE_TYPE_NTOR)); - tt_ptr_op(onionskin, ==, create2_ptr); + tt_ptr_op(circ2,OP_EQ, onion_next_task(&onionskin)); + tt_int_op(1,OP_EQ, onion_num_pending(ONION_HANDSHAKE_TYPE_TAP)); + tt_int_op(0,OP_EQ, onion_num_pending(ONION_HANDSHAKE_TYPE_NTOR)); + tt_ptr_op(onionskin, OP_EQ, create2_ptr); clear_pending_onions(); - tt_int_op(0,==, onion_num_pending(ONION_HANDSHAKE_TYPE_TAP)); - tt_int_op(0,==, onion_num_pending(ONION_HANDSHAKE_TYPE_NTOR)); + tt_int_op(0,OP_EQ, onion_num_pending(ONION_HANDSHAKE_TYPE_TAP)); + tt_int_op(0,OP_EQ, onion_num_pending(ONION_HANDSHAKE_TYPE_NTOR)); done: circuit_free(TO_CIRCUIT(circ1)); @@ -648,13 +479,13 @@ test_rend_fns(void *arg) (void)arg; tt_assert(BAD_HOSTNAME == parse_extended_hostname(address1)); tt_assert(ONION_HOSTNAME == parse_extended_hostname(address2)); - tt_str_op(address2,==, "aaaaaaaaaaaaaaaa"); + tt_str_op(address2,OP_EQ, "aaaaaaaaaaaaaaaa"); tt_assert(EXIT_HOSTNAME == parse_extended_hostname(address3)); tt_assert(NORMAL_HOSTNAME == parse_extended_hostname(address4)); tt_assert(ONION_HOSTNAME == parse_extended_hostname(address5)); - tt_str_op(address5,==, "abcdefghijklmnop"); + tt_str_op(address5,OP_EQ, "abcdefghijklmnop"); tt_assert(ONION_HOSTNAME == parse_extended_hostname(address6)); - tt_str_op(address6,==, "abcdefghijklmnop"); + tt_str_op(address6,OP_EQ, "abcdefghijklmnop"); tt_assert(BAD_HOSTNAME == parse_extended_hostname(address7)); pk1 = pk_generate(0); @@ -693,36 +524,36 @@ test_rend_fns(void *arg) tt_assert(rend_compute_v2_desc_id(computed_desc_id, service_id_base32, NULL, now, 0) == 0); tt_mem_op(((rend_encoded_v2_service_descriptor_t *) - smartlist_get(descs, 0))->desc_id, ==, + smartlist_get(descs, 0))->desc_id, OP_EQ, computed_desc_id, DIGEST_LEN); tt_assert(rend_parse_v2_service_descriptor(&parsed, parsed_desc_id, - &intro_points_encrypted, - &intro_points_size, - &encoded_size, - &next_desc, - ((rend_encoded_v2_service_descriptor_t *) - smartlist_get(descs, 0))->desc_str) == 0); + &intro_points_encrypted, + &intro_points_size, + &encoded_size, + &next_desc, + ((rend_encoded_v2_service_descriptor_t *) + smartlist_get(descs, 0))->desc_str, 1) == 0); tt_assert(parsed); tt_mem_op(((rend_encoded_v2_service_descriptor_t *) - smartlist_get(descs, 0))->desc_id,==, parsed_desc_id, DIGEST_LEN); + smartlist_get(descs, 0))->desc_id,OP_EQ, parsed_desc_id, DIGEST_LEN); tt_int_op(rend_parse_introduction_points(parsed, intro_points_encrypted, - intro_points_size),==, 3); + intro_points_size),OP_EQ, 3); tt_assert(!crypto_pk_cmp_keys(generated->pk, parsed->pk)); - tt_int_op(parsed->timestamp,==, now); - tt_int_op(parsed->version,==, 2); - tt_int_op(parsed->protocols,==, 42); - tt_int_op(smartlist_len(parsed->intro_nodes),==, 3); + tt_int_op(parsed->timestamp,OP_EQ, now); + tt_int_op(parsed->version,OP_EQ, 2); + tt_int_op(parsed->protocols,OP_EQ, 42); + tt_int_op(smartlist_len(parsed->intro_nodes),OP_EQ, 3); for (i = 0; i < smartlist_len(parsed->intro_nodes); i++) { rend_intro_point_t *par_intro = smartlist_get(parsed->intro_nodes, i), *gen_intro = smartlist_get(generated->intro_nodes, i); extend_info_t *par_info = par_intro->extend_info; extend_info_t *gen_info = gen_intro->extend_info; tt_assert(!crypto_pk_cmp_keys(gen_info->onion_key, par_info->onion_key)); - tt_mem_op(gen_info->identity_digest,==, par_info->identity_digest, + tt_mem_op(gen_info->identity_digest,OP_EQ, par_info->identity_digest, DIGEST_LEN); - tt_str_op(gen_info->nickname,==, par_info->nickname); + tt_str_op(gen_info->nickname,OP_EQ, par_info->nickname); tt_assert(tor_addr_eq(&gen_info->addr, &par_info->addr)); - tt_int_op(gen_info->port,==, par_info->port); + tt_int_op(gen_info->port,OP_EQ, par_info->port); } rend_service_descriptor_free(parsed); @@ -766,11 +597,11 @@ test_rend_fns(void *arg) } while (0) #define CHECK_COUNTRY(country, val) do { \ /* test ipv4 country lookup */ \ - tt_str_op(country, ==, \ + tt_str_op(country, OP_EQ, \ geoip_get_country_name(geoip_get_country_by_ipv4(val))); \ /* test ipv6 country lookup */ \ SET_TEST_IPV6(val); \ - tt_str_op(country, ==, \ + tt_str_op(country, OP_EQ, \ geoip_get_country_name(geoip_get_country_by_ipv6(&in6))); \ } while (0) @@ -831,23 +662,23 @@ test_geoip(void *arg) * 'sort' step. These aren't very good IP addresses, but they're perfectly * fine uint32_t values. */ (void)arg; - tt_int_op(0,==, geoip_parse_entry("10,50,AB", AF_INET)); - tt_int_op(0,==, geoip_parse_entry("52,90,XY", AF_INET)); - tt_int_op(0,==, geoip_parse_entry("95,100,AB", AF_INET)); - tt_int_op(0,==, geoip_parse_entry("\"105\",\"140\",\"ZZ\"", AF_INET)); - tt_int_op(0,==, geoip_parse_entry("\"150\",\"190\",\"XY\"", AF_INET)); - tt_int_op(0,==, geoip_parse_entry("\"200\",\"250\",\"AB\"", AF_INET)); + tt_int_op(0,OP_EQ, geoip_parse_entry("10,50,AB", AF_INET)); + tt_int_op(0,OP_EQ, geoip_parse_entry("52,90,XY", AF_INET)); + tt_int_op(0,OP_EQ, geoip_parse_entry("95,100,AB", AF_INET)); + tt_int_op(0,OP_EQ, geoip_parse_entry("\"105\",\"140\",\"ZZ\"", AF_INET)); + tt_int_op(0,OP_EQ, geoip_parse_entry("\"150\",\"190\",\"XY\"", AF_INET)); + tt_int_op(0,OP_EQ, geoip_parse_entry("\"200\",\"250\",\"AB\"", AF_INET)); /* Populate the IPv6 DB equivalently with fake IPs in the same range */ - tt_int_op(0,==, geoip_parse_entry("::a,::32,AB", AF_INET6)); - tt_int_op(0,==, geoip_parse_entry("::34,::5a,XY", AF_INET6)); - tt_int_op(0,==, geoip_parse_entry("::5f,::64,AB", AF_INET6)); - tt_int_op(0,==, geoip_parse_entry("::69,::8c,ZZ", AF_INET6)); - tt_int_op(0,==, geoip_parse_entry("::96,::be,XY", AF_INET6)); - tt_int_op(0,==, geoip_parse_entry("::c8,::fa,AB", AF_INET6)); + tt_int_op(0,OP_EQ, geoip_parse_entry("::a,::32,AB", AF_INET6)); + tt_int_op(0,OP_EQ, geoip_parse_entry("::34,::5a,XY", AF_INET6)); + tt_int_op(0,OP_EQ, geoip_parse_entry("::5f,::64,AB", AF_INET6)); + tt_int_op(0,OP_EQ, geoip_parse_entry("::69,::8c,ZZ", AF_INET6)); + tt_int_op(0,OP_EQ, geoip_parse_entry("::96,::be,XY", AF_INET6)); + tt_int_op(0,OP_EQ, geoip_parse_entry("::c8,::fa,AB", AF_INET6)); /* We should have 4 countries: ??, ab, xy, zz. */ - tt_int_op(4,==, geoip_get_n_countries()); + tt_int_op(4,OP_EQ, geoip_get_n_countries()); memset(&in6, 0, sizeof(in6)); CHECK_COUNTRY("??", 3); @@ -858,9 +689,9 @@ test_geoip(void *arg) CHECK_COUNTRY("xy", 190); CHECK_COUNTRY("??", 2000); - tt_int_op(0,==, geoip_get_country_by_ipv4(3)); + tt_int_op(0,OP_EQ, geoip_get_country_by_ipv4(3)); SET_TEST_IPV6(3); - tt_int_op(0,==, geoip_get_country_by_ipv6(&in6)); + tt_int_op(0,OP_EQ, geoip_get_country_by_ipv6(&in6)); get_options_mutable()->BridgeRelay = 1; get_options_mutable()->BridgeRecordUsageByCountry = 1; @@ -885,8 +716,8 @@ test_geoip(void *arg) geoip_get_client_history(GEOIP_CLIENT_CONNECT, &s, &v); tt_assert(s); tt_assert(v); - tt_str_op("zz=24,ab=16,xy=8",==, s); - tt_str_op("v4=16,v6=16",==, v); + tt_str_op("zz=24,ab=16,xy=8",OP_EQ, s); + tt_str_op("v4=16,v6=16",OP_EQ, v); tor_free(s); tor_free(v); @@ -895,8 +726,8 @@ test_geoip(void *arg) geoip_get_client_history(GEOIP_CLIENT_CONNECT, &s, &v); tt_assert(s); tt_assert(v); - tt_str_op("zz=24,xy=8",==, s); - tt_str_op("v4=16,v6=16",==, v); + tt_str_op("zz=24,xy=8",OP_EQ, s); + tt_str_op("v4=16,v6=16",OP_EQ, v); tor_free(s); tor_free(v); @@ -910,7 +741,7 @@ test_geoip(void *arg) geoip_bridge_stats_init(now); s = geoip_format_bridge_stats(now + 86400); tt_assert(s); - tt_str_op(bridge_stats_1,==, s); + tt_str_op(bridge_stats_1,OP_EQ, s); tor_free(s); /* Stop collecting bridge stats and make sure we don't write a history @@ -939,7 +770,7 @@ test_geoip(void *arg) SET_TEST_ADDRESS(100); geoip_note_client_seen(GEOIP_CLIENT_NETWORKSTATUS, &addr, NULL, now); s = geoip_format_dirreq_stats(now + 86400); - tt_str_op(dirreq_stats_1,==, s); + tt_str_op(dirreq_stats_1,OP_EQ, s); tor_free(s); /* Stop collecting stats, add another connecting client, and ensure we @@ -957,20 +788,20 @@ test_geoip(void *arg) geoip_note_client_seen(GEOIP_CLIENT_NETWORKSTATUS, &addr, NULL, now); geoip_reset_dirreq_stats(now); s = geoip_format_dirreq_stats(now + 86400); - tt_str_op(dirreq_stats_2,==, s); + tt_str_op(dirreq_stats_2,OP_EQ, s); tor_free(s); /* Note a successful network status response and make sure that it * appears in the history string. */ geoip_note_ns_response(GEOIP_SUCCESS); s = geoip_format_dirreq_stats(now + 86400); - tt_str_op(dirreq_stats_3,==, s); + tt_str_op(dirreq_stats_3,OP_EQ, s); tor_free(s); /* Start a tunneled directory request. */ geoip_start_dirreq((uint64_t) 1, 1024, DIRREQ_TUNNELED); s = geoip_format_dirreq_stats(now + 86400); - tt_str_op(dirreq_stats_4,==, s); + tt_str_op(dirreq_stats_4,OP_EQ, s); tor_free(s); /* Stop collecting directory request statistics and start gathering @@ -992,7 +823,7 @@ test_geoip(void *arg) SET_TEST_ADDRESS(100); geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, NULL, now); s = geoip_format_entry_stats(now + 86400); - tt_str_op(entry_stats_1,==, s); + tt_str_op(entry_stats_1,OP_EQ, s); tor_free(s); /* Stop collecting stats, add another connecting client, and ensure we @@ -1010,7 +841,7 @@ test_geoip(void *arg) geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, NULL, now); geoip_reset_entry_stats(now); s = geoip_format_entry_stats(now + 86400); - tt_str_op(entry_stats_2,==, s); + tt_str_op(entry_stats_2,OP_EQ, s); tor_free(s); /* Stop collecting entry statistics. */ @@ -1083,7 +914,7 @@ test_geoip_with_pt(void *arg) /* Test the transport history string. */ s = geoip_get_transport_history(); tor_assert(s); - tt_str_op(s,==, "<OR>=8,alpha=16,beta=8,charlie=16,ddr=136," + tt_str_op(s,OP_EQ, "<OR>=8,alpha=16,beta=8,charlie=16,ddr=136," "entropy=8,fire=8,google=8"); /* Stop collecting entry statistics. */ @@ -1126,7 +957,7 @@ test_stats(void *arg) tt_str_op("exit-stats-end 2010-08-12 13:27:30 (86400 s)\n" "exit-kibibytes-written 80=1,443=1,other=0\n" "exit-kibibytes-read 80=10,443=20,other=0\n" - "exit-streams-opened 80=4,443=4,other=0\n",==, s); + "exit-streams-opened 80=4,443=4,other=0\n",OP_EQ, s); tor_free(s); /* Add a few bytes on 10 more ports and ensure that only the top 10 @@ -1142,7 +973,7 @@ test_stats(void *arg) "exit-kibibytes-read 52=1,53=1,54=1,55=1,56=1,57=1,58=1," "59=1,80=10,443=20,other=1\n" "exit-streams-opened 52=4,53=4,54=4,55=4,56=4,57=4,58=4," - "59=4,80=4,443=4,other=4\n",==, s); + "59=4,80=4,443=4,other=4\n",OP_EQ, s); tor_free(s); /* Stop collecting stats, add some bytes, and ensure we don't generate @@ -1162,7 +993,7 @@ test_stats(void *arg) tt_str_op("exit-stats-end 2010-08-12 13:27:30 (86400 s)\n" "exit-kibibytes-written other=0\n" "exit-kibibytes-read other=0\n" - "exit-streams-opened other=0\n",==, s); + "exit-streams-opened other=0\n",OP_EQ, s); tor_free(s); /* Continue with testing connection statistics; we shouldn't collect @@ -1178,7 +1009,7 @@ test_stats(void *arg) rep_hist_note_or_conn_bytes(2, 400000, 30000, now + 10); rep_hist_note_or_conn_bytes(2, 400000, 30000, now + 15); s = rep_hist_format_conn_stats(now + 86400); - tt_str_op("conn-bi-direct 2010-08-12 13:27:30 (86400 s) 0,0,1,0\n",==, s); + tt_str_op("conn-bi-direct 2010-08-12 13:27:30 (86400 s) 0,0,1,0\n",OP_EQ, s); tor_free(s); /* Stop collecting stats, add some bytes, and ensure we don't generate @@ -1197,7 +1028,7 @@ test_stats(void *arg) rep_hist_note_or_conn_bytes(2, 400000, 30000, now + 15); rep_hist_reset_conn_stats(now); s = rep_hist_format_conn_stats(now + 86400); - tt_str_op("conn-bi-direct 2010-08-12 13:27:30 (86400 s) 0,0,0,0\n",==, s); + tt_str_op("conn-bi-direct 2010-08-12 13:27:30 (86400 s) 0,0,0,0\n",OP_EQ, s); tor_free(s); /* Continue with testing buffer statistics; we shouldn't collect buffer @@ -1216,7 +1047,7 @@ test_stats(void *arg) "cell-queued-cells 2.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00," "0.00,0.00\n" "cell-time-in-queue 2,0,0,0,0,0,0,0,0,0\n" - "cell-circuits-per-decile 1\n",==, s); + "cell-circuits-per-decile 1\n",OP_EQ, s); tor_free(s); /* Add nineteen more circuit statistics to the one that's already in the @@ -1231,7 +1062,7 @@ test_stats(void *arg) "cell-queued-cells 2.75,2.75,2.75,2.75,2.75,2.75,2.75,2.75," "2.75,2.75\n" "cell-time-in-queue 3,3,3,3,3,3,3,3,3,3\n" - "cell-circuits-per-decile 2\n",==, s); + "cell-circuits-per-decile 2\n",OP_EQ, s); tor_free(s); /* Stop collecting stats, add statistics for one circuit, and ensure we @@ -1252,7 +1083,7 @@ test_stats(void *arg) "cell-queued-cells 0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00," "0.00,0.00\n" "cell-time-in-queue 0,0,0,0,0,0,0,0,0,0\n" - "cell-circuits-per-decile 0\n",==, s); + "cell-circuits-per-decile 0\n",OP_EQ, s); done: tor_free(s); @@ -1277,154 +1108,88 @@ static struct testcase_t test_array[] = { END_OF_TESTCASES }; +extern struct testcase_t accounting_tests[]; extern struct testcase_t addr_tests[]; +extern struct testcase_t address_tests[]; extern struct testcase_t buffer_tests[]; -extern struct testcase_t crypto_tests[]; -extern struct testcase_t container_tests[]; -extern struct testcase_t util_tests[]; -extern struct testcase_t dir_tests[]; -extern struct testcase_t checkdir_tests[]; -extern struct testcase_t microdesc_tests[]; -extern struct testcase_t pt_tests[]; -extern struct testcase_t config_tests[]; -extern struct testcase_t introduce_tests[]; -extern struct testcase_t replaycache_tests[]; -extern struct testcase_t relaycell_tests[]; extern struct testcase_t cell_format_tests[]; +extern struct testcase_t cell_queue_tests[]; +extern struct testcase_t channel_tests[]; +extern struct testcase_t channeltls_tests[]; +extern struct testcase_t checkdir_tests[]; extern struct testcase_t circuitlist_tests[]; extern struct testcase_t circuitmux_tests[]; -extern struct testcase_t cell_queue_tests[]; -extern struct testcase_t options_tests[]; -extern struct testcase_t socks_tests[]; +extern struct testcase_t config_tests[]; +extern struct testcase_t container_tests[]; +extern struct testcase_t controller_event_tests[]; +extern struct testcase_t crypto_tests[]; +extern struct testcase_t dir_tests[]; +extern struct testcase_t entryconn_tests[]; extern struct testcase_t entrynodes_tests[]; extern struct testcase_t extorport_tests[]; -extern struct testcase_t controller_event_tests[]; -extern struct testcase_t logging_tests[]; extern struct testcase_t hs_tests[]; +extern struct testcase_t introduce_tests[]; +extern struct testcase_t logging_tests[]; +extern struct testcase_t microdesc_tests[]; extern struct testcase_t nodelist_tests[]; -extern struct testcase_t routerkeys_tests[]; extern struct testcase_t oom_tests[]; -extern struct testcase_t accounting_tests[]; +extern struct testcase_t options_tests[]; extern struct testcase_t policy_tests[]; -extern struct testcase_t status_tests[]; +extern struct testcase_t pt_tests[]; +extern struct testcase_t relay_tests[]; +extern struct testcase_t relaycell_tests[]; +extern struct testcase_t replaycache_tests[]; +extern struct testcase_t router_tests[]; +extern struct testcase_t routerkeys_tests[]; +extern struct testcase_t routerlist_tests[]; extern struct testcase_t routerset_tests[]; +extern struct testcase_t scheduler_tests[]; +extern struct testcase_t socks_tests[]; +extern struct testcase_t status_tests[]; +extern struct testcase_t thread_tests[]; +extern struct testcase_t util_tests[]; -static struct testgroup_t testgroups[] = { +struct testgroup_t testgroups[] = { { "", test_array }, - { "buffer/", buffer_tests }, - { "socks/", socks_tests }, + { "accounting/", accounting_tests }, { "addr/", addr_tests }, - { "crypto/", crypto_tests }, - { "container/", container_tests }, - { "util/", util_tests }, - { "util/logging/", logging_tests }, + { "address/", address_tests }, + { "buffer/", buffer_tests }, { "cellfmt/", cell_format_tests }, { "cellqueue/", cell_queue_tests }, - { "dir/", dir_tests }, + { "channel/", channel_tests }, + { "channeltls/", channeltls_tests }, { "checkdir/", checkdir_tests }, - { "dir/md/", microdesc_tests }, - { "pt/", pt_tests }, - { "config/", config_tests }, - { "replaycache/", replaycache_tests }, - { "relaycell/", relaycell_tests }, - { "introduce/", introduce_tests }, { "circuitlist/", circuitlist_tests }, { "circuitmux/", circuitmux_tests }, - { "options/", options_tests }, + { "config/", config_tests }, + { "container/", container_tests }, + { "control/", controller_event_tests }, + { "crypto/", crypto_tests }, + { "dir/", dir_tests }, + { "dir/md/", microdesc_tests }, + { "entryconn/", entryconn_tests }, { "entrynodes/", entrynodes_tests }, { "extorport/", extorport_tests }, - { "control/", controller_event_tests }, { "hs/", hs_tests }, + { "introduce/", introduce_tests }, { "nodelist/", nodelist_tests }, - { "routerkeys/", routerkeys_tests }, { "oom/", oom_tests }, - { "accounting/", accounting_tests }, + { "options/", options_tests }, { "policy/" , policy_tests }, - { "status/" , status_tests }, + { "pt/", pt_tests }, + { "relay/" , relay_tests }, + { "relaycell/", relaycell_tests }, + { "replaycache/", replaycache_tests }, + { "routerkeys/", routerkeys_tests }, + { "routerlist/", routerlist_tests }, { "routerset/" , routerset_tests }, + { "scheduler/", scheduler_tests }, + { "socks/", socks_tests }, + { "status/" , status_tests }, + { "util/", util_tests }, + { "util/logging/", logging_tests }, + { "util/thread/", thread_tests }, END_OF_GROUPS }; -/** Main entry point for unit test code: parse the command line, and run - * some unit tests. */ -int -main(int c, const char **v) -{ - or_options_t *options; - char *errmsg = NULL; - int i, i_out; - int loglevel = LOG_ERR; - int accel_crypto = 0; - -#ifdef USE_DMALLOC - { - int r = CRYPTO_set_mem_ex_functions(tor_malloc_, tor_realloc_, tor_free_); - tor_assert(r); - } -#endif - - update_approx_time(time(NULL)); - options = options_new(); - tor_threads_init(); - init_logging(1); - configure_backtrace_handler(get_version()); - - for (i_out = i = 1; i < c; ++i) { - if (!strcmp(v[i], "--warn")) { - loglevel = LOG_WARN; - } else if (!strcmp(v[i], "--notice")) { - loglevel = LOG_NOTICE; - } else if (!strcmp(v[i], "--info")) { - loglevel = LOG_INFO; - } else if (!strcmp(v[i], "--debug")) { - loglevel = LOG_DEBUG; - } else if (!strcmp(v[i], "--accel")) { - accel_crypto = 1; - } else { - v[i_out++] = v[i]; - } - } - c = i_out; - - { - log_severity_list_t s; - memset(&s, 0, sizeof(s)); - set_log_severity_config(loglevel, LOG_ERR, &s); - add_stream_log(&s, "", fileno(stdout)); - } - - options->command = CMD_RUN_UNITTESTS; - if (crypto_global_init(accel_crypto, NULL, NULL)) { - printf("Can't initialize crypto subsystem; exiting.\n"); - return 1; - } - crypto_set_tls_dh_prime(NULL); - crypto_seed_rng(1); - rep_hist_init(); - network_init(); - setup_directory(); - options_init(options); - options->DataDirectory = tor_strdup(temp_dir); - options->EntryStatistics = 1; - if (set_options(options, &errmsg) < 0) { - printf("Failed to set initial options: %s\n", errmsg); - tor_free(errmsg); - return 1; - } - - atexit(remove_directory); - - have_failed = (tinytest_main(c, v, testgroups) != 0); - - free_pregenerated_keys(); -#ifdef USE_DMALLOC - tor_free_all(0); - dmalloc_log_unfreed(); -#endif - - if (have_failed) - return 1; - else - return 0; -} - diff --git a/src/test/test.h b/src/test/test.h index db07e4b706..b8057c59bf 100644 --- a/src/test/test.h +++ b/src/test/test.h @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2003, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TOR_TEST_H @@ -34,7 +34,7 @@ tt_mem_op(expr1, op, mem_op_hex_tmp, length/2); \ STMT_END -#define test_memeq_hex(expr1, hex) test_mem_op_hex(expr1, ==, hex) +#define test_memeq_hex(expr1, hex) test_mem_op_hex(expr1, OP_EQ, hex) #define tt_double_op(a,op,b) \ tt_assert_test_type(a,b,#a" "#op" "#b,double,(val1_ op val2_),"%f", \ @@ -158,5 +158,7 @@ crypto_pk_t *pk_generate(int idx); #define NS_MOCK(name) MOCK(name, NS(name)) #define NS_UNMOCK(name) UNMOCK(name) +extern const struct testcase_setup_t passthrough_setup; + #endif diff --git a/src/test/test_addr.c b/src/test/test_addr.c index e9fe3038b8..2c25c1ef7d 100644 --- a/src/test/test_addr.c +++ b/src/test/test_addr.c @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define ADDRESSMAP_PRIVATE @@ -20,40 +20,40 @@ test_addr_basic(void *arg) (void)arg; cp = NULL; u32 = 3; u16 = 3; tt_assert(!addr_port_lookup(LOG_WARN, "1.2.3.4", &cp, &u32, &u16)); - tt_str_op(cp,==, "1.2.3.4"); - tt_int_op(u32,==, 0x01020304u); - tt_int_op(u16,==, 0); + tt_str_op(cp,OP_EQ, "1.2.3.4"); + tt_int_op(u32,OP_EQ, 0x01020304u); + tt_int_op(u16,OP_EQ, 0); tor_free(cp); tt_assert(!addr_port_lookup(LOG_WARN, "4.3.2.1:99", &cp, &u32, &u16)); - tt_str_op(cp,==, "4.3.2.1"); - tt_int_op(u32,==, 0x04030201u); - tt_int_op(u16,==, 99); + tt_str_op(cp,OP_EQ, "4.3.2.1"); + tt_int_op(u32,OP_EQ, 0x04030201u); + tt_int_op(u16,OP_EQ, 99); tor_free(cp); tt_assert(!addr_port_lookup(LOG_WARN, "nonexistent.address:4040", &cp, NULL, &u16)); - tt_str_op(cp,==, "nonexistent.address"); - tt_int_op(u16,==, 4040); + tt_str_op(cp,OP_EQ, "nonexistent.address"); + tt_int_op(u16,OP_EQ, 4040); tor_free(cp); tt_assert(!addr_port_lookup(LOG_WARN, "localhost:9999", &cp, &u32, &u16)); - tt_str_op(cp,==, "localhost"); - tt_int_op(u32,==, 0x7f000001u); - tt_int_op(u16,==, 9999); + tt_str_op(cp,OP_EQ, "localhost"); + tt_int_op(u32,OP_EQ, 0x7f000001u); + tt_int_op(u16,OP_EQ, 9999); tor_free(cp); u32 = 3; tt_assert(!addr_port_lookup(LOG_WARN, "localhost", NULL, &u32, &u16)); - tt_ptr_op(cp,==, NULL); - tt_int_op(u32,==, 0x7f000001u); - tt_int_op(u16,==, 0); + tt_ptr_op(cp,OP_EQ, NULL); + tt_int_op(u32,OP_EQ, 0x7f000001u); + tt_int_op(u16,OP_EQ, 0); tor_free(cp); tt_assert(addr_port_lookup(LOG_WARN, "localhost:3", &cp, &u32, NULL)); tor_free(cp); - tt_int_op(0,==, addr_mask_get_bits(0x0u)); - tt_int_op(32,==, addr_mask_get_bits(0xFFFFFFFFu)); - tt_int_op(16,==, addr_mask_get_bits(0xFFFF0000u)); - tt_int_op(31,==, addr_mask_get_bits(0xFFFFFFFEu)); - tt_int_op(1,==, addr_mask_get_bits(0x80000000u)); + tt_int_op(0,OP_EQ, addr_mask_get_bits(0x0u)); + tt_int_op(32,OP_EQ, addr_mask_get_bits(0xFFFFFFFFu)); + tt_int_op(16,OP_EQ, addr_mask_get_bits(0xFFFF0000u)); + tt_int_op(31,OP_EQ, addr_mask_get_bits(0xFFFFFFFEu)); + tt_int_op(1,OP_EQ, addr_mask_get_bits(0x80000000u)); /* Test inet_ntop */ { @@ -62,15 +62,16 @@ test_addr_basic(void *arg) struct in_addr in; /* good round trip */ - tt_int_op(tor_inet_pton(AF_INET, ip, &in),==, 1); - tt_ptr_op(tor_inet_ntop(AF_INET, &in, tmpbuf, sizeof(tmpbuf)),==, &tmpbuf); - tt_str_op(tmpbuf,==, ip); + tt_int_op(tor_inet_pton(AF_INET, ip, &in), OP_EQ, 1); + tt_ptr_op(tor_inet_ntop(AF_INET, &in, tmpbuf, sizeof(tmpbuf)), + OP_EQ, &tmpbuf); + tt_str_op(tmpbuf,OP_EQ, ip); /* just enough buffer length */ - tt_str_op(tor_inet_ntop(AF_INET, &in, tmpbuf, strlen(ip) + 1),==, ip); + tt_str_op(tor_inet_ntop(AF_INET, &in, tmpbuf, strlen(ip) + 1), OP_EQ, ip); /* too short buffer */ - tt_ptr_op(tor_inet_ntop(AF_INET, &in, tmpbuf, strlen(ip)),==, NULL); + tt_ptr_op(tor_inet_ntop(AF_INET, &in, tmpbuf, strlen(ip)),OP_EQ, NULL); } done: @@ -98,30 +99,30 @@ test_addr_basic(void *arg) /** Helper: Assert that two strings both decode as IPv6 addresses with * tor_inet_pton(), and both decode to the same address. */ #define test_pton6_same(a,b) STMT_BEGIN \ - tt_int_op(tor_inet_pton(AF_INET6, a, &a1), ==, 1); \ - tt_int_op(tor_inet_pton(AF_INET6, b, &a2), ==, 1); \ - test_op_ip6_(&a1,==,&a2,#a,#b); \ + tt_int_op(tor_inet_pton(AF_INET6, a, &a1), OP_EQ, 1); \ + tt_int_op(tor_inet_pton(AF_INET6, b, &a2), OP_EQ, 1); \ + test_op_ip6_(&a1,OP_EQ,&a2,#a,#b); \ STMT_END /** Helper: Assert that <b>a</b> is recognized as a bad IPv6 address by * tor_inet_pton(). */ #define test_pton6_bad(a) \ - tt_int_op(0, ==, tor_inet_pton(AF_INET6, a, &a1)) + tt_int_op(0, OP_EQ, tor_inet_pton(AF_INET6, a, &a1)) /** Helper: assert that <b>a</b>, when parsed by tor_inet_pton() and displayed * with tor_inet_ntop(), yields <b>b</b>. Also assert that <b>b</b> parses to * the same value as <b>a</b>. */ #define test_ntop6_reduces(a,b) STMT_BEGIN \ - tt_int_op(tor_inet_pton(AF_INET6, a, &a1), ==, 1); \ - tt_str_op(tor_inet_ntop(AF_INET6, &a1, buf, sizeof(buf)), ==, b); \ - tt_int_op(tor_inet_pton(AF_INET6, b, &a2), ==, 1); \ - test_op_ip6_(&a1, ==, &a2, a, b); \ + tt_int_op(tor_inet_pton(AF_INET6, a, &a1), OP_EQ, 1); \ + tt_str_op(tor_inet_ntop(AF_INET6, &a1, buf, sizeof(buf)), OP_EQ, b); \ + tt_int_op(tor_inet_pton(AF_INET6, b, &a2), OP_EQ, 1); \ + test_op_ip6_(&a1, OP_EQ, &a2, a, b); \ STMT_END /** Helper: assert that <b>a</b> parses by tor_inet_pton() into a address that * passes tor_addr_is_internal() with <b>for_listening</b>. */ #define test_internal_ip(a,for_listening) STMT_BEGIN \ - tt_int_op(tor_inet_pton(AF_INET6, a, &t1.addr.in6_addr), ==, 1); \ + tt_int_op(tor_inet_pton(AF_INET6, a, &t1.addr.in6_addr), OP_EQ, 1); \ t1.family = AF_INET6; \ if (!tor_addr_is_internal(&t1, for_listening)) \ TT_DIE(("%s was not internal", a)); \ @@ -130,7 +131,7 @@ test_addr_basic(void *arg) /** Helper: assert that <b>a</b> parses by tor_inet_pton() into a address that * does not pass tor_addr_is_internal() with <b>for_listening</b>. */ #define test_external_ip(a,for_listening) STMT_BEGIN \ - tt_int_op(tor_inet_pton(AF_INET6, a, &t1.addr.in6_addr), ==, 1); \ + tt_int_op(tor_inet_pton(AF_INET6, a, &t1.addr.in6_addr), OP_EQ, 1); \ t1.family = AF_INET6; \ if (tor_addr_is_internal(&t1, for_listening)) \ TT_DIE(("%s was not internal", a)); \ @@ -140,8 +141,8 @@ test_addr_basic(void *arg) * tor_inet_pton(), give addresses that compare in the order defined by * <b>op</b> with tor_addr_compare(). */ #define test_addr_compare(a, op, b) STMT_BEGIN \ - tt_int_op(tor_inet_pton(AF_INET6, a, &t1.addr.in6_addr), ==, 1); \ - tt_int_op(tor_inet_pton(AF_INET6, b, &t2.addr.in6_addr), ==, 1); \ + tt_int_op(tor_inet_pton(AF_INET6, a, &t1.addr.in6_addr), OP_EQ, 1); \ + tt_int_op(tor_inet_pton(AF_INET6, b, &t2.addr.in6_addr), OP_EQ, 1); \ t1.family = t2.family = AF_INET6; \ r = tor_addr_compare(&t1,&t2,CMP_SEMANTIC); \ if (!(r op 0)) \ @@ -152,8 +153,8 @@ test_addr_basic(void *arg) * tor_inet_pton(), give addresses that compare in the order defined by * <b>op</b> with tor_addr_compare_masked() with <b>m</b> masked. */ #define test_addr_compare_masked(a, op, b, m) STMT_BEGIN \ - tt_int_op(tor_inet_pton(AF_INET6, a, &t1.addr.in6_addr), ==, 1); \ - tt_int_op(tor_inet_pton(AF_INET6, b, &t2.addr.in6_addr), ==, 1); \ + tt_int_op(tor_inet_pton(AF_INET6, a, &t1.addr.in6_addr), OP_EQ, 1); \ + tt_int_op(tor_inet_pton(AF_INET6, b, &t2.addr.in6_addr), OP_EQ, 1); \ t1.family = t2.family = AF_INET6; \ r = tor_addr_compare_masked(&t1,&t2,m,CMP_SEMANTIC); \ if (!(r op 0)) \ @@ -168,15 +169,15 @@ test_addr_basic(void *arg) #define test_addr_mask_ports_parse(xx, f, ip1, ip2, ip3, ip4, mm, pt1, pt2) \ STMT_BEGIN \ tt_int_op(tor_addr_parse_mask_ports(xx, 0, &t1, &mask, &port1, &port2), \ - ==, f); \ + OP_EQ, f); \ p1=tor_inet_ntop(AF_INET6, &t1.addr.in6_addr, bug, sizeof(bug)); \ - tt_int_op(htonl(ip1), ==, tor_addr_to_in6_addr32(&t1)[0]); \ - tt_int_op(htonl(ip2), ==, tor_addr_to_in6_addr32(&t1)[1]); \ - tt_int_op(htonl(ip3), ==, tor_addr_to_in6_addr32(&t1)[2]); \ - tt_int_op(htonl(ip4), ==, tor_addr_to_in6_addr32(&t1)[3]); \ - tt_int_op(mask, ==, mm); \ - tt_uint_op(port1, ==, pt1); \ - tt_uint_op(port2, ==, pt2); \ + tt_int_op(htonl(ip1), OP_EQ, tor_addr_to_in6_addr32(&t1)[0]); \ + tt_int_op(htonl(ip2), OP_EQ, tor_addr_to_in6_addr32(&t1)[1]); \ + tt_int_op(htonl(ip3), OP_EQ, tor_addr_to_in6_addr32(&t1)[2]); \ + tt_int_op(htonl(ip4), OP_EQ, tor_addr_to_in6_addr32(&t1)[3]); \ + tt_int_op(mask, OP_EQ, mm); \ + tt_uint_op(port1, OP_EQ, pt1); \ + tt_uint_op(port2, OP_EQ, pt2); \ STMT_END /** Run unit tests for IPv6 encoding/decoding/manipulation functions. */ @@ -202,23 +203,23 @@ test_addr_ip6_helpers(void *arg) const char *ip_ffff = "::ffff:192.168.1.2"; /* good round trip */ - tt_int_op(tor_inet_pton(AF_INET6, ip, &a1),==, 1); - tt_ptr_op(tor_inet_ntop(AF_INET6, &a1, buf, sizeof(buf)),==, &buf); - tt_str_op(buf,==, ip); + tt_int_op(tor_inet_pton(AF_INET6, ip, &a1),OP_EQ, 1); + tt_ptr_op(tor_inet_ntop(AF_INET6, &a1, buf, sizeof(buf)),OP_EQ, &buf); + tt_str_op(buf,OP_EQ, ip); /* good round trip - ::ffff:0:0 style */ - tt_int_op(tor_inet_pton(AF_INET6, ip_ffff, &a2),==, 1); - tt_ptr_op(tor_inet_ntop(AF_INET6, &a2, buf, sizeof(buf)),==, &buf); - tt_str_op(buf,==, ip_ffff); + tt_int_op(tor_inet_pton(AF_INET6, ip_ffff, &a2),OP_EQ, 1); + tt_ptr_op(tor_inet_ntop(AF_INET6, &a2, buf, sizeof(buf)),OP_EQ, &buf); + tt_str_op(buf,OP_EQ, ip_ffff); /* just long enough buffer (remember \0) */ - tt_str_op(tor_inet_ntop(AF_INET6, &a1, buf, strlen(ip)+1),==, ip); - tt_str_op(tor_inet_ntop(AF_INET6, &a2, buf, strlen(ip_ffff)+1),==, + tt_str_op(tor_inet_ntop(AF_INET6, &a1, buf, strlen(ip)+1),OP_EQ, ip); + tt_str_op(tor_inet_ntop(AF_INET6, &a2, buf, strlen(ip_ffff)+1),OP_EQ, ip_ffff); /* too short buffer (remember \0) */ - tt_ptr_op(tor_inet_ntop(AF_INET6, &a1, buf, strlen(ip)),==, NULL); - tt_ptr_op(tor_inet_ntop(AF_INET6, &a2, buf, strlen(ip_ffff)),==, NULL); + tt_ptr_op(tor_inet_ntop(AF_INET6, &a1, buf, strlen(ip)),OP_EQ, NULL); + tt_ptr_op(tor_inet_ntop(AF_INET6, &a2, buf, strlen(ip_ffff)),OP_EQ, NULL); } /* ==== Converting to and from sockaddr_t. */ @@ -227,16 +228,16 @@ test_addr_ip6_helpers(void *arg) sin->sin_port = htons(9090); sin->sin_addr.s_addr = htonl(0x7f7f0102); /*127.127.1.2*/ tor_addr_from_sockaddr(&t1, (struct sockaddr *)sin, &port1); - tt_int_op(tor_addr_family(&t1),==, AF_INET); - tt_int_op(tor_addr_to_ipv4h(&t1),==, 0x7f7f0102); - tt_int_op(port1, ==, 9090); + tt_int_op(tor_addr_family(&t1),OP_EQ, AF_INET); + tt_int_op(tor_addr_to_ipv4h(&t1),OP_EQ, 0x7f7f0102); + tt_int_op(port1, OP_EQ, 9090); memset(&sa_storage, 0, sizeof(sa_storage)); - tt_int_op(sizeof(struct sockaddr_in),==, + tt_int_op(sizeof(struct sockaddr_in),OP_EQ, tor_addr_to_sockaddr(&t1, 1234, (struct sockaddr *)&sa_storage, sizeof(sa_storage))); - tt_int_op(1234,==, ntohs(sin->sin_port)); - tt_int_op(0x7f7f0102,==, ntohl(sin->sin_addr.s_addr)); + tt_int_op(1234,OP_EQ, ntohs(sin->sin_port)); + tt_int_op(0x7f7f0102,OP_EQ, ntohl(sin->sin_addr.s_addr)); memset(&sa_storage, 0, sizeof(sa_storage)); sin6 = (struct sockaddr_in6 *)&sa_storage; @@ -244,37 +245,37 @@ test_addr_ip6_helpers(void *arg) sin6->sin6_port = htons(7070); sin6->sin6_addr.s6_addr[0] = 128; tor_addr_from_sockaddr(&t1, (struct sockaddr *)sin6, &port1); - tt_int_op(tor_addr_family(&t1),==, AF_INET6); - tt_int_op(port1, ==, 7070); + tt_int_op(tor_addr_family(&t1),OP_EQ, AF_INET6); + tt_int_op(port1, OP_EQ, 7070); p1 = tor_addr_to_str(buf, &t1, sizeof(buf), 0); - tt_str_op(p1,==, "8000::"); + tt_str_op(p1,OP_EQ, "8000::"); memset(&sa_storage, 0, sizeof(sa_storage)); - tt_int_op(sizeof(struct sockaddr_in6),==, + tt_int_op(sizeof(struct sockaddr_in6),OP_EQ, tor_addr_to_sockaddr(&t1, 9999, (struct sockaddr *)&sa_storage, sizeof(sa_storage))); - tt_int_op(AF_INET6,==, sin6->sin6_family); - tt_int_op(9999,==, ntohs(sin6->sin6_port)); - tt_int_op(0x80000000,==, ntohl(S6_ADDR32(sin6->sin6_addr)[0])); + tt_int_op(AF_INET6,OP_EQ, sin6->sin6_family); + tt_int_op(9999,OP_EQ, ntohs(sin6->sin6_port)); + tt_int_op(0x80000000,OP_EQ, ntohl(S6_ADDR32(sin6->sin6_addr)[0])); /* ==== tor_addr_lookup: static cases. (Can't test dns without knowing we * have a good resolver. */ - tt_int_op(0,==, tor_addr_lookup("127.128.129.130", AF_UNSPEC, &t1)); - tt_int_op(AF_INET,==, tor_addr_family(&t1)); - tt_int_op(tor_addr_to_ipv4h(&t1),==, 0x7f808182); + tt_int_op(0,OP_EQ, tor_addr_lookup("127.128.129.130", AF_UNSPEC, &t1)); + tt_int_op(AF_INET,OP_EQ, tor_addr_family(&t1)); + tt_int_op(tor_addr_to_ipv4h(&t1),OP_EQ, 0x7f808182); - tt_int_op(0,==, tor_addr_lookup("9000::5", AF_UNSPEC, &t1)); - tt_int_op(AF_INET6,==, tor_addr_family(&t1)); - tt_int_op(0x90,==, tor_addr_to_in6_addr8(&t1)[0]); + tt_int_op(0,OP_EQ, tor_addr_lookup("9000::5", AF_UNSPEC, &t1)); + tt_int_op(AF_INET6,OP_EQ, tor_addr_family(&t1)); + tt_int_op(0x90,OP_EQ, tor_addr_to_in6_addr8(&t1)[0]); tt_assert(tor_mem_is_zero((char*)tor_addr_to_in6_addr8(&t1)+1, 14)); - tt_int_op(0x05,==, tor_addr_to_in6_addr8(&t1)[15]); + tt_int_op(0x05,OP_EQ, tor_addr_to_in6_addr8(&t1)[15]); /* === Test pton: valid af_inet6 */ /* Simple, valid parsing. */ r = tor_inet_pton(AF_INET6, "0102:0304:0506:0708:090A:0B0C:0D0E:0F10", &a1); - tt_int_op(r, ==, 1); - for (i=0;i<16;++i) { tt_int_op(i+1,==, (int)a1.s6_addr[i]); } + tt_int_op(r, OP_EQ, 1); + for (i=0;i<16;++i) { tt_int_op(i+1,OP_EQ, (int)a1.s6_addr[i]); } /* ipv4 ending. */ test_pton6_same("0102:0304:0506:0708:090A:0B0C:0D0E:0F10", "0102:0304:0506:0708:090A:0B0C:13.14.15.16"); @@ -314,7 +315,7 @@ test_addr_ip6_helpers(void *arg) "1000:1:0:7::"); /* Bad af param */ - tt_int_op(tor_inet_pton(AF_UNSPEC, 0, 0),==, -1); + tt_int_op(tor_inet_pton(AF_UNSPEC, 0, 0),OP_EQ, -1); /* === Test pton: invalid in6. */ test_pton6_bad("foobar."); @@ -410,11 +411,12 @@ test_addr_ip6_helpers(void *arg) test_external_ip("::ffff:169.255.0.0", 0); /* tor_addr_compare(tor_addr_t x2) */ - test_addr_compare("ffff::", ==, "ffff::0"); - test_addr_compare("0::3:2:1", <, "0::ffff:0.3.2.1"); - test_addr_compare("0::2:2:1", <, "0::ffff:0.3.2.1"); - test_addr_compare("0::ffff:0.3.2.1", >, "0::0:0:0"); - test_addr_compare("0::ffff:5.2.2.1", <, "::ffff:6.0.0.0"); /* XXXX wrong. */ + test_addr_compare("ffff::", OP_EQ, "ffff::0"); + test_addr_compare("0::3:2:1", OP_LT, "0::ffff:0.3.2.1"); + test_addr_compare("0::2:2:1", OP_LT, "0::ffff:0.3.2.1"); + test_addr_compare("0::ffff:0.3.2.1", OP_GT, "0::0:0:0"); + test_addr_compare("0::ffff:5.2.2.1", OP_LT, + "::ffff:6.0.0.0"); /* XXXX wrong. */ tor_addr_parse_mask_ports("[::ffff:2.3.4.5]", 0, &t1, NULL, NULL, NULL); tor_addr_parse_mask_ports("2.3.4.5", 0, &t2, NULL, NULL, NULL); tt_assert(tor_addr_compare(&t1, &t2, CMP_SEMANTIC) == 0); @@ -423,119 +425,120 @@ test_addr_ip6_helpers(void *arg) tt_assert(tor_addr_compare(&t1, &t2, CMP_SEMANTIC) < 0); /* test compare_masked */ - test_addr_compare_masked("ffff::", ==, "ffff::0", 128); - test_addr_compare_masked("ffff::", ==, "ffff::0", 64); - test_addr_compare_masked("0::2:2:1", <, "0::8000:2:1", 81); - test_addr_compare_masked("0::2:2:1", ==, "0::8000:2:1", 80); + test_addr_compare_masked("ffff::", OP_EQ, "ffff::0", 128); + test_addr_compare_masked("ffff::", OP_EQ, "ffff::0", 64); + test_addr_compare_masked("0::2:2:1", OP_LT, "0::8000:2:1", 81); + test_addr_compare_masked("0::2:2:1", OP_EQ, "0::8000:2:1", 80); /* Test undecorated tor_addr_to_str */ - tt_int_op(AF_INET6,==, tor_addr_parse(&t1, "[123:45:6789::5005:11]")); + tt_int_op(AF_INET6,OP_EQ, tor_addr_parse(&t1, "[123:45:6789::5005:11]")); p1 = tor_addr_to_str(buf, &t1, sizeof(buf), 0); - tt_str_op(p1,==, "123:45:6789::5005:11"); - tt_int_op(AF_INET,==, tor_addr_parse(&t1, "18.0.0.1")); + tt_str_op(p1,OP_EQ, "123:45:6789::5005:11"); + tt_int_op(AF_INET,OP_EQ, tor_addr_parse(&t1, "18.0.0.1")); p1 = tor_addr_to_str(buf, &t1, sizeof(buf), 0); - tt_str_op(p1,==, "18.0.0.1"); + tt_str_op(p1,OP_EQ, "18.0.0.1"); /* Test decorated tor_addr_to_str */ - tt_int_op(AF_INET6,==, tor_addr_parse(&t1, "[123:45:6789::5005:11]")); + tt_int_op(AF_INET6,OP_EQ, tor_addr_parse(&t1, "[123:45:6789::5005:11]")); p1 = tor_addr_to_str(buf, &t1, sizeof(buf), 1); - tt_str_op(p1,==, "[123:45:6789::5005:11]"); - tt_int_op(AF_INET,==, tor_addr_parse(&t1, "18.0.0.1")); + tt_str_op(p1,OP_EQ, "[123:45:6789::5005:11]"); + tt_int_op(AF_INET,OP_EQ, tor_addr_parse(&t1, "18.0.0.1")); p1 = tor_addr_to_str(buf, &t1, sizeof(buf), 1); - tt_str_op(p1,==, "18.0.0.1"); + tt_str_op(p1,OP_EQ, "18.0.0.1"); /* Test buffer bounds checking of tor_addr_to_str */ - tt_int_op(AF_INET6,==, tor_addr_parse(&t1, "::")); /* 2 + \0 */ - tt_ptr_op(tor_addr_to_str(buf, &t1, 2, 0),==, NULL); /* too short buf */ - tt_str_op(tor_addr_to_str(buf, &t1, 3, 0),==, "::"); - tt_ptr_op(tor_addr_to_str(buf, &t1, 4, 1),==, NULL); /* too short buf */ - tt_str_op(tor_addr_to_str(buf, &t1, 5, 1),==, "[::]"); - - tt_int_op(AF_INET6,==, tor_addr_parse(&t1, "2000::1337")); /* 10 + \0 */ - tt_ptr_op(tor_addr_to_str(buf, &t1, 10, 0),==, NULL); /* too short buf */ - tt_str_op(tor_addr_to_str(buf, &t1, 11, 0),==, "2000::1337"); - tt_ptr_op(tor_addr_to_str(buf, &t1, 12, 1),==, NULL); /* too short buf */ - tt_str_op(tor_addr_to_str(buf, &t1, 13, 1),==, "[2000::1337]"); - - tt_int_op(AF_INET,==, tor_addr_parse(&t1, "1.2.3.4")); /* 7 + \0 */ - tt_ptr_op(tor_addr_to_str(buf, &t1, 7, 0),==, NULL); /* too short buf */ - tt_str_op(tor_addr_to_str(buf, &t1, 8, 0),==, "1.2.3.4"); - - tt_int_op(AF_INET,==, tor_addr_parse(&t1, "255.255.255.255")); /* 15 + \0 */ - tt_ptr_op(tor_addr_to_str(buf, &t1, 15, 0),==, NULL); /* too short buf */ - tt_str_op(tor_addr_to_str(buf, &t1, 16, 0),==, "255.255.255.255"); - tt_ptr_op(tor_addr_to_str(buf, &t1, 15, 1),==, NULL); /* too short buf */ - tt_str_op(tor_addr_to_str(buf, &t1, 16, 1),==, "255.255.255.255"); + tt_int_op(AF_INET6,OP_EQ, tor_addr_parse(&t1, "::")); /* 2 + \0 */ + tt_ptr_op(tor_addr_to_str(buf, &t1, 2, 0),OP_EQ, NULL); /* too short buf */ + tt_str_op(tor_addr_to_str(buf, &t1, 3, 0),OP_EQ, "::"); + tt_ptr_op(tor_addr_to_str(buf, &t1, 4, 1),OP_EQ, NULL); /* too short buf */ + tt_str_op(tor_addr_to_str(buf, &t1, 5, 1),OP_EQ, "[::]"); + + tt_int_op(AF_INET6,OP_EQ, tor_addr_parse(&t1, "2000::1337")); /* 10 + \0 */ + tt_ptr_op(tor_addr_to_str(buf, &t1, 10, 0),OP_EQ, NULL); /* too short buf */ + tt_str_op(tor_addr_to_str(buf, &t1, 11, 0),OP_EQ, "2000::1337"); + tt_ptr_op(tor_addr_to_str(buf, &t1, 12, 1),OP_EQ, NULL); /* too short buf */ + tt_str_op(tor_addr_to_str(buf, &t1, 13, 1),OP_EQ, "[2000::1337]"); + + tt_int_op(AF_INET,OP_EQ, tor_addr_parse(&t1, "1.2.3.4")); /* 7 + \0 */ + tt_ptr_op(tor_addr_to_str(buf, &t1, 7, 0),OP_EQ, NULL); /* too short buf */ + tt_str_op(tor_addr_to_str(buf, &t1, 8, 0),OP_EQ, "1.2.3.4"); + + tt_int_op(AF_INET, OP_EQ, + tor_addr_parse(&t1, "255.255.255.255")); /* 15 + \0 */ + tt_ptr_op(tor_addr_to_str(buf, &t1, 15, 0),OP_EQ, NULL); /* too short buf */ + tt_str_op(tor_addr_to_str(buf, &t1, 16, 0),OP_EQ, "255.255.255.255"); + tt_ptr_op(tor_addr_to_str(buf, &t1, 15, 1),OP_EQ, NULL); /* too short buf */ + tt_str_op(tor_addr_to_str(buf, &t1, 16, 1),OP_EQ, "255.255.255.255"); t1.family = AF_UNSPEC; - tt_ptr_op(tor_addr_to_str(buf, &t1, sizeof(buf), 0),==, NULL); + tt_ptr_op(tor_addr_to_str(buf, &t1, sizeof(buf), 0),OP_EQ, NULL); /* Test tor_addr_parse_PTR_name */ i = tor_addr_parse_PTR_name(&t1, "Foobar.baz", AF_UNSPEC, 0); - tt_int_op(0,==, i); + tt_int_op(0,OP_EQ, i); i = tor_addr_parse_PTR_name(&t1, "Foobar.baz", AF_UNSPEC, 1); - tt_int_op(0,==, i); + tt_int_op(0,OP_EQ, i); i = tor_addr_parse_PTR_name(&t1, "9999999999999999999999999999.in-addr.arpa", AF_UNSPEC, 1); - tt_int_op(-1,==, i); + tt_int_op(-1,OP_EQ, i); i = tor_addr_parse_PTR_name(&t1, "1.0.168.192.in-addr.arpa", AF_UNSPEC, 1); - tt_int_op(1,==, i); - tt_int_op(tor_addr_family(&t1),==, AF_INET); + tt_int_op(1,OP_EQ, i); + tt_int_op(tor_addr_family(&t1),OP_EQ, AF_INET); p1 = tor_addr_to_str(buf, &t1, sizeof(buf), 1); - tt_str_op(p1,==, "192.168.0.1"); + tt_str_op(p1,OP_EQ, "192.168.0.1"); i = tor_addr_parse_PTR_name(&t1, "192.168.0.99", AF_UNSPEC, 0); - tt_int_op(0,==, i); + tt_int_op(0,OP_EQ, i); i = tor_addr_parse_PTR_name(&t1, "192.168.0.99", AF_UNSPEC, 1); - tt_int_op(1,==, i); + tt_int_op(1,OP_EQ, i); p1 = tor_addr_to_str(buf, &t1, sizeof(buf), 1); - tt_str_op(p1,==, "192.168.0.99"); + tt_str_op(p1,OP_EQ, "192.168.0.99"); memset(&t1, 0, sizeof(t1)); i = tor_addr_parse_PTR_name(&t1, "0.1.2.3.4.5.6.7.8.9.a.b.c.d.e.f." "f.e.e.b.1.e.b.e.e.f.f.e.e.e.d.9." "ip6.ARPA", AF_UNSPEC, 0); - tt_int_op(1,==, i); + tt_int_op(1,OP_EQ, i); p1 = tor_addr_to_str(buf, &t1, sizeof(buf), 1); - tt_str_op(p1,==, "[9dee:effe:ebe1:beef:fedc:ba98:7654:3210]"); + tt_str_op(p1,OP_EQ, "[9dee:effe:ebe1:beef:fedc:ba98:7654:3210]"); /* Failing cases. */ i = tor_addr_parse_PTR_name(&t1, "6.7.8.9.a.b.c.d.e.f." "f.e.e.b.1.e.b.e.e.f.f.e.e.e.d.9." "ip6.ARPA", AF_UNSPEC, 0); - tt_int_op(i,==, -1); + tt_int_op(i,OP_EQ, -1); i = tor_addr_parse_PTR_name(&t1, "6.7.8.9.a.b.c.d.e.f.a.b.c.d.e.f.0." "f.e.e.b.1.e.b.e.e.f.f.e.e.e.d.9." "ip6.ARPA", AF_UNSPEC, 0); - tt_int_op(i,==, -1); + tt_int_op(i,OP_EQ, -1); i = tor_addr_parse_PTR_name(&t1, "6.7.8.9.a.b.c.d.e.f.X.0.0.0.0.9." "f.e.e.b.1.e.b.e.e.f.f.e.e.e.d.9." "ip6.ARPA", AF_UNSPEC, 0); - tt_int_op(i,==, -1); + tt_int_op(i,OP_EQ, -1); i = tor_addr_parse_PTR_name(&t1, "32.1.1.in-addr.arpa", AF_UNSPEC, 0); - tt_int_op(i,==, -1); + tt_int_op(i,OP_EQ, -1); i = tor_addr_parse_PTR_name(&t1, ".in-addr.arpa", AF_UNSPEC, 0); - tt_int_op(i,==, -1); + tt_int_op(i,OP_EQ, -1); i = tor_addr_parse_PTR_name(&t1, "1.2.3.4.5.in-addr.arpa", AF_UNSPEC, 0); - tt_int_op(i,==, -1); + tt_int_op(i,OP_EQ, -1); i = tor_addr_parse_PTR_name(&t1, "1.2.3.4.5.in-addr.arpa", AF_INET6, 0); - tt_int_op(i,==, -1); + tt_int_op(i,OP_EQ, -1); i = tor_addr_parse_PTR_name(&t1, "6.7.8.9.a.b.c.d.e.f.a.b.c.d.e.0." "f.e.e.b.1.e.b.e.e.f.f.e.e.e.d.9." "ip6.ARPA", AF_INET, 0); - tt_int_op(i,==, -1); + tt_int_op(i,OP_EQ, -1); /* === Test tor_addr_to_PTR_name */ @@ -547,19 +550,19 @@ test_addr_ip6_helpers(void *arg) tor_addr_from_sockaddr(&t1, (struct sockaddr *)sin, NULL); /* Check IPv4 PTR - too short buffer */ - tt_int_op(tor_addr_to_PTR_name(rbuf, 1, &t1),==, -1); + tt_int_op(tor_addr_to_PTR_name(rbuf, 1, &t1),OP_EQ, -1); tt_int_op(tor_addr_to_PTR_name(rbuf, strlen("3.2.1.127.in-addr.arpa") - 1, - &t1),==, -1); + &t1),OP_EQ, -1); /* Check IPv4 PTR - valid addr */ - tt_int_op(tor_addr_to_PTR_name(rbuf, sizeof(rbuf), &t1),==, + tt_int_op(tor_addr_to_PTR_name(rbuf, sizeof(rbuf), &t1),OP_EQ, strlen("3.2.1.127.in-addr.arpa")); - tt_str_op(rbuf,==, "3.2.1.127.in-addr.arpa"); + tt_str_op(rbuf,OP_EQ, "3.2.1.127.in-addr.arpa"); /* Invalid addr family */ t1.family = AF_UNSPEC; - tt_int_op(tor_addr_to_PTR_name(rbuf, sizeof(rbuf), &t1),==, -1); + tt_int_op(tor_addr_to_PTR_name(rbuf, sizeof(rbuf), &t1),OP_EQ, -1); /* Stage IPv6 addr */ memset(&sa_storage, 0, sizeof(sa_storage)); @@ -576,82 +579,82 @@ test_addr_ip6_helpers(void *arg) "0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.ip6.arpa"; /* Check IPv6 PTR - too short buffer */ - tt_int_op(tor_addr_to_PTR_name(rbuf, 0, &t1),==, -1); - tt_int_op(tor_addr_to_PTR_name(rbuf, strlen(addr_PTR) - 1, &t1),==, -1); + tt_int_op(tor_addr_to_PTR_name(rbuf, 0, &t1),OP_EQ, -1); + tt_int_op(tor_addr_to_PTR_name(rbuf, strlen(addr_PTR) - 1, &t1),OP_EQ, -1); /* Check IPv6 PTR - valid addr */ - tt_int_op(tor_addr_to_PTR_name(rbuf, sizeof(rbuf), &t1),==, + tt_int_op(tor_addr_to_PTR_name(rbuf, sizeof(rbuf), &t1),OP_EQ, strlen(addr_PTR)); - tt_str_op(rbuf,==, addr_PTR); + tt_str_op(rbuf,OP_EQ, addr_PTR); } /* XXXX turn this into a separate function; it's not all IPv6. */ /* test tor_addr_parse_mask_ports */ test_addr_mask_ports_parse("[::f]/17:47-95", AF_INET6, 0, 0, 0, 0x0000000f, 17, 47, 95); - tt_str_op(p1,==, "::f"); + tt_str_op(p1,OP_EQ, "::f"); //test_addr_parse("[::fefe:4.1.1.7/120]:999-1000"); //test_addr_parse_check("::fefe:401:107", 120, 999, 1000); test_addr_mask_ports_parse("[::ffff:4.1.1.7]/120:443", AF_INET6, 0, 0, 0x0000ffff, 0x04010107, 120, 443, 443); - tt_str_op(p1,==, "::ffff:4.1.1.7"); + tt_str_op(p1,OP_EQ, "::ffff:4.1.1.7"); test_addr_mask_ports_parse("[abcd:2::44a:0]:2-65000", AF_INET6, 0xabcd0002, 0, 0, 0x044a0000, 128, 2, 65000); - tt_str_op(p1,==, "abcd:2::44a:0"); + tt_str_op(p1,OP_EQ, "abcd:2::44a:0"); /* Try some long addresses. */ r=tor_addr_parse_mask_ports("[ffff:1111:1111:1111:1111:1111:1111:1111]", 0, &t1, NULL, NULL, NULL); tt_assert(r == AF_INET6); r=tor_addr_parse_mask_ports("[ffff:1111:1111:1111:1111:1111:1111:11111]", 0, &t1, NULL, NULL, NULL); - tt_int_op(r, ==, -1); + tt_int_op(r, OP_EQ, -1); r=tor_addr_parse_mask_ports("[ffff:1111:1111:1111:1111:1111:1111:1111:1]", 0, &t1, NULL, NULL, NULL); - tt_int_op(r, ==, -1); + tt_int_op(r, OP_EQ, -1); r=tor_addr_parse_mask_ports( "[ffff:1111:1111:1111:1111:1111:1111:ffff:" "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:" "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:" "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff]", 0, &t1, NULL, NULL, NULL); - tt_int_op(r, ==, -1); + tt_int_op(r, OP_EQ, -1); /* Try some failing cases. */ r=tor_addr_parse_mask_ports("[fefef::]/112", 0, &t1, NULL, NULL, NULL); - tt_int_op(r, ==, -1); + tt_int_op(r, OP_EQ, -1); r=tor_addr_parse_mask_ports("[fefe::/112", 0, &t1, NULL, NULL, NULL); - tt_int_op(r, ==, -1); + tt_int_op(r, OP_EQ, -1); r=tor_addr_parse_mask_ports("[fefe::", 0, &t1, NULL, NULL, NULL); - tt_int_op(r, ==, -1); + tt_int_op(r, OP_EQ, -1); r=tor_addr_parse_mask_ports("[fefe::X]", 0, &t1, NULL, NULL, NULL); - tt_int_op(r, ==, -1); + tt_int_op(r, OP_EQ, -1); r=tor_addr_parse_mask_ports("efef::/112", 0, &t1, NULL, NULL, NULL); - tt_int_op(r, ==, -1); + tt_int_op(r, OP_EQ, -1); r=tor_addr_parse_mask_ports("[f:f:f:f:f:f:f:f::]",0,&t1, NULL, NULL, NULL); - tt_int_op(r, ==, -1); + tt_int_op(r, OP_EQ, -1); r=tor_addr_parse_mask_ports("[::f:f:f:f:f:f:f:f]",0,&t1, NULL, NULL, NULL); - tt_int_op(r, ==, -1); + tt_int_op(r, OP_EQ, -1); r=tor_addr_parse_mask_ports("[f:f:f:f:f:f:f:f:f]",0,&t1, NULL, NULL, NULL); - tt_int_op(r, ==, -1); + tt_int_op(r, OP_EQ, -1); r=tor_addr_parse_mask_ports("[f:f:f:f:f::]/fred",0,&t1,&mask, NULL, NULL); - tt_int_op(r, ==, -1); + tt_int_op(r, OP_EQ, -1); r=tor_addr_parse_mask_ports("[f:f:f:f:f::]/255.255.0.0", 0,&t1, NULL, NULL, NULL); - tt_int_op(r, ==, -1); + tt_int_op(r, OP_EQ, -1); /* This one will get rejected because it isn't a pure prefix. */ r=tor_addr_parse_mask_ports("1.1.2.3/255.255.64.0",0,&t1, &mask,NULL,NULL); - tt_int_op(r, ==, -1); + tt_int_op(r, OP_EQ, -1); /* Test for V4-mapped address with mask < 96. (arguably not valid) */ r=tor_addr_parse_mask_ports("[::ffff:1.1.2.2/33]",0,&t1, &mask, NULL, NULL); - tt_int_op(r, ==, -1); + tt_int_op(r, OP_EQ, -1); r=tor_addr_parse_mask_ports("1.1.2.2/33",0,&t1, &mask, NULL, NULL); - tt_int_op(r, ==, -1); + tt_int_op(r, OP_EQ, -1); /* Try extended wildcard addresses with out TAPMP_EXTENDED_STAR*/ r=tor_addr_parse_mask_ports("*4",0,&t1, &mask, NULL, NULL); - tt_int_op(r, ==, -1); + tt_int_op(r, OP_EQ, -1); r=tor_addr_parse_mask_ports("*6",0,&t1, &mask, NULL, NULL); - tt_int_op(r, ==, -1); -#if 0 + tt_int_op(r, OP_EQ, -1); + tt_assert(r == -1); /* Try a mask with a wildcard. */ r=tor_addr_parse_mask_ports("*/16",0,&t1, &mask, NULL, NULL); tt_assert(r == -1); @@ -661,61 +664,60 @@ test_addr_ip6_helpers(void *arg) r=tor_addr_parse_mask_ports("*6/30",TAPMP_EXTENDED_STAR, &t1, &mask, NULL, NULL); tt_assert(r == -1); -#endif /* Basic mask tests*/ r=tor_addr_parse_mask_ports("1.1.2.2/31",0,&t1, &mask, NULL, NULL); tt_assert(r == AF_INET); - tt_int_op(mask,==,31); - tt_int_op(tor_addr_family(&t1),==,AF_INET); - tt_int_op(tor_addr_to_ipv4h(&t1),==,0x01010202); + tt_int_op(mask,OP_EQ,31); + tt_int_op(tor_addr_family(&t1),OP_EQ,AF_INET); + tt_int_op(tor_addr_to_ipv4h(&t1),OP_EQ,0x01010202); r=tor_addr_parse_mask_ports("3.4.16.032:1-2",0,&t1, &mask, &port1, &port2); tt_assert(r == AF_INET); - tt_int_op(mask,==,32); - tt_int_op(tor_addr_family(&t1),==,AF_INET); - tt_int_op(tor_addr_to_ipv4h(&t1),==,0x03041020); + tt_int_op(mask,OP_EQ,32); + tt_int_op(tor_addr_family(&t1),OP_EQ,AF_INET); + tt_int_op(tor_addr_to_ipv4h(&t1),OP_EQ,0x03041020); tt_assert(port1 == 1); tt_assert(port2 == 2); r=tor_addr_parse_mask_ports("1.1.2.3/255.255.128.0",0,&t1, &mask,NULL,NULL); tt_assert(r == AF_INET); - tt_int_op(mask,==,17); - tt_int_op(tor_addr_family(&t1),==,AF_INET); - tt_int_op(tor_addr_to_ipv4h(&t1),==,0x01010203); + tt_int_op(mask,OP_EQ,17); + tt_int_op(tor_addr_family(&t1),OP_EQ,AF_INET); + tt_int_op(tor_addr_to_ipv4h(&t1),OP_EQ,0x01010203); r=tor_addr_parse_mask_ports("[efef::]/112",0,&t1, &mask, &port1, &port2); tt_assert(r == AF_INET6); tt_assert(port1 == 1); tt_assert(port2 == 65535); /* Try regular wildcard behavior without TAPMP_EXTENDED_STAR */ r=tor_addr_parse_mask_ports("*:80-443",0,&t1,&mask,&port1,&port2); - tt_int_op(r,==,AF_INET); /* Old users of this always get inet */ - tt_int_op(tor_addr_family(&t1),==,AF_INET); - tt_int_op(tor_addr_to_ipv4h(&t1),==,0); - tt_int_op(mask,==,0); - tt_int_op(port1,==,80); - tt_int_op(port2,==,443); + tt_int_op(r,OP_EQ,AF_INET); /* Old users of this always get inet */ + tt_int_op(tor_addr_family(&t1),OP_EQ,AF_INET); + tt_int_op(tor_addr_to_ipv4h(&t1),OP_EQ,0); + tt_int_op(mask,OP_EQ,0); + tt_int_op(port1,OP_EQ,80); + tt_int_op(port2,OP_EQ,443); /* Now try wildcards *with* TAPMP_EXTENDED_STAR */ r=tor_addr_parse_mask_ports("*:8000-9000",TAPMP_EXTENDED_STAR, &t1,&mask,&port1,&port2); - tt_int_op(r,==,AF_UNSPEC); - tt_int_op(tor_addr_family(&t1),==,AF_UNSPEC); - tt_int_op(mask,==,0); - tt_int_op(port1,==,8000); - tt_int_op(port2,==,9000); + tt_int_op(r,OP_EQ,AF_UNSPEC); + tt_int_op(tor_addr_family(&t1),OP_EQ,AF_UNSPEC); + tt_int_op(mask,OP_EQ,0); + tt_int_op(port1,OP_EQ,8000); + tt_int_op(port2,OP_EQ,9000); r=tor_addr_parse_mask_ports("*4:6667",TAPMP_EXTENDED_STAR, &t1,&mask,&port1,&port2); - tt_int_op(r,==,AF_INET); - tt_int_op(tor_addr_family(&t1),==,AF_INET); - tt_int_op(tor_addr_to_ipv4h(&t1),==,0); - tt_int_op(mask,==,0); - tt_int_op(port1,==,6667); - tt_int_op(port2,==,6667); + tt_int_op(r,OP_EQ,AF_INET); + tt_int_op(tor_addr_family(&t1),OP_EQ,AF_INET); + tt_int_op(tor_addr_to_ipv4h(&t1),OP_EQ,0); + tt_int_op(mask,OP_EQ,0); + tt_int_op(port1,OP_EQ,6667); + tt_int_op(port2,OP_EQ,6667); r=tor_addr_parse_mask_ports("*6",TAPMP_EXTENDED_STAR, &t1,&mask,&port1,&port2); - tt_int_op(r,==,AF_INET6); - tt_int_op(tor_addr_family(&t1),==,AF_INET6); + tt_int_op(r,OP_EQ,AF_INET6); + tt_int_op(tor_addr_family(&t1),OP_EQ,AF_INET6); tt_assert(tor_mem_is_zero((const char*)tor_addr_to_in6_addr32(&t1), 16)); - tt_int_op(mask,==,0); - tt_int_op(port1,==,1); - tt_int_op(port2,==,65535); + tt_int_op(mask,OP_EQ,0); + tt_int_op(port1,OP_EQ,1); + tt_int_op(port2,OP_EQ,65535); /* make sure inet address lengths >= max */ tt_assert(INET_NTOA_BUF_LEN >= sizeof("255.255.255.255")); @@ -751,87 +753,87 @@ test_addr_parse(void *arg) r= tor_addr_port_parse(LOG_DEBUG, "192.0.2.1:1234", &addr, &port, -1); - tt_int_op(r, ==, 0); + tt_int_op(r, OP_EQ, 0); tor_addr_to_str(buf, &addr, sizeof(buf), 0); - tt_str_op(buf,==, "192.0.2.1"); - tt_int_op(port,==, 1234); + tt_str_op(buf,OP_EQ, "192.0.2.1"); + tt_int_op(port,OP_EQ, 1234); r= tor_addr_port_parse(LOG_DEBUG, "[::1]:1234", &addr, &port, -1); - tt_int_op(r, ==, 0); + tt_int_op(r, OP_EQ, 0); tor_addr_to_str(buf, &addr, sizeof(buf), 0); - tt_str_op(buf,==, "::1"); - tt_int_op(port,==, 1234); + tt_str_op(buf,OP_EQ, "::1"); + tt_int_op(port,OP_EQ, 1234); /* Domain name. */ r= tor_addr_port_parse(LOG_DEBUG, "torproject.org:1234", &addr, &port, -1); - tt_int_op(r, ==, -1); + tt_int_op(r, OP_EQ, -1); /* Only IP. */ r= tor_addr_port_parse(LOG_DEBUG, "192.0.2.2", &addr, &port, -1); - tt_int_op(r, ==, -1); + tt_int_op(r, OP_EQ, -1); r= tor_addr_port_parse(LOG_DEBUG, "192.0.2.2", &addr, &port, 200); - tt_int_op(r, ==, 0); - tt_int_op(port,==,200); + tt_int_op(r, OP_EQ, 0); + tt_int_op(port,OP_EQ,200); r= tor_addr_port_parse(LOG_DEBUG, "[::1]", &addr, &port, -1); - tt_int_op(r, ==, -1); + tt_int_op(r, OP_EQ, -1); r= tor_addr_port_parse(LOG_DEBUG, "[::1]", &addr, &port, 400); - tt_int_op(r, ==, 0); - tt_int_op(port,==,400); + tt_int_op(r, OP_EQ, 0); + tt_int_op(port,OP_EQ,400); /* Bad port. */ r= tor_addr_port_parse(LOG_DEBUG, "192.0.2.2:66666", &addr, &port, -1); - tt_int_op(r, ==, -1); + tt_int_op(r, OP_EQ, -1); r= tor_addr_port_parse(LOG_DEBUG, "192.0.2.2:66666", &addr, &port, 200); - tt_int_op(r, ==, -1); + tt_int_op(r, OP_EQ, -1); /* Only domain name */ r= tor_addr_port_parse(LOG_DEBUG, "torproject.org", &addr, &port, -1); - tt_int_op(r, ==, -1); + tt_int_op(r, OP_EQ, -1); r= tor_addr_port_parse(LOG_DEBUG, "torproject.org", &addr, &port, 200); - tt_int_op(r, ==, -1); + tt_int_op(r, OP_EQ, -1); /* Bad IP address */ r= tor_addr_port_parse(LOG_DEBUG, "192.0.2:1234", &addr, &port, -1); - tt_int_op(r, ==, -1); + tt_int_op(r, OP_EQ, -1); /* Make sure that the default port has lower priority than the real one */ r= tor_addr_port_parse(LOG_DEBUG, "192.0.2.2:1337", &addr, &port, 200); - tt_int_op(r, ==, 0); - tt_int_op(port,==,1337); + tt_int_op(r, OP_EQ, 0); + tt_int_op(port,OP_EQ,1337); r= tor_addr_port_parse(LOG_DEBUG, "[::1]:1369", &addr, &port, 200); - tt_int_op(r, ==, 0); - tt_int_op(port,==,1369); + tt_int_op(r, OP_EQ, 0); + tt_int_op(port,OP_EQ,1369); done: ; @@ -886,7 +888,7 @@ test_virtaddrmap(void *data) get_random_virtual_addr(&cfg[ipv6], &a); //printf("%s\n", fmt_addr(&a)); /* Make sure that the first b bits match the configured network */ - tt_int_op(0, ==, tor_addr_compare_masked(&a, &cfg[ipv6].addr, + tt_int_op(0, OP_EQ, tor_addr_compare_masked(&a, &cfg[ipv6].addr, bits, CMP_EXACT)); /* And track which bits have been different between pairs of @@ -930,7 +932,7 @@ test_addr_dup_ip(void *arg) (void)arg; #define CHECK(ip, s) do { \ v = tor_dup_ip(ip); \ - tt_str_op(v,==,(s)); \ + tt_str_op(v,OP_EQ,(s)); \ tor_free(v); \ } while (0) @@ -956,7 +958,7 @@ test_addr_sockaddr_to_str(void *arg) #endif #define CHECK(sa, s) do { \ v = tor_sockaddr_to_str((const struct sockaddr*) &(sa)); \ - tt_str_op(v,==,(s)); \ + tt_str_op(v,OP_EQ,(s)); \ tor_free(v); \ } while (0) (void)arg; @@ -1013,12 +1015,13 @@ test_addr_is_loopback(void *data) (void)data; for (i=0; loopback_items[i].name; ++i) { - tt_int_op(tor_addr_parse(&addr, loopback_items[i].name), >=, 0); - tt_int_op(tor_addr_is_loopback(&addr), ==, loopback_items[i].is_loopback); + tt_int_op(tor_addr_parse(&addr, loopback_items[i].name), OP_GE, 0); + tt_int_op(tor_addr_is_loopback(&addr), OP_EQ, + loopback_items[i].is_loopback); } tor_addr_make_unspec(&addr); - tt_int_op(tor_addr_is_loopback(&addr), ==, 0); + tt_int_op(tor_addr_is_loopback(&addr), OP_EQ, 0); done: ; @@ -1033,18 +1036,18 @@ test_addr_make_null(void *data) (void) data; /* Ensure that before tor_addr_make_null, addr != 0's */ memset(addr, 1, sizeof(*addr)); - tt_int_op(memcmp(addr, zeros, sizeof(*addr)), !=, 0); + tt_int_op(memcmp(addr, zeros, sizeof(*addr)), OP_NE, 0); /* Test with AF == AF_INET */ zeros->family = AF_INET; tor_addr_make_null(addr, AF_INET); - tt_int_op(memcmp(addr, zeros, sizeof(*addr)), ==, 0); - tt_str_op(tor_addr_to_str(buf, addr, sizeof(buf), 0), ==, "0.0.0.0"); + tt_int_op(memcmp(addr, zeros, sizeof(*addr)), OP_EQ, 0); + tt_str_op(tor_addr_to_str(buf, addr, sizeof(buf), 0), OP_EQ, "0.0.0.0"); /* Test with AF == AF_INET6 */ memset(addr, 1, sizeof(*addr)); zeros->family = AF_INET6; tor_addr_make_null(addr, AF_INET6); - tt_int_op(memcmp(addr, zeros, sizeof(*addr)), ==, 0); - tt_str_op(tor_addr_to_str(buf, addr, sizeof(buf), 0), ==, "::"); + tt_int_op(memcmp(addr, zeros, sizeof(*addr)), OP_EQ, 0); + tt_str_op(tor_addr_to_str(buf, addr, sizeof(buf), 0), OP_EQ, "::"); done: tor_free(addr); tor_free(zeros); diff --git a/src/test/test_address.c b/src/test/test_address.c new file mode 100644 index 0000000000..f98cc12b62 --- /dev/null +++ b/src/test/test_address.c @@ -0,0 +1,470 @@ +/* Copyright (c) 2014-2015, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#define ADDRESS_PRIVATE + +#ifdef _WIN32 +#include <winsock2.h> +/* For access to structs needed by GetAdaptersAddresses */ +#undef _WIN32_WINNT +#define _WIN32_WINNT 0x0501 +#include <iphlpapi.h> +#endif + +#ifdef HAVE_IFADDRS_TO_SMARTLIST +#include <net/if.h> +#include <ifaddrs.h> +#endif + +#ifdef HAVE_IFCONF_TO_SMARTLIST +#ifdef HAVE_SYS_IOCTL_H +#include <sys/ioctl.h> +#endif +#include <net/if.h> +#endif + +#include "or.h" +#include "address.h" +#include "test.h" + +/** Return 1 iff <b>sockaddr1</b> and <b>sockaddr2</b> represent + * the same IP address and port combination. Otherwise, return 0. + */ +static uint8_t +sockaddr_in_are_equal(struct sockaddr_in *sockaddr1, + struct sockaddr_in *sockaddr2) +{ + return ((sockaddr1->sin_family == sockaddr2->sin_family) && + (sockaddr1->sin_port == sockaddr2->sin_port) && + (sockaddr1->sin_addr.s_addr == sockaddr2->sin_addr.s_addr)); +} + +/** Return 1 iff <b>sockaddr1</b> and <b>sockaddr2</b> represent + * the same IP address and port combination. Otherwise, return 0. + */ +static uint8_t +sockaddr_in6_are_equal(struct sockaddr_in6 *sockaddr1, + struct sockaddr_in6 *sockaddr2) +{ + return ((sockaddr1->sin6_family == sockaddr2->sin6_family) && + (sockaddr1->sin6_port == sockaddr2->sin6_port) && + (tor_memeq(sockaddr1->sin6_addr.s6_addr, + sockaddr2->sin6_addr.s6_addr,16))); +} + +/** Create a sockaddr_in structure from IP address string <b>ip_str</b>. + * + * If <b>out</b> is not NULL, write the result + * to the memory address in <b>out</b>. Otherwise, allocate the memory + * for result. On success, return pointer to result. Otherwise, return + * NULL. + */ +static struct sockaddr_in * +sockaddr_in_from_string(const char *ip_str, struct sockaddr_in *out) +{ + // [FIXME: add some error checking?] + if (!out) + out = tor_malloc_zero(sizeof(struct sockaddr_in)); + + out->sin_family = AF_INET; + out->sin_port = 0; + tor_inet_pton(AF_INET,ip_str,&(out->sin_addr)); + + return out; +} + +/** Return 1 iff <b>smartlist</b> contains a tor_addr_t structure + * that points to 127.0.0.1. Otherwise, return 0. + */ +static int +smartlist_contains_localhost_tor_addr(smartlist_t *smartlist) +{ + int found_localhost = 0; + + struct sockaddr_in *sockaddr_localhost; + struct sockaddr_storage *sockaddr_to_check; + + sockaddr_localhost = sockaddr_in_from_string("127.0.0.1",NULL); + + sockaddr_to_check = tor_malloc(sizeof(struct sockaddr_in)); + + SMARTLIST_FOREACH_BEGIN(smartlist, tor_addr_t *, tor_addr) { + tor_addr_to_sockaddr(tor_addr,0,(struct sockaddr *)sockaddr_to_check, + sizeof(struct sockaddr_in)); + + if (sockaddr_in_are_equal((struct sockaddr_in *)sockaddr_to_check, + sockaddr_localhost)) { + found_localhost = 1; + break; + } + } SMARTLIST_FOREACH_END(tor_addr); + + tor_free(sockaddr_localhost); + tor_free(sockaddr_to_check); + + return found_localhost; +} + +#ifdef HAVE_IFADDRS_TO_SMARTLIST +static void +test_address_ifaddrs_to_smartlist(void *arg) +{ + struct ifaddrs *ifa = NULL; + struct ifaddrs *ifa_ipv4 = NULL; + struct ifaddrs *ifa_ipv6 = NULL; + struct sockaddr_in *ipv4_sockaddr_local = NULL; + struct sockaddr_in *netmask_slash8 = NULL; + struct sockaddr_in *ipv4_sockaddr_remote = NULL; + struct sockaddr_in6 *ipv6_sockaddr = NULL; + smartlist_t *smartlist = NULL; + tor_addr_t *tor_addr = NULL; + struct sockaddr *sockaddr_to_check = NULL; + socklen_t addr_len; + + (void)arg; + + netmask_slash8 = sockaddr_in_from_string("255.0.0.0",NULL); + ipv4_sockaddr_local = sockaddr_in_from_string("127.0.0.1",NULL); + ipv4_sockaddr_remote = sockaddr_in_from_string("128.52.160.20",NULL); + + ipv6_sockaddr = tor_malloc(sizeof(struct sockaddr_in6)); + ipv6_sockaddr->sin6_family = AF_INET6; + ipv6_sockaddr->sin6_port = 0; + inet_pton(AF_INET6, "2001:db8:8714:3a90::12", + &(ipv6_sockaddr->sin6_addr)); + + ifa = tor_malloc(sizeof(struct ifaddrs)); + ifa_ipv4 = tor_malloc(sizeof(struct ifaddrs)); + ifa_ipv6 = tor_malloc(sizeof(struct ifaddrs)); + + ifa->ifa_next = ifa_ipv4; + ifa->ifa_name = tor_strdup("eth0"); + ifa->ifa_flags = IFF_UP | IFF_RUNNING; + ifa->ifa_addr = (struct sockaddr *)ipv4_sockaddr_local; + ifa->ifa_netmask = (struct sockaddr *)netmask_slash8; + ifa->ifa_dstaddr = NULL; + ifa->ifa_data = NULL; + + ifa_ipv4->ifa_next = ifa_ipv6; + ifa_ipv4->ifa_name = tor_strdup("eth1"); + ifa_ipv4->ifa_flags = IFF_UP | IFF_RUNNING; + ifa_ipv4->ifa_addr = (struct sockaddr *)ipv4_sockaddr_remote; + ifa_ipv4->ifa_netmask = (struct sockaddr *)netmask_slash8; + ifa_ipv4->ifa_dstaddr = NULL; + ifa_ipv4->ifa_data = NULL; + + ifa_ipv6->ifa_next = NULL; + ifa_ipv6->ifa_name = tor_strdup("eth2"); + ifa_ipv6->ifa_flags = IFF_UP | IFF_RUNNING; + ifa_ipv6->ifa_addr = (struct sockaddr *)ipv6_sockaddr; + ifa_ipv6->ifa_netmask = NULL; + ifa_ipv6->ifa_dstaddr = NULL; + ifa_ipv6->ifa_data = NULL; + + smartlist = ifaddrs_to_smartlist(ifa); + + tt_assert(smartlist); + tt_assert(smartlist_len(smartlist) == 3); + + sockaddr_to_check = tor_malloc(sizeof(struct sockaddr_in6)); + + tor_addr = smartlist_get(smartlist,0); + addr_len = + tor_addr_to_sockaddr(tor_addr,0,sockaddr_to_check, + sizeof(struct sockaddr_in)); + + tt_int_op(addr_len,==,sizeof(struct sockaddr_in)); + tt_assert(sockaddr_in_are_equal((struct sockaddr_in *)sockaddr_to_check, + ipv4_sockaddr_local)); + + tor_addr = smartlist_get(smartlist,1); + addr_len = + tor_addr_to_sockaddr(tor_addr,0,sockaddr_to_check, + sizeof(struct sockaddr_in)); + + tt_int_op(addr_len,==,sizeof(struct sockaddr_in)); + tt_assert(sockaddr_in_are_equal((struct sockaddr_in *)sockaddr_to_check, + ipv4_sockaddr_remote)); + + tor_addr = smartlist_get(smartlist,2); + addr_len = + tor_addr_to_sockaddr(tor_addr,0,sockaddr_to_check, + sizeof(struct sockaddr_in6)); + + tt_int_op(addr_len,==,sizeof(struct sockaddr_in6)); + tt_assert(sockaddr_in6_are_equal((struct sockaddr_in6*)sockaddr_to_check, + ipv6_sockaddr)); + + done: + tor_free(netmask_slash8); + tor_free(ipv4_sockaddr_local); + tor_free(ipv4_sockaddr_remote); + tor_free(ipv6_sockaddr); + tor_free(ifa->ifa_name); + tor_free(ifa_ipv4->ifa_name); + tor_free(ifa_ipv6->ifa_name); + tor_free(ifa); + tor_free(ifa_ipv4); + tor_free(ifa_ipv6); + tor_free(sockaddr_to_check); + SMARTLIST_FOREACH(smartlist, tor_addr_t *, t, tor_free(t)); + smartlist_free(smartlist); + + return; +} + +static void +test_address_get_if_addrs_ifaddrs(void *arg) +{ + + smartlist_t *results = NULL; + + (void)arg; + + results = get_interface_addresses_ifaddrs(0); + + tt_int_op(smartlist_len(results),>=,1); + tt_assert(smartlist_contains_localhost_tor_addr(results)); + + done: + SMARTLIST_FOREACH(results, tor_addr_t *, t, tor_free(t)); + smartlist_free(results); + return; +} + +#endif + +#ifdef HAVE_IP_ADAPTER_TO_SMARTLIST + +static void +test_address_get_if_addrs_win32(void *arg) +{ + + smartlist_t *results = NULL; + + (void)arg; + + results = get_interface_addresses_win32(0); + + tt_int_op(smartlist_len(results),>=,1); + tt_assert(smartlist_contains_localhost_tor_addr(results)); + + done: + SMARTLIST_FOREACH(results, tor_addr_t *, t, tor_free(t)); + tor_free(results); + return; +} + +static void +test_address_ip_adapter_addresses_to_smartlist(void *arg) +{ + + IP_ADAPTER_ADDRESSES *addrs1; + IP_ADAPTER_ADDRESSES *addrs2; + + IP_ADAPTER_UNICAST_ADDRESS *unicast11; + IP_ADAPTER_UNICAST_ADDRESS *unicast12; + IP_ADAPTER_UNICAST_ADDRESS *unicast21; + + smartlist_t *result = NULL; + + struct sockaddr_in *sockaddr_test1; + struct sockaddr_in *sockaddr_test2; + struct sockaddr_in *sockaddr_localhost; + struct sockaddr_in *sockaddr_to_check; + + tor_addr_t *tor_addr; + + (void)arg; + (void)sockaddr_in6_are_equal; + + sockaddr_to_check = tor_malloc_zero(sizeof(struct sockaddr_in)); + + addrs1 = + tor_malloc_zero(sizeof(IP_ADAPTER_ADDRESSES)); + + addrs1->FirstUnicastAddress = + unicast11 = tor_malloc_zero(sizeof(IP_ADAPTER_UNICAST_ADDRESS)); + sockaddr_test1 = sockaddr_in_from_string("86.59.30.40",NULL); + unicast11->Address.lpSockaddr = (LPSOCKADDR)sockaddr_test1; + + unicast11->Next = unicast12 = + tor_malloc_zero(sizeof(IP_ADAPTER_UNICAST_ADDRESS)); + sockaddr_test2 = sockaddr_in_from_string("93.95.227.222", NULL); + unicast12->Address.lpSockaddr = (LPSOCKADDR)sockaddr_test2; + + addrs1->Next = addrs2 = + tor_malloc_zero(sizeof(IP_ADAPTER_ADDRESSES)); + + addrs2->FirstUnicastAddress = + unicast21 = tor_malloc_zero(sizeof(IP_ADAPTER_UNICAST_ADDRESS)); + sockaddr_localhost = sockaddr_in_from_string("127.0.0.1", NULL); + unicast21->Address.lpSockaddr = (LPSOCKADDR)sockaddr_localhost; + + result = ip_adapter_addresses_to_smartlist(addrs1); + + tt_assert(result); + tt_assert(smartlist_len(result) == 3); + + tor_addr = smartlist_get(result,0); + + tor_addr_to_sockaddr(tor_addr,0,(struct sockaddr *)sockaddr_to_check, + sizeof(struct sockaddr_in)); + + tt_assert(sockaddr_in_are_equal(sockaddr_test1,sockaddr_to_check)); + + tor_addr = smartlist_get(result,1); + + tor_addr_to_sockaddr(tor_addr,0,(struct sockaddr *)sockaddr_to_check, + sizeof(struct sockaddr_in)); + + tt_assert(sockaddr_in_are_equal(sockaddr_test2,sockaddr_to_check)); + + tor_addr = smartlist_get(result,2); + + tor_addr_to_sockaddr(tor_addr,0,(struct sockaddr *)sockaddr_to_check, + sizeof(struct sockaddr_in)); + + tt_assert(sockaddr_in_are_equal(sockaddr_localhost,sockaddr_to_check)); + + done: + SMARTLIST_FOREACH(result, tor_addr_t *, t, tor_free(t)); + smartlist_free(result); + tor_free(addrs1); + tor_free(addrs2); + tor_free(unicast11->Address.lpSockaddr); + tor_free(unicast11); + tor_free(unicast12->Address.lpSockaddr); + tor_free(unicast12); + tor_free(unicast21->Address.lpSockaddr); + tor_free(unicast21); + tor_free(sockaddr_to_check); + return; +} +#endif + +#ifdef HAVE_IFCONF_TO_SMARTLIST + +static void +test_address_ifreq_to_smartlist(void *arg) +{ + smartlist_t *results = NULL; + const tor_addr_t *tor_addr = NULL; + struct sockaddr_in *sockaddr = NULL; + struct sockaddr_in *sockaddr_eth1 = NULL; + struct sockaddr_in *sockaddr_to_check = NULL; + + struct ifconf *ifc; + struct ifreq *ifr; + struct ifreq *ifr_next; + + socklen_t addr_len; + + (void)arg; + + sockaddr_to_check = tor_malloc(sizeof(struct sockaddr_in)); + + ifr = tor_malloc(sizeof(struct ifreq)); + memset(ifr,0,sizeof(struct ifreq)); + strlcpy(ifr->ifr_name,"lo",3); + sockaddr = (struct sockaddr_in *) &(ifr->ifr_ifru.ifru_addr); + sockaddr_in_from_string("127.0.0.1",sockaddr); + + ifc = tor_malloc(sizeof(struct ifconf)); + memset(ifc,0,sizeof(struct ifconf)); + ifc->ifc_len = sizeof(struct ifreq); + ifc->ifc_ifcu.ifcu_req = ifr; + + results = ifreq_to_smartlist((struct ifreq *)ifc->ifc_buf,ifc->ifc_len); + tt_int_op(smartlist_len(results),==,1); + + tor_addr = smartlist_get(results, 0); + addr_len = + tor_addr_to_sockaddr(tor_addr,0,(struct sockaddr *)sockaddr_to_check, + sizeof(struct sockaddr_in)); + + tt_int_op(addr_len,==,sizeof(struct sockaddr_in)); + tt_assert(sockaddr_in_are_equal(sockaddr,sockaddr_to_check)); + + ifr = tor_realloc(ifr,2*sizeof(struct ifreq)); + ifr_next = ifr+1; + strlcpy(ifr_next->ifr_name,"eth1",5); + ifc->ifc_len = 2*sizeof(struct ifreq); + ifc->ifc_ifcu.ifcu_req = ifr; + sockaddr = (struct sockaddr_in *) &(ifr->ifr_ifru.ifru_addr); + + sockaddr_eth1 = (struct sockaddr_in *) &(ifr_next->ifr_ifru.ifru_addr); + sockaddr_in_from_string("192.168.10.55",sockaddr_eth1); + SMARTLIST_FOREACH(results, tor_addr_t *, t, tor_free(t)); + smartlist_free(results); + + results = ifreq_to_smartlist((struct ifreq *)ifc->ifc_buf,ifc->ifc_len); + tt_int_op(smartlist_len(results),==,2); + + tor_addr = smartlist_get(results, 0); + addr_len = + tor_addr_to_sockaddr(tor_addr,0,(struct sockaddr *)sockaddr_to_check, + sizeof(struct sockaddr_in)); + + tt_int_op(addr_len,==,sizeof(struct sockaddr_in)); + tt_assert(sockaddr_in_are_equal(sockaddr,sockaddr_to_check)); + + tor_addr = smartlist_get(results, 1); + addr_len = + tor_addr_to_sockaddr(tor_addr,0,(struct sockaddr *)sockaddr_to_check, + sizeof(struct sockaddr_in)); + + tt_int_op(addr_len,==,sizeof(struct sockaddr_in)); + tt_assert(sockaddr_in_are_equal(sockaddr_eth1,sockaddr_to_check)); + + done: + tor_free(sockaddr_to_check); + SMARTLIST_FOREACH(results, tor_addr_t *, t, tor_free(t)); + smartlist_free(results); + tor_free(ifc); + tor_free(ifr); + return; +} + +static void +test_address_get_if_addrs_ioctl(void *arg) +{ + + smartlist_t *result = NULL; + + (void)arg; + + result = get_interface_addresses_ioctl(LOG_ERR); + + tt_assert(result); + tt_int_op(smartlist_len(result),>=,1); + + tt_assert(smartlist_contains_localhost_tor_addr(result)); + + done: + SMARTLIST_FOREACH(result, tor_addr_t *, t, tor_free(t)); + smartlist_free(result); + return; +} + +#endif + +#define ADDRESS_TEST(name, flags) \ + { #name, test_address_ ## name, flags, NULL, NULL } + +struct testcase_t address_tests[] = { +#ifdef HAVE_IFADDRS_TO_SMARTLIST + ADDRESS_TEST(get_if_addrs_ifaddrs, TT_FORK), + ADDRESS_TEST(ifaddrs_to_smartlist, 0), +#endif +#ifdef HAVE_IP_ADAPTER_TO_SMARTLIST + ADDRESS_TEST(get_if_addrs_win32, TT_FORK), + ADDRESS_TEST(ip_adapter_addresses_to_smartlist, 0), +#endif +#ifdef HAVE_IFCONF_TO_SMARTLIST + ADDRESS_TEST(get_if_addrs_ioctl, TT_FORK), + ADDRESS_TEST(ifreq_to_smartlist, 0), +#endif + END_OF_TESTCASES +}; + diff --git a/src/test/test_bt_cl.c b/src/test/test_bt_cl.c index c0c334656d..0fa0cd5c0a 100644 --- a/src/test/test_bt_cl.c +++ b/src/test/test_bt_cl.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2014, The Tor Project, Inc. */ +/* Copyright (c) 2012-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" diff --git a/src/test/test_buffers.c b/src/test/test_buffers.c index cea719077c..101f448472 100644 --- a/src/test/test_buffers.c +++ b/src/test/test_buffers.c @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define BUFFERS_PRIVATE @@ -30,7 +30,7 @@ test_buffers_basic(void *arg) TT_DIE(("Assertion failed.")); //test_eq(buf_capacity(buf), 4096); - tt_int_op(buf_datalen(buf),==, 0); + tt_int_op(buf_datalen(buf),OP_EQ, 0); /**** * General pointer frobbing @@ -40,16 +40,16 @@ test_buffers_basic(void *arg) } write_to_buf(str, 256, buf); write_to_buf(str, 256, buf); - tt_int_op(buf_datalen(buf),==, 512); + tt_int_op(buf_datalen(buf),OP_EQ, 512); fetch_from_buf(str2, 200, buf); - tt_mem_op(str,==, str2, 200); - tt_int_op(buf_datalen(buf),==, 312); + tt_mem_op(str,OP_EQ, str2, 200); + tt_int_op(buf_datalen(buf),OP_EQ, 312); memset(str2, 0, sizeof(str2)); fetch_from_buf(str2, 256, buf); - tt_mem_op(str+200,==, str2, 56); - tt_mem_op(str,==, str2+56, 200); - tt_int_op(buf_datalen(buf),==, 56); + tt_mem_op(str+200,OP_EQ, str2, 56); + tt_mem_op(str,OP_EQ, str2+56, 200); + tt_int_op(buf_datalen(buf),OP_EQ, 56); memset(str2, 0, sizeof(str2)); /* Okay, now we should be 512 bytes into the 4096-byte buffer. If we add * another 3584 bytes, we hit the end. */ @@ -57,16 +57,16 @@ test_buffers_basic(void *arg) write_to_buf(str, 256, buf); } assert_buf_ok(buf); - tt_int_op(buf_datalen(buf),==, 3896); + tt_int_op(buf_datalen(buf),OP_EQ, 3896); fetch_from_buf(str2, 56, buf); - tt_int_op(buf_datalen(buf),==, 3840); - tt_mem_op(str+200,==, str2, 56); + tt_int_op(buf_datalen(buf),OP_EQ, 3840); + tt_mem_op(str+200,OP_EQ, str2, 56); for (j=0;j<15;++j) { memset(str2, 0, sizeof(str2)); fetch_from_buf(str2, 256, buf); - tt_mem_op(str,==, str2, 256); + tt_mem_op(str,OP_EQ, str2, 256); } - tt_int_op(buf_datalen(buf),==, 0); + tt_int_op(buf_datalen(buf),OP_EQ, 0); buf_free(buf); buf = NULL; @@ -76,7 +76,7 @@ test_buffers_basic(void *arg) write_to_buf(str+1, 255, buf); //test_eq(buf_capacity(buf), 256); fetch_from_buf(str2, 254, buf); - tt_mem_op(str+1,==, str2, 254); + tt_mem_op(str+1,OP_EQ, str2, 254); //test_eq(buf_capacity(buf), 256); assert_buf_ok(buf); write_to_buf(str, 32, buf); @@ -85,15 +85,15 @@ test_buffers_basic(void *arg) write_to_buf(str, 256, buf); assert_buf_ok(buf); //test_eq(buf_capacity(buf), 512); - tt_int_op(buf_datalen(buf),==, 33+256); + tt_int_op(buf_datalen(buf),OP_EQ, 33+256); fetch_from_buf(str2, 33, buf); - tt_int_op(*str2,==, str[255]); + tt_int_op(*str2,OP_EQ, str[255]); - tt_mem_op(str2+1,==, str, 32); + tt_mem_op(str2+1,OP_EQ, str, 32); //test_eq(buf_capacity(buf), 512); - tt_int_op(buf_datalen(buf),==, 256); + tt_int_op(buf_datalen(buf),OP_EQ, 256); fetch_from_buf(str2, 256, buf); - tt_mem_op(str,==, str2, 256); + tt_mem_op(str,OP_EQ, str2, 256); /* now try shrinking: case 1. */ buf_free(buf); @@ -102,10 +102,10 @@ test_buffers_basic(void *arg) write_to_buf(str,255, buf); } //test_eq(buf_capacity(buf), 33668); - tt_int_op(buf_datalen(buf),==, 17085); + tt_int_op(buf_datalen(buf),OP_EQ, 17085); for (j=0; j < 40; ++j) { fetch_from_buf(str2, 255,buf); - tt_mem_op(str2,==, str, 255); + tt_mem_op(str2,OP_EQ, str, 255); } /* now try shrinking: case 2. */ @@ -116,7 +116,7 @@ test_buffers_basic(void *arg) } for (j=0; j < 20; ++j) { fetch_from_buf(str2, 255,buf); - tt_mem_op(str2,==, str, 255); + tt_mem_op(str2,OP_EQ, str, 255); } for (j=0;j<80;++j) { write_to_buf(str,255, buf); @@ -124,7 +124,7 @@ test_buffers_basic(void *arg) //test_eq(buf_capacity(buf),33668); for (j=0; j < 120; ++j) { fetch_from_buf(str2, 255,buf); - tt_mem_op(str2,==, str, 255); + tt_mem_op(str2,OP_EQ, str, 255); } /* Move from buf to buf. */ @@ -133,27 +133,27 @@ test_buffers_basic(void *arg) buf2 = buf_new_with_capacity(4096); for (j=0;j<100;++j) write_to_buf(str, 255, buf); - tt_int_op(buf_datalen(buf),==, 25500); + tt_int_op(buf_datalen(buf),OP_EQ, 25500); for (j=0;j<100;++j) { r = 10; move_buf_to_buf(buf2, buf, &r); - tt_int_op(r,==, 0); + tt_int_op(r,OP_EQ, 0); } - tt_int_op(buf_datalen(buf),==, 24500); - tt_int_op(buf_datalen(buf2),==, 1000); + tt_int_op(buf_datalen(buf),OP_EQ, 24500); + tt_int_op(buf_datalen(buf2),OP_EQ, 1000); for (j=0;j<3;++j) { fetch_from_buf(str2, 255, buf2); - tt_mem_op(str2,==, str, 255); + tt_mem_op(str2,OP_EQ, str, 255); } r = 8192; /*big move*/ move_buf_to_buf(buf2, buf, &r); - tt_int_op(r,==, 0); + tt_int_op(r,OP_EQ, 0); r = 30000; /* incomplete move */ move_buf_to_buf(buf2, buf, &r); - tt_int_op(r,==, 13692); + tt_int_op(r,OP_EQ, 13692); for (j=0;j<97;++j) { fetch_from_buf(str2, 255, buf2); - tt_mem_op(str2,==, str, 255); + tt_mem_op(str2,OP_EQ, str, 255); } buf_free(buf); buf_free(buf2); @@ -163,16 +163,16 @@ test_buffers_basic(void *arg) cp = "Testing. This is a moderately long Testing string."; for (j = 0; cp[j]; j++) write_to_buf(cp+j, 1, buf); - tt_int_op(0,==, buf_find_string_offset(buf, "Testing", 7)); - tt_int_op(1,==, buf_find_string_offset(buf, "esting", 6)); - tt_int_op(1,==, buf_find_string_offset(buf, "est", 3)); - tt_int_op(39,==, buf_find_string_offset(buf, "ing str", 7)); - tt_int_op(35,==, buf_find_string_offset(buf, "Testing str", 11)); - tt_int_op(32,==, buf_find_string_offset(buf, "ng ", 3)); - tt_int_op(43,==, buf_find_string_offset(buf, "string.", 7)); - tt_int_op(-1,==, buf_find_string_offset(buf, "shrdlu", 6)); - tt_int_op(-1,==, buf_find_string_offset(buf, "Testing thing", 13)); - tt_int_op(-1,==, buf_find_string_offset(buf, "ngx", 3)); + tt_int_op(0,OP_EQ, buf_find_string_offset(buf, "Testing", 7)); + tt_int_op(1,OP_EQ, buf_find_string_offset(buf, "esting", 6)); + tt_int_op(1,OP_EQ, buf_find_string_offset(buf, "est", 3)); + tt_int_op(39,OP_EQ, buf_find_string_offset(buf, "ing str", 7)); + tt_int_op(35,OP_EQ, buf_find_string_offset(buf, "Testing str", 11)); + tt_int_op(32,OP_EQ, buf_find_string_offset(buf, "ng ", 3)); + tt_int_op(43,OP_EQ, buf_find_string_offset(buf, "string.", 7)); + tt_int_op(-1,OP_EQ, buf_find_string_offset(buf, "shrdlu", 6)); + tt_int_op(-1,OP_EQ, buf_find_string_offset(buf, "Testing thing", 13)); + tt_int_op(-1,OP_EQ, buf_find_string_offset(buf, "ngx", 3)); buf_free(buf); buf = NULL; @@ -183,7 +183,7 @@ test_buffers_basic(void *arg) write_to_buf(cp, 65536, buf); tor_free(cp); - tt_int_op(buf_datalen(buf), ==, 65536); + tt_int_op(buf_datalen(buf), OP_EQ, 65536); buf_free(buf); buf = NULL; } @@ -213,19 +213,19 @@ test_buffer_pullup(void *arg) buf = buf_new_with_capacity(3000); /* rounds up to next power of 2. */ tt_assert(buf); - tt_int_op(buf_get_default_chunk_size(buf), ==, 4096); + tt_int_op(buf_get_default_chunk_size(buf), OP_EQ, 4096); - tt_int_op(buf_get_total_allocation(), ==, 0); + tt_int_op(buf_get_total_allocation(), OP_EQ, 0); /* There are a bunch of cases for pullup. One is the trivial case. Let's mess around with an empty buffer. */ buf_pullup(buf, 16, 1); buf_get_first_chunk_data(buf, &cp, &sz); - tt_ptr_op(cp, ==, NULL); - tt_uint_op(sz, ==, 0); + tt_ptr_op(cp, OP_EQ, NULL); + tt_uint_op(sz, OP_EQ, 0); /* Let's make sure nothing got allocated */ - tt_int_op(buf_get_total_allocation(), ==, 0); + tt_int_op(buf_get_total_allocation(), OP_EQ, 0); /* Case 1: everything puts into the first chunk with some moving. */ @@ -234,22 +234,22 @@ test_buffer_pullup(void *arg) write_to_buf(stuff, 3000, buf); write_to_buf(stuff+3000, 3000, buf); buf_get_first_chunk_data(buf, &cp, &sz); - tt_ptr_op(cp, !=, NULL); - tt_int_op(sz, <=, 4096); + tt_ptr_op(cp, OP_NE, NULL); + tt_int_op(sz, OP_LE, 4096); /* Make room for 3000 bytes in the first chunk, so that the pullup-move code * can get tested. */ - tt_int_op(fetch_from_buf(tmp, 3000, buf), ==, 3000); - tt_mem_op(tmp,==, stuff, 3000); + tt_int_op(fetch_from_buf(tmp, 3000, buf), OP_EQ, 3000); + tt_mem_op(tmp,OP_EQ, stuff, 3000); buf_pullup(buf, 2048, 0); assert_buf_ok(buf); buf_get_first_chunk_data(buf, &cp, &sz); - tt_ptr_op(cp, !=, NULL); - tt_int_op(sz, >=, 2048); - tt_mem_op(cp,==, stuff+3000, 2048); - tt_int_op(3000, ==, buf_datalen(buf)); - tt_int_op(fetch_from_buf(tmp, 3000, buf), ==, 0); - tt_mem_op(tmp,==, stuff+3000, 2048); + tt_ptr_op(cp, OP_NE, NULL); + tt_int_op(sz, OP_GE, 2048); + tt_mem_op(cp,OP_EQ, stuff+3000, 2048); + tt_int_op(3000, OP_EQ, buf_datalen(buf)); + tt_int_op(fetch_from_buf(tmp, 3000, buf), OP_EQ, 0); + tt_mem_op(tmp,OP_EQ, stuff+3000, 2048); buf_free(buf); @@ -259,26 +259,26 @@ test_buffer_pullup(void *arg) write_to_buf(stuff+4000, 4000, buf); write_to_buf(stuff+8000, 4000, buf); write_to_buf(stuff+12000, 4000, buf); - tt_int_op(buf_datalen(buf), ==, 16000); + tt_int_op(buf_datalen(buf), OP_EQ, 16000); buf_get_first_chunk_data(buf, &cp, &sz); - tt_ptr_op(cp, !=, NULL); - tt_int_op(sz, <=, 4096); + tt_ptr_op(cp, OP_NE, NULL); + tt_int_op(sz, OP_LE, 4096); buf_pullup(buf, 12500, 0); assert_buf_ok(buf); buf_get_first_chunk_data(buf, &cp, &sz); - tt_ptr_op(cp, !=, NULL); - tt_int_op(sz, >=, 12500); - tt_mem_op(cp,==, stuff, 12500); - tt_int_op(buf_datalen(buf), ==, 16000); + tt_ptr_op(cp, OP_NE, NULL); + tt_int_op(sz, OP_GE, 12500); + tt_mem_op(cp,OP_EQ, stuff, 12500); + tt_int_op(buf_datalen(buf), OP_EQ, 16000); fetch_from_buf(tmp, 12400, buf); - tt_mem_op(tmp,==, stuff, 12400); - tt_int_op(buf_datalen(buf), ==, 3600); + tt_mem_op(tmp,OP_EQ, stuff, 12400); + tt_int_op(buf_datalen(buf), OP_EQ, 3600); fetch_from_buf(tmp, 3500, buf); - tt_mem_op(tmp,==, stuff+12400, 3500); + tt_mem_op(tmp,OP_EQ, stuff+12400, 3500); fetch_from_buf(tmp, 100, buf); - tt_mem_op(tmp,==, stuff+15900, 10); + tt_mem_op(tmp,OP_EQ, stuff+15900, 10); buf_free(buf); @@ -290,16 +290,16 @@ test_buffer_pullup(void *arg) buf_pullup(buf, 16000, 0); /* Way too much. */ assert_buf_ok(buf); buf_get_first_chunk_data(buf, &cp, &sz); - tt_ptr_op(cp, !=, NULL); - tt_int_op(sz, ==, 7900); - tt_mem_op(cp,==, stuff+100, 7900); + tt_ptr_op(cp, OP_NE, NULL); + tt_int_op(sz, OP_EQ, 7900); + tt_mem_op(cp,OP_EQ, stuff+100, 7900); buf_free(buf); buf = NULL; buf_shrink_freelists(1); - tt_int_op(buf_get_total_allocation(), ==, 0); + tt_int_op(buf_get_total_allocation(), OP_EQ, 0); done: buf_free(buf); buf_shrink_freelists(1); @@ -321,31 +321,31 @@ test_buffer_copy(void *arg) tt_assert(buf); /* Copy an empty buffer. */ - tt_int_op(0, ==, generic_buffer_set_to_copy(&buf2, buf)); + tt_int_op(0, OP_EQ, generic_buffer_set_to_copy(&buf2, buf)); tt_assert(buf2); - tt_int_op(0, ==, generic_buffer_len(buf2)); + tt_int_op(0, OP_EQ, generic_buffer_len(buf2)); /* Now try with a short buffer. */ s = "And now comes an act of enormous enormance!"; len = strlen(s); generic_buffer_add(buf, s, len); - tt_int_op(len, ==, generic_buffer_len(buf)); + tt_int_op(len, OP_EQ, generic_buffer_len(buf)); /* Add junk to buf2 so we can test replacing.*/ generic_buffer_add(buf2, "BLARG", 5); - tt_int_op(0, ==, generic_buffer_set_to_copy(&buf2, buf)); - tt_int_op(len, ==, generic_buffer_len(buf2)); + tt_int_op(0, OP_EQ, generic_buffer_set_to_copy(&buf2, buf)); + tt_int_op(len, OP_EQ, generic_buffer_len(buf2)); generic_buffer_get(buf2, b, len); - tt_mem_op(b, ==, s, len); + tt_mem_op(b, OP_EQ, s, len); /* Now free buf2 and retry so we can test allocating */ generic_buffer_free(buf2); buf2 = NULL; - tt_int_op(0, ==, generic_buffer_set_to_copy(&buf2, buf)); - tt_int_op(len, ==, generic_buffer_len(buf2)); + tt_int_op(0, OP_EQ, generic_buffer_set_to_copy(&buf2, buf)); + tt_int_op(len, OP_EQ, generic_buffer_len(buf2)); generic_buffer_get(buf2, b, len); - tt_mem_op(b, ==, s, len); + tt_mem_op(b, OP_EQ, s, len); /* Clear buf for next test */ generic_buffer_get(buf, b, len); - tt_int_op(generic_buffer_len(buf),==,0); + tt_int_op(generic_buffer_len(buf),OP_EQ,0); /* Okay, now let's try a bigger buffer. */ s = "Quis autem vel eum iure reprehenderit qui in ea voluptate velit " @@ -357,12 +357,12 @@ test_buffer_copy(void *arg) generic_buffer_add(buf, b, 1); generic_buffer_add(buf, s, len); } - tt_int_op(0, ==, generic_buffer_set_to_copy(&buf2, buf)); - tt_int_op(generic_buffer_len(buf2), ==, generic_buffer_len(buf)); + tt_int_op(0, OP_EQ, generic_buffer_set_to_copy(&buf2, buf)); + tt_int_op(generic_buffer_len(buf2), OP_EQ, generic_buffer_len(buf)); for (i = 0; i < 256; ++i) { generic_buffer_get(buf2, b, len+1); - tt_int_op((unsigned char)b[0],==,i); - tt_mem_op(b+1, ==, s, len); + tt_int_op((unsigned char)b[0],OP_EQ,i); + tt_mem_op(b+1, OP_EQ, s, len); } done: @@ -382,62 +382,62 @@ test_buffer_ext_or_cmd(void *arg) (void) arg; /* Empty -- should give "not there. */ - tt_int_op(0, ==, generic_buffer_fetch_ext_or_cmd(buf, &cmd)); - tt_ptr_op(NULL, ==, cmd); + tt_int_op(0, OP_EQ, generic_buffer_fetch_ext_or_cmd(buf, &cmd)); + tt_ptr_op(NULL, OP_EQ, cmd); /* Three bytes: shouldn't work. */ generic_buffer_add(buf, "\x00\x20\x00", 3); - tt_int_op(0, ==, generic_buffer_fetch_ext_or_cmd(buf, &cmd)); - tt_ptr_op(NULL, ==, cmd); - tt_int_op(3, ==, generic_buffer_len(buf)); + tt_int_op(0, OP_EQ, generic_buffer_fetch_ext_or_cmd(buf, &cmd)); + tt_ptr_op(NULL, OP_EQ, cmd); + tt_int_op(3, OP_EQ, generic_buffer_len(buf)); /* 0020 0000: That's a nil command. It should work. */ generic_buffer_add(buf, "\x00", 1); - tt_int_op(1, ==, generic_buffer_fetch_ext_or_cmd(buf, &cmd)); - tt_ptr_op(NULL, !=, cmd); - tt_int_op(0x20, ==, cmd->cmd); - tt_int_op(0, ==, cmd->len); - tt_int_op(0, ==, generic_buffer_len(buf)); + tt_int_op(1, OP_EQ, generic_buffer_fetch_ext_or_cmd(buf, &cmd)); + tt_ptr_op(NULL, OP_NE, cmd); + tt_int_op(0x20, OP_EQ, cmd->cmd); + tt_int_op(0, OP_EQ, cmd->len); + tt_int_op(0, OP_EQ, generic_buffer_len(buf)); ext_or_cmd_free(cmd); cmd = NULL; /* Now try a length-6 command with one byte missing. */ generic_buffer_add(buf, "\x10\x21\x00\x06""abcde", 9); - tt_int_op(0, ==, generic_buffer_fetch_ext_or_cmd(buf, &cmd)); - tt_ptr_op(NULL, ==, cmd); + tt_int_op(0, OP_EQ, generic_buffer_fetch_ext_or_cmd(buf, &cmd)); + tt_ptr_op(NULL, OP_EQ, cmd); generic_buffer_add(buf, "f", 1); - tt_int_op(1, ==, generic_buffer_fetch_ext_or_cmd(buf, &cmd)); - tt_ptr_op(NULL, !=, cmd); - tt_int_op(0x1021, ==, cmd->cmd); - tt_int_op(6, ==, cmd->len); - tt_mem_op("abcdef", ==, cmd->body, 6); - tt_int_op(0, ==, generic_buffer_len(buf)); + tt_int_op(1, OP_EQ, generic_buffer_fetch_ext_or_cmd(buf, &cmd)); + tt_ptr_op(NULL, OP_NE, cmd); + tt_int_op(0x1021, OP_EQ, cmd->cmd); + tt_int_op(6, OP_EQ, cmd->len); + tt_mem_op("abcdef", OP_EQ, cmd->body, 6); + tt_int_op(0, OP_EQ, generic_buffer_len(buf)); ext_or_cmd_free(cmd); cmd = NULL; /* Now try a length-10 command with 4 extra bytes. */ generic_buffer_add(buf, "\xff\xff\x00\x0a" "loremipsum\x10\x00\xff\xff", 18); - tt_int_op(1, ==, generic_buffer_fetch_ext_or_cmd(buf, &cmd)); - tt_ptr_op(NULL, !=, cmd); - tt_int_op(0xffff, ==, cmd->cmd); - tt_int_op(10, ==, cmd->len); - tt_mem_op("loremipsum", ==, cmd->body, 10); - tt_int_op(4, ==, generic_buffer_len(buf)); + tt_int_op(1, OP_EQ, generic_buffer_fetch_ext_or_cmd(buf, &cmd)); + tt_ptr_op(NULL, OP_NE, cmd); + tt_int_op(0xffff, OP_EQ, cmd->cmd); + tt_int_op(10, OP_EQ, cmd->len); + tt_mem_op("loremipsum", OP_EQ, cmd->body, 10); + tt_int_op(4, OP_EQ, generic_buffer_len(buf)); ext_or_cmd_free(cmd); cmd = NULL; /* Finally, let's try a maximum-length command. We already have the header * waiting. */ - tt_int_op(0, ==, generic_buffer_fetch_ext_or_cmd(buf, &cmd)); + tt_int_op(0, OP_EQ, generic_buffer_fetch_ext_or_cmd(buf, &cmd)); tmp = tor_malloc_zero(65535); generic_buffer_add(buf, tmp, 65535); - tt_int_op(1, ==, generic_buffer_fetch_ext_or_cmd(buf, &cmd)); - tt_ptr_op(NULL, !=, cmd); - tt_int_op(0x1000, ==, cmd->cmd); - tt_int_op(0xffff, ==, cmd->len); - tt_mem_op(tmp, ==, cmd->body, 65535); - tt_int_op(0, ==, generic_buffer_len(buf)); + tt_int_op(1, OP_EQ, generic_buffer_fetch_ext_or_cmd(buf, &cmd)); + tt_ptr_op(NULL, OP_NE, cmd); + tt_int_op(0x1000, OP_EQ, cmd->cmd); + tt_int_op(0xffff, OP_EQ, cmd->len); + tt_mem_op(tmp, OP_EQ, cmd->body, 65535); + tt_int_op(0, OP_EQ, generic_buffer_len(buf)); ext_or_cmd_free(cmd); cmd = NULL; @@ -458,65 +458,66 @@ test_buffer_allocation_tracking(void *arg) (void)arg; crypto_rand(junk, 16384); - tt_int_op(buf_get_total_allocation(), ==, 0); + tt_int_op(buf_get_total_allocation(), OP_EQ, 0); buf1 = buf_new(); tt_assert(buf1); buf2 = buf_new(); tt_assert(buf2); - tt_int_op(buf_allocation(buf1), ==, 0); - tt_int_op(buf_get_total_allocation(), ==, 0); + tt_int_op(buf_allocation(buf1), OP_EQ, 0); + tt_int_op(buf_get_total_allocation(), OP_EQ, 0); write_to_buf(junk, 4000, buf1); write_to_buf(junk, 4000, buf1); write_to_buf(junk, 4000, buf1); write_to_buf(junk, 4000, buf1); - tt_int_op(buf_allocation(buf1), ==, 16384); + tt_int_op(buf_allocation(buf1), OP_EQ, 16384); fetch_from_buf(junk, 100, buf1); - tt_int_op(buf_allocation(buf1), ==, 16384); /* still 4 4k chunks */ + tt_int_op(buf_allocation(buf1), OP_EQ, 16384); /* still 4 4k chunks */ - tt_int_op(buf_get_total_allocation(), ==, 16384); + tt_int_op(buf_get_total_allocation(), OP_EQ, 16384); fetch_from_buf(junk, 4096, buf1); /* drop a 1k chunk... */ - tt_int_op(buf_allocation(buf1), ==, 3*4096); /* now 3 4k chunks */ + tt_int_op(buf_allocation(buf1), OP_EQ, 3*4096); /* now 3 4k chunks */ #ifdef ENABLE_BUF_FREELISTS - tt_int_op(buf_get_total_allocation(), ==, 16384); /* that chunk went onto + tt_int_op(buf_get_total_allocation(), OP_EQ, 16384); /* that chunk went onto the freelist. */ #else - tt_int_op(buf_get_total_allocation(), ==, 12288); /* that chunk was really + tt_int_op(buf_get_total_allocation(), OP_EQ, 12288); /* that chunk was really freed. */ #endif write_to_buf(junk, 4000, buf2); - tt_int_op(buf_allocation(buf2), ==, 4096); /* another 4k chunk. */ + tt_int_op(buf_allocation(buf2), OP_EQ, 4096); /* another 4k chunk. */ /* * If we're using freelists, size stays at 16384 because we just pulled a * chunk from the freelist. If we aren't, we bounce back up to 16384 by * allocating a new chunk. */ - tt_int_op(buf_get_total_allocation(), ==, 16384); + tt_int_op(buf_get_total_allocation(), OP_EQ, 16384); write_to_buf(junk, 4000, buf2); - tt_int_op(buf_allocation(buf2), ==, 8192); /* another 4k chunk. */ - tt_int_op(buf_get_total_allocation(), ==, 5*4096); /* that chunk was new. */ + tt_int_op(buf_allocation(buf2), OP_EQ, 8192); /* another 4k chunk. */ + tt_int_op(buf_get_total_allocation(), + OP_EQ, 5*4096); /* that chunk was new. */ /* Make a really huge buffer */ for (i = 0; i < 1000; ++i) { write_to_buf(junk, 4000, buf2); } - tt_int_op(buf_allocation(buf2), >=, 4008000); - tt_int_op(buf_get_total_allocation(), >=, 4008000); + tt_int_op(buf_allocation(buf2), OP_GE, 4008000); + tt_int_op(buf_get_total_allocation(), OP_GE, 4008000); buf_free(buf2); buf2 = NULL; - tt_int_op(buf_get_total_allocation(), <, 4008000); + tt_int_op(buf_get_total_allocation(), OP_LT, 4008000); buf_shrink_freelists(1); - tt_int_op(buf_get_total_allocation(), ==, buf_allocation(buf1)); + tt_int_op(buf_get_total_allocation(), OP_EQ, buf_allocation(buf1)); buf_free(buf1); buf1 = NULL; buf_shrink_freelists(1); - tt_int_op(buf_get_total_allocation(), ==, 0); + tt_int_op(buf_get_total_allocation(), OP_EQ, 0); done: buf_free(buf1); @@ -545,37 +546,38 @@ test_buffer_time_tracking(void *arg) tt_assert(buf); /* Empty buffer means the timestamp is 0. */ - tt_int_op(0, ==, buf_get_oldest_chunk_timestamp(buf, START_MSEC)); - tt_int_op(0, ==, buf_get_oldest_chunk_timestamp(buf, START_MSEC+1000)); + tt_int_op(0, OP_EQ, buf_get_oldest_chunk_timestamp(buf, START_MSEC)); + tt_int_op(0, OP_EQ, buf_get_oldest_chunk_timestamp(buf, START_MSEC+1000)); tor_gettimeofday_cache_set(&tv0); write_to_buf("ABCDEFG", 7, buf); - tt_int_op(1000, ==, buf_get_oldest_chunk_timestamp(buf, START_MSEC+1000)); + tt_int_op(1000, OP_EQ, buf_get_oldest_chunk_timestamp(buf, START_MSEC+1000)); buf2 = buf_copy(buf); tt_assert(buf2); - tt_int_op(1234, ==, buf_get_oldest_chunk_timestamp(buf2, START_MSEC+1234)); + tt_int_op(1234, OP_EQ, + buf_get_oldest_chunk_timestamp(buf2, START_MSEC+1234)); /* Now add more bytes; enough to overflow the first chunk. */ tv0.tv_usec += 123 * 1000; tor_gettimeofday_cache_set(&tv0); for (i = 0; i < 600; ++i) write_to_buf("ABCDEFG", 7, buf); - tt_int_op(4207, ==, buf_datalen(buf)); + tt_int_op(4207, OP_EQ, buf_datalen(buf)); /* The oldest bytes are still in the front. */ - tt_int_op(2000, ==, buf_get_oldest_chunk_timestamp(buf, START_MSEC+2000)); + tt_int_op(2000, OP_EQ, buf_get_oldest_chunk_timestamp(buf, START_MSEC+2000)); /* Once those bytes are dropped, the chunk is still on the first * timestamp. */ fetch_from_buf(tmp, 100, buf); - tt_int_op(2000, ==, buf_get_oldest_chunk_timestamp(buf, START_MSEC+2000)); + tt_int_op(2000, OP_EQ, buf_get_oldest_chunk_timestamp(buf, START_MSEC+2000)); /* But once we discard the whole first chunk, we get the data in the second * chunk. */ fetch_from_buf(tmp, 4000, buf); - tt_int_op(107, ==, buf_datalen(buf)); - tt_int_op(2000, ==, buf_get_oldest_chunk_timestamp(buf, START_MSEC+2123)); + tt_int_op(107, OP_EQ, buf_datalen(buf)); + tt_int_op(2000, OP_EQ, buf_get_oldest_chunk_timestamp(buf, START_MSEC+2123)); /* This time we'll be grabbing a chunk from the freelist, and making sure its time gets updated */ @@ -584,13 +586,13 @@ test_buffer_time_tracking(void *arg) tor_gettimeofday_cache_set(&tv0); for (i = 0; i < 600; ++i) write_to_buf("ABCDEFG", 7, buf); - tt_int_op(4307, ==, buf_datalen(buf)); + tt_int_op(4307, OP_EQ, buf_datalen(buf)); - tt_int_op(2000, ==, buf_get_oldest_chunk_timestamp(buf, START_MSEC+2123)); + tt_int_op(2000, OP_EQ, buf_get_oldest_chunk_timestamp(buf, START_MSEC+2123)); fetch_from_buf(tmp, 4000, buf); fetch_from_buf(tmp, 306, buf); - tt_int_op(0, ==, buf_get_oldest_chunk_timestamp(buf, START_MSEC+5617)); - tt_int_op(383, ==, buf_get_oldest_chunk_timestamp(buf, START_MSEC+6000)); + tt_int_op(0, OP_EQ, buf_get_oldest_chunk_timestamp(buf, START_MSEC+5617)); + tt_int_op(383, OP_EQ, buf_get_oldest_chunk_timestamp(buf, START_MSEC+6000)); done: buf_free(buf); @@ -609,35 +611,35 @@ test_buffers_zlib_impl(int finalize_with_nil) int done; buf = buf_new_with_capacity(128); /* will round up */ - zlib_state = tor_zlib_new(1, ZLIB_METHOD); + zlib_state = tor_zlib_new(1, ZLIB_METHOD, HIGH_COMPRESSION); msg = tor_malloc(512); crypto_rand(msg, 512); - tt_int_op(write_to_buf_zlib(buf, zlib_state, msg, 128, 0), ==, 0); - tt_int_op(write_to_buf_zlib(buf, zlib_state, msg+128, 128, 0), ==, 0); - tt_int_op(write_to_buf_zlib(buf, zlib_state, msg+256, 256, 0), ==, 0); + tt_int_op(write_to_buf_zlib(buf, zlib_state, msg, 128, 0), OP_EQ, 0); + tt_int_op(write_to_buf_zlib(buf, zlib_state, msg+128, 128, 0), OP_EQ, 0); + tt_int_op(write_to_buf_zlib(buf, zlib_state, msg+256, 256, 0), OP_EQ, 0); done = !finalize_with_nil; - tt_int_op(write_to_buf_zlib(buf, zlib_state, "all done", 9, done), ==, 0); + tt_int_op(write_to_buf_zlib(buf, zlib_state, "all done", 9, done), OP_EQ, 0); if (finalize_with_nil) { - tt_int_op(write_to_buf_zlib(buf, zlib_state, "", 0, 1), ==, 0); + tt_int_op(write_to_buf_zlib(buf, zlib_state, "", 0, 1), OP_EQ, 0); } in_len = buf_datalen(buf); contents = tor_malloc(in_len); - tt_int_op(fetch_from_buf(contents, in_len, buf), ==, 0); + tt_int_op(fetch_from_buf(contents, in_len, buf), OP_EQ, 0); - tt_int_op(0, ==, tor_gzip_uncompress(&expanded, &out_len, + tt_int_op(0, OP_EQ, tor_gzip_uncompress(&expanded, &out_len, contents, in_len, ZLIB_METHOD, 1, LOG_WARN)); - tt_int_op(out_len, >=, 128); - tt_mem_op(msg, ==, expanded, 128); - tt_int_op(out_len, >=, 512); - tt_mem_op(msg, ==, expanded, 512); - tt_int_op(out_len, ==, 512+9); - tt_mem_op("all done", ==, expanded+512, 9); + tt_int_op(out_len, OP_GE, 128); + tt_mem_op(msg, OP_EQ, expanded, 128); + tt_int_op(out_len, OP_GE, 512); + tt_mem_op(msg, OP_EQ, expanded, 512); + tt_int_op(out_len, OP_EQ, 512+9); + tt_mem_op("all done", OP_EQ, expanded+512, 9); done: buf_free(buf); @@ -680,28 +682,28 @@ test_buffers_zlib_fin_at_chunk_end(void *arg) tt_assert(buf->head); /* Fill up the chunk so the zlib stuff won't fit in one chunk. */ - tt_uint_op(buf->head->memlen, <, sz); + tt_uint_op(buf->head->memlen, OP_LT, sz); headerjunk = buf->head->memlen - 7; write_to_buf(msg, headerjunk-1, buf); - tt_uint_op(buf->head->datalen, ==, headerjunk); - tt_uint_op(buf_datalen(buf), ==, headerjunk); + tt_uint_op(buf->head->datalen, OP_EQ, headerjunk); + tt_uint_op(buf_datalen(buf), OP_EQ, headerjunk); /* Write an empty string, with finalization on. */ - zlib_state = tor_zlib_new(1, ZLIB_METHOD); - tt_int_op(write_to_buf_zlib(buf, zlib_state, "", 0, 1), ==, 0); + zlib_state = tor_zlib_new(1, ZLIB_METHOD, HIGH_COMPRESSION); + tt_int_op(write_to_buf_zlib(buf, zlib_state, "", 0, 1), OP_EQ, 0); in_len = buf_datalen(buf); contents = tor_malloc(in_len); - tt_int_op(fetch_from_buf(contents, in_len, buf), ==, 0); + tt_int_op(fetch_from_buf(contents, in_len, buf), OP_EQ, 0); - tt_uint_op(in_len, >, headerjunk); + tt_uint_op(in_len, OP_GT, headerjunk); - tt_int_op(0, ==, tor_gzip_uncompress(&expanded, &out_len, + tt_int_op(0, OP_EQ, tor_gzip_uncompress(&expanded, &out_len, contents + headerjunk, in_len - headerjunk, ZLIB_METHOD, 1, LOG_WARN)); - tt_int_op(out_len, ==, 0); + tt_int_op(out_len, OP_EQ, 0); tt_assert(expanded); done: diff --git a/src/test/test_cell_formats.c b/src/test/test_cell_formats.c index 19ecedc8ac..e86dc0934f 100644 --- a/src/test/test_cell_formats.c +++ b/src/test/test_cell_formats.c @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" @@ -30,16 +30,16 @@ test_cfmt_relay_header(void *arg) uint8_t hdr_out[RELAY_HEADER_SIZE]; (void)arg; - tt_int_op(sizeof(hdr_1), ==, RELAY_HEADER_SIZE); + tt_int_op(sizeof(hdr_1), OP_EQ, RELAY_HEADER_SIZE); relay_header_unpack(&rh, hdr_1); - tt_int_op(rh.command, ==, 3); - tt_int_op(rh.recognized, ==, 0); - tt_int_op(rh.stream_id, ==, 0x2122); - tt_mem_op(rh.integrity, ==, "ABCD", 4); - tt_int_op(rh.length, ==, 0x103); + tt_int_op(rh.command, OP_EQ, 3); + tt_int_op(rh.recognized, OP_EQ, 0); + tt_int_op(rh.stream_id, OP_EQ, 0x2122); + tt_mem_op(rh.integrity, OP_EQ, "ABCD", 4); + tt_int_op(rh.length, OP_EQ, 0x103); relay_header_pack(hdr_out, &rh); - tt_mem_op(hdr_out, ==, hdr_1, RELAY_HEADER_SIZE); + tt_mem_op(hdr_out, OP_EQ, hdr_1, RELAY_HEADER_SIZE); done: ; @@ -74,32 +74,32 @@ test_cfmt_begin_cells(void *arg) /* Try begindir. */ memset(&bcell, 0x7f, sizeof(bcell)); make_relay_cell(&cell, RELAY_COMMAND_BEGIN_DIR, "", 0); - tt_int_op(0, ==, begin_cell_parse(&cell, &bcell, &end_reason)); - tt_ptr_op(NULL, ==, bcell.address); - tt_int_op(0, ==, bcell.flags); - tt_int_op(0, ==, bcell.port); - tt_int_op(5, ==, bcell.stream_id); - tt_int_op(1, ==, bcell.is_begindir); + tt_int_op(0, OP_EQ, begin_cell_parse(&cell, &bcell, &end_reason)); + tt_ptr_op(NULL, OP_EQ, bcell.address); + tt_int_op(0, OP_EQ, bcell.flags); + tt_int_op(0, OP_EQ, bcell.port); + tt_int_op(5, OP_EQ, bcell.stream_id); + tt_int_op(1, OP_EQ, bcell.is_begindir); /* A Begindir with extra stuff. */ memset(&bcell, 0x7f, sizeof(bcell)); make_relay_cell(&cell, RELAY_COMMAND_BEGIN_DIR, "12345", 5); - tt_int_op(0, ==, begin_cell_parse(&cell, &bcell, &end_reason)); - tt_ptr_op(NULL, ==, bcell.address); - tt_int_op(0, ==, bcell.flags); - tt_int_op(0, ==, bcell.port); - tt_int_op(5, ==, bcell.stream_id); - tt_int_op(1, ==, bcell.is_begindir); + tt_int_op(0, OP_EQ, begin_cell_parse(&cell, &bcell, &end_reason)); + tt_ptr_op(NULL, OP_EQ, bcell.address); + tt_int_op(0, OP_EQ, bcell.flags); + tt_int_op(0, OP_EQ, bcell.port); + tt_int_op(5, OP_EQ, bcell.stream_id); + tt_int_op(1, OP_EQ, bcell.is_begindir); /* A short but valid begin cell */ memset(&bcell, 0x7f, sizeof(bcell)); make_relay_cell(&cell, RELAY_COMMAND_BEGIN, "a.b:9", 6); - tt_int_op(0, ==, begin_cell_parse(&cell, &bcell, &end_reason)); - tt_str_op("a.b", ==, bcell.address); - tt_int_op(0, ==, bcell.flags); - tt_int_op(9, ==, bcell.port); - tt_int_op(5, ==, bcell.stream_id); - tt_int_op(0, ==, bcell.is_begindir); + tt_int_op(0, OP_EQ, begin_cell_parse(&cell, &bcell, &end_reason)); + tt_str_op("a.b", OP_EQ, bcell.address); + tt_int_op(0, OP_EQ, bcell.flags); + tt_int_op(9, OP_EQ, bcell.port); + tt_int_op(5, OP_EQ, bcell.stream_id); + tt_int_op(0, OP_EQ, bcell.is_begindir); tor_free(bcell.address); /* A significantly loner begin cell */ @@ -108,35 +108,35 @@ test_cfmt_begin_cells(void *arg) const char c[] = "here-is-a-nice-long.hostname.com:65535"; make_relay_cell(&cell, RELAY_COMMAND_BEGIN, c, strlen(c)+1); } - tt_int_op(0, ==, begin_cell_parse(&cell, &bcell, &end_reason)); - tt_str_op("here-is-a-nice-long.hostname.com", ==, bcell.address); - tt_int_op(0, ==, bcell.flags); - tt_int_op(65535, ==, bcell.port); - tt_int_op(5, ==, bcell.stream_id); - tt_int_op(0, ==, bcell.is_begindir); + tt_int_op(0, OP_EQ, begin_cell_parse(&cell, &bcell, &end_reason)); + tt_str_op("here-is-a-nice-long.hostname.com", OP_EQ, bcell.address); + tt_int_op(0, OP_EQ, bcell.flags); + tt_int_op(65535, OP_EQ, bcell.port); + tt_int_op(5, OP_EQ, bcell.stream_id); + tt_int_op(0, OP_EQ, bcell.is_begindir); tor_free(bcell.address); /* An IPv4 begin cell. */ memset(&bcell, 0x7f, sizeof(bcell)); make_relay_cell(&cell, RELAY_COMMAND_BEGIN, "18.9.22.169:80", 15); - tt_int_op(0, ==, begin_cell_parse(&cell, &bcell, &end_reason)); - tt_str_op("18.9.22.169", ==, bcell.address); - tt_int_op(0, ==, bcell.flags); - tt_int_op(80, ==, bcell.port); - tt_int_op(5, ==, bcell.stream_id); - tt_int_op(0, ==, bcell.is_begindir); + tt_int_op(0, OP_EQ, begin_cell_parse(&cell, &bcell, &end_reason)); + tt_str_op("18.9.22.169", OP_EQ, bcell.address); + tt_int_op(0, OP_EQ, bcell.flags); + tt_int_op(80, OP_EQ, bcell.port); + tt_int_op(5, OP_EQ, bcell.stream_id); + tt_int_op(0, OP_EQ, bcell.is_begindir); tor_free(bcell.address); /* An IPv6 begin cell. Let's make sure we handle colons*/ memset(&bcell, 0x7f, sizeof(bcell)); make_relay_cell(&cell, RELAY_COMMAND_BEGIN, "[2620::6b0:b:1a1a:0:26e5:480e]:80", 34); - tt_int_op(0, ==, begin_cell_parse(&cell, &bcell, &end_reason)); - tt_str_op("[2620::6b0:b:1a1a:0:26e5:480e]", ==, bcell.address); - tt_int_op(0, ==, bcell.flags); - tt_int_op(80, ==, bcell.port); - tt_int_op(5, ==, bcell.stream_id); - tt_int_op(0, ==, bcell.is_begindir); + tt_int_op(0, OP_EQ, begin_cell_parse(&cell, &bcell, &end_reason)); + tt_str_op("[2620::6b0:b:1a1a:0:26e5:480e]", OP_EQ, bcell.address); + tt_int_op(0, OP_EQ, bcell.flags); + tt_int_op(80, OP_EQ, bcell.port); + tt_int_op(5, OP_EQ, bcell.stream_id); + tt_int_op(0, OP_EQ, bcell.is_begindir); tor_free(bcell.address); /* a begin cell with extra junk but not enough for flags. */ @@ -145,12 +145,12 @@ test_cfmt_begin_cells(void *arg) const char c[] = "another.example.com:80\x00\x01\x02"; make_relay_cell(&cell, RELAY_COMMAND_BEGIN, c, sizeof(c)-1); } - tt_int_op(0, ==, begin_cell_parse(&cell, &bcell, &end_reason)); - tt_str_op("another.example.com", ==, bcell.address); - tt_int_op(0, ==, bcell.flags); - tt_int_op(80, ==, bcell.port); - tt_int_op(5, ==, bcell.stream_id); - tt_int_op(0, ==, bcell.is_begindir); + tt_int_op(0, OP_EQ, begin_cell_parse(&cell, &bcell, &end_reason)); + tt_str_op("another.example.com", OP_EQ, bcell.address); + tt_int_op(0, OP_EQ, bcell.flags); + tt_int_op(80, OP_EQ, bcell.port); + tt_int_op(5, OP_EQ, bcell.stream_id); + tt_int_op(0, OP_EQ, bcell.is_begindir); tor_free(bcell.address); /* a begin cell with flags. */ @@ -159,12 +159,12 @@ test_cfmt_begin_cells(void *arg) const char c[] = "another.example.com:443\x00\x01\x02\x03\x04"; make_relay_cell(&cell, RELAY_COMMAND_BEGIN, c, sizeof(c)-1); } - tt_int_op(0, ==, begin_cell_parse(&cell, &bcell, &end_reason)); - tt_str_op("another.example.com", ==, bcell.address); - tt_int_op(0x1020304, ==, bcell.flags); - tt_int_op(443, ==, bcell.port); - tt_int_op(5, ==, bcell.stream_id); - tt_int_op(0, ==, bcell.is_begindir); + tt_int_op(0, OP_EQ, begin_cell_parse(&cell, &bcell, &end_reason)); + tt_str_op("another.example.com", OP_EQ, bcell.address); + tt_int_op(0x1020304, OP_EQ, bcell.flags); + tt_int_op(443, OP_EQ, bcell.port); + tt_int_op(5, OP_EQ, bcell.stream_id); + tt_int_op(0, OP_EQ, bcell.is_begindir); tor_free(bcell.address); /* a begin cell with flags and even more cruft after that. */ @@ -173,12 +173,12 @@ test_cfmt_begin_cells(void *arg) const char c[] = "a-further.example.com:22\x00\xee\xaa\x00\xffHi mom"; make_relay_cell(&cell, RELAY_COMMAND_BEGIN, c, sizeof(c)-1); } - tt_int_op(0, ==, begin_cell_parse(&cell, &bcell, &end_reason)); - tt_str_op("a-further.example.com", ==, bcell.address); - tt_int_op(0xeeaa00ff, ==, bcell.flags); - tt_int_op(22, ==, bcell.port); - tt_int_op(5, ==, bcell.stream_id); - tt_int_op(0, ==, bcell.is_begindir); + tt_int_op(0, OP_EQ, begin_cell_parse(&cell, &bcell, &end_reason)); + tt_str_op("a-further.example.com", OP_EQ, bcell.address); + tt_int_op(0xeeaa00ff, OP_EQ, bcell.flags); + tt_int_op(22, OP_EQ, bcell.port); + tt_int_op(5, OP_EQ, bcell.stream_id); + tt_int_op(0, OP_EQ, bcell.is_begindir); tor_free(bcell.address); /* bad begin cell: impossible length. */ @@ -189,42 +189,42 @@ test_cfmt_begin_cells(void *arg) { relay_header_t rh; relay_header_unpack(&rh, cell.payload); - tt_int_op(rh.length, ==, 510); + tt_int_op(rh.length, OP_EQ, 510); } - tt_int_op(-2, ==, begin_cell_parse(&cell, &bcell, &end_reason)); + tt_int_op(-2, OP_EQ, begin_cell_parse(&cell, &bcell, &end_reason)); /* Bad begin cell: no body. */ memset(&bcell, 0x7f, sizeof(bcell)); make_relay_cell(&cell, RELAY_COMMAND_BEGIN, "", 0); - tt_int_op(-1, ==, begin_cell_parse(&cell, &bcell, &end_reason)); + tt_int_op(-1, OP_EQ, begin_cell_parse(&cell, &bcell, &end_reason)); /* bad begin cell: no body. */ memset(&bcell, 0x7f, sizeof(bcell)); make_relay_cell(&cell, RELAY_COMMAND_BEGIN, "", 0); - tt_int_op(-1, ==, begin_cell_parse(&cell, &bcell, &end_reason)); + tt_int_op(-1, OP_EQ, begin_cell_parse(&cell, &bcell, &end_reason)); /* bad begin cell: no colon */ memset(&bcell, 0x7f, sizeof(bcell)); make_relay_cell(&cell, RELAY_COMMAND_BEGIN, "a.b", 4); - tt_int_op(-1, ==, begin_cell_parse(&cell, &bcell, &end_reason)); + tt_int_op(-1, OP_EQ, begin_cell_parse(&cell, &bcell, &end_reason)); /* bad begin cell: no ports */ memset(&bcell, 0x7f, sizeof(bcell)); make_relay_cell(&cell, RELAY_COMMAND_BEGIN, "a.b:", 5); - tt_int_op(-1, ==, begin_cell_parse(&cell, &bcell, &end_reason)); + tt_int_op(-1, OP_EQ, begin_cell_parse(&cell, &bcell, &end_reason)); /* bad begin cell: bad port */ memset(&bcell, 0x7f, sizeof(bcell)); make_relay_cell(&cell, RELAY_COMMAND_BEGIN, "a.b:xyz", 8); - tt_int_op(-1, ==, begin_cell_parse(&cell, &bcell, &end_reason)); + tt_int_op(-1, OP_EQ, begin_cell_parse(&cell, &bcell, &end_reason)); memset(&bcell, 0x7f, sizeof(bcell)); make_relay_cell(&cell, RELAY_COMMAND_BEGIN, "a.b:100000", 11); - tt_int_op(-1, ==, begin_cell_parse(&cell, &bcell, &end_reason)); + tt_int_op(-1, OP_EQ, begin_cell_parse(&cell, &bcell, &end_reason)); /* bad begin cell: no nul */ memset(&bcell, 0x7f, sizeof(bcell)); make_relay_cell(&cell, RELAY_COMMAND_BEGIN, "a.b:80", 6); - tt_int_op(-1, ==, begin_cell_parse(&cell, &bcell, &end_reason)); + tt_int_op(-1, OP_EQ, begin_cell_parse(&cell, &bcell, &end_reason)); done: tor_free(bcell.address); @@ -244,47 +244,47 @@ test_cfmt_connected_cells(void *arg) make_relay_cell(&cell, RELAY_COMMAND_CONNECTED, "", 0); relay_header_unpack(&rh, cell.payload); r = connected_cell_parse(&rh, &cell, &addr, &ttl); - tt_int_op(r, ==, 0); - tt_int_op(tor_addr_family(&addr), ==, AF_UNSPEC); - tt_int_op(ttl, ==, -1); + tt_int_op(r, OP_EQ, 0); + tt_int_op(tor_addr_family(&addr), OP_EQ, AF_UNSPEC); + tt_int_op(ttl, OP_EQ, -1); /* A slightly less oldschool one: only an IPv4 address */ make_relay_cell(&cell, RELAY_COMMAND_CONNECTED, "\x20\x30\x40\x50", 4); relay_header_unpack(&rh, cell.payload); r = connected_cell_parse(&rh, &cell, &addr, &ttl); - tt_int_op(r, ==, 0); - tt_int_op(tor_addr_family(&addr), ==, AF_INET); - tt_str_op(fmt_addr(&addr), ==, "32.48.64.80"); - tt_int_op(ttl, ==, -1); + tt_int_op(r, OP_EQ, 0); + tt_int_op(tor_addr_family(&addr), OP_EQ, AF_INET); + tt_str_op(fmt_addr(&addr), OP_EQ, "32.48.64.80"); + tt_int_op(ttl, OP_EQ, -1); /* Bogus but understandable: truncated TTL */ make_relay_cell(&cell, RELAY_COMMAND_CONNECTED, "\x11\x12\x13\x14\x15", 5); relay_header_unpack(&rh, cell.payload); r = connected_cell_parse(&rh, &cell, &addr, &ttl); - tt_int_op(r, ==, 0); - tt_int_op(tor_addr_family(&addr), ==, AF_INET); - tt_str_op(fmt_addr(&addr), ==, "17.18.19.20"); - tt_int_op(ttl, ==, -1); + tt_int_op(r, OP_EQ, 0); + tt_int_op(tor_addr_family(&addr), OP_EQ, AF_INET); + tt_str_op(fmt_addr(&addr), OP_EQ, "17.18.19.20"); + tt_int_op(ttl, OP_EQ, -1); /* Regular IPv4 one: address and TTL */ make_relay_cell(&cell, RELAY_COMMAND_CONNECTED, "\x02\x03\x04\x05\x00\x00\x0e\x10", 8); relay_header_unpack(&rh, cell.payload); r = connected_cell_parse(&rh, &cell, &addr, &ttl); - tt_int_op(r, ==, 0); - tt_int_op(tor_addr_family(&addr), ==, AF_INET); - tt_str_op(fmt_addr(&addr), ==, "2.3.4.5"); - tt_int_op(ttl, ==, 3600); + tt_int_op(r, OP_EQ, 0); + tt_int_op(tor_addr_family(&addr), OP_EQ, AF_INET); + tt_str_op(fmt_addr(&addr), OP_EQ, "2.3.4.5"); + tt_int_op(ttl, OP_EQ, 3600); /* IPv4 with too-big TTL */ make_relay_cell(&cell, RELAY_COMMAND_CONNECTED, "\x02\x03\x04\x05\xf0\x00\x00\x00", 8); relay_header_unpack(&rh, cell.payload); r = connected_cell_parse(&rh, &cell, &addr, &ttl); - tt_int_op(r, ==, 0); - tt_int_op(tor_addr_family(&addr), ==, AF_INET); - tt_str_op(fmt_addr(&addr), ==, "2.3.4.5"); - tt_int_op(ttl, ==, -1); + tt_int_op(r, OP_EQ, 0); + tt_int_op(tor_addr_family(&addr), OP_EQ, AF_INET); + tt_str_op(fmt_addr(&addr), OP_EQ, "2.3.4.5"); + tt_int_op(ttl, OP_EQ, -1); /* IPv6 (ttl is mandatory) */ make_relay_cell(&cell, RELAY_COMMAND_CONNECTED, @@ -294,10 +294,10 @@ test_cfmt_connected_cells(void *arg) "\x00\x00\x02\x58", 25); relay_header_unpack(&rh, cell.payload); r = connected_cell_parse(&rh, &cell, &addr, &ttl); - tt_int_op(r, ==, 0); - tt_int_op(tor_addr_family(&addr), ==, AF_INET6); - tt_str_op(fmt_addr(&addr), ==, "2607:f8b0:400c:c02::68"); - tt_int_op(ttl, ==, 600); + tt_int_op(r, OP_EQ, 0); + tt_int_op(tor_addr_family(&addr), OP_EQ, AF_INET6); + tt_str_op(fmt_addr(&addr), OP_EQ, "2607:f8b0:400c:c02::68"); + tt_int_op(ttl, OP_EQ, 600); /* IPv6 (ttl too big) */ make_relay_cell(&cell, RELAY_COMMAND_CONNECTED, @@ -307,17 +307,17 @@ test_cfmt_connected_cells(void *arg) "\x90\x00\x02\x58", 25); relay_header_unpack(&rh, cell.payload); r = connected_cell_parse(&rh, &cell, &addr, &ttl); - tt_int_op(r, ==, 0); - tt_int_op(tor_addr_family(&addr), ==, AF_INET6); - tt_str_op(fmt_addr(&addr), ==, "2607:f8b0:400c:c02::68"); - tt_int_op(ttl, ==, -1); + tt_int_op(r, OP_EQ, 0); + tt_int_op(tor_addr_family(&addr), OP_EQ, AF_INET6); + tt_str_op(fmt_addr(&addr), OP_EQ, "2607:f8b0:400c:c02::68"); + tt_int_op(ttl, OP_EQ, -1); /* Bogus size: 3. */ make_relay_cell(&cell, RELAY_COMMAND_CONNECTED, "\x00\x01\x02", 3); relay_header_unpack(&rh, cell.payload); r = connected_cell_parse(&rh, &cell, &addr, &ttl); - tt_int_op(r, ==, -1); + tt_int_op(r, OP_EQ, -1); /* Bogus family: 7. */ make_relay_cell(&cell, RELAY_COMMAND_CONNECTED, @@ -327,7 +327,7 @@ test_cfmt_connected_cells(void *arg) "\x90\x00\x02\x58", 25); relay_header_unpack(&rh, cell.payload); r = connected_cell_parse(&rh, &cell, &addr, &ttl); - tt_int_op(r, ==, -1); + tt_int_op(r, OP_EQ, -1); /* Truncated IPv6. */ make_relay_cell(&cell, RELAY_COMMAND_CONNECTED, @@ -337,7 +337,7 @@ test_cfmt_connected_cells(void *arg) "\x00\x00\x02", 24); relay_header_unpack(&rh, cell.payload); r = connected_cell_parse(&rh, &cell, &addr, &ttl); - tt_int_op(r, ==, -1); + tt_int_op(r, OP_EQ, -1); /* Now make sure we can generate connected cells correctly. */ /* Try an IPv4 address */ @@ -346,16 +346,16 @@ test_cfmt_connected_cells(void *arg) tor_addr_parse(&addr, "30.40.50.60"); rh.length = connected_cell_format_payload(cell.payload+RELAY_HEADER_SIZE, &addr, 128); - tt_int_op(rh.length, ==, 8); + tt_int_op(rh.length, OP_EQ, 8); test_memeq_hex(cell.payload+RELAY_HEADER_SIZE, "1e28323c" "00000080"); /* Try parsing it. */ tor_addr_make_unspec(&addr); r = connected_cell_parse(&rh, &cell, &addr, &ttl); - tt_int_op(r, ==, 0); - tt_int_op(tor_addr_family(&addr), ==, AF_INET); - tt_str_op(fmt_addr(&addr), ==, "30.40.50.60"); - tt_int_op(ttl, ==, 128); + tt_int_op(r, OP_EQ, 0); + tt_int_op(tor_addr_family(&addr), OP_EQ, AF_INET); + tt_str_op(fmt_addr(&addr), OP_EQ, "30.40.50.60"); + tt_int_op(ttl, OP_EQ, 128); /* Try an IPv6 address */ memset(&rh, 0, sizeof(rh)); @@ -363,7 +363,7 @@ test_cfmt_connected_cells(void *arg) tor_addr_parse(&addr, "2620::6b0:b:1a1a:0:26e5:480e"); rh.length = connected_cell_format_payload(cell.payload+RELAY_HEADER_SIZE, &addr, 3600); - tt_int_op(rh.length, ==, 25); + tt_int_op(rh.length, OP_EQ, 25); test_memeq_hex(cell.payload + RELAY_HEADER_SIZE, "00000000" "06" "2620000006b0000b1a1a000026e5480e" "00000e10"); @@ -371,10 +371,10 @@ test_cfmt_connected_cells(void *arg) /* Try parsing it. */ tor_addr_make_unspec(&addr); r = connected_cell_parse(&rh, &cell, &addr, &ttl); - tt_int_op(r, ==, 0); - tt_int_op(tor_addr_family(&addr), ==, AF_INET6); - tt_str_op(fmt_addr(&addr), ==, "2620:0:6b0:b:1a1a:0:26e5:480e"); - tt_int_op(ttl, ==, 3600); + tt_int_op(r, OP_EQ, 0); + tt_int_op(tor_addr_family(&addr), OP_EQ, AF_INET6); + tt_str_op(fmt_addr(&addr), OP_EQ, "2620:0:6b0:b:1a1a:0:26e5:480e"); + tt_int_op(ttl, OP_EQ, 3600); done: tor_free(mem_op_hex_tmp); @@ -398,14 +398,14 @@ test_cfmt_create_cells(void *arg) crypto_rand((char*)b, TAP_ONIONSKIN_CHALLENGE_LEN); cell.command = CELL_CREATE; memcpy(cell.payload, b, TAP_ONIONSKIN_CHALLENGE_LEN); - tt_int_op(0, ==, create_cell_parse(&cc, &cell)); - tt_int_op(CELL_CREATE, ==, cc.cell_type); - tt_int_op(ONION_HANDSHAKE_TYPE_TAP, ==, cc.handshake_type); - tt_int_op(TAP_ONIONSKIN_CHALLENGE_LEN, ==, cc.handshake_len); - tt_mem_op(cc.onionskin,==, b, TAP_ONIONSKIN_CHALLENGE_LEN + 10); - tt_int_op(0, ==, create_cell_format(&cell2, &cc)); - tt_int_op(cell.command, ==, cell2.command); - tt_mem_op(cell.payload,==, cell2.payload, CELL_PAYLOAD_SIZE); + tt_int_op(0, OP_EQ, create_cell_parse(&cc, &cell)); + tt_int_op(CELL_CREATE, OP_EQ, cc.cell_type); + tt_int_op(ONION_HANDSHAKE_TYPE_TAP, OP_EQ, cc.handshake_type); + tt_int_op(TAP_ONIONSKIN_CHALLENGE_LEN, OP_EQ, cc.handshake_len); + tt_mem_op(cc.onionskin,OP_EQ, b, TAP_ONIONSKIN_CHALLENGE_LEN + 10); + tt_int_op(0, OP_EQ, create_cell_format(&cell2, &cc)); + tt_int_op(cell.command, OP_EQ, cell2.command); + tt_mem_op(cell.payload,OP_EQ, cell2.payload, CELL_PAYLOAD_SIZE); /* A valid create_fast cell. */ memset(&cell, 0, sizeof(cell)); @@ -413,14 +413,14 @@ test_cfmt_create_cells(void *arg) crypto_rand((char*)b, CREATE_FAST_LEN); cell.command = CELL_CREATE_FAST; memcpy(cell.payload, b, CREATE_FAST_LEN); - tt_int_op(0, ==, create_cell_parse(&cc, &cell)); - tt_int_op(CELL_CREATE_FAST, ==, cc.cell_type); - tt_int_op(ONION_HANDSHAKE_TYPE_FAST, ==, cc.handshake_type); - tt_int_op(CREATE_FAST_LEN, ==, cc.handshake_len); - tt_mem_op(cc.onionskin,==, b, CREATE_FAST_LEN + 10); - tt_int_op(0, ==, create_cell_format(&cell2, &cc)); - tt_int_op(cell.command, ==, cell2.command); - tt_mem_op(cell.payload,==, cell2.payload, CELL_PAYLOAD_SIZE); + tt_int_op(0, OP_EQ, create_cell_parse(&cc, &cell)); + tt_int_op(CELL_CREATE_FAST, OP_EQ, cc.cell_type); + tt_int_op(ONION_HANDSHAKE_TYPE_FAST, OP_EQ, cc.handshake_type); + tt_int_op(CREATE_FAST_LEN, OP_EQ, cc.handshake_len); + tt_mem_op(cc.onionskin,OP_EQ, b, CREATE_FAST_LEN + 10); + tt_int_op(0, OP_EQ, create_cell_format(&cell2, &cc)); + tt_int_op(cell.command, OP_EQ, cell2.command); + tt_mem_op(cell.payload,OP_EQ, cell2.payload, CELL_PAYLOAD_SIZE); /* A valid create2 cell with a TAP payload */ memset(&cell, 0, sizeof(cell)); @@ -429,14 +429,14 @@ test_cfmt_create_cells(void *arg) cell.command = CELL_CREATE2; memcpy(cell.payload, "\x00\x00\x00\xBA", 4); /* TAP, 186 bytes long */ memcpy(cell.payload+4, b, TAP_ONIONSKIN_CHALLENGE_LEN); - tt_int_op(0, ==, create_cell_parse(&cc, &cell)); - tt_int_op(CELL_CREATE2, ==, cc.cell_type); - tt_int_op(ONION_HANDSHAKE_TYPE_TAP, ==, cc.handshake_type); - tt_int_op(TAP_ONIONSKIN_CHALLENGE_LEN, ==, cc.handshake_len); - tt_mem_op(cc.onionskin,==, b, TAP_ONIONSKIN_CHALLENGE_LEN + 10); - tt_int_op(0, ==, create_cell_format(&cell2, &cc)); - tt_int_op(cell.command, ==, cell2.command); - tt_mem_op(cell.payload,==, cell2.payload, CELL_PAYLOAD_SIZE); + tt_int_op(0, OP_EQ, create_cell_parse(&cc, &cell)); + tt_int_op(CELL_CREATE2, OP_EQ, cc.cell_type); + tt_int_op(ONION_HANDSHAKE_TYPE_TAP, OP_EQ, cc.handshake_type); + tt_int_op(TAP_ONIONSKIN_CHALLENGE_LEN, OP_EQ, cc.handshake_len); + tt_mem_op(cc.onionskin,OP_EQ, b, TAP_ONIONSKIN_CHALLENGE_LEN + 10); + tt_int_op(0, OP_EQ, create_cell_format(&cell2, &cc)); + tt_int_op(cell.command, OP_EQ, cell2.command); + tt_mem_op(cell.payload,OP_EQ, cell2.payload, CELL_PAYLOAD_SIZE); /* A valid create2 cell with an ntor payload */ memset(&cell, 0, sizeof(cell)); @@ -445,14 +445,14 @@ test_cfmt_create_cells(void *arg) cell.command = CELL_CREATE2; memcpy(cell.payload, "\x00\x02\x00\x54", 4); /* ntor, 84 bytes long */ memcpy(cell.payload+4, b, NTOR_ONIONSKIN_LEN); - tt_int_op(0, ==, create_cell_parse(&cc, &cell)); - tt_int_op(CELL_CREATE2, ==, cc.cell_type); - tt_int_op(ONION_HANDSHAKE_TYPE_NTOR, ==, cc.handshake_type); - tt_int_op(NTOR_ONIONSKIN_LEN, ==, cc.handshake_len); - tt_mem_op(cc.onionskin,==, b, NTOR_ONIONSKIN_LEN + 10); - tt_int_op(0, ==, create_cell_format(&cell2, &cc)); - tt_int_op(cell.command, ==, cell2.command); - tt_mem_op(cell.payload,==, cell2.payload, CELL_PAYLOAD_SIZE); + tt_int_op(0, OP_EQ, create_cell_parse(&cc, &cell)); + tt_int_op(CELL_CREATE2, OP_EQ, cc.cell_type); + tt_int_op(ONION_HANDSHAKE_TYPE_NTOR, OP_EQ, cc.handshake_type); + tt_int_op(NTOR_ONIONSKIN_LEN, OP_EQ, cc.handshake_len); + tt_mem_op(cc.onionskin,OP_EQ, b, NTOR_ONIONSKIN_LEN + 10); + tt_int_op(0, OP_EQ, create_cell_format(&cell2, &cc)); + tt_int_op(cell.command, OP_EQ, cell2.command); + tt_mem_op(cell.payload,OP_EQ, cell2.payload, CELL_PAYLOAD_SIZE); /* A valid create cell with an ntor payload, in legacy format. */ memset(&cell, 0, sizeof(cell)); @@ -461,38 +461,38 @@ test_cfmt_create_cells(void *arg) cell.command = CELL_CREATE; memcpy(cell.payload, "ntorNTORntorNTOR", 16); memcpy(cell.payload+16, b, NTOR_ONIONSKIN_LEN); - tt_int_op(0, ==, create_cell_parse(&cc, &cell)); - tt_int_op(CELL_CREATE, ==, cc.cell_type); - tt_int_op(ONION_HANDSHAKE_TYPE_NTOR, ==, cc.handshake_type); - tt_int_op(NTOR_ONIONSKIN_LEN, ==, cc.handshake_len); - tt_mem_op(cc.onionskin,==, b, NTOR_ONIONSKIN_LEN + 10); - tt_int_op(0, ==, create_cell_format(&cell2, &cc)); - tt_int_op(cell.command, ==, cell2.command); - tt_mem_op(cell.payload,==, cell2.payload, CELL_PAYLOAD_SIZE); + tt_int_op(0, OP_EQ, create_cell_parse(&cc, &cell)); + tt_int_op(CELL_CREATE, OP_EQ, cc.cell_type); + tt_int_op(ONION_HANDSHAKE_TYPE_NTOR, OP_EQ, cc.handshake_type); + tt_int_op(NTOR_ONIONSKIN_LEN, OP_EQ, cc.handshake_len); + tt_mem_op(cc.onionskin,OP_EQ, b, NTOR_ONIONSKIN_LEN + 10); + tt_int_op(0, OP_EQ, create_cell_format(&cell2, &cc)); + tt_int_op(cell.command, OP_EQ, cell2.command); + tt_mem_op(cell.payload,OP_EQ, cell2.payload, CELL_PAYLOAD_SIZE); /* == Okay, now let's try to parse some impossible stuff. */ /* It has to be some kind of a create cell! */ cell.command = CELL_CREATED; - tt_int_op(-1, ==, create_cell_parse(&cc, &cell)); + tt_int_op(-1, OP_EQ, create_cell_parse(&cc, &cell)); /* You can't acutally make an unparseable CREATE or CREATE_FAST cell. */ /* Try some CREATE2 cells. First with a bad type. */ cell.command = CELL_CREATE2; memcpy(cell.payload, "\x00\x50\x00\x99", 4); /* Type 0x50???? */ - tt_int_op(-1, ==, create_cell_parse(&cc, &cell)); + tt_int_op(-1, OP_EQ, create_cell_parse(&cc, &cell)); /* Now a good type with an incorrect length. */ memcpy(cell.payload, "\x00\x00\x00\xBC", 4); /* TAP, 187 bytes.*/ - tt_int_op(-1, ==, create_cell_parse(&cc, &cell)); + tt_int_op(-1, OP_EQ, create_cell_parse(&cc, &cell)); /* Now a good type with a ridiculous length. */ memcpy(cell.payload, "\x00\x00\x02\x00", 4); /* TAP, 512 bytes.*/ - tt_int_op(-1, ==, create_cell_parse(&cc, &cell)); + tt_int_op(-1, OP_EQ, create_cell_parse(&cc, &cell)); /* == Time to try formatting bad cells. The important thing is that we reject big lengths, so just check that for now. */ cc.handshake_len = 512; - tt_int_op(-1, ==, create_cell_format(&cell2, &cc)); + tt_int_op(-1, OP_EQ, create_cell_format(&cell2, &cc)); /* == Try formatting a create2 cell we don't understand. XXXX */ @@ -516,13 +516,13 @@ test_cfmt_created_cells(void *arg) crypto_rand((char*)b, TAP_ONIONSKIN_REPLY_LEN); cell.command = CELL_CREATED; memcpy(cell.payload, b, TAP_ONIONSKIN_REPLY_LEN); - tt_int_op(0, ==, created_cell_parse(&cc, &cell)); - tt_int_op(CELL_CREATED, ==, cc.cell_type); - tt_int_op(TAP_ONIONSKIN_REPLY_LEN, ==, cc.handshake_len); - tt_mem_op(cc.reply,==, b, TAP_ONIONSKIN_REPLY_LEN + 10); - tt_int_op(0, ==, created_cell_format(&cell2, &cc)); - tt_int_op(cell.command, ==, cell2.command); - tt_mem_op(cell.payload,==, cell2.payload, CELL_PAYLOAD_SIZE); + tt_int_op(0, OP_EQ, created_cell_parse(&cc, &cell)); + tt_int_op(CELL_CREATED, OP_EQ, cc.cell_type); + tt_int_op(TAP_ONIONSKIN_REPLY_LEN, OP_EQ, cc.handshake_len); + tt_mem_op(cc.reply,OP_EQ, b, TAP_ONIONSKIN_REPLY_LEN + 10); + tt_int_op(0, OP_EQ, created_cell_format(&cell2, &cc)); + tt_int_op(cell.command, OP_EQ, cell2.command); + tt_mem_op(cell.payload,OP_EQ, cell2.payload, CELL_PAYLOAD_SIZE); /* A good CREATED_FAST cell */ memset(&cell, 0, sizeof(cell)); @@ -530,13 +530,13 @@ test_cfmt_created_cells(void *arg) crypto_rand((char*)b, CREATED_FAST_LEN); cell.command = CELL_CREATED_FAST; memcpy(cell.payload, b, CREATED_FAST_LEN); - tt_int_op(0, ==, created_cell_parse(&cc, &cell)); - tt_int_op(CELL_CREATED_FAST, ==, cc.cell_type); - tt_int_op(CREATED_FAST_LEN, ==, cc.handshake_len); - tt_mem_op(cc.reply,==, b, CREATED_FAST_LEN + 10); - tt_int_op(0, ==, created_cell_format(&cell2, &cc)); - tt_int_op(cell.command, ==, cell2.command); - tt_mem_op(cell.payload,==, cell2.payload, CELL_PAYLOAD_SIZE); + tt_int_op(0, OP_EQ, created_cell_parse(&cc, &cell)); + tt_int_op(CELL_CREATED_FAST, OP_EQ, cc.cell_type); + tt_int_op(CREATED_FAST_LEN, OP_EQ, cc.handshake_len); + tt_mem_op(cc.reply,OP_EQ, b, CREATED_FAST_LEN + 10); + tt_int_op(0, OP_EQ, created_cell_format(&cell2, &cc)); + tt_int_op(cell.command, OP_EQ, cell2.command); + tt_mem_op(cell.payload,OP_EQ, cell2.payload, CELL_PAYLOAD_SIZE); /* A good CREATED2 cell with short reply */ memset(&cell, 0, sizeof(cell)); @@ -545,13 +545,13 @@ test_cfmt_created_cells(void *arg) cell.command = CELL_CREATED2; memcpy(cell.payload, "\x00\x40", 2); memcpy(cell.payload+2, b, 64); - tt_int_op(0, ==, created_cell_parse(&cc, &cell)); - tt_int_op(CELL_CREATED2, ==, cc.cell_type); - tt_int_op(64, ==, cc.handshake_len); - tt_mem_op(cc.reply,==, b, 80); - tt_int_op(0, ==, created_cell_format(&cell2, &cc)); - tt_int_op(cell.command, ==, cell2.command); - tt_mem_op(cell.payload,==, cell2.payload, CELL_PAYLOAD_SIZE); + tt_int_op(0, OP_EQ, created_cell_parse(&cc, &cell)); + tt_int_op(CELL_CREATED2, OP_EQ, cc.cell_type); + tt_int_op(64, OP_EQ, cc.handshake_len); + tt_mem_op(cc.reply,OP_EQ, b, 80); + tt_int_op(0, OP_EQ, created_cell_format(&cell2, &cc)); + tt_int_op(cell.command, OP_EQ, cell2.command); + tt_mem_op(cell.payload,OP_EQ, cell2.payload, CELL_PAYLOAD_SIZE); /* A good CREATED2 cell with maximal reply */ memset(&cell, 0, sizeof(cell)); @@ -560,13 +560,13 @@ test_cfmt_created_cells(void *arg) cell.command = CELL_CREATED2; memcpy(cell.payload, "\x01\xF0", 2); memcpy(cell.payload+2, b, 496); - tt_int_op(0, ==, created_cell_parse(&cc, &cell)); - tt_int_op(CELL_CREATED2, ==, cc.cell_type); - tt_int_op(496, ==, cc.handshake_len); - tt_mem_op(cc.reply,==, b, 496); - tt_int_op(0, ==, created_cell_format(&cell2, &cc)); - tt_int_op(cell.command, ==, cell2.command); - tt_mem_op(cell.payload,==, cell2.payload, CELL_PAYLOAD_SIZE); + tt_int_op(0, OP_EQ, created_cell_parse(&cc, &cell)); + tt_int_op(CELL_CREATED2, OP_EQ, cc.cell_type); + tt_int_op(496, OP_EQ, cc.handshake_len); + tt_mem_op(cc.reply,OP_EQ, b, 496); + tt_int_op(0, OP_EQ, created_cell_format(&cell2, &cc)); + tt_int_op(cell.command, OP_EQ, cell2.command); + tt_mem_op(cell.payload,OP_EQ, cell2.payload, CELL_PAYLOAD_SIZE); /* Bogus CREATED2 cell: too long! */ memset(&cell, 0, sizeof(cell)); @@ -574,11 +574,11 @@ test_cfmt_created_cells(void *arg) crypto_rand((char*)b, 496); cell.command = CELL_CREATED2; memcpy(cell.payload, "\x01\xF1", 2); - tt_int_op(-1, ==, created_cell_parse(&cc, &cell)); + tt_int_op(-1, OP_EQ, created_cell_parse(&cc, &cell)); /* Unformattable CREATED2 cell: too long! */ cc.handshake_len = 497; - tt_int_op(-1, ==, created_cell_format(&cell2, &cc)); + tt_int_op(-1, OP_EQ, created_cell_format(&cell2, &cc)); done: ; @@ -606,21 +606,21 @@ test_cfmt_extend_cells(void *arg) memcpy(p, "\x12\xf4\x00\x01\x01\x02", 6); /* 18 244 0 1 : 258 */ memcpy(p+6,b,TAP_ONIONSKIN_CHALLENGE_LEN); memcpy(p+6+TAP_ONIONSKIN_CHALLENGE_LEN, "electroencephalogram", 20); - tt_int_op(0, ==, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND, + tt_int_op(0, OP_EQ, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND, p, 26+TAP_ONIONSKIN_CHALLENGE_LEN)); - tt_int_op(RELAY_COMMAND_EXTEND, ==, ec.cell_type); - tt_str_op("18.244.0.1", ==, fmt_addr(&ec.orport_ipv4.addr)); - tt_int_op(258, ==, ec.orport_ipv4.port); - tt_int_op(AF_UNSPEC, ==, tor_addr_family(&ec.orport_ipv6.addr)); - tt_mem_op(ec.node_id,==, "electroencephalogram", 20); - tt_int_op(cc->cell_type, ==, CELL_CREATE); - tt_int_op(cc->handshake_type, ==, ONION_HANDSHAKE_TYPE_TAP); - tt_int_op(cc->handshake_len, ==, TAP_ONIONSKIN_CHALLENGE_LEN); - tt_mem_op(cc->onionskin,==, b, TAP_ONIONSKIN_CHALLENGE_LEN+20); - tt_int_op(0, ==, extend_cell_format(&p2_cmd, &p2_len, p2, &ec)); - tt_int_op(p2_cmd, ==, RELAY_COMMAND_EXTEND); - tt_int_op(p2_len, ==, 26+TAP_ONIONSKIN_CHALLENGE_LEN); - tt_mem_op(p2,==, p, RELAY_PAYLOAD_SIZE); + tt_int_op(RELAY_COMMAND_EXTEND, OP_EQ, ec.cell_type); + tt_str_op("18.244.0.1", OP_EQ, fmt_addr(&ec.orport_ipv4.addr)); + tt_int_op(258, OP_EQ, ec.orport_ipv4.port); + tt_int_op(AF_UNSPEC, OP_EQ, tor_addr_family(&ec.orport_ipv6.addr)); + tt_mem_op(ec.node_id,OP_EQ, "electroencephalogram", 20); + tt_int_op(cc->cell_type, OP_EQ, CELL_CREATE); + tt_int_op(cc->handshake_type, OP_EQ, ONION_HANDSHAKE_TYPE_TAP); + tt_int_op(cc->handshake_len, OP_EQ, TAP_ONIONSKIN_CHALLENGE_LEN); + tt_mem_op(cc->onionskin,OP_EQ, b, TAP_ONIONSKIN_CHALLENGE_LEN+20); + tt_int_op(0, OP_EQ, extend_cell_format(&p2_cmd, &p2_len, p2, &ec)); + tt_int_op(p2_cmd, OP_EQ, RELAY_COMMAND_EXTEND); + tt_int_op(p2_len, OP_EQ, 26+TAP_ONIONSKIN_CHALLENGE_LEN); + tt_mem_op(p2,OP_EQ, p, RELAY_PAYLOAD_SIZE); /* Let's do an ntor stuffed in a legacy EXTEND cell */ memset(p, 0, sizeof(p)); @@ -630,22 +630,22 @@ test_cfmt_extend_cells(void *arg) memcpy(p+6,"ntorNTORntorNTOR", 16); memcpy(p+22, b, NTOR_ONIONSKIN_LEN); memcpy(p+6+TAP_ONIONSKIN_CHALLENGE_LEN, "electroencephalogram", 20); - tt_int_op(0, ==, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND, + tt_int_op(0, OP_EQ, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND, p, 26+TAP_ONIONSKIN_CHALLENGE_LEN)); - tt_int_op(RELAY_COMMAND_EXTEND, ==, ec.cell_type); - tt_str_op("18.244.0.1", ==, fmt_addr(&ec.orport_ipv4.addr)); - tt_int_op(258, ==, ec.orport_ipv4.port); - tt_int_op(AF_UNSPEC, ==, tor_addr_family(&ec.orport_ipv6.addr)); - tt_mem_op(ec.node_id,==, "electroencephalogram", 20); - tt_int_op(cc->cell_type, ==, CELL_CREATE2); - tt_int_op(cc->handshake_type, ==, ONION_HANDSHAKE_TYPE_NTOR); - tt_int_op(cc->handshake_len, ==, NTOR_ONIONSKIN_LEN); - tt_mem_op(cc->onionskin,==, b, NTOR_ONIONSKIN_LEN+20); - tt_int_op(0, ==, extend_cell_format(&p2_cmd, &p2_len, p2, &ec)); - tt_int_op(p2_cmd, ==, RELAY_COMMAND_EXTEND); - tt_int_op(p2_len, ==, 26+TAP_ONIONSKIN_CHALLENGE_LEN); - tt_mem_op(p2,==, p, RELAY_PAYLOAD_SIZE); - tt_int_op(0, ==, create_cell_format_relayed(&cell, cc)); + tt_int_op(RELAY_COMMAND_EXTEND, OP_EQ, ec.cell_type); + tt_str_op("18.244.0.1", OP_EQ, fmt_addr(&ec.orport_ipv4.addr)); + tt_int_op(258, OP_EQ, ec.orport_ipv4.port); + tt_int_op(AF_UNSPEC, OP_EQ, tor_addr_family(&ec.orport_ipv6.addr)); + tt_mem_op(ec.node_id,OP_EQ, "electroencephalogram", 20); + tt_int_op(cc->cell_type, OP_EQ, CELL_CREATE2); + tt_int_op(cc->handshake_type, OP_EQ, ONION_HANDSHAKE_TYPE_NTOR); + tt_int_op(cc->handshake_len, OP_EQ, NTOR_ONIONSKIN_LEN); + tt_mem_op(cc->onionskin,OP_EQ, b, NTOR_ONIONSKIN_LEN+20); + tt_int_op(0, OP_EQ, extend_cell_format(&p2_cmd, &p2_len, p2, &ec)); + tt_int_op(p2_cmd, OP_EQ, RELAY_COMMAND_EXTEND); + tt_int_op(p2_len, OP_EQ, 26+TAP_ONIONSKIN_CHALLENGE_LEN); + tt_mem_op(p2,OP_EQ, p, RELAY_PAYLOAD_SIZE); + tt_int_op(0, OP_EQ, create_cell_format_relayed(&cell, cc)); /* Now let's do a minimal ntor EXTEND2 cell. */ memset(&ec, 0xff, sizeof(ec)); @@ -659,21 +659,21 @@ test_cfmt_extend_cells(void *arg) /* Prep for the handshake: type and length */ memcpy(p+31, "\x00\x02\x00\x54", 4); memcpy(p+35, b, NTOR_ONIONSKIN_LEN); - tt_int_op(0, ==, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND2, + tt_int_op(0, OP_EQ, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND2, p, 35+NTOR_ONIONSKIN_LEN)); - tt_int_op(RELAY_COMMAND_EXTEND2, ==, ec.cell_type); - tt_str_op("18.244.0.1", ==, fmt_addr(&ec.orport_ipv4.addr)); - tt_int_op(61681, ==, ec.orport_ipv4.port); - tt_int_op(AF_UNSPEC, ==, tor_addr_family(&ec.orport_ipv6.addr)); - tt_mem_op(ec.node_id,==, "anarchoindividualist", 20); - tt_int_op(cc->cell_type, ==, CELL_CREATE2); - tt_int_op(cc->handshake_type, ==, ONION_HANDSHAKE_TYPE_NTOR); - tt_int_op(cc->handshake_len, ==, NTOR_ONIONSKIN_LEN); - tt_mem_op(cc->onionskin,==, b, NTOR_ONIONSKIN_LEN+20); - tt_int_op(0, ==, extend_cell_format(&p2_cmd, &p2_len, p2, &ec)); - tt_int_op(p2_cmd, ==, RELAY_COMMAND_EXTEND2); - tt_int_op(p2_len, ==, 35+NTOR_ONIONSKIN_LEN); - tt_mem_op(p2,==, p, RELAY_PAYLOAD_SIZE); + tt_int_op(RELAY_COMMAND_EXTEND2, OP_EQ, ec.cell_type); + tt_str_op("18.244.0.1", OP_EQ, fmt_addr(&ec.orport_ipv4.addr)); + tt_int_op(61681, OP_EQ, ec.orport_ipv4.port); + tt_int_op(AF_UNSPEC, OP_EQ, tor_addr_family(&ec.orport_ipv6.addr)); + tt_mem_op(ec.node_id,OP_EQ, "anarchoindividualist", 20); + tt_int_op(cc->cell_type, OP_EQ, CELL_CREATE2); + tt_int_op(cc->handshake_type, OP_EQ, ONION_HANDSHAKE_TYPE_NTOR); + tt_int_op(cc->handshake_len, OP_EQ, NTOR_ONIONSKIN_LEN); + tt_mem_op(cc->onionskin,OP_EQ, b, NTOR_ONIONSKIN_LEN+20); + tt_int_op(0, OP_EQ, extend_cell_format(&p2_cmd, &p2_len, p2, &ec)); + tt_int_op(p2_cmd, OP_EQ, RELAY_COMMAND_EXTEND2); + tt_int_op(p2_len, OP_EQ, 35+NTOR_ONIONSKIN_LEN); + tt_mem_op(p2,OP_EQ, p, RELAY_PAYLOAD_SIZE); /* Now let's do a fanciful EXTEND2 cell. */ memset(&ec, 0xff, sizeof(ec)); @@ -692,21 +692,21 @@ test_cfmt_extend_cells(void *arg) /* Prep for the handshake: weird type and length */ memcpy(p+85, "\x01\x05\x00\x63", 4); memcpy(p+89, b, 99); - tt_int_op(0, ==, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND2, p, 89+99)); - tt_int_op(RELAY_COMMAND_EXTEND2, ==, ec.cell_type); - tt_str_op("18.244.0.1", ==, fmt_addr(&ec.orport_ipv4.addr)); - tt_int_op(61681, ==, ec.orport_ipv4.port); - tt_str_op("2002::f0:c51e", ==, fmt_addr(&ec.orport_ipv6.addr)); - tt_int_op(4370, ==, ec.orport_ipv6.port); - tt_mem_op(ec.node_id,==, "anthropomorphization", 20); - tt_int_op(cc->cell_type, ==, CELL_CREATE2); - tt_int_op(cc->handshake_type, ==, 0x105); - tt_int_op(cc->handshake_len, ==, 99); - tt_mem_op(cc->onionskin,==, b, 99+20); - tt_int_op(0, ==, extend_cell_format(&p2_cmd, &p2_len, p2, &ec)); - tt_int_op(p2_cmd, ==, RELAY_COMMAND_EXTEND2); + tt_int_op(0, OP_EQ, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND2, p, 89+99)); + tt_int_op(RELAY_COMMAND_EXTEND2, OP_EQ, ec.cell_type); + tt_str_op("18.244.0.1", OP_EQ, fmt_addr(&ec.orport_ipv4.addr)); + tt_int_op(61681, OP_EQ, ec.orport_ipv4.port); + tt_str_op("2002::f0:c51e", OP_EQ, fmt_addr(&ec.orport_ipv6.addr)); + tt_int_op(4370, OP_EQ, ec.orport_ipv6.port); + tt_mem_op(ec.node_id,OP_EQ, "anthropomorphization", 20); + tt_int_op(cc->cell_type, OP_EQ, CELL_CREATE2); + tt_int_op(cc->handshake_type, OP_EQ, 0x105); + tt_int_op(cc->handshake_len, OP_EQ, 99); + tt_mem_op(cc->onionskin,OP_EQ, b, 99+20); + tt_int_op(0, OP_EQ, extend_cell_format(&p2_cmd, &p2_len, p2, &ec)); + tt_int_op(p2_cmd, OP_EQ, RELAY_COMMAND_EXTEND2); /* We'll generate it minus the IPv6 address and minus the konami code */ - tt_int_op(p2_len, ==, 89+99-34-20); + tt_int_op(p2_len, OP_EQ, 89+99-34-20); test_memeq_hex(p2, /* Two items: one that same darn IP address. */ "02000612F40001F0F1" @@ -714,8 +714,8 @@ test_cfmt_extend_cells(void *arg) "0214616e7468726f706f6d6f727068697a6174696f6e" /* Now the handshake prologue */ "01050063"); - tt_mem_op(p2+1+8+22+4,==, b, 99+20); - tt_int_op(0, ==, create_cell_format_relayed(&cell, cc)); + tt_mem_op(p2+1+8+22+4,OP_EQ, b, 99+20); + tt_int_op(0, OP_EQ, create_cell_format_relayed(&cell, cc)); /* == Now try parsing some junk */ @@ -724,7 +724,7 @@ test_cfmt_extend_cells(void *arg) memcpy(p, "\x02\x00\x06\x12\xf4\x00\x01\xf0\xf1", 9); memcpy(p+9, "\x02\x14" "anarchoindividualist", 22); memcpy(p+31, "\xff\xff\x01\xd0", 4); - tt_int_op(-1, ==, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND2, + tt_int_op(-1, OP_EQ, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND2, p, sizeof(p))); /* Try two identities. */ @@ -733,14 +733,14 @@ test_cfmt_extend_cells(void *arg) memcpy(p+9, "\x02\x14" "anarchoindividualist", 22); memcpy(p+31, "\x02\x14" "autodepolymerization", 22); memcpy(p+53, "\xff\xff\x00\x10", 4); - tt_int_op(-1, ==, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND2, + tt_int_op(-1, OP_EQ, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND2, p, sizeof(p))); /* No identities. */ memset(p, 0, sizeof(p)); memcpy(p, "\x01\x00\x06\x12\xf4\x00\x01\xf0\xf1", 9); memcpy(p+53, "\xff\xff\x00\x10", 4); - tt_int_op(-1, ==, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND2, + tt_int_op(-1, OP_EQ, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND2, p, sizeof(p))); /* Try a bad IPv4 address (too long, too short)*/ @@ -748,13 +748,13 @@ test_cfmt_extend_cells(void *arg) memcpy(p, "\x02\x00\x07\x12\xf4\x00\x01\xf0\xf1\xff", 10); memcpy(p+10, "\x02\x14" "anarchoindividualist", 22); memcpy(p+32, "\xff\xff\x00\x10", 4); - tt_int_op(-1, ==, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND2, + tt_int_op(-1, OP_EQ, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND2, p, sizeof(p))); memset(p, 0, sizeof(p)); memcpy(p, "\x02\x00\x05\x12\xf4\x00\x01\xf0", 8); memcpy(p+8, "\x02\x14" "anarchoindividualist", 22); memcpy(p+30, "\xff\xff\x00\x10", 4); - tt_int_op(-1, ==, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND2, + tt_int_op(-1, OP_EQ, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND2, p, sizeof(p))); /* IPv6 address (too long, too short, no IPv4)*/ @@ -763,28 +763,28 @@ test_cfmt_extend_cells(void *arg) memcpy(p+9, "\x02\x14" "anarchoindividualist", 22); memcpy(p+31, "\x01\x13" "xxxxxxxxxxxxxxxxYYZ", 19); memcpy(p+50, "\xff\xff\x00\x20", 4); - tt_int_op(-1, ==, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND2, + tt_int_op(-1, OP_EQ, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND2, p, sizeof(p))); memset(p, 0, sizeof(p)); memcpy(p, "\x03\x00\x06\x12\xf4\x00\x01\xf0\xf1", 9); memcpy(p+9, "\x02\x14" "anarchoindividualist", 22); memcpy(p+31, "\x01\x11" "xxxxxxxxxxxxxxxxY", 17); memcpy(p+48, "\xff\xff\x00\x20", 4); - tt_int_op(-1, ==, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND2, + tt_int_op(-1, OP_EQ, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND2, p, sizeof(p))); memset(p, 0, sizeof(p)); memcpy(p, "\x02", 1); memcpy(p+1, "\x02\x14" "anarchoindividualist", 22); memcpy(p+23, "\x01\x12" "xxxxxxxxxxxxxxxxYY", 18); memcpy(p+41, "\xff\xff\x00\x20", 4); - tt_int_op(-1, ==, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND2, + tt_int_op(-1, OP_EQ, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND2, p, sizeof(p))); /* Running out of space in specifiers */ memset(p,0,sizeof(p)); memcpy(p, "\x05\x0a\xff", 3); memcpy(p+3+255, "\x0a\xff", 2); - tt_int_op(-1, ==, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND2, + tt_int_op(-1, OP_EQ, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND2, p, sizeof(p))); /* Fuzz, because why not. */ @@ -823,16 +823,16 @@ test_cfmt_extended_cells(void *arg) memset(b, 0, sizeof(b)); crypto_rand((char*)b, TAP_ONIONSKIN_REPLY_LEN); memcpy(p,b,TAP_ONIONSKIN_REPLY_LEN); - tt_int_op(0, ==, extended_cell_parse(&ec, RELAY_COMMAND_EXTENDED, p, + tt_int_op(0, OP_EQ, extended_cell_parse(&ec, RELAY_COMMAND_EXTENDED, p, TAP_ONIONSKIN_REPLY_LEN)); - tt_int_op(RELAY_COMMAND_EXTENDED, ==, ec.cell_type); - tt_int_op(cc->cell_type, ==, CELL_CREATED); - tt_int_op(cc->handshake_len, ==, TAP_ONIONSKIN_REPLY_LEN); - tt_mem_op(cc->reply,==, b, TAP_ONIONSKIN_REPLY_LEN); - tt_int_op(0, ==, extended_cell_format(&p2_cmd, &p2_len, p2, &ec)); - tt_int_op(RELAY_COMMAND_EXTENDED, ==, p2_cmd); - tt_int_op(TAP_ONIONSKIN_REPLY_LEN, ==, p2_len); - tt_mem_op(p2,==, p, sizeof(p2)); + tt_int_op(RELAY_COMMAND_EXTENDED, OP_EQ, ec.cell_type); + tt_int_op(cc->cell_type, OP_EQ, CELL_CREATED); + tt_int_op(cc->handshake_len, OP_EQ, TAP_ONIONSKIN_REPLY_LEN); + tt_mem_op(cc->reply,OP_EQ, b, TAP_ONIONSKIN_REPLY_LEN); + tt_int_op(0, OP_EQ, extended_cell_format(&p2_cmd, &p2_len, p2, &ec)); + tt_int_op(RELAY_COMMAND_EXTENDED, OP_EQ, p2_cmd); + tt_int_op(TAP_ONIONSKIN_REPLY_LEN, OP_EQ, p2_len); + tt_mem_op(p2,OP_EQ, p, sizeof(p2)); /* Try an EXTENDED2 cell */ memset(&ec, 0xff, sizeof(ec)); @@ -841,25 +841,26 @@ test_cfmt_extended_cells(void *arg) crypto_rand((char*)b, 42); memcpy(p,"\x00\x2a",2); memcpy(p+2,b,42); - tt_int_op(0, ==, extended_cell_parse(&ec, RELAY_COMMAND_EXTENDED2, p, 2+42)); - tt_int_op(RELAY_COMMAND_EXTENDED2, ==, ec.cell_type); - tt_int_op(cc->cell_type, ==, CELL_CREATED2); - tt_int_op(cc->handshake_len, ==, 42); - tt_mem_op(cc->reply,==, b, 42+10); - tt_int_op(0, ==, extended_cell_format(&p2_cmd, &p2_len, p2, &ec)); - tt_int_op(RELAY_COMMAND_EXTENDED2, ==, p2_cmd); - tt_int_op(2+42, ==, p2_len); - tt_mem_op(p2,==, p, sizeof(p2)); + tt_int_op(0, OP_EQ, + extended_cell_parse(&ec, RELAY_COMMAND_EXTENDED2, p, 2+42)); + tt_int_op(RELAY_COMMAND_EXTENDED2, OP_EQ, ec.cell_type); + tt_int_op(cc->cell_type, OP_EQ, CELL_CREATED2); + tt_int_op(cc->handshake_len, OP_EQ, 42); + tt_mem_op(cc->reply,OP_EQ, b, 42+10); + tt_int_op(0, OP_EQ, extended_cell_format(&p2_cmd, &p2_len, p2, &ec)); + tt_int_op(RELAY_COMMAND_EXTENDED2, OP_EQ, p2_cmd); + tt_int_op(2+42, OP_EQ, p2_len); + tt_mem_op(p2,OP_EQ, p, sizeof(p2)); /* Try an almost-too-long EXTENDED2 cell */ memcpy(p, "\x01\xf0", 2); - tt_int_op(0, ==, + tt_int_op(0, OP_EQ, extended_cell_parse(&ec, RELAY_COMMAND_EXTENDED2, p, sizeof(p))); /* Now try a too-long extended2 cell. That's the only misparse I can think * of. */ memcpy(p, "\x01\xf1", 2); - tt_int_op(-1, ==, + tt_int_op(-1, OP_EQ, extended_cell_parse(&ec, RELAY_COMMAND_EXTENDED2, p, sizeof(p))); done: @@ -903,22 +904,22 @@ test_cfmt_resolved_cells(void *arg) /* Let's try an empty cell */ SET_CELL(""); r = resolved_cell_parse(&cell, &rh, addrs, &errcode); - tt_int_op(errcode, ==, 0); - tt_int_op(r, ==, 0); - tt_int_op(smartlist_len(addrs), ==, 0); + tt_int_op(errcode, OP_EQ, 0); + tt_int_op(r, OP_EQ, 0); + tt_int_op(smartlist_len(addrs), OP_EQ, 0); CLEAR_ADDRS(); /* redundant but let's be consistent */ /* Cell with one ipv4 addr */ SET_CELL("\x04\x04" "\x7f\x00\x02\x0a" "\x00\00\x01\x00"); - tt_int_op(rh.length, ==, 10); + tt_int_op(rh.length, OP_EQ, 10); r = resolved_cell_parse(&cell, &rh, addrs, &errcode); - tt_int_op(errcode, ==, 0); - tt_int_op(r, ==, 0); - tt_int_op(smartlist_len(addrs), ==, 1); + tt_int_op(errcode, OP_EQ, 0); + tt_int_op(r, OP_EQ, 0); + tt_int_op(smartlist_len(addrs), OP_EQ, 1); a = smartlist_get(addrs, 0); - tt_str_op(fmt_addr(&a->addr), ==, "127.0.2.10"); - tt_ptr_op(a->hostname, ==, NULL); - tt_int_op(a->ttl, ==, 256); + tt_str_op(fmt_addr(&a->addr), OP_EQ, "127.0.2.10"); + tt_ptr_op(a->hostname, OP_EQ, NULL); + tt_int_op(a->ttl, OP_EQ, 256); CLEAR_ADDRS(); /* Cell with one ipv6 addr */ @@ -926,30 +927,30 @@ test_cfmt_resolved_cells(void *arg) "\x20\x02\x90\x90\x00\x00\x00\x00" "\x00\x00\x00\x00\xf0\xf0\xab\xcd" "\x02\00\x00\x01"); - tt_int_op(rh.length, ==, 22); + tt_int_op(rh.length, OP_EQ, 22); r = resolved_cell_parse(&cell, &rh, addrs, &errcode); - tt_int_op(errcode, ==, 0); - tt_int_op(r, ==, 0); - tt_int_op(smartlist_len(addrs), ==, 1); + tt_int_op(errcode, OP_EQ, 0); + tt_int_op(r, OP_EQ, 0); + tt_int_op(smartlist_len(addrs), OP_EQ, 1); a = smartlist_get(addrs, 0); - tt_str_op(fmt_addr(&a->addr), ==, "2002:9090::f0f0:abcd"); - tt_ptr_op(a->hostname, ==, NULL); - tt_int_op(a->ttl, ==, 0x2000001); + tt_str_op(fmt_addr(&a->addr), OP_EQ, "2002:9090::f0f0:abcd"); + tt_ptr_op(a->hostname, OP_EQ, NULL); + tt_int_op(a->ttl, OP_EQ, 0x2000001); CLEAR_ADDRS(); /* Cell with one hostname */ SET_CELL("\x00\x11" "motherbrain.zebes" "\x00\00\x00\x00"); - tt_int_op(rh.length, ==, 23); + tt_int_op(rh.length, OP_EQ, 23); r = resolved_cell_parse(&cell, &rh, addrs, &errcode); - tt_int_op(errcode, ==, 0); - tt_int_op(r, ==, 0); - tt_int_op(smartlist_len(addrs), ==, 1); + tt_int_op(errcode, OP_EQ, 0); + tt_int_op(r, OP_EQ, 0); + tt_int_op(smartlist_len(addrs), OP_EQ, 1); a = smartlist_get(addrs, 0); tt_assert(tor_addr_is_null(&a->addr)); - tt_str_op(a->hostname, ==, "motherbrain.zebes"); - tt_int_op(a->ttl, ==, 0); + tt_str_op(a->hostname, OP_EQ, "motherbrain.zebes"); + tt_int_op(a->ttl, OP_EQ, 0); CLEAR_ADDRS(); #define LONG_NAME \ @@ -958,51 +959,51 @@ test_cfmt_resolved_cells(void *arg) "function-is-already-very-full.of-copy-and-pasted-stuff.having-this-app" \ "ear-more-than-once-would-bother-me-somehow.is" - tt_int_op(strlen(LONG_NAME), ==, 255); + tt_int_op(strlen(LONG_NAME), OP_EQ, 255); SET_CELL("\x00\xff" LONG_NAME "\x00\01\x00\x00"); - tt_int_op(rh.length, ==, 261); + tt_int_op(rh.length, OP_EQ, 261); r = resolved_cell_parse(&cell, &rh, addrs, &errcode); - tt_int_op(errcode, ==, 0); - tt_int_op(r, ==, 0); - tt_int_op(smartlist_len(addrs), ==, 1); + tt_int_op(errcode, OP_EQ, 0); + tt_int_op(r, OP_EQ, 0); + tt_int_op(smartlist_len(addrs), OP_EQ, 1); a = smartlist_get(addrs, 0); tt_assert(tor_addr_is_null(&a->addr)); - tt_str_op(a->hostname, ==, LONG_NAME); - tt_int_op(a->ttl, ==, 65536); + tt_str_op(a->hostname, OP_EQ, LONG_NAME); + tt_int_op(a->ttl, OP_EQ, 65536); CLEAR_ADDRS(); /* Cells with an error */ SET_CELL("\xf0\x2b" "I'm sorry, Dave. I'm afraid I can't do that" "\x00\x11\x22\x33"); - tt_int_op(rh.length, ==, 49); + tt_int_op(rh.length, OP_EQ, 49); r = resolved_cell_parse(&cell, &rh, addrs, &errcode); - tt_int_op(errcode, ==, RESOLVED_TYPE_ERROR_TRANSIENT); - tt_int_op(r, ==, 0); - tt_int_op(smartlist_len(addrs), ==, 0); + tt_int_op(errcode, OP_EQ, RESOLVED_TYPE_ERROR_TRANSIENT); + tt_int_op(r, OP_EQ, 0); + tt_int_op(smartlist_len(addrs), OP_EQ, 0); CLEAR_ADDRS(); SET_CELL("\xf1\x40" "This hostname is too important for me to allow you to resolve it" "\x00\x00\x00\x00"); - tt_int_op(rh.length, ==, 70); + tt_int_op(rh.length, OP_EQ, 70); r = resolved_cell_parse(&cell, &rh, addrs, &errcode); - tt_int_op(errcode, ==, RESOLVED_TYPE_ERROR); - tt_int_op(r, ==, 0); - tt_int_op(smartlist_len(addrs), ==, 0); + tt_int_op(errcode, OP_EQ, RESOLVED_TYPE_ERROR); + tt_int_op(r, OP_EQ, 0); + tt_int_op(smartlist_len(addrs), OP_EQ, 0); CLEAR_ADDRS(); /* Cell with an unrecognized type */ SET_CELL("\xee\x16" "fault in the AE35 unit" "\x09\x09\x01\x01"); - tt_int_op(rh.length, ==, 28); + tt_int_op(rh.length, OP_EQ, 28); r = resolved_cell_parse(&cell, &rh, addrs, &errcode); - tt_int_op(errcode, ==, 0); - tt_int_op(r, ==, 0); - tt_int_op(smartlist_len(addrs), ==, 0); + tt_int_op(errcode, OP_EQ, 0); + tt_int_op(r, OP_EQ, 0); + tt_int_op(smartlist_len(addrs), OP_EQ, 0); CLEAR_ADDRS(); /* Cell with one of each */ @@ -1027,21 +1028,21 @@ test_cfmt_resolved_cells(void *arg) "\x00\00\x00\x00" ); r = resolved_cell_parse(&cell, &rh, addrs, &errcode); - tt_int_op(errcode, ==, 0); /* no error reported; we got answers */ - tt_int_op(r, ==, 0); - tt_int_op(smartlist_len(addrs), ==, 3); + tt_int_op(errcode, OP_EQ, 0); /* no error reported; we got answers */ + tt_int_op(r, OP_EQ, 0); + tt_int_op(smartlist_len(addrs), OP_EQ, 3); a = smartlist_get(addrs, 0); - tt_str_op(fmt_addr(&a->addr), ==, "2002:9090::f0f0:abcd"); - tt_ptr_op(a->hostname, ==, NULL); - tt_int_op(a->ttl, ==, 0x2000001); + tt_str_op(fmt_addr(&a->addr), OP_EQ, "2002:9090::f0f0:abcd"); + tt_ptr_op(a->hostname, OP_EQ, NULL); + tt_int_op(a->ttl, OP_EQ, 0x2000001); a = smartlist_get(addrs, 1); - tt_str_op(fmt_addr(&a->addr), ==, "127.0.2.10"); - tt_ptr_op(a->hostname, ==, NULL); - tt_int_op(a->ttl, ==, 256); + tt_str_op(fmt_addr(&a->addr), OP_EQ, "127.0.2.10"); + tt_ptr_op(a->hostname, OP_EQ, NULL); + tt_int_op(a->ttl, OP_EQ, 256); a = smartlist_get(addrs, 2); tt_assert(tor_addr_is_null(&a->addr)); - tt_str_op(a->hostname, ==, "motherbrain.zebes"); - tt_int_op(a->ttl, ==, 0); + tt_str_op(a->hostname, OP_EQ, "motherbrain.zebes"); + tt_int_op(a->ttl, OP_EQ, 0); CLEAR_ADDRS(); /* Cell with several of similar type */ @@ -1059,29 +1060,29 @@ test_cfmt_resolved_cells(void *arg) "\x00\x00\x00\x00\x00\xfa\xca\xde" "\x00\00\x00\x03"); r = resolved_cell_parse(&cell, &rh, addrs, &errcode); - tt_int_op(errcode, ==, 0); - tt_int_op(r, ==, 0); - tt_int_op(smartlist_len(addrs), ==, 5); + tt_int_op(errcode, OP_EQ, 0); + tt_int_op(r, OP_EQ, 0); + tt_int_op(smartlist_len(addrs), OP_EQ, 5); a = smartlist_get(addrs, 0); - tt_str_op(fmt_addr(&a->addr), ==, "127.0.2.10"); - tt_ptr_op(a->hostname, ==, NULL); - tt_int_op(a->ttl, ==, 256); + tt_str_op(fmt_addr(&a->addr), OP_EQ, "127.0.2.10"); + tt_ptr_op(a->hostname, OP_EQ, NULL); + tt_int_op(a->ttl, OP_EQ, 256); a = smartlist_get(addrs, 1); - tt_str_op(fmt_addr(&a->addr), ==, "8.8.8.8"); - tt_ptr_op(a->hostname, ==, NULL); - tt_int_op(a->ttl, ==, 261); + tt_str_op(fmt_addr(&a->addr), OP_EQ, "8.8.8.8"); + tt_ptr_op(a->hostname, OP_EQ, NULL); + tt_int_op(a->ttl, OP_EQ, 261); a = smartlist_get(addrs, 2); - tt_str_op(fmt_addr(&a->addr), ==, "127.176.2.176"); - tt_ptr_op(a->hostname, ==, NULL); - tt_int_op(a->ttl, ==, 131071); + tt_str_op(fmt_addr(&a->addr), OP_EQ, "127.176.2.176"); + tt_ptr_op(a->hostname, OP_EQ, NULL); + tt_int_op(a->ttl, OP_EQ, 131071); a = smartlist_get(addrs, 3); - tt_str_op(fmt_addr(&a->addr), ==, "2002:9000::cafe:f00d"); - tt_ptr_op(a->hostname, ==, NULL); - tt_int_op(a->ttl, ==, 1); + tt_str_op(fmt_addr(&a->addr), OP_EQ, "2002:9000::cafe:f00d"); + tt_ptr_op(a->hostname, OP_EQ, NULL); + tt_int_op(a->ttl, OP_EQ, 1); a = smartlist_get(addrs, 4); - tt_str_op(fmt_addr(&a->addr), ==, "2002:9001::fa:cade"); - tt_ptr_op(a->hostname, ==, NULL); - tt_int_op(a->ttl, ==, 3); + tt_str_op(fmt_addr(&a->addr), OP_EQ, "2002:9001::fa:cade"); + tt_ptr_op(a->hostname, OP_EQ, NULL); + tt_int_op(a->ttl, OP_EQ, 3); CLEAR_ADDRS(); /* Full cell */ @@ -1091,22 +1092,22 @@ test_cfmt_resolved_cells(void *arg) "g-case.to-avoid-off-by-one-errors.where-full-things-are-misreported-as" \ ".overflowing-by-one.z" - tt_int_op(strlen(LONG_NAME2), ==, 231); + tt_int_op(strlen(LONG_NAME2), OP_EQ, 231); SET_CELL("\x00\xff" LONG_NAME "\x00\01\x00\x00" "\x00\xe7" LONG_NAME2 "\x00\01\x00\x00"); - tt_int_op(rh.length, ==, RELAY_PAYLOAD_SIZE); + tt_int_op(rh.length, OP_EQ, RELAY_PAYLOAD_SIZE); r = resolved_cell_parse(&cell, &rh, addrs, &errcode); - tt_int_op(errcode, ==, 0); - tt_int_op(r, ==, 0); - tt_int_op(smartlist_len(addrs), ==, 2); + tt_int_op(errcode, OP_EQ, 0); + tt_int_op(r, OP_EQ, 0); + tt_int_op(smartlist_len(addrs), OP_EQ, 2); a = smartlist_get(addrs, 0); - tt_str_op(a->hostname, ==, LONG_NAME); + tt_str_op(a->hostname, OP_EQ, LONG_NAME); a = smartlist_get(addrs, 1); - tt_str_op(a->hostname, ==, LONG_NAME2); + tt_str_op(a->hostname, OP_EQ, LONG_NAME2); CLEAR_ADDRS(); /* BAD CELLS */ @@ -1114,49 +1115,49 @@ test_cfmt_resolved_cells(void *arg) /* Invalid length on an IPv4 */ SET_CELL("\x04\x03zzz1234"); r = resolved_cell_parse(&cell, &rh, addrs, &errcode); - tt_int_op(errcode, ==, 0); - tt_int_op(r, ==, -1); - tt_int_op(smartlist_len(addrs), ==, 0); + tt_int_op(errcode, OP_EQ, 0); + tt_int_op(r, OP_EQ, -1); + tt_int_op(smartlist_len(addrs), OP_EQ, 0); SET_CELL("\x04\x04" "\x7f\x00\x02\x0a" "\x00\00\x01\x00" "\x04\x05zzzzz1234"); r = resolved_cell_parse(&cell, &rh, addrs, &errcode); - tt_int_op(errcode, ==, 0); - tt_int_op(r, ==, -1); - tt_int_op(smartlist_len(addrs), ==, 0); + tt_int_op(errcode, OP_EQ, 0); + tt_int_op(r, OP_EQ, -1); + tt_int_op(smartlist_len(addrs), OP_EQ, 0); /* Invalid length on an IPv6 */ SET_CELL("\x06\x03zzz1234"); r = resolved_cell_parse(&cell, &rh, addrs, &errcode); - tt_int_op(errcode, ==, 0); - tt_int_op(r, ==, -1); - tt_int_op(smartlist_len(addrs), ==, 0); + tt_int_op(errcode, OP_EQ, 0); + tt_int_op(r, OP_EQ, -1); + tt_int_op(smartlist_len(addrs), OP_EQ, 0); SET_CELL("\x04\x04" "\x7f\x00\x02\x0a" "\x00\00\x01\x00" "\x06\x17wwwwwwwwwwwwwwwww1234"); r = resolved_cell_parse(&cell, &rh, addrs, &errcode); - tt_int_op(errcode, ==, 0); - tt_int_op(r, ==, -1); - tt_int_op(smartlist_len(addrs), ==, 0); + tt_int_op(errcode, OP_EQ, 0); + tt_int_op(r, OP_EQ, -1); + tt_int_op(smartlist_len(addrs), OP_EQ, 0); SET_CELL("\x04\x04" "\x7f\x00\x02\x0a" "\x00\00\x01\x00" "\x06\x10xxxx"); r = resolved_cell_parse(&cell, &rh, addrs, &errcode); - tt_int_op(errcode, ==, 0); - tt_int_op(r, ==, -1); - tt_int_op(smartlist_len(addrs), ==, 0); + tt_int_op(errcode, OP_EQ, 0); + tt_int_op(r, OP_EQ, -1); + tt_int_op(smartlist_len(addrs), OP_EQ, 0); /* Empty hostname */ SET_CELL("\x00\x00xxxx"); r = resolved_cell_parse(&cell, &rh, addrs, &errcode); - tt_int_op(errcode, ==, 0); - tt_int_op(r, ==, -1); - tt_int_op(smartlist_len(addrs), ==, 0); + tt_int_op(errcode, OP_EQ, 0); + tt_int_op(r, OP_EQ, -1); + tt_int_op(smartlist_len(addrs), OP_EQ, 0); /* rh.length out of range */ CLEAR_CELL(); rh.length = 499; r = resolved_cell_parse(&cell, &rh, addrs, &errcode); - tt_int_op(errcode, ==, 0); - tt_int_op(r, ==, -1); - tt_int_op(smartlist_len(addrs), ==, 0); + tt_int_op(errcode, OP_EQ, 0); + tt_int_op(r, OP_EQ, -1); + tt_int_op(smartlist_len(addrs), OP_EQ, 0); /* Item length extends beyond rh.length */ CLEAR_CELL(); @@ -1165,18 +1166,18 @@ test_cfmt_resolved_cells(void *arg) "\x00\01\x00\x00"); rh.length -= 1; r = resolved_cell_parse(&cell, &rh, addrs, &errcode); - tt_int_op(r, ==, -1); - tt_int_op(smartlist_len(addrs), ==, 0); + tt_int_op(r, OP_EQ, -1); + tt_int_op(smartlist_len(addrs), OP_EQ, 0); rh.length -= 5; r = resolved_cell_parse(&cell, &rh, addrs, &errcode); - tt_int_op(r, ==, -1); - tt_int_op(smartlist_len(addrs), ==, 0); + tt_int_op(r, OP_EQ, -1); + tt_int_op(smartlist_len(addrs), OP_EQ, 0); SET_CELL("\x04\x04" "\x7f\x00\x02\x0a" "\x00\00\x01\x00"); rh.length -= 1; r = resolved_cell_parse(&cell, &rh, addrs, &errcode); - tt_int_op(r, ==, -1); - tt_int_op(smartlist_len(addrs), ==, 0); + tt_int_op(r, OP_EQ, -1); + tt_int_op(smartlist_len(addrs), OP_EQ, 0); SET_CELL("\xee\x10" "\x20\x02\x90\x01\x00\x00\x00\x00" @@ -1184,19 +1185,19 @@ test_cfmt_resolved_cells(void *arg) "\x00\00\x00\x03"); rh.length -= 1; r = resolved_cell_parse(&cell, &rh, addrs, &errcode); - tt_int_op(r, ==, -1); - tt_int_op(smartlist_len(addrs), ==, 0); + tt_int_op(r, OP_EQ, -1); + tt_int_op(smartlist_len(addrs), OP_EQ, 0); /* Truncated item after first character */ SET_CELL("\x04"); r = resolved_cell_parse(&cell, &rh, addrs, &errcode); - tt_int_op(r, ==, -1); - tt_int_op(smartlist_len(addrs), ==, 0); + tt_int_op(r, OP_EQ, -1); + tt_int_op(smartlist_len(addrs), OP_EQ, 0); SET_CELL("\xee"); r = resolved_cell_parse(&cell, &rh, addrs, &errcode); - tt_int_op(r, ==, -1); - tt_int_op(smartlist_len(addrs), ==, 0); + tt_int_op(r, OP_EQ, -1); + tt_int_op(smartlist_len(addrs), OP_EQ, 0); done: CLEAR_ADDRS(); @@ -1224,19 +1225,19 @@ test_cfmt_is_destroy(void *arg) cell_pack(&packed, &cell, 0); chan->wide_circ_ids = 0; tt_assert(! packed_cell_is_destroy(chan, &packed, &circid)); - tt_int_op(circid, ==, 0); + tt_int_op(circid, OP_EQ, 0); cell_pack(&packed, &cell, 1); chan->wide_circ_ids = 1; tt_assert(! packed_cell_is_destroy(chan, &packed, &circid)); - tt_int_op(circid, ==, 0); + tt_int_op(circid, OP_EQ, 0); cell.command = CELL_DESTROY; cell_pack(&packed, &cell, 0); chan->wide_circ_ids = 0; tt_assert(packed_cell_is_destroy(chan, &packed, &circid)); - tt_int_op(circid, ==, 3003); + tt_int_op(circid, OP_EQ, 3003); circid = 0; cell_pack(&packed, &cell, 1); diff --git a/src/test/test_cell_queue.c b/src/test/test_cell_queue.c index e43c100f17..effd316f34 100644 --- a/src/test/test_cell_queue.c +++ b/src/test/test_cell_queue.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2014, The Tor Project, Inc. */ +/* Copyright (c) 2013-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define CIRCUITLIST_PRIVATE @@ -21,7 +21,7 @@ test_cq_manip(void *arg) #endif /* ENABLE_MEMPOOLS */ cell_queue_init(&cq); - tt_int_op(cq.n, ==, 0); + tt_int_op(cq.n, OP_EQ, 0); pc1 = packed_cell_new(); pc2 = packed_cell_new(); @@ -29,26 +29,26 @@ test_cq_manip(void *arg) pc4 = packed_cell_new(); tt_assert(pc1 && pc2 && pc3 && pc4); - tt_ptr_op(NULL, ==, cell_queue_pop(&cq)); + tt_ptr_op(NULL, OP_EQ, cell_queue_pop(&cq)); /* Add and remove a singleton. */ cell_queue_append(&cq, pc1); - tt_int_op(cq.n, ==, 1); - tt_ptr_op(pc1, ==, cell_queue_pop(&cq)); - tt_int_op(cq.n, ==, 0); + tt_int_op(cq.n, OP_EQ, 1); + tt_ptr_op(pc1, OP_EQ, cell_queue_pop(&cq)); + tt_int_op(cq.n, OP_EQ, 0); /* Add and remove four items */ cell_queue_append(&cq, pc4); cell_queue_append(&cq, pc3); cell_queue_append(&cq, pc2); cell_queue_append(&cq, pc1); - tt_int_op(cq.n, ==, 4); - tt_ptr_op(pc4, ==, cell_queue_pop(&cq)); - tt_ptr_op(pc3, ==, cell_queue_pop(&cq)); - tt_ptr_op(pc2, ==, cell_queue_pop(&cq)); - tt_ptr_op(pc1, ==, cell_queue_pop(&cq)); - tt_int_op(cq.n, ==, 0); - tt_ptr_op(NULL, ==, cell_queue_pop(&cq)); + tt_int_op(cq.n, OP_EQ, 4); + tt_ptr_op(pc4, OP_EQ, cell_queue_pop(&cq)); + tt_ptr_op(pc3, OP_EQ, cell_queue_pop(&cq)); + tt_ptr_op(pc2, OP_EQ, cell_queue_pop(&cq)); + tt_ptr_op(pc1, OP_EQ, cell_queue_pop(&cq)); + tt_int_op(cq.n, OP_EQ, 0); + tt_ptr_op(NULL, OP_EQ, cell_queue_pop(&cq)); /* Try a packed copy (wide, then narrow, which is a bit of a cheat, since a * real cell queue has only one type.) */ @@ -64,32 +64,32 @@ test_cq_manip(void *arg) cell.circ_id = 0x2013; cell_queue_append_packed_copy(NULL /*circ*/, &cq, 0 /*exitward*/, &cell, 0 /*wide*/, 0 /*stats*/); - tt_int_op(cq.n, ==, 2); + tt_int_op(cq.n, OP_EQ, 2); pc_tmp = cell_queue_pop(&cq); - tt_int_op(cq.n, ==, 1); - tt_ptr_op(pc_tmp, !=, NULL); - tt_mem_op(pc_tmp->body, ==, "\x12\x34\x56\x78\x0a", 5); - tt_mem_op(pc_tmp->body+5, ==, cell.payload, sizeof(cell.payload)); + tt_int_op(cq.n, OP_EQ, 1); + tt_ptr_op(pc_tmp, OP_NE, NULL); + tt_mem_op(pc_tmp->body, OP_EQ, "\x12\x34\x56\x78\x0a", 5); + tt_mem_op(pc_tmp->body+5, OP_EQ, cell.payload, sizeof(cell.payload)); packed_cell_free(pc_tmp); pc_tmp = cell_queue_pop(&cq); - tt_int_op(cq.n, ==, 0); - tt_ptr_op(pc_tmp, !=, NULL); - tt_mem_op(pc_tmp->body, ==, "\x20\x13\x0a", 3); - tt_mem_op(pc_tmp->body+3, ==, cell.payload, sizeof(cell.payload)); + tt_int_op(cq.n, OP_EQ, 0); + tt_ptr_op(pc_tmp, OP_NE, NULL); + tt_mem_op(pc_tmp->body, OP_EQ, "\x20\x13\x0a", 3); + tt_mem_op(pc_tmp->body+3, OP_EQ, cell.payload, sizeof(cell.payload)); packed_cell_free(pc_tmp); pc_tmp = NULL; - tt_ptr_op(NULL, ==, cell_queue_pop(&cq)); + tt_ptr_op(NULL, OP_EQ, cell_queue_pop(&cq)); /* Now make sure cell_queue_clear works. */ cell_queue_append(&cq, pc2); cell_queue_append(&cq, pc1); - tt_int_op(cq.n, ==, 2); + tt_int_op(cq.n, OP_EQ, 2); cell_queue_clear(&cq); pc2 = pc1 = NULL; /* prevent double-free */ - tt_int_op(cq.n, ==, 0); + tt_int_op(cq.n, OP_EQ, 0); done: packed_cell_free(pc1); @@ -129,17 +129,17 @@ test_circuit_n_cells(void *arg) origin_c = origin_circuit_new(); origin_c->base_.purpose = CIRCUIT_PURPOSE_C_GENERAL; - tt_int_op(n_cells_in_circ_queues(TO_CIRCUIT(or_c)), ==, 0); + tt_int_op(n_cells_in_circ_queues(TO_CIRCUIT(or_c)), OP_EQ, 0); cell_queue_append(&or_c->p_chan_cells, pc1); - tt_int_op(n_cells_in_circ_queues(TO_CIRCUIT(or_c)), ==, 1); + tt_int_op(n_cells_in_circ_queues(TO_CIRCUIT(or_c)), OP_EQ, 1); cell_queue_append(&or_c->base_.n_chan_cells, pc2); cell_queue_append(&or_c->base_.n_chan_cells, pc3); - tt_int_op(n_cells_in_circ_queues(TO_CIRCUIT(or_c)), ==, 3); + tt_int_op(n_cells_in_circ_queues(TO_CIRCUIT(or_c)), OP_EQ, 3); - tt_int_op(n_cells_in_circ_queues(TO_CIRCUIT(origin_c)), ==, 0); + tt_int_op(n_cells_in_circ_queues(TO_CIRCUIT(origin_c)), OP_EQ, 0); cell_queue_append(&origin_c->base_.n_chan_cells, pc4); cell_queue_append(&origin_c->base_.n_chan_cells, pc5); - tt_int_op(n_cells_in_circ_queues(TO_CIRCUIT(origin_c)), ==, 2); + tt_int_op(n_cells_in_circ_queues(TO_CIRCUIT(origin_c)), OP_EQ, 2); done: circuit_free(TO_CIRCUIT(or_c)); diff --git a/src/test/test_channel.c b/src/test/test_channel.c new file mode 100644 index 0000000000..99633a4026 --- /dev/null +++ b/src/test/test_channel.c @@ -0,0 +1,1703 @@ +/* Copyright (c) 2013-2015, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#define TOR_CHANNEL_INTERNAL_ +#define CHANNEL_PRIVATE_ +#include "or.h" +#include "channel.h" +/* For channel_note_destroy_not_pending */ +#include "circuitlist.h" +#include "circuitmux.h" +/* For var_cell_free */ +#include "connection_or.h" +/* For packed_cell stuff */ +#define RELAY_PRIVATE +#include "relay.h" +/* For init/free stuff */ +#include "scheduler.h" + +/* Test suite stuff */ +#include "test.h" +#include "fakechans.h" + +/* This comes from channel.c */ +extern uint64_t estimated_total_queue_size; + +static int test_chan_accept_cells = 0; +static int test_chan_fixed_cells_recved = 0; +static int test_chan_var_cells_recved = 0; +static int test_cells_written = 0; +static int test_destroy_not_pending_calls = 0; +static int test_doesnt_want_writes_count = 0; +static int test_dumpstats_calls = 0; +static int test_has_waiting_cells_count = 0; +static double test_overhead_estimate = 1.0f; +static int test_releases_count = 0; +static circuitmux_t *test_target_cmux = NULL; +static unsigned int test_cmux_cells = 0; +static channel_t *dump_statistics_mock_target = NULL; +static int dump_statistics_mock_matches = 0; + +static void chan_test_channel_dump_statistics_mock( + channel_t *chan, int severity); +static int chan_test_channel_flush_from_first_active_circuit_mock( + channel_t *chan, int max); +static unsigned int chan_test_circuitmux_num_cells_mock(circuitmux_t *cmux); +static void channel_note_destroy_not_pending_mock(channel_t *ch, + circid_t circid); +static void chan_test_cell_handler(channel_t *ch, + cell_t *cell); +static const char * chan_test_describe_transport(channel_t *ch); +static void chan_test_dumpstats(channel_t *ch, int severity); +static void chan_test_var_cell_handler(channel_t *ch, + var_cell_t *var_cell); +static void chan_test_close(channel_t *ch); +static void chan_test_error(channel_t *ch); +static void chan_test_finish_close(channel_t *ch); +static const char * chan_test_get_remote_descr(channel_t *ch, int flags); +static int chan_test_is_canonical(channel_t *ch, int req); +static size_t chan_test_num_bytes_queued(channel_t *ch); +static int chan_test_num_cells_writeable(channel_t *ch); +static int chan_test_write_cell(channel_t *ch, cell_t *cell); +static int chan_test_write_packed_cell(channel_t *ch, + packed_cell_t *packed_cell); +static int chan_test_write_var_cell(channel_t *ch, var_cell_t *var_cell); +static void scheduler_channel_doesnt_want_writes_mock(channel_t *ch); + +static void test_channel_dumpstats(void *arg); +static void test_channel_flush(void *arg); +static void test_channel_flushmux(void *arg); +static void test_channel_incoming(void *arg); +static void test_channel_lifecycle(void *arg); +static void test_channel_multi(void *arg); +static void test_channel_queue_size(void *arg); +static void test_channel_write(void *arg); + +static void +channel_note_destroy_not_pending_mock(channel_t *ch, + circid_t circid) +{ + (void)ch; + (void)circid; + + ++test_destroy_not_pending_calls; +} + +static const char * +chan_test_describe_transport(channel_t *ch) +{ + tt_assert(ch != NULL); + + done: + return "Fake channel for unit tests"; +} + +/** + * Mock for channel_dump_statistics(); if the channel matches the + * target, bump a counter - otherwise ignore. + */ + +static void +chan_test_channel_dump_statistics_mock(channel_t *chan, int severity) +{ + tt_assert(chan != NULL); + + (void)severity; + + if (chan != NULL && chan == dump_statistics_mock_target) { + ++dump_statistics_mock_matches; + } + + done: + return; +} + +/** + * If the target cmux is the cmux for chan, make fake cells up to the + * target number of cells and write them to chan. Otherwise, invoke + * the real channel_flush_from_first_active_circuit(). + */ + +static int +chan_test_channel_flush_from_first_active_circuit_mock(channel_t *chan, + int max) +{ + int result = 0, c = 0; + packed_cell_t *cell = NULL; + + tt_assert(chan != NULL); + if (test_target_cmux != NULL && + test_target_cmux == chan->cmux) { + while (c <= max && test_cmux_cells > 0) { + cell = packed_cell_new(); + channel_write_packed_cell(chan, cell); + ++c; + --test_cmux_cells; + } + result = c; + } else { + result = channel_flush_from_first_active_circuit__real(chan, max); + } + + done: + return result; +} + +/** + * If we have a target cmux set and this matches it, lie about how + * many cells we have according to the number indicated; otherwise + * pass to the real circuitmux_num_cells(). + */ + +static unsigned int +chan_test_circuitmux_num_cells_mock(circuitmux_t *cmux) +{ + unsigned int result = 0; + + tt_assert(cmux != NULL); + if (cmux != NULL) { + if (cmux == test_target_cmux) { + result = test_cmux_cells; + } else { + result = circuitmux_num_cells__real(cmux); + } + } + + done: + + return result; +} + +/* + * Handle an incoming fixed-size cell for unit tests + */ + +static void +chan_test_cell_handler(channel_t *ch, + cell_t *cell) +{ + tt_assert(ch); + tt_assert(cell); + + tor_free(cell); + ++test_chan_fixed_cells_recved; + + done: + return; +} + +/* + * Fake transport-specific stats call + */ + +static void +chan_test_dumpstats(channel_t *ch, int severity) +{ + tt_assert(ch != NULL); + + (void)severity; + + ++test_dumpstats_calls; + + done: + return; +} + +/* + * Handle an incoming variable-size cell for unit tests + */ + +static void +chan_test_var_cell_handler(channel_t *ch, + var_cell_t *var_cell) +{ + tt_assert(ch); + tt_assert(var_cell); + + tor_free(var_cell); + ++test_chan_var_cells_recved; + + done: + return; +} + +static void +chan_test_close(channel_t *ch) +{ + tt_assert(ch); + + done: + return; +} + +/* + * Close a channel through the error path + */ + +static void +chan_test_error(channel_t *ch) +{ + tt_assert(ch); + tt_assert(!(ch->state == CHANNEL_STATE_CLOSING || + ch->state == CHANNEL_STATE_ERROR || + ch->state == CHANNEL_STATE_CLOSED)); + + channel_close_for_error(ch); + + done: + return; +} + +/* + * Finish closing a channel from CHANNEL_STATE_CLOSING + */ + +static void +chan_test_finish_close(channel_t *ch) +{ + tt_assert(ch); + tt_assert(ch->state == CHANNEL_STATE_CLOSING); + + channel_closed(ch); + + done: + return; +} + +static const char * +chan_test_get_remote_descr(channel_t *ch, int flags) +{ + tt_assert(ch); + tt_int_op(flags & ~(GRD_FLAG_ORIGINAL | GRD_FLAG_ADDR_ONLY), ==, 0); + + done: + return "Fake channel for unit tests; no real endpoint"; +} + +static double +chan_test_get_overhead_estimate(channel_t *ch) +{ + tt_assert(ch); + + done: + return test_overhead_estimate; +} + +static int +chan_test_is_canonical(channel_t *ch, int req) +{ + tt_assert(ch != NULL); + tt_assert(req == 0 || req == 1); + + done: + /* Fake channels are always canonical */ + return 1; +} + +static size_t +chan_test_num_bytes_queued(channel_t *ch) +{ + tt_assert(ch); + + done: + return 0; +} + +static int +chan_test_num_cells_writeable(channel_t *ch) +{ + tt_assert(ch); + + done: + return 32; +} + +static int +chan_test_write_cell(channel_t *ch, cell_t *cell) +{ + int rv = 0; + + tt_assert(ch); + tt_assert(cell); + + if (test_chan_accept_cells) { + /* Free the cell and bump the counter */ + tor_free(cell); + ++test_cells_written; + rv = 1; + } + /* else return 0, we didn't accept it */ + + done: + return rv; +} + +static int +chan_test_write_packed_cell(channel_t *ch, + packed_cell_t *packed_cell) +{ + int rv = 0; + + tt_assert(ch); + tt_assert(packed_cell); + + if (test_chan_accept_cells) { + /* Free the cell and bump the counter */ + packed_cell_free(packed_cell); + ++test_cells_written; + rv = 1; + } + /* else return 0, we didn't accept it */ + + done: + return rv; +} + +static int +chan_test_write_var_cell(channel_t *ch, var_cell_t *var_cell) +{ + int rv = 0; + + tt_assert(ch); + tt_assert(var_cell); + + if (test_chan_accept_cells) { + /* Free the cell and bump the counter */ + var_cell_free(var_cell); + ++test_cells_written; + rv = 1; + } + /* else return 0, we didn't accept it */ + + done: + return rv; +} + +/** + * Fill out c with a new fake cell for test suite use + */ + +void +make_fake_cell(cell_t *c) +{ + tt_assert(c != NULL); + + c->circ_id = 1; + c->command = CELL_RELAY; + memset(c->payload, 0, CELL_PAYLOAD_SIZE); + + done: + return; +} + +/** + * Fill out c with a new fake var_cell for test suite use + */ + +void +make_fake_var_cell(var_cell_t *c) +{ + tt_assert(c != NULL); + + c->circ_id = 1; + c->command = CELL_VERSIONS; + c->payload_len = CELL_PAYLOAD_SIZE / 2; + memset(c->payload, 0, c->payload_len); + + done: + return; +} + +/** + * Set up a new fake channel for the test suite + */ + +channel_t * +new_fake_channel(void) +{ + channel_t *chan = tor_malloc_zero(sizeof(channel_t)); + channel_init(chan); + + chan->close = chan_test_close; + chan->get_overhead_estimate = chan_test_get_overhead_estimate; + chan->num_bytes_queued = chan_test_num_bytes_queued; + chan->num_cells_writeable = chan_test_num_cells_writeable; + chan->write_cell = chan_test_write_cell; + chan->write_packed_cell = chan_test_write_packed_cell; + chan->write_var_cell = chan_test_write_var_cell; + chan->state = CHANNEL_STATE_OPEN; + + return chan; +} + +void +free_fake_channel(channel_t *chan) +{ + cell_queue_entry_t *cell, *cell_tmp; + + if (! chan) + return; + + if (chan->cmux) + circuitmux_free(chan->cmux); + + TOR_SIMPLEQ_FOREACH_SAFE(cell, &chan->incoming_queue, next, cell_tmp) { + cell_queue_entry_free(cell, 0); + } + TOR_SIMPLEQ_FOREACH_SAFE(cell, &chan->outgoing_queue, next, cell_tmp) { + cell_queue_entry_free(cell, 0); + } + + tor_free(chan); +} + +/** + * Counter query for scheduler_channel_has_waiting_cells_mock() + */ + +int +get_mock_scheduler_has_waiting_cells_count(void) +{ + return test_has_waiting_cells_count; +} + +/** + * Mock for scheduler_channel_has_waiting_cells() + */ + +void +scheduler_channel_has_waiting_cells_mock(channel_t *ch) +{ + (void)ch; + + /* Increment counter */ + ++test_has_waiting_cells_count; + + return; +} + +static void +scheduler_channel_doesnt_want_writes_mock(channel_t *ch) +{ + (void)ch; + + /* Increment counter */ + ++test_doesnt_want_writes_count; + + return; +} + +/** + * Counter query for scheduler_release_channel_mock() + */ + +int +get_mock_scheduler_release_channel_count(void) +{ + return test_releases_count; +} + +/** + * Mock for scheduler_release_channel() + */ + +void +scheduler_release_channel_mock(channel_t *ch) +{ + (void)ch; + + /* Increment counter */ + ++test_releases_count; + + return; +} + +/** + * Test for channel_dumpstats() and limited test for + * channel_dump_statistics() + */ + +static void +test_channel_dumpstats(void *arg) +{ + channel_t *ch = NULL; + cell_t *cell = NULL; + int old_count; + + (void)arg; + + /* Mock these for duration of the test */ + MOCK(scheduler_channel_doesnt_want_writes, + scheduler_channel_doesnt_want_writes_mock); + MOCK(scheduler_release_channel, + scheduler_release_channel_mock); + + /* Set up a new fake channel */ + ch = new_fake_channel(); + tt_assert(ch); + ch->cmux = circuitmux_alloc(); + + /* Try to register it */ + channel_register(ch); + tt_assert(ch->registered); + + /* Set up mock */ + dump_statistics_mock_target = ch; + dump_statistics_mock_matches = 0; + MOCK(channel_dump_statistics, + chan_test_channel_dump_statistics_mock); + + /* Call channel_dumpstats() */ + channel_dumpstats(LOG_DEBUG); + + /* Assert that we hit the mock */ + tt_int_op(dump_statistics_mock_matches, ==, 1); + + /* Close the channel */ + channel_mark_for_close(ch); + tt_int_op(ch->state, ==, CHANNEL_STATE_CLOSING); + chan_test_finish_close(ch); + tt_int_op(ch->state, ==, CHANNEL_STATE_CLOSED); + + /* Try again and hit the finished channel */ + channel_dumpstats(LOG_DEBUG); + tt_int_op(dump_statistics_mock_matches, ==, 2); + + channel_run_cleanup(); + ch = NULL; + + /* Now we should hit nothing */ + channel_dumpstats(LOG_DEBUG); + tt_int_op(dump_statistics_mock_matches, ==, 2); + + /* Unmock */ + UNMOCK(channel_dump_statistics); + dump_statistics_mock_target = NULL; + dump_statistics_mock_matches = 0; + + /* Now make another channel */ + ch = new_fake_channel(); + tt_assert(ch); + ch->cmux = circuitmux_alloc(); + channel_register(ch); + tt_assert(ch->registered); + /* Lie about its age so dumpstats gets coverage for rate calculations */ + ch->timestamp_created = time(NULL) - 30; + tt_assert(ch->timestamp_created > 0); + tt_assert(time(NULL) > ch->timestamp_created); + + /* Put cells through it both ways to make the counters non-zero */ + cell = tor_malloc_zero(sizeof(*cell)); + make_fake_cell(cell); + test_chan_accept_cells = 1; + old_count = test_cells_written; + channel_write_cell(ch, cell); + cell = NULL; + tt_int_op(test_cells_written, ==, old_count + 1); + tt_assert(ch->n_bytes_xmitted > 0); + tt_assert(ch->n_cells_xmitted > 0); + + /* Receive path */ + channel_set_cell_handlers(ch, + chan_test_cell_handler, + chan_test_var_cell_handler); + tt_ptr_op(channel_get_cell_handler(ch), ==, chan_test_cell_handler); + tt_ptr_op(channel_get_var_cell_handler(ch), ==, chan_test_var_cell_handler); + cell = tor_malloc_zero(sizeof(cell_t)); + make_fake_cell(cell); + old_count = test_chan_fixed_cells_recved; + channel_queue_cell(ch, cell); + cell = NULL; + tt_int_op(test_chan_fixed_cells_recved, ==, old_count + 1); + tt_assert(ch->n_bytes_recved > 0); + tt_assert(ch->n_cells_recved > 0); + + /* Test channel_dump_statistics */ + ch->describe_transport = chan_test_describe_transport; + ch->dumpstats = chan_test_dumpstats; + ch->get_remote_descr = chan_test_get_remote_descr; + ch->is_canonical = chan_test_is_canonical; + old_count = test_dumpstats_calls; + channel_dump_statistics(ch, LOG_DEBUG); + tt_int_op(test_dumpstats_calls, ==, old_count + 1); + + /* Close the channel */ + channel_mark_for_close(ch); + tt_int_op(ch->state, ==, CHANNEL_STATE_CLOSING); + chan_test_finish_close(ch); + tt_int_op(ch->state, ==, CHANNEL_STATE_CLOSED); + channel_run_cleanup(); + ch = NULL; + + done: + tor_free(cell); + free_fake_channel(ch); + + UNMOCK(scheduler_channel_doesnt_want_writes); + UNMOCK(scheduler_release_channel); + + return; +} + +static void +test_channel_flush(void *arg) +{ + channel_t *ch = NULL; + cell_t *cell = NULL; + packed_cell_t *p_cell = NULL; + var_cell_t *v_cell = NULL; + int init_count; + + (void)arg; + +#ifdef ENABLE_MEMPOOLS + init_cell_pool(); +#endif /* ENABLE_MEMPOOLS */ + + ch = new_fake_channel(); + tt_assert(ch); + + /* Cache the original count */ + init_count = test_cells_written; + + /* Stop accepting so we can queue some */ + test_chan_accept_cells = 0; + + /* Queue a regular cell */ + cell = tor_malloc_zero(sizeof(cell_t)); + make_fake_cell(cell); + channel_write_cell(ch, cell); + /* It should be queued, so assert that we didn't write it */ + tt_int_op(test_cells_written, ==, init_count); + + /* Queue a var cell */ + v_cell = tor_malloc_zero(sizeof(var_cell_t) + CELL_PAYLOAD_SIZE); + make_fake_var_cell(v_cell); + channel_write_var_cell(ch, v_cell); + /* It should be queued, so assert that we didn't write it */ + tt_int_op(test_cells_written, ==, init_count); + + /* Try a packed cell now */ + p_cell = packed_cell_new(); + tt_assert(p_cell); + channel_write_packed_cell(ch, p_cell); + /* It should be queued, so assert that we didn't write it */ + tt_int_op(test_cells_written, ==, init_count); + + /* Now allow writes through again */ + test_chan_accept_cells = 1; + + /* ...and flush */ + channel_flush_cells(ch); + + /* All three should have gone through */ + tt_int_op(test_cells_written, ==, init_count + 3); + + done: + tor_free(ch); +#ifdef ENABLE_MEMPOOLS + free_cell_pool(); +#endif /* ENABLE_MEMPOOLS */ + + return; +} + +/** + * Channel flush tests that require cmux mocking + */ + +static void +test_channel_flushmux(void *arg) +{ + channel_t *ch = NULL; + int old_count, q_len_before, q_len_after; + ssize_t result; + + (void)arg; + +#ifdef ENABLE_MEMPOOLS + init_cell_pool(); +#endif /* ENABLE_MEMPOOLS */ + + /* Install mocks we need for this test */ + MOCK(channel_flush_from_first_active_circuit, + chan_test_channel_flush_from_first_active_circuit_mock); + MOCK(circuitmux_num_cells, + chan_test_circuitmux_num_cells_mock); + + ch = new_fake_channel(); + tt_assert(ch); + ch->cmux = circuitmux_alloc(); + + old_count = test_cells_written; + + test_target_cmux = ch->cmux; + test_cmux_cells = 1; + + /* Enable cell acceptance */ + test_chan_accept_cells = 1; + + result = channel_flush_some_cells(ch, 1); + + tt_int_op(result, ==, 1); + tt_int_op(test_cells_written, ==, old_count + 1); + tt_int_op(test_cmux_cells, ==, 0); + + /* Now try it without accepting to force them into the queue */ + test_chan_accept_cells = 0; + test_cmux_cells = 1; + q_len_before = chan_cell_queue_len(&(ch->outgoing_queue)); + + result = channel_flush_some_cells(ch, 1); + + /* We should not have actually flushed any */ + tt_int_op(result, ==, 0); + tt_int_op(test_cells_written, ==, old_count + 1); + /* But we should have gotten to the fake cellgen loop */ + tt_int_op(test_cmux_cells, ==, 0); + /* ...and we should have a queued cell */ + q_len_after = chan_cell_queue_len(&(ch->outgoing_queue)); + tt_int_op(q_len_after, ==, q_len_before + 1); + + /* Now accept cells again and drain the queue */ + test_chan_accept_cells = 1; + channel_flush_cells(ch); + tt_int_op(test_cells_written, ==, old_count + 2); + tt_int_op(chan_cell_queue_len(&(ch->outgoing_queue)), ==, 0); + + test_target_cmux = NULL; + test_cmux_cells = 0; + + done: + if (ch) + circuitmux_free(ch->cmux); + tor_free(ch); + + UNMOCK(channel_flush_from_first_active_circuit); + UNMOCK(circuitmux_num_cells); + + test_chan_accept_cells = 0; + +#ifdef ENABLE_MEMPOOLS + free_cell_pool(); +#endif /* ENABLE_MEMPOOLS */ + + return; +} + +static void +test_channel_incoming(void *arg) +{ + channel_t *ch = NULL; + cell_t *cell = NULL; + var_cell_t *var_cell = NULL; + int old_count; + + (void)arg; + + /* Mock these for duration of the test */ + MOCK(scheduler_channel_doesnt_want_writes, + scheduler_channel_doesnt_want_writes_mock); + MOCK(scheduler_release_channel, + scheduler_release_channel_mock); + + /* Accept cells to lower layer */ + test_chan_accept_cells = 1; + /* Use default overhead factor */ + test_overhead_estimate = 1.0f; + + ch = new_fake_channel(); + tt_assert(ch); + /* Start it off in OPENING */ + ch->state = CHANNEL_STATE_OPENING; + /* We'll need a cmux */ + ch->cmux = circuitmux_alloc(); + + /* Install incoming cell handlers */ + channel_set_cell_handlers(ch, + chan_test_cell_handler, + chan_test_var_cell_handler); + /* Test cell handler getters */ + tt_ptr_op(channel_get_cell_handler(ch), ==, chan_test_cell_handler); + tt_ptr_op(channel_get_var_cell_handler(ch), ==, chan_test_var_cell_handler); + + /* Try to register it */ + channel_register(ch); + tt_assert(ch->registered); + + /* Open it */ + channel_change_state(ch, CHANNEL_STATE_OPEN); + tt_int_op(ch->state, ==, CHANNEL_STATE_OPEN); + + /* Receive a fixed cell */ + cell = tor_malloc_zero(sizeof(cell_t)); + make_fake_cell(cell); + old_count = test_chan_fixed_cells_recved; + channel_queue_cell(ch, cell); + cell = NULL; + tt_int_op(test_chan_fixed_cells_recved, ==, old_count + 1); + + /* Receive a variable-size cell */ + var_cell = tor_malloc_zero(sizeof(var_cell_t) + CELL_PAYLOAD_SIZE); + make_fake_var_cell(var_cell); + old_count = test_chan_var_cells_recved; + channel_queue_var_cell(ch, var_cell); + var_cell = NULL; + tt_int_op(test_chan_var_cells_recved, ==, old_count + 1); + + /* Close it */ + channel_mark_for_close(ch); + tt_int_op(ch->state, ==, CHANNEL_STATE_CLOSING); + chan_test_finish_close(ch); + tt_int_op(ch->state, ==, CHANNEL_STATE_CLOSED); + channel_run_cleanup(); + ch = NULL; + + done: + free_fake_channel(ch); + tor_free(cell); + tor_free(var_cell); + + UNMOCK(scheduler_channel_doesnt_want_writes); + UNMOCK(scheduler_release_channel); + + return; +} + +/** + * Normal channel lifecycle test: + * + * OPENING->OPEN->MAINT->OPEN->CLOSING->CLOSED + */ + +static void +test_channel_lifecycle(void *arg) +{ + channel_t *ch1 = NULL, *ch2 = NULL; + cell_t *cell = NULL; + int old_count, init_doesnt_want_writes_count; + int init_releases_count; + + (void)arg; + + /* Mock these for the whole lifecycle test */ + MOCK(scheduler_channel_doesnt_want_writes, + scheduler_channel_doesnt_want_writes_mock); + MOCK(scheduler_release_channel, + scheduler_release_channel_mock); + + /* Cache some initial counter values */ + init_doesnt_want_writes_count = test_doesnt_want_writes_count; + init_releases_count = test_releases_count; + + /* Accept cells to lower layer */ + test_chan_accept_cells = 1; + /* Use default overhead factor */ + test_overhead_estimate = 1.0f; + + ch1 = new_fake_channel(); + tt_assert(ch1); + /* Start it off in OPENING */ + ch1->state = CHANNEL_STATE_OPENING; + /* We'll need a cmux */ + ch1->cmux = circuitmux_alloc(); + + /* Try to register it */ + channel_register(ch1); + tt_assert(ch1->registered); + + /* Try to write a cell through (should queue) */ + cell = tor_malloc_zero(sizeof(cell_t)); + make_fake_cell(cell); + old_count = test_cells_written; + channel_write_cell(ch1, cell); + tt_int_op(old_count, ==, test_cells_written); + + /* Move it to OPEN and flush */ + channel_change_state(ch1, CHANNEL_STATE_OPEN); + + /* Queue should drain */ + tt_int_op(old_count + 1, ==, test_cells_written); + + /* Get another one */ + ch2 = new_fake_channel(); + tt_assert(ch2); + ch2->state = CHANNEL_STATE_OPENING; + ch2->cmux = circuitmux_alloc(); + + /* Register */ + channel_register(ch2); + tt_assert(ch2->registered); + + /* Check counters */ + tt_int_op(test_doesnt_want_writes_count, ==, init_doesnt_want_writes_count); + tt_int_op(test_releases_count, ==, init_releases_count); + + /* Move ch1 to MAINT */ + channel_change_state(ch1, CHANNEL_STATE_MAINT); + tt_int_op(test_doesnt_want_writes_count, ==, + init_doesnt_want_writes_count + 1); + tt_int_op(test_releases_count, ==, init_releases_count); + + /* Move ch2 to OPEN */ + channel_change_state(ch2, CHANNEL_STATE_OPEN); + tt_int_op(test_doesnt_want_writes_count, ==, + init_doesnt_want_writes_count + 1); + tt_int_op(test_releases_count, ==, init_releases_count); + + /* Move ch1 back to OPEN */ + channel_change_state(ch1, CHANNEL_STATE_OPEN); + tt_int_op(test_doesnt_want_writes_count, ==, + init_doesnt_want_writes_count + 1); + tt_int_op(test_releases_count, ==, init_releases_count); + + /* Mark ch2 for close */ + channel_mark_for_close(ch2); + tt_int_op(ch2->state, ==, CHANNEL_STATE_CLOSING); + tt_int_op(test_doesnt_want_writes_count, ==, + init_doesnt_want_writes_count + 1); + tt_int_op(test_releases_count, ==, init_releases_count + 1); + + /* Shut down channels */ + channel_free_all(); + ch1 = ch2 = NULL; + tt_int_op(test_doesnt_want_writes_count, ==, + init_doesnt_want_writes_count + 1); + /* channel_free() calls scheduler_release_channel() */ + tt_int_op(test_releases_count, ==, init_releases_count + 4); + + done: + free_fake_channel(ch1); + free_fake_channel(ch2); + + UNMOCK(scheduler_channel_doesnt_want_writes); + UNMOCK(scheduler_release_channel); + + return; +} + +/** + * Weird channel lifecycle test: + * + * OPENING->CLOSING->CLOSED + * OPENING->OPEN->CLOSING->ERROR + * OPENING->OPEN->MAINT->CLOSING->CLOSED + * OPENING->OPEN->MAINT->CLOSING->ERROR + */ + +static void +test_channel_lifecycle_2(void *arg) +{ + channel_t *ch = NULL; + + (void)arg; + + /* Mock these for the whole lifecycle test */ + MOCK(scheduler_channel_doesnt_want_writes, + scheduler_channel_doesnt_want_writes_mock); + MOCK(scheduler_release_channel, + scheduler_release_channel_mock); + + /* Accept cells to lower layer */ + test_chan_accept_cells = 1; + /* Use default overhead factor */ + test_overhead_estimate = 1.0f; + + ch = new_fake_channel(); + tt_assert(ch); + /* Start it off in OPENING */ + ch->state = CHANNEL_STATE_OPENING; + /* The full lifecycle test needs a cmux */ + ch->cmux = circuitmux_alloc(); + + /* Try to register it */ + channel_register(ch); + tt_assert(ch->registered); + + /* Try to close it */ + channel_mark_for_close(ch); + tt_int_op(ch->state, ==, CHANNEL_STATE_CLOSING); + + /* Finish closing it */ + chan_test_finish_close(ch); + tt_int_op(ch->state, ==, CHANNEL_STATE_CLOSED); + channel_run_cleanup(); + ch = NULL; + + /* Now try OPENING->OPEN->CLOSING->ERROR */ + ch = new_fake_channel(); + tt_assert(ch); + ch->state = CHANNEL_STATE_OPENING; + ch->cmux = circuitmux_alloc(); + channel_register(ch); + tt_assert(ch->registered); + + /* Finish opening it */ + channel_change_state(ch, CHANNEL_STATE_OPEN); + + /* Error exit from lower layer */ + chan_test_error(ch); + tt_int_op(ch->state, ==, CHANNEL_STATE_CLOSING); + chan_test_finish_close(ch); + tt_int_op(ch->state, ==, CHANNEL_STATE_ERROR); + channel_run_cleanup(); + ch = NULL; + + /* OPENING->OPEN->MAINT->CLOSING->CLOSED close from maintenance state */ + ch = new_fake_channel(); + tt_assert(ch); + ch->state = CHANNEL_STATE_OPENING; + ch->cmux = circuitmux_alloc(); + channel_register(ch); + tt_assert(ch->registered); + + /* Finish opening it */ + channel_change_state(ch, CHANNEL_STATE_OPEN); + tt_int_op(ch->state, ==, CHANNEL_STATE_OPEN); + + /* Go to maintenance state */ + channel_change_state(ch, CHANNEL_STATE_MAINT); + tt_int_op(ch->state, ==, CHANNEL_STATE_MAINT); + + /* Lower layer close */ + channel_mark_for_close(ch); + tt_int_op(ch->state, ==, CHANNEL_STATE_CLOSING); + + /* Finish */ + chan_test_finish_close(ch); + tt_int_op(ch->state, ==, CHANNEL_STATE_CLOSED); + channel_run_cleanup(); + ch = NULL; + + /* + * OPENING->OPEN->MAINT->CLOSING->CLOSED lower-layer close during + * maintenance state + */ + ch = new_fake_channel(); + tt_assert(ch); + ch->state = CHANNEL_STATE_OPENING; + ch->cmux = circuitmux_alloc(); + channel_register(ch); + tt_assert(ch->registered); + + /* Finish opening it */ + channel_change_state(ch, CHANNEL_STATE_OPEN); + tt_int_op(ch->state, ==, CHANNEL_STATE_OPEN); + + /* Go to maintenance state */ + channel_change_state(ch, CHANNEL_STATE_MAINT); + tt_int_op(ch->state, ==, CHANNEL_STATE_MAINT); + + /* Lower layer close */ + channel_close_from_lower_layer(ch); + tt_int_op(ch->state, ==, CHANNEL_STATE_CLOSING); + + /* Finish */ + chan_test_finish_close(ch); + tt_int_op(ch->state, ==, CHANNEL_STATE_CLOSED); + channel_run_cleanup(); + ch = NULL; + + /* OPENING->OPEN->MAINT->CLOSING->ERROR */ + ch = new_fake_channel(); + tt_assert(ch); + ch->state = CHANNEL_STATE_OPENING; + ch->cmux = circuitmux_alloc(); + channel_register(ch); + tt_assert(ch->registered); + + /* Finish opening it */ + channel_change_state(ch, CHANNEL_STATE_OPEN); + tt_int_op(ch->state, ==, CHANNEL_STATE_OPEN); + + /* Go to maintenance state */ + channel_change_state(ch, CHANNEL_STATE_MAINT); + tt_int_op(ch->state, ==, CHANNEL_STATE_MAINT); + + /* Lower layer close */ + chan_test_error(ch); + tt_int_op(ch->state, ==, CHANNEL_STATE_CLOSING); + + /* Finish */ + chan_test_finish_close(ch); + tt_int_op(ch->state, ==, CHANNEL_STATE_ERROR); + channel_run_cleanup(); + ch = NULL; + + /* Shut down channels */ + channel_free_all(); + + done: + tor_free(ch); + + UNMOCK(scheduler_channel_doesnt_want_writes); + UNMOCK(scheduler_release_channel); + + return; +} + +static void +test_channel_multi(void *arg) +{ + channel_t *ch1 = NULL, *ch2 = NULL; + uint64_t global_queue_estimate; + cell_t *cell = NULL; + + (void)arg; + + /* Accept cells to lower layer */ + test_chan_accept_cells = 1; + /* Use default overhead factor */ + test_overhead_estimate = 1.0f; + + ch1 = new_fake_channel(); + tt_assert(ch1); + ch2 = new_fake_channel(); + tt_assert(ch2); + + /* Initial queue size update */ + channel_update_xmit_queue_size(ch1); + tt_u64_op(ch1->bytes_queued_for_xmit, ==, 0); + channel_update_xmit_queue_size(ch2); + tt_u64_op(ch2->bytes_queued_for_xmit, ==, 0); + global_queue_estimate = channel_get_global_queue_estimate(); + tt_u64_op(global_queue_estimate, ==, 0); + + /* Queue some cells, check queue estimates */ + cell = tor_malloc_zero(sizeof(cell_t)); + make_fake_cell(cell); + channel_write_cell(ch1, cell); + + cell = tor_malloc_zero(sizeof(cell_t)); + make_fake_cell(cell); + channel_write_cell(ch2, cell); + + channel_update_xmit_queue_size(ch1); + channel_update_xmit_queue_size(ch2); + tt_u64_op(ch1->bytes_queued_for_xmit, ==, 0); + tt_u64_op(ch2->bytes_queued_for_xmit, ==, 0); + global_queue_estimate = channel_get_global_queue_estimate(); + tt_u64_op(global_queue_estimate, ==, 0); + + /* Stop accepting cells at lower layer */ + test_chan_accept_cells = 0; + + /* Queue some cells and check queue estimates */ + cell = tor_malloc_zero(sizeof(cell_t)); + make_fake_cell(cell); + channel_write_cell(ch1, cell); + + channel_update_xmit_queue_size(ch1); + tt_u64_op(ch1->bytes_queued_for_xmit, ==, 512); + global_queue_estimate = channel_get_global_queue_estimate(); + tt_u64_op(global_queue_estimate, ==, 512); + + cell = tor_malloc_zero(sizeof(cell_t)); + make_fake_cell(cell); + channel_write_cell(ch2, cell); + + channel_update_xmit_queue_size(ch2); + tt_u64_op(ch2->bytes_queued_for_xmit, ==, 512); + global_queue_estimate = channel_get_global_queue_estimate(); + tt_u64_op(global_queue_estimate, ==, 1024); + + /* Allow cells through again */ + test_chan_accept_cells = 1; + + /* Flush chan 2 */ + channel_flush_cells(ch2); + + /* Update and check queue sizes */ + channel_update_xmit_queue_size(ch1); + channel_update_xmit_queue_size(ch2); + tt_u64_op(ch1->bytes_queued_for_xmit, ==, 512); + tt_u64_op(ch2->bytes_queued_for_xmit, ==, 0); + global_queue_estimate = channel_get_global_queue_estimate(); + tt_u64_op(global_queue_estimate, ==, 512); + + /* Flush chan 1 */ + channel_flush_cells(ch1); + + /* Update and check queue sizes */ + channel_update_xmit_queue_size(ch1); + channel_update_xmit_queue_size(ch2); + tt_u64_op(ch1->bytes_queued_for_xmit, ==, 0); + tt_u64_op(ch2->bytes_queued_for_xmit, ==, 0); + global_queue_estimate = channel_get_global_queue_estimate(); + tt_u64_op(global_queue_estimate, ==, 0); + + /* Now block again */ + test_chan_accept_cells = 0; + + /* Queue some cells */ + cell = tor_malloc_zero(sizeof(cell_t)); + make_fake_cell(cell); + channel_write_cell(ch1, cell); + + cell = tor_malloc_zero(sizeof(cell_t)); + make_fake_cell(cell); + channel_write_cell(ch2, cell); + cell = NULL; + + /* Check the estimates */ + channel_update_xmit_queue_size(ch1); + channel_update_xmit_queue_size(ch2); + tt_u64_op(ch1->bytes_queued_for_xmit, ==, 512); + tt_u64_op(ch2->bytes_queued_for_xmit, ==, 512); + global_queue_estimate = channel_get_global_queue_estimate(); + tt_u64_op(global_queue_estimate, ==, 1024); + + /* Now close channel 2; it should be subtracted from the global queue */ + MOCK(scheduler_release_channel, scheduler_release_channel_mock); + channel_mark_for_close(ch2); + UNMOCK(scheduler_release_channel); + + global_queue_estimate = channel_get_global_queue_estimate(); + tt_u64_op(global_queue_estimate, ==, 512); + + /* + * Since the fake channels aren't registered, channel_free_all() can't + * see them properly. + */ + MOCK(scheduler_release_channel, scheduler_release_channel_mock); + channel_mark_for_close(ch1); + UNMOCK(scheduler_release_channel); + + global_queue_estimate = channel_get_global_queue_estimate(); + tt_u64_op(global_queue_estimate, ==, 0); + + /* Now free everything */ + MOCK(scheduler_release_channel, scheduler_release_channel_mock); + channel_free_all(); + UNMOCK(scheduler_release_channel); + + done: + free_fake_channel(ch1); + free_fake_channel(ch2); + + return; +} + +/** + * Check some hopefully-impossible edge cases in the channel queue we + * can only trigger by doing evil things to the queue directly. + */ + +static void +test_channel_queue_impossible(void *arg) +{ + channel_t *ch = NULL; + cell_t *cell = NULL; + packed_cell_t *packed_cell = NULL; + var_cell_t *var_cell = NULL; + int old_count; + cell_queue_entry_t *q = NULL; + uint64_t global_queue_estimate; + uintptr_t cellintptr; + + /* Cache the global queue size (see below) */ + global_queue_estimate = channel_get_global_queue_estimate(); + + (void)arg; + +#ifdef ENABLE_MEMPOOLS + init_cell_pool(); +#endif /* ENABLE_MEMPOOLS */ + + ch = new_fake_channel(); + tt_assert(ch); + + /* We test queueing here; tell it not to accept cells */ + test_chan_accept_cells = 0; + /* ...and keep it from trying to flush the queue */ + ch->state = CHANNEL_STATE_MAINT; + + /* Cache the cell written count */ + old_count = test_cells_written; + + /* Assert that the queue is initially empty */ + tt_int_op(chan_cell_queue_len(&(ch->outgoing_queue)), ==, 0); + + /* Get a fresh cell and write it to the channel*/ + cell = tor_malloc_zero(sizeof(cell_t)); + make_fake_cell(cell); + cellintptr = (uintptr_t)(void*)cell; + channel_write_cell(ch, cell); + + /* Now it should be queued */ + tt_int_op(chan_cell_queue_len(&(ch->outgoing_queue)), ==, 1); + q = TOR_SIMPLEQ_FIRST(&(ch->outgoing_queue)); + tt_assert(q); + if (q) { + tt_int_op(q->type, ==, CELL_QUEUE_FIXED); + tt_assert((uintptr_t)q->u.fixed.cell == cellintptr); + } + /* Do perverse things to it */ + tor_free(q->u.fixed.cell); + q->u.fixed.cell = NULL; + + /* + * Now change back to open with channel_change_state() and assert that it + * gets thrown away properly. + */ + test_chan_accept_cells = 1; + channel_change_state(ch, CHANNEL_STATE_OPEN); + tt_assert(test_cells_written == old_count); + tt_int_op(chan_cell_queue_len(&(ch->outgoing_queue)), ==, 0); + + /* Same thing but for a var_cell */ + + test_chan_accept_cells = 0; + ch->state = CHANNEL_STATE_MAINT; + var_cell = tor_malloc_zero(sizeof(var_cell_t) + CELL_PAYLOAD_SIZE); + make_fake_var_cell(var_cell); + cellintptr = (uintptr_t)(void*)var_cell; + channel_write_var_cell(ch, var_cell); + + /* Check that it's queued */ + tt_int_op(chan_cell_queue_len(&(ch->outgoing_queue)), ==, 1); + q = TOR_SIMPLEQ_FIRST(&(ch->outgoing_queue)); + tt_assert(q); + if (q) { + tt_int_op(q->type, ==, CELL_QUEUE_VAR); + tt_assert((uintptr_t)q->u.var.var_cell == cellintptr); + } + + /* Remove the cell from the queue entry */ + tor_free(q->u.var.var_cell); + q->u.var.var_cell = NULL; + + /* Let it drain and check that the bad entry is discarded */ + test_chan_accept_cells = 1; + channel_change_state(ch, CHANNEL_STATE_OPEN); + tt_assert(test_cells_written == old_count); + tt_int_op(chan_cell_queue_len(&(ch->outgoing_queue)), ==, 0); + + /* Same thing with a packed_cell */ + + test_chan_accept_cells = 0; + ch->state = CHANNEL_STATE_MAINT; + packed_cell = packed_cell_new(); + tt_assert(packed_cell); + cellintptr = (uintptr_t)(void*)packed_cell; + channel_write_packed_cell(ch, packed_cell); + + /* Check that it's queued */ + tt_int_op(chan_cell_queue_len(&(ch->outgoing_queue)), ==, 1); + q = TOR_SIMPLEQ_FIRST(&(ch->outgoing_queue)); + tt_assert(q); + if (q) { + tt_int_op(q->type, ==, CELL_QUEUE_PACKED); + tt_assert((uintptr_t)q->u.packed.packed_cell == cellintptr); + } + + /* Remove the cell from the queue entry */ + packed_cell_free(q->u.packed.packed_cell); + q->u.packed.packed_cell = NULL; + + /* Let it drain and check that the bad entry is discarded */ + test_chan_accept_cells = 1; + channel_change_state(ch, CHANNEL_STATE_OPEN); + tt_assert(test_cells_written == old_count); + tt_int_op(chan_cell_queue_len(&(ch->outgoing_queue)), ==, 0); + + /* Unknown cell type case */ + test_chan_accept_cells = 0; + ch->state = CHANNEL_STATE_MAINT; + cell = tor_malloc_zero(sizeof(cell_t)); + make_fake_cell(cell); + cellintptr = (uintptr_t)(void*)cell; + channel_write_cell(ch, cell); + + /* Check that it's queued */ + tt_int_op(chan_cell_queue_len(&(ch->outgoing_queue)), ==, 1); + q = TOR_SIMPLEQ_FIRST(&(ch->outgoing_queue)); + tt_assert(q); + if (q) { + tt_int_op(q->type, ==, CELL_QUEUE_FIXED); + tt_assert((uintptr_t)q->u.fixed.cell == cellintptr); + } + /* Clobber it, including the queue entry type */ + tor_free(q->u.fixed.cell); + q->u.fixed.cell = NULL; + q->type = CELL_QUEUE_PACKED + 1; + + /* Let it drain and check that the bad entry is discarded */ + test_chan_accept_cells = 1; + channel_change_state(ch, CHANNEL_STATE_OPEN); + tt_assert(test_cells_written == old_count); + tt_int_op(chan_cell_queue_len(&(ch->outgoing_queue)), ==, 0); + + done: + free_fake_channel(ch); +#ifdef ENABLE_MEMPOOLS + free_cell_pool(); +#endif /* ENABLE_MEMPOOLS */ + + /* + * Doing that meant that we couldn't correctly adjust the queue size + * for the var cell, so manually reset the global queue size estimate + * so the next test doesn't break if we run with --no-fork. + */ + estimated_total_queue_size = global_queue_estimate; + + return; +} + +static void +test_channel_queue_size(void *arg) +{ + channel_t *ch = NULL; + cell_t *cell = NULL; + int n, old_count; + uint64_t global_queue_estimate; + + (void)arg; + + ch = new_fake_channel(); + tt_assert(ch); + + /* Initial queue size update */ + channel_update_xmit_queue_size(ch); + tt_u64_op(ch->bytes_queued_for_xmit, ==, 0); + global_queue_estimate = channel_get_global_queue_estimate(); + tt_u64_op(global_queue_estimate, ==, 0); + + /* Test the call-through to our fake lower layer */ + n = channel_num_cells_writeable(ch); + /* chan_test_num_cells_writeable() always returns 32 */ + tt_int_op(n, ==, 32); + + /* + * Now we queue some cells and check that channel_num_cells_writeable() + * adjusts properly + */ + + /* tell it not to accept cells */ + test_chan_accept_cells = 0; + /* ...and keep it from trying to flush the queue */ + ch->state = CHANNEL_STATE_MAINT; + + /* Get a fresh cell */ + cell = tor_malloc_zero(sizeof(cell_t)); + make_fake_cell(cell); + + old_count = test_cells_written; + channel_write_cell(ch, cell); + /* Assert that it got queued, not written through, correctly */ + tt_int_op(test_cells_written, ==, old_count); + + /* Now check chan_test_num_cells_writeable() again */ + n = channel_num_cells_writeable(ch); + tt_int_op(n, ==, 0); /* Should return 0 since we're in CHANNEL_STATE_MAINT */ + + /* Update queue size estimates */ + channel_update_xmit_queue_size(ch); + /* One cell, times an overhead factor of 1.0 */ + tt_u64_op(ch->bytes_queued_for_xmit, ==, 512); + /* Try a different overhead factor */ + test_overhead_estimate = 0.5f; + /* This one should be ignored since it's below 1.0 */ + channel_update_xmit_queue_size(ch); + tt_u64_op(ch->bytes_queued_for_xmit, ==, 512); + /* Now try a larger one */ + test_overhead_estimate = 2.0f; + channel_update_xmit_queue_size(ch); + tt_u64_op(ch->bytes_queued_for_xmit, ==, 1024); + /* Go back to 1.0 */ + test_overhead_estimate = 1.0f; + channel_update_xmit_queue_size(ch); + tt_u64_op(ch->bytes_queued_for_xmit, ==, 512); + /* Check the global estimate too */ + global_queue_estimate = channel_get_global_queue_estimate(); + tt_u64_op(global_queue_estimate, ==, 512); + + /* Go to open */ + old_count = test_cells_written; + channel_change_state(ch, CHANNEL_STATE_OPEN); + + /* + * It should try to write, but we aren't accepting cells right now, so + * it'll requeue + */ + tt_int_op(test_cells_written, ==, old_count); + + /* Check the queue size again */ + channel_update_xmit_queue_size(ch); + tt_u64_op(ch->bytes_queued_for_xmit, ==, 512); + global_queue_estimate = channel_get_global_queue_estimate(); + tt_u64_op(global_queue_estimate, ==, 512); + + /* + * Now the cell is in the queue, and we're open, so we should get 31 + * writeable cells. + */ + n = channel_num_cells_writeable(ch); + tt_int_op(n, ==, 31); + + /* Accept cells again */ + test_chan_accept_cells = 1; + /* ...and re-process the queue */ + old_count = test_cells_written; + channel_flush_cells(ch); + tt_int_op(test_cells_written, ==, old_count + 1); + + /* Should have 32 writeable now */ + n = channel_num_cells_writeable(ch); + tt_int_op(n, ==, 32); + + /* Should have queue size estimate of zero */ + channel_update_xmit_queue_size(ch); + tt_u64_op(ch->bytes_queued_for_xmit, ==, 0); + global_queue_estimate = channel_get_global_queue_estimate(); + tt_u64_op(global_queue_estimate, ==, 0); + + /* Okay, now we're done with this one */ + MOCK(scheduler_release_channel, scheduler_release_channel_mock); + channel_mark_for_close(ch); + UNMOCK(scheduler_release_channel); + + done: + free_fake_channel(ch); + + return; +} + +static void +test_channel_write(void *arg) +{ + channel_t *ch = NULL; + cell_t *cell = tor_malloc_zero(sizeof(cell_t)); + packed_cell_t *packed_cell = NULL; + var_cell_t *var_cell = + tor_malloc_zero(sizeof(var_cell_t) + CELL_PAYLOAD_SIZE); + int old_count; + + (void)arg; + +#ifdef ENABLE_MEMPOOLS + init_cell_pool(); +#endif /* ENABLE_MEMPOOLS */ + + packed_cell = packed_cell_new(); + tt_assert(packed_cell); + + ch = new_fake_channel(); + tt_assert(ch); + make_fake_cell(cell); + make_fake_var_cell(var_cell); + + /* Tell it to accept cells */ + test_chan_accept_cells = 1; + + old_count = test_cells_written; + channel_write_cell(ch, cell); + cell = NULL; + tt_assert(test_cells_written == old_count + 1); + + channel_write_var_cell(ch, var_cell); + var_cell = NULL; + tt_assert(test_cells_written == old_count + 2); + + channel_write_packed_cell(ch, packed_cell); + packed_cell = NULL; + tt_assert(test_cells_written == old_count + 3); + + /* Now we test queueing; tell it not to accept cells */ + test_chan_accept_cells = 0; + /* ...and keep it from trying to flush the queue */ + ch->state = CHANNEL_STATE_MAINT; + + /* Get a fresh cell */ + cell = tor_malloc_zero(sizeof(cell_t)); + make_fake_cell(cell); + + old_count = test_cells_written; + channel_write_cell(ch, cell); + tt_assert(test_cells_written == old_count); + + /* + * Now change back to open with channel_change_state() and assert that it + * gets drained from the queue. + */ + test_chan_accept_cells = 1; + channel_change_state(ch, CHANNEL_STATE_OPEN); + tt_assert(test_cells_written == old_count + 1); + + /* + * Check the note destroy case + */ + cell = tor_malloc_zero(sizeof(cell_t)); + make_fake_cell(cell); + cell->command = CELL_DESTROY; + + /* Set up the mock */ + MOCK(channel_note_destroy_not_pending, + channel_note_destroy_not_pending_mock); + + old_count = test_destroy_not_pending_calls; + channel_write_cell(ch, cell); + tt_assert(test_destroy_not_pending_calls == old_count + 1); + + /* Now send a non-destroy and check we don't call it */ + cell = tor_malloc_zero(sizeof(cell_t)); + make_fake_cell(cell); + channel_write_cell(ch, cell); + tt_assert(test_destroy_not_pending_calls == old_count + 1); + + UNMOCK(channel_note_destroy_not_pending); + + /* + * Now switch it to CLOSING so we can test the discard-cells case + * in the channel_write_*() functions. + */ + MOCK(scheduler_release_channel, scheduler_release_channel_mock); + channel_mark_for_close(ch); + UNMOCK(scheduler_release_channel); + + /* Send cells that will drop in the closing state */ + old_count = test_cells_written; + + cell = tor_malloc_zero(sizeof(cell_t)); + make_fake_cell(cell); + channel_write_cell(ch, cell); + cell = NULL; + tt_assert(test_cells_written == old_count); + + var_cell = tor_malloc_zero(sizeof(var_cell_t) + CELL_PAYLOAD_SIZE); + make_fake_var_cell(var_cell); + channel_write_var_cell(ch, var_cell); + var_cell = NULL; + tt_assert(test_cells_written == old_count); + + packed_cell = packed_cell_new(); + channel_write_packed_cell(ch, packed_cell); + packed_cell = NULL; + tt_assert(test_cells_written == old_count); + +#ifdef ENABLE_MEMPOOLS + free_cell_pool(); +#endif /* ENABLE_MEMPOOLS */ + + done: + free_fake_channel(ch); + tor_free(var_cell); + tor_free(cell); + packed_cell_free(packed_cell); + return; +} + +struct testcase_t channel_tests[] = { + { "dumpstats", test_channel_dumpstats, TT_FORK, NULL, NULL }, + { "flush", test_channel_flush, TT_FORK, NULL, NULL }, + { "flushmux", test_channel_flushmux, TT_FORK, NULL, NULL }, + { "incoming", test_channel_incoming, TT_FORK, NULL, NULL }, + { "lifecycle", test_channel_lifecycle, TT_FORK, NULL, NULL }, + { "lifecycle_2", test_channel_lifecycle_2, TT_FORK, NULL, NULL }, + { "multi", test_channel_multi, TT_FORK, NULL, NULL }, + { "queue_impossible", test_channel_queue_impossible, TT_FORK, NULL, NULL }, + { "queue_size", test_channel_queue_size, TT_FORK, NULL, NULL }, + { "write", test_channel_write, TT_FORK, NULL, NULL }, + END_OF_TESTCASES +}; + diff --git a/src/test/test_channeltls.c b/src/test/test_channeltls.c new file mode 100644 index 0000000000..016e504ab3 --- /dev/null +++ b/src/test/test_channeltls.c @@ -0,0 +1,333 @@ +/* Copyright (c) 2014-2015, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include <math.h> + +#define TOR_CHANNEL_INTERNAL_ +#include "or.h" +#include "address.h" +#include "buffers.h" +#include "channel.h" +#include "channeltls.h" +#include "connection_or.h" +#include "config.h" +/* For init/free stuff */ +#include "scheduler.h" +#include "tortls.h" + +/* Test suite stuff */ +#include "test.h" +#include "fakechans.h" + +/* The channeltls unit tests */ +static void test_channeltls_create(void *arg); +static void test_channeltls_num_bytes_queued(void *arg); +static void test_channeltls_overhead_estimate(void *arg); + +/* Mocks used by channeltls unit tests */ +static size_t tlschan_buf_datalen_mock(const buf_t *buf); +static or_connection_t * tlschan_connection_or_connect_mock( + const tor_addr_t *addr, + uint16_t port, + const char *digest, + channel_tls_t *tlschan); +static int tlschan_is_local_addr_mock(const tor_addr_t *addr); + +/* Fake close method */ +static void tlschan_fake_close_method(channel_t *chan); + +/* Flags controlling behavior of channeltls unit test mocks */ +static int tlschan_local = 0; +static const buf_t * tlschan_buf_datalen_mock_target = NULL; +static size_t tlschan_buf_datalen_mock_size = 0; + +/* Thing to cast to fake tor_tls_t * to appease assert_connection_ok() */ +static int fake_tortls = 0; /* Bleh... */ + +static void +test_channeltls_create(void *arg) +{ + tor_addr_t test_addr; + channel_t *ch = NULL; + const char test_digest[DIGEST_LEN] = { + 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, + 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14 }; + + (void)arg; + + /* Set up a fake address to fake-connect to */ + test_addr.family = AF_INET; + test_addr.addr.in_addr.s_addr = htonl(0x01020304); + + /* For this test we always want the address to be treated as non-local */ + tlschan_local = 0; + /* Install is_local_addr() mock */ + MOCK(is_local_addr, tlschan_is_local_addr_mock); + + /* Install mock for connection_or_connect() */ + MOCK(connection_or_connect, tlschan_connection_or_connect_mock); + + /* Try connecting */ + ch = channel_tls_connect(&test_addr, 567, test_digest); + tt_assert(ch != NULL); + + done: + if (ch) { + MOCK(scheduler_release_channel, scheduler_release_channel_mock); + /* + * Use fake close method that doesn't try to do too much to fake + * orconn + */ + ch->close = tlschan_fake_close_method; + channel_mark_for_close(ch); + free_fake_channel(ch); + UNMOCK(scheduler_release_channel); + } + + UNMOCK(connection_or_connect); + UNMOCK(is_local_addr); + + return; +} + +static void +test_channeltls_num_bytes_queued(void *arg) +{ + tor_addr_t test_addr; + channel_t *ch = NULL; + const char test_digest[DIGEST_LEN] = { + 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, + 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14 }; + channel_tls_t *tlschan = NULL; + size_t len; + int fake_outbuf = 0, n; + + (void)arg; + + /* Set up a fake address to fake-connect to */ + test_addr.family = AF_INET; + test_addr.addr.in_addr.s_addr = htonl(0x01020304); + + /* For this test we always want the address to be treated as non-local */ + tlschan_local = 0; + /* Install is_local_addr() mock */ + MOCK(is_local_addr, tlschan_is_local_addr_mock); + + /* Install mock for connection_or_connect() */ + MOCK(connection_or_connect, tlschan_connection_or_connect_mock); + + /* Try connecting */ + ch = channel_tls_connect(&test_addr, 567, test_digest); + tt_assert(ch != NULL); + + /* + * Next, we have to test ch->num_bytes_queued, which is + * channel_tls_num_bytes_queued_method. We can't mock + * connection_get_outbuf_len() directly because it's static INLINE + * in connection.h, but we can mock buf_datalen(). Note that + * if bufferevents ever work, this will break with them enabled. + */ + + tt_assert(ch->num_bytes_queued != NULL); + tlschan = BASE_CHAN_TO_TLS(ch); + tt_assert(tlschan != NULL); + if (TO_CONN(tlschan->conn)->outbuf == NULL) { + /* We need an outbuf to make sure buf_datalen() gets called */ + fake_outbuf = 1; + TO_CONN(tlschan->conn)->outbuf = buf_new(); + } + tlschan_buf_datalen_mock_target = TO_CONN(tlschan->conn)->outbuf; + tlschan_buf_datalen_mock_size = 1024; + MOCK(buf_datalen, tlschan_buf_datalen_mock); + len = ch->num_bytes_queued(ch); + tt_int_op(len, ==, tlschan_buf_datalen_mock_size); + /* + * We also cover num_cells_writeable here; since wide_circ_ids = 0 on + * the fake tlschans, cell_network_size returns 512, and so with + * tlschan_buf_datalen_mock_size == 1024, we should be able to write + * ceil((OR_CONN_HIGHWATER - 1024) / 512) = ceil(OR_CONN_HIGHWATER / 512) + * - 2 cells. + */ + n = ch->num_cells_writeable(ch); + tt_int_op(n, ==, CEIL_DIV(OR_CONN_HIGHWATER, 512) - 2); + UNMOCK(buf_datalen); + tlschan_buf_datalen_mock_target = NULL; + tlschan_buf_datalen_mock_size = 0; + if (fake_outbuf) { + buf_free(TO_CONN(tlschan->conn)->outbuf); + TO_CONN(tlschan->conn)->outbuf = NULL; + } + + done: + if (ch) { + MOCK(scheduler_release_channel, scheduler_release_channel_mock); + /* + * Use fake close method that doesn't try to do too much to fake + * orconn + */ + ch->close = tlschan_fake_close_method; + channel_mark_for_close(ch); + free_fake_channel(ch); + UNMOCK(scheduler_release_channel); + } + + UNMOCK(connection_or_connect); + UNMOCK(is_local_addr); + + return; +} + +static void +test_channeltls_overhead_estimate(void *arg) +{ + tor_addr_t test_addr; + channel_t *ch = NULL; + const char test_digest[DIGEST_LEN] = { + 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, + 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14 }; + float r; + channel_tls_t *tlschan = NULL; + + (void)arg; + + /* Set up a fake address to fake-connect to */ + test_addr.family = AF_INET; + test_addr.addr.in_addr.s_addr = htonl(0x01020304); + + /* For this test we always want the address to be treated as non-local */ + tlschan_local = 0; + /* Install is_local_addr() mock */ + MOCK(is_local_addr, tlschan_is_local_addr_mock); + + /* Install mock for connection_or_connect() */ + MOCK(connection_or_connect, tlschan_connection_or_connect_mock); + + /* Try connecting */ + ch = channel_tls_connect(&test_addr, 567, test_digest); + tt_assert(ch != NULL); + + /* First case: silly low ratios should get clamped to 1.0f */ + tlschan = BASE_CHAN_TO_TLS(ch); + tt_assert(tlschan != NULL); + tlschan->conn->bytes_xmitted = 128; + tlschan->conn->bytes_xmitted_by_tls = 64; + r = ch->get_overhead_estimate(ch); + tt_assert(fabsf(r - 1.0f) < 1E-12); + + tlschan->conn->bytes_xmitted_by_tls = 127; + r = ch->get_overhead_estimate(ch); + tt_assert(fabsf(r - 1.0f) < 1E-12); + + /* Now middle of the range */ + tlschan->conn->bytes_xmitted_by_tls = 192; + r = ch->get_overhead_estimate(ch); + tt_assert(fabsf(r - 1.5f) < 1E-12); + + /* Now above the 2.0f clamp */ + tlschan->conn->bytes_xmitted_by_tls = 257; + r = ch->get_overhead_estimate(ch); + tt_assert(fabsf(r - 2.0f) < 1E-12); + + tlschan->conn->bytes_xmitted_by_tls = 512; + r = ch->get_overhead_estimate(ch); + tt_assert(fabsf(r - 2.0f) < 1E-12); + + done: + if (ch) { + MOCK(scheduler_release_channel, scheduler_release_channel_mock); + /* + * Use fake close method that doesn't try to do too much to fake + * orconn + */ + ch->close = tlschan_fake_close_method; + channel_mark_for_close(ch); + free_fake_channel(ch); + UNMOCK(scheduler_release_channel); + } + + UNMOCK(connection_or_connect); + UNMOCK(is_local_addr); + + return; +} + +static size_t +tlschan_buf_datalen_mock(const buf_t *buf) +{ + if (buf != NULL && buf == tlschan_buf_datalen_mock_target) { + return tlschan_buf_datalen_mock_size; + } else { + return buf_datalen__real(buf); + } +} + +static or_connection_t * +tlschan_connection_or_connect_mock(const tor_addr_t *addr, + uint16_t port, + const char *digest, + channel_tls_t *tlschan) +{ + or_connection_t *result = NULL; + + tt_assert(addr != NULL); + tt_assert(port != 0); + tt_assert(digest != NULL); + tt_assert(tlschan != NULL); + + /* Make a fake orconn */ + result = tor_malloc_zero(sizeof(*result)); + result->base_.magic = OR_CONNECTION_MAGIC; + result->base_.state = OR_CONN_STATE_OPEN; + result->base_.type = CONN_TYPE_OR; + result->base_.socket_family = addr->family; + result->base_.address = tor_strdup("<fake>"); + memcpy(&(result->base_.addr), addr, sizeof(tor_addr_t)); + result->base_.port = port; + memcpy(result->identity_digest, digest, DIGEST_LEN); + result->chan = tlschan; + memcpy(&(result->real_addr), addr, sizeof(tor_addr_t)); + result->tls = (tor_tls_t *)((void *)(&fake_tortls)); + + done: + return result; +} + +static void +tlschan_fake_close_method(channel_t *chan) +{ + channel_tls_t *tlschan = NULL; + + tt_assert(chan != NULL); + tt_int_op(chan->magic, ==, TLS_CHAN_MAGIC); + + tlschan = BASE_CHAN_TO_TLS(chan); + tt_assert(tlschan != NULL); + + /* Just free the fake orconn */ + tor_free(tlschan->conn->base_.address); + tor_free(tlschan->conn); + + channel_closed(chan); + + done: + return; +} + +static int +tlschan_is_local_addr_mock(const tor_addr_t *addr) +{ + tt_assert(addr != NULL); + + done: + return tlschan_local; +} + +struct testcase_t channeltls_tests[] = { + { "create", test_channeltls_create, TT_FORK, NULL, NULL }, + { "num_bytes_queued", test_channeltls_num_bytes_queued, + TT_FORK, NULL, NULL }, + { "overhead_estimate", test_channeltls_overhead_estimate, + TT_FORK, NULL, NULL }, + END_OF_TESTCASES +}; + diff --git a/src/test/test_checkdir.c b/src/test/test_checkdir.c index 185e5fbef1..ae859449cb 100644 --- a/src/test/test_checkdir.c +++ b/src/test/test_checkdir.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014, The Tor Project, Inc. */ +/* Copyright (c) 2014-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" @@ -10,6 +10,10 @@ #ifdef _WIN32 #define mkdir(a,b) mkdir(a) +#define tt_int_op_nowin(a,op,b) do { (void)(a); (void)(b); } while (0) +#define umask(mask) ((void)0) +#else +#define tt_int_op_nowin(a,op,b) tt_int_op((a),op,(b)) #endif /** Run unit tests for private dir permission enforcement logic. */ @@ -19,50 +23,52 @@ test_checkdir_perms(void *testdata) (void)testdata; or_options_t *options = get_options_mutable(); const char *subdir = "test_checkdir"; - char *testdir; + char *testdir = NULL; cpd_check_t cpd_chkopts; cpd_check_t unix_create_opts; cpd_check_t unix_verify_optsmask; struct stat st; + umask(022); + /* setup data directory before tests. */ tor_free(options->DataDirectory); options->DataDirectory = tor_strdup(get_fname(subdir)); - tt_int_op(mkdir(options->DataDirectory, 0750), ==, 0); + tt_int_op(mkdir(options->DataDirectory, 0750), OP_EQ, 0); /* test: create new dir, no flags. */ testdir = get_datadir_fname("checkdir_new_none"); cpd_chkopts = CPD_CREATE; unix_verify_optsmask = 0077; - tt_int_op(0, ==, check_private_dir(testdir, cpd_chkopts, NULL)); - tt_int_op(0, ==, stat(testdir, &st)); - tt_int_op(0, ==, (st.st_mode & unix_verify_optsmask)); + tt_int_op(0, OP_EQ, check_private_dir(testdir, cpd_chkopts, NULL)); + tt_int_op(0, OP_EQ, stat(testdir, &st)); + tt_int_op_nowin(0, OP_EQ, (st.st_mode & unix_verify_optsmask)); tor_free(testdir); /* test: create new dir, CPD_GROUP_OK option set. */ testdir = get_datadir_fname("checkdir_new_groupok"); cpd_chkopts = CPD_CREATE|CPD_GROUP_OK; unix_verify_optsmask = 0077; - tt_int_op(0, ==, check_private_dir(testdir, cpd_chkopts, NULL)); - tt_int_op(0, ==, stat(testdir, &st)); - tt_int_op(0, ==, (st.st_mode & unix_verify_optsmask)); + tt_int_op(0, OP_EQ, check_private_dir(testdir, cpd_chkopts, NULL)); + tt_int_op(0, OP_EQ, stat(testdir, &st)); + tt_int_op_nowin(0, OP_EQ, (st.st_mode & unix_verify_optsmask)); tor_free(testdir); /* test: should get an error on existing dir with wrong perms */ testdir = get_datadir_fname("checkdir_new_groupok_err"); - tt_int_op(0, ==, mkdir(testdir, 027)); + tt_int_op(0, OP_EQ, mkdir(testdir, 027)); cpd_chkopts = CPD_CHECK_MODE_ONLY|CPD_CREATE|CPD_GROUP_OK; - tt_int_op(-1, ==, check_private_dir(testdir, cpd_chkopts, NULL)); + tt_int_op_nowin(-1, OP_EQ, check_private_dir(testdir, cpd_chkopts, NULL)); tor_free(testdir); /* test: create new dir, CPD_GROUP_READ option set. */ testdir = get_datadir_fname("checkdir_new_groupread"); cpd_chkopts = CPD_CREATE|CPD_GROUP_READ; unix_verify_optsmask = 0027; - tt_int_op(0, ==, check_private_dir(testdir, cpd_chkopts, NULL)); - tt_int_op(0, ==, stat(testdir, &st)); - tt_int_op(0, ==, (st.st_mode & unix_verify_optsmask)); + tt_int_op(0, OP_EQ, check_private_dir(testdir, cpd_chkopts, NULL)); + tt_int_op(0, OP_EQ, stat(testdir, &st)); + tt_int_op_nowin(0, OP_EQ, (st.st_mode & unix_verify_optsmask)); tor_free(testdir); /* test: check existing dir created with defaults, @@ -72,10 +78,10 @@ test_checkdir_perms(void *testdata) unix_create_opts = 0700; (void)unix_create_opts; unix_verify_optsmask = 0077; - tt_int_op(0, ==, mkdir(testdir, unix_create_opts)); - tt_int_op(0, ==, check_private_dir(testdir, cpd_chkopts, NULL)); - tt_int_op(0, ==, stat(testdir, &st)); - tt_int_op(0, ==, (st.st_mode & unix_verify_optsmask)); + tt_int_op(0, OP_EQ, mkdir(testdir, unix_create_opts)); + tt_int_op(0, OP_EQ, check_private_dir(testdir, cpd_chkopts, NULL)); + tt_int_op(0, OP_EQ, stat(testdir, &st)); + tt_int_op_nowin(0, OP_EQ, (st.st_mode & unix_verify_optsmask)); tor_free(testdir); /* test: check existing dir created with defaults, @@ -83,11 +89,11 @@ test_checkdir_perms(void *testdata) testdir = get_datadir_fname("checkdir_exists_groupok"); cpd_chkopts = CPD_CREATE; unix_verify_optsmask = 0077; - tt_int_op(0, ==, check_private_dir(testdir, cpd_chkopts, NULL)); + tt_int_op(0, OP_EQ, check_private_dir(testdir, cpd_chkopts, NULL)); cpd_chkopts = CPD_GROUP_OK; - tt_int_op(0, ==, check_private_dir(testdir, cpd_chkopts, NULL)); - tt_int_op(0, ==, stat(testdir, &st)); - tt_int_op(0, ==, (st.st_mode & unix_verify_optsmask)); + tt_int_op(0, OP_EQ, check_private_dir(testdir, cpd_chkopts, NULL)); + tt_int_op(0, OP_EQ, stat(testdir, &st)); + tt_int_op_nowin(0, OP_EQ, (st.st_mode & unix_verify_optsmask)); tor_free(testdir); /* test: check existing dir created with defaults, @@ -95,11 +101,11 @@ test_checkdir_perms(void *testdata) testdir = get_datadir_fname("checkdir_exists_groupread"); cpd_chkopts = CPD_CREATE; unix_verify_optsmask = 0027; - tt_int_op(0, ==, check_private_dir(testdir, cpd_chkopts, NULL)); + tt_int_op(0, OP_EQ, check_private_dir(testdir, cpd_chkopts, NULL)); cpd_chkopts = CPD_GROUP_READ; - tt_int_op(0, ==, check_private_dir(testdir, cpd_chkopts, NULL)); - tt_int_op(0, ==, stat(testdir, &st)); - tt_int_op(0, ==, (st.st_mode & unix_verify_optsmask)); + tt_int_op(0, OP_EQ, check_private_dir(testdir, cpd_chkopts, NULL)); + tt_int_op(0, OP_EQ, stat(testdir, &st)); + tt_int_op_nowin(0, OP_EQ, (st.st_mode & unix_verify_optsmask)); tor_free(testdir); /* test: check existing dir created with CPD_GROUP_READ, @@ -107,11 +113,11 @@ test_checkdir_perms(void *testdata) testdir = get_datadir_fname("checkdir_existsread_groupok"); cpd_chkopts = CPD_CREATE|CPD_GROUP_READ; unix_verify_optsmask = 0027; - tt_int_op(0, ==, check_private_dir(testdir, cpd_chkopts, NULL)); + tt_int_op(0, OP_EQ, check_private_dir(testdir, cpd_chkopts, NULL)); cpd_chkopts = CPD_GROUP_OK; - tt_int_op(0, ==, check_private_dir(testdir, cpd_chkopts, NULL)); - tt_int_op(0, ==, stat(testdir, &st)); - tt_int_op(0, ==, (st.st_mode & unix_verify_optsmask)); + tt_int_op(0, OP_EQ, check_private_dir(testdir, cpd_chkopts, NULL)); + tt_int_op(0, OP_EQ, stat(testdir, &st)); + tt_int_op_nowin(0, OP_EQ, (st.st_mode & unix_verify_optsmask)); tor_free(testdir); /* test: check existing dir created with CPD_GROUP_READ, @@ -119,20 +125,19 @@ test_checkdir_perms(void *testdata) testdir = get_datadir_fname("checkdir_existsread_groupread"); cpd_chkopts = CPD_CREATE|CPD_GROUP_READ; unix_verify_optsmask = 0027; - tt_int_op(0, ==, check_private_dir(testdir, cpd_chkopts, NULL)); - tt_int_op(0, ==, stat(testdir, &st)); - tt_int_op(0, ==, (st.st_mode & unix_verify_optsmask)); - tor_free(testdir); + tt_int_op(0, OP_EQ, check_private_dir(testdir, cpd_chkopts, NULL)); + tt_int_op(0, OP_EQ, stat(testdir, &st)); + tt_int_op_nowin(0, OP_EQ, (st.st_mode & unix_verify_optsmask)); - done: - ; + done: + tor_free(testdir); } #define CHECKDIR(name,flags) \ { #name, test_checkdir_##name, (flags), NULL, NULL } struct testcase_t checkdir_tests[] = { - CHECKDIR(perms, 0), + CHECKDIR(perms, TT_FORK), END_OF_TESTCASES }; diff --git a/src/test/test_circuitlist.c b/src/test/test_circuitlist.c index fb5488b627..0760accfc1 100644 --- a/src/test/test_circuitlist.c +++ b/src/test/test_circuitlist.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2014, The Tor Project, Inc. */ +/* Copyright (c) 2013-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define TOR_CHANNEL_INTERNAL_ @@ -50,17 +50,17 @@ circuitmux_detach_mock(circuitmux_t *cmux, circuit_t *circ) } #define GOT_CMUX_ATTACH(mux_, circ_, dir_) do { \ - tt_int_op(cam.ncalls, ==, 1); \ - tt_ptr_op(cam.cmux, ==, (mux_)); \ - tt_ptr_op(cam.circ, ==, (circ_)); \ - tt_int_op(cam.dir, ==, (dir_)); \ + tt_int_op(cam.ncalls, OP_EQ, 1); \ + tt_ptr_op(cam.cmux, OP_EQ, (mux_)); \ + tt_ptr_op(cam.circ, OP_EQ, (circ_)); \ + tt_int_op(cam.dir, OP_EQ, (dir_)); \ memset(&cam, 0, sizeof(cam)); \ } while (0) #define GOT_CMUX_DETACH(mux_, circ_) do { \ - tt_int_op(cdm.ncalls, ==, 1); \ - tt_ptr_op(cdm.cmux, ==, (mux_)); \ - tt_ptr_op(cdm.circ, ==, (circ_)); \ + tt_int_op(cdm.ncalls, OP_EQ, 1); \ + tt_ptr_op(cdm.cmux, OP_EQ, (mux_)); \ + tt_ptr_op(cdm.circ, OP_EQ, (circ_)); \ memset(&cdm, 0, sizeof(cdm)); \ } while (0) @@ -90,14 +90,14 @@ test_clist_maps(void *arg) or_c1 = or_circuit_new(100, ch2); tt_assert(or_c1); GOT_CMUX_ATTACH(ch2->cmux, or_c1, CELL_DIRECTION_IN); - tt_int_op(or_c1->p_circ_id, ==, 100); - tt_ptr_op(or_c1->p_chan, ==, ch2); + tt_int_op(or_c1->p_circ_id, OP_EQ, 100); + tt_ptr_op(or_c1->p_chan, OP_EQ, ch2); or_c2 = or_circuit_new(100, ch1); tt_assert(or_c2); GOT_CMUX_ATTACH(ch1->cmux, or_c2, CELL_DIRECTION_IN); - tt_int_op(or_c2->p_circ_id, ==, 100); - tt_ptr_op(or_c2->p_chan, ==, ch1); + tt_int_op(or_c2->p_circ_id, OP_EQ, 100); + tt_ptr_op(or_c2->p_chan, OP_EQ, ch1); circuit_set_n_circid_chan(TO_CIRCUIT(or_c1), 200, ch1); GOT_CMUX_ATTACH(ch1->cmux, or_c1, CELL_DIRECTION_OUT); @@ -105,11 +105,11 @@ test_clist_maps(void *arg) circuit_set_n_circid_chan(TO_CIRCUIT(or_c2), 200, ch2); GOT_CMUX_ATTACH(ch2->cmux, or_c2, CELL_DIRECTION_OUT); - tt_ptr_op(circuit_get_by_circid_channel(200, ch1), ==, TO_CIRCUIT(or_c1)); - tt_ptr_op(circuit_get_by_circid_channel(200, ch2), ==, TO_CIRCUIT(or_c2)); - tt_ptr_op(circuit_get_by_circid_channel(100, ch2), ==, TO_CIRCUIT(or_c1)); + tt_ptr_op(circuit_get_by_circid_channel(200, ch1), OP_EQ, TO_CIRCUIT(or_c1)); + tt_ptr_op(circuit_get_by_circid_channel(200, ch2), OP_EQ, TO_CIRCUIT(or_c2)); + tt_ptr_op(circuit_get_by_circid_channel(100, ch2), OP_EQ, TO_CIRCUIT(or_c1)); /* Try the same thing again, to test the "fast" path. */ - tt_ptr_op(circuit_get_by_circid_channel(100, ch2), ==, TO_CIRCUIT(or_c1)); + tt_ptr_op(circuit_get_by_circid_channel(100, ch2), OP_EQ, TO_CIRCUIT(or_c1)); tt_assert(circuit_id_in_use_on_channel(100, ch2)); tt_assert(! circuit_id_in_use_on_channel(101, ch2)); @@ -117,9 +117,9 @@ test_clist_maps(void *arg) circuit_set_p_circid_chan(or_c1, 500, ch3); GOT_CMUX_DETACH(ch2->cmux, TO_CIRCUIT(or_c1)); GOT_CMUX_ATTACH(ch3->cmux, TO_CIRCUIT(or_c1), CELL_DIRECTION_IN); - tt_ptr_op(circuit_get_by_circid_channel(100, ch2), ==, NULL); + tt_ptr_op(circuit_get_by_circid_channel(100, ch2), OP_EQ, NULL); tt_assert(! circuit_id_in_use_on_channel(100, ch2)); - tt_ptr_op(circuit_get_by_circid_channel(500, ch3), ==, TO_CIRCUIT(or_c1)); + tt_ptr_op(circuit_get_by_circid_channel(500, ch3), OP_EQ, TO_CIRCUIT(or_c1)); /* Now let's see about destroy handling. */ tt_assert(! circuit_id_in_use_on_channel(205, ch2)); @@ -132,26 +132,26 @@ test_clist_maps(void *arg) tt_assert(circuit_id_in_use_on_channel(100, ch1)); tt_assert(TO_CIRCUIT(or_c2)->n_delete_pending != 0); - tt_ptr_op(circuit_get_by_circid_channel(200, ch2), ==, TO_CIRCUIT(or_c2)); - tt_ptr_op(circuit_get_by_circid_channel(100, ch1), ==, TO_CIRCUIT(or_c2)); + tt_ptr_op(circuit_get_by_circid_channel(200, ch2), OP_EQ, TO_CIRCUIT(or_c2)); + tt_ptr_op(circuit_get_by_circid_channel(100, ch1), OP_EQ, TO_CIRCUIT(or_c2)); /* Okay, now free ch2 and make sure that the circuit ID is STILL not * usable, because we haven't declared the destroy to be nonpending */ - tt_int_op(cdm.ncalls, ==, 0); + tt_int_op(cdm.ncalls, OP_EQ, 0); circuit_free(TO_CIRCUIT(or_c2)); or_c2 = NULL; /* prevent free */ - tt_int_op(cdm.ncalls, ==, 2); + tt_int_op(cdm.ncalls, OP_EQ, 2); memset(&cdm, 0, sizeof(cdm)); tt_assert(circuit_id_in_use_on_channel(200, ch2)); tt_assert(circuit_id_in_use_on_channel(100, ch1)); - tt_ptr_op(circuit_get_by_circid_channel(200, ch2), ==, NULL); - tt_ptr_op(circuit_get_by_circid_channel(100, ch1), ==, NULL); + tt_ptr_op(circuit_get_by_circid_channel(200, ch2), OP_EQ, NULL); + tt_ptr_op(circuit_get_by_circid_channel(100, ch1), OP_EQ, NULL); /* Now say that the destroy is nonpending */ channel_note_destroy_not_pending(ch2, 200); - tt_ptr_op(circuit_get_by_circid_channel(200, ch2), ==, NULL); + tt_ptr_op(circuit_get_by_circid_channel(200, ch2), OP_EQ, NULL); channel_note_destroy_not_pending(ch1, 100); - tt_ptr_op(circuit_get_by_circid_channel(100, ch1), ==, NULL); + tt_ptr_op(circuit_get_by_circid_channel(100, ch1), OP_EQ, NULL); tt_assert(! circuit_id_in_use_on_channel(200, ch2)); tt_assert(! circuit_id_in_use_on_channel(100, ch1)); @@ -190,73 +190,73 @@ test_rend_token_maps(void *arg) c4 = or_circuit_new(0, NULL); /* Make sure we really filled up the tok* variables */ - tt_int_op(tok1[REND_TOKEN_LEN-1], ==, 'y'); - tt_int_op(tok2[REND_TOKEN_LEN-1], ==, ' '); - tt_int_op(tok3[REND_TOKEN_LEN-1], ==, '.'); + tt_int_op(tok1[REND_TOKEN_LEN-1], OP_EQ, 'y'); + tt_int_op(tok2[REND_TOKEN_LEN-1], OP_EQ, ' '); + tt_int_op(tok3[REND_TOKEN_LEN-1], OP_EQ, '.'); /* No maps; nothing there. */ - tt_ptr_op(NULL, ==, circuit_get_rendezvous(tok1)); - tt_ptr_op(NULL, ==, circuit_get_intro_point(tok1)); + tt_ptr_op(NULL, OP_EQ, circuit_get_rendezvous(tok1)); + tt_ptr_op(NULL, OP_EQ, circuit_get_intro_point(tok1)); circuit_set_rendezvous_cookie(c1, tok1); circuit_set_intro_point_digest(c2, tok2); - tt_ptr_op(NULL, ==, circuit_get_rendezvous(tok3)); - tt_ptr_op(NULL, ==, circuit_get_intro_point(tok3)); - tt_ptr_op(NULL, ==, circuit_get_rendezvous(tok2)); - tt_ptr_op(NULL, ==, circuit_get_intro_point(tok1)); + tt_ptr_op(NULL, OP_EQ, circuit_get_rendezvous(tok3)); + tt_ptr_op(NULL, OP_EQ, circuit_get_intro_point(tok3)); + tt_ptr_op(NULL, OP_EQ, circuit_get_rendezvous(tok2)); + tt_ptr_op(NULL, OP_EQ, circuit_get_intro_point(tok1)); /* Without purpose set, we don't get the circuits */ - tt_ptr_op(NULL, ==, circuit_get_rendezvous(tok1)); - tt_ptr_op(NULL, ==, circuit_get_intro_point(tok2)); + tt_ptr_op(NULL, OP_EQ, circuit_get_rendezvous(tok1)); + tt_ptr_op(NULL, OP_EQ, circuit_get_intro_point(tok2)); c1->base_.purpose = CIRCUIT_PURPOSE_REND_POINT_WAITING; c2->base_.purpose = CIRCUIT_PURPOSE_INTRO_POINT; /* Okay, make sure they show up now. */ - tt_ptr_op(c1, ==, circuit_get_rendezvous(tok1)); - tt_ptr_op(c2, ==, circuit_get_intro_point(tok2)); + tt_ptr_op(c1, OP_EQ, circuit_get_rendezvous(tok1)); + tt_ptr_op(c2, OP_EQ, circuit_get_intro_point(tok2)); /* Two items at the same place with the same token. */ c3->base_.purpose = CIRCUIT_PURPOSE_REND_POINT_WAITING; circuit_set_rendezvous_cookie(c3, tok2); - tt_ptr_op(c2, ==, circuit_get_intro_point(tok2)); - tt_ptr_op(c3, ==, circuit_get_rendezvous(tok2)); + tt_ptr_op(c2, OP_EQ, circuit_get_intro_point(tok2)); + tt_ptr_op(c3, OP_EQ, circuit_get_rendezvous(tok2)); /* Marking a circuit makes it not get returned any more */ circuit_mark_for_close(TO_CIRCUIT(c1), END_CIRC_REASON_FINISHED); - tt_ptr_op(NULL, ==, circuit_get_rendezvous(tok1)); + tt_ptr_op(NULL, OP_EQ, circuit_get_rendezvous(tok1)); circuit_free(TO_CIRCUIT(c1)); c1 = NULL; /* Freeing a circuit makes it not get returned any more. */ circuit_free(TO_CIRCUIT(c2)); c2 = NULL; - tt_ptr_op(NULL, ==, circuit_get_intro_point(tok2)); + tt_ptr_op(NULL, OP_EQ, circuit_get_intro_point(tok2)); /* c3 -- are you still there? */ - tt_ptr_op(c3, ==, circuit_get_rendezvous(tok2)); + tt_ptr_op(c3, OP_EQ, circuit_get_rendezvous(tok2)); /* Change its cookie. This never happens in Tor per se, but hey. */ c3->base_.purpose = CIRCUIT_PURPOSE_INTRO_POINT; circuit_set_intro_point_digest(c3, tok3); - tt_ptr_op(NULL, ==, circuit_get_rendezvous(tok2)); - tt_ptr_op(c3, ==, circuit_get_intro_point(tok3)); + tt_ptr_op(NULL, OP_EQ, circuit_get_rendezvous(tok2)); + tt_ptr_op(c3, OP_EQ, circuit_get_intro_point(tok3)); /* Now replace c3 with c4. */ c4->base_.purpose = CIRCUIT_PURPOSE_INTRO_POINT; circuit_set_intro_point_digest(c4, tok3); - tt_ptr_op(c4, ==, circuit_get_intro_point(tok3)); + tt_ptr_op(c4, OP_EQ, circuit_get_intro_point(tok3)); - tt_ptr_op(c3->rendinfo, ==, NULL); - tt_ptr_op(c4->rendinfo, !=, NULL); - tt_mem_op(c4->rendinfo, ==, tok3, REND_TOKEN_LEN); + tt_ptr_op(c3->rendinfo, OP_EQ, NULL); + tt_ptr_op(c4->rendinfo, OP_NE, NULL); + tt_mem_op(c4->rendinfo, OP_EQ, tok3, REND_TOKEN_LEN); /* Now clear c4's cookie. */ circuit_set_intro_point_digest(c4, NULL); - tt_ptr_op(c4->rendinfo, ==, NULL); - tt_ptr_op(NULL, ==, circuit_get_intro_point(tok3)); + tt_ptr_op(c4->rendinfo, OP_EQ, NULL); + tt_ptr_op(NULL, OP_EQ, circuit_get_intro_point(tok3)); done: if (c1) @@ -283,32 +283,32 @@ test_pick_circid(void *arg) chan2->wide_circ_ids = 1; chan1->circ_id_type = CIRC_ID_TYPE_NEITHER; - tt_int_op(0, ==, get_unique_circ_id_by_chan(chan1)); + tt_int_op(0, OP_EQ, get_unique_circ_id_by_chan(chan1)); /* Basic tests, with no collisions */ chan1->circ_id_type = CIRC_ID_TYPE_LOWER; for (i = 0; i < 50; ++i) { circid = get_unique_circ_id_by_chan(chan1); - tt_uint_op(0, <, circid); - tt_uint_op(circid, <, (1<<15)); + tt_uint_op(0, OP_LT, circid); + tt_uint_op(circid, OP_LT, (1<<15)); } chan1->circ_id_type = CIRC_ID_TYPE_HIGHER; for (i = 0; i < 50; ++i) { circid = get_unique_circ_id_by_chan(chan1); - tt_uint_op((1<<15), <, circid); - tt_uint_op(circid, <, (1<<16)); + tt_uint_op((1<<15), OP_LT, circid); + tt_uint_op(circid, OP_LT, (1<<16)); } chan2->circ_id_type = CIRC_ID_TYPE_LOWER; for (i = 0; i < 50; ++i) { circid = get_unique_circ_id_by_chan(chan2); - tt_uint_op(0, <, circid); - tt_uint_op(circid, <, (1u<<31)); + tt_uint_op(0, OP_LT, circid); + tt_uint_op(circid, OP_LT, (1u<<31)); } chan2->circ_id_type = CIRC_ID_TYPE_HIGHER; for (i = 0; i < 50; ++i) { circid = get_unique_circ_id_by_chan(chan2); - tt_uint_op((1u<<31), <, circid); + tt_uint_op((1u<<31), OP_LT, circid); } /* Now make sure that we can behave well when we are full up on circuits */ @@ -319,20 +319,20 @@ test_pick_circid(void *arg) for (i = 0; i < (1<<15); ++i) { circid = get_unique_circ_id_by_chan(chan1); if (circid == 0) { - tt_int_op(i, >, (1<<14)); + tt_int_op(i, OP_GT, (1<<14)); break; } - tt_uint_op(circid, <, (1<<15)); + tt_uint_op(circid, OP_LT, (1<<15)); tt_assert(! bitarray_is_set(ba, circid)); bitarray_set(ba, circid); channel_mark_circid_unusable(chan1, circid); } - tt_int_op(i, <, (1<<15)); + tt_int_op(i, OP_LT, (1<<15)); /* Make sure that being full on chan1 does not interfere with chan2 */ for (i = 0; i < 100; ++i) { circid = get_unique_circ_id_by_chan(chan2); - tt_uint_op(circid, >, 0); - tt_uint_op(circid, <, (1<<15)); + tt_uint_op(circid, OP_GT, 0); + tt_uint_op(circid, OP_LT, (1<<15)); channel_mark_circid_unusable(chan2, circid); } diff --git a/src/test/test_circuitmux.c b/src/test/test_circuitmux.c index 446fc88b3c..2a2a7ba145 100644 --- a/src/test/test_circuitmux.c +++ b/src/test/test_circuitmux.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2014, The Tor Project, Inc. */ +/* Copyright (c) 2013-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define TOR_CHANNEL_INTERNAL_ @@ -8,6 +8,7 @@ #include "channel.h" #include "circuitmux.h" #include "relay.h" +#include "scheduler.h" #include "test.h" /* XXXX duplicated function from test_circuitlist.c */ @@ -35,6 +36,12 @@ test_cmux_destroy_cell_queue(void *arg) circuit_t *circ = NULL; cell_queue_t *cq = NULL; packed_cell_t *pc = NULL; + tor_libevent_cfg cfg; + + memset(&cfg, 0, sizeof(cfg)); + + tor_libevent_initialize(&cfg); + scheduler_init(); #ifdef ENABLE_MEMPOOLS init_cell_pool(); @@ -55,21 +62,21 @@ test_cmux_destroy_cell_queue(void *arg) circuitmux_append_destroy_cell(ch, cmux, 190, 6); circuitmux_append_destroy_cell(ch, cmux, 30, 1); - tt_int_op(circuitmux_num_cells(cmux), ==, 3); + tt_int_op(circuitmux_num_cells(cmux), OP_EQ, 3); circ = circuitmux_get_first_active_circuit(cmux, &cq); tt_assert(!circ); tt_assert(cq); - tt_int_op(cq->n, ==, 3); + tt_int_op(cq->n, OP_EQ, 3); pc = cell_queue_pop(cq); tt_assert(pc); - tt_mem_op(pc->body, ==, "\x00\x00\x00\x64\x04\x0a\x00\x00\x00", 9); + tt_mem_op(pc->body, OP_EQ, "\x00\x00\x00\x64\x04\x0a\x00\x00\x00", 9); packed_cell_free(pc); pc = NULL; - tt_int_op(circuitmux_num_cells(cmux), ==, 2); + tt_int_op(circuitmux_num_cells(cmux), OP_EQ, 2); done: circuitmux_free(cmux); diff --git a/src/test/test_cmdline_args.py b/src/test/test_cmdline_args.py index 55d1cdb805..c8e68e8240 100755 --- a/src/test/test_cmdline_args.py +++ b/src/test/test_cmdline_args.py @@ -57,14 +57,14 @@ def run_tor(args, failure=False): raise UnexpectedFailure() elif not result and failure: raise UnexpectedSuccess() - return b2s(output) + return b2s(output.replace('\r\n','\n')) def spaceify_fp(fp): for i in range(0, len(fp), 4): yield fp[i:i+4] def lines(s): - out = s.split("\n") + out = s.splitlines() if out and out[-1] == '': del out[-1] return out @@ -151,7 +151,7 @@ class CmdlineTests(unittest.TestCase): if os.stat(TOR).st_mtime < os.stat(main_c).st_mtime: self.skipTest(TOR+" not up to date") out = run_tor(["--digests"]) - main_line = [ l for l in lines(out) if l.endswith("/main.c") ] + main_line = [ l for l in lines(out) if l.endswith("/main.c") or l.endswith(" main.c") ] digest, name = main_line[0].split() f = open(main_c, 'rb') actual = hashlib.sha1(f.read()).hexdigest() diff --git a/src/test/test_config.c b/src/test/test_config.c index 71c338e5f8..b63b78e386 100644 --- a/src/test/test_config.c +++ b/src/test/test_config.c @@ -1,11 +1,12 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" #define CONFIG_PRIVATE +#define PT_PRIVATE #include "or.h" #include "addressmap.h" #include "config.h" @@ -50,8 +51,7 @@ test_config_addressmap(void *arg) /* Use old interface for now, so we don't need to rewrite the unit tests */ #define addressmap_rewrite(a,s,eo,ao) \ - addressmap_rewrite((a),(s),AMR_FLAG_USE_IPV4_DNS|AMR_FLAG_USE_IPV6_DNS, \ - (eo),(ao)) + addressmap_rewrite((a),(s), ~0, (eo),(ao)) /* MapAddress .invalidwildcard.com .torserver.exit - no match */ strlcpy(address, "www.invalidwildcard.com", sizeof(address)); @@ -65,22 +65,22 @@ test_config_addressmap(void *arg) /* MapAddress .google.com .torserver.exit */ strlcpy(address, "reader.google.com", sizeof(address)); tt_assert(addressmap_rewrite(address, sizeof(address), &expires, NULL)); - tt_str_op(address,==, "reader.torserver.exit"); + tt_str_op(address,OP_EQ, "reader.torserver.exit"); /* MapAddress *.yahoo.com *.google.com.torserver.exit */ strlcpy(address, "reader.yahoo.com", sizeof(address)); tt_assert(addressmap_rewrite(address, sizeof(address), &expires, NULL)); - tt_str_op(address,==, "reader.google.com.torserver.exit"); + tt_str_op(address,OP_EQ, "reader.google.com.torserver.exit"); /*MapAddress *.cnn.com www.cnn.com */ strlcpy(address, "cnn.com", sizeof(address)); tt_assert(addressmap_rewrite(address, sizeof(address), &expires, NULL)); - tt_str_op(address,==, "www.cnn.com"); + tt_str_op(address,OP_EQ, "www.cnn.com"); /* MapAddress .cn.com www.cnn.com */ strlcpy(address, "www.cn.com", sizeof(address)); tt_assert(addressmap_rewrite(address, sizeof(address), &expires, NULL)); - tt_str_op(address,==, "www.cnn.com"); + tt_str_op(address,OP_EQ, "www.cnn.com"); /* MapAddress ex.com www.cnn.com - no match */ strlcpy(address, "www.ex.com", sizeof(address)); @@ -93,19 +93,19 @@ test_config_addressmap(void *arg) /* Where mapping for FQDN match on FQDN */ strlcpy(address, "www.google.com", sizeof(address)); tt_assert(addressmap_rewrite(address, sizeof(address), &expires, NULL)); - tt_str_op(address,==, "3.3.3.3"); + tt_str_op(address,OP_EQ, "3.3.3.3"); strlcpy(address, "www.torproject.org", sizeof(address)); tt_assert(addressmap_rewrite(address, sizeof(address), &expires, NULL)); - tt_str_op(address,==, "1.1.1.1"); + tt_str_op(address,OP_EQ, "1.1.1.1"); strlcpy(address, "other.torproject.org", sizeof(address)); tt_assert(addressmap_rewrite(address, sizeof(address), &expires, NULL)); - tt_str_op(address,==, "this.torproject.org.otherserver.exit"); + tt_str_op(address,OP_EQ, "this.torproject.org.otherserver.exit"); strlcpy(address, "test.torproject.org", sizeof(address)); tt_assert(addressmap_rewrite(address, sizeof(address), &expires, NULL)); - tt_str_op(address,==, "2.2.2.2"); + tt_str_op(address,OP_EQ, "2.2.2.2"); /* Test a chain of address mappings and the order in which they were added: "MapAddress www.example.org 4.4.4.4" @@ -114,12 +114,12 @@ test_config_addressmap(void *arg) */ strlcpy(address, "www.example.org", sizeof(address)); tt_assert(addressmap_rewrite(address, sizeof(address), &expires, NULL)); - tt_str_op(address,==, "5.5.5.5"); + tt_str_op(address,OP_EQ, "5.5.5.5"); /* Test infinite address mapping results in no change */ strlcpy(address, "www.infiniteloop.org", sizeof(address)); tt_assert(addressmap_rewrite(address, sizeof(address), &expires, NULL)); - tt_str_op(address,==, "www.infiniteloop.org"); + tt_str_op(address,OP_EQ, "www.infiniteloop.org"); /* Test we don't find false positives */ strlcpy(address, "www.example.com", sizeof(address)); @@ -137,23 +137,23 @@ test_config_addressmap(void *arg) strlcpy(address, "www.abc.com", sizeof(address)); tt_assert(addressmap_rewrite(address, sizeof(address), &expires, NULL)); - tt_str_op(address,==, "www.abc.torserver.exit"); + tt_str_op(address,OP_EQ, "www.abc.torserver.exit"); strlcpy(address, "www.def.com", sizeof(address)); tt_assert(addressmap_rewrite(address, sizeof(address), &expires, NULL)); - tt_str_op(address,==, "www.def.torserver.exit"); + tt_str_op(address,OP_EQ, "www.def.torserver.exit"); strlcpy(address, "www.torproject.org", sizeof(address)); tt_assert(addressmap_rewrite(address, sizeof(address), &expires, NULL)); - tt_str_op(address,==, "1.1.1.1"); + tt_str_op(address,OP_EQ, "1.1.1.1"); strlcpy(address, "test.torproject.org", sizeof(address)); tt_assert(addressmap_rewrite(address, sizeof(address), &expires, NULL)); - tt_str_op(address,==, "1.1.1.1"); + tt_str_op(address,OP_EQ, "1.1.1.1"); strlcpy(address, "torproject.net", sizeof(address)); tt_assert(addressmap_rewrite(address, sizeof(address), &expires, NULL)); - tt_str_op(address,==, "2.2.2.2"); + tt_str_op(address,OP_EQ, "2.2.2.2"); /* We don't support '*' as a mapping directive */ config_free_lines(get_options_mutable()->AddressMap); @@ -176,6 +176,7 @@ test_config_addressmap(void *arg) done: config_free_lines(get_options_mutable()->AddressMap); get_options_mutable()->AddressMap = NULL; + addressmap_free_all(); } static int @@ -213,9 +214,9 @@ test_config_check_or_create_data_subdir(void *arg) subpath = get_datadir_fname(subdir); #if defined (_WIN32) - tt_int_op(mkdir(options->DataDirectory), ==, 0); + tt_int_op(mkdir(options->DataDirectory), OP_EQ, 0); #else - tt_int_op(mkdir(options->DataDirectory, 0700), ==, 0); + tt_int_op(mkdir(options->DataDirectory, 0700), OP_EQ, 0); #endif r = stat(subpath, &st); @@ -287,9 +288,9 @@ test_config_write_to_data_subdir(void *arg) filepath = get_datadir_fname2(subdir, fname); #if defined (_WIN32) - tt_int_op(mkdir(options->DataDirectory), ==, 0); + tt_int_op(mkdir(options->DataDirectory), OP_EQ, 0); #else - tt_int_op(mkdir(options->DataDirectory, 0700), ==, 0); + tt_int_op(mkdir(options->DataDirectory, 0700), OP_EQ, 0); #endif // Write attempt shoudl fail, if subdirectory doesn't exist. @@ -300,13 +301,13 @@ test_config_write_to_data_subdir(void *arg) // equal to the original string. tt_assert(!write_to_data_subdir(subdir, fname, str, NULL)); cp = read_file_to_str(filepath, 0, NULL); - tt_str_op(cp,==, str); + tt_str_op(cp,OP_EQ, str); tor_free(cp); // A second write operation should overwrite the old content. tt_assert(!write_to_data_subdir(subdir, fname, str, NULL)); cp = read_file_to_str(filepath, 0, NULL); - tt_str_op(cp,==, str); + tt_str_op(cp,OP_EQ, str); tor_free(cp); done: @@ -331,7 +332,7 @@ good_bridge_line_test(const char *string, const char *test_addrport, /* test addrport */ tmp = tor_strdup(fmt_addrport(&bridge_line->addr, bridge_line->port)); - tt_str_op(test_addrport,==, tmp); + tt_str_op(test_addrport,OP_EQ, tmp); tor_free(tmp); /* If we were asked to validate a digest, but we did not get a @@ -349,7 +350,7 @@ good_bridge_line_test(const char *string, const char *test_addrport, if (test_digest) { tmp = tor_strdup(hex_str(bridge_line->digest, DIGEST_LEN)); tor_strlower(tmp); - tt_str_op(test_digest,==, tmp); + tt_str_op(test_digest,OP_EQ, tmp); tor_free(tmp); } @@ -360,7 +361,7 @@ good_bridge_line_test(const char *string, const char *test_addrport, if (!test_transport && bridge_line->transport_name) tt_assert(0); if (test_transport) - tt_str_op(test_transport,==, bridge_line->transport_name); + tt_str_op(test_transport,OP_EQ, bridge_line->transport_name); /* Validate the SOCKS argument smartlist. */ if (test_socks_args && !bridge_line->socks_args) @@ -578,6 +579,8 @@ pt_kickstart_proxy_mock(const smartlist_t *transport_list, /* XXXX check that args are as expected. */ ++pt_kickstart_proxy_mock_call_count; + + free_execve_args(proxy_argv); } static int @@ -839,7 +842,8 @@ test_config_fix_my_family(void *arg) TT_FAIL(("options_validate failed: %s", err)); } - tt_str_op(options->MyFamily,==, "$1111111111111111111111111111111111111111, " + tt_str_op(options->MyFamily,OP_EQ, + "$1111111111111111111111111111111111111111, " "$1111111111111111111111111111111111111112, " "$1111111111111111111111111111111111111113"); @@ -852,10 +856,598 @@ test_config_fix_my_family(void *arg) or_options_free(defaults); } +static int n_hostname_01010101 = 0; + +/** This mock function is meant to replace tor_lookup_hostname(). + * It answers with 1.1.1.1 as IP adddress that resulted from lookup. + * This function increments <b>n_hostname_01010101</b> counter by one + * every time it is called. + */ +static int +tor_lookup_hostname_01010101(const char *name, uint32_t *addr) +{ + n_hostname_01010101++; + + if (name && addr) { + *addr = ntohl(0x01010101); + } + + return 0; +} + +static int n_hostname_localhost = 0; + +/** This mock function is meant to replace tor_lookup_hostname(). + * It answers with 127.0.0.1 as IP adddress that resulted from lookup. + * This function increments <b>n_hostname_localhost</b> counter by one + * every time it is called. + */ +static int +tor_lookup_hostname_localhost(const char *name, uint32_t *addr) +{ + n_hostname_localhost++; + + if (name && addr) { + *addr = 0x7f000001; + } + + return 0; +} + +static int n_hostname_failure = 0; + +/** This mock function is meant to replace tor_lookup_hostname(). + * It pretends to fail by returning -1 to caller. Also, this function + * increments <b>n_hostname_failure</b> every time it is called. + */ +static int +tor_lookup_hostname_failure(const char *name, uint32_t *addr) +{ + (void)name; + (void)addr; + + n_hostname_failure++; + + return -1; +} + +static int n_gethostname_replacement = 0; + +/** This mock function is meant to replace tor_gethostname(). It + * responds with string "onionrouter!" as hostname. This function + * increments <b>n_gethostname_replacement</b> by one every time + * it is called. + */ +static int +tor_gethostname_replacement(char *name, size_t namelen) +{ + n_gethostname_replacement++; + + if (name && namelen) { + strlcpy(name,"onionrouter!",namelen); + } + + return 0; +} + +static int n_gethostname_localhost = 0; + +/** This mock function is meant to replace tor_gethostname(). It + * responds with string "127.0.0.1" as hostname. This function + * increments <b>n_gethostname_localhost</b> by one every time + * it is called. + */ +static int +tor_gethostname_localhost(char *name, size_t namelen) +{ + n_gethostname_localhost++; + + if (name && namelen) { + strlcpy(name,"127.0.0.1",namelen); + } + + return 0; +} + +static int n_gethostname_failure = 0; + +/** This mock function is meant to replace tor_gethostname. + * It pretends to fail by returning -1. This function increments + * <b>n_gethostname_failure</b> by one every time it is called. + */ +static int +tor_gethostname_failure(char *name, size_t namelen) +{ + (void)name; + (void)namelen; + n_gethostname_failure++; + + return -1; +} + +static int n_get_interface_address = 0; + +/** This mock function is meant to replace get_interface_address(). + * It answers with address 8.8.8.8. This function increments + * <b>n_get_interface_address</b> by one every time it is called. + */ +static int +get_interface_address_08080808(int severity, uint32_t *addr) +{ + (void)severity; + + n_get_interface_address++; + + if (addr) { + *addr = ntohl(0x08080808); + } + + return 0; +} + +static int n_get_interface_address6 = 0; +static sa_family_t last_address6_family; + +/** This mock function is meant to replace get_interface_address6(). + * It answers with IP address 9.9.9.9 iff both of the following are true: + * - <b>family</b> is AF_INET + * - <b>addr</b> pointer is not NULL. + * This function increments <b>n_get_interface_address6</b> by one every + * time it is called. + */ +static int +get_interface_address6_replacement(int severity, sa_family_t family, + tor_addr_t *addr) +{ + (void)severity; + + last_address6_family = family; + n_get_interface_address6++; + + if ((family != AF_INET) || !addr) { + return -1; + } + + tor_addr_from_ipv4h(addr,0x09090909); + + return 0; +} + +static int n_get_interface_address_failure = 0; + +/** + * This mock function is meant to replace get_interface_address(). + * It pretends to fail getting interface address by returning -1. + * <b>n_get_interface_address_failure</b> is incremented by one + * every time this function is called. + */ +static int +get_interface_address_failure(int severity, uint32_t *addr) +{ + (void)severity; + (void)addr; + + n_get_interface_address_failure++; + + return -1; +} + +static int n_get_interface_address6_failure = 0; + +/** + * This mock function is meant to replace get_interface_addres6(). + * It will pretent to fail by return -1. + * <b>n_get_interface_address6_failure</b> is incremented by one + * every time this function is called and <b>last_address6_family</b> + * is assigned the value of <b>family</b> argument. + */ +static int +get_interface_address6_failure(int severity, sa_family_t family, + tor_addr_t *addr) +{ + (void)severity; + (void)addr; + n_get_interface_address6_failure++; + last_address6_family = family; + + return -1; +} + +static void +test_config_resolve_my_address(void *arg) +{ + or_options_t *options; + uint32_t resolved_addr; + const char *method_used; + char *hostname_out = NULL; + int retval; + int prev_n_hostname_01010101; + int prev_n_hostname_localhost; + int prev_n_hostname_failure; + int prev_n_gethostname_replacement; + int prev_n_gethostname_failure; + int prev_n_gethostname_localhost; + int prev_n_get_interface_address; + int prev_n_get_interface_address_failure; + int prev_n_get_interface_address6; + int prev_n_get_interface_address6_failure; + + (void)arg; + + options = options_new(); + + options_init(options); + + /* + * CASE 1: + * If options->Address is a valid IPv4 address string, we want + * the corresponding address to be parsed and returned. + */ + + options->Address = tor_strdup("128.52.128.105"); + + retval = resolve_my_address(LOG_NOTICE,options,&resolved_addr, + &method_used,&hostname_out); + + tt_want(retval == 0); + tt_want_str_op(method_used,==,"CONFIGURED"); + tt_want(hostname_out == NULL); + tt_assert(htonl(resolved_addr) == 0x69803480); + + tor_free(options->Address); + +/* + * CASE 2: + * If options->Address is a valid DNS address, we want resolve_my_address() + * function to ask tor_lookup_hostname() for help with resolving it + * and return the address that was resolved (in host order). + */ + + MOCK(tor_lookup_hostname,tor_lookup_hostname_01010101); + + tor_free(options->Address); + options->Address = tor_strdup("www.torproject.org"); + + prev_n_hostname_01010101 = n_hostname_01010101; + + retval = resolve_my_address(LOG_NOTICE,options,&resolved_addr, + &method_used,&hostname_out); + + tt_want(retval == 0); + tt_want(n_hostname_01010101 == prev_n_hostname_01010101 + 1); + tt_want_str_op(method_used,==,"RESOLVED"); + tt_want_str_op(hostname_out,==,"www.torproject.org"); + tt_assert(htonl(resolved_addr) == 0x01010101); + + UNMOCK(tor_lookup_hostname); + + tor_free(options->Address); + tor_free(hostname_out); + +/* + * CASE 3: + * Given that options->Address is NULL, we want resolve_my_address() + * to try and use tor_gethostname() to get hostname AND use + * tor_lookup_hostname() to get IP address. + */ + + resolved_addr = 0; + tor_free(options->Address); + options->Address = NULL; + + MOCK(tor_gethostname,tor_gethostname_replacement); + MOCK(tor_lookup_hostname,tor_lookup_hostname_01010101); + + prev_n_gethostname_replacement = n_gethostname_replacement; + prev_n_hostname_01010101 = n_hostname_01010101; + + retval = resolve_my_address(LOG_NOTICE,options,&resolved_addr, + &method_used,&hostname_out); + + tt_want(retval == 0); + tt_want(n_gethostname_replacement == prev_n_gethostname_replacement + 1); + tt_want(n_hostname_01010101 == prev_n_hostname_01010101 + 1); + tt_want_str_op(method_used,==,"GETHOSTNAME"); + tt_want_str_op(hostname_out,==,"onionrouter!"); + tt_assert(htonl(resolved_addr) == 0x01010101); + + UNMOCK(tor_gethostname); + UNMOCK(tor_lookup_hostname); + + tor_free(hostname_out); + +/* + * CASE 4: + * Given that options->Address is a local host address, we want + * resolve_my_address() function to fail. + */ + + resolved_addr = 0; + tor_free(options->Address); + options->Address = tor_strdup("127.0.0.1"); + + retval = resolve_my_address(LOG_NOTICE,options,&resolved_addr, + &method_used,&hostname_out); + + tt_want(resolved_addr == 0); + tt_assert(retval == -1); + + tor_free(options->Address); + tor_free(hostname_out); + +/* + * CASE 5: + * We want resolve_my_address() to fail if DNS address in options->Address + * cannot be resolved. + */ + + MOCK(tor_lookup_hostname,tor_lookup_hostname_failure); + + prev_n_hostname_failure = n_hostname_failure; + + tor_free(options->Address); + options->Address = tor_strdup("www.tor-project.org"); + + retval = resolve_my_address(LOG_NOTICE,options,&resolved_addr, + &method_used,&hostname_out); + + tt_want(n_hostname_failure == prev_n_hostname_failure + 1); + tt_assert(retval == -1); + + UNMOCK(tor_lookup_hostname); + + tor_free(options->Address); + tor_free(hostname_out); + +/* + * CASE 6: + * If options->Address is NULL AND gettting local hostname fails, we want + * resolve_my_address() to fail as well. + */ + + MOCK(tor_gethostname,tor_gethostname_failure); + + prev_n_gethostname_failure = n_gethostname_failure; + + retval = resolve_my_address(LOG_NOTICE,options,&resolved_addr, + &method_used,&hostname_out); + + tt_want(n_gethostname_failure == prev_n_gethostname_failure + 1); + tt_assert(retval == -1); + + UNMOCK(tor_gethostname); + tor_free(hostname_out); + +/* + * CASE 7: + * We want resolve_my_address() to try and get network interface address via + * get_interface_address() if hostname returned by tor_gethostname() cannot be + * resolved into IP address. + */ + + MOCK(tor_gethostname,tor_gethostname_replacement); + MOCK(tor_lookup_hostname,tor_lookup_hostname_failure); + MOCK(get_interface_address,get_interface_address_08080808); + + prev_n_gethostname_replacement = n_gethostname_replacement; + prev_n_get_interface_address = n_get_interface_address; + + retval = resolve_my_address(LOG_NOTICE,options,&resolved_addr, + &method_used,&hostname_out); + + tt_want(retval == 0); + tt_want_int_op(n_gethostname_replacement, ==, + prev_n_gethostname_replacement + 1); + tt_want_int_op(n_get_interface_address, ==, + prev_n_get_interface_address + 1); + tt_want_str_op(method_used,==,"INTERFACE"); + tt_want(hostname_out == NULL); + tt_assert(resolved_addr == ntohl(0x08080808)); + + UNMOCK(get_interface_address); + tor_free(hostname_out); + +/* + * CASE 8: + * Suppose options->Address is NULL AND hostname returned by tor_gethostname() + * is unresolvable. We want resolve_my_address to fail if + * get_interface_address() fails. + */ + + MOCK(get_interface_address,get_interface_address_failure); + + prev_n_get_interface_address_failure = n_get_interface_address_failure; + prev_n_gethostname_replacement = n_gethostname_replacement; + + retval = resolve_my_address(LOG_NOTICE,options,&resolved_addr, + &method_used,&hostname_out); + + tt_want(n_get_interface_address_failure == + prev_n_get_interface_address_failure + 1); + tt_want(n_gethostname_replacement == + prev_n_gethostname_replacement + 1); + tt_assert(retval == -1); + + UNMOCK(get_interface_address); + tor_free(hostname_out); + +/* + * CASE 9: + * Given that options->Address is NULL AND tor_lookup_hostname() + * fails AND hostname returned by gethostname() resolves + * to local IP address, we want resolve_my_address() function to + * call get_interface_address6(.,AF_INET,.) and return IP address + * the latter function has found. + */ + + MOCK(tor_lookup_hostname,tor_lookup_hostname_failure); + MOCK(tor_gethostname,tor_gethostname_replacement); + MOCK(get_interface_address6,get_interface_address6_replacement); + + prev_n_gethostname_replacement = n_gethostname_replacement; + prev_n_hostname_failure = n_hostname_failure; + prev_n_get_interface_address6 = n_get_interface_address6; + + retval = resolve_my_address(LOG_NOTICE,options,&resolved_addr, + &method_used,&hostname_out); + + tt_want(last_address6_family == AF_INET); + tt_want(n_get_interface_address6 == prev_n_get_interface_address6 + 1); + tt_want(n_hostname_failure == prev_n_hostname_failure + 1); + tt_want(n_gethostname_replacement == prev_n_gethostname_replacement + 1); + tt_want(retval == 0); + tt_want_str_op(method_used,==,"INTERFACE"); + tt_assert(htonl(resolved_addr) == 0x09090909); + + UNMOCK(tor_lookup_hostname); + UNMOCK(tor_gethostname); + UNMOCK(get_interface_address6); + + tor_free(hostname_out); + + /* + * CASE 10: We want resolve_my_address() to fail if all of the following + * are true: + * 1. options->Address is not NULL + * 2. ... but it cannot be converted to struct in_addr by + * tor_inet_aton() + * 3. ... and tor_lookup_hostname() fails to resolve the + * options->Address + */ + + MOCK(tor_lookup_hostname,tor_lookup_hostname_failure); + + prev_n_hostname_failure = n_hostname_failure; + + tor_free(options->Address); + options->Address = tor_strdup("some_hostname"); + + retval = resolve_my_address(LOG_NOTICE, options, &resolved_addr, + &method_used,&hostname_out); + + tt_want(n_hostname_failure == prev_n_hostname_failure + 1); + tt_assert(retval == -1); + + UNMOCK(tor_gethostname); + UNMOCK(tor_lookup_hostname); + + tor_free(hostname_out); + + /* + * CASE 11: + * Suppose the following sequence of events: + * 1. options->Address is NULL + * 2. tor_gethostname() succeeds to get hostname of machine Tor + * if running on. + * 3. Hostname from previous step cannot be converted to + * address by using tor_inet_aton() function. + * 4. However, tor_lookup_hostname() succeds in resolving the + * hostname from step 2. + * 5. Unfortunately, tor_addr_is_internal() deems this address + * to be internal. + * 6. get_interface_address6(.,AF_INET,.) returns non-internal + * IPv4 + * + * We want resolve_my_addr() to succeed with method "INTERFACE" + * and address from step 6. + */ + + tor_free(options->Address); + options->Address = NULL; + + MOCK(tor_gethostname,tor_gethostname_replacement); + MOCK(tor_lookup_hostname,tor_lookup_hostname_localhost); + MOCK(get_interface_address6,get_interface_address6_replacement); + + prev_n_gethostname_replacement = n_gethostname_replacement; + prev_n_hostname_localhost = n_hostname_localhost; + prev_n_get_interface_address6 = n_get_interface_address6; + + retval = resolve_my_address(LOG_DEBUG, options, &resolved_addr, + &method_used,&hostname_out); + + tt_want(n_gethostname_replacement == prev_n_gethostname_replacement + 1); + tt_want(n_hostname_localhost == prev_n_hostname_localhost + 1); + tt_want(n_get_interface_address6 == prev_n_get_interface_address6 + 1); + + tt_str_op(method_used,==,"INTERFACE"); + tt_assert(!hostname_out); + tt_assert(retval == 0); + + /* + * CASE 11b: + * 1-5 as above. + * 6. get_interface_address6() fails. + * + * In this subcase, we want resolve_my_address() to fail. + */ + + UNMOCK(get_interface_address6); + MOCK(get_interface_address6,get_interface_address6_failure); + + prev_n_gethostname_replacement = n_gethostname_replacement; + prev_n_hostname_localhost = n_hostname_localhost; + prev_n_get_interface_address6_failure = n_get_interface_address6_failure; + + retval = resolve_my_address(LOG_DEBUG, options, &resolved_addr, + &method_used,&hostname_out); + + tt_want(n_gethostname_replacement == prev_n_gethostname_replacement + 1); + tt_want(n_hostname_localhost == prev_n_hostname_localhost + 1); + tt_want(n_get_interface_address6_failure == + prev_n_get_interface_address6_failure + 1); + + tt_assert(retval == -1); + + UNMOCK(tor_gethostname); + UNMOCK(tor_lookup_hostname); + UNMOCK(get_interface_address6); + + /* CASE 12: + * Suppose the following happens: + * 1. options->Address is NULL AND options->DirAuthorities is 1. + * 2. tor_gethostname() succeeds in getting hostname of a machine ... + * 3. ... which is successfully parsed by tor_inet_aton() ... + * 4. into IPv4 address that tor_addr_is_inernal() considers to be + * internal. + * + * In this case, we want resolve_my_address() to fail. + */ + + tor_free(options->Address); + options->Address = NULL; + options->DirAuthorities = tor_malloc_zero(sizeof(config_line_t)); + + MOCK(tor_gethostname,tor_gethostname_localhost); + + prev_n_gethostname_localhost = n_gethostname_localhost; + + retval = resolve_my_address(LOG_DEBUG, options, &resolved_addr, + &method_used,&hostname_out); + + tt_want(n_gethostname_localhost == prev_n_gethostname_localhost + 1); + tt_assert(retval == -1); + + UNMOCK(tor_gethostname); + + done: + tor_free(options->Address); + tor_free(options->DirAuthorities); + or_options_free(options); + tor_free(hostname_out); + + UNMOCK(tor_gethostname); + UNMOCK(tor_lookup_hostname); + UNMOCK(get_interface_address); + UNMOCK(get_interface_address6); + UNMOCK(tor_gethostname); +} + #define CONFIG_TEST(name, flags) \ { #name, test_config_ ## name, flags, NULL, NULL } struct testcase_t config_tests[] = { + CONFIG_TEST(resolve_my_address, TT_FORK), CONFIG_TEST(addressmap, 0), CONFIG_TEST(parse_bridge_line, 0), CONFIG_TEST(parse_transport_options_line, 0), diff --git a/src/test/test_containers.c b/src/test/test_containers.c index d0972dd126..79085a748e 100644 --- a/src/test/test_containers.c +++ b/src/test/test_containers.c @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" @@ -62,18 +62,18 @@ test_container_smartlist_basic(void *arg) smartlist_insert(sl, 1, v22); smartlist_insert(sl, 0, v0); smartlist_insert(sl, 5, v555); - tt_ptr_op(v0,==, smartlist_get(sl,0)); - tt_ptr_op(v1,==, smartlist_get(sl,1)); - tt_ptr_op(v22,==, smartlist_get(sl,2)); - tt_ptr_op(v3,==, smartlist_get(sl,3)); - tt_ptr_op(v4,==, smartlist_get(sl,4)); - tt_ptr_op(v555,==, smartlist_get(sl,5)); + tt_ptr_op(v0,OP_EQ, smartlist_get(sl,0)); + tt_ptr_op(v1,OP_EQ, smartlist_get(sl,1)); + tt_ptr_op(v22,OP_EQ, smartlist_get(sl,2)); + tt_ptr_op(v3,OP_EQ, smartlist_get(sl,3)); + tt_ptr_op(v4,OP_EQ, smartlist_get(sl,4)); + tt_ptr_op(v555,OP_EQ, smartlist_get(sl,5)); /* Try deleting in the middle. */ smartlist_del(sl, 1); - tt_ptr_op(v555,==, smartlist_get(sl, 1)); + tt_ptr_op(v555,OP_EQ, smartlist_get(sl, 1)); /* Try deleting at the end. */ smartlist_del(sl, 4); - tt_int_op(4,==, smartlist_len(sl)); + tt_int_op(4,OP_EQ, smartlist_len(sl)); /* test isin. */ tt_assert(smartlist_contains(sl, v3)); @@ -101,119 +101,119 @@ test_container_smartlist_strings(void *arg) /* Test split and join */ (void)arg; - tt_int_op(0,==, smartlist_len(sl)); + tt_int_op(0,OP_EQ, smartlist_len(sl)); smartlist_split_string(sl, "abc", ":", 0, 0); - tt_int_op(1,==, smartlist_len(sl)); - tt_str_op("abc",==, smartlist_get(sl, 0)); + tt_int_op(1,OP_EQ, smartlist_len(sl)); + tt_str_op("abc",OP_EQ, smartlist_get(sl, 0)); smartlist_split_string(sl, "a::bc::", "::", 0, 0); - tt_int_op(4,==, smartlist_len(sl)); - tt_str_op("a",==, smartlist_get(sl, 1)); - tt_str_op("bc",==, smartlist_get(sl, 2)); - tt_str_op("",==, smartlist_get(sl, 3)); + tt_int_op(4,OP_EQ, smartlist_len(sl)); + tt_str_op("a",OP_EQ, smartlist_get(sl, 1)); + tt_str_op("bc",OP_EQ, smartlist_get(sl, 2)); + tt_str_op("",OP_EQ, smartlist_get(sl, 3)); cp_alloc = smartlist_join_strings(sl, "", 0, NULL); - tt_str_op(cp_alloc,==, "abcabc"); + tt_str_op(cp_alloc,OP_EQ, "abcabc"); tor_free(cp_alloc); cp_alloc = smartlist_join_strings(sl, "!", 0, NULL); - tt_str_op(cp_alloc,==, "abc!a!bc!"); + tt_str_op(cp_alloc,OP_EQ, "abc!a!bc!"); tor_free(cp_alloc); cp_alloc = smartlist_join_strings(sl, "XY", 0, NULL); - tt_str_op(cp_alloc,==, "abcXYaXYbcXY"); + tt_str_op(cp_alloc,OP_EQ, "abcXYaXYbcXY"); tor_free(cp_alloc); cp_alloc = smartlist_join_strings(sl, "XY", 1, NULL); - tt_str_op(cp_alloc,==, "abcXYaXYbcXYXY"); + tt_str_op(cp_alloc,OP_EQ, "abcXYaXYbcXYXY"); tor_free(cp_alloc); cp_alloc = smartlist_join_strings(sl, "", 1, NULL); - tt_str_op(cp_alloc,==, "abcabc"); + tt_str_op(cp_alloc,OP_EQ, "abcabc"); tor_free(cp_alloc); smartlist_split_string(sl, "/def/ /ghijk", "/", 0, 0); - tt_int_op(8,==, smartlist_len(sl)); - tt_str_op("",==, smartlist_get(sl, 4)); - tt_str_op("def",==, smartlist_get(sl, 5)); - tt_str_op(" ",==, smartlist_get(sl, 6)); - tt_str_op("ghijk",==, smartlist_get(sl, 7)); + tt_int_op(8,OP_EQ, smartlist_len(sl)); + tt_str_op("",OP_EQ, smartlist_get(sl, 4)); + tt_str_op("def",OP_EQ, smartlist_get(sl, 5)); + tt_str_op(" ",OP_EQ, smartlist_get(sl, 6)); + tt_str_op("ghijk",OP_EQ, smartlist_get(sl, 7)); SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); smartlist_clear(sl); smartlist_split_string(sl, "a,bbd,cdef", ",", SPLIT_SKIP_SPACE, 0); - tt_int_op(3,==, smartlist_len(sl)); - tt_str_op("a",==, smartlist_get(sl,0)); - tt_str_op("bbd",==, smartlist_get(sl,1)); - tt_str_op("cdef",==, smartlist_get(sl,2)); + tt_int_op(3,OP_EQ, smartlist_len(sl)); + tt_str_op("a",OP_EQ, smartlist_get(sl,0)); + tt_str_op("bbd",OP_EQ, smartlist_get(sl,1)); + tt_str_op("cdef",OP_EQ, smartlist_get(sl,2)); smartlist_split_string(sl, " z <> zhasd <> <> bnud<> ", "<>", SPLIT_SKIP_SPACE, 0); - tt_int_op(8,==, smartlist_len(sl)); - tt_str_op("z",==, smartlist_get(sl,3)); - tt_str_op("zhasd",==, smartlist_get(sl,4)); - tt_str_op("",==, smartlist_get(sl,5)); - tt_str_op("bnud",==, smartlist_get(sl,6)); - tt_str_op("",==, smartlist_get(sl,7)); + tt_int_op(8,OP_EQ, smartlist_len(sl)); + tt_str_op("z",OP_EQ, smartlist_get(sl,3)); + tt_str_op("zhasd",OP_EQ, smartlist_get(sl,4)); + tt_str_op("",OP_EQ, smartlist_get(sl,5)); + tt_str_op("bnud",OP_EQ, smartlist_get(sl,6)); + tt_str_op("",OP_EQ, smartlist_get(sl,7)); SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); smartlist_clear(sl); smartlist_split_string(sl, " ab\tc \td ef ", NULL, SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); - tt_int_op(4,==, smartlist_len(sl)); - tt_str_op("ab",==, smartlist_get(sl,0)); - tt_str_op("c",==, smartlist_get(sl,1)); - tt_str_op("d",==, smartlist_get(sl,2)); - tt_str_op("ef",==, smartlist_get(sl,3)); + tt_int_op(4,OP_EQ, smartlist_len(sl)); + tt_str_op("ab",OP_EQ, smartlist_get(sl,0)); + tt_str_op("c",OP_EQ, smartlist_get(sl,1)); + tt_str_op("d",OP_EQ, smartlist_get(sl,2)); + tt_str_op("ef",OP_EQ, smartlist_get(sl,3)); smartlist_split_string(sl, "ghi\tj", NULL, SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); - tt_int_op(6,==, smartlist_len(sl)); - tt_str_op("ghi",==, smartlist_get(sl,4)); - tt_str_op("j",==, smartlist_get(sl,5)); + tt_int_op(6,OP_EQ, smartlist_len(sl)); + tt_str_op("ghi",OP_EQ, smartlist_get(sl,4)); + tt_str_op("j",OP_EQ, smartlist_get(sl,5)); SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); smartlist_clear(sl); cp_alloc = smartlist_join_strings(sl, "XY", 0, NULL); - tt_str_op(cp_alloc,==, ""); + tt_str_op(cp_alloc,OP_EQ, ""); tor_free(cp_alloc); cp_alloc = smartlist_join_strings(sl, "XY", 1, NULL); - tt_str_op(cp_alloc,==, "XY"); + tt_str_op(cp_alloc,OP_EQ, "XY"); tor_free(cp_alloc); smartlist_split_string(sl, " z <> zhasd <> <> bnud<> ", "<>", SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); - tt_int_op(3,==, smartlist_len(sl)); - tt_str_op("z",==, smartlist_get(sl, 0)); - tt_str_op("zhasd",==, smartlist_get(sl, 1)); - tt_str_op("bnud",==, smartlist_get(sl, 2)); + tt_int_op(3,OP_EQ, smartlist_len(sl)); + tt_str_op("z",OP_EQ, smartlist_get(sl, 0)); + tt_str_op("zhasd",OP_EQ, smartlist_get(sl, 1)); + tt_str_op("bnud",OP_EQ, smartlist_get(sl, 2)); smartlist_split_string(sl, " z <> zhasd <> <> bnud<> ", "<>", SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 2); - tt_int_op(5,==, smartlist_len(sl)); - tt_str_op("z",==, smartlist_get(sl, 3)); - tt_str_op("zhasd <> <> bnud<>",==, smartlist_get(sl, 4)); + tt_int_op(5,OP_EQ, smartlist_len(sl)); + tt_str_op("z",OP_EQ, smartlist_get(sl, 3)); + tt_str_op("zhasd <> <> bnud<>",OP_EQ, smartlist_get(sl, 4)); SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); smartlist_clear(sl); smartlist_split_string(sl, "abcd\n", "\n", SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); - tt_int_op(1,==, smartlist_len(sl)); - tt_str_op("abcd",==, smartlist_get(sl, 0)); + tt_int_op(1,OP_EQ, smartlist_len(sl)); + tt_str_op("abcd",OP_EQ, smartlist_get(sl, 0)); smartlist_split_string(sl, "efgh", "\n", SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); - tt_int_op(2,==, smartlist_len(sl)); - tt_str_op("efgh",==, smartlist_get(sl, 1)); + tt_int_op(2,OP_EQ, smartlist_len(sl)); + tt_str_op("efgh",OP_EQ, smartlist_get(sl, 1)); SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); smartlist_clear(sl); /* Test swapping, shuffling, and sorting. */ smartlist_split_string(sl, "the,onion,router,by,arma,and,nickm", ",", 0, 0); - tt_int_op(7,==, smartlist_len(sl)); + tt_int_op(7,OP_EQ, smartlist_len(sl)); smartlist_sort(sl, compare_strs_); cp_alloc = smartlist_join_strings(sl, ",", 0, NULL); - tt_str_op(cp_alloc,==, "and,arma,by,nickm,onion,router,the"); + tt_str_op(cp_alloc,OP_EQ, "and,arma,by,nickm,onion,router,the"); tor_free(cp_alloc); smartlist_swap(sl, 1, 5); cp_alloc = smartlist_join_strings(sl, ",", 0, NULL); - tt_str_op(cp_alloc,==, "and,router,by,nickm,onion,arma,the"); + tt_str_op(cp_alloc,OP_EQ, "and,router,by,nickm,onion,arma,the"); tor_free(cp_alloc); smartlist_shuffle(sl); - tt_int_op(7,==, smartlist_len(sl)); + tt_int_op(7,OP_EQ, smartlist_len(sl)); tt_assert(smartlist_contains_string(sl, "and")); tt_assert(smartlist_contains_string(sl, "router")); tt_assert(smartlist_contains_string(sl, "by")); @@ -224,69 +224,72 @@ test_container_smartlist_strings(void *arg) /* Test bsearch. */ smartlist_sort(sl, compare_strs_); - tt_str_op("nickm",==, smartlist_bsearch(sl, "zNicKM", + tt_str_op("nickm",OP_EQ, smartlist_bsearch(sl, "zNicKM", cmp_without_first_)); - tt_str_op("and",==, + tt_str_op("and",OP_EQ, smartlist_bsearch(sl, " AND", cmp_without_first_)); - tt_ptr_op(NULL,==, smartlist_bsearch(sl, " ANz", cmp_without_first_)); + tt_ptr_op(NULL,OP_EQ, smartlist_bsearch(sl, " ANz", cmp_without_first_)); /* Test bsearch_idx */ { int f; smartlist_t *tmp = NULL; - tt_int_op(0,==,smartlist_bsearch_idx(sl," aaa",cmp_without_first_,&f)); - tt_int_op(f,==, 0); - tt_int_op(0,==, smartlist_bsearch_idx(sl," and",cmp_without_first_,&f)); - tt_int_op(f,==, 1); - tt_int_op(1,==, smartlist_bsearch_idx(sl," arm",cmp_without_first_,&f)); - tt_int_op(f,==, 0); - tt_int_op(1,==, smartlist_bsearch_idx(sl," arma",cmp_without_first_,&f)); - tt_int_op(f,==, 1); - tt_int_op(2,==, smartlist_bsearch_idx(sl," armb",cmp_without_first_,&f)); - tt_int_op(f,==, 0); - tt_int_op(7,==, smartlist_bsearch_idx(sl," zzzz",cmp_without_first_,&f)); - tt_int_op(f,==, 0); + tt_int_op(0,OP_EQ,smartlist_bsearch_idx(sl," aaa",cmp_without_first_,&f)); + tt_int_op(f,OP_EQ, 0); + tt_int_op(0,OP_EQ, smartlist_bsearch_idx(sl," and",cmp_without_first_,&f)); + tt_int_op(f,OP_EQ, 1); + tt_int_op(1,OP_EQ, smartlist_bsearch_idx(sl," arm",cmp_without_first_,&f)); + tt_int_op(f,OP_EQ, 0); + tt_int_op(1,OP_EQ, + smartlist_bsearch_idx(sl," arma",cmp_without_first_,&f)); + tt_int_op(f,OP_EQ, 1); + tt_int_op(2,OP_EQ, + smartlist_bsearch_idx(sl," armb",cmp_without_first_,&f)); + tt_int_op(f,OP_EQ, 0); + tt_int_op(7,OP_EQ, + smartlist_bsearch_idx(sl," zzzz",cmp_without_first_,&f)); + tt_int_op(f,OP_EQ, 0); /* Test trivial cases for list of length 0 or 1 */ tmp = smartlist_new(); - tt_int_op(0,==, smartlist_bsearch_idx(tmp, "foo", + tt_int_op(0,OP_EQ, smartlist_bsearch_idx(tmp, "foo", compare_strs_for_bsearch_, &f)); - tt_int_op(f,==, 0); + tt_int_op(f,OP_EQ, 0); smartlist_insert(tmp, 0, (void *)("bar")); - tt_int_op(1,==, smartlist_bsearch_idx(tmp, "foo", + tt_int_op(1,OP_EQ, smartlist_bsearch_idx(tmp, "foo", compare_strs_for_bsearch_, &f)); - tt_int_op(f,==, 0); - tt_int_op(0,==, smartlist_bsearch_idx(tmp, "aaa", + tt_int_op(f,OP_EQ, 0); + tt_int_op(0,OP_EQ, smartlist_bsearch_idx(tmp, "aaa", compare_strs_for_bsearch_, &f)); - tt_int_op(f,==, 0); - tt_int_op(0,==, smartlist_bsearch_idx(tmp, "bar", + tt_int_op(f,OP_EQ, 0); + tt_int_op(0,OP_EQ, smartlist_bsearch_idx(tmp, "bar", compare_strs_for_bsearch_, &f)); - tt_int_op(f,==, 1); + tt_int_op(f,OP_EQ, 1); /* ... and one for length 2 */ smartlist_insert(tmp, 1, (void *)("foo")); - tt_int_op(1,==, smartlist_bsearch_idx(tmp, "foo", + tt_int_op(1,OP_EQ, smartlist_bsearch_idx(tmp, "foo", compare_strs_for_bsearch_, &f)); - tt_int_op(f,==, 1); - tt_int_op(2,==, smartlist_bsearch_idx(tmp, "goo", + tt_int_op(f,OP_EQ, 1); + tt_int_op(2,OP_EQ, smartlist_bsearch_idx(tmp, "goo", compare_strs_for_bsearch_, &f)); - tt_int_op(f,==, 0); + tt_int_op(f,OP_EQ, 0); smartlist_free(tmp); } /* Test reverse() and pop_last() */ smartlist_reverse(sl); cp_alloc = smartlist_join_strings(sl, ",", 0, NULL); - tt_str_op(cp_alloc,==, "the,router,onion,nickm,by,arma,and"); + tt_str_op(cp_alloc,OP_EQ, "the,router,onion,nickm,by,arma,and"); tor_free(cp_alloc); cp_alloc = smartlist_pop_last(sl); - tt_str_op(cp_alloc,==, "and"); + tt_str_op(cp_alloc,OP_EQ, "and"); tor_free(cp_alloc); - tt_int_op(smartlist_len(sl),==, 6); + tt_int_op(smartlist_len(sl),OP_EQ, 6); SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); smartlist_clear(sl); cp_alloc = smartlist_pop_last(sl); - tt_ptr_op(cp_alloc,==, NULL); + tt_ptr_op(cp_alloc,OP_EQ, NULL); /* Test uniq() */ smartlist_split_string(sl, @@ -295,7 +298,7 @@ test_container_smartlist_strings(void *arg) smartlist_sort(sl, compare_strs_); smartlist_uniq(sl, compare_strs_, tor_free_); cp_alloc = smartlist_join_strings(sl, ",", 0, NULL); - tt_str_op(cp_alloc,==, "50,a,canal,man,noon,panama,plan,radar"); + tt_str_op(cp_alloc,OP_EQ, "50,a,canal,man,noon,panama,plan,radar"); tor_free(cp_alloc); /* Test contains_string, contains_string_case and contains_int_as_string */ @@ -331,17 +334,17 @@ test_container_smartlist_strings(void *arg) "Some say the Earth will end in ice and some in fire", " ", 0, 0); cp = smartlist_get(sl, 4); - tt_str_op(cp,==, "will"); + tt_str_op(cp,OP_EQ, "will"); smartlist_add(sl, cp); smartlist_remove(sl, cp); tor_free(cp); cp_alloc = smartlist_join_strings(sl, ",", 0, NULL); - tt_str_op(cp_alloc,==, "Some,say,the,Earth,fire,end,in,ice,and,some,in"); + tt_str_op(cp_alloc,OP_EQ, "Some,say,the,Earth,fire,end,in,ice,and,some,in"); tor_free(cp_alloc); smartlist_string_remove(sl, "in"); cp_alloc = smartlist_join_strings2(sl, "+XX", 1, 0, &sz); - tt_str_op(cp_alloc,==, "Some+say+the+Earth+fire+end+some+ice+and"); - tt_int_op((int)sz,==, 40); + tt_str_op(cp_alloc,OP_EQ, "Some+say+the+Earth+fire+end+some+ice+and"); + tt_int_op((int)sz,OP_EQ, 40); done: @@ -369,7 +372,7 @@ test_container_smartlist_overlap(void *arg) /* add_all */ smartlist_add_all(ints, odds); smartlist_add_all(ints, evens); - tt_int_op(smartlist_len(ints),==, 10); + tt_int_op(smartlist_len(ints),OP_EQ, 10); smartlist_add(primes, (void*)2); smartlist_add(primes, (void*)3); @@ -385,7 +388,7 @@ test_container_smartlist_overlap(void *arg) /* intersect */ smartlist_add_all(sl, odds); smartlist_intersect(sl, primes); - tt_int_op(smartlist_len(sl),==, 3); + tt_int_op(smartlist_len(sl),OP_EQ, 3); tt_assert(smartlist_contains(sl, (void*)3)); tt_assert(smartlist_contains(sl, (void*)5)); tt_assert(smartlist_contains(sl, (void*)7)); @@ -393,7 +396,7 @@ test_container_smartlist_overlap(void *arg) /* subtract */ smartlist_add_all(sl, primes); smartlist_subtract(sl, odds); - tt_int_op(smartlist_len(sl),==, 1); + tt_int_op(smartlist_len(sl),OP_EQ, 1); tt_assert(smartlist_contains(sl, (void*)2)); done: @@ -415,23 +418,23 @@ test_container_smartlist_digests(void *arg) smartlist_add(sl, tor_memdup("AAAAAAAAAAAAAAAAAAAA", DIGEST_LEN)); smartlist_add(sl, tor_memdup("\00090AAB2AAAAaasdAAAAA", DIGEST_LEN)); smartlist_add(sl, tor_memdup("\00090AAB2AAAAaasdAAAAA", DIGEST_LEN)); - tt_int_op(0,==, smartlist_contains_digest(NULL, "AAAAAAAAAAAAAAAAAAAA")); + tt_int_op(0,OP_EQ, smartlist_contains_digest(NULL, "AAAAAAAAAAAAAAAAAAAA")); tt_assert(smartlist_contains_digest(sl, "AAAAAAAAAAAAAAAAAAAA")); tt_assert(smartlist_contains_digest(sl, "\00090AAB2AAAAaasdAAAAA")); - tt_int_op(0,==, smartlist_contains_digest(sl, "\00090AAB2AAABaasdAAAAA")); + tt_int_op(0,OP_EQ, smartlist_contains_digest(sl, "\00090AAB2AAABaasdAAAAA")); /* sort digests */ smartlist_sort_digests(sl); - tt_mem_op(smartlist_get(sl, 0),==, "\00090AAB2AAAAaasdAAAAA", DIGEST_LEN); - tt_mem_op(smartlist_get(sl, 1),==, "\00090AAB2AAAAaasdAAAAA", DIGEST_LEN); - tt_mem_op(smartlist_get(sl, 2),==, "AAAAAAAAAAAAAAAAAAAA", DIGEST_LEN); - tt_int_op(3,==, smartlist_len(sl)); + tt_mem_op(smartlist_get(sl, 0),OP_EQ, "\00090AAB2AAAAaasdAAAAA", DIGEST_LEN); + tt_mem_op(smartlist_get(sl, 1),OP_EQ, "\00090AAB2AAAAaasdAAAAA", DIGEST_LEN); + tt_mem_op(smartlist_get(sl, 2),OP_EQ, "AAAAAAAAAAAAAAAAAAAA", DIGEST_LEN); + tt_int_op(3,OP_EQ, smartlist_len(sl)); /* uniq_digests */ smartlist_uniq_digests(sl); - tt_int_op(2,==, smartlist_len(sl)); - tt_mem_op(smartlist_get(sl, 0),==, "\00090AAB2AAAAaasdAAAAA", DIGEST_LEN); - tt_mem_op(smartlist_get(sl, 1),==, "AAAAAAAAAAAAAAAAAAAA", DIGEST_LEN); + tt_int_op(2,OP_EQ, smartlist_len(sl)); + tt_mem_op(smartlist_get(sl, 0),OP_EQ, "\00090AAB2AAAAaasdAAAAA", DIGEST_LEN); + tt_mem_op(smartlist_get(sl, 1),OP_EQ, "AAAAAAAAAAAAAAAAAAAA", DIGEST_LEN); done: SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); @@ -463,7 +466,7 @@ test_container_smartlist_join(void *arg) sl2, char *, cp2, strcmp(cp1,cp2), smartlist_add(sl3, cp2)) { - tt_str_op(cp1,==, cp2); + tt_str_op(cp1,OP_EQ, cp2); smartlist_add(sl4, cp1); } SMARTLIST_FOREACH_JOIN_END(cp1, cp2); @@ -474,10 +477,11 @@ test_container_smartlist_join(void *arg) tt_assert(smartlist_contains(sl, cp) && smartlist_contains_string(sl2, cp))); joined = smartlist_join_strings(sl3, ",", 0, NULL); - tt_str_op(joined,==, "Anemias,Anemias,Crossbowmen,Work"); + tt_str_op(joined,OP_EQ, "Anemias,Anemias,Crossbowmen,Work"); tor_free(joined); joined = smartlist_join_strings(sl4, ",", 0, NULL); - tt_str_op(joined,==, "Ambush,Anchorman,Anchorman,Bacon,Inhumane,Insurance," + tt_str_op(joined,OP_EQ, + "Ambush,Anchorman,Anchorman,Bacon,Inhumane,Insurance," "Knish,Know,Manners,Manners,Maraschinos,Wombats,Wombats"); tor_free(joined); @@ -612,7 +616,7 @@ test_container_digestset(void *arg) if (digestset_contains(set, d)) ++false_positives; } - tt_int_op(50, >, false_positives); /* Should be far lower. */ + tt_int_op(50, OP_GT, false_positives); /* Should be far lower. */ done: if (set) @@ -675,31 +679,31 @@ test_container_pqueue(void *arg) OK(); - tt_int_op(smartlist_len(sl),==, 11); - tt_ptr_op(smartlist_get(sl, 0),==, &apples); - tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),==, &apples); - tt_int_op(smartlist_len(sl),==, 10); + tt_int_op(smartlist_len(sl),OP_EQ, 11); + tt_ptr_op(smartlist_get(sl, 0),OP_EQ, &apples); + tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),OP_EQ, &apples); + tt_int_op(smartlist_len(sl),OP_EQ, 10); OK(); - tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),==, &cows); - tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),==, &daschunds); + tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),OP_EQ, &cows); + tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),OP_EQ, &daschunds); smartlist_pqueue_add(sl, cmp, offset, &chinchillas); OK(); smartlist_pqueue_add(sl, cmp, offset, &fireflies); OK(); - tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),==, &chinchillas); - tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),==, &eggplants); - tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),==, &fireflies); + tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),OP_EQ, &chinchillas); + tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),OP_EQ, &eggplants); + tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),OP_EQ, &fireflies); OK(); - tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),==, &fish); - tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),==, &frogs); - tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),==, &lobsters); - tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),==, &roquefort); + tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),OP_EQ, &fish); + tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),OP_EQ, &frogs); + tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),OP_EQ, &lobsters); + tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),OP_EQ, &roquefort); OK(); - tt_int_op(smartlist_len(sl),==, 3); - tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),==, &squid); - tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),==, &weissbier); - tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),==, &zebras); - tt_int_op(smartlist_len(sl),==, 0); + tt_int_op(smartlist_len(sl),OP_EQ, 3); + tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),OP_EQ, &squid); + tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),OP_EQ, &weissbier); + tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),OP_EQ, &zebras); + tt_int_op(smartlist_len(sl),OP_EQ, 0); OK(); /* Now test remove. */ @@ -709,21 +713,21 @@ test_container_pqueue(void *arg) smartlist_pqueue_add(sl, cmp, offset, &apples); smartlist_pqueue_add(sl, cmp, offset, &squid); smartlist_pqueue_add(sl, cmp, offset, &zebras); - tt_int_op(smartlist_len(sl),==, 6); + tt_int_op(smartlist_len(sl),OP_EQ, 6); OK(); smartlist_pqueue_remove(sl, cmp, offset, &zebras); - tt_int_op(smartlist_len(sl),==, 5); + tt_int_op(smartlist_len(sl),OP_EQ, 5); OK(); smartlist_pqueue_remove(sl, cmp, offset, &cows); - tt_int_op(smartlist_len(sl),==, 4); + tt_int_op(smartlist_len(sl),OP_EQ, 4); OK(); smartlist_pqueue_remove(sl, cmp, offset, &apples); - tt_int_op(smartlist_len(sl),==, 3); + tt_int_op(smartlist_len(sl),OP_EQ, 3); OK(); - tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),==, &fish); - tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),==, &frogs); - tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),==, &squid); - tt_int_op(smartlist_len(sl),==, 0); + tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),OP_EQ, &fish); + tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),OP_EQ, &frogs); + tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),OP_EQ, &squid); + tt_int_op(smartlist_len(sl),OP_EQ, 0); OK(); #undef OK @@ -755,30 +759,30 @@ test_container_strmap(void *arg) (void)arg; map = strmap_new(); tt_assert(map); - tt_int_op(strmap_size(map),==, 0); + tt_int_op(strmap_size(map),OP_EQ, 0); tt_assert(strmap_isempty(map)); v = strmap_set(map, "K1", v99); - tt_ptr_op(v,==, NULL); + tt_ptr_op(v,OP_EQ, NULL); tt_assert(!strmap_isempty(map)); v = strmap_set(map, "K2", v101); - tt_ptr_op(v,==, NULL); + tt_ptr_op(v,OP_EQ, NULL); v = strmap_set(map, "K1", v100); - tt_ptr_op(v,==, v99); - tt_ptr_op(strmap_get(map,"K1"),==, v100); - tt_ptr_op(strmap_get(map,"K2"),==, v101); - tt_ptr_op(strmap_get(map,"K-not-there"),==, NULL); + tt_ptr_op(v,OP_EQ, v99); + tt_ptr_op(strmap_get(map,"K1"),OP_EQ, v100); + tt_ptr_op(strmap_get(map,"K2"),OP_EQ, v101); + tt_ptr_op(strmap_get(map,"K-not-there"),OP_EQ, NULL); strmap_assert_ok(map); v = strmap_remove(map,"K2"); strmap_assert_ok(map); - tt_ptr_op(v,==, v101); - tt_ptr_op(strmap_get(map,"K2"),==, NULL); - tt_ptr_op(strmap_remove(map,"K2"),==, NULL); + tt_ptr_op(v,OP_EQ, v101); + tt_ptr_op(strmap_get(map,"K2"),OP_EQ, NULL); + tt_ptr_op(strmap_remove(map,"K2"),OP_EQ, NULL); strmap_set(map, "K2", v101); strmap_set(map, "K3", v102); strmap_set(map, "K4", v103); - tt_int_op(strmap_size(map),==, 4); + tt_int_op(strmap_size(map),OP_EQ, 4); strmap_assert_ok(map); strmap_set(map, "K5", v104); strmap_set(map, "K6", v105); @@ -790,7 +794,7 @@ test_container_strmap(void *arg) while (!strmap_iter_done(iter)) { strmap_iter_get(iter,&k,&v); smartlist_add(found_keys, tor_strdup(k)); - tt_ptr_op(v,==, strmap_get(map, k)); + tt_ptr_op(v,OP_EQ, strmap_get(map, k)); if (!strcmp(k, "K2")) { iter = strmap_iter_next_rmv(map,iter); @@ -800,12 +804,12 @@ test_container_strmap(void *arg) } /* Make sure we removed K2, but not the others. */ - tt_ptr_op(strmap_get(map, "K2"),==, NULL); - tt_ptr_op(strmap_get(map, "K5"),==, v104); + tt_ptr_op(strmap_get(map, "K2"),OP_EQ, NULL); + tt_ptr_op(strmap_get(map, "K5"),OP_EQ, v104); /* Make sure we visited everyone once */ smartlist_sort_strings(found_keys); visited = smartlist_join_strings(found_keys, ":", 0, NULL); - tt_str_op(visited,==, "K1:K2:K3:K4:K5:K6"); + tt_str_op(visited,OP_EQ, "K1:K2:K3:K4:K5:K6"); strmap_assert_ok(map); /* Clean up after ourselves. */ @@ -815,13 +819,13 @@ test_container_strmap(void *arg) /* Now try some lc functions. */ map = strmap_new(); strmap_set_lc(map,"Ab.C", v1); - tt_ptr_op(strmap_get(map,"ab.c"),==, v1); + tt_ptr_op(strmap_get(map,"ab.c"),OP_EQ, v1); strmap_assert_ok(map); - tt_ptr_op(strmap_get_lc(map,"AB.C"),==, v1); - tt_ptr_op(strmap_get(map,"AB.C"),==, NULL); - tt_ptr_op(strmap_remove_lc(map,"aB.C"),==, v1); + tt_ptr_op(strmap_get_lc(map,"AB.C"),OP_EQ, v1); + tt_ptr_op(strmap_get(map,"AB.C"),OP_EQ, NULL); + tt_ptr_op(strmap_remove_lc(map,"aB.C"),OP_EQ, v1); strmap_assert_ok(map); - tt_ptr_op(strmap_get_lc(map,"AB.C"),==, NULL); + tt_ptr_op(strmap_get_lc(map,"AB.C"),OP_EQ, NULL); done: if (map) @@ -853,41 +857,42 @@ test_container_order_functions(void *arg) (void)arg; lst[n++] = 12; - tt_int_op(12,==, median()); /* 12 */ + tt_int_op(12,OP_EQ, median()); /* 12 */ lst[n++] = 77; //smartlist_shuffle(sl); - tt_int_op(12,==, median()); /* 12, 77 */ + tt_int_op(12,OP_EQ, median()); /* 12, 77 */ lst[n++] = 77; //smartlist_shuffle(sl); - tt_int_op(77,==, median()); /* 12, 77, 77 */ + tt_int_op(77,OP_EQ, median()); /* 12, 77, 77 */ lst[n++] = 24; - tt_int_op(24,==, median()); /* 12,24,77,77 */ + tt_int_op(24,OP_EQ, median()); /* 12,24,77,77 */ lst[n++] = 60; lst[n++] = 12; lst[n++] = 25; //smartlist_shuffle(sl); - tt_int_op(25,==, median()); /* 12,12,24,25,60,77,77 */ + tt_int_op(25,OP_EQ, median()); /* 12,12,24,25,60,77,77 */ #undef median #define third_quartile() third_quartile_uint32(lst2, n) n = 0; lst2[n++] = 1; - tt_int_op(1,==, third_quartile()); /* ~1~ */ + tt_int_op(1,OP_EQ, third_quartile()); /* ~1~ */ lst2[n++] = 2; - tt_int_op(2,==, third_quartile()); /* 1, ~2~ */ + tt_int_op(2,OP_EQ, third_quartile()); /* 1, ~2~ */ lst2[n++] = 3; lst2[n++] = 4; lst2[n++] = 5; - tt_int_op(4,==, third_quartile()); /* 1, 2, 3, ~4~, 5 */ + tt_int_op(4,OP_EQ, third_quartile()); /* 1, 2, 3, ~4~, 5 */ lst2[n++] = 6; lst2[n++] = 7; lst2[n++] = 8; lst2[n++] = 9; - tt_int_op(7,==, third_quartile()); /* 1, 2, 3, 4, 5, 6, ~7~, 8, 9 */ + tt_int_op(7,OP_EQ, third_quartile()); /* 1, 2, 3, 4, 5, 6, ~7~, 8, 9 */ lst2[n++] = 10; lst2[n++] = 11; - tt_int_op(9,==, third_quartile()); /* 1, 2, 3, 4, 5, 6, 7, 8, ~9~, 10, 11 */ + /* 1, 2, 3, 4, 5, 6, 7, 8, ~9~, 10, 11 */ + tt_int_op(9,OP_EQ, third_quartile()); #undef third_quartile @@ -911,26 +916,26 @@ test_container_di_map(void *arg) (void)arg; /* Try searching on an empty map. */ - tt_ptr_op(NULL, ==, dimap_search(map, key1, NULL)); - tt_ptr_op(NULL, ==, dimap_search(map, key2, NULL)); - tt_ptr_op(v3, ==, dimap_search(map, key2, v3)); + tt_ptr_op(NULL, OP_EQ, dimap_search(map, key1, NULL)); + tt_ptr_op(NULL, OP_EQ, dimap_search(map, key2, NULL)); + tt_ptr_op(v3, OP_EQ, dimap_search(map, key2, v3)); dimap_free(map, NULL); map = NULL; /* Add a single entry. */ dimap_add_entry(&map, key1, v1); - tt_ptr_op(NULL, ==, dimap_search(map, key2, NULL)); - tt_ptr_op(v3, ==, dimap_search(map, key2, v3)); - tt_ptr_op(v1, ==, dimap_search(map, key1, NULL)); + tt_ptr_op(NULL, OP_EQ, dimap_search(map, key2, NULL)); + tt_ptr_op(v3, OP_EQ, dimap_search(map, key2, v3)); + tt_ptr_op(v1, OP_EQ, dimap_search(map, key1, NULL)); /* Now try it with three entries in the map. */ dimap_add_entry(&map, key2, v2); dimap_add_entry(&map, key3, v3); - tt_ptr_op(v1, ==, dimap_search(map, key1, NULL)); - tt_ptr_op(v2, ==, dimap_search(map, key2, NULL)); - tt_ptr_op(v3, ==, dimap_search(map, key3, NULL)); - tt_ptr_op(NULL, ==, dimap_search(map, key4, NULL)); - tt_ptr_op(v1, ==, dimap_search(map, key4, v1)); + tt_ptr_op(v1, OP_EQ, dimap_search(map, key1, NULL)); + tt_ptr_op(v2, OP_EQ, dimap_search(map, key2, NULL)); + tt_ptr_op(v3, OP_EQ, dimap_search(map, key3, NULL)); + tt_ptr_op(NULL, OP_EQ, dimap_search(map, key4, NULL)); + tt_ptr_op(v1, OP_EQ, dimap_search(map, key4, v1)); done: tor_free(v1); @@ -959,7 +964,7 @@ test_container_fp_pair_map(void *arg) (void)arg; map = fp_pair_map_new(); tt_assert(map); - tt_int_op(fp_pair_map_size(map),==, 0); + tt_int_op(fp_pair_map_size(map),OP_EQ, 0); tt_assert(fp_pair_map_isempty(map)); memset(fp1.first, 0x11, DIGEST_LEN); @@ -976,27 +981,27 @@ test_container_fp_pair_map(void *arg) memset(fp6.second, 0x62, DIGEST_LEN); v = fp_pair_map_set(map, &fp1, v99); - tt_ptr_op(v, ==, NULL); + tt_ptr_op(v, OP_EQ, NULL); tt_assert(!fp_pair_map_isempty(map)); v = fp_pair_map_set(map, &fp2, v101); - tt_ptr_op(v, ==, NULL); + tt_ptr_op(v, OP_EQ, NULL); v = fp_pair_map_set(map, &fp1, v100); - tt_ptr_op(v, ==, v99); - tt_ptr_op(fp_pair_map_get(map, &fp1),==, v100); - tt_ptr_op(fp_pair_map_get(map, &fp2),==, v101); - tt_ptr_op(fp_pair_map_get(map, &fp3),==, NULL); + tt_ptr_op(v, OP_EQ, v99); + tt_ptr_op(fp_pair_map_get(map, &fp1),OP_EQ, v100); + tt_ptr_op(fp_pair_map_get(map, &fp2),OP_EQ, v101); + tt_ptr_op(fp_pair_map_get(map, &fp3),OP_EQ, NULL); fp_pair_map_assert_ok(map); v = fp_pair_map_remove(map, &fp2); fp_pair_map_assert_ok(map); - tt_ptr_op(v,==, v101); - tt_ptr_op(fp_pair_map_get(map, &fp2),==, NULL); - tt_ptr_op(fp_pair_map_remove(map, &fp2),==, NULL); + tt_ptr_op(v,OP_EQ, v101); + tt_ptr_op(fp_pair_map_get(map, &fp2),OP_EQ, NULL); + tt_ptr_op(fp_pair_map_remove(map, &fp2),OP_EQ, NULL); fp_pair_map_set(map, &fp2, v101); fp_pair_map_set(map, &fp3, v102); fp_pair_map_set(map, &fp4, v103); - tt_int_op(fp_pair_map_size(map),==, 4); + tt_int_op(fp_pair_map_size(map),OP_EQ, 4); fp_pair_map_assert_ok(map); fp_pair_map_set(map, &fp5, v104); fp_pair_map_set(map, &fp6, v105); @@ -1006,7 +1011,7 @@ test_container_fp_pair_map(void *arg) iter = fp_pair_map_iter_init(map); while (!fp_pair_map_iter_done(iter)) { fp_pair_map_iter_get(iter, &k, &v); - tt_ptr_op(v,==, fp_pair_map_get(map, &k)); + tt_ptr_op(v,OP_EQ, fp_pair_map_get(map, &k)); if (tor_memeq(&fp2, &k, sizeof(fp2))) { iter = fp_pair_map_iter_next_rmv(map, iter); @@ -1016,8 +1021,8 @@ test_container_fp_pair_map(void *arg) } /* Make sure we removed fp2, but not the others. */ - tt_ptr_op(fp_pair_map_get(map, &fp2),==, NULL); - tt_ptr_op(fp_pair_map_get(map, &fp5),==, v104); + tt_ptr_op(fp_pair_map_get(map, &fp2),OP_EQ, NULL); + tt_ptr_op(fp_pair_map_get(map, &fp5),OP_EQ, v104); fp_pair_map_assert_ok(map); /* Clean up after ourselves. */ diff --git a/src/test/test_controller_events.c b/src/test/test_controller_events.c index 4d6077b641..e36314da45 100644 --- a/src/test/test_controller_events.c +++ b/src/test/test_controller_events.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2014, The Tor Project, Inc. */ +/* Copyright (c) 2013-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define CONNECTION_PRIVATE @@ -22,7 +22,7 @@ help_test_bucket_note_empty(uint32_t expected_msec_since_midnight, tvnow.tv_usec = (msec_since_epoch % 1000) * 1000; connection_buckets_note_empty_ts(×tamp_var, tokens_before, tokens_removed, &tvnow); - tt_int_op(expected_msec_since_midnight, ==, timestamp_var); + tt_int_op(expected_msec_since_midnight, OP_EQ, timestamp_var); done: ; @@ -57,20 +57,20 @@ test_cntev_bucket_millis_empty(void *arg) tvnow.tv_usec = 200000; /* Bucket has not been refilled. */ - tt_int_op(0, ==, bucket_millis_empty(0, 42120, 0, 100, &tvnow)); - tt_int_op(0, ==, bucket_millis_empty(-10, 42120, -10, 100, &tvnow)); + tt_int_op(0, OP_EQ, bucket_millis_empty(0, 42120, 0, 100, &tvnow)); + tt_int_op(0, OP_EQ, bucket_millis_empty(-10, 42120, -10, 100, &tvnow)); /* Bucket was not empty. */ - tt_int_op(0, ==, bucket_millis_empty(10, 42120, 20, 100, &tvnow)); + tt_int_op(0, OP_EQ, bucket_millis_empty(10, 42120, 20, 100, &tvnow)); /* Bucket has been emptied 80 msec ago and has just been refilled. */ - tt_int_op(80, ==, bucket_millis_empty(-20, 42120, -10, 100, &tvnow)); - tt_int_op(80, ==, bucket_millis_empty(-10, 42120, 0, 100, &tvnow)); - tt_int_op(80, ==, bucket_millis_empty(0, 42120, 10, 100, &tvnow)); + tt_int_op(80, OP_EQ, bucket_millis_empty(-20, 42120, -10, 100, &tvnow)); + tt_int_op(80, OP_EQ, bucket_millis_empty(-10, 42120, 0, 100, &tvnow)); + tt_int_op(80, OP_EQ, bucket_millis_empty(0, 42120, 10, 100, &tvnow)); /* Bucket has been emptied 180 msec ago, last refill was 100 msec ago * which was insufficient to make it positive, so cap msec at 100. */ - tt_int_op(100, ==, bucket_millis_empty(0, 42020, 1, 100, &tvnow)); + tt_int_op(100, OP_EQ, bucket_millis_empty(0, 42020, 1, 100, &tvnow)); /* 1970-01-02 00:00:00:050000 */ tvnow.tv_sec = 86400; @@ -78,7 +78,7 @@ test_cntev_bucket_millis_empty(void *arg) /* Last emptied 30 msec before midnight, tvnow is 50 msec after * midnight, that's 80 msec in total. */ - tt_int_op(80, ==, bucket_millis_empty(0, 86400000 - 30, 1, 100, &tvnow)); + tt_int_op(80, OP_EQ, bucket_millis_empty(0, 86400000 - 30, 1, 100, &tvnow)); done: ; @@ -118,26 +118,26 @@ test_cntev_sum_up_cell_stats(void *arg) cell_stats = tor_malloc_zero(sizeof(cell_stats_t)); add_testing_cell_stats_entry(circ, CELL_RELAY, 0, 0, 0); sum_up_cell_stats_by_command(circ, cell_stats); - tt_u64_op(1, ==, cell_stats->added_cells_appward[CELL_RELAY]); + tt_u64_op(1, OP_EQ, cell_stats->added_cells_appward[CELL_RELAY]); /* A single RELAY cell was added to the exitward queue. */ add_testing_cell_stats_entry(circ, CELL_RELAY, 0, 0, 1); sum_up_cell_stats_by_command(circ, cell_stats); - tt_u64_op(1, ==, cell_stats->added_cells_exitward[CELL_RELAY]); + tt_u64_op(1, OP_EQ, cell_stats->added_cells_exitward[CELL_RELAY]); /* A single RELAY cell was removed from the appward queue where it spent * 20 msec. */ add_testing_cell_stats_entry(circ, CELL_RELAY, 2, 1, 0); sum_up_cell_stats_by_command(circ, cell_stats); - tt_u64_op(20, ==, cell_stats->total_time_appward[CELL_RELAY]); - tt_u64_op(1, ==, cell_stats->removed_cells_appward[CELL_RELAY]); + tt_u64_op(20, OP_EQ, cell_stats->total_time_appward[CELL_RELAY]); + tt_u64_op(1, OP_EQ, cell_stats->removed_cells_appward[CELL_RELAY]); /* A single RELAY cell was removed from the exitward queue where it * spent 30 msec. */ add_testing_cell_stats_entry(circ, CELL_RELAY, 3, 1, 1); sum_up_cell_stats_by_command(circ, cell_stats); - tt_u64_op(30, ==, cell_stats->total_time_exitward[CELL_RELAY]); - tt_u64_op(1, ==, cell_stats->removed_cells_exitward[CELL_RELAY]); + tt_u64_op(30, OP_EQ, cell_stats->total_time_exitward[CELL_RELAY]); + tt_u64_op(1, OP_EQ, cell_stats->removed_cells_exitward[CELL_RELAY]); done: tor_free(cell_stats); @@ -164,7 +164,7 @@ test_cntev_append_cell_stats(void *arg) append_cell_stats_by_command(event_parts, key, include_if_non_zero, number_to_include); - tt_int_op(0, ==, smartlist_len(event_parts)); + tt_int_op(0, OP_EQ, smartlist_len(event_parts)); /* There's a RELAY cell to include, but the corresponding field in * include_if_non_zero is still zero. */ @@ -172,7 +172,7 @@ test_cntev_append_cell_stats(void *arg) append_cell_stats_by_command(event_parts, key, include_if_non_zero, number_to_include); - tt_int_op(0, ==, smartlist_len(event_parts)); + tt_int_op(0, OP_EQ, smartlist_len(event_parts)); /* Now include single RELAY cell. */ include_if_non_zero[CELL_RELAY] = 2; @@ -180,7 +180,7 @@ test_cntev_append_cell_stats(void *arg) include_if_non_zero, number_to_include); cp = smartlist_pop_last(event_parts); - tt_str_op("Z=relay:1", ==, cp); + tt_str_op("Z=relay:1", OP_EQ, cp); tor_free(cp); /* Add four CREATE cells. */ @@ -190,7 +190,7 @@ test_cntev_append_cell_stats(void *arg) include_if_non_zero, number_to_include); cp = smartlist_pop_last(event_parts); - tt_str_op("Z=create:4,relay:1", ==, cp); + tt_str_op("Z=create:4,relay:1", OP_EQ, cp); done: tor_free(cp); @@ -220,14 +220,14 @@ test_cntev_format_cell_stats(void *arg) /* Origin circuit was completely idle. */ cell_stats = tor_malloc_zero(sizeof(cell_stats_t)); format_cell_stats(&event_string, TO_CIRCUIT(ocirc), cell_stats); - tt_str_op("ID=2 OutboundQueue=3 OutboundConn=1", ==, event_string); + tt_str_op("ID=2 OutboundQueue=3 OutboundConn=1", OP_EQ, event_string); tor_free(event_string); /* Origin circuit had 4 RELAY cells added to its exitward queue. */ cell_stats->added_cells_exitward[CELL_RELAY] = 4; format_cell_stats(&event_string, TO_CIRCUIT(ocirc), cell_stats); tt_str_op("ID=2 OutboundQueue=3 OutboundConn=1 OutboundAdded=relay:4", - ==, event_string); + OP_EQ, event_string); tor_free(event_string); /* Origin circuit also had 5 CREATE2 cells added to its exitward @@ -235,7 +235,7 @@ test_cntev_format_cell_stats(void *arg) cell_stats->added_cells_exitward[CELL_CREATE2] = 5; format_cell_stats(&event_string, TO_CIRCUIT(ocirc), cell_stats); tt_str_op("ID=2 OutboundQueue=3 OutboundConn=1 OutboundAdded=relay:4," - "create2:5", ==, event_string); + "create2:5", OP_EQ, event_string); tor_free(event_string); /* Origin circuit also had 7 RELAY cells removed from its exitward queue @@ -245,7 +245,7 @@ test_cntev_format_cell_stats(void *arg) format_cell_stats(&event_string, TO_CIRCUIT(ocirc), cell_stats); tt_str_op("ID=2 OutboundQueue=3 OutboundConn=1 OutboundAdded=relay:4," "create2:5 OutboundRemoved=relay:7 OutboundTime=relay:6", - ==, event_string); + OP_EQ, event_string); tor_free(event_string); p_chan = tor_malloc_zero(sizeof(channel_tls_t)); @@ -265,14 +265,14 @@ test_cntev_format_cell_stats(void *arg) cell_stats = tor_malloc_zero(sizeof(cell_stats_t)); format_cell_stats(&event_string, TO_CIRCUIT(or_circ), cell_stats); tt_str_op("InboundQueue=8 InboundConn=2 OutboundQueue=9 OutboundConn=1", - ==, event_string); + OP_EQ, event_string); tor_free(event_string); /* OR circuit had 3 RELAY cells added to its appward queue. */ cell_stats->added_cells_appward[CELL_RELAY] = 3; format_cell_stats(&event_string, TO_CIRCUIT(or_circ), cell_stats); tt_str_op("InboundQueue=8 InboundConn=2 InboundAdded=relay:3 " - "OutboundQueue=9 OutboundConn=1", ==, event_string); + "OutboundQueue=9 OutboundConn=1", OP_EQ, event_string); tor_free(event_string); /* OR circuit had 7 RELAY cells removed from its appward queue which @@ -282,7 +282,7 @@ test_cntev_format_cell_stats(void *arg) format_cell_stats(&event_string, TO_CIRCUIT(or_circ), cell_stats); tt_str_op("InboundQueue=8 InboundConn=2 InboundAdded=relay:3 " "InboundRemoved=relay:7 InboundTime=relay:6 " - "OutboundQueue=9 OutboundConn=1", ==, event_string); + "OutboundQueue=9 OutboundConn=1", OP_EQ, event_string); done: tor_free(cell_stats); diff --git a/src/test/test_crypto.c b/src/test/test_crypto.c index 4416134ac4..e9fb8bf084 100644 --- a/src/test/test_crypto.c +++ b/src/test/test_crypto.c @@ -1,11 +1,10 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" #define CRYPTO_CURVE25519_PRIVATE -#define CRYPTO_S2K_PRIVATE #include "or.h" #include "test.h" #include "aes.h" @@ -14,8 +13,6 @@ #include "crypto_curve25519.h" #include "crypto_ed25519.h" #include "ed25519_vectors.inc" -#include "crypto_s2k.h" -#include "crypto_pwbox.h" extern const char AUTHORITY_SIGNKEY_3[]; extern const char AUTHORITY_SIGNKEY_A_DIGEST[]; @@ -34,24 +31,24 @@ test_crypto_dh(void *arg) ssize_t s1len, s2len; (void)arg; - tt_int_op(crypto_dh_get_bytes(dh1),==, DH_BYTES); - tt_int_op(crypto_dh_get_bytes(dh2),==, DH_BYTES); + tt_int_op(crypto_dh_get_bytes(dh1),OP_EQ, DH_BYTES); + tt_int_op(crypto_dh_get_bytes(dh2),OP_EQ, DH_BYTES); memset(p1, 0, DH_BYTES); memset(p2, 0, DH_BYTES); - tt_mem_op(p1,==, p2, DH_BYTES); + tt_mem_op(p1,OP_EQ, p2, DH_BYTES); tt_assert(! crypto_dh_get_public(dh1, p1, DH_BYTES)); - tt_mem_op(p1,!=, p2, DH_BYTES); + tt_mem_op(p1,OP_NE, p2, DH_BYTES); tt_assert(! crypto_dh_get_public(dh2, p2, DH_BYTES)); - tt_mem_op(p1,!=, p2, DH_BYTES); + tt_mem_op(p1,OP_NE, p2, DH_BYTES); memset(s1, 0, DH_BYTES); memset(s2, 0xFF, DH_BYTES); s1len = crypto_dh_compute_secret(LOG_WARN, dh1, p2, DH_BYTES, s1, 50); s2len = crypto_dh_compute_secret(LOG_WARN, dh2, p1, DH_BYTES, s2, 50); tt_assert(s1len > 0); - tt_int_op(s1len,==, s2len); - tt_mem_op(s1,==, s2, s1len); + tt_int_op(s1len,OP_EQ, s2len); + tt_mem_op(s1,OP_EQ, s2, s1len); { /* XXXX Now fabricate some bad values and make sure they get caught, @@ -78,7 +75,7 @@ test_crypto_rng(void *arg) tt_assert(! crypto_seed_rng(0)); crypto_rand(data1, 100); crypto_rand(data2, 100); - tt_mem_op(data1,!=, data2,100); + tt_mem_op(data1,OP_NE, data2,100); allok = 1; for (i = 0; i < 100; ++i) { uint64_t big; @@ -133,15 +130,15 @@ test_crypto_aes(void *arg) memset(data2, 0, 1024); memset(data3, 0, 1024); env1 = crypto_cipher_new(NULL); - tt_ptr_op(env1, !=, NULL); + tt_ptr_op(env1, OP_NE, NULL); env2 = crypto_cipher_new(crypto_cipher_get_key(env1)); - tt_ptr_op(env2, !=, NULL); + tt_ptr_op(env2, OP_NE, NULL); /* Try encrypting 512 chars. */ crypto_cipher_encrypt(env1, data2, data1, 512); crypto_cipher_decrypt(env2, data3, data2, 512); - tt_mem_op(data1,==, data3, 512); - tt_mem_op(data1,!=, data2, 512); + tt_mem_op(data1,OP_EQ, data3, 512); + tt_mem_op(data1,OP_NE, data2, 512); /* Now encrypt 1 at a time, and get 1 at a time. */ for (j = 512; j < 560; ++j) { @@ -150,7 +147,7 @@ test_crypto_aes(void *arg) for (j = 512; j < 560; ++j) { crypto_cipher_decrypt(env2, data3+j, data2+j, 1); } - tt_mem_op(data1,==, data3, 560); + tt_mem_op(data1,OP_EQ, data3, 560); /* Now encrypt 3 at a time, and get 5 at a time. */ for (j = 560; j < 1024-5; j += 3) { crypto_cipher_encrypt(env1, data2+j, data1+j, 3); @@ -158,7 +155,7 @@ test_crypto_aes(void *arg) for (j = 560; j < 1024-5; j += 5) { crypto_cipher_decrypt(env2, data3+j, data2+j, 5); } - tt_mem_op(data1,==, data3, 1024-5); + tt_mem_op(data1,OP_EQ, data3, 1024-5); /* Now make sure that when we encrypt with different chunk sizes, we get the same results. */ crypto_cipher_free(env2); @@ -166,7 +163,7 @@ test_crypto_aes(void *arg) memset(data3, 0, 1024); env2 = crypto_cipher_new(crypto_cipher_get_key(env1)); - tt_ptr_op(env2, !=, NULL); + tt_ptr_op(env2, OP_NE, NULL); for (j = 0; j < 1024-16; j += 17) { crypto_cipher_encrypt(env2, data3+j, data1+j, 17); } @@ -175,7 +172,7 @@ test_crypto_aes(void *arg) printf("%d: %d\t%d\n", j, (int) data2[j], (int) data3[j]); } } - tt_mem_op(data2,==, data3, 1024-16); + tt_mem_op(data2,OP_EQ, data3, 1024-16); crypto_cipher_free(env1); env1 = NULL; crypto_cipher_free(env2); @@ -271,25 +268,25 @@ test_crypto_sha(void *arg) (void)arg; i = crypto_digest(data, "abc", 3); test_memeq_hex(data, "A9993E364706816ABA3E25717850C26C9CD0D89D"); - tt_int_op(i, ==, 0); + tt_int_op(i, OP_EQ, 0); /* Test SHA-256 with a test vector from the specification. */ i = crypto_digest256(data, "abc", 3, DIGEST_SHA256); test_memeq_hex(data, "BA7816BF8F01CFEA414140DE5DAE2223B00361A3" "96177A9CB410FF61F20015AD"); - tt_int_op(i, ==, 0); + tt_int_op(i, OP_EQ, 0); /* Test HMAC-SHA256 with test cases from wikipedia and RFC 4231 */ /* Case empty (wikipedia) */ crypto_hmac_sha256(digest, "", 0, "", 0); - tt_str_op(hex_str(digest, 32),==, + tt_str_op(hex_str(digest, 32),OP_EQ, "B613679A0814D9EC772F95D778C35FC5FF1697C493715653C6C712144292C5AD"); /* Case quick-brown (wikipedia) */ crypto_hmac_sha256(digest, "key", 3, "The quick brown fox jumps over the lazy dog", 43); - tt_str_op(hex_str(digest, 32),==, + tt_str_op(hex_str(digest, 32),OP_EQ, "F7BC83F430538424B13298E6AA6FB143EF4D59A14946175997479DBC2D1A3CD8"); /* "Test Case 1" from RFC 4231 */ @@ -357,15 +354,15 @@ test_crypto_sha(void *arg) crypto_digest_add_bytes(d2, "ghijkl", 6); crypto_digest_get_digest(d2, d_out1, sizeof(d_out1)); crypto_digest(d_out2, "abcdefghijkl", 12); - tt_mem_op(d_out1,==, d_out2, DIGEST_LEN); + tt_mem_op(d_out1,OP_EQ, d_out2, DIGEST_LEN); crypto_digest_assign(d2, d1); crypto_digest_add_bytes(d2, "mno", 3); crypto_digest_get_digest(d2, d_out1, sizeof(d_out1)); crypto_digest(d_out2, "abcdefmno", 9); - tt_mem_op(d_out1,==, d_out2, DIGEST_LEN); + tt_mem_op(d_out1,OP_EQ, d_out2, DIGEST_LEN); crypto_digest_get_digest(d1, d_out1, sizeof(d_out1)); crypto_digest(d_out2, "abcdef", 6); - tt_mem_op(d_out1,==, d_out2, DIGEST_LEN); + tt_mem_op(d_out1,OP_EQ, d_out2, DIGEST_LEN); crypto_digest_free(d1); crypto_digest_free(d2); @@ -378,15 +375,15 @@ test_crypto_sha(void *arg) crypto_digest_add_bytes(d2, "ghijkl", 6); crypto_digest_get_digest(d2, d_out1, sizeof(d_out1)); crypto_digest256(d_out2, "abcdefghijkl", 12, DIGEST_SHA256); - tt_mem_op(d_out1,==, d_out2, DIGEST_LEN); + tt_mem_op(d_out1,OP_EQ, d_out2, DIGEST_LEN); crypto_digest_assign(d2, d1); crypto_digest_add_bytes(d2, "mno", 3); crypto_digest_get_digest(d2, d_out1, sizeof(d_out1)); crypto_digest256(d_out2, "abcdefmno", 9, DIGEST_SHA256); - tt_mem_op(d_out1,==, d_out2, DIGEST_LEN); + tt_mem_op(d_out1,OP_EQ, d_out2, DIGEST_LEN); crypto_digest_get_digest(d1, d_out1, sizeof(d_out1)); crypto_digest256(d_out2, "abcdef", 6, DIGEST_SHA256); - tt_mem_op(d_out1,==, d_out2, DIGEST_LEN); + tt_mem_op(d_out1,OP_EQ, d_out2, DIGEST_LEN); done: if (d1) @@ -413,42 +410,42 @@ test_crypto_pk(void *arg) tt_assert(pk1 && pk2); tt_assert(! crypto_pk_write_public_key_to_string(pk1, &encoded, &size)); tt_assert(! crypto_pk_read_public_key_from_string(pk2, encoded, size)); - tt_int_op(0,==, crypto_pk_cmp_keys(pk1, pk2)); + tt_int_op(0,OP_EQ, crypto_pk_cmp_keys(pk1, pk2)); /* comparison between keys and NULL */ - tt_int_op(crypto_pk_cmp_keys(NULL, pk1), <, 0); - tt_int_op(crypto_pk_cmp_keys(NULL, NULL), ==, 0); - tt_int_op(crypto_pk_cmp_keys(pk1, NULL), >, 0); + tt_int_op(crypto_pk_cmp_keys(NULL, pk1), OP_LT, 0); + tt_int_op(crypto_pk_cmp_keys(NULL, NULL), OP_EQ, 0); + tt_int_op(crypto_pk_cmp_keys(pk1, NULL), OP_GT, 0); - tt_int_op(128,==, crypto_pk_keysize(pk1)); - tt_int_op(1024,==, crypto_pk_num_bits(pk1)); - tt_int_op(128,==, crypto_pk_keysize(pk2)); - tt_int_op(1024,==, crypto_pk_num_bits(pk2)); + tt_int_op(128,OP_EQ, crypto_pk_keysize(pk1)); + tt_int_op(1024,OP_EQ, crypto_pk_num_bits(pk1)); + tt_int_op(128,OP_EQ, crypto_pk_keysize(pk2)); + tt_int_op(1024,OP_EQ, crypto_pk_num_bits(pk2)); - tt_int_op(128,==, crypto_pk_public_encrypt(pk2, data1, sizeof(data1), + tt_int_op(128,OP_EQ, crypto_pk_public_encrypt(pk2, data1, sizeof(data1), "Hello whirled.", 15, PK_PKCS1_OAEP_PADDING)); - tt_int_op(128,==, crypto_pk_public_encrypt(pk1, data2, sizeof(data1), + tt_int_op(128,OP_EQ, crypto_pk_public_encrypt(pk1, data2, sizeof(data1), "Hello whirled.", 15, PK_PKCS1_OAEP_PADDING)); /* oaep padding should make encryption not match */ - tt_mem_op(data1,!=, data2, 128); - tt_int_op(15,==, + tt_mem_op(data1,OP_NE, data2, 128); + tt_int_op(15,OP_EQ, crypto_pk_private_decrypt(pk1, data3, sizeof(data3), data1, 128, PK_PKCS1_OAEP_PADDING,1)); - tt_str_op(data3,==, "Hello whirled."); + tt_str_op(data3,OP_EQ, "Hello whirled."); memset(data3, 0, 1024); - tt_int_op(15,==, + tt_int_op(15,OP_EQ, crypto_pk_private_decrypt(pk1, data3, sizeof(data3), data2, 128, PK_PKCS1_OAEP_PADDING,1)); - tt_str_op(data3,==, "Hello whirled."); + tt_str_op(data3,OP_EQ, "Hello whirled."); /* Can't decrypt with public key. */ - tt_int_op(-1,==, + tt_int_op(-1,OP_EQ, crypto_pk_private_decrypt(pk2, data3, sizeof(data3), data2, 128, PK_PKCS1_OAEP_PADDING,1)); /* Try again with bad padding */ memcpy(data2+1, "XYZZY", 5); /* This has fails ~ once-in-2^40 */ - tt_int_op(-1,==, + tt_int_op(-1,OP_EQ, crypto_pk_private_decrypt(pk1, data3, sizeof(data3), data2, 128, PK_PKCS1_OAEP_PADDING,1)); @@ -464,25 +461,25 @@ test_crypto_pk(void *arg) get_fname("xyzzy")) < 0); tt_assert(! crypto_pk_read_private_key_from_filename(pk2, get_fname("pkey1"))); - tt_int_op(15,==, + tt_int_op(15,OP_EQ, crypto_pk_private_decrypt(pk2, data3, sizeof(data3), data1, 128, PK_PKCS1_OAEP_PADDING,1)); /* Now try signing. */ strlcpy(data1, "Ossifrage", 1024); - tt_int_op(128,==, + tt_int_op(128,OP_EQ, crypto_pk_private_sign(pk1, data2, sizeof(data2), data1, 10)); - tt_int_op(10,==, + tt_int_op(10,OP_EQ, crypto_pk_public_checksig(pk1, data3, sizeof(data3), data2, 128)); - tt_str_op(data3,==, "Ossifrage"); + tt_str_op(data3,OP_EQ, "Ossifrage"); /* Try signing digests. */ - tt_int_op(128,==, crypto_pk_private_sign_digest(pk1, data2, sizeof(data2), + tt_int_op(128,OP_EQ, crypto_pk_private_sign_digest(pk1, data2, sizeof(data2), data1, 10)); - tt_int_op(20,==, + tt_int_op(20,OP_EQ, crypto_pk_public_checksig(pk1, data3, sizeof(data3), data2, 128)); - tt_int_op(0,==, + tt_int_op(0,OP_EQ, crypto_pk_public_checksig_digest(pk1, data1, 10, data2, 128)); - tt_int_op(-1,==, + tt_int_op(-1,OP_EQ, crypto_pk_public_checksig_digest(pk1, data1, 11, data2, 128)); /*XXXX test failed signing*/ @@ -491,7 +488,7 @@ test_crypto_pk(void *arg) crypto_pk_free(pk2); pk2 = NULL; i = crypto_pk_asn1_encode(pk1, data1, 1024); - tt_int_op(i, >, 0); + tt_int_op(i, OP_GT, 0); pk2 = crypto_pk_asn1_decode(data1, i); tt_assert(crypto_pk_cmp_keys(pk1,pk2) == 0); @@ -502,18 +499,18 @@ test_crypto_pk(void *arg) memset(data3,0,1024); len = crypto_pk_public_hybrid_encrypt(pk1,data2,sizeof(data2), data1,i,PK_PKCS1_OAEP_PADDING,0); - tt_int_op(len, >=, 0); + tt_int_op(len, OP_GE, 0); len = crypto_pk_private_hybrid_decrypt(pk1,data3,sizeof(data3), data2,len,PK_PKCS1_OAEP_PADDING,1); - tt_int_op(len,==, i); - tt_mem_op(data1,==, data3,i); + tt_int_op(len,OP_EQ, i); + tt_mem_op(data1,OP_EQ, data3,i); } /* Try copy_full */ crypto_pk_free(pk2); pk2 = crypto_pk_copy_full(pk1); tt_assert(pk2 != NULL); - tt_ptr_op(pk1, !=, pk2); + tt_ptr_op(pk1, OP_NE, pk2); tt_assert(crypto_pk_cmp_keys(pk1,pk2) == 0); done: @@ -540,33 +537,33 @@ test_crypto_pk_fingerprints(void *arg) pk = pk_generate(1); tt_assert(pk); n = crypto_pk_asn1_encode(pk, encoded, sizeof(encoded)); - tt_int_op(n, >, 0); - tt_int_op(n, >, 128); - tt_int_op(n, <, 256); + tt_int_op(n, OP_GT, 0); + tt_int_op(n, OP_GT, 128); + tt_int_op(n, OP_LT, 256); /* Is digest as expected? */ crypto_digest(d, encoded, n); - tt_int_op(0, ==, crypto_pk_get_digest(pk, d2)); - tt_mem_op(d,==, d2, DIGEST_LEN); + tt_int_op(0, OP_EQ, crypto_pk_get_digest(pk, d2)); + tt_mem_op(d,OP_EQ, d2, DIGEST_LEN); /* Is fingerprint right? */ - tt_int_op(0, ==, crypto_pk_get_fingerprint(pk, fingerprint, 0)); - tt_int_op(strlen(fingerprint), ==, DIGEST_LEN * 2); + tt_int_op(0, OP_EQ, crypto_pk_get_fingerprint(pk, fingerprint, 0)); + tt_int_op(strlen(fingerprint), OP_EQ, DIGEST_LEN * 2); test_memeq_hex(d, fingerprint); /* Are spaces right? */ - tt_int_op(0, ==, crypto_pk_get_fingerprint(pk, fingerprint, 1)); + tt_int_op(0, OP_EQ, crypto_pk_get_fingerprint(pk, fingerprint, 1)); for (i = 4; i < strlen(fingerprint); i += 5) { - tt_int_op(fingerprint[i], ==, ' '); + tt_int_op(fingerprint[i], OP_EQ, ' '); } tor_strstrip(fingerprint, " "); - tt_int_op(strlen(fingerprint), ==, DIGEST_LEN * 2); + tt_int_op(strlen(fingerprint), OP_EQ, DIGEST_LEN * 2); test_memeq_hex(d, fingerprint); /* Now hash again and check crypto_pk_get_hashed_fingerprint. */ crypto_digest(d2, d, sizeof(d)); - tt_int_op(0, ==, crypto_pk_get_hashed_fingerprint(pk, fingerprint)); - tt_int_op(strlen(fingerprint), ==, DIGEST_LEN * 2); + tt_int_op(0, OP_EQ, crypto_pk_get_hashed_fingerprint(pk, fingerprint)); + tt_int_op(strlen(fingerprint), OP_EQ, DIGEST_LEN * 2); test_memeq_hex(d2, fingerprint); done: @@ -591,14 +588,14 @@ test_crypto_digests(void *arg) r = crypto_pk_get_digest(k, digest); tt_assert(r == 0); - tt_mem_op(hex_str(digest, DIGEST_LEN),==, + tt_mem_op(hex_str(digest, DIGEST_LEN),OP_EQ, AUTHORITY_SIGNKEY_A_DIGEST, HEX_DIGEST_LEN); r = crypto_pk_get_all_digests(k, &pkey_digests); - tt_mem_op(hex_str(pkey_digests.d[DIGEST_SHA1], DIGEST_LEN),==, + tt_mem_op(hex_str(pkey_digests.d[DIGEST_SHA1], DIGEST_LEN),OP_EQ, AUTHORITY_SIGNKEY_A_DIGEST, HEX_DIGEST_LEN); - tt_mem_op(hex_str(pkey_digests.d[DIGEST_SHA256], DIGEST256_LEN),==, + tt_mem_op(hex_str(pkey_digests.d[DIGEST_SHA256], DIGEST256_LEN),OP_EQ, AUTHORITY_SIGNKEY_A_DIGEST256, HEX_DIGEST256_LEN); done: crypto_pk_free(k); @@ -622,31 +619,31 @@ test_crypto_formats(void *arg) memset(data1, 6, 1024); for (idx = 0; idx < 10; ++idx) { i = base64_encode(data2, 1024, data1, idx); - tt_int_op(i, >=, 0); + tt_int_op(i, OP_GE, 0); j = base64_decode(data3, 1024, data2, i); - tt_int_op(j,==, idx); - tt_mem_op(data3,==, data1, idx); + tt_int_op(j,OP_EQ, idx); + tt_mem_op(data3,OP_EQ, data1, idx); } strlcpy(data1, "Test string that contains 35 chars.", 1024); strlcat(data1, " 2nd string that contains 35 chars.", 1024); i = base64_encode(data2, 1024, data1, 71); - tt_int_op(i, >=, 0); + tt_int_op(i, OP_GE, 0); j = base64_decode(data3, 1024, data2, i); - tt_int_op(j,==, 71); - tt_str_op(data3,==, data1); - tt_int_op(data2[i], ==, '\0'); + tt_int_op(j,OP_EQ, 71); + tt_str_op(data3,OP_EQ, data1); + tt_int_op(data2[i], OP_EQ, '\0'); crypto_rand(data1, DIGEST_LEN); memset(data2, 100, 1024); digest_to_base64(data2, data1); - tt_int_op(BASE64_DIGEST_LEN,==, strlen(data2)); - tt_int_op(100,==, data2[BASE64_DIGEST_LEN+2]); + tt_int_op(BASE64_DIGEST_LEN,OP_EQ, strlen(data2)); + tt_int_op(100,OP_EQ, data2[BASE64_DIGEST_LEN+2]); memset(data3, 99, 1024); - tt_int_op(digest_from_base64(data3, data2),==, 0); - tt_mem_op(data1,==, data3, DIGEST_LEN); - tt_int_op(99,==, data3[DIGEST_LEN+1]); + tt_int_op(digest_from_base64(data3, data2),OP_EQ, 0); + tt_mem_op(data1,OP_EQ, data3, DIGEST_LEN); + tt_int_op(99,OP_EQ, data3[DIGEST_LEN+1]); tt_assert(digest_from_base64(data3, "###") < 0); @@ -654,12 +651,12 @@ test_crypto_formats(void *arg) crypto_rand(data2, DIGEST256_LEN); memset(data2, 100, 1024); digest256_to_base64(data2, data1); - tt_int_op(BASE64_DIGEST256_LEN,==, strlen(data2)); - tt_int_op(100,==, data2[BASE64_DIGEST256_LEN+2]); + tt_int_op(BASE64_DIGEST256_LEN,OP_EQ, strlen(data2)); + tt_int_op(100,OP_EQ, data2[BASE64_DIGEST256_LEN+2]); memset(data3, 99, 1024); - tt_int_op(digest256_from_base64(data3, data2),==, 0); - tt_mem_op(data1,==, data3, DIGEST256_LEN); - tt_int_op(99,==, data3[DIGEST256_LEN+1]); + tt_int_op(digest256_from_base64(data3, data2),OP_EQ, 0); + tt_mem_op(data1,OP_EQ, data3, DIGEST256_LEN); + tt_int_op(99,OP_EQ, data3[DIGEST256_LEN+1]); /* Base32 tests */ strlcpy(data1, "5chrs", 1024); @@ -668,27 +665,27 @@ test_crypto_formats(void *arg) * By 5s: [00110 10101 10001 10110 10000 11100 10011 10011] */ base32_encode(data2, 9, data1, 5); - tt_str_op(data2,==, "gvrwq4tt"); + tt_str_op(data2,OP_EQ, "gvrwq4tt"); strlcpy(data1, "\xFF\xF5\x6D\x44\xAE\x0D\x5C\xC9\x62\xC4", 1024); base32_encode(data2, 30, data1, 10); - tt_str_op(data2,==, "772w2rfobvomsywe"); + tt_str_op(data2,OP_EQ, "772w2rfobvomsywe"); /* Base16 tests */ strlcpy(data1, "6chrs\xff", 1024); base16_encode(data2, 13, data1, 6); - tt_str_op(data2,==, "3663687273FF"); + tt_str_op(data2,OP_EQ, "3663687273FF"); strlcpy(data1, "f0d678affc000100", 1024); i = base16_decode(data2, 8, data1, 16); - tt_int_op(i,==, 0); - tt_mem_op(data2,==, "\xf0\xd6\x78\xaf\xfc\x00\x01\x00",8); + tt_int_op(i,OP_EQ, 0); + tt_mem_op(data2,OP_EQ, "\xf0\xd6\x78\xaf\xfc\x00\x01\x00",8); /* now try some failing base16 decodes */ - tt_int_op(-1,==, base16_decode(data2, 8, data1, 15)); /* odd input len */ - tt_int_op(-1,==, base16_decode(data2, 7, data1, 16)); /* dest too short */ + tt_int_op(-1,OP_EQ, base16_decode(data2, 8, data1, 15)); /* odd input len */ + tt_int_op(-1,OP_EQ, base16_decode(data2, 7, data1, 16)); /* dest too short */ strlcpy(data1, "f0dz!8affc000100", 1024); - tt_int_op(-1,==, base16_decode(data2, 8, data1, 16)); + tt_int_op(-1,OP_EQ, base16_decode(data2, 8, data1, 16)); tor_free(data1); tor_free(data2); @@ -697,10 +694,11 @@ test_crypto_formats(void *arg) /* Add spaces to fingerprint */ { data1 = tor_strdup("ABCD1234ABCD56780000ABCD1234ABCD56780000"); - tt_int_op(strlen(data1),==, 40); + tt_int_op(strlen(data1),OP_EQ, 40); data2 = tor_malloc(FINGERPRINT_LEN+1); crypto_add_spaces_to_fp(data2, FINGERPRINT_LEN+1, data1); - tt_str_op(data2,==, "ABCD 1234 ABCD 5678 0000 ABCD 1234 ABCD 5678 0000"); + tt_str_op(data2, OP_EQ, + "ABCD 1234 ABCD 5678 0000 ABCD 1234 ABCD 5678 0000"); tor_free(data1); tor_free(data2); } @@ -711,379 +709,6 @@ test_crypto_formats(void *arg) tor_free(data3); } -/** Run unit tests for our secret-to-key passphrase hashing functionality. */ -static void -test_crypto_s2k_rfc2440(void *arg) -{ - char buf[29]; - char buf2[29]; - char *buf3 = NULL; - int i; - - (void)arg; - memset(buf, 0, sizeof(buf)); - memset(buf2, 0, sizeof(buf2)); - buf3 = tor_malloc(65536); - memset(buf3, 0, 65536); - - secret_to_key_rfc2440(buf+9, 20, "", 0, buf); - crypto_digest(buf2+9, buf3, 1024); - tt_mem_op(buf,==, buf2, 29); - - memcpy(buf,"vrbacrda",8); - memcpy(buf2,"vrbacrda",8); - buf[8] = 96; - buf2[8] = 96; - secret_to_key_rfc2440(buf+9, 20, "12345678", 8, buf); - for (i = 0; i < 65536; i += 16) { - memcpy(buf3+i, "vrbacrda12345678", 16); - } - crypto_digest(buf2+9, buf3, 65536); - tt_mem_op(buf,==, buf2, 29); - - done: - tor_free(buf3); -} - -static void -run_s2k_tests(const unsigned flags, const unsigned type, - int speclen, const int keylen, int legacy) -{ - uint8_t buf[S2K_MAXLEN], buf2[S2K_MAXLEN], buf3[S2K_MAXLEN]; - int r; - size_t sz; - const char pw1[] = "You can't come in here unless you say swordfish!"; - const char pw2[] = "Now, I give you one more guess."; - - r = secret_to_key_new(buf, sizeof(buf), &sz, - pw1, strlen(pw1), flags); - tt_int_op(r, ==, S2K_OKAY); - tt_int_op(buf[0], ==, type); - - tt_int_op(sz, ==, keylen + speclen); - - if (legacy) { - memmove(buf, buf+1, sz-1); - --sz; - --speclen; - } - - tt_int_op(S2K_OKAY, ==, - secret_to_key_check(buf, sz, pw1, strlen(pw1))); - - tt_int_op(S2K_BAD_SECRET, ==, - secret_to_key_check(buf, sz, pw2, strlen(pw2))); - - /* Move key to buf2, and clear it. */ - memset(buf3, 0, sizeof(buf3)); - memcpy(buf2, buf+speclen, keylen); - memset(buf+speclen, 0, sz - speclen); - - /* Derivekey should produce the same results. */ - tt_int_op(S2K_OKAY, ==, - secret_to_key_derivekey(buf3, keylen, buf, speclen, pw1, strlen(pw1))); - - tt_mem_op(buf2, ==, buf3, keylen); - - /* Derivekey with a longer output should fill the output. */ - memset(buf2, 0, sizeof(buf2)); - tt_int_op(S2K_OKAY, ==, - secret_to_key_derivekey(buf2, sizeof(buf2), buf, speclen, - pw1, strlen(pw1))); - - tt_mem_op(buf2, !=, buf3, sizeof(buf2)); - - memset(buf3, 0, sizeof(buf3)); - tt_int_op(S2K_OKAY, ==, - secret_to_key_derivekey(buf3, sizeof(buf3), buf, speclen, - pw1, strlen(pw1))); - tt_mem_op(buf2, ==, buf3, sizeof(buf3)); - tt_assert(!tor_mem_is_zero((char*)buf2+keylen, sizeof(buf2)-keylen)); - - done: - ; -} - -static void -test_crypto_s2k_general(void *arg) -{ - const char *which = arg; - - if (!strcmp(which, "scrypt")) { - run_s2k_tests(0, 2, 19, 32, 0); - } else if (!strcmp(which, "scrypt-low")) { - run_s2k_tests(S2K_FLAG_LOW_MEM, 2, 19, 32, 0); - } else if (!strcmp(which, "pbkdf2")) { - run_s2k_tests(S2K_FLAG_USE_PBKDF2, 1, 18, 20, 0); - } else if (!strcmp(which, "rfc2440")) { - run_s2k_tests(S2K_FLAG_NO_SCRYPT, 0, 10, 20, 0); - } else if (!strcmp(which, "rfc2440-legacy")) { - run_s2k_tests(S2K_FLAG_NO_SCRYPT, 0, 10, 20, 1); - } else { - tt_fail(); - } -} - -static void -test_crypto_s2k_errors(void *arg) -{ - uint8_t buf[S2K_MAXLEN], buf2[S2K_MAXLEN]; - size_t sz; - - (void)arg; - - /* Bogus specifiers: simple */ - tt_int_op(S2K_BAD_LEN, ==, - secret_to_key_derivekey(buf, sizeof(buf), - (const uint8_t*)"", 0, "ABC", 3)); - tt_int_op(S2K_BAD_ALGORITHM, ==, - secret_to_key_derivekey(buf, sizeof(buf), - (const uint8_t*)"\x10", 1, "ABC", 3)); - tt_int_op(S2K_BAD_LEN, ==, - secret_to_key_derivekey(buf, sizeof(buf), - (const uint8_t*)"\x01\x02", 2, "ABC", 3)); - - tt_int_op(S2K_BAD_LEN, ==, - secret_to_key_check((const uint8_t*)"", 0, "ABC", 3)); - tt_int_op(S2K_BAD_ALGORITHM, ==, - secret_to_key_check((const uint8_t*)"\x10", 1, "ABC", 3)); - tt_int_op(S2K_BAD_LEN, ==, - secret_to_key_check((const uint8_t*)"\x01\x02", 2, "ABC", 3)); - - /* too long gets "BAD_LEN" too */ - memset(buf, 0, sizeof(buf)); - buf[0] = 2; - tt_int_op(S2K_BAD_LEN, ==, - secret_to_key_derivekey(buf2, sizeof(buf2), - buf, sizeof(buf), "ABC", 3)); - - /* Truncated output */ -#ifdef HAVE_LIBSCRYPT_H - tt_int_op(S2K_TRUNCATED, ==, secret_to_key_new(buf, 50, &sz, - "ABC", 3, 0)); - tt_int_op(S2K_TRUNCATED, ==, secret_to_key_new(buf, 50, &sz, - "ABC", 3, S2K_FLAG_LOW_MEM)); -#endif - tt_int_op(S2K_TRUNCATED, ==, secret_to_key_new(buf, 37, &sz, - "ABC", 3, S2K_FLAG_USE_PBKDF2)); - tt_int_op(S2K_TRUNCATED, ==, secret_to_key_new(buf, 29, &sz, - "ABC", 3, S2K_FLAG_NO_SCRYPT)); - -#ifdef HAVE_LIBSCRYPT_H - tt_int_op(S2K_TRUNCATED, ==, secret_to_key_make_specifier(buf, 18, 0)); - tt_int_op(S2K_TRUNCATED, ==, secret_to_key_make_specifier(buf, 18, - S2K_FLAG_LOW_MEM)); -#endif - tt_int_op(S2K_TRUNCATED, ==, secret_to_key_make_specifier(buf, 17, - S2K_FLAG_USE_PBKDF2)); - tt_int_op(S2K_TRUNCATED, ==, secret_to_key_make_specifier(buf, 9, - S2K_FLAG_NO_SCRYPT)); - - /* Now try using type-specific bogus specifiers. */ - - /* It's a bad pbkdf2 buffer if it has an iteration count that would overflow - * int32_t. */ - memset(buf, 0, sizeof(buf)); - buf[0] = 1; /* pbkdf2 */ - buf[17] = 100; /* 1<<100 is much bigger than INT32_MAX */ - tt_int_op(S2K_BAD_PARAMS, ==, - secret_to_key_derivekey(buf2, sizeof(buf2), - buf, 18, "ABC", 3)); - -#ifdef HAVE_LIBSCRYPT_H - /* It's a bad scrypt buffer if N would overflow uint64 */ - memset(buf, 0, sizeof(buf)); - buf[0] = 2; /* scrypt */ - buf[17] = 100; /* 1<<100 is much bigger than UINT64_MAX */ - tt_int_op(S2K_BAD_PARAMS, ==, - secret_to_key_derivekey(buf2, sizeof(buf2), - buf, 19, "ABC", 3)); -#endif - - done: - ; -} - -static void -test_crypto_scrypt_vectors(void *arg) -{ - char *mem_op_hex_tmp = NULL; - uint8_t spec[64], out[64]; - - (void)arg; -#ifndef HAVE_LIBSCRYPT_H - if (1) - tt_skip(); -#endif - - /* Test vectors from - http://tools.ietf.org/html/draft-josefsson-scrypt-kdf-00 section 11. - - Note that the names of 'r' and 'N' are switched in that section. Or - possibly in libscrypt. - */ - - base16_decode((char*)spec, sizeof(spec), - "0400", 4); - memset(out, 0x00, sizeof(out)); - tt_int_op(64, ==, - secret_to_key_compute_key(out, 64, spec, 2, "", 0, 2)); - test_memeq_hex(out, - "77d6576238657b203b19ca42c18a0497" - "f16b4844e3074ae8dfdffa3fede21442" - "fcd0069ded0948f8326a753a0fc81f17" - "e8d3e0fb2e0d3628cf35e20c38d18906"); - - base16_decode((char*)spec, sizeof(spec), - "4e61436c" "0A34", 12); - memset(out, 0x00, sizeof(out)); - tt_int_op(64, ==, - secret_to_key_compute_key(out, 64, spec, 6, "password", 8, 2)); - test_memeq_hex(out, - "fdbabe1c9d3472007856e7190d01e9fe" - "7c6ad7cbc8237830e77376634b373162" - "2eaf30d92e22a3886ff109279d9830da" - "c727afb94a83ee6d8360cbdfa2cc0640"); - - base16_decode((char*)spec, sizeof(spec), - "536f6469756d43686c6f72696465" "0e30", 32); - memset(out, 0x00, sizeof(out)); - tt_int_op(64, ==, - secret_to_key_compute_key(out, 64, spec, 16, - "pleaseletmein", 13, 2)); - test_memeq_hex(out, - "7023bdcb3afd7348461c06cd81fd38eb" - "fda8fbba904f8e3ea9b543f6545da1f2" - "d5432955613f0fcf62d49705242a9af9" - "e61e85dc0d651e40dfcf017b45575887"); - - base16_decode((char*)spec, sizeof(spec), - "536f6469756d43686c6f72696465" "1430", 32); - memset(out, 0x00, sizeof(out)); - tt_int_op(64, ==, - secret_to_key_compute_key(out, 64, spec, 16, - "pleaseletmein", 13, 2)); - test_memeq_hex(out, - "2101cb9b6a511aaeaddbbe09cf70f881" - "ec568d574a2ffd4dabe5ee9820adaa47" - "8e56fd8f4ba5d09ffa1c6d927c40f4c3" - "37304049e8a952fbcbf45c6fa77a41a4"); - - done: - tor_free(mem_op_hex_tmp); -} - -static void -test_crypto_pbkdf2_vectors(void *arg) -{ - char *mem_op_hex_tmp = NULL; - uint8_t spec[64], out[64]; - (void)arg; - - /* Test vectors from RFC6070, section 2 */ - base16_decode((char*)spec, sizeof(spec), - "73616c74" "00" , 10); - memset(out, 0x00, sizeof(out)); - tt_int_op(20, ==, - secret_to_key_compute_key(out, 20, spec, 5, "password", 8, 1)); - test_memeq_hex(out, "0c60c80f961f0e71f3a9b524af6012062fe037a6"); - - base16_decode((char*)spec, sizeof(spec), - "73616c74" "01" , 10); - memset(out, 0x00, sizeof(out)); - tt_int_op(20, ==, - secret_to_key_compute_key(out, 20, spec, 5, "password", 8, 1)); - test_memeq_hex(out, "ea6c014dc72d6f8ccd1ed92ace1d41f0d8de8957"); - - base16_decode((char*)spec, sizeof(spec), - "73616c74" "0C" , 10); - memset(out, 0x00, sizeof(out)); - tt_int_op(20, ==, - secret_to_key_compute_key(out, 20, spec, 5, "password", 8, 1)); - test_memeq_hex(out, "4b007901b765489abead49d926f721d065a429c1"); - - base16_decode((char*)spec, sizeof(spec), - "73616c74" "18" , 10); - memset(out, 0x00, sizeof(out)); - tt_int_op(20, ==, - secret_to_key_compute_key(out, 20, spec, 5, "password", 8, 1)); - test_memeq_hex(out, "eefe3d61cd4da4e4e9945b3d6ba2158c2634e984"); - - base16_decode((char*)spec, sizeof(spec), - "73616c7453414c5473616c7453414c5473616c745" - "3414c5473616c7453414c5473616c74" "0C" , 74); - memset(out, 0x00, sizeof(out)); - tt_int_op(25, ==, - secret_to_key_compute_key(out, 25, spec, 37, - "passwordPASSWORDpassword", 24, 1)); - test_memeq_hex(out, "3d2eec4fe41c849b80c8d83662c0e44a8b291a964cf2f07038"); - - base16_decode((char*)spec, sizeof(spec), - "7361006c74" "0c" , 12); - memset(out, 0x00, sizeof(out)); - tt_int_op(16, ==, - secret_to_key_compute_key(out, 16, spec, 6, "pass\0word", 9, 1)); - test_memeq_hex(out, "56fa6aa75548099dcc37d7f03425e0c3"); - - done: - tor_free(mem_op_hex_tmp); -} - -static void -test_crypto_pwbox(void *arg) -{ - uint8_t *boxed=NULL, *decoded=NULL; - size_t len, dlen; - unsigned i; - const char msg[] = "This bunny reminds you that you still have a " - "salamander in your sylladex. She is holding the bunny Dave got you. " - "It’s sort of uncanny how similar they are, aside from the knitted " - "enhancements. Seriously, what are the odds?? So weird."; - const char pw[] = "I'm a night owl and a wise bird too"; - - const unsigned flags[] = { 0, - S2K_FLAG_NO_SCRYPT, - S2K_FLAG_LOW_MEM, - S2K_FLAG_NO_SCRYPT|S2K_FLAG_LOW_MEM, - S2K_FLAG_USE_PBKDF2 }; - (void)arg; - - for (i = 0; i < ARRAY_LENGTH(flags); ++i) { - tt_int_op(0, ==, crypto_pwbox(&boxed, &len, - (const uint8_t*)msg, strlen(msg), - pw, strlen(pw), flags[i])); - tt_assert(boxed); - tt_assert(len > 128+32); - - tt_int_op(0, ==, crypto_unpwbox(&decoded, &dlen, boxed, len, - pw, strlen(pw))); - - tt_assert(decoded); - tt_uint_op(dlen, ==, strlen(msg)); - tt_mem_op(decoded, ==, msg, dlen); - - tor_free(decoded); - - tt_int_op(UNPWBOX_BAD_SECRET, ==, crypto_unpwbox(&decoded, &dlen, - boxed, len, - pw, strlen(pw)-1)); - boxed[len-1] ^= 1; - tt_int_op(UNPWBOX_BAD_SECRET, ==, crypto_unpwbox(&decoded, &dlen, - boxed, len, - pw, strlen(pw))); - boxed[0] = 255; - tt_int_op(UNPWBOX_CORRUPTED, ==, crypto_unpwbox(&decoded, &dlen, - boxed, len, - pw, strlen(pw))); - - tor_free(boxed); - } - - done: - tor_free(boxed); - tor_free(decoded); -} - /** Test AES-CTR encryption and decryption with IV. */ static void test_crypto_aes_iv(void *arg) @@ -1114,79 +739,79 @@ test_crypto_aes_iv(void *arg) encrypted_size = crypto_cipher_encrypt_with_iv(key1, encrypted1, 16 + 4095, plain, 4095); - tt_int_op(encrypted_size,==, 16 + 4095); + tt_int_op(encrypted_size,OP_EQ, 16 + 4095); tt_assert(encrypted_size > 0); /* This is obviously true, since 4111 is * greater than 0, but its truth is not * obvious to all analysis tools. */ decrypted_size = crypto_cipher_decrypt_with_iv(key1, decrypted1, 4095, encrypted1, encrypted_size); - tt_int_op(decrypted_size,==, 4095); + tt_int_op(decrypted_size,OP_EQ, 4095); tt_assert(decrypted_size > 0); - tt_mem_op(plain,==, decrypted1, 4095); + tt_mem_op(plain,OP_EQ, decrypted1, 4095); /* Encrypt a second time (with a new random initialization vector). */ encrypted_size = crypto_cipher_encrypt_with_iv(key1, encrypted2, 16 + 4095, plain, 4095); - tt_int_op(encrypted_size,==, 16 + 4095); + tt_int_op(encrypted_size,OP_EQ, 16 + 4095); tt_assert(encrypted_size > 0); decrypted_size = crypto_cipher_decrypt_with_iv(key1, decrypted2, 4095, encrypted2, encrypted_size); - tt_int_op(decrypted_size,==, 4095); + tt_int_op(decrypted_size,OP_EQ, 4095); tt_assert(decrypted_size > 0); - tt_mem_op(plain,==, decrypted2, 4095); - tt_mem_op(encrypted1,!=, encrypted2, encrypted_size); + tt_mem_op(plain,OP_EQ, decrypted2, 4095); + tt_mem_op(encrypted1,OP_NE, encrypted2, encrypted_size); /* Decrypt with the wrong key. */ decrypted_size = crypto_cipher_decrypt_with_iv(key2, decrypted2, 4095, encrypted1, encrypted_size); - tt_int_op(decrypted_size,==, 4095); - tt_mem_op(plain,!=, decrypted2, decrypted_size); + tt_int_op(decrypted_size,OP_EQ, 4095); + tt_mem_op(plain,OP_NE, decrypted2, decrypted_size); /* Alter the initialization vector. */ encrypted1[0] += 42; decrypted_size = crypto_cipher_decrypt_with_iv(key1, decrypted1, 4095, encrypted1, encrypted_size); - tt_int_op(decrypted_size,==, 4095); - tt_mem_op(plain,!=, decrypted2, 4095); + tt_int_op(decrypted_size,OP_EQ, 4095); + tt_mem_op(plain,OP_NE, decrypted2, 4095); /* Special length case: 1. */ encrypted_size = crypto_cipher_encrypt_with_iv(key1, encrypted1, 16 + 1, plain_1, 1); - tt_int_op(encrypted_size,==, 16 + 1); + tt_int_op(encrypted_size,OP_EQ, 16 + 1); tt_assert(encrypted_size > 0); decrypted_size = crypto_cipher_decrypt_with_iv(key1, decrypted1, 1, encrypted1, encrypted_size); - tt_int_op(decrypted_size,==, 1); + tt_int_op(decrypted_size,OP_EQ, 1); tt_assert(decrypted_size > 0); - tt_mem_op(plain_1,==, decrypted1, 1); + tt_mem_op(plain_1,OP_EQ, decrypted1, 1); /* Special length case: 15. */ encrypted_size = crypto_cipher_encrypt_with_iv(key1, encrypted1, 16 + 15, plain_15, 15); - tt_int_op(encrypted_size,==, 16 + 15); + tt_int_op(encrypted_size,OP_EQ, 16 + 15); tt_assert(encrypted_size > 0); decrypted_size = crypto_cipher_decrypt_with_iv(key1, decrypted1, 15, encrypted1, encrypted_size); - tt_int_op(decrypted_size,==, 15); + tt_int_op(decrypted_size,OP_EQ, 15); tt_assert(decrypted_size > 0); - tt_mem_op(plain_15,==, decrypted1, 15); + tt_mem_op(plain_15,OP_EQ, decrypted1, 15); /* Special length case: 16. */ encrypted_size = crypto_cipher_encrypt_with_iv(key1, encrypted1, 16 + 16, plain_16, 16); - tt_int_op(encrypted_size,==, 16 + 16); + tt_int_op(encrypted_size,OP_EQ, 16 + 16); tt_assert(encrypted_size > 0); decrypted_size = crypto_cipher_decrypt_with_iv(key1, decrypted1, 16, encrypted1, encrypted_size); - tt_int_op(decrypted_size,==, 16); + tt_int_op(decrypted_size,OP_EQ, 16); tt_assert(decrypted_size > 0); - tt_mem_op(plain_16,==, decrypted1, 16); + tt_mem_op(plain_16,OP_EQ, decrypted1, 16); /* Special length case: 17. */ encrypted_size = crypto_cipher_encrypt_with_iv(key1, encrypted1, 16 + 17, plain_17, 17); - tt_int_op(encrypted_size,==, 16 + 17); + tt_int_op(encrypted_size,OP_EQ, 16 + 17); tt_assert(encrypted_size > 0); decrypted_size = crypto_cipher_decrypt_with_iv(key1, decrypted1, 17, encrypted1, encrypted_size); - tt_int_op(decrypted_size,==, 17); + tt_int_op(decrypted_size,OP_EQ, 17); tt_assert(decrypted_size > 0); - tt_mem_op(plain_17,==, decrypted1, 17); + tt_mem_op(plain_17,OP_EQ, decrypted1, 17); done: /* Free memory. */ @@ -1208,26 +833,26 @@ test_crypto_base32_decode(void *arg) /* Encode and decode a random string. */ base32_encode(encoded, 96 + 1, plain, 60); res = base32_decode(decoded, 60, encoded, 96); - tt_int_op(res,==, 0); - tt_mem_op(plain,==, decoded, 60); + tt_int_op(res,OP_EQ, 0); + tt_mem_op(plain,OP_EQ, decoded, 60); /* Encode, uppercase, and decode a random string. */ base32_encode(encoded, 96 + 1, plain, 60); tor_strupper(encoded); res = base32_decode(decoded, 60, encoded, 96); - tt_int_op(res,==, 0); - tt_mem_op(plain,==, decoded, 60); + tt_int_op(res,OP_EQ, 0); + tt_mem_op(plain,OP_EQ, decoded, 60); /* Change encoded string and decode. */ if (encoded[0] == 'A' || encoded[0] == 'a') encoded[0] = 'B'; else encoded[0] = 'A'; res = base32_decode(decoded, 60, encoded, 96); - tt_int_op(res,==, 0); - tt_mem_op(plain,!=, decoded, 60); + tt_int_op(res,OP_EQ, 0); + tt_mem_op(plain,OP_NE, decoded, 60); /* Bad encodings. */ encoded[0] = '!'; res = base32_decode(decoded, 60, encoded, 96); - tt_int_op(0, >, res); + tt_int_op(0, OP_GT, res); done: ; @@ -1250,7 +875,7 @@ test_crypto_kdf_TAP(void *arg) * your own. */ memset(key_material, 0, sizeof(key_material)); EXPAND(""); - tt_int_op(r, ==, 0); + tt_int_op(r, OP_EQ, 0); test_memeq_hex(key_material, "5ba93c9db0cff93f52b521d7420e43f6eda2784fbf8b4530d8" "d246dd74ac53a13471bba17941dff7c4ea21bb365bbeeaf5f2" @@ -1258,7 +883,7 @@ test_crypto_kdf_TAP(void *arg) "f07b01e13da42c6cf1de3abfdea9b95f34687cbbe92b9a7383"); EXPAND("Tor"); - tt_int_op(r, ==, 0); + tt_int_op(r, OP_EQ, 0); test_memeq_hex(key_material, "776c6214fc647aaa5f683c737ee66ec44f03d0372e1cce6922" "7950f236ddf1e329a7ce7c227903303f525a8c6662426e8034" @@ -1266,7 +891,7 @@ test_crypto_kdf_TAP(void *arg) "3f45dfda1a80bdc8b80de01b23e3e0ffae099b3e4ccf28dc28"); EXPAND("AN ALARMING ITEM TO FIND ON A MONTHLY AUTO-DEBIT NOTICE"); - tt_int_op(r, ==, 0); + tt_int_op(r, OP_EQ, 0); test_memeq_hex(key_material, "a340b5d126086c3ab29c2af4179196dbf95e1c72431419d331" "4844bf8f6afb6098db952b95581fb6c33625709d6f4400b8e7" @@ -1302,7 +927,7 @@ test_crypto_hkdf_sha256(void *arg) /* Test vectors generated with ntor_ref.py */ memset(key_material, 0, sizeof(key_material)); EXPAND(""); - tt_int_op(r, ==, 0); + tt_int_op(r, OP_EQ, 0); test_memeq_hex(key_material, "d3490ed48b12a48f9547861583573fe3f19aafe3f81dc7fc75" "eeed96d741b3290f941576c1f9f0b2d463d1ec7ab2c6bf71cd" @@ -1310,7 +935,7 @@ test_crypto_hkdf_sha256(void *arg) "dcf6abe0d20c77cf363e8ffe358927817a3d3e73712cee28d8"); EXPAND("Tor"); - tt_int_op(r, ==, 0); + tt_int_op(r, OP_EQ, 0); test_memeq_hex(key_material, "5521492a85139a8d9107a2d5c0d9c91610d0f95989975ebee6" "c02a4f8d622a6cfdf9b7c7edd3832e2760ded1eac309b76f8d" @@ -1318,7 +943,7 @@ test_crypto_hkdf_sha256(void *arg) "961be9fdb9f93197ea8e5977180801926d3321fa21513e59ac"); EXPAND("AN ALARMING ITEM TO FIND ON YOUR CREDIT-RATING STATEMENT"); - tt_int_op(r, ==, 0); + tt_int_op(r, OP_EQ, 0); test_memeq_hex(key_material, "a2aa9b50da7e481d30463adb8f233ff06e9571a0ca6ab6df0f" "b206fa34e5bc78d063fc291501beec53b36e5a0e434561200c" @@ -1381,7 +1006,7 @@ test_crypto_curve25519_impl(void *arg) e2k[31] |= (byte & 0x80); } curve25519_impl(e1e2k,e1,e2k); - tt_mem_op(e1e2k,==, e2e1k, 32); + tt_mem_op(e1e2k,OP_EQ, e2e1k, 32); if (loop == loop_max-1) { break; } @@ -1417,7 +1042,7 @@ test_crypto_curve25519_wrappers(void *arg) tt_assert(curve25519_public_key_is_ok(&pubkey2)); curve25519_handshake(output1, &seckey1, &pubkey2); curve25519_handshake(output2, &seckey2, &pubkey1); - tt_mem_op(output1,==, output2, sizeof(output1)); + tt_mem_op(output1,OP_EQ, output2, sizeof(output1)); done: ; @@ -1434,26 +1059,26 @@ test_crypto_curve25519_encode(void *arg) curve25519_secret_key_generate(&seckey, 0); curve25519_public_key_generate(&key1, &seckey); - tt_int_op(0, ==, curve25519_public_to_base64(buf, &key1)); - tt_int_op(CURVE25519_BASE64_PADDED_LEN, ==, strlen(buf)); + tt_int_op(0, OP_EQ, curve25519_public_to_base64(buf, &key1)); + tt_int_op(CURVE25519_BASE64_PADDED_LEN, OP_EQ, strlen(buf)); - tt_int_op(0, ==, curve25519_public_from_base64(&key2, buf)); - tt_mem_op(key1.public_key,==, key2.public_key, CURVE25519_PUBKEY_LEN); + tt_int_op(0, OP_EQ, curve25519_public_from_base64(&key2, buf)); + tt_mem_op(key1.public_key,OP_EQ, key2.public_key, CURVE25519_PUBKEY_LEN); buf[CURVE25519_BASE64_PADDED_LEN - 1] = '\0'; - tt_int_op(CURVE25519_BASE64_PADDED_LEN-1, ==, strlen(buf)); - tt_int_op(0, ==, curve25519_public_from_base64(&key3, buf)); - tt_mem_op(key1.public_key,==, key3.public_key, CURVE25519_PUBKEY_LEN); + tt_int_op(CURVE25519_BASE64_PADDED_LEN-1, OP_EQ, strlen(buf)); + tt_int_op(0, OP_EQ, curve25519_public_from_base64(&key3, buf)); + tt_mem_op(key1.public_key,OP_EQ, key3.public_key, CURVE25519_PUBKEY_LEN); /* Now try bogus parses. */ strlcpy(buf, "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$=", sizeof(buf)); - tt_int_op(-1, ==, curve25519_public_from_base64(&key3, buf)); + tt_int_op(-1, OP_EQ, curve25519_public_from_base64(&key3, buf)); strlcpy(buf, "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$", sizeof(buf)); - tt_int_op(-1, ==, curve25519_public_from_base64(&key3, buf)); + tt_int_op(-1, OP_EQ, curve25519_public_from_base64(&key3, buf)); strlcpy(buf, "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", sizeof(buf)); - tt_int_op(-1, ==, curve25519_public_from_base64(&key3, buf)); + tt_int_op(-1, OP_EQ, curve25519_public_from_base64(&key3, buf)); done: ; @@ -1472,45 +1097,49 @@ test_crypto_curve25519_persist(void *arg) (void)arg; - tt_int_op(0,==,curve25519_keypair_generate(&keypair, 0)); + tt_int_op(0,OP_EQ,curve25519_keypair_generate(&keypair, 0)); - tt_int_op(0,==,curve25519_keypair_write_to_file(&keypair, fname, "testing")); - tt_int_op(0,==,curve25519_keypair_read_from_file(&keypair2, &tag, fname)); - tt_str_op(tag,==,"testing"); + tt_int_op(0,OP_EQ, + curve25519_keypair_write_to_file(&keypair, fname, "testing")); + tt_int_op(0,OP_EQ,curve25519_keypair_read_from_file(&keypair2, &tag, fname)); + tt_str_op(tag,OP_EQ,"testing"); tor_free(tag); - tt_mem_op(keypair.pubkey.public_key,==, + tt_mem_op(keypair.pubkey.public_key,OP_EQ, keypair2.pubkey.public_key, CURVE25519_PUBKEY_LEN); - tt_mem_op(keypair.seckey.secret_key,==, + tt_mem_op(keypair.seckey.secret_key,OP_EQ, keypair2.seckey.secret_key, CURVE25519_SECKEY_LEN); content = read_file_to_str(fname, RFTS_BIN, &st); tt_assert(content); taglen = strlen("== c25519v1: testing =="); - tt_u64_op((uint64_t)st.st_size, ==, + tt_u64_op((uint64_t)st.st_size, OP_EQ, 32+CURVE25519_PUBKEY_LEN+CURVE25519_SECKEY_LEN); tt_assert(fast_memeq(content, "== c25519v1: testing ==", taglen)); tt_assert(tor_mem_is_zero(content+taglen, 32-taglen)); cp = content + 32; - tt_mem_op(keypair.seckey.secret_key,==, + tt_mem_op(keypair.seckey.secret_key,OP_EQ, cp, CURVE25519_SECKEY_LEN); cp += CURVE25519_SECKEY_LEN; - tt_mem_op(keypair.pubkey.public_key,==, + tt_mem_op(keypair.pubkey.public_key,OP_EQ, cp, CURVE25519_SECKEY_LEN); tor_free(fname); fname = tor_strdup(get_fname("bogus_keypair")); - tt_int_op(-1, ==, curve25519_keypair_read_from_file(&keypair2, &tag, fname)); + tt_int_op(-1, OP_EQ, + curve25519_keypair_read_from_file(&keypair2, &tag, fname)); tor_free(tag); content[69] ^= 0xff; - tt_int_op(0, ==, write_bytes_to_file(fname, content, (size_t)st.st_size, 1)); - tt_int_op(-1, ==, curve25519_keypair_read_from_file(&keypair2, &tag, fname)); + tt_int_op(0, OP_EQ, + write_bytes_to_file(fname, content, (size_t)st.st_size, 1)); + tt_int_op(-1, OP_EQ, + curve25519_keypair_read_from_file(&keypair2, &tag, fname)); done: tor_free(fname); @@ -1536,41 +1165,41 @@ test_crypto_ed25519_simple(void *arg) (void)arg; - tt_int_op(0, ==, ed25519_secret_key_generate(&sec1, 0)); - tt_int_op(0, ==, ed25519_secret_key_generate(&sec2, 1)); + tt_int_op(0, OP_EQ, ed25519_secret_key_generate(&sec1, 0)); + tt_int_op(0, OP_EQ, ed25519_secret_key_generate(&sec2, 1)); - tt_int_op(0, ==, ed25519_public_key_generate(&pub1, &sec1)); - tt_int_op(0, ==, ed25519_public_key_generate(&pub2, &sec1)); + tt_int_op(0, OP_EQ, ed25519_public_key_generate(&pub1, &sec1)); + tt_int_op(0, OP_EQ, ed25519_public_key_generate(&pub2, &sec1)); - tt_mem_op(pub1.pubkey, ==, pub2.pubkey, sizeof(pub1.pubkey)); + tt_mem_op(pub1.pubkey, OP_EQ, pub2.pubkey, sizeof(pub1.pubkey)); memcpy(&kp1.pubkey, &pub1, sizeof(pub1)); memcpy(&kp1.seckey, &sec1, sizeof(sec1)); - tt_int_op(0, ==, ed25519_sign(&sig1, msg, msg_len, &kp1)); - tt_int_op(0, ==, ed25519_sign(&sig2, msg, msg_len, &kp1)); + tt_int_op(0, OP_EQ, ed25519_sign(&sig1, msg, msg_len, &kp1)); + tt_int_op(0, OP_EQ, ed25519_sign(&sig2, msg, msg_len, &kp1)); /* Ed25519 signatures are deterministic */ - tt_mem_op(sig1.sig, ==, sig2.sig, sizeof(sig1.sig)); + tt_mem_op(sig1.sig, OP_EQ, sig2.sig, sizeof(sig1.sig)); /* Basic signature is valid. */ - tt_int_op(0, ==, ed25519_checksig(&sig1, msg, msg_len, &pub1)); + tt_int_op(0, OP_EQ, ed25519_checksig(&sig1, msg, msg_len, &pub1)); /* Altered signature doesn't work. */ sig1.sig[0] ^= 3; - tt_int_op(-1, ==, ed25519_checksig(&sig1, msg, msg_len, &pub1)); + tt_int_op(-1, OP_EQ, ed25519_checksig(&sig1, msg, msg_len, &pub1)); /* Wrong public key doesn't work. */ - tt_int_op(0, ==, ed25519_public_key_generate(&pub2, &sec2)); - tt_int_op(-1, ==, ed25519_checksig(&sig2, msg, msg_len, &pub2)); + tt_int_op(0, OP_EQ, ed25519_public_key_generate(&pub2, &sec2)); + tt_int_op(-1, OP_EQ, ed25519_checksig(&sig2, msg, msg_len, &pub2)); /* Wrong message doesn't work. */ - tt_int_op(0, ==, ed25519_checksig(&sig2, msg, msg_len, &pub1)); - tt_int_op(-1, ==, ed25519_checksig(&sig2, msg, msg_len-1, &pub1)); - tt_int_op(-1, ==, ed25519_checksig(&sig2, msg2, msg2_len, &pub1)); + tt_int_op(0, OP_EQ, ed25519_checksig(&sig2, msg, msg_len, &pub1)); + tt_int_op(-1, OP_EQ, ed25519_checksig(&sig2, msg, msg_len-1, &pub1)); + tt_int_op(-1, OP_EQ, ed25519_checksig(&sig2, msg2, msg2_len, &pub1)); /* Batch signature checking works with some bad. */ - tt_int_op(0, ==, ed25519_keypair_generate(&kp2, 0)); - tt_int_op(0, ==, ed25519_sign(&sig1, msg, msg_len, &kp2)); + tt_int_op(0, OP_EQ, ed25519_keypair_generate(&kp2, 0)); + tt_int_op(0, OP_EQ, ed25519_sign(&sig1, msg, msg_len, &kp2)); { ed25519_checkable_t ch[] = { { &pub1, sig2, msg, msg_len }, /*ok*/ @@ -1579,12 +1208,12 @@ test_crypto_ed25519_simple(void *arg) { &kp2.pubkey, sig1, msg, msg_len }, /*ok*/ }; int okay[4]; - tt_int_op(-2, ==, ed25519_checksig_batch(okay, ch, 4)); - tt_int_op(okay[0], ==, 1); - tt_int_op(okay[1], ==, 0); - tt_int_op(okay[2], ==, 0); - tt_int_op(okay[3], ==, 1); - tt_int_op(-2, ==, ed25519_checksig_batch(NULL, ch, 4)); + tt_int_op(-2, OP_EQ, ed25519_checksig_batch(okay, ch, 4)); + tt_int_op(okay[0], OP_EQ, 1); + tt_int_op(okay[1], OP_EQ, 0); + tt_int_op(okay[2], OP_EQ, 0); + tt_int_op(okay[3], OP_EQ, 1); + tt_int_op(-2, OP_EQ, ed25519_checksig_batch(NULL, ch, 4)); } /* Batch signature checking works with all good. */ @@ -1594,10 +1223,10 @@ test_crypto_ed25519_simple(void *arg) { &kp2.pubkey, sig1, msg, msg_len }, /*ok*/ }; int okay[2]; - tt_int_op(0, ==, ed25519_checksig_batch(okay, ch, 2)); - tt_int_op(okay[0], ==, 1); - tt_int_op(okay[1], ==, 1); - tt_int_op(0, ==, ed25519_checksig_batch(NULL, ch, 2)); + tt_int_op(0, OP_EQ, ed25519_checksig_batch(okay, ch, 2)); + tt_int_op(okay[0], OP_EQ, 1); + tt_int_op(okay[1], OP_EQ, 1); + tt_int_op(0, OP_EQ, ed25519_checksig_batch(NULL, ch, 2)); } done: @@ -1680,14 +1309,14 @@ test_crypto_ed25519_test_vectors(void *arg) base16_decode((char*)sk_seed, sizeof(sk_seed), items[i].sk, 64); ed25519_secret_key_from_seed(&kp.seckey, sk_seed); - tt_int_op(0, ==, ed25519_public_key_generate(&kp.pubkey, &kp.seckey)); + tt_int_op(0, OP_EQ, ed25519_public_key_generate(&kp.pubkey, &kp.seckey)); test_memeq_hex(kp.pubkey.pubkey, items[i].pk); msg_len = strlen(items[i].msg) / 2; msg = tor_malloc(msg_len); base16_decode((char*)msg, msg_len, items[i].msg, strlen(items[i].msg)); - tt_int_op(0, ==, ed25519_sign(&sig, msg, msg_len, &kp)); + tt_int_op(0, OP_EQ, ed25519_sign(&sig, msg, msg_len, &kp)); test_memeq_hex(sig.sig, items[i].sig); tor_free(msg); @@ -1707,14 +1336,14 @@ test_crypto_ed25519_encode(void *arg) (void) arg; /* Test roundtrip. */ - tt_int_op(0, ==, ed25519_keypair_generate(&kp, 0)); - tt_int_op(0, ==, ed25519_public_to_base64(buf, &kp.pubkey)); - tt_int_op(ED25519_BASE64_LEN, ==, strlen(buf)); - tt_int_op(0, ==, ed25519_public_from_base64(&pk, buf)); - tt_mem_op(kp.pubkey.pubkey, ==, pk.pubkey, ED25519_PUBKEY_LEN); + tt_int_op(0, OP_EQ, ed25519_keypair_generate(&kp, 0)); + tt_int_op(0, OP_EQ, ed25519_public_to_base64(buf, &kp.pubkey)); + tt_int_op(ED25519_BASE64_LEN, OP_EQ, strlen(buf)); + tt_int_op(0, OP_EQ, ed25519_public_from_base64(&pk, buf)); + tt_mem_op(kp.pubkey.pubkey, OP_EQ, pk.pubkey, ED25519_PUBKEY_LEN); /* Test known value. */ - tt_int_op(0, ==, ed25519_public_from_base64(&pk, + tt_int_op(0, OP_EQ, ed25519_public_from_base64(&pk, "lVIuIctLjbGZGU5wKMNXxXlSE3cW4kaqkqm04u6pxvM")); test_memeq_hex(pk.pubkey, "95522e21cb4b8db199194e7028c357c57952137716e246aa92a9b4e2eea9c6f3"); @@ -1740,21 +1369,21 @@ test_crypto_ed25519_convert(void *arg) int bit=0; ed25519_signature_t sig; - tt_int_op(0,==,curve25519_keypair_generate(&curve25519_keypair, i&1)); - tt_int_op(0,==,ed25519_keypair_from_curve25519_keypair( + tt_int_op(0,OP_EQ,curve25519_keypair_generate(&curve25519_keypair, i&1)); + tt_int_op(0,OP_EQ,ed25519_keypair_from_curve25519_keypair( &ed25519_keypair, &bit, &curve25519_keypair)); - tt_int_op(0,==,ed25519_public_key_from_curve25519_public_key( + tt_int_op(0,OP_EQ,ed25519_public_key_from_curve25519_public_key( &ed25519_pubkey, &curve25519_keypair.pubkey, bit)); - tt_mem_op(ed25519_pubkey.pubkey, ==, ed25519_keypair.pubkey.pubkey, 32); + tt_mem_op(ed25519_pubkey.pubkey, OP_EQ, ed25519_keypair.pubkey.pubkey, 32); - tt_int_op(0,==,ed25519_sign(&sig, msg, sizeof(msg), &ed25519_keypair)); - tt_int_op(0,==,ed25519_checksig(&sig, msg, sizeof(msg), + tt_int_op(0,OP_EQ,ed25519_sign(&sig, msg, sizeof(msg), &ed25519_keypair)); + tt_int_op(0,OP_EQ,ed25519_checksig(&sig, msg, sizeof(msg), &ed25519_pubkey)); - tt_int_op(-1,==,ed25519_checksig(&sig, msg, sizeof(msg)-1, + tt_int_op(-1,OP_EQ,ed25519_checksig(&sig, msg, sizeof(msg)-1, &ed25519_pubkey)); sig.sig[0] ^= 15; - tt_int_op(-1,==,ed25519_checksig(&sig, msg, sizeof(msg), + tt_int_op(-1,OP_EQ,ed25519_checksig(&sig, msg, sizeof(msg), &ed25519_pubkey)); } @@ -1782,26 +1411,26 @@ test_crypto_ed25519_blinding(void *arg) crypto_rand((char*) blinding, sizeof(blinding)); - tt_int_op(0,==,ed25519_keypair_generate(&ed25519_keypair, 0)); - tt_int_op(0,==,ed25519_keypair_blind(&ed25519_keypair_blinded, + tt_int_op(0,OP_EQ,ed25519_keypair_generate(&ed25519_keypair, 0)); + tt_int_op(0,OP_EQ,ed25519_keypair_blind(&ed25519_keypair_blinded, &ed25519_keypair, blinding)); - tt_int_op(0,==,ed25519_public_blind(&ed25519_pubkey_blinded, + tt_int_op(0,OP_EQ,ed25519_public_blind(&ed25519_pubkey_blinded, &ed25519_keypair.pubkey, blinding)); - tt_mem_op(ed25519_pubkey_blinded.pubkey, ==, + tt_mem_op(ed25519_pubkey_blinded.pubkey, OP_EQ, ed25519_keypair_blinded.pubkey.pubkey, 32); - tt_int_op(0,==,ed25519_sign(&sig, msg, sizeof(msg), + tt_int_op(0,OP_EQ,ed25519_sign(&sig, msg, sizeof(msg), &ed25519_keypair_blinded)); - tt_int_op(0,==,ed25519_checksig(&sig, msg, sizeof(msg), + tt_int_op(0,OP_EQ,ed25519_checksig(&sig, msg, sizeof(msg), &ed25519_pubkey_blinded)); - tt_int_op(-1,==,ed25519_checksig(&sig, msg, sizeof(msg)-1, + tt_int_op(-1,OP_EQ,ed25519_checksig(&sig, msg, sizeof(msg)-1, &ed25519_pubkey_blinded)); sig.sig[0] ^= 15; - tt_int_op(-1,==,ed25519_checksig(&sig, msg, sizeof(msg), + tt_int_op(-1,OP_EQ,ed25519_checksig(&sig, msg, sizeof(msg), &ed25519_pubkey_blinded)); } @@ -1829,43 +1458,43 @@ test_crypto_ed25519_testvectors(void *arg) #define DECODE(p,s) base16_decode((char*)(p),sizeof(p),(s),strlen(s)) #define EQ(a,h) test_memeq_hex((const char*)(a), (h)) - tt_int_op(0, ==, DECODE(sk, ED25519_SECRET_KEYS[i])); - tt_int_op(0, ==, DECODE(blinding_param, ED25519_BLINDING_PARAMS[i])); + tt_int_op(0, OP_EQ, DECODE(sk, ED25519_SECRET_KEYS[i])); + tt_int_op(0, OP_EQ, DECODE(blinding_param, ED25519_BLINDING_PARAMS[i])); - tt_int_op(0, ==, ed25519_secret_key_from_seed(&esk, sk)); + tt_int_op(0, OP_EQ, ed25519_secret_key_from_seed(&esk, sk)); EQ(esk.seckey, ED25519_EXPANDED_SECRET_KEYS[i]); - tt_int_op(0, ==, ed25519_public_key_generate(&pk, &esk)); + tt_int_op(0, OP_EQ, ed25519_public_key_generate(&pk, &esk)); EQ(pk.pubkey, ED25519_PUBLIC_KEYS[i]); memcpy(&curvekp.seckey.secret_key, esk.seckey, 32); curve25519_public_key_generate(&curvekp.pubkey, &curvekp.seckey); - tt_int_op(0, ==, + tt_int_op(0, OP_EQ, ed25519_keypair_from_curve25519_keypair(&keypair, &sign, &curvekp)); - tt_int_op(0, ==, ed25519_public_key_from_curve25519_public_key( + tt_int_op(0, OP_EQ, ed25519_public_key_from_curve25519_public_key( &pkfromcurve, &curvekp.pubkey, sign)); - tt_mem_op(keypair.pubkey.pubkey, ==, pkfromcurve.pubkey, 32); + tt_mem_op(keypair.pubkey.pubkey, OP_EQ, pkfromcurve.pubkey, 32); EQ(curvekp.pubkey.public_key, ED25519_CURVE25519_PUBLIC_KEYS[i]); /* Self-signing */ memcpy(&keypair.seckey, &esk, sizeof(esk)); memcpy(&keypair.pubkey, &pk, sizeof(pk)); - tt_int_op(0, ==, ed25519_sign(&sig, pk.pubkey, 32, &keypair)); + tt_int_op(0, OP_EQ, ed25519_sign(&sig, pk.pubkey, 32, &keypair)); EQ(sig.sig, ED25519_SELF_SIGNATURES[i]); /* Blinding */ - tt_int_op(0, ==, + tt_int_op(0, OP_EQ, ed25519_keypair_blind(&blind_keypair, &keypair, blinding_param)); - tt_int_op(0, ==, + tt_int_op(0, OP_EQ, ed25519_public_blind(&blind_pk, &pk, blinding_param)); EQ(blind_keypair.seckey.seckey, ED25519_BLINDED_SECRET_KEYS[i]); EQ(blind_pk.pubkey, ED25519_BLINDED_PUBLIC_KEYS[i]); - tt_mem_op(blind_pk.pubkey, ==, blind_keypair.pubkey.pubkey, 32); + tt_mem_op(blind_pk.pubkey, OP_EQ, blind_keypair.pubkey.pubkey, 32); #undef DECODE #undef EQ @@ -1962,7 +1591,7 @@ test_crypto_siphash(void *arg) for (i = 0; i < 64; ++i) { uint64_t r = siphash24(input, i, &K); for (j = 0; j < 8; ++j) { - tt_int_op( (r >> (j*8)) & 0xff, ==, VECTORS[i][j]); + tt_int_op( (r >> (j*8)) & 0xff, OP_EQ, VECTORS[i][j]); } } @@ -1970,54 +1599,23 @@ test_crypto_siphash(void *arg) ; } -static void * -pass_data_setup_fn(const struct testcase_t *testcase) -{ - return testcase->setup_data; -} -static int -pass_data_cleanup_fn(const struct testcase_t *testcase, void *ptr) -{ - (void)ptr; - (void)testcase; - return 1; -} -static const struct testcase_setup_t pass_data = { - pass_data_setup_fn, pass_data_cleanup_fn -}; - #define CRYPTO_LEGACY(name) \ { #name, test_crypto_ ## name , 0, NULL, NULL } struct testcase_t crypto_tests[] = { CRYPTO_LEGACY(formats), CRYPTO_LEGACY(rng), - { "aes_AES", test_crypto_aes, TT_FORK, &pass_data, (void*)"aes" }, - { "aes_EVP", test_crypto_aes, TT_FORK, &pass_data, (void*)"evp" }, + { "aes_AES", test_crypto_aes, TT_FORK, &passthrough_setup, (void*)"aes" }, + { "aes_EVP", test_crypto_aes, TT_FORK, &passthrough_setup, (void*)"evp" }, CRYPTO_LEGACY(sha), CRYPTO_LEGACY(pk), { "pk_fingerprints", test_crypto_pk_fingerprints, TT_FORK, NULL, NULL }, CRYPTO_LEGACY(digests), CRYPTO_LEGACY(dh), - CRYPTO_LEGACY(s2k_rfc2440), -#ifdef HAVE_LIBSCRYPT_H - { "s2k_scrypt", test_crypto_s2k_general, 0, &pass_data, - (void*)"scrypt" }, - { "s2k_scrypt_low", test_crypto_s2k_general, 0, &pass_data, - (void*)"scrypt-low" }, -#endif - { "s2k_pbkdf2", test_crypto_s2k_general, 0, &pass_data, - (void*)"pbkdf2" }, - { "s2k_rfc2440_general", test_crypto_s2k_general, 0, &pass_data, - (void*)"rfc2440" }, - { "s2k_rfc2440_legacy", test_crypto_s2k_general, 0, &pass_data, - (void*)"rfc2440-legacy" }, - { "s2k_errors", test_crypto_s2k_errors, 0, NULL, NULL }, - { "scrypt_vectors", test_crypto_scrypt_vectors, 0, NULL, NULL }, - { "pbkdf2_vectors", test_crypto_pbkdf2_vectors, 0, NULL, NULL }, - { "pwbox", test_crypto_pwbox, 0, NULL, NULL }, - { "aes_iv_AES", test_crypto_aes_iv, TT_FORK, &pass_data, (void*)"aes" }, - { "aes_iv_EVP", test_crypto_aes_iv, TT_FORK, &pass_data, (void*)"evp" }, + { "aes_iv_AES", test_crypto_aes_iv, TT_FORK, &passthrough_setup, + (void*)"aes" }, + { "aes_iv_EVP", test_crypto_aes_iv, TT_FORK, &passthrough_setup, + (void*)"evp" }, CRYPTO_LEGACY(base32_decode), { "kdf_TAP", test_crypto_kdf_TAP, 0, NULL, NULL }, { "hkdf_sha256", test_crypto_hkdf_sha256, 0, NULL, NULL }, diff --git a/src/test/test_crypto_slow.c b/src/test/test_crypto_slow.c new file mode 100644 index 0000000000..a0f6cdc116 --- /dev/null +++ b/src/test/test_crypto_slow.c @@ -0,0 +1,409 @@ +/* Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2015, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "orconfig.h" +#define CRYPTO_S2K_PRIVATE +#include "or.h" +#include "test.h" +#include "crypto_s2k.h" +#include "crypto_pwbox.h" + +/** Run unit tests for our secret-to-key passphrase hashing functionality. */ +static void +test_crypto_s2k_rfc2440(void *arg) +{ + char buf[29]; + char buf2[29]; + char *buf3 = NULL; + int i; + + (void)arg; + memset(buf, 0, sizeof(buf)); + memset(buf2, 0, sizeof(buf2)); + buf3 = tor_malloc(65536); + memset(buf3, 0, 65536); + + secret_to_key_rfc2440(buf+9, 20, "", 0, buf); + crypto_digest(buf2+9, buf3, 1024); + tt_mem_op(buf,OP_EQ, buf2, 29); + + memcpy(buf,"vrbacrda",8); + memcpy(buf2,"vrbacrda",8); + buf[8] = 96; + buf2[8] = 96; + secret_to_key_rfc2440(buf+9, 20, "12345678", 8, buf); + for (i = 0; i < 65536; i += 16) { + memcpy(buf3+i, "vrbacrda12345678", 16); + } + crypto_digest(buf2+9, buf3, 65536); + tt_mem_op(buf,OP_EQ, buf2, 29); + + done: + tor_free(buf3); +} + +static void +run_s2k_tests(const unsigned flags, const unsigned type, + int speclen, const int keylen, int legacy) +{ + uint8_t buf[S2K_MAXLEN], buf2[S2K_MAXLEN], buf3[S2K_MAXLEN]; + int r; + size_t sz; + const char pw1[] = "You can't come in here unless you say swordfish!"; + const char pw2[] = "Now, I give you one more guess."; + + r = secret_to_key_new(buf, sizeof(buf), &sz, + pw1, strlen(pw1), flags); + tt_int_op(r, OP_EQ, S2K_OKAY); + tt_int_op(buf[0], OP_EQ, type); + + tt_int_op(sz, OP_EQ, keylen + speclen); + + if (legacy) { + memmove(buf, buf+1, sz-1); + --sz; + --speclen; + } + + tt_int_op(S2K_OKAY, OP_EQ, + secret_to_key_check(buf, sz, pw1, strlen(pw1))); + + tt_int_op(S2K_BAD_SECRET, OP_EQ, + secret_to_key_check(buf, sz, pw2, strlen(pw2))); + + /* Move key to buf2, and clear it. */ + memset(buf3, 0, sizeof(buf3)); + memcpy(buf2, buf+speclen, keylen); + memset(buf+speclen, 0, sz - speclen); + + /* Derivekey should produce the same results. */ + tt_int_op(S2K_OKAY, OP_EQ, + secret_to_key_derivekey(buf3, keylen, buf, speclen, pw1, strlen(pw1))); + + tt_mem_op(buf2, OP_EQ, buf3, keylen); + + /* Derivekey with a longer output should fill the output. */ + memset(buf2, 0, sizeof(buf2)); + tt_int_op(S2K_OKAY, OP_EQ, + secret_to_key_derivekey(buf2, sizeof(buf2), buf, speclen, + pw1, strlen(pw1))); + + tt_mem_op(buf2, OP_NE, buf3, sizeof(buf2)); + + memset(buf3, 0, sizeof(buf3)); + tt_int_op(S2K_OKAY, OP_EQ, + secret_to_key_derivekey(buf3, sizeof(buf3), buf, speclen, + pw1, strlen(pw1))); + tt_mem_op(buf2, OP_EQ, buf3, sizeof(buf3)); + tt_assert(!tor_mem_is_zero((char*)buf2+keylen, sizeof(buf2)-keylen)); + + done: + ; +} + +static void +test_crypto_s2k_general(void *arg) +{ + const char *which = arg; + + if (!strcmp(which, "scrypt")) { + run_s2k_tests(0, 2, 19, 32, 0); + } else if (!strcmp(which, "scrypt-low")) { + run_s2k_tests(S2K_FLAG_LOW_MEM, 2, 19, 32, 0); + } else if (!strcmp(which, "pbkdf2")) { + run_s2k_tests(S2K_FLAG_USE_PBKDF2, 1, 18, 20, 0); + } else if (!strcmp(which, "rfc2440")) { + run_s2k_tests(S2K_FLAG_NO_SCRYPT, 0, 10, 20, 0); + } else if (!strcmp(which, "rfc2440-legacy")) { + run_s2k_tests(S2K_FLAG_NO_SCRYPT, 0, 10, 20, 1); + } else { + tt_fail(); + } +} + +static void +test_crypto_s2k_errors(void *arg) +{ + uint8_t buf[S2K_MAXLEN], buf2[S2K_MAXLEN]; + size_t sz; + + (void)arg; + + /* Bogus specifiers: simple */ + tt_int_op(S2K_BAD_LEN, OP_EQ, + secret_to_key_derivekey(buf, sizeof(buf), + (const uint8_t*)"", 0, "ABC", 3)); + tt_int_op(S2K_BAD_ALGORITHM, OP_EQ, + secret_to_key_derivekey(buf, sizeof(buf), + (const uint8_t*)"\x10", 1, "ABC", 3)); + tt_int_op(S2K_BAD_LEN, OP_EQ, + secret_to_key_derivekey(buf, sizeof(buf), + (const uint8_t*)"\x01\x02", 2, "ABC", 3)); + + tt_int_op(S2K_BAD_LEN, OP_EQ, + secret_to_key_check((const uint8_t*)"", 0, "ABC", 3)); + tt_int_op(S2K_BAD_ALGORITHM, OP_EQ, + secret_to_key_check((const uint8_t*)"\x10", 1, "ABC", 3)); + tt_int_op(S2K_BAD_LEN, OP_EQ, + secret_to_key_check((const uint8_t*)"\x01\x02", 2, "ABC", 3)); + + /* too long gets "BAD_LEN" too */ + memset(buf, 0, sizeof(buf)); + buf[0] = 2; + tt_int_op(S2K_BAD_LEN, OP_EQ, + secret_to_key_derivekey(buf2, sizeof(buf2), + buf, sizeof(buf), "ABC", 3)); + + /* Truncated output */ +#ifdef HAVE_LIBSCRYPT_H + tt_int_op(S2K_TRUNCATED, OP_EQ, secret_to_key_new(buf, 50, &sz, + "ABC", 3, 0)); + tt_int_op(S2K_TRUNCATED, OP_EQ, secret_to_key_new(buf, 50, &sz, + "ABC", 3, S2K_FLAG_LOW_MEM)); +#endif + tt_int_op(S2K_TRUNCATED, OP_EQ, secret_to_key_new(buf, 37, &sz, + "ABC", 3, S2K_FLAG_USE_PBKDF2)); + tt_int_op(S2K_TRUNCATED, OP_EQ, secret_to_key_new(buf, 29, &sz, + "ABC", 3, S2K_FLAG_NO_SCRYPT)); + +#ifdef HAVE_LIBSCRYPT_H + tt_int_op(S2K_TRUNCATED, OP_EQ, secret_to_key_make_specifier(buf, 18, 0)); + tt_int_op(S2K_TRUNCATED, OP_EQ, secret_to_key_make_specifier(buf, 18, + S2K_FLAG_LOW_MEM)); +#endif + tt_int_op(S2K_TRUNCATED, OP_EQ, secret_to_key_make_specifier(buf, 17, + S2K_FLAG_USE_PBKDF2)); + tt_int_op(S2K_TRUNCATED, OP_EQ, secret_to_key_make_specifier(buf, 9, + S2K_FLAG_NO_SCRYPT)); + + /* Now try using type-specific bogus specifiers. */ + + /* It's a bad pbkdf2 buffer if it has an iteration count that would overflow + * int32_t. */ + memset(buf, 0, sizeof(buf)); + buf[0] = 1; /* pbkdf2 */ + buf[17] = 100; /* 1<<100 is much bigger than INT32_MAX */ + tt_int_op(S2K_BAD_PARAMS, OP_EQ, + secret_to_key_derivekey(buf2, sizeof(buf2), + buf, 18, "ABC", 3)); + +#ifdef HAVE_LIBSCRYPT_H + /* It's a bad scrypt buffer if N would overflow uint64 */ + memset(buf, 0, sizeof(buf)); + buf[0] = 2; /* scrypt */ + buf[17] = 100; /* 1<<100 is much bigger than UINT64_MAX */ + tt_int_op(S2K_BAD_PARAMS, OP_EQ, + secret_to_key_derivekey(buf2, sizeof(buf2), + buf, 19, "ABC", 3)); +#endif + + done: + ; +} + +static void +test_crypto_scrypt_vectors(void *arg) +{ + char *mem_op_hex_tmp = NULL; + uint8_t spec[64], out[64]; + + (void)arg; +#ifndef HAVE_LIBSCRYPT_H + if (1) + tt_skip(); +#endif + + /* Test vectors from + http://tools.ietf.org/html/draft-josefsson-scrypt-kdf-00 section 11. + + Note that the names of 'r' and 'N' are switched in that section. Or + possibly in libscrypt. + */ + + base16_decode((char*)spec, sizeof(spec), + "0400", 4); + memset(out, 0x00, sizeof(out)); + tt_int_op(64, OP_EQ, + secret_to_key_compute_key(out, 64, spec, 2, "", 0, 2)); + test_memeq_hex(out, + "77d6576238657b203b19ca42c18a0497" + "f16b4844e3074ae8dfdffa3fede21442" + "fcd0069ded0948f8326a753a0fc81f17" + "e8d3e0fb2e0d3628cf35e20c38d18906"); + + base16_decode((char*)spec, sizeof(spec), + "4e61436c" "0A34", 12); + memset(out, 0x00, sizeof(out)); + tt_int_op(64, OP_EQ, + secret_to_key_compute_key(out, 64, spec, 6, "password", 8, 2)); + test_memeq_hex(out, + "fdbabe1c9d3472007856e7190d01e9fe" + "7c6ad7cbc8237830e77376634b373162" + "2eaf30d92e22a3886ff109279d9830da" + "c727afb94a83ee6d8360cbdfa2cc0640"); + + base16_decode((char*)spec, sizeof(spec), + "536f6469756d43686c6f72696465" "0e30", 32); + memset(out, 0x00, sizeof(out)); + tt_int_op(64, OP_EQ, + secret_to_key_compute_key(out, 64, spec, 16, + "pleaseletmein", 13, 2)); + test_memeq_hex(out, + "7023bdcb3afd7348461c06cd81fd38eb" + "fda8fbba904f8e3ea9b543f6545da1f2" + "d5432955613f0fcf62d49705242a9af9" + "e61e85dc0d651e40dfcf017b45575887"); + + base16_decode((char*)spec, sizeof(spec), + "536f6469756d43686c6f72696465" "1430", 32); + memset(out, 0x00, sizeof(out)); + tt_int_op(64, OP_EQ, + secret_to_key_compute_key(out, 64, spec, 16, + "pleaseletmein", 13, 2)); + test_memeq_hex(out, + "2101cb9b6a511aaeaddbbe09cf70f881" + "ec568d574a2ffd4dabe5ee9820adaa47" + "8e56fd8f4ba5d09ffa1c6d927c40f4c3" + "37304049e8a952fbcbf45c6fa77a41a4"); + + done: + tor_free(mem_op_hex_tmp); +} + +static void +test_crypto_pbkdf2_vectors(void *arg) +{ + char *mem_op_hex_tmp = NULL; + uint8_t spec[64], out[64]; + (void)arg; + + /* Test vectors from RFC6070, section 2 */ + base16_decode((char*)spec, sizeof(spec), + "73616c74" "00" , 10); + memset(out, 0x00, sizeof(out)); + tt_int_op(20, OP_EQ, + secret_to_key_compute_key(out, 20, spec, 5, "password", 8, 1)); + test_memeq_hex(out, "0c60c80f961f0e71f3a9b524af6012062fe037a6"); + + base16_decode((char*)spec, sizeof(spec), + "73616c74" "01" , 10); + memset(out, 0x00, sizeof(out)); + tt_int_op(20, OP_EQ, + secret_to_key_compute_key(out, 20, spec, 5, "password", 8, 1)); + test_memeq_hex(out, "ea6c014dc72d6f8ccd1ed92ace1d41f0d8de8957"); + + base16_decode((char*)spec, sizeof(spec), + "73616c74" "0C" , 10); + memset(out, 0x00, sizeof(out)); + tt_int_op(20, OP_EQ, + secret_to_key_compute_key(out, 20, spec, 5, "password", 8, 1)); + test_memeq_hex(out, "4b007901b765489abead49d926f721d065a429c1"); + + base16_decode((char*)spec, sizeof(spec), + "73616c74" "18" , 10); + memset(out, 0x00, sizeof(out)); + tt_int_op(20, OP_EQ, + secret_to_key_compute_key(out, 20, spec, 5, "password", 8, 1)); + test_memeq_hex(out, "eefe3d61cd4da4e4e9945b3d6ba2158c2634e984"); + + base16_decode((char*)spec, sizeof(spec), + "73616c7453414c5473616c7453414c5473616c745" + "3414c5473616c7453414c5473616c74" "0C" , 74); + memset(out, 0x00, sizeof(out)); + tt_int_op(25, OP_EQ, + secret_to_key_compute_key(out, 25, spec, 37, + "passwordPASSWORDpassword", 24, 1)); + test_memeq_hex(out, "3d2eec4fe41c849b80c8d83662c0e44a8b291a964cf2f07038"); + + base16_decode((char*)spec, sizeof(spec), + "7361006c74" "0c" , 12); + memset(out, 0x00, sizeof(out)); + tt_int_op(16, OP_EQ, + secret_to_key_compute_key(out, 16, spec, 6, "pass\0word", 9, 1)); + test_memeq_hex(out, "56fa6aa75548099dcc37d7f03425e0c3"); + + done: + tor_free(mem_op_hex_tmp); +} + +static void +test_crypto_pwbox(void *arg) +{ + uint8_t *boxed=NULL, *decoded=NULL; + size_t len, dlen; + unsigned i; + const char msg[] = "This bunny reminds you that you still have a " + "salamander in your sylladex. She is holding the bunny Dave got you. " + "It’s sort of uncanny how similar they are, aside from the knitted " + "enhancements. Seriously, what are the odds?? So weird."; + const char pw[] = "I'm a night owl and a wise bird too"; + + const unsigned flags[] = { 0, + S2K_FLAG_NO_SCRYPT, + S2K_FLAG_LOW_MEM, + S2K_FLAG_NO_SCRYPT|S2K_FLAG_LOW_MEM, + S2K_FLAG_USE_PBKDF2 }; + (void)arg; + + for (i = 0; i < ARRAY_LENGTH(flags); ++i) { + tt_int_op(0, OP_EQ, crypto_pwbox(&boxed, &len, + (const uint8_t*)msg, strlen(msg), + pw, strlen(pw), flags[i])); + tt_assert(boxed); + tt_assert(len > 128+32); + + tt_int_op(0, OP_EQ, crypto_unpwbox(&decoded, &dlen, boxed, len, + pw, strlen(pw))); + + tt_assert(decoded); + tt_uint_op(dlen, OP_EQ, strlen(msg)); + tt_mem_op(decoded, OP_EQ, msg, dlen); + + tor_free(decoded); + + tt_int_op(UNPWBOX_BAD_SECRET, OP_EQ, crypto_unpwbox(&decoded, &dlen, + boxed, len, + pw, strlen(pw)-1)); + boxed[len-1] ^= 1; + tt_int_op(UNPWBOX_BAD_SECRET, OP_EQ, crypto_unpwbox(&decoded, &dlen, + boxed, len, + pw, strlen(pw))); + boxed[0] = 255; + tt_int_op(UNPWBOX_CORRUPTED, OP_EQ, crypto_unpwbox(&decoded, &dlen, + boxed, len, + pw, strlen(pw))); + + tor_free(boxed); + } + + done: + tor_free(boxed); + tor_free(decoded); +} + +#define CRYPTO_LEGACY(name) \ + { #name, test_crypto_ ## name , 0, NULL, NULL } + +struct testcase_t slow_crypto_tests[] = { + CRYPTO_LEGACY(s2k_rfc2440), +#ifdef HAVE_LIBSCRYPT_H + { "s2k_scrypt", test_crypto_s2k_general, 0, &passthrough_setup, + (void*)"scrypt" }, + { "s2k_scrypt_low", test_crypto_s2k_general, 0, &passthrough_setup, + (void*)"scrypt-low" }, +#endif + { "s2k_pbkdf2", test_crypto_s2k_general, 0, &passthrough_setup, + (void*)"pbkdf2" }, + { "s2k_rfc2440_general", test_crypto_s2k_general, 0, &passthrough_setup, + (void*)"rfc2440" }, + { "s2k_rfc2440_legacy", test_crypto_s2k_general, 0, &passthrough_setup, + (void*)"rfc2440-legacy" }, + { "s2k_errors", test_crypto_s2k_errors, 0, NULL, NULL }, + { "scrypt_vectors", test_crypto_scrypt_vectors, 0, NULL, NULL }, + { "pbkdf2_vectors", test_crypto_pbkdf2_vectors, 0, NULL, NULL }, + { "pwbox", test_crypto_pwbox, 0, NULL, NULL }, + END_OF_TESTCASES +}; + diff --git a/src/test/test_data.c b/src/test/test_data.c index 0e6f79f33c..6afba65757 100644 --- a/src/test/test_data.c +++ b/src/test/test_data.c @@ -1,6 +1,6 @@ /* Copyright 2001-2004 Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /* Our unit test expect that the AUTHORITY_CERT_* public keys will sort diff --git a/src/test/test_dir.c b/src/test/test_dir.c index c7e22d8cec..991e613cb6 100644 --- a/src/test/test_dir.c +++ b/src/test/test_dir.c @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" @@ -180,7 +180,7 @@ test_dir_formats(void *arg) buf[strlen(buf2)] = '\0'; /* Don't compare the sig; it's never the same * twice */ - tt_str_op(buf,==, buf2); + tt_str_op(buf,OP_EQ, buf2); tor_free(buf); buf = router_dump_router_to_string(r1, pk2); @@ -188,12 +188,12 @@ test_dir_formats(void *arg) cp = buf; rp1 = router_parse_entry_from_string((const char*)cp,NULL,1,0,NULL,NULL); tt_assert(rp1); - tt_int_op(rp1->addr,==, r1->addr); - tt_int_op(rp1->or_port,==, r1->or_port); + tt_int_op(rp1->addr,OP_EQ, r1->addr); + tt_int_op(rp1->or_port,OP_EQ, r1->or_port); //test_eq(rp1->dir_port, r1->dir_port); - tt_int_op(rp1->bandwidthrate,==, r1->bandwidthrate); - tt_int_op(rp1->bandwidthburst,==, r1->bandwidthburst); - tt_int_op(rp1->bandwidthcapacity,==, r1->bandwidthcapacity); + tt_int_op(rp1->bandwidthrate,OP_EQ, r1->bandwidthrate); + tt_int_op(rp1->bandwidthburst,OP_EQ, r1->bandwidthburst); + tt_int_op(rp1->bandwidthcapacity,OP_EQ, r1->bandwidthcapacity); tt_assert(crypto_pk_cmp_keys(rp1->onion_pkey, pk1) == 0); tt_assert(crypto_pk_cmp_keys(rp1->identity_pkey, pk2) == 0); //tt_assert(rp1->exit_policy == NULL); @@ -224,40 +224,40 @@ test_dir_formats(void *arg) buf = router_dump_router_to_string(r2, pk1); buf[strlen(buf2)] = '\0'; /* Don't compare the sig; it's never the same * twice */ - tt_str_op(buf,==, buf2); + tt_str_op(buf,OP_EQ, buf2); tor_free(buf); buf = router_dump_router_to_string(r2, pk1); cp = buf; rp2 = router_parse_entry_from_string((const char*)cp,NULL,1,0,NULL,NULL); tt_assert(rp2); - tt_int_op(rp2->addr,==, r2->addr); - tt_int_op(rp2->or_port,==, r2->or_port); - tt_int_op(rp2->dir_port,==, r2->dir_port); - tt_int_op(rp2->bandwidthrate,==, r2->bandwidthrate); - tt_int_op(rp2->bandwidthburst,==, r2->bandwidthburst); - tt_int_op(rp2->bandwidthcapacity,==, r2->bandwidthcapacity); - tt_mem_op(rp2->onion_curve25519_pkey->public_key,==, + tt_int_op(rp2->addr,OP_EQ, r2->addr); + tt_int_op(rp2->or_port,OP_EQ, r2->or_port); + tt_int_op(rp2->dir_port,OP_EQ, r2->dir_port); + tt_int_op(rp2->bandwidthrate,OP_EQ, r2->bandwidthrate); + tt_int_op(rp2->bandwidthburst,OP_EQ, r2->bandwidthburst); + tt_int_op(rp2->bandwidthcapacity,OP_EQ, r2->bandwidthcapacity); + tt_mem_op(rp2->onion_curve25519_pkey->public_key,OP_EQ, r2->onion_curve25519_pkey->public_key, CURVE25519_PUBKEY_LEN); tt_assert(crypto_pk_cmp_keys(rp2->onion_pkey, pk2) == 0); tt_assert(crypto_pk_cmp_keys(rp2->identity_pkey, pk1) == 0); - tt_int_op(smartlist_len(rp2->exit_policy),==, 2); + tt_int_op(smartlist_len(rp2->exit_policy),OP_EQ, 2); p = smartlist_get(rp2->exit_policy, 0); - tt_int_op(p->policy_type,==, ADDR_POLICY_ACCEPT); + tt_int_op(p->policy_type,OP_EQ, ADDR_POLICY_ACCEPT); tt_assert(tor_addr_is_null(&p->addr)); - tt_int_op(p->maskbits,==, 0); - tt_int_op(p->prt_min,==, 80); - tt_int_op(p->prt_max,==, 80); + tt_int_op(p->maskbits,OP_EQ, 0); + tt_int_op(p->prt_min,OP_EQ, 80); + tt_int_op(p->prt_max,OP_EQ, 80); p = smartlist_get(rp2->exit_policy, 1); - tt_int_op(p->policy_type,==, ADDR_POLICY_REJECT); + tt_int_op(p->policy_type,OP_EQ, ADDR_POLICY_REJECT); tt_assert(tor_addr_eq(&p->addr, &ex2->addr)); - tt_int_op(p->maskbits,==, 8); - tt_int_op(p->prt_min,==, 24); - tt_int_op(p->prt_max,==, 24); + tt_int_op(p->maskbits,OP_EQ, 8); + tt_int_op(p->prt_min,OP_EQ, 24); + tt_int_op(p->prt_max,OP_EQ, 24); #if 0 /* Okay, now for the directories. */ @@ -312,7 +312,7 @@ test_dir_routerparse_bad(void *arg) again = 999; \ ri = router_parse_entry_from_string((s), NULL, 0, 0, NULL, &again); \ tt_assert(ri == NULL); \ - tt_int_op(again, ==, (againval)); \ + tt_int_op(again, OP_EQ, (againval)); \ } while (0) CHECK_OK(EX_RI_MINIMAL); @@ -388,6 +388,12 @@ test_dir_routerparse_bad(void *arg) #include "example_extrainfo.inc" static void +routerinfo_free_wrapper_(void *arg) +{ + routerinfo_free(arg); +} + +static void test_dir_extrainfo_parsing(void *arg) { (void) arg; @@ -404,7 +410,7 @@ test_dir_extrainfo_parsing(void *arg) again = 999; \ ei = extrainfo_parse_entry_from_string((s), NULL, 0, map, &again); \ tt_assert(ei == NULL); \ - tt_int_op(again, ==, (againval)); \ + tt_int_op(again, OP_EQ, (againval)); \ } while (0) #define ADD(name) \ do { \ @@ -412,7 +418,7 @@ test_dir_extrainfo_parsing(void *arg) crypto_pk_t *pk = ri->identity_pkey = crypto_pk_new(); \ tt_assert(! crypto_pk_read_public_key_from_string(pk, \ name##_KEY, strlen(name##_KEY))); \ - tt_int_op(0,==,base16_decode(d, 20, name##_FP, strlen(name##_FP))); \ + tt_int_op(0,OP_EQ,base16_decode(d, 20, name##_FP, strlen(name##_FP))); \ digestmap_set((digestmap_t*)map, d, ri); \ ri = NULL; \ } while (0) @@ -455,9 +461,9 @@ test_dir_extrainfo_parsing(void *arg) #undef CHECK_FAIL done: + extrainfo_free(ei); routerinfo_free(ri); - /* XXXX elements should get freed too */ - digestmap_free((digestmap_t*)map, NULL); + digestmap_free((digestmap_t*)map, routerinfo_free_wrapper_); } static void @@ -490,20 +496,20 @@ test_dir_parse_router_list(void *arg) /* First, parse the routers. */ cp = list; - tt_int_op(0,==, + tt_int_op(0,OP_EQ, router_parse_list_from_string(&cp, NULL, dest, SAVED_NOWHERE, 0, 0, NULL, invalid)); - tt_int_op(2, ==, smartlist_len(dest)); - tt_ptr_op(cp, ==, list + strlen(list)); + tt_int_op(2, OP_EQ, smartlist_len(dest)); + tt_ptr_op(cp, OP_EQ, list + strlen(list)); routerinfo_t *r = smartlist_get(dest, 0); - tt_mem_op(r->cache_info.signed_descriptor_body, ==, + tt_mem_op(r->cache_info.signed_descriptor_body, OP_EQ, EX_RI_MINIMAL, strlen(EX_RI_MINIMAL)); r = smartlist_get(dest, 1); - tt_mem_op(r->cache_info.signed_descriptor_body, ==, + tt_mem_op(r->cache_info.signed_descriptor_body, OP_EQ, EX_RI_MAXIMAL, strlen(EX_RI_MAXIMAL)); - tt_int_op(2, ==, smartlist_len(invalid)); + tt_int_op(2, OP_EQ, smartlist_len(invalid)); test_memeq_hex(smartlist_get(invalid, 0), "ab9eeaa95e7d45740185b4e519c76ead756277a9"); test_memeq_hex(smartlist_get(invalid, 1), @@ -523,18 +529,18 @@ test_dir_parse_router_list(void *arg) ADD(EX_EI_BAD_NICKNAME); ADD(EX_EI_BAD_PUBLISHED); cp = list; - tt_int_op(0,==, + tt_int_op(0,OP_EQ, router_parse_list_from_string(&cp, NULL, dest, SAVED_NOWHERE, 1, 0, NULL, invalid)); - tt_int_op(2, ==, smartlist_len(dest)); + tt_int_op(2, OP_EQ, smartlist_len(dest)); extrainfo_t *e = smartlist_get(dest, 0); - tt_mem_op(e->cache_info.signed_descriptor_body, ==, + tt_mem_op(e->cache_info.signed_descriptor_body, OP_EQ, EX_EI_MAXIMAL, strlen(EX_EI_MAXIMAL)); e = smartlist_get(dest, 1); - tt_mem_op(e->cache_info.signed_descriptor_body, ==, + tt_mem_op(e->cache_info.signed_descriptor_body, OP_EQ, EX_EI_MINIMAL, strlen(EX_EI_MINIMAL)); - tt_int_op(2, ==, smartlist_len(invalid)); + tt_int_op(2, OP_EQ, smartlist_len(invalid)); test_memeq_hex(smartlist_get(invalid, 0), "d5df4aa62ee9ffc9543d41150c9864908e0390af"); test_memeq_hex(smartlist_get(invalid, 1), @@ -552,9 +558,8 @@ test_dir_parse_router_list(void *arg) SMARTLIST_FOREACH(chunks, char *, cp, tor_free(cp)); smartlist_free(chunks); routerinfo_free(ri); - /* XXXX this leaks: */ if (map) { - digestmap_free((digestmap_t*)map, NULL); + digestmap_free((digestmap_t*)map, routerinfo_free_wrapper_); router_get_routerlist()->identity_map = (struct digest_ri_map_t*)digestmap_new(); } @@ -605,10 +610,11 @@ test_dir_load_routers(void *arg) smartlist_t *wanted = smartlist_new(); char buf[DIGEST_LEN]; char *mem_op_hex_tmp = NULL; + char *list = NULL; #define ADD(str) \ do { \ - tt_int_op(0,==,router_get_router_hash(str, strlen(str), buf)); \ + tt_int_op(0,OP_EQ,router_get_router_hash(str, strlen(str), buf)); \ smartlist_add(wanted, tor_strdup(hex_str(buf, DIGEST_LEN))); \ } while (0) @@ -630,35 +636,35 @@ test_dir_load_routers(void *arg) /* Not ADDing BAD_PORTS */ ADD(EX_RI_BAD_TOKENS); - char *list = smartlist_join_strings(chunks, "", 0, NULL); - tt_int_op(1, ==, + list = smartlist_join_strings(chunks, "", 0, NULL); + tt_int_op(1, OP_EQ, router_load_routers_from_string(list, NULL, SAVED_IN_JOURNAL, wanted, 1, NULL)); /* The "maximal" router was added. */ /* "minimal" was not. */ - tt_int_op(smartlist_len(router_get_routerlist()->routers),==,1); + tt_int_op(smartlist_len(router_get_routerlist()->routers),OP_EQ,1); routerinfo_t *r = smartlist_get(router_get_routerlist()->routers, 0); test_memeq_hex(r->cache_info.signed_descriptor_digest, "581D8A368A0FA854ECDBFAB841D88B3F1B004038"); - tt_int_op(dls_minimal.n_download_failures, ==, 0); - tt_int_op(dls_maximal.n_download_failures, ==, 0); + tt_int_op(dls_minimal.n_download_failures, OP_EQ, 0); + tt_int_op(dls_maximal.n_download_failures, OP_EQ, 0); /* "Bad fingerprint" and "Bad tokens" should have gotten marked * non-retriable. */ - tt_want_int_op(mock_router_get_dl_status_calls, ==, 2); - tt_want_int_op(mock_router_get_dl_status_unrecognized, ==, 0); - tt_int_op(dls_bad_fingerprint.n_download_failures, ==, 255); - tt_int_op(dls_bad_tokens.n_download_failures, ==, 255); + tt_want_int_op(mock_router_get_dl_status_calls, OP_EQ, 2); + tt_want_int_op(mock_router_get_dl_status_unrecognized, OP_EQ, 0); + tt_int_op(dls_bad_fingerprint.n_download_failures, OP_EQ, 255); + tt_int_op(dls_bad_tokens.n_download_failures, OP_EQ, 255); /* bad_sig2 and bad ports" are retriable -- one since only the signature * was bad, and one because we didn't ask for it. */ - tt_int_op(dls_bad_sig2.n_download_failures, ==, 0); - tt_int_op(dls_bad_ports.n_download_failures, ==, 0); + tt_int_op(dls_bad_sig2.n_download_failures, OP_EQ, 0); + tt_int_op(dls_bad_ports.n_download_failures, OP_EQ, 0); /* Wanted still contains "BAD_SIG2" */ - tt_int_op(smartlist_len(wanted), ==, 1); - tt_str_op(smartlist_get(wanted, 0), ==, + tt_int_op(smartlist_len(wanted), OP_EQ, 1); + tt_str_op(smartlist_get(wanted, 0), OP_EQ, "E0A3753CEFD54128EAB239F294954121DB23D2EF"); #undef ADD @@ -670,6 +676,7 @@ test_dir_load_routers(void *arg) smartlist_free(chunks); SMARTLIST_FOREACH(wanted, char *, cp, tor_free(cp)); smartlist_free(wanted); + tor_free(list); } static int mock_get_by_ei_dd_calls = 0; @@ -707,9 +714,10 @@ mock_get_by_ei_desc_digest(const char *d) static smartlist_t *mock_ei_insert_list = NULL; static was_router_added_t -mock_ei_insert(routerlist_t *rl, extrainfo_t *ei) +mock_ei_insert(routerlist_t *rl, extrainfo_t *ei, int warn_if_incompatible) { (void) rl; + (void) warn_if_incompatible; smartlist_add(mock_ei_insert_list, ei); return ROUTER_ADDED_SUCCESSFULLY; } @@ -722,10 +730,11 @@ test_dir_load_extrainfo(void *arg) smartlist_t *wanted = smartlist_new(); char buf[DIGEST_LEN]; char *mem_op_hex_tmp = NULL; + char *list = NULL; #define ADD(str) \ do { \ - tt_int_op(0,==,router_get_extrainfo_hash(str, strlen(str), buf)); \ + tt_int_op(0,OP_EQ,router_get_extrainfo_hash(str, strlen(str), buf)); \ smartlist_add(wanted, tor_strdup(hex_str(buf, DIGEST_LEN))); \ } while (0) @@ -746,13 +755,13 @@ test_dir_load_extrainfo(void *arg) ADD(EX_EI_BAD_TOKENS); ADD(EX_EI_BAD_SIG2); - char *list = smartlist_join_strings(chunks, "", 0, NULL); + list = smartlist_join_strings(chunks, "", 0, NULL); router_load_extrainfo_from_string(list, NULL, SAVED_IN_JOURNAL, wanted, 1); /* The "maximal" router was added. */ /* "minimal" was also added, even though we didn't ask for it, since * that's what we do with extrainfos. */ - tt_int_op(smartlist_len(mock_ei_insert_list),==,2); + tt_int_op(smartlist_len(mock_ei_insert_list),OP_EQ,2); extrainfo_t *e = smartlist_get(mock_ei_insert_list, 0); test_memeq_hex(e->cache_info.signed_descriptor_digest, @@ -761,22 +770,22 @@ test_dir_load_extrainfo(void *arg) e = smartlist_get(mock_ei_insert_list, 1); test_memeq_hex(e->cache_info.signed_descriptor_digest, "47803B02A0E70E9E8BDA226CB1D74DE354D67DFF"); - tt_int_op(dls_minimal.n_download_failures, ==, 0); - tt_int_op(dls_maximal.n_download_failures, ==, 0); + tt_int_op(dls_minimal.n_download_failures, OP_EQ, 0); + tt_int_op(dls_maximal.n_download_failures, OP_EQ, 0); /* "Bad nickname" and "Bad tokens" should have gotten marked * non-retriable. */ - tt_want_int_op(mock_get_by_ei_dd_calls, ==, 2); - tt_want_int_op(mock_get_by_ei_dd_unrecognized, ==, 0); - tt_int_op(sd_ei_bad_nickname.ei_dl_status.n_download_failures, ==, 255); - tt_int_op(sd_ei_bad_tokens.ei_dl_status.n_download_failures, ==, 255); + tt_want_int_op(mock_get_by_ei_dd_calls, OP_EQ, 2); + tt_want_int_op(mock_get_by_ei_dd_unrecognized, OP_EQ, 0); + tt_int_op(sd_ei_bad_nickname.ei_dl_status.n_download_failures, OP_EQ, 255); + tt_int_op(sd_ei_bad_tokens.ei_dl_status.n_download_failures, OP_EQ, 255); /* bad_ports is retriable -- because we didn't ask for it. */ - tt_int_op(dls_bad_ports.n_download_failures, ==, 0); + tt_int_op(dls_bad_ports.n_download_failures, OP_EQ, 0); /* Wanted still contains "BAD_SIG2" */ - tt_int_op(smartlist_len(wanted), ==, 1); - tt_str_op(smartlist_get(wanted, 0), ==, + tt_int_op(smartlist_len(wanted), OP_EQ, 1); + tt_str_op(smartlist_get(wanted, 0), OP_EQ, "16D387D3A58F7DB3CF46638F8D0B90C45C7D769C"); #undef ADD @@ -788,6 +797,7 @@ test_dir_load_extrainfo(void *arg) smartlist_free(chunks); SMARTLIST_FOREACH(wanted, char *, cp, tor_free(cp)); smartlist_free(wanted); + tor_free(list); } static void @@ -797,50 +807,86 @@ test_dir_versions(void *arg) /* Try out version parsing functionality */ (void)arg; - tt_int_op(0,==, tor_version_parse("0.3.4pre2-cvs", &ver1)); - tt_int_op(0,==, ver1.major); - tt_int_op(3,==, ver1.minor); - tt_int_op(4,==, ver1.micro); - tt_int_op(VER_PRE,==, ver1.status); - tt_int_op(2,==, ver1.patchlevel); - tt_int_op(0,==, tor_version_parse("0.3.4rc1", &ver1)); - tt_int_op(0,==, ver1.major); - tt_int_op(3,==, ver1.minor); - tt_int_op(4,==, ver1.micro); - tt_int_op(VER_RC,==, ver1.status); - tt_int_op(1,==, ver1.patchlevel); - tt_int_op(0,==, tor_version_parse("1.3.4", &ver1)); - tt_int_op(1,==, ver1.major); - tt_int_op(3,==, ver1.minor); - tt_int_op(4,==, ver1.micro); - tt_int_op(VER_RELEASE,==, ver1.status); - tt_int_op(0,==, ver1.patchlevel); - tt_int_op(0,==, tor_version_parse("1.3.4.999", &ver1)); - tt_int_op(1,==, ver1.major); - tt_int_op(3,==, ver1.minor); - tt_int_op(4,==, ver1.micro); - tt_int_op(VER_RELEASE,==, ver1.status); - tt_int_op(999,==, ver1.patchlevel); - tt_int_op(0,==, tor_version_parse("0.1.2.4-alpha", &ver1)); - tt_int_op(0,==, ver1.major); - tt_int_op(1,==, ver1.minor); - tt_int_op(2,==, ver1.micro); - tt_int_op(4,==, ver1.patchlevel); - tt_int_op(VER_RELEASE,==, ver1.status); - tt_str_op("alpha",==, ver1.status_tag); - tt_int_op(0,==, tor_version_parse("0.1.2.4", &ver1)); - tt_int_op(0,==, ver1.major); - tt_int_op(1,==, ver1.minor); - tt_int_op(2,==, ver1.micro); - tt_int_op(4,==, ver1.patchlevel); - tt_int_op(VER_RELEASE,==, ver1.status); - tt_str_op("",==, ver1.status_tag); + tt_int_op(0,OP_EQ, tor_version_parse("0.3.4pre2-cvs", &ver1)); + tt_int_op(0,OP_EQ, ver1.major); + tt_int_op(3,OP_EQ, ver1.minor); + tt_int_op(4,OP_EQ, ver1.micro); + tt_int_op(VER_PRE,OP_EQ, ver1.status); + tt_int_op(2,OP_EQ, ver1.patchlevel); + tt_int_op(0,OP_EQ, tor_version_parse("0.3.4rc1", &ver1)); + tt_int_op(0,OP_EQ, ver1.major); + tt_int_op(3,OP_EQ, ver1.minor); + tt_int_op(4,OP_EQ, ver1.micro); + tt_int_op(VER_RC,OP_EQ, ver1.status); + tt_int_op(1,OP_EQ, ver1.patchlevel); + tt_int_op(0,OP_EQ, tor_version_parse("1.3.4", &ver1)); + tt_int_op(1,OP_EQ, ver1.major); + tt_int_op(3,OP_EQ, ver1.minor); + tt_int_op(4,OP_EQ, ver1.micro); + tt_int_op(VER_RELEASE,OP_EQ, ver1.status); + tt_int_op(0,OP_EQ, ver1.patchlevel); + tt_int_op(0,OP_EQ, tor_version_parse("1.3.4.999", &ver1)); + tt_int_op(1,OP_EQ, ver1.major); + tt_int_op(3,OP_EQ, ver1.minor); + tt_int_op(4,OP_EQ, ver1.micro); + tt_int_op(VER_RELEASE,OP_EQ, ver1.status); + tt_int_op(999,OP_EQ, ver1.patchlevel); + tt_int_op(0,OP_EQ, tor_version_parse("0.1.2.4-alpha", &ver1)); + tt_int_op(0,OP_EQ, ver1.major); + tt_int_op(1,OP_EQ, ver1.minor); + tt_int_op(2,OP_EQ, ver1.micro); + tt_int_op(4,OP_EQ, ver1.patchlevel); + tt_int_op(VER_RELEASE,OP_EQ, ver1.status); + tt_str_op("alpha",OP_EQ, ver1.status_tag); + tt_int_op(0,OP_EQ, tor_version_parse("0.1.2.4", &ver1)); + tt_int_op(0,OP_EQ, ver1.major); + tt_int_op(1,OP_EQ, ver1.minor); + tt_int_op(2,OP_EQ, ver1.micro); + tt_int_op(4,OP_EQ, ver1.patchlevel); + tt_int_op(VER_RELEASE,OP_EQ, ver1.status); + tt_str_op("",OP_EQ, ver1.status_tag); + + tt_int_op(0, OP_EQ, tor_version_parse("10.1", &ver1)); + tt_int_op(10, OP_EQ, ver1.major); + tt_int_op(1, OP_EQ, ver1.minor); + tt_int_op(0, OP_EQ, ver1.micro); + tt_int_op(0, OP_EQ, ver1.patchlevel); + tt_int_op(VER_RELEASE, OP_EQ, ver1.status); + tt_str_op("", OP_EQ, ver1.status_tag); + tt_int_op(0, OP_EQ, tor_version_parse("5.99.999", &ver1)); + tt_int_op(5, OP_EQ, ver1.major); + tt_int_op(99, OP_EQ, ver1.minor); + tt_int_op(999, OP_EQ, ver1.micro); + tt_int_op(0, OP_EQ, ver1.patchlevel); + tt_int_op(VER_RELEASE, OP_EQ, ver1.status); + tt_str_op("", OP_EQ, ver1.status_tag); + tt_int_op(0, OP_EQ, tor_version_parse("10.1-alpha", &ver1)); + tt_int_op(10, OP_EQ, ver1.major); + tt_int_op(1, OP_EQ, ver1.minor); + tt_int_op(0, OP_EQ, ver1.micro); + tt_int_op(0, OP_EQ, ver1.patchlevel); + tt_int_op(VER_RELEASE, OP_EQ, ver1.status); + tt_str_op("alpha", OP_EQ, ver1.status_tag); + tt_int_op(0, OP_EQ, tor_version_parse("2.1.700-alpha", &ver1)); + tt_int_op(2, OP_EQ, ver1.major); + tt_int_op(1, OP_EQ, ver1.minor); + tt_int_op(700, OP_EQ, ver1.micro); + tt_int_op(0, OP_EQ, ver1.patchlevel); + tt_int_op(VER_RELEASE, OP_EQ, ver1.status); + tt_str_op("alpha", OP_EQ, ver1.status_tag); + tt_int_op(0, OP_EQ, tor_version_parse("1.6.8-alpha-dev", &ver1)); + tt_int_op(1, OP_EQ, ver1.major); + tt_int_op(6, OP_EQ, ver1.minor); + tt_int_op(8, OP_EQ, ver1.micro); + tt_int_op(0, OP_EQ, ver1.patchlevel); + tt_int_op(VER_RELEASE, OP_EQ, ver1.status); + tt_str_op("alpha-dev", OP_EQ, ver1.status_tag); #define tt_versionstatus_op(vs1, op, vs2) \ tt_assert_test_type(vs1,vs2,#vs1" "#op" "#vs2,version_status_t, \ (val1_ op val2_),"%d",TT_EXIT_TEST_FUNCTION) #define test_v_i_o(val, ver, lst) \ - tt_versionstatus_op(val, ==, tor_version_is_obsolete(ver, lst)) + tt_versionstatus_op(val, OP_EQ, tor_version_is_obsolete(ver, lst)) /* make sure tor_version_is_obsolete() works */ test_v_i_o(VS_OLD, "0.0.1", "Tor 0.0.2"); @@ -867,42 +913,43 @@ test_dir_versions(void *arg) /* On list, not newer than any on same series. */ test_v_i_o(VS_UNRECOMMENDED, "0.1.0.1", "Tor 0.1.0.2,Tor 0.0.9.5,Tor 0.1.1.0"); - tt_int_op(0,==, tor_version_as_new_as("Tor 0.0.5", "0.0.9pre1-cvs")); - tt_int_op(1,==, tor_version_as_new_as( + tt_int_op(0,OP_EQ, tor_version_as_new_as("Tor 0.0.5", "0.0.9pre1-cvs")); + tt_int_op(1,OP_EQ, tor_version_as_new_as( "Tor 0.0.8 on Darwin 64-121-192-100.c3-0." "sfpo-ubr1.sfrn-sfpo.ca.cable.rcn.com Power Macintosh", "0.0.8rc2")); - tt_int_op(0,==, tor_version_as_new_as( + tt_int_op(0,OP_EQ, tor_version_as_new_as( "Tor 0.0.8 on Darwin 64-121-192-100.c3-0." "sfpo-ubr1.sfrn-sfpo.ca.cable.rcn.com Power Macintosh", "0.0.8.2")); /* Now try svn revisions. */ - tt_int_op(1,==, tor_version_as_new_as("Tor 0.2.1.0-dev (r100)", + tt_int_op(1,OP_EQ, tor_version_as_new_as("Tor 0.2.1.0-dev (r100)", "Tor 0.2.1.0-dev (r99)")); - tt_int_op(1,==, tor_version_as_new_as("Tor 0.2.1.0-dev (r100) on Banana Jr", + tt_int_op(1,OP_EQ, tor_version_as_new_as( + "Tor 0.2.1.0-dev (r100) on Banana Jr", "Tor 0.2.1.0-dev (r99) on Hal 9000")); - tt_int_op(1,==, tor_version_as_new_as("Tor 0.2.1.0-dev (r100)", + tt_int_op(1,OP_EQ, tor_version_as_new_as("Tor 0.2.1.0-dev (r100)", "Tor 0.2.1.0-dev on Colossus")); - tt_int_op(0,==, tor_version_as_new_as("Tor 0.2.1.0-dev (r99)", + tt_int_op(0,OP_EQ, tor_version_as_new_as("Tor 0.2.1.0-dev (r99)", "Tor 0.2.1.0-dev (r100)")); - tt_int_op(0,==, tor_version_as_new_as("Tor 0.2.1.0-dev (r99) on MCP", + tt_int_op(0,OP_EQ, tor_version_as_new_as("Tor 0.2.1.0-dev (r99) on MCP", "Tor 0.2.1.0-dev (r100) on AM")); - tt_int_op(0,==, tor_version_as_new_as("Tor 0.2.1.0-dev", + tt_int_op(0,OP_EQ, tor_version_as_new_as("Tor 0.2.1.0-dev", "Tor 0.2.1.0-dev (r99)")); - tt_int_op(1,==, tor_version_as_new_as("Tor 0.2.1.1", + tt_int_op(1,OP_EQ, tor_version_as_new_as("Tor 0.2.1.1", "Tor 0.2.1.0-dev (r99)")); /* Now try git revisions */ - tt_int_op(0,==, tor_version_parse("0.5.6.7 (git-ff00ff)", &ver1)); - tt_int_op(0,==, ver1.major); - tt_int_op(5,==, ver1.minor); - tt_int_op(6,==, ver1.micro); - tt_int_op(7,==, ver1.patchlevel); - tt_int_op(3,==, ver1.git_tag_len); - tt_mem_op(ver1.git_tag,==, "\xff\x00\xff", 3); - tt_int_op(-1,==, tor_version_parse("0.5.6.7 (git-ff00xx)", &ver1)); - tt_int_op(-1,==, tor_version_parse("0.5.6.7 (git-ff00fff)", &ver1)); - tt_int_op(0,==, tor_version_parse("0.5.6.7 (git ff00fff)", &ver1)); + tt_int_op(0,OP_EQ, tor_version_parse("0.5.6.7 (git-ff00ff)", &ver1)); + tt_int_op(0,OP_EQ, ver1.major); + tt_int_op(5,OP_EQ, ver1.minor); + tt_int_op(6,OP_EQ, ver1.micro); + tt_int_op(7,OP_EQ, ver1.patchlevel); + tt_int_op(3,OP_EQ, ver1.git_tag_len); + tt_mem_op(ver1.git_tag,OP_EQ, "\xff\x00\xff", 3); + tt_int_op(-1,OP_EQ, tor_version_parse("0.5.6.7 (git-ff00xx)", &ver1)); + tt_int_op(-1,OP_EQ, tor_version_parse("0.5.6.7 (git-ff00fff)", &ver1)); + tt_int_op(0,OP_EQ, tor_version_parse("0.5.6.7 (git ff00fff)", &ver1)); done: ; } @@ -924,13 +971,14 @@ test_dir_fp_pairs(void *arg) "48657861646563696d616c2069736e277420736f-" "676f6f6420666f7220686964696e6720796f7572.z", sl); - tt_int_op(smartlist_len(sl),==, 2); + tt_int_op(smartlist_len(sl),OP_EQ, 2); pair = smartlist_get(sl, 0); - tt_mem_op(pair->first,==, "Hexadecimal isn't so", DIGEST_LEN); - tt_mem_op(pair->second,==, "good for hiding your", DIGEST_LEN); + tt_mem_op(pair->first,OP_EQ, "Hexadecimal isn't so", DIGEST_LEN); + tt_mem_op(pair->second,OP_EQ, "good for hiding your", DIGEST_LEN); pair = smartlist_get(sl, 1); - tt_mem_op(pair->first,==, "secret data.\0\0\0\0\0\xff\xff\xff", DIGEST_LEN); - tt_mem_op(pair->second,==, "Use AES-256 instead.", DIGEST_LEN); + tt_mem_op(pair->first,OP_EQ, "secret data.\0\0\0\0\0\xff\xff\xff", + DIGEST_LEN); + tt_mem_op(pair->second,OP_EQ, "Use AES-256 instead.", DIGEST_LEN); done: SMARTLIST_FOREACH(sl, fp_pair_t *, pair, tor_free(pair)); @@ -961,56 +1009,56 @@ test_dir_split_fps(void *testdata) /* no flags set */ dir_split_resource_into_fingerprints("A+C+B", sl, NULL, 0); - tt_int_op(smartlist_len(sl), ==, 3); - tt_str_op(smartlist_get(sl, 0), ==, "A"); - tt_str_op(smartlist_get(sl, 1), ==, "C"); - tt_str_op(smartlist_get(sl, 2), ==, "B"); + tt_int_op(smartlist_len(sl), OP_EQ, 3); + tt_str_op(smartlist_get(sl, 0), OP_EQ, "A"); + tt_str_op(smartlist_get(sl, 1), OP_EQ, "C"); + tt_str_op(smartlist_get(sl, 2), OP_EQ, "B"); SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); smartlist_clear(sl); /* uniq strings. */ dir_split_resource_into_fingerprints("A+C+B+A+B+B", sl, NULL, DSR_SORT_UNIQ); - tt_int_op(smartlist_len(sl), ==, 3); - tt_str_op(smartlist_get(sl, 0), ==, "A"); - tt_str_op(smartlist_get(sl, 1), ==, "B"); - tt_str_op(smartlist_get(sl, 2), ==, "C"); + tt_int_op(smartlist_len(sl), OP_EQ, 3); + tt_str_op(smartlist_get(sl, 0), OP_EQ, "A"); + tt_str_op(smartlist_get(sl, 1), OP_EQ, "B"); + tt_str_op(smartlist_get(sl, 2), OP_EQ, "C"); SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); smartlist_clear(sl); /* Decode hex. */ dir_split_resource_into_fingerprints(HEX1"+"HEX2, sl, NULL, DSR_HEX); - tt_int_op(smartlist_len(sl), ==, 2); - test_mem_op_hex(smartlist_get(sl, 0), ==, HEX1); - test_mem_op_hex(smartlist_get(sl, 1), ==, HEX2); + tt_int_op(smartlist_len(sl), OP_EQ, 2); + test_mem_op_hex(smartlist_get(sl, 0), OP_EQ, HEX1); + test_mem_op_hex(smartlist_get(sl, 1), OP_EQ, HEX2); SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); smartlist_clear(sl); /* decode hex and drop weirdness. */ dir_split_resource_into_fingerprints(HEX1"+bogus+"HEX2"+"HEX256_1, sl, NULL, DSR_HEX); - tt_int_op(smartlist_len(sl), ==, 2); - test_mem_op_hex(smartlist_get(sl, 0), ==, HEX1); - test_mem_op_hex(smartlist_get(sl, 1), ==, HEX2); + tt_int_op(smartlist_len(sl), OP_EQ, 2); + test_mem_op_hex(smartlist_get(sl, 0), OP_EQ, HEX1); + test_mem_op_hex(smartlist_get(sl, 1), OP_EQ, HEX2); SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); smartlist_clear(sl); /* Decode long hex */ dir_split_resource_into_fingerprints(HEX256_1"+"HEX256_2"+"HEX2"+"HEX256_3, sl, NULL, DSR_HEX|DSR_DIGEST256); - tt_int_op(smartlist_len(sl), ==, 3); - test_mem_op_hex(smartlist_get(sl, 0), ==, HEX256_1); - test_mem_op_hex(smartlist_get(sl, 1), ==, HEX256_2); - test_mem_op_hex(smartlist_get(sl, 2), ==, HEX256_3); + tt_int_op(smartlist_len(sl), OP_EQ, 3); + test_mem_op_hex(smartlist_get(sl, 0), OP_EQ, HEX256_1); + test_mem_op_hex(smartlist_get(sl, 1), OP_EQ, HEX256_2); + test_mem_op_hex(smartlist_get(sl, 2), OP_EQ, HEX256_3); SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); smartlist_clear(sl); /* Decode hex and sort. */ dir_split_resource_into_fingerprints(HEX1"+"HEX2"+"HEX3"+"HEX2, sl, NULL, DSR_HEX|DSR_SORT_UNIQ); - tt_int_op(smartlist_len(sl), ==, 3); - test_mem_op_hex(smartlist_get(sl, 0), ==, HEX3); - test_mem_op_hex(smartlist_get(sl, 1), ==, HEX2); - test_mem_op_hex(smartlist_get(sl, 2), ==, HEX1); + tt_int_op(smartlist_len(sl), OP_EQ, 3); + test_mem_op_hex(smartlist_get(sl, 0), OP_EQ, HEX3); + test_mem_op_hex(smartlist_get(sl, 1), OP_EQ, HEX2); + test_mem_op_hex(smartlist_get(sl, 2), OP_EQ, HEX1); SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); smartlist_clear(sl); @@ -1019,34 +1067,34 @@ test_dir_split_fps(void *testdata) "+"HEX256_1, sl, NULL, DSR_HEX|DSR_DIGEST256|DSR_SORT_UNIQ); - tt_int_op(smartlist_len(sl), ==, 3); - test_mem_op_hex(smartlist_get(sl, 0), ==, HEX256_3); - test_mem_op_hex(smartlist_get(sl, 1), ==, HEX256_2); - test_mem_op_hex(smartlist_get(sl, 2), ==, HEX256_1); + tt_int_op(smartlist_len(sl), OP_EQ, 3); + test_mem_op_hex(smartlist_get(sl, 0), OP_EQ, HEX256_3); + test_mem_op_hex(smartlist_get(sl, 1), OP_EQ, HEX256_2); + test_mem_op_hex(smartlist_get(sl, 2), OP_EQ, HEX256_1); SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); smartlist_clear(sl); /* Decode base64 */ dir_split_resource_into_fingerprints(B64_1"-"B64_2, sl, NULL, DSR_BASE64); - tt_int_op(smartlist_len(sl), ==, 2); - test_mem_op_hex(smartlist_get(sl, 0), ==, HEX1); - test_mem_op_hex(smartlist_get(sl, 1), ==, HEX2); + tt_int_op(smartlist_len(sl), OP_EQ, 2); + test_mem_op_hex(smartlist_get(sl, 0), OP_EQ, HEX1); + test_mem_op_hex(smartlist_get(sl, 1), OP_EQ, HEX2); SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); smartlist_clear(sl); /* Decode long base64 */ dir_split_resource_into_fingerprints(B64_256_1"-"B64_256_2, sl, NULL, DSR_BASE64|DSR_DIGEST256); - tt_int_op(smartlist_len(sl), ==, 2); - test_mem_op_hex(smartlist_get(sl, 0), ==, HEX256_1); - test_mem_op_hex(smartlist_get(sl, 1), ==, HEX256_2); + tt_int_op(smartlist_len(sl), OP_EQ, 2); + test_mem_op_hex(smartlist_get(sl, 0), OP_EQ, HEX256_1); + test_mem_op_hex(smartlist_get(sl, 1), OP_EQ, HEX256_2); SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); smartlist_clear(sl); dir_split_resource_into_fingerprints(B64_256_1, sl, NULL, DSR_BASE64|DSR_DIGEST256); - tt_int_op(smartlist_len(sl), ==, 1); - test_mem_op_hex(smartlist_get(sl, 0), ==, HEX256_1); + tt_int_op(smartlist_len(sl), OP_EQ, 1); + test_mem_op_hex(smartlist_get(sl, 0), OP_EQ, HEX256_1); SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp)); smartlist_clear(sl); @@ -1140,7 +1188,7 @@ test_dir_measured_bw_kb_cache(void *arg) /* First, clear the cache and assert that it's empty */ (void)arg; dirserv_clear_measured_bw_cache(); - tt_int_op(dirserv_get_measured_bw_cache_size(),==, 0); + tt_int_op(dirserv_get_measured_bw_cache_size(),OP_EQ, 0); /* * Set up test mbwls; none of the dirserv_cache_*() functions care about * the node_hex field. @@ -1153,49 +1201,49 @@ test_dir_measured_bw_kb_cache(void *arg) mbwl[2].bw_kb = 80; /* Try caching something */ dirserv_cache_measured_bw(&(mbwl[0]), curr); - tt_int_op(dirserv_get_measured_bw_cache_size(),==, 1); + tt_int_op(dirserv_get_measured_bw_cache_size(),OP_EQ, 1); /* Okay, let's see if we can retrieve it */ tt_assert(dirserv_query_measured_bw_cache_kb(mbwl[0].node_id,&bw, &as_of)); - tt_int_op(bw,==, 20); - tt_int_op(as_of,==, MBWC_INIT_TIME); + tt_int_op(bw,OP_EQ, 20); + tt_int_op(as_of,OP_EQ, MBWC_INIT_TIME); /* Try retrieving it without some outputs */ tt_assert(dirserv_query_measured_bw_cache_kb(mbwl[0].node_id,NULL, NULL)); tt_assert(dirserv_query_measured_bw_cache_kb(mbwl[0].node_id,&bw, NULL)); - tt_int_op(bw,==, 20); + tt_int_op(bw,OP_EQ, 20); tt_assert(dirserv_query_measured_bw_cache_kb(mbwl[0].node_id,NULL,&as_of)); - tt_int_op(as_of,==, MBWC_INIT_TIME); + tt_int_op(as_of,OP_EQ, MBWC_INIT_TIME); /* Now expire it */ curr += MAX_MEASUREMENT_AGE + 1; dirserv_expire_measured_bw_cache(curr); /* Check that the cache is empty */ - tt_int_op(dirserv_get_measured_bw_cache_size(),==, 0); + tt_int_op(dirserv_get_measured_bw_cache_size(),OP_EQ, 0); /* Check that we can't retrieve it */ tt_assert(!dirserv_query_measured_bw_cache_kb(mbwl[0].node_id, NULL,NULL)); /* Try caching a few things now */ dirserv_cache_measured_bw(&(mbwl[0]), curr); - tt_int_op(dirserv_get_measured_bw_cache_size(),==, 1); + tt_int_op(dirserv_get_measured_bw_cache_size(),OP_EQ, 1); curr += MAX_MEASUREMENT_AGE / 4; dirserv_cache_measured_bw(&(mbwl[1]), curr); - tt_int_op(dirserv_get_measured_bw_cache_size(),==, 2); + tt_int_op(dirserv_get_measured_bw_cache_size(),OP_EQ, 2); curr += MAX_MEASUREMENT_AGE / 4; dirserv_cache_measured_bw(&(mbwl[2]), curr); - tt_int_op(dirserv_get_measured_bw_cache_size(),==, 3); + tt_int_op(dirserv_get_measured_bw_cache_size(),OP_EQ, 3); curr += MAX_MEASUREMENT_AGE / 4 + 1; /* Do an expire that's too soon to get any of them */ dirserv_expire_measured_bw_cache(curr); - tt_int_op(dirserv_get_measured_bw_cache_size(),==, 3); + tt_int_op(dirserv_get_measured_bw_cache_size(),OP_EQ, 3); /* Push the oldest one off the cliff */ curr += MAX_MEASUREMENT_AGE / 4; dirserv_expire_measured_bw_cache(curr); - tt_int_op(dirserv_get_measured_bw_cache_size(),==, 2); + tt_int_op(dirserv_get_measured_bw_cache_size(),OP_EQ, 2); /* And another... */ curr += MAX_MEASUREMENT_AGE / 4; dirserv_expire_measured_bw_cache(curr); - tt_int_op(dirserv_get_measured_bw_cache_size(),==, 1); + tt_int_op(dirserv_get_measured_bw_cache_size(),OP_EQ, 1); /* This should empty it out again */ curr += MAX_MEASUREMENT_AGE / 4; dirserv_expire_measured_bw_cache(curr); - tt_int_op(dirserv_get_measured_bw_cache_size(),==, 0); + tt_int_op(dirserv_get_measured_bw_cache_size(),OP_EQ, 0); done: return; @@ -1228,11 +1276,11 @@ test_dir_param_voting(void *arg) "abcd=20 c=60 cw=500 x-yz=-9 zzzzz=101", NULL, 0, 0); smartlist_split_string(vote4.net_params, "ab=900 abcd=200 c=1 cw=51 x-yz=100", NULL, 0, 0); - tt_int_op(100,==, networkstatus_get_param(&vote4, "x-yz", 50, 0, 300)); - tt_int_op(222,==, networkstatus_get_param(&vote4, "foobar", 222, 0, 300)); - tt_int_op(80,==, networkstatus_get_param(&vote4, "ab", 12, 0, 80)); - tt_int_op(-8,==, networkstatus_get_param(&vote4, "ab", -12, -100, -8)); - tt_int_op(0,==, networkstatus_get_param(&vote4, "foobar", 0, -100, 8)); + tt_int_op(100,OP_EQ, networkstatus_get_param(&vote4, "x-yz", 50, 0, 300)); + tt_int_op(222,OP_EQ, networkstatus_get_param(&vote4, "foobar", 222, 0, 300)); + tt_int_op(80,OP_EQ, networkstatus_get_param(&vote4, "ab", 12, 0, 80)); + tt_int_op(-8,OP_EQ, networkstatus_get_param(&vote4, "ab", -12, -100, -8)); + tt_int_op(0,OP_EQ, networkstatus_get_param(&vote4, "foobar", 0, -100, 8)); smartlist_add(votes, &vote1); @@ -1240,59 +1288,59 @@ test_dir_param_voting(void *arg) * networks without many dirauths. */ res = dirvote_compute_params(votes, 12, 2); - tt_str_op(res,==, ""); + tt_str_op(res,OP_EQ, ""); tor_free(res); res = dirvote_compute_params(votes, 12, 1); - tt_str_op(res,==, "ab=90 abcd=20 cw=50 x-yz=-99"); + tt_str_op(res,OP_EQ, "ab=90 abcd=20 cw=50 x-yz=-99"); tor_free(res); smartlist_add(votes, &vote2); res = dirvote_compute_params(votes, 12, 2); - tt_str_op(res,==, "ab=27 cw=5 x-yz=-99"); + tt_str_op(res,OP_EQ, "ab=27 cw=5 x-yz=-99"); tor_free(res); res = dirvote_compute_params(votes, 12, 3); - tt_str_op(res,==, "ab=27 cw=5 x-yz=-99"); + tt_str_op(res,OP_EQ, "ab=27 cw=5 x-yz=-99"); tor_free(res); res = dirvote_compute_params(votes, 12, 6); - tt_str_op(res,==, ""); + tt_str_op(res,OP_EQ, ""); tor_free(res); smartlist_add(votes, &vote3); res = dirvote_compute_params(votes, 12, 3); - tt_str_op(res,==, "ab=27 abcd=20 cw=50 x-yz=-9"); + tt_str_op(res,OP_EQ, "ab=27 abcd=20 cw=50 x-yz=-9"); tor_free(res); res = dirvote_compute_params(votes, 12, 5); - tt_str_op(res,==, "cw=50 x-yz=-9"); + tt_str_op(res,OP_EQ, "cw=50 x-yz=-9"); tor_free(res); res = dirvote_compute_params(votes, 12, 9); - tt_str_op(res,==, "cw=50 x-yz=-9"); + tt_str_op(res,OP_EQ, "cw=50 x-yz=-9"); tor_free(res); smartlist_add(votes, &vote4); res = dirvote_compute_params(votes, 12, 4); - tt_str_op(res,==, "ab=90 abcd=20 cw=50 x-yz=-9"); + tt_str_op(res,OP_EQ, "ab=90 abcd=20 cw=50 x-yz=-9"); tor_free(res); res = dirvote_compute_params(votes, 12, 5); - tt_str_op(res,==, "ab=90 abcd=20 cw=50 x-yz=-9"); + tt_str_op(res,OP_EQ, "ab=90 abcd=20 cw=50 x-yz=-9"); tor_free(res); /* Test that the special-cased "at least three dirauths voted for * this param" logic works as expected. */ res = dirvote_compute_params(votes, 12, 6); - tt_str_op(res,==, "ab=90 abcd=20 cw=50 x-yz=-9"); + tt_str_op(res,OP_EQ, "ab=90 abcd=20 cw=50 x-yz=-9"); tor_free(res); res = dirvote_compute_params(votes, 12, 10); - tt_str_op(res,==, "ab=90 abcd=20 cw=50 x-yz=-9"); + tt_str_op(res,OP_EQ, "ab=90 abcd=20 cw=50 x-yz=-9"); tor_free(res); done: @@ -1324,14 +1372,14 @@ static void test_same_voter(networkstatus_voter_info_t *v1, networkstatus_voter_info_t *v2) { - tt_str_op(v1->nickname,==, v2->nickname); - tt_mem_op(v1->identity_digest,==, v2->identity_digest, DIGEST_LEN); - tt_str_op(v1->address,==, v2->address); - tt_int_op(v1->addr,==, v2->addr); - tt_int_op(v1->dir_port,==, v2->dir_port); - tt_int_op(v1->or_port,==, v2->or_port); - tt_str_op(v1->contact,==, v2->contact); - tt_mem_op(v1->vote_digest,==, v2->vote_digest, DIGEST_LEN); + tt_str_op(v1->nickname,OP_EQ, v2->nickname); + tt_mem_op(v1->identity_digest,OP_EQ, v2->identity_digest, DIGEST_LEN); + tt_str_op(v1->address,OP_EQ, v2->address); + tt_int_op(v1->addr,OP_EQ, v2->addr); + tt_int_op(v1->dir_port,OP_EQ, v2->dir_port); + tt_int_op(v1->or_port,OP_EQ, v2->or_port); + tt_str_op(v1->contact,OP_EQ, v2->contact); + tt_mem_op(v1->vote_digest,OP_EQ, v2->vote_digest, DIGEST_LEN); done: ; } @@ -1541,48 +1589,48 @@ test_vrs_for_v3ns(vote_routerstatus_t *vrs, int voter, time_t now) DIGEST_LEN) && (voter == 1)) { /* Check the first routerstatus. */ - tt_str_op(vrs->version,==, "0.1.2.14"); - tt_int_op(rs->published_on,==, now-1500); - tt_str_op(rs->nickname,==, "router2"); - tt_mem_op(rs->identity_digest,==, + tt_str_op(vrs->version,OP_EQ, "0.1.2.14"); + tt_int_op(rs->published_on,OP_EQ, now-1500); + tt_str_op(rs->nickname,OP_EQ, "router2"); + tt_mem_op(rs->identity_digest,OP_EQ, "\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3" "\x3\x3\x3\x3", DIGEST_LEN); - tt_mem_op(rs->descriptor_digest,==, "NNNNNNNNNNNNNNNNNNNN", DIGEST_LEN); - tt_int_op(rs->addr,==, 0x99008801); - tt_int_op(rs->or_port,==, 443); - tt_int_op(rs->dir_port,==, 8000); + tt_mem_op(rs->descriptor_digest,OP_EQ, "NNNNNNNNNNNNNNNNNNNN", DIGEST_LEN); + tt_int_op(rs->addr,OP_EQ, 0x99008801); + tt_int_op(rs->or_port,OP_EQ, 443); + tt_int_op(rs->dir_port,OP_EQ, 8000); /* no flags except "running" (16) and "v2dir" (64) */ - tt_u64_op(vrs->flags, ==, U64_LITERAL(80)); + tt_u64_op(vrs->flags, OP_EQ, U64_LITERAL(80)); } else if (tor_memeq(rs->identity_digest, "\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5" "\x5\x5\x5\x5", DIGEST_LEN) && (voter == 1 || voter == 2)) { - tt_mem_op(rs->identity_digest,==, + tt_mem_op(rs->identity_digest,OP_EQ, "\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5" "\x5\x5\x5\x5", DIGEST_LEN); if (voter == 1) { /* Check the second routerstatus. */ - tt_str_op(vrs->version,==, "0.2.0.5"); - tt_int_op(rs->published_on,==, now-1000); - tt_str_op(rs->nickname,==, "router1"); + tt_str_op(vrs->version,OP_EQ, "0.2.0.5"); + tt_int_op(rs->published_on,OP_EQ, now-1000); + tt_str_op(rs->nickname,OP_EQ, "router1"); } - tt_mem_op(rs->descriptor_digest,==, "MMMMMMMMMMMMMMMMMMMM", DIGEST_LEN); - tt_int_op(rs->addr,==, 0x99009901); - tt_int_op(rs->or_port,==, 443); - tt_int_op(rs->dir_port,==, 0); + tt_mem_op(rs->descriptor_digest,OP_EQ, "MMMMMMMMMMMMMMMMMMMM", DIGEST_LEN); + tt_int_op(rs->addr,OP_EQ, 0x99009901); + tt_int_op(rs->or_port,OP_EQ, 443); + tt_int_op(rs->dir_port,OP_EQ, 0); tor_addr_parse(&addr_ipv6, "[1:2:3::4]"); tt_assert(tor_addr_eq(&rs->ipv6_addr, &addr_ipv6)); - tt_int_op(rs->ipv6_orport,==, 4711); + tt_int_op(rs->ipv6_orport,OP_EQ, 4711); if (voter == 1) { /* all except "authority" (1) and "v2dir" (64) */ - tt_u64_op(vrs->flags, ==, U64_LITERAL(190)); + tt_u64_op(vrs->flags, OP_EQ, U64_LITERAL(190)); } else { /* 1023 - authority(1) - madeofcheese(16) - madeoftin(32) - v2dir(256) */ - tt_u64_op(vrs->flags, ==, U64_LITERAL(718)); + tt_u64_op(vrs->flags, OP_EQ, U64_LITERAL(718)); } } else if (tor_memeq(rs->identity_digest, "\x33\x33\x33\x33\x33\x33\x33\x33\x33\x33" @@ -1614,7 +1662,7 @@ test_consensus_for_v3ns(networkstatus_t *con, time_t now) tt_assert(con); tt_assert(!con->cert); - tt_int_op(2,==, smartlist_len(con->routerstatus_list)); + tt_int_op(2,OP_EQ, smartlist_len(con->routerstatus_list)); /* There should be two listed routers: one with identity 3, one with * identity 5. */ @@ -1639,10 +1687,10 @@ test_routerstatus_for_v3ns(routerstatus_t *rs, time_t now) "\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3" "\x3\x3", DIGEST_LEN)) { - tt_mem_op(rs->identity_digest,==, + tt_mem_op(rs->identity_digest,OP_EQ, "\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3", DIGEST_LEN); - tt_mem_op(rs->descriptor_digest,==, "NNNNNNNNNNNNNNNNNNNN", DIGEST_LEN); + tt_mem_op(rs->descriptor_digest,OP_EQ, "NNNNNNNNNNNNNNNNNNNN", DIGEST_LEN); tt_assert(!rs->is_authority); tt_assert(!rs->is_exit); tt_assert(!rs->is_fast); @@ -1658,18 +1706,18 @@ test_routerstatus_for_v3ns(routerstatus_t *rs, time_t now) "\x5\x5\x5\x5", DIGEST_LEN)) { /* This one showed up in 3 digests. Twice with ID 'M', once with 'Z'. */ - tt_mem_op(rs->identity_digest,==, + tt_mem_op(rs->identity_digest,OP_EQ, "\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5", DIGEST_LEN); - tt_str_op(rs->nickname,==, "router1"); - tt_mem_op(rs->descriptor_digest,==, "MMMMMMMMMMMMMMMMMMMM", DIGEST_LEN); - tt_int_op(rs->published_on,==, now-1000); - tt_int_op(rs->addr,==, 0x99009901); - tt_int_op(rs->or_port,==, 443); - tt_int_op(rs->dir_port,==, 0); + tt_str_op(rs->nickname,OP_EQ, "router1"); + tt_mem_op(rs->descriptor_digest,OP_EQ, "MMMMMMMMMMMMMMMMMMMM", DIGEST_LEN); + tt_int_op(rs->published_on,OP_EQ, now-1000); + tt_int_op(rs->addr,OP_EQ, 0x99009901); + tt_int_op(rs->or_port,OP_EQ, 443); + tt_int_op(rs->dir_port,OP_EQ, 0); tor_addr_parse(&addr_ipv6, "[1:2:3::4]"); tt_assert(tor_addr_eq(&rs->ipv6_addr, &addr_ipv6)); - tt_int_op(rs->ipv6_orport,==, 4711); + tt_int_op(rs->ipv6_orport,OP_EQ, 4711); tt_assert(!rs->is_authority); tt_assert(rs->is_exit); tt_assert(rs->is_fast); @@ -1809,29 +1857,29 @@ test_a_networkstatus( tt_assert(v1); /* Make sure the parsed thing was right. */ - tt_int_op(v1->type,==, NS_TYPE_VOTE); - tt_int_op(v1->published,==, vote->published); - tt_int_op(v1->valid_after,==, vote->valid_after); - tt_int_op(v1->fresh_until,==, vote->fresh_until); - tt_int_op(v1->valid_until,==, vote->valid_until); - tt_int_op(v1->vote_seconds,==, vote->vote_seconds); - tt_int_op(v1->dist_seconds,==, vote->dist_seconds); - tt_str_op(v1->client_versions,==, vote->client_versions); - tt_str_op(v1->server_versions,==, vote->server_versions); + tt_int_op(v1->type,OP_EQ, NS_TYPE_VOTE); + tt_int_op(v1->published,OP_EQ, vote->published); + tt_int_op(v1->valid_after,OP_EQ, vote->valid_after); + tt_int_op(v1->fresh_until,OP_EQ, vote->fresh_until); + tt_int_op(v1->valid_until,OP_EQ, vote->valid_until); + tt_int_op(v1->vote_seconds,OP_EQ, vote->vote_seconds); + tt_int_op(v1->dist_seconds,OP_EQ, vote->dist_seconds); + tt_str_op(v1->client_versions,OP_EQ, vote->client_versions); + tt_str_op(v1->server_versions,OP_EQ, vote->server_versions); tt_assert(v1->voters && smartlist_len(v1->voters)); voter = smartlist_get(v1->voters, 0); - tt_str_op(voter->nickname,==, "Voter1"); - tt_str_op(voter->address,==, "1.2.3.4"); - tt_int_op(voter->addr,==, 0x01020304); - tt_int_op(voter->dir_port,==, 80); - tt_int_op(voter->or_port,==, 9000); - tt_str_op(voter->contact,==, "voter@example.com"); + tt_str_op(voter->nickname,OP_EQ, "Voter1"); + tt_str_op(voter->address,OP_EQ, "1.2.3.4"); + tt_int_op(voter->addr,OP_EQ, 0x01020304); + tt_int_op(voter->dir_port,OP_EQ, 80); + tt_int_op(voter->or_port,OP_EQ, 9000); + tt_str_op(voter->contact,OP_EQ, "voter@example.com"); tt_assert(v1->cert); tt_assert(!crypto_pk_cmp_keys(sign_skey_1, v1->cert->signing_key)); cp = smartlist_join_strings(v1->known_flags, ":", 0, NULL); - tt_str_op(cp,==, "Authority:Exit:Fast:Guard:Running:Stable:V2Dir:Valid"); + tt_str_op(cp,OP_EQ, "Authority:Exit:Fast:Guard:Running:Stable:V2Dir:Valid"); tor_free(cp); - tt_int_op(smartlist_len(v1->routerstatus_list),==, n_vrs); + tt_int_op(smartlist_len(v1->routerstatus_list),OP_EQ, n_vrs); if (vote_tweaks) params_tweaked += vote_tweaks(v1, 1, now); @@ -1876,7 +1924,7 @@ test_a_networkstatus( /* Check that flags come out right.*/ cp = smartlist_join_strings(v2->known_flags, ":", 0, NULL); - tt_str_op(cp,==, "Authority:Exit:Fast:Guard:MadeOfCheese:MadeOfTin:" + tt_str_op(cp,OP_EQ, "Authority:Exit:Fast:Guard:MadeOfCheese:MadeOfTin:" "Running:Stable:V2Dir:Valid"); tor_free(cp); @@ -1945,30 +1993,30 @@ test_a_networkstatus( con_md = networkstatus_parse_vote_from_string(consensus_text_md, NULL, NS_TYPE_CONSENSUS); tt_assert(con_md); - tt_int_op(con_md->flavor,==, FLAV_MICRODESC); + tt_int_op(con_md->flavor,OP_EQ, FLAV_MICRODESC); /* Check consensus contents. */ tt_assert(con->type == NS_TYPE_CONSENSUS); - tt_int_op(con->published,==, 0); /* this field only appears in votes. */ - tt_int_op(con->valid_after,==, now+1000); - tt_int_op(con->fresh_until,==, now+2003); /* median */ - tt_int_op(con->valid_until,==, now+3000); - tt_int_op(con->vote_seconds,==, 100); - tt_int_op(con->dist_seconds,==, 250); /* median */ - tt_str_op(con->client_versions,==, "0.1.2.14"); - tt_str_op(con->server_versions,==, "0.1.2.15,0.1.2.16"); + tt_int_op(con->published,OP_EQ, 0); /* this field only appears in votes. */ + tt_int_op(con->valid_after,OP_EQ, now+1000); + tt_int_op(con->fresh_until,OP_EQ, now+2003); /* median */ + tt_int_op(con->valid_until,OP_EQ, now+3000); + tt_int_op(con->vote_seconds,OP_EQ, 100); + tt_int_op(con->dist_seconds,OP_EQ, 250); /* median */ + tt_str_op(con->client_versions,OP_EQ, "0.1.2.14"); + tt_str_op(con->server_versions,OP_EQ, "0.1.2.15,0.1.2.16"); cp = smartlist_join_strings(v2->known_flags, ":", 0, NULL); - tt_str_op(cp,==, "Authority:Exit:Fast:Guard:MadeOfCheese:MadeOfTin:" + tt_str_op(cp,OP_EQ, "Authority:Exit:Fast:Guard:MadeOfCheese:MadeOfTin:" "Running:Stable:V2Dir:Valid"); tor_free(cp); if (!params_tweaked) { /* Skip this one if vote_tweaks() messed with the param lists */ cp = smartlist_join_strings(con->net_params, ":", 0, NULL); - tt_str_op(cp,==, "circuitwindow=80:foo=660"); + tt_str_op(cp,OP_EQ, "circuitwindow=80:foo=660"); tor_free(cp); } - tt_int_op(4,==, smartlist_len(con->voters)); /*3 voters, 1 legacy key.*/ + tt_int_op(4,OP_EQ, smartlist_len(con->voters)); /*3 voters, 1 legacy key.*/ /* The voter id digests should be in this order. */ tt_assert(memcmp(cert2->cache_info.identity_digest, cert1->cache_info.identity_digest,DIGEST_LEN)<0); @@ -1994,10 +2042,10 @@ test_a_networkstatus( /* Check signatures. the first voter is a pseudo-entry with a legacy key. * The second one hasn't signed. The fourth one has signed: validate it. */ voter = smartlist_get(con->voters, 1); - tt_int_op(smartlist_len(voter->sigs),==, 0); + tt_int_op(smartlist_len(voter->sigs),OP_EQ, 0); voter = smartlist_get(con->voters, 3); - tt_int_op(smartlist_len(voter->sigs),==, 1); + tt_int_op(smartlist_len(voter->sigs),OP_EQ, 1); sig = smartlist_get(voter->sigs, 0); tt_assert(sig->signature); tt_assert(!sig->good_signature); @@ -2047,11 +2095,11 @@ test_a_networkstatus( tt_assert(con_md3); /* All three should have the same digest. */ - tt_mem_op(&con->digests,==, &con2->digests, sizeof(digests_t)); - tt_mem_op(&con->digests,==, &con3->digests, sizeof(digests_t)); + tt_mem_op(&con->digests,OP_EQ, &con2->digests, sizeof(digests_t)); + tt_mem_op(&con->digests,OP_EQ, &con3->digests, sizeof(digests_t)); - tt_mem_op(&con_md->digests,==, &con_md2->digests, sizeof(digests_t)); - tt_mem_op(&con_md->digests,==, &con_md3->digests, sizeof(digests_t)); + tt_mem_op(&con_md->digests,OP_EQ, &con_md2->digests, sizeof(digests_t)); + tt_mem_op(&con_md->digests,OP_EQ, &con_md3->digests, sizeof(digests_t)); /* Extract a detached signature from con3. */ detached_text1 = get_detached_sigs(con3, con_md3); @@ -2061,44 +2109,44 @@ test_a_networkstatus( tt_assert(dsig1); /* Are parsed values as expected? */ - tt_int_op(dsig1->valid_after,==, con3->valid_after); - tt_int_op(dsig1->fresh_until,==, con3->fresh_until); - tt_int_op(dsig1->valid_until,==, con3->valid_until); + tt_int_op(dsig1->valid_after,OP_EQ, con3->valid_after); + tt_int_op(dsig1->fresh_until,OP_EQ, con3->fresh_until); + tt_int_op(dsig1->valid_until,OP_EQ, con3->valid_until); { digests_t *dsig_digests = strmap_get(dsig1->digests, "ns"); tt_assert(dsig_digests); - tt_mem_op(dsig_digests->d[DIGEST_SHA1],==, con3->digests.d[DIGEST_SHA1], - DIGEST_LEN); + tt_mem_op(dsig_digests->d[DIGEST_SHA1], OP_EQ, + con3->digests.d[DIGEST_SHA1], DIGEST_LEN); dsig_digests = strmap_get(dsig1->digests, "microdesc"); tt_assert(dsig_digests); - tt_mem_op(dsig_digests->d[DIGEST_SHA256],==, + tt_mem_op(dsig_digests->d[DIGEST_SHA256],OP_EQ, con_md3->digests.d[DIGEST_SHA256], DIGEST256_LEN); } { smartlist_t *dsig_signatures = strmap_get(dsig1->signatures, "ns"); tt_assert(dsig_signatures); - tt_int_op(1,==, smartlist_len(dsig_signatures)); + tt_int_op(1,OP_EQ, smartlist_len(dsig_signatures)); sig = smartlist_get(dsig_signatures, 0); - tt_mem_op(sig->identity_digest,==, cert1->cache_info.identity_digest, + tt_mem_op(sig->identity_digest,OP_EQ, cert1->cache_info.identity_digest, DIGEST_LEN); - tt_int_op(sig->alg,==, DIGEST_SHA1); + tt_int_op(sig->alg,OP_EQ, DIGEST_SHA1); dsig_signatures = strmap_get(dsig1->signatures, "microdesc"); tt_assert(dsig_signatures); - tt_int_op(1,==, smartlist_len(dsig_signatures)); + tt_int_op(1,OP_EQ, smartlist_len(dsig_signatures)); sig = smartlist_get(dsig_signatures, 0); - tt_mem_op(sig->identity_digest,==, cert1->cache_info.identity_digest, + tt_mem_op(sig->identity_digest,OP_EQ, cert1->cache_info.identity_digest, DIGEST_LEN); - tt_int_op(sig->alg,==, DIGEST_SHA256); + tt_int_op(sig->alg,OP_EQ, DIGEST_SHA256); } /* Try adding it to con2. */ detached_text2 = get_detached_sigs(con2,con_md2); - tt_int_op(1,==, networkstatus_add_detached_signatures(con2, dsig1, "test", - LOG_INFO, &msg)); + tt_int_op(1,OP_EQ, networkstatus_add_detached_signatures(con2, dsig1, + "test", LOG_INFO, &msg)); tor_free(detached_text2); - tt_int_op(1,==, + tt_int_op(1,OP_EQ, networkstatus_add_detached_signatures(con_md2, dsig1, "test", LOG_INFO, &msg)); tor_free(detached_text2); @@ -2114,19 +2162,19 @@ test_a_networkstatus( printf("%s\n", hd); }); */ - tt_int_op(2,==, + tt_int_op(2,OP_EQ, smartlist_len((smartlist_t*)strmap_get(dsig2->signatures, "ns"))); - tt_int_op(2,==, + tt_int_op(2,OP_EQ, smartlist_len((smartlist_t*)strmap_get(dsig2->signatures, "microdesc"))); /* Try adding to con2 twice; verify that nothing changes. */ - tt_int_op(0,==, networkstatus_add_detached_signatures(con2, dsig1, "test", - LOG_INFO, &msg)); + tt_int_op(0,OP_EQ, networkstatus_add_detached_signatures(con2, dsig1, + "test", LOG_INFO, &msg)); /* Add to con. */ - tt_int_op(2,==, networkstatus_add_detached_signatures(con, dsig2, "test", - LOG_INFO, &msg)); + tt_int_op(2,OP_EQ, networkstatus_add_detached_signatures(con, dsig2, + "test", LOG_INFO, &msg)); /* Check signatures */ voter = smartlist_get(con->voters, 1); sig = smartlist_get(voter->sigs, 0); @@ -2229,7 +2277,7 @@ test_dir_scale_bw(void *testdata) scale_array_elements_to_u64(vals, 8, &total); - tt_int_op((int)total, ==, 48); + tt_int_op((int)total, OP_EQ, 48); total = 0; for (i=0; i<8; ++i) { total += vals[i].u64; @@ -2240,7 +2288,7 @@ test_dir_scale_bw(void *testdata) for (i=0; i<8; ++i) { /* vals[2].u64 is the scaled value of 1.0 */ double ratio = ((double)vals[i].u64) / vals[2].u64; - tt_double_op(fabs(ratio - v[i]), <, .00001); + tt_double_op(fabs(ratio - v[i]), OP_LT, .00001); } /* test handling of no entries */ @@ -2291,11 +2339,11 @@ test_dir_random_weighted(void *testdata) inp[i].u64 = vals[i]; total += vals[i]; } - tt_u64_op(total, ==, 45); + tt_u64_op(total, OP_EQ, 45); for (i=0; i<n; ++i) { choice = choose_array_element_by_weight(inp, 10); - tt_int_op(choice, >=, 0); - tt_int_op(choice, <, 10); + tt_int_op(choice, OP_GE, 0); + tt_int_op(choice, OP_LT, 10); histogram[choice]++; } @@ -2308,7 +2356,7 @@ test_dir_random_weighted(void *testdata) if (expected) frac_diff = (histogram[i] - expected) / ((double)expected); else - tt_int_op(histogram[i], ==, 0); + tt_int_op(histogram[i], OP_EQ, 0); sq = frac_diff * frac_diff; if (sq > max_sq_error) @@ -2316,12 +2364,12 @@ test_dir_random_weighted(void *testdata) } /* It should almost always be much much less than this. If you want to * figure out the odds, please feel free. */ - tt_double_op(max_sq_error, <, .05); + tt_double_op(max_sq_error, OP_LT, .05); /* Now try a singleton; do we choose it? */ for (i = 0; i < 100; ++i) { choice = choose_array_element_by_weight(inp, 1); - tt_int_op(choice, ==, 0); + tt_int_op(choice, OP_EQ, 0); } /* Now try an array of zeros. We should choose randomly. */ @@ -2330,8 +2378,8 @@ test_dir_random_weighted(void *testdata) inp[i].u64 = 0; for (i = 0; i < n; ++i) { choice = choose_array_element_by_weight(inp, 5); - tt_int_op(choice, >=, 0); - tt_int_op(choice, <, 5); + tt_int_op(choice, OP_GE, 0); + tt_int_op(choice, OP_LT, 5); histogram[choice]++; } /* Now see if we chose things about frequently enough. */ @@ -2347,7 +2395,7 @@ test_dir_random_weighted(void *testdata) } /* It should almost always be much much less than this. If you want to * figure out the odds, please feel free. */ - tt_double_op(max_sq_error, <, .05); + tt_double_op(max_sq_error, OP_LT, .05); done: ; } @@ -2546,21 +2594,21 @@ test_vrs_for_umbw(vote_routerstatus_t *vrs, int voter, time_t now) * Check the first routerstatus - measured bandwidth below the clip * cutoff. */ - tt_str_op(vrs->version,==, "0.1.2.14"); - tt_int_op(rs->published_on,==, now-1500); - tt_str_op(rs->nickname,==, "router2"); - tt_mem_op(rs->identity_digest,==, + tt_str_op(vrs->version,OP_EQ, "0.1.2.14"); + tt_int_op(rs->published_on,OP_EQ, now-1500); + tt_str_op(rs->nickname,OP_EQ, "router2"); + tt_mem_op(rs->identity_digest,OP_EQ, "\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3" "\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3", DIGEST_LEN); - tt_mem_op(rs->descriptor_digest,==, "NNNNNNNNNNNNNNNNNNNN", DIGEST_LEN); - tt_int_op(rs->addr,==, 0x99008801); - tt_int_op(rs->or_port,==, 443); - tt_int_op(rs->dir_port,==, 8000); + tt_mem_op(rs->descriptor_digest,OP_EQ, "NNNNNNNNNNNNNNNNNNNN", DIGEST_LEN); + tt_int_op(rs->addr,OP_EQ, 0x99008801); + tt_int_op(rs->or_port,OP_EQ, 443); + tt_int_op(rs->dir_port,OP_EQ, 8000); tt_assert(rs->has_bandwidth); tt_assert(vrs->has_measured_bw); - tt_int_op(rs->bandwidth_kb,==, max_unmeasured_bw_kb / 2); - tt_int_op(vrs->measured_bw_kb,==, max_unmeasured_bw_kb / 2); + tt_int_op(rs->bandwidth_kb,OP_EQ, max_unmeasured_bw_kb / 2); + tt_int_op(vrs->measured_bw_kb,OP_EQ, max_unmeasured_bw_kb / 2); } else if (tor_memeq(rs->identity_digest, "\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5" "\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5", @@ -2570,24 +2618,24 @@ test_vrs_for_umbw(vote_routerstatus_t *vrs, int voter, time_t now) * Check the second routerstatus - measured bandwidth above the clip * cutoff. */ - tt_str_op(vrs->version,==, "0.2.0.5"); - tt_int_op(rs->published_on,==, now-1000); - tt_str_op(rs->nickname,==, "router1"); - tt_mem_op(rs->identity_digest,==, + tt_str_op(vrs->version,OP_EQ, "0.2.0.5"); + tt_int_op(rs->published_on,OP_EQ, now-1000); + tt_str_op(rs->nickname,OP_EQ, "router1"); + tt_mem_op(rs->identity_digest,OP_EQ, "\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5" "\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5", DIGEST_LEN); - tt_mem_op(rs->descriptor_digest,==, "MMMMMMMMMMMMMMMMMMMM", DIGEST_LEN); - tt_int_op(rs->addr,==, 0x99009901); - tt_int_op(rs->or_port,==, 443); - tt_int_op(rs->dir_port,==, 0); + tt_mem_op(rs->descriptor_digest,OP_EQ, "MMMMMMMMMMMMMMMMMMMM", DIGEST_LEN); + tt_int_op(rs->addr,OP_EQ, 0x99009901); + tt_int_op(rs->or_port,OP_EQ, 443); + tt_int_op(rs->dir_port,OP_EQ, 0); tor_addr_parse(&addr_ipv6, "[1:2:3::4]"); tt_assert(tor_addr_eq(&rs->ipv6_addr, &addr_ipv6)); - tt_int_op(rs->ipv6_orport,==, 4711); + tt_int_op(rs->ipv6_orport,OP_EQ, 4711); tt_assert(rs->has_bandwidth); tt_assert(vrs->has_measured_bw); - tt_int_op(rs->bandwidth_kb,==, max_unmeasured_bw_kb * 2); - tt_int_op(vrs->measured_bw_kb,==, max_unmeasured_bw_kb * 2); + tt_int_op(rs->bandwidth_kb,OP_EQ, max_unmeasured_bw_kb * 2); + tt_int_op(vrs->measured_bw_kb,OP_EQ, max_unmeasured_bw_kb * 2); } else if (tor_memeq(rs->identity_digest, "\x33\x33\x33\x33\x33\x33\x33\x33\x33\x33" "\x33\x33\x33\x33\x33\x33\x33\x33\x33\x33", @@ -2599,8 +2647,8 @@ test_vrs_for_umbw(vote_routerstatus_t *vrs, int voter, time_t now) */ tt_assert(rs->has_bandwidth); tt_assert(!(vrs->has_measured_bw)); - tt_int_op(rs->bandwidth_kb,==, max_unmeasured_bw_kb * 2); - tt_int_op(vrs->measured_bw_kb,==, 0); + tt_int_op(rs->bandwidth_kb,OP_EQ, max_unmeasured_bw_kb * 2); + tt_int_op(vrs->measured_bw_kb,OP_EQ, 0); } else if (tor_memeq(rs->identity_digest, "\x34\x34\x34\x34\x34\x34\x34\x34\x34\x34" "\x34\x34\x34\x34\x34\x34\x34\x34\x34\x34", @@ -2611,8 +2659,8 @@ test_vrs_for_umbw(vote_routerstatus_t *vrs, int voter, time_t now) */ tt_assert(rs->has_bandwidth); tt_assert(!(vrs->has_measured_bw)); - tt_int_op(rs->bandwidth_kb,==, max_unmeasured_bw_kb / 2); - tt_int_op(vrs->measured_bw_kb,==, 0); + tt_int_op(rs->bandwidth_kb,OP_EQ, max_unmeasured_bw_kb / 2); + tt_int_op(vrs->measured_bw_kb,OP_EQ, 0); } else { tt_assert(0); } @@ -2633,7 +2681,7 @@ test_consensus_for_umbw(networkstatus_t *con, time_t now) tt_assert(!con->cert); // tt_assert(con->consensus_method >= MIN_METHOD_TO_CLIP_UNMEASURED_BW_KB); tt_assert(con->consensus_method >= 16); - tt_int_op(4,==, smartlist_len(con->routerstatus_list)); + tt_int_op(4,OP_EQ, smartlist_len(con->routerstatus_list)); /* There should be four listed routers; all voters saw the same in this */ done: @@ -2657,11 +2705,11 @@ test_routerstatus_for_umbw(routerstatus_t *rs, time_t now) "\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3" "\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3", DIGEST_LEN)) { - tt_mem_op(rs->identity_digest,==, + tt_mem_op(rs->identity_digest,OP_EQ, "\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3" "\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3", DIGEST_LEN); - tt_mem_op(rs->descriptor_digest,==, "NNNNNNNNNNNNNNNNNNNN", DIGEST_LEN); + tt_mem_op(rs->descriptor_digest,OP_EQ, "NNNNNNNNNNNNNNNNNNNN", DIGEST_LEN); tt_assert(!rs->is_authority); tt_assert(!rs->is_exit); tt_assert(!rs->is_fast); @@ -2673,26 +2721,26 @@ test_routerstatus_for_umbw(routerstatus_t *rs, time_t now) tt_assert(!rs->is_named); /* This one should have measured bandwidth below the clip cutoff */ tt_assert(rs->has_bandwidth); - tt_int_op(rs->bandwidth_kb,==, max_unmeasured_bw_kb / 2); + tt_int_op(rs->bandwidth_kb,OP_EQ, max_unmeasured_bw_kb / 2); tt_assert(!(rs->bw_is_unmeasured)); } else if (tor_memeq(rs->identity_digest, "\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5" "\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5", DIGEST_LEN)) { /* This one showed up in 3 digests. Twice with ID 'M', once with 'Z'. */ - tt_mem_op(rs->identity_digest,==, + tt_mem_op(rs->identity_digest,OP_EQ, "\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5" "\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5", DIGEST_LEN); - tt_str_op(rs->nickname,==, "router1"); - tt_mem_op(rs->descriptor_digest,==, "MMMMMMMMMMMMMMMMMMMM", DIGEST_LEN); - tt_int_op(rs->published_on,==, now-1000); - tt_int_op(rs->addr,==, 0x99009901); - tt_int_op(rs->or_port,==, 443); - tt_int_op(rs->dir_port,==, 0); + tt_str_op(rs->nickname,OP_EQ, "router1"); + tt_mem_op(rs->descriptor_digest,OP_EQ, "MMMMMMMMMMMMMMMMMMMM", DIGEST_LEN); + tt_int_op(rs->published_on,OP_EQ, now-1000); + tt_int_op(rs->addr,OP_EQ, 0x99009901); + tt_int_op(rs->or_port,OP_EQ, 443); + tt_int_op(rs->dir_port,OP_EQ, 0); tor_addr_parse(&addr_ipv6, "[1:2:3::4]"); tt_assert(tor_addr_eq(&rs->ipv6_addr, &addr_ipv6)); - tt_int_op(rs->ipv6_orport,==, 4711); + tt_int_op(rs->ipv6_orport,OP_EQ, 4711); tt_assert(!rs->is_authority); tt_assert(rs->is_exit); tt_assert(rs->is_fast); @@ -2703,7 +2751,7 @@ test_routerstatus_for_umbw(routerstatus_t *rs, time_t now) tt_assert(!rs->is_named); /* This one should have measured bandwidth above the clip cutoff */ tt_assert(rs->has_bandwidth); - tt_int_op(rs->bandwidth_kb,==, max_unmeasured_bw_kb * 2); + tt_int_op(rs->bandwidth_kb,OP_EQ, max_unmeasured_bw_kb * 2); tt_assert(!(rs->bw_is_unmeasured)); } else if (tor_memeq(rs->identity_digest, "\x33\x33\x33\x33\x33\x33\x33\x33\x33\x33" @@ -2714,7 +2762,7 @@ test_routerstatus_for_umbw(routerstatus_t *rs, time_t now) * and so should be clipped */ tt_assert(rs->has_bandwidth); - tt_int_op(rs->bandwidth_kb,==, max_unmeasured_bw_kb); + tt_int_op(rs->bandwidth_kb,OP_EQ, max_unmeasured_bw_kb); tt_assert(rs->bw_is_unmeasured); } else if (tor_memeq(rs->identity_digest, "\x34\x34\x34\x34\x34\x34\x34\x34\x34\x34" @@ -2725,7 +2773,7 @@ test_routerstatus_for_umbw(routerstatus_t *rs, time_t now) * and so should not be clipped */ tt_assert(rs->has_bandwidth); - tt_int_op(rs->bandwidth_kb,==, max_unmeasured_bw_kb / 2); + tt_int_op(rs->bandwidth_kb,OP_EQ, max_unmeasured_bw_kb / 2); tt_assert(rs->bw_is_unmeasured); } else { /* Weren't expecting this... */ @@ -2801,7 +2849,7 @@ test_dir_fmt_control_ns(void *arg) s = networkstatus_getinfo_helper_single(&rs); tt_assert(s); - tt_str_op(s, ==, + tt_str_op(s, OP_EQ, "r TetsuoMilk U3RhdGVseSwgcGx1bXAgQnVjayA " "TXVsbGlnYW4gY2FtZSB1cCBmcm8 2013-04-02 17:53:18 " "32.48.64.80 9001 9002\n" @@ -2824,16 +2872,17 @@ test_dir_http_handling(void *args) "Host: example.com\r\n" "User-Agent: Mozilla/5.0 (Windows;" " U; Windows NT 6.1; en-US; rv:1.9.1.5)\r\n", - &url),==, 0); - tt_str_op(url,==, "/tor/a/b/c.txt"); + &url),OP_EQ, 0); + tt_str_op(url,OP_EQ, "/tor/a/b/c.txt"); tor_free(url); - tt_int_op(parse_http_url("GET /tor/a/b/c.txt HTTP/1.0\r\n", &url),==, 0); - tt_str_op(url,==, "/tor/a/b/c.txt"); + tt_int_op(parse_http_url("GET /tor/a/b/c.txt HTTP/1.0\r\n", &url),OP_EQ, 0); + tt_str_op(url,OP_EQ, "/tor/a/b/c.txt"); tor_free(url); - tt_int_op(parse_http_url("GET /tor/a/b/c.txt HTTP/1.600\r\n", &url),==, 0); - tt_str_op(url,==, "/tor/a/b/c.txt"); + tt_int_op(parse_http_url("GET /tor/a/b/c.txt HTTP/1.600\r\n", &url), + OP_EQ, 0); + tt_str_op(url,OP_EQ, "/tor/a/b/c.txt"); tor_free(url); /* Should prepend '/tor/' to url if required */ @@ -2841,8 +2890,8 @@ test_dir_http_handling(void *args) "Host: example.com\r\n" "User-Agent: Mozilla/5.0 (Windows;" " U; Windows NT 6.1; en-US; rv:1.9.1.5)\r\n", - &url),==, 0); - tt_str_op(url,==, "/tor/a/b/c.txt"); + &url),OP_EQ, 0); + tt_str_op(url,OP_EQ, "/tor/a/b/c.txt"); tor_free(url); /* Bad headers -- no HTTP/1.x*/ @@ -2850,7 +2899,7 @@ test_dir_http_handling(void *args) "Host: example.com\r\n" "User-Agent: Mozilla/5.0 (Windows;" " U; Windows NT 6.1; en-US; rv:1.9.1.5)\r\n", - &url),==, -1); + &url),OP_EQ, -1); tt_assert(!url); /* Bad headers */ @@ -2858,28 +2907,53 @@ test_dir_http_handling(void *args) "Host: example.com\r\n" "User-Agent: Mozilla/5.0 (Windows;" " U; Windows NT 6.1; en-US; rv:1.9.1.5)\r\n", - &url),==, -1); + &url),OP_EQ, -1); tt_assert(!url); - tt_int_op(parse_http_url("GET /tor/a/b/c.txt", &url),==, -1); + tt_int_op(parse_http_url("GET /tor/a/b/c.txt", &url),OP_EQ, -1); tt_assert(!url); - tt_int_op(parse_http_url("GET /tor/a/b/c.txt HTTP/1.1", &url),==, -1); + tt_int_op(parse_http_url("GET /tor/a/b/c.txt HTTP/1.1", &url),OP_EQ, -1); tt_assert(!url); - tt_int_op(parse_http_url("GET /tor/a/b/c.txt HTTP/1.1x\r\n", &url),==, -1); + tt_int_op(parse_http_url("GET /tor/a/b/c.txt HTTP/1.1x\r\n", &url), + OP_EQ, -1); tt_assert(!url); - tt_int_op(parse_http_url("GET /tor/a/b/c.txt HTTP/1.", &url),==, -1); + tt_int_op(parse_http_url("GET /tor/a/b/c.txt HTTP/1.", &url),OP_EQ, -1); tt_assert(!url); - tt_int_op(parse_http_url("GET /tor/a/b/c.txt HTTP/1.\r", &url),==, -1); + tt_int_op(parse_http_url("GET /tor/a/b/c.txt HTTP/1.\r", &url),OP_EQ, -1); tt_assert(!url); done: tor_free(url); } +static void +test_dir_purpose_needs_anonymity(void *arg) +{ + (void)arg; + tt_int_op(1, ==, purpose_needs_anonymity(0, ROUTER_PURPOSE_BRIDGE)); + tt_int_op(1, ==, purpose_needs_anonymity(0, ROUTER_PURPOSE_GENERAL)); + tt_int_op(0, ==, purpose_needs_anonymity(DIR_PURPOSE_FETCH_MICRODESC, + ROUTER_PURPOSE_GENERAL)); + done: ; +} + +static void +test_dir_fetch_type(void *arg) +{ + (void)arg; + tt_assert(dir_fetch_type(DIR_PURPOSE_FETCH_MICRODESC, ROUTER_PURPOSE_GENERAL, + NULL) == MICRODESC_DIRINFO); + tt_assert(dir_fetch_type(DIR_PURPOSE_FETCH_SERVERDESC, ROUTER_PURPOSE_BRIDGE, + NULL) == BRIDGE_DIRINFO); + tt_assert(dir_fetch_type(DIR_PURPOSE_FETCH_CONSENSUS, ROUTER_PURPOSE_GENERAL, + "microdesc") == (V3_DIRINFO | MICRODESC_DIRINFO)); + done: ; +} + #define DIR_LEGACY(name) \ { #name, test_dir_ ## name , TT_FORK, NULL, NULL } @@ -2907,6 +2981,8 @@ struct testcase_t dir_tests[] = { DIR_LEGACY(clip_unmeasured_bw_kb_alt), DIR(fmt_control_ns, 0), DIR(http_handling, 0), + DIR(purpose_needs_anonymity, 0), + DIR(fetch_type, 0), END_OF_TESTCASES }; diff --git a/src/test/test_entryconn.c b/src/test/test_entryconn.c new file mode 100644 index 0000000000..6edc166743 --- /dev/null +++ b/src/test/test_entryconn.c @@ -0,0 +1,769 @@ +/* Copyright (c) 2014-2015, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "orconfig.h" + +#define CONNECTION_PRIVATE +#define CONNECTION_EDGE_PRIVATE + +#include "or.h" +#include "test.h" + +#include "addressmap.h" +#include "config.h" +#include "confparse.h" +#include "connection.h" +#include "connection_edge.h" + +static void * +entryconn_rewrite_setup(const struct testcase_t *tc) +{ + (void)tc; + entry_connection_t *ec = entry_connection_new(CONN_TYPE_AP, AF_INET); + addressmap_init(); + return ec; +} + +static int +entryconn_rewrite_teardown(const struct testcase_t *tc, void *arg) +{ + (void)tc; + entry_connection_t *ec = arg; + if (ec) + connection_free_(ENTRY_TO_CONN(ec)); + addressmap_free_all(); + return 1; +} + +static struct testcase_setup_t test_rewrite_setup = { + entryconn_rewrite_setup, entryconn_rewrite_teardown +}; + +/* Simple rewrite: no changes needed */ +static void +test_entryconn_rewrite_basic(void *arg) +{ + entry_connection_t *ec = arg; + rewrite_result_t rr; + + tt_assert(ec->socks_request); + strlcpy(ec->socks_request->address, "www.TORproject.org", + sizeof(ec->socks_request->address)); + ec->socks_request->command = SOCKS_COMMAND_CONNECT; + connection_ap_handshake_rewrite(ec, &rr); + + tt_int_op(rr.should_close, OP_EQ, 0); + tt_int_op(rr.end_reason, OP_EQ, 0); + tt_int_op(rr.automap, OP_EQ, 0); + tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX); + tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE); + tt_str_op(rr.orig_address, OP_EQ, "www.torproject.org"); + tt_str_op(ec->socks_request->address, OP_EQ, "www.torproject.org"); + tt_str_op(ec->original_dest_address, OP_EQ, "www.torproject.org"); + + done: + ; +} + +/* Rewrite but reject because of disallowed .exit */ +static void +test_entryconn_rewrite_bad_dotexit(void *arg) +{ + entry_connection_t *ec = arg; + rewrite_result_t rr; + + get_options_mutable()->AllowDotExit = 0; + tt_assert(ec->socks_request); + strlcpy(ec->socks_request->address, "www.TORproject.org.foo.exit", + sizeof(ec->socks_request->address)); + ec->socks_request->command = SOCKS_COMMAND_CONNECT; + connection_ap_handshake_rewrite(ec, &rr); + + tt_int_op(rr.should_close, OP_EQ, 1); + tt_int_op(rr.end_reason, OP_EQ, END_STREAM_REASON_TORPROTOCOL); + + done: + ; +} + +/* Automap on resolve, connect to automapped address, resolve again and get + * same answer. (IPv4) */ +static void +test_entryconn_rewrite_automap_ipv4(void *arg) +{ + entry_connection_t *ec = arg; + entry_connection_t *ec2=NULL, *ec3=NULL; + rewrite_result_t rr; + char *msg = NULL; + + ec2 = entry_connection_new(CONN_TYPE_AP, AF_INET); + ec3 = entry_connection_new(CONN_TYPE_AP, AF_INET); + + get_options_mutable()->AutomapHostsOnResolve = 1; + smartlist_add(get_options_mutable()->AutomapHostsSuffixes, tor_strdup(".")); + parse_virtual_addr_network("127.202.0.0/16", AF_INET, 0, &msg); + + /* Automap this on resolve. */ + strlcpy(ec->socks_request->address, "WWW.MIT.EDU", + sizeof(ec->socks_request->address)); + ec->socks_request->command = SOCKS_COMMAND_RESOLVE; + connection_ap_handshake_rewrite(ec, &rr); + + tt_int_op(rr.automap, OP_EQ, 1); + tt_int_op(rr.should_close, OP_EQ, 0); + tt_int_op(rr.end_reason, OP_EQ, 0); + tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX); + tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE); + tt_str_op(rr.orig_address, OP_EQ, "www.mit.edu"); + tt_str_op(ec->original_dest_address, OP_EQ, "www.mit.edu"); + + tt_assert(!strcmpstart(ec->socks_request->address,"127.202.")); + + /* Connect to it and make sure we get the original address back. */ + strlcpy(ec2->socks_request->address, ec->socks_request->address, + sizeof(ec2->socks_request->address)); + + ec2->socks_request->command = SOCKS_COMMAND_CONNECT; + connection_ap_handshake_rewrite(ec2, &rr); + + tt_int_op(rr.automap, OP_EQ, 0); + tt_int_op(rr.should_close, OP_EQ, 0); + tt_int_op(rr.end_reason, OP_EQ, 0); + tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX); + tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE); + tt_str_op(rr.orig_address, OP_EQ, ec->socks_request->address); + tt_str_op(ec2->original_dest_address, OP_EQ, ec->socks_request->address); + tt_str_op(ec2->socks_request->address, OP_EQ, "www.mit.edu"); + + /* Resolve it again, make sure the answer is the same. */ + strlcpy(ec3->socks_request->address, "www.MIT.EDU", + sizeof(ec3->socks_request->address)); + ec3->socks_request->command = SOCKS_COMMAND_RESOLVE; + connection_ap_handshake_rewrite(ec3, &rr); + + tt_int_op(rr.automap, OP_EQ, 1); + tt_int_op(rr.should_close, OP_EQ, 0); + tt_int_op(rr.end_reason, OP_EQ, 0); + tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX); + tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE); + tt_str_op(rr.orig_address, OP_EQ, "www.mit.edu"); + tt_str_op(ec3->original_dest_address, OP_EQ, "www.mit.edu"); + + tt_str_op(ec3->socks_request->address, OP_EQ, + ec->socks_request->address); + + done: + connection_free_(ENTRY_TO_CONN(ec2)); + connection_free_(ENTRY_TO_CONN(ec3)); +} + +/* Automap on resolve, connect to automapped address, resolve again and get + * same answer. (IPv6) */ +static void +test_entryconn_rewrite_automap_ipv6(void *arg) +{ + (void)arg; + entry_connection_t *ec =NULL; + entry_connection_t *ec2=NULL, *ec3=NULL; + rewrite_result_t rr; + char *msg = NULL; + + ec = entry_connection_new(CONN_TYPE_AP, AF_INET6); + ec2 = entry_connection_new(CONN_TYPE_AP, AF_INET6); + ec3 = entry_connection_new(CONN_TYPE_AP, AF_INET6); + + get_options_mutable()->AutomapHostsOnResolve = 1; + smartlist_add(get_options_mutable()->AutomapHostsSuffixes, tor_strdup(".")); + parse_virtual_addr_network("FE80::/32", AF_INET6, 0, &msg); + + /* Automap this on resolve. */ + strlcpy(ec->socks_request->address, "WWW.MIT.EDU", + sizeof(ec->socks_request->address)); + ec->socks_request->command = SOCKS_COMMAND_RESOLVE; + connection_ap_handshake_rewrite(ec, &rr); + + tt_int_op(rr.automap, OP_EQ, 1); + tt_int_op(rr.should_close, OP_EQ, 0); + tt_int_op(rr.end_reason, OP_EQ, 0); + tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX); + tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE); + tt_str_op(rr.orig_address, OP_EQ, "www.mit.edu"); + tt_str_op(ec->original_dest_address, OP_EQ, "www.mit.edu"); + + /* Yes, this [ should be here. */ + tt_assert(!strcmpstart(ec->socks_request->address,"[fe80:")); + + /* Connect to it and make sure we get the original address back. */ + strlcpy(ec2->socks_request->address, ec->socks_request->address, + sizeof(ec2->socks_request->address)); + + ec2->socks_request->command = SOCKS_COMMAND_CONNECT; + connection_ap_handshake_rewrite(ec2, &rr); + + tt_int_op(rr.automap, OP_EQ, 0); + tt_int_op(rr.should_close, OP_EQ, 0); + tt_int_op(rr.end_reason, OP_EQ, 0); + tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX); + tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE); + tt_str_op(rr.orig_address, OP_EQ, ec->socks_request->address); + tt_str_op(ec2->original_dest_address, OP_EQ, ec->socks_request->address); + tt_str_op(ec2->socks_request->address, OP_EQ, "www.mit.edu"); + + /* Resolve it again, make sure the answer is the same. */ + strlcpy(ec3->socks_request->address, "www.MIT.EDU", + sizeof(ec3->socks_request->address)); + ec3->socks_request->command = SOCKS_COMMAND_RESOLVE; + connection_ap_handshake_rewrite(ec3, &rr); + + tt_int_op(rr.automap, OP_EQ, 1); + tt_int_op(rr.should_close, OP_EQ, 0); + tt_int_op(rr.end_reason, OP_EQ, 0); + tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX); + tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE); + tt_str_op(rr.orig_address, OP_EQ, "www.mit.edu"); + tt_str_op(ec3->original_dest_address, OP_EQ, "www.mit.edu"); + + tt_str_op(ec3->socks_request->address, OP_EQ, + ec->socks_request->address); + + done: + connection_free_(ENTRY_TO_CONN(ec)); + connection_free_(ENTRY_TO_CONN(ec2)); + connection_free_(ENTRY_TO_CONN(ec3)); +} + +#if 0 +/* FFFF not actually supported. */ +/* automap on resolve, reverse lookup. */ +static void +test_entryconn_rewrite_automap_reverse(void *arg) +{ + entry_connection_t *ec = arg; + entry_connection_t *ec2=NULL; + rewrite_result_t rr; + char *msg = NULL; + + ec2 = entry_connection_new(CONN_TYPE_AP, AF_INET); + + get_options_mutable()->AutomapHostsOnResolve = 1; + get_options_mutable()->SafeLogging_ = SAFELOG_SCRUB_NONE; + smartlist_add(get_options_mutable()->AutomapHostsSuffixes, + tor_strdup(".bloom")); + parse_virtual_addr_network("127.80.0.0/16", AF_INET, 0, &msg); + + /* Automap this on resolve. */ + strlcpy(ec->socks_request->address, "www.poldy.BLOOM", + sizeof(ec->socks_request->address)); + ec->socks_request->command = SOCKS_COMMAND_RESOLVE; + connection_ap_handshake_rewrite(ec, &rr); + + tt_int_op(rr.automap, OP_EQ, 1); + tt_int_op(rr.should_close, OP_EQ, 0); + tt_int_op(rr.end_reason, OP_EQ, 0); + tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX); + tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE); + tt_str_op(rr.orig_address, OP_EQ, "www.poldy.bloom"); + tt_str_op(ec->original_dest_address, OP_EQ, "www.poldy.bloom"); + + tt_assert(!strcmpstart(ec->socks_request->address,"127.80.")); + + strlcpy(ec2->socks_request->address, ec->socks_request->address, + sizeof(ec2->socks_request->address)); + ec2->socks_request->command = SOCKS_COMMAND_RESOLVE_PTR; + connection_ap_handshake_rewrite(ec2, &rr); + + tt_int_op(rr.automap, OP_EQ, 0); + tt_int_op(rr.should_close, OP_EQ, 1); + tt_int_op(rr.end_reason, OP_EQ, + END_STREAM_REASON_DONE|END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED); + tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX); + tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE); + + done: + connection_free_(ENTRY_TO_CONN(ec2)); +} +#endif + +/* Rewrite because of cached DNS entry. */ +static void +test_entryconn_rewrite_cached_dns_ipv4(void *arg) +{ + entry_connection_t *ec = arg; + rewrite_result_t rr; + time_t expires = time(NULL) + 3600; + entry_connection_t *ec2=NULL; + + ec2 = entry_connection_new(CONN_TYPE_AP, AF_INET); + + addressmap_register("www.friendly.example.com", + tor_strdup("240.240.241.241"), + expires, + ADDRMAPSRC_DNS, + 0, 0); + + strlcpy(ec->socks_request->address, "www.friendly.example.com", + sizeof(ec->socks_request->address)); + strlcpy(ec2->socks_request->address, "www.friendly.example.com", + sizeof(ec2->socks_request->address)); + + ec->socks_request->command = SOCKS_COMMAND_CONNECT; + ec2->socks_request->command = SOCKS_COMMAND_CONNECT; + + ec2->entry_cfg.use_cached_ipv4_answers = 1; /* only ec2 gets this flag */ + connection_ap_handshake_rewrite(ec, &rr); + + tt_int_op(rr.automap, OP_EQ, 0); + tt_int_op(rr.should_close, OP_EQ, 0); + tt_int_op(rr.end_reason, OP_EQ, 0); + tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX); + tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE); + tt_str_op(rr.orig_address, OP_EQ, "www.friendly.example.com"); + tt_str_op(ec->socks_request->address, OP_EQ, "www.friendly.example.com"); + + connection_ap_handshake_rewrite(ec2, &rr); + tt_int_op(rr.automap, OP_EQ, 0); + tt_int_op(rr.should_close, OP_EQ, 0); + tt_int_op(rr.end_reason, OP_EQ, 0); + tt_i64_op(rr.map_expires, OP_EQ, expires); + tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE); + tt_str_op(rr.orig_address, OP_EQ, "www.friendly.example.com"); + tt_str_op(ec2->socks_request->address, OP_EQ, "240.240.241.241"); + + done: + connection_free_(ENTRY_TO_CONN(ec2)); +} + +/* Rewrite because of cached DNS entry. */ +static void +test_entryconn_rewrite_cached_dns_ipv6(void *arg) +{ + entry_connection_t *ec = NULL; + rewrite_result_t rr; + time_t expires = time(NULL) + 3600; + entry_connection_t *ec2=NULL; + + (void)arg; + + ec = entry_connection_new(CONN_TYPE_AP, AF_INET6); + ec2 = entry_connection_new(CONN_TYPE_AP, AF_INET6); + + addressmap_register("www.friendly.example.com", + tor_strdup("[::f00f]"), + expires, + ADDRMAPSRC_DNS, + 0, 0); + + strlcpy(ec->socks_request->address, "www.friendly.example.com", + sizeof(ec->socks_request->address)); + strlcpy(ec2->socks_request->address, "www.friendly.example.com", + sizeof(ec2->socks_request->address)); + + ec->socks_request->command = SOCKS_COMMAND_CONNECT; + ec2->socks_request->command = SOCKS_COMMAND_CONNECT; + + ec2->entry_cfg.use_cached_ipv6_answers = 1; /* only ec2 gets this flag */ + connection_ap_handshake_rewrite(ec, &rr); + + tt_int_op(rr.automap, OP_EQ, 0); + tt_int_op(rr.should_close, OP_EQ, 0); + tt_int_op(rr.end_reason, OP_EQ, 0); + tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX); + tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE); + tt_str_op(rr.orig_address, OP_EQ, "www.friendly.example.com"); + tt_str_op(ec->socks_request->address, OP_EQ, "www.friendly.example.com"); + + connection_ap_handshake_rewrite(ec2, &rr); + tt_int_op(rr.automap, OP_EQ, 0); + tt_int_op(rr.should_close, OP_EQ, 0); + tt_int_op(rr.end_reason, OP_EQ, 0); + tt_i64_op(rr.map_expires, OP_EQ, expires); + tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE); + tt_str_op(rr.orig_address, OP_EQ, "www.friendly.example.com"); + tt_str_op(ec2->socks_request->address, OP_EQ, "[::f00f]"); + + done: + connection_free_(ENTRY_TO_CONN(ec)); + connection_free_(ENTRY_TO_CONN(ec2)); +} + +/* Fail to connect to unmapped address in virtual range. */ +static void +test_entryconn_rewrite_unmapped_virtual(void *arg) +{ + entry_connection_t *ec = arg; + rewrite_result_t rr; + entry_connection_t *ec2 = NULL; + char *msg = NULL; + + ec2 = entry_connection_new(CONN_TYPE_AP, AF_INET6); + + parse_virtual_addr_network("18.202.0.0/16", AF_INET, 0, &msg); + parse_virtual_addr_network("[ABCD::]/16", AF_INET6, 0, &msg); + + strlcpy(ec->socks_request->address, "18.202.5.5", + sizeof(ec->socks_request->address)); + ec->socks_request->command = SOCKS_COMMAND_CONNECT; + connection_ap_handshake_rewrite(ec, &rr); + + tt_int_op(rr.should_close, OP_EQ, 1); + tt_int_op(rr.end_reason, OP_EQ, END_STREAM_REASON_INTERNAL); + tt_int_op(rr.automap, OP_EQ, 0); + tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX); + tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE); + + strlcpy(ec2->socks_request->address, "[ABCD:9::5314:9543]", + sizeof(ec2->socks_request->address)); + ec2->socks_request->command = SOCKS_COMMAND_CONNECT; + connection_ap_handshake_rewrite(ec2, &rr); + + tt_int_op(rr.should_close, OP_EQ, 1); + tt_int_op(rr.end_reason, OP_EQ, END_STREAM_REASON_INTERNAL); + tt_int_op(rr.automap, OP_EQ, 0); + tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX); + tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE); + + done: + connection_free_(ENTRY_TO_CONN(ec2)); +} + +/* Rewrite because of mapaddress option */ +static void +test_entryconn_rewrite_mapaddress(void *arg) +{ + entry_connection_t *ec = arg; + rewrite_result_t rr; + + config_line_append(&get_options_mutable()->AddressMap, + "MapAddress", "meta metaobjects.example"); + config_register_addressmaps(get_options()); + + strlcpy(ec->socks_request->address, "meta", + sizeof(ec->socks_request->address)); + ec->socks_request->command = SOCKS_COMMAND_CONNECT; + connection_ap_handshake_rewrite(ec, &rr); + + tt_int_op(rr.should_close, OP_EQ, 0); + tt_int_op(rr.end_reason, OP_EQ, 0); + tt_int_op(rr.automap, OP_EQ, 0); + tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX); + tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE); + tt_str_op(ec->socks_request->address, OP_EQ, "metaobjects.example"); + + done: + ; +} + +/* Reject reverse lookups of internal address. */ +static void +test_entryconn_rewrite_reject_internal_reverse(void *arg) +{ + entry_connection_t *ec = arg; + rewrite_result_t rr; + + strlcpy(ec->socks_request->address, "10.0.0.1", + sizeof(ec->socks_request->address)); + ec->socks_request->command = SOCKS_COMMAND_RESOLVE_PTR; + connection_ap_handshake_rewrite(ec, &rr); + + tt_int_op(rr.should_close, OP_EQ, 1); + tt_int_op(rr.end_reason, OP_EQ, END_STREAM_REASON_SOCKSPROTOCOL | + END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED); + tt_int_op(rr.automap, OP_EQ, 0); + tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX); + tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE); + + done: + ; +} + +/* Rewrite into .exit because of virtual address mapping */ +static void +test_entryconn_rewrite_automap_exit(void *arg) +{ + entry_connection_t *ec = arg; + entry_connection_t *ec2=NULL; + rewrite_result_t rr; + char *msg = NULL; + + ec2 = entry_connection_new(CONN_TYPE_AP, AF_INET); + + get_options_mutable()->AutomapHostsOnResolve = 1; + get_options_mutable()->AllowDotExit = 1; + smartlist_add(get_options_mutable()->AutomapHostsSuffixes, + tor_strdup(".EXIT")); + parse_virtual_addr_network("127.1.0.0/16", AF_INET, 0, &msg); + + /* Automap this on resolve. */ + strlcpy(ec->socks_request->address, "website.example.exit", + sizeof(ec->socks_request->address)); + ec->socks_request->command = SOCKS_COMMAND_RESOLVE; + connection_ap_handshake_rewrite(ec, &rr); + + tt_int_op(rr.automap, OP_EQ, 1); + tt_int_op(rr.should_close, OP_EQ, 0); + tt_int_op(rr.end_reason, OP_EQ, 0); + tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX); + tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE); + tt_str_op(rr.orig_address, OP_EQ, "website.example.exit"); + tt_str_op(ec->original_dest_address, OP_EQ, "website.example.exit"); + + tt_assert(!strcmpstart(ec->socks_request->address,"127.1.")); + + /* Connect to it and make sure we get the original address back. */ + strlcpy(ec2->socks_request->address, ec->socks_request->address, + sizeof(ec2->socks_request->address)); + + ec2->socks_request->command = SOCKS_COMMAND_CONNECT; + connection_ap_handshake_rewrite(ec2, &rr); + + tt_int_op(rr.automap, OP_EQ, 0); + tt_int_op(rr.should_close, OP_EQ, 0); + tt_int_op(rr.end_reason, OP_EQ, 0); + tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX); + tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_AUTOMAP); + tt_str_op(rr.orig_address, OP_EQ, ec->socks_request->address); + tt_str_op(ec2->original_dest_address, OP_EQ, ec->socks_request->address); + tt_str_op(ec2->socks_request->address, OP_EQ, "website.example.exit"); + + done: + connection_free_(ENTRY_TO_CONN(ec2)); +} + +/* Rewrite into .exit because of mapaddress */ +static void +test_entryconn_rewrite_mapaddress_exit(void *arg) +{ + entry_connection_t *ec = arg; + rewrite_result_t rr; + + config_line_append(&get_options_mutable()->AddressMap, + "MapAddress", "*.example.com *.example.com.abc.exit"); + config_register_addressmaps(get_options()); + + /* Automap this on resolve. */ + strlcpy(ec->socks_request->address, "abc.example.com", + sizeof(ec->socks_request->address)); + ec->socks_request->command = SOCKS_COMMAND_CONNECT; + connection_ap_handshake_rewrite(ec, &rr); + + tt_int_op(rr.automap, OP_EQ, 0); + tt_int_op(rr.should_close, OP_EQ, 0); + tt_int_op(rr.end_reason, OP_EQ, 0); + tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX); + tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_TORRC); + tt_str_op(rr.orig_address, OP_EQ, "abc.example.com"); + tt_str_op(ec->socks_request->address, OP_EQ, "abc.example.com.abc.exit"); + done: + ; +} + +/* Map foo.onion to longthing.onion, and also automap. */ +static void +test_entryconn_rewrite_mapaddress_automap_onion(void *arg) +{ + entry_connection_t *ec = arg; + entry_connection_t *ec2 = NULL; + entry_connection_t *ec3 = NULL; + entry_connection_t *ec4 = NULL; + rewrite_result_t rr; + char *msg = NULL; + + ec2 = entry_connection_new(CONN_TYPE_AP, AF_INET); + ec3 = entry_connection_new(CONN_TYPE_AP, AF_INET); + ec4 = entry_connection_new(CONN_TYPE_AP, AF_INET); + + get_options_mutable()->AutomapHostsOnResolve = 1; + get_options_mutable()->AllowDotExit = 1; + smartlist_add(get_options_mutable()->AutomapHostsSuffixes, + tor_strdup(".onion")); + parse_virtual_addr_network("192.168.0.0/16", AF_INET, 0, &msg); + config_line_append(&get_options_mutable()->AddressMap, + "MapAddress", "foo.onion abcdefghijklmnop.onion"); + config_register_addressmaps(get_options()); + + /* Connect to foo.onion. */ + strlcpy(ec->socks_request->address, "foo.onion", + sizeof(ec->socks_request->address)); + ec->socks_request->command = SOCKS_COMMAND_CONNECT; + connection_ap_handshake_rewrite(ec, &rr); + + tt_int_op(rr.automap, OP_EQ, 0); + tt_int_op(rr.should_close, OP_EQ, 0); + tt_int_op(rr.end_reason, OP_EQ, 0); + tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX); + tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE); + tt_str_op(rr.orig_address, OP_EQ, "foo.onion"); + tt_str_op(ec->socks_request->address, OP_EQ, "abcdefghijklmnop.onion"); + + /* Okay, resolve foo.onion */ + strlcpy(ec2->socks_request->address, "foo.onion", + sizeof(ec2->socks_request->address)); + ec2->socks_request->command = SOCKS_COMMAND_RESOLVE; + connection_ap_handshake_rewrite(ec2, &rr); + + tt_int_op(rr.automap, OP_EQ, 1); + tt_int_op(rr.should_close, OP_EQ, 0); + tt_int_op(rr.end_reason, OP_EQ, 0); + tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX); + tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE); + tt_str_op(rr.orig_address, OP_EQ, "foo.onion"); + tt_assert(!strcmpstart(ec2->socks_request->address, "192.168.")); + + /* Now connect */ + strlcpy(ec3->socks_request->address, ec2->socks_request->address, + sizeof(ec3->socks_request->address)); + ec3->socks_request->command = SOCKS_COMMAND_CONNECT; + connection_ap_handshake_rewrite(ec3, &rr); + tt_int_op(rr.automap, OP_EQ, 0); + tt_int_op(rr.should_close, OP_EQ, 0); + tt_int_op(rr.end_reason, OP_EQ, 0); + tt_assert(!strcmpstart(ec3->socks_request->address, + "abcdefghijklmnop.onion")); + + /* Now resolve abcefghijklmnop.onion. */ + strlcpy(ec4->socks_request->address, "abcdefghijklmnop.onion", + sizeof(ec4->socks_request->address)); + ec4->socks_request->command = SOCKS_COMMAND_RESOLVE; + connection_ap_handshake_rewrite(ec4, &rr); + + tt_int_op(rr.automap, OP_EQ, 1); + tt_int_op(rr.should_close, OP_EQ, 0); + tt_int_op(rr.end_reason, OP_EQ, 0); + tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX); + tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE); + tt_str_op(rr.orig_address, OP_EQ, "abcdefghijklmnop.onion"); + tt_assert(!strcmpstart(ec4->socks_request->address, "192.168.")); + /* XXXX doesn't work + tt_str_op(ec4->socks_request->address, OP_EQ, ec2->socks_request->address); + */ + + done: + connection_free_(ENTRY_TO_CONN(ec2)); + connection_free_(ENTRY_TO_CONN(ec3)); + connection_free_(ENTRY_TO_CONN(ec4)); +} + +static void +test_entryconn_rewrite_mapaddress_automap_onion_common(entry_connection_t *ec, + int map_to_onion, + int map_to_address) +{ + entry_connection_t *ec2 = NULL; + entry_connection_t *ec3 = NULL; + rewrite_result_t rr; + + ec2 = entry_connection_new(CONN_TYPE_AP, AF_INET); + ec3 = entry_connection_new(CONN_TYPE_AP, AF_INET); + + /* Connect to irc.example.com */ + strlcpy(ec->socks_request->address, "irc.example.com", + sizeof(ec->socks_request->address)); + ec->socks_request->command = SOCKS_COMMAND_CONNECT; + connection_ap_handshake_rewrite(ec, &rr); + + tt_int_op(rr.automap, OP_EQ, 0); + tt_int_op(rr.should_close, OP_EQ, 0); + tt_int_op(rr.end_reason, OP_EQ, 0); + tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX); + tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE); + tt_str_op(rr.orig_address, OP_EQ, "irc.example.com"); + tt_str_op(ec->socks_request->address, OP_EQ, + map_to_onion ? "abcdefghijklmnop.onion" : "irc.example.com"); + + /* Okay, resolve irc.example.com */ + strlcpy(ec2->socks_request->address, "irc.example.com", + sizeof(ec2->socks_request->address)); + ec2->socks_request->command = SOCKS_COMMAND_RESOLVE; + connection_ap_handshake_rewrite(ec2, &rr); + + tt_int_op(rr.automap, OP_EQ, map_to_onion && map_to_address); + tt_int_op(rr.should_close, OP_EQ, 0); + tt_int_op(rr.end_reason, OP_EQ, 0); + tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX); + tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE); + tt_str_op(rr.orig_address, OP_EQ, "irc.example.com"); + if (map_to_onion && map_to_address) + tt_assert(!strcmpstart(ec2->socks_request->address, "192.168.")); + + /* Now connect */ + strlcpy(ec3->socks_request->address, ec2->socks_request->address, + sizeof(ec3->socks_request->address)); + ec3->socks_request->command = SOCKS_COMMAND_CONNECT; + connection_ap_handshake_rewrite(ec3, &rr); + tt_int_op(rr.automap, OP_EQ, 0); + tt_int_op(rr.should_close, OP_EQ, 0); + tt_int_op(rr.end_reason, OP_EQ, 0); + if (map_to_onion) + tt_assert(!strcmpstart(ec3->socks_request->address, + "abcdefghijklmnop.onion")); + + done: + connection_free_(ENTRY_TO_CONN(ec2)); + connection_free_(ENTRY_TO_CONN(ec3)); +} + +/* This time is the same, but we start with a mapping from a non-onion + * address. */ +static void +test_entryconn_rewrite_mapaddress_automap_onion2(void *arg) +{ + char *msg = NULL; + get_options_mutable()->AutomapHostsOnResolve = 1; + smartlist_add(get_options_mutable()->AutomapHostsSuffixes, + tor_strdup(".onion")); + parse_virtual_addr_network("192.168.0.0/16", AF_INET, 0, &msg); + config_line_append(&get_options_mutable()->AddressMap, + "MapAddress", "irc.example.com abcdefghijklmnop.onion"); + config_register_addressmaps(get_options()); + + test_entryconn_rewrite_mapaddress_automap_onion_common(arg, 1, 1); +} + +/* Same as above, with automapped turned off */ +static void +test_entryconn_rewrite_mapaddress_automap_onion3(void *arg) +{ + config_line_append(&get_options_mutable()->AddressMap, + "MapAddress", "irc.example.com abcdefghijklmnop.onion"); + config_register_addressmaps(get_options()); + + test_entryconn_rewrite_mapaddress_automap_onion_common(arg, 1, 0); +} + +/* As above, with no mapping. */ +static void +test_entryconn_rewrite_mapaddress_automap_onion4(void *arg) +{ + char *msg = NULL; + get_options_mutable()->AutomapHostsOnResolve = 1; + smartlist_add(get_options_mutable()->AutomapHostsSuffixes, + tor_strdup(".onion")); + parse_virtual_addr_network("192.168.0.0/16", AF_INET, 0, &msg); + + test_entryconn_rewrite_mapaddress_automap_onion_common(arg, 0, 1); +} + +#define REWRITE(name) \ + { #name, test_entryconn_##name, TT_FORK, &test_rewrite_setup, NULL } + +struct testcase_t entryconn_tests[] = { + REWRITE(rewrite_basic), + REWRITE(rewrite_bad_dotexit), + REWRITE(rewrite_automap_ipv4), + REWRITE(rewrite_automap_ipv6), + // REWRITE(rewrite_automap_reverse), + REWRITE(rewrite_cached_dns_ipv4), + REWRITE(rewrite_cached_dns_ipv6), + REWRITE(rewrite_unmapped_virtual), + REWRITE(rewrite_mapaddress), + REWRITE(rewrite_reject_internal_reverse), + REWRITE(rewrite_automap_exit), + REWRITE(rewrite_mapaddress_exit), + REWRITE(rewrite_mapaddress_automap_onion), + REWRITE(rewrite_mapaddress_automap_onion2), + REWRITE(rewrite_mapaddress_automap_onion3), + REWRITE(rewrite_mapaddress_automap_onion4), + + END_OF_TESTCASES +}; + diff --git a/src/test/test_entrynodes.c b/src/test/test_entrynodes.c index bddc0f11e0..19071a1550 100644 --- a/src/test/test_entrynodes.c +++ b/src/test/test_entrynodes.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014, The Tor Project, Inc. */ +/* Copyright (c) 2014-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" @@ -71,15 +71,16 @@ setup_fake_routerlist(void) retval = router_load_routers_from_string(TEST_DESCRIPTORS, NULL, SAVED_IN_JOURNAL, NULL, 0, NULL); - tt_int_op(retval, ==, NUMBER_OF_DESCRIPTORS); + tt_int_op(retval, OP_EQ, NUMBER_OF_DESCRIPTORS); /* Sanity checking of routerlist and nodelist. */ our_routerlist = router_get_routerlist(); - tt_int_op(smartlist_len(our_routerlist->routers), ==, NUMBER_OF_DESCRIPTORS); + tt_int_op(smartlist_len(our_routerlist->routers), OP_EQ, + NUMBER_OF_DESCRIPTORS); routerlist_assert_ok(our_routerlist); our_nodelist = nodelist_get_list(); - tt_int_op(smartlist_len(our_nodelist), ==, NUMBER_OF_DESCRIPTORS); + tt_int_op(smartlist_len(our_nodelist), OP_EQ, NUMBER_OF_DESCRIPTORS); /* Mark all routers as non-guards but up and running! */ SMARTLIST_FOREACH_BEGIN(our_nodelist, node_t *, node) { @@ -163,7 +164,7 @@ test_choose_random_entry_one_possible_guard(void *arg) /* Pick an entry. Make sure we pick the node we marked as guard. */ chosen_entry = choose_random_entry(NULL); - tt_ptr_op(chosen_entry, ==, the_guard); + tt_ptr_op(chosen_entry, OP_EQ, the_guard); done: ; @@ -189,14 +190,14 @@ populate_live_entry_guards_test_helper(int num_needed) /* Set NumEntryGuards to the provided number. */ options->NumEntryGuards = num_needed; - tt_int_op(num_needed, ==, decide_num_guards(options, 0)); + tt_int_op(num_needed, OP_EQ, decide_num_guards(options, 0)); /* The global entry guards smartlist should be empty now. */ - tt_int_op(smartlist_len(all_entry_guards), ==, 0); + tt_int_op(smartlist_len(all_entry_guards), OP_EQ, 0); /* Walk the nodelist and add all nodes as entry guards. */ our_nodelist = nodelist_get_list(); - tt_int_op(smartlist_len(our_nodelist), ==, NUMBER_OF_DESCRIPTORS); + tt_int_op(smartlist_len(our_nodelist), OP_EQ, NUMBER_OF_DESCRIPTORS); SMARTLIST_FOREACH_BEGIN(our_nodelist, const node_t *, node) { const node_t *node_tmp; @@ -205,20 +206,20 @@ populate_live_entry_guards_test_helper(int num_needed) } SMARTLIST_FOREACH_END(node); /* Make sure the nodes were added as entry guards. */ - tt_int_op(smartlist_len(all_entry_guards), ==, NUMBER_OF_DESCRIPTORS); + tt_int_op(smartlist_len(all_entry_guards), OP_EQ, NUMBER_OF_DESCRIPTORS); /* Ensure that all the possible entry guards are enough to satisfy us. */ - tt_int_op(smartlist_len(all_entry_guards), >=, num_needed); + tt_int_op(smartlist_len(all_entry_guards), OP_GE, num_needed); /* Walk the entry guard list for some sanity checking */ SMARTLIST_FOREACH_BEGIN(all_entry_guards, const entry_guard_t *, entry) { /* Since we called add_an_entry_guard() with 'for_discovery' being False, all guards should have made_contact enabled. */ - tt_int_op(entry->made_contact, ==, 1); + tt_int_op(entry->made_contact, OP_EQ, 1); /* Since we don't have a routerstatus, all of the entry guards are not directory servers. */ - tt_int_op(entry->is_dir_cache, ==, 0); + tt_int_op(entry->is_dir_cache, OP_EQ, 0); } SMARTLIST_FOREACH_END(entry); /* First, try to get some fast guards. This should fail. */ @@ -228,8 +229,8 @@ populate_live_entry_guards_test_helper(int num_needed) NO_DIRINFO, /* Don't care about DIRINFO*/ 0, 0, 1); /* We want fast guard! */ - tt_int_op(retval, ==, 0); - tt_int_op(smartlist_len(live_entry_guards), ==, 0); + tt_int_op(retval, OP_EQ, 0); + tt_int_op(smartlist_len(live_entry_guards), OP_EQ, 0); /* Now try to get some stable guards. This should fail too. */ retval = populate_live_entry_guards(live_entry_guards, @@ -239,8 +240,8 @@ populate_live_entry_guards_test_helper(int num_needed) 0, 1, /* We want stable guard! */ 0); - tt_int_op(retval, ==, 0); - tt_int_op(smartlist_len(live_entry_guards), ==, 0); + tt_int_op(retval, OP_EQ, 0); + tt_int_op(smartlist_len(live_entry_guards), OP_EQ, 0); /* Now try to get any guard we can find. This should succeed. */ retval = populate_live_entry_guards(live_entry_guards, @@ -253,8 +254,8 @@ populate_live_entry_guards_test_helper(int num_needed) should have added 'num_needed' of them to live_entry_guards. 'retval' should be 1 since we now have enough live entry guards to pick one. */ - tt_int_op(retval, ==, 1); - tt_int_op(smartlist_len(live_entry_guards), ==, num_needed); + tt_int_op(retval, OP_EQ, 1); + tt_int_op(smartlist_len(live_entry_guards), OP_EQ, num_needed); done: smartlist_free(live_entry_guards); @@ -361,7 +362,7 @@ test_entry_guards_parse_state_simple(void *arg) (void) arg; /* The global entry guards smartlist should be empty now. */ - tt_int_op(smartlist_len(all_entry_guards), ==, 0); + tt_int_op(smartlist_len(all_entry_guards), OP_EQ, 0); { /* Prepare the state entry */ @@ -387,34 +388,34 @@ test_entry_guards_parse_state_simple(void *arg) /* Parse state */ retval = entry_guards_parse_state(state, 1, &msg); - tt_int_op(retval, >=, 0); + tt_int_op(retval, OP_GE, 0); /* Test that the guard was registered. We need to re-get the entry guard list since its pointer was overwritten in entry_guards_parse_state(). */ all_entry_guards = get_entry_guards(); - tt_int_op(smartlist_len(all_entry_guards), ==, 1); + tt_int_op(smartlist_len(all_entry_guards), OP_EQ, 1); { /* Test the entry guard structure */ char hex_digest[1024]; char str_time[1024]; const entry_guard_t *e = smartlist_get(all_entry_guards, 0); - tt_str_op(e->nickname, ==, nickname); /* Verify nickname */ + tt_str_op(e->nickname, OP_EQ, nickname); /* Verify nickname */ base16_encode(hex_digest, sizeof(hex_digest), e->identity, DIGEST_LEN); - tt_str_op(hex_digest, ==, fpr); /* Verify fingerprint */ + tt_str_op(hex_digest, OP_EQ, fpr); /* Verify fingerprint */ tt_assert(e->is_dir_cache); /* Verify dirness */ - tt_str_op(e->chosen_by_version, ==, tor_version); /* Verify tor version */ + tt_str_op(e->chosen_by_version, OP_EQ, tor_version); /* Verify version */ tt_assert(e->made_contact); /* All saved guards have been contacted */ tt_assert(e->bad_since); /* Verify bad_since timestamp */ format_iso_time(str_time, e->bad_since); - tt_str_op(str_time, ==, unlisted_since); + tt_str_op(str_time, OP_EQ, unlisted_since); /* The rest should be unset */ tt_assert(!e->unreachable_since); @@ -456,7 +457,7 @@ test_entry_guards_parse_state_pathbias(void *arg) (void) arg; /* The global entry guards smartlist should be empty now. */ - tt_int_op(smartlist_len(all_entry_guards), ==, 0); + tt_int_op(smartlist_len(all_entry_guards), OP_EQ, 0); { /* Prepare the state entry */ @@ -492,11 +493,11 @@ test_entry_guards_parse_state_pathbias(void *arg) /* Parse state */ retval = entry_guards_parse_state(state, 1, &msg); - tt_int_op(retval, >=, 0); + tt_int_op(retval, OP_GE, 0); /* Test that the guard was registered */ all_entry_guards = get_entry_guards(); - tt_int_op(smartlist_len(all_entry_guards), ==, 1); + tt_int_op(smartlist_len(all_entry_guards), OP_EQ, 1); { /* Test the path bias of this guard */ const entry_guard_t *e = smartlist_get(all_entry_guards, 0); @@ -505,12 +506,13 @@ test_entry_guards_parse_state_pathbias(void *arg) tt_assert(!e->can_retry); /* XXX tt_double_op doesn't support equality. Cast to int for now. */ - tt_int_op((int)e->circ_attempts, ==, (int)circ_attempts); - tt_int_op((int)e->circ_successes, ==, (int)circ_successes); - tt_int_op((int)e->successful_circuits_closed, ==, (int)successful_closed); - tt_int_op((int)e->timeouts, ==, (int)timeouts); - tt_int_op((int)e->collapsed_circuits, ==, (int)collapsed); - tt_int_op((int)e->unusable_circuits, ==, (int)unusable); + tt_int_op((int)e->circ_attempts, OP_EQ, (int)circ_attempts); + tt_int_op((int)e->circ_successes, OP_EQ, (int)circ_successes); + tt_int_op((int)e->successful_circuits_closed, OP_EQ, + (int)successful_closed); + tt_int_op((int)e->timeouts, OP_EQ, (int)timeouts); + tt_int_op((int)e->collapsed_circuits, OP_EQ, (int)collapsed); + tt_int_op((int)e->unusable_circuits, OP_EQ, (int)unusable); } done: @@ -537,17 +539,17 @@ test_entry_guards_set_from_config(void *arg) retval = routerset_parse(options->EntryNodes, entrynodes_str, "test_entrynodes"); - tt_int_op(retval, >=, 0); + tt_int_op(retval, OP_GE, 0); /* Read nodes from EntryNodes */ entry_guards_set_from_config(options); /* Test that only one guard was added. */ - tt_int_op(smartlist_len(all_entry_guards), ==, 1); + tt_int_op(smartlist_len(all_entry_guards), OP_EQ, 1); /* Make sure it was the guard we specified. */ chosen_entry = choose_random_entry(NULL); - tt_str_op(chosen_entry->ri->nickname, ==, entrynodes_str); + tt_str_op(chosen_entry->ri->nickname, OP_EQ, entrynodes_str); done: routerset_free(options->EntryNodes); @@ -569,59 +571,59 @@ test_entry_is_time_to_retry(void *arg) test_guard->unreachable_since = now - 1; retval = entry_is_time_to_retry(test_guard,now); - tt_int_op(retval,==,1); + tt_int_op(retval,OP_EQ,1); test_guard->unreachable_since = now - (6*60*60 - 1); test_guard->last_attempted = now - (60*60 + 1); retval = entry_is_time_to_retry(test_guard,now); - tt_int_op(retval,==,1); + tt_int_op(retval,OP_EQ,1); test_guard->last_attempted = now - (60*60 - 1); retval = entry_is_time_to_retry(test_guard,now); - tt_int_op(retval,==,0); + tt_int_op(retval,OP_EQ,0); test_guard->unreachable_since = now - (6*60*60 + 1); test_guard->last_attempted = now - (4*60*60 + 1); retval = entry_is_time_to_retry(test_guard,now); - tt_int_op(retval,==,1); + tt_int_op(retval,OP_EQ,1); test_guard->unreachable_since = now - (3*24*60*60 - 1); test_guard->last_attempted = now - (4*60*60 + 1); retval = entry_is_time_to_retry(test_guard,now); - tt_int_op(retval,==,1); + tt_int_op(retval,OP_EQ,1); test_guard->unreachable_since = now - (3*24*60*60 + 1); test_guard->last_attempted = now - (18*60*60 + 1); retval = entry_is_time_to_retry(test_guard,now); - tt_int_op(retval,==,1); + tt_int_op(retval,OP_EQ,1); test_guard->unreachable_since = now - (7*24*60*60 - 1); test_guard->last_attempted = now - (18*60*60 + 1); retval = entry_is_time_to_retry(test_guard,now); - tt_int_op(retval,==,1); + tt_int_op(retval,OP_EQ,1); test_guard->last_attempted = now - (18*60*60 - 1); retval = entry_is_time_to_retry(test_guard,now); - tt_int_op(retval,==,0); + tt_int_op(retval,OP_EQ,0); test_guard->unreachable_since = now - (7*24*60*60 + 1); test_guard->last_attempted = now - (36*60*60 + 1); retval = entry_is_time_to_retry(test_guard,now); - tt_int_op(retval,==,1); + tt_int_op(retval,OP_EQ,1); test_guard->unreachable_since = now - (7*24*60*60 + 1); test_guard->last_attempted = now - (36*60*60 + 1); retval = entry_is_time_to_retry(test_guard,now); - tt_int_op(retval,==,1); + tt_int_op(retval,OP_EQ,1); done: tor_free(test_guard); @@ -641,23 +643,23 @@ test_entry_is_live(void *arg) (void) arg; /* The global entry guards smartlist should be empty now. */ - tt_int_op(smartlist_len(all_entry_guards), ==, 0); + tt_int_op(smartlist_len(all_entry_guards), OP_EQ, 0); /* Walk the nodelist and add all nodes as entry guards. */ our_nodelist = nodelist_get_list(); - tt_int_op(smartlist_len(our_nodelist), ==, NUMBER_OF_DESCRIPTORS); + tt_int_op(smartlist_len(our_nodelist), OP_EQ, NUMBER_OF_DESCRIPTORS); SMARTLIST_FOREACH_BEGIN(our_nodelist, const node_t *, node) { const node_t *node_tmp; node_tmp = add_an_entry_guard(node, 0, 1, 0, 0); tt_assert(node_tmp); - tt_int_op(node->is_stable, ==, 0); - tt_int_op(node->is_fast, ==, 0); + tt_int_op(node->is_stable, OP_EQ, 0); + tt_int_op(node->is_fast, OP_EQ, 0); } SMARTLIST_FOREACH_END(node); /* Make sure the nodes were added as entry guards. */ - tt_int_op(smartlist_len(all_entry_guards), ==, NUMBER_OF_DESCRIPTORS); + tt_int_op(smartlist_len(all_entry_guards), OP_EQ, NUMBER_OF_DESCRIPTORS); /* Now get a random test entry that we will use for this unit test. */ which_node = 3; /* (chosen by fair dice roll) */ @@ -681,12 +683,12 @@ test_entry_is_live(void *arg) /* Don't impose any restrictions on the node. Should succeed. */ test_node = entry_is_live(test_entry, 0, &msg); tt_assert(test_node); - tt_ptr_op(test_node, ==, node_get_by_id(test_entry->identity)); + tt_ptr_op(test_node, OP_EQ, node_get_by_id(test_entry->identity)); /* Require descriptor for this node. It has one so it should succeed. */ test_node = entry_is_live(test_entry, ENTRY_NEED_DESCRIPTOR, &msg); tt_assert(test_node); - tt_ptr_op(test_node, ==, node_get_by_id(test_entry->identity)); + tt_ptr_op(test_node, OP_EQ, node_get_by_id(test_entry->identity)); done: ; /* XXX */ diff --git a/src/test/test_extorport.c b/src/test/test_extorport.c index 4049d6d5e0..2e5a32eef3 100644 --- a/src/test/test_extorport.c +++ b/src/test/test_extorport.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2014, The Tor Project, Inc. */ +/* Copyright (c) 2013-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define CONNECTION_PRIVATE @@ -24,35 +24,37 @@ test_ext_or_id_map(void *arg) (void)arg; /* pre-initialization */ - tt_ptr_op(NULL, ==, connection_or_get_by_ext_or_id("xxxxxxxxxxxxxxxxxxxx")); + tt_ptr_op(NULL, OP_EQ, + connection_or_get_by_ext_or_id("xxxxxxxxxxxxxxxxxxxx")); c1 = or_connection_new(CONN_TYPE_EXT_OR, AF_INET); c2 = or_connection_new(CONN_TYPE_EXT_OR, AF_INET); c3 = or_connection_new(CONN_TYPE_OR, AF_INET); - tt_ptr_op(c1->ext_or_conn_id, !=, NULL); - tt_ptr_op(c2->ext_or_conn_id, !=, NULL); - tt_ptr_op(c3->ext_or_conn_id, ==, NULL); + tt_ptr_op(c1->ext_or_conn_id, OP_NE, NULL); + tt_ptr_op(c2->ext_or_conn_id, OP_NE, NULL); + tt_ptr_op(c3->ext_or_conn_id, OP_EQ, NULL); - tt_ptr_op(c1, ==, connection_or_get_by_ext_or_id(c1->ext_or_conn_id)); - tt_ptr_op(c2, ==, connection_or_get_by_ext_or_id(c2->ext_or_conn_id)); - tt_ptr_op(NULL, ==, connection_or_get_by_ext_or_id("xxxxxxxxxxxxxxxxxxxx")); + tt_ptr_op(c1, OP_EQ, connection_or_get_by_ext_or_id(c1->ext_or_conn_id)); + tt_ptr_op(c2, OP_EQ, connection_or_get_by_ext_or_id(c2->ext_or_conn_id)); + tt_ptr_op(NULL, OP_EQ, + connection_or_get_by_ext_or_id("xxxxxxxxxxxxxxxxxxxx")); idp = tor_memdup(c2->ext_or_conn_id, EXT_OR_CONN_ID_LEN); /* Give c2 a new ID. */ connection_or_set_ext_or_identifier(c2); - tt_mem_op(idp, !=, c2->ext_or_conn_id, EXT_OR_CONN_ID_LEN); + tt_mem_op(idp, OP_NE, c2->ext_or_conn_id, EXT_OR_CONN_ID_LEN); idp2 = tor_memdup(c2->ext_or_conn_id, EXT_OR_CONN_ID_LEN); tt_assert(!tor_digest_is_zero(idp2)); - tt_ptr_op(NULL, ==, connection_or_get_by_ext_or_id(idp)); - tt_ptr_op(c2, ==, connection_or_get_by_ext_or_id(idp2)); + tt_ptr_op(NULL, OP_EQ, connection_or_get_by_ext_or_id(idp)); + tt_ptr_op(c2, OP_EQ, connection_or_get_by_ext_or_id(idp2)); /* Now remove it. */ connection_or_remove_from_ext_or_id_map(c2); - tt_ptr_op(NULL, ==, connection_or_get_by_ext_or_id(idp)); - tt_ptr_op(NULL, ==, connection_or_get_by_ext_or_id(idp2)); + tt_ptr_op(NULL, OP_EQ, connection_or_get_by_ext_or_id(idp)); + tt_ptr_op(NULL, OP_EQ, connection_or_get_by_ext_or_id(idp2)); done: if (c1) @@ -112,33 +114,33 @@ test_ext_or_write_command(void *arg) /* Length too long */ tt_int_op(connection_write_ext_or_command(TO_CONN(c1), 100, "X", 100000), - <, 0); + OP_LT, 0); /* Empty command */ tt_int_op(connection_write_ext_or_command(TO_CONN(c1), 0x99, NULL, 0), - ==, 0); + OP_EQ, 0); cp = buf_get_contents(TO_CONN(c1)->outbuf, &sz); - tt_int_op(sz, ==, 4); - tt_mem_op(cp, ==, "\x00\x99\x00\x00", 4); + tt_int_op(sz, OP_EQ, 4); + tt_mem_op(cp, OP_EQ, "\x00\x99\x00\x00", 4); tor_free(cp); /* Medium command. */ tt_int_op(connection_write_ext_or_command(TO_CONN(c1), 0x99, - "Wai\0Hello", 9), ==, 0); + "Wai\0Hello", 9), OP_EQ, 0); cp = buf_get_contents(TO_CONN(c1)->outbuf, &sz); - tt_int_op(sz, ==, 13); - tt_mem_op(cp, ==, "\x00\x99\x00\x09Wai\x00Hello", 13); + tt_int_op(sz, OP_EQ, 13); + tt_mem_op(cp, OP_EQ, "\x00\x99\x00\x09Wai\x00Hello", 13); tor_free(cp); /* Long command */ buf = tor_malloc(65535); memset(buf, 'x', 65535); tt_int_op(connection_write_ext_or_command(TO_CONN(c1), 0xf00d, - buf, 65535), ==, 0); + buf, 65535), OP_EQ, 0); cp = buf_get_contents(TO_CONN(c1)->outbuf, &sz); - tt_int_op(sz, ==, 65539); - tt_mem_op(cp, ==, "\xf0\x0d\xff\xff", 4); - tt_mem_op(cp+4, ==, buf, 65535); + tt_int_op(sz, OP_EQ, 65539); + tt_mem_op(cp, OP_EQ, "\xf0\x0d\xff\xff", 4); + tt_mem_op(cp+4, OP_EQ, buf, 65535); tor_free(cp); done: @@ -175,7 +177,7 @@ test_ext_or_init_auth(void *arg) tor_free(options->DataDirectory); options->DataDirectory = tor_strdup("foo"); cp = get_ext_or_auth_cookie_file_name(); - tt_str_op(cp, ==, "foo"PATH_SEPARATOR"extended_orport_auth_cookie"); + tt_str_op(cp, OP_EQ, "foo"PATH_SEPARATOR"extended_orport_auth_cookie"); tor_free(cp); /* Shouldn't be initialized already, or our tests will be a bit @@ -187,30 +189,30 @@ test_ext_or_init_auth(void *arg) fn = get_fname("ext_cookie_file"); options->ExtORPortCookieAuthFile = tor_strdup(fn); cp = get_ext_or_auth_cookie_file_name(); - tt_str_op(cp, ==, fn); + tt_str_op(cp, OP_EQ, fn); tor_free(cp); /* Test the initialization function with a broken write_bytes_to_file(). See if the problem is handled properly. */ MOCK(write_bytes_to_file, write_bytes_to_file_fail); - tt_int_op(-1, ==, init_ext_or_cookie_authentication(1)); - tt_int_op(ext_or_auth_cookie_is_set, ==, 0); + tt_int_op(-1, OP_EQ, init_ext_or_cookie_authentication(1)); + tt_int_op(ext_or_auth_cookie_is_set, OP_EQ, 0); UNMOCK(write_bytes_to_file); /* Now do the actual initialization. */ - tt_int_op(0, ==, init_ext_or_cookie_authentication(1)); - tt_int_op(ext_or_auth_cookie_is_set, ==, 1); + tt_int_op(0, OP_EQ, init_ext_or_cookie_authentication(1)); + tt_int_op(ext_or_auth_cookie_is_set, OP_EQ, 1); cp = read_file_to_str(fn, RFTS_BIN, &st); - tt_ptr_op(cp, !=, NULL); - tt_u64_op((uint64_t)st.st_size, ==, 64); - tt_mem_op(cp,==, "! Extended ORPort Auth Cookie !\x0a", 32); - tt_mem_op(cp+32,==, ext_or_auth_cookie, 32); + tt_ptr_op(cp, OP_NE, NULL); + tt_u64_op((uint64_t)st.st_size, OP_EQ, 64); + tt_mem_op(cp,OP_EQ, "! Extended ORPort Auth Cookie !\x0a", 32); + tt_mem_op(cp+32,OP_EQ, ext_or_auth_cookie, 32); memcpy(cookie0, ext_or_auth_cookie, 32); tt_assert(!tor_mem_is_zero((char*)ext_or_auth_cookie, 32)); /* Operation should be idempotent. */ - tt_int_op(0, ==, init_ext_or_cookie_authentication(1)); - tt_mem_op(cookie0,==, ext_or_auth_cookie, 32); + tt_int_op(0, OP_EQ, init_ext_or_cookie_authentication(1)); + tt_mem_op(cookie0,OP_EQ, ext_or_auth_cookie, 32); done: tor_free(cp); @@ -237,8 +239,8 @@ test_ext_or_cookie_auth(void *arg) (void)arg; - tt_int_op(strlen(client_hash_input), ==, 46+32+32); - tt_int_op(strlen(server_hash_input), ==, 46+32+32); + tt_int_op(strlen(client_hash_input), OP_EQ, 46+32+32); + tt_int_op(strlen(server_hash_input), OP_EQ, 46+32+32); ext_or_auth_cookie = tor_malloc_zero(32); memcpy(ext_or_auth_cookie, "s beside you? When I count, ther", 32); @@ -258,20 +260,20 @@ test_ext_or_cookie_auth(void *arg) */ /* Wrong length */ - tt_int_op(-1, ==, + tt_int_op(-1, OP_EQ, handle_client_auth_nonce(client_nonce, 33, &client_hash, &reply, &reply_len)); - tt_int_op(-1, ==, + tt_int_op(-1, OP_EQ, handle_client_auth_nonce(client_nonce, 31, &client_hash, &reply, &reply_len)); /* Now let's try this for real! */ - tt_int_op(0, ==, + tt_int_op(0, OP_EQ, handle_client_auth_nonce(client_nonce, 32, &client_hash, &reply, &reply_len)); - tt_int_op(reply_len, ==, 64); - tt_ptr_op(reply, !=, NULL); - tt_ptr_op(client_hash, !=, NULL); + tt_int_op(reply_len, OP_EQ, 64); + tt_ptr_op(reply, OP_NE, NULL); + tt_ptr_op(client_hash, OP_NE, NULL); /* Fill in the server nonce into the hash inputs... */ memcpy(server_hash_input+46+32, reply+32, 32); memcpy(client_hash_input+46+32, reply+32, 32); @@ -280,15 +282,15 @@ test_ext_or_cookie_auth(void *arg) 46+32+32); crypto_hmac_sha256(hmac2, (char*)ext_or_auth_cookie, 32, client_hash_input, 46+32+32); - tt_mem_op(hmac1,==, reply, 32); - tt_mem_op(hmac2,==, client_hash, 32); + tt_mem_op(hmac1,OP_EQ, reply, 32); + tt_mem_op(hmac2,OP_EQ, client_hash, 32); /* Now do it again and make sure that the results are *different* */ - tt_int_op(0, ==, + tt_int_op(0, OP_EQ, handle_client_auth_nonce(client_nonce, 32, &client_hash2, &reply2, &reply_len)); - tt_mem_op(reply2,!=, reply, reply_len); - tt_mem_op(client_hash2,!=, client_hash, 32); + tt_mem_op(reply2,OP_NE, reply, reply_len); + tt_mem_op(client_hash2,OP_NE, client_hash, 32); /* But that this one checks out too. */ memcpy(server_hash_input+46+32, reply2+32, 32); memcpy(client_hash_input+46+32, reply2+32, 32); @@ -297,8 +299,8 @@ test_ext_or_cookie_auth(void *arg) 46+32+32); crypto_hmac_sha256(hmac2, (char*)ext_or_auth_cookie, 32, client_hash_input, 46+32+32); - tt_mem_op(hmac1,==, reply2, 32); - tt_mem_op(hmac2,==, client_hash2, 32); + tt_mem_op(hmac1,OP_EQ, reply2, 32); + tt_mem_op(hmac2,OP_EQ, client_hash2, 32); done: tor_free(reply); @@ -334,12 +336,12 @@ test_ext_or_cookie_auth_testvec(void *arg) MOCK(crypto_rand, crypto_rand_return_tse_str); - tt_int_op(0, ==, + tt_int_op(0, OP_EQ, handle_client_auth_nonce(client_nonce, 32, &client_hash, &reply, &reply_len)); - tt_ptr_op(reply, !=, NULL ); - tt_uint_op(reply_len, ==, 64); - tt_mem_op(reply+32,==, "te road There is always another ", 32); + tt_ptr_op(reply, OP_NE, NULL ); + tt_uint_op(reply_len, OP_EQ, 64); + tt_mem_op(reply+32,OP_EQ, "te road There is always another ", 32); /* HMACSHA256("Gliding wrapt in a brown mantle," * "ExtORPort authentication server-to-client hash" * "But when I look ahead up the write road There is always another "); @@ -402,11 +404,11 @@ handshake_start(or_connection_t *conn, int receiving) } while (0) #define CONTAINS(s,n) \ do { \ - tt_int_op((n), <=, sizeof(b)); \ - tt_int_op(buf_datalen(TO_CONN(conn)->outbuf), ==, (n)); \ + tt_int_op((n), OP_LE, sizeof(b)); \ + tt_int_op(buf_datalen(TO_CONN(conn)->outbuf), OP_EQ, (n)); \ if ((n)) { \ fetch_from_buf(b, (n), TO_CONN(conn)->outbuf); \ - tt_mem_op(b, ==, (s), (n)); \ + tt_mem_op(b, OP_EQ, (s), (n)); \ } \ } while (0) @@ -416,14 +418,15 @@ do_ext_or_handshake(or_connection_t *conn) { char b[256]; - tt_int_op(0, ==, connection_ext_or_start_auth(conn)); + tt_int_op(0, OP_EQ, connection_ext_or_start_auth(conn)); CONTAINS("\x01\x00", 2); WRITE("\x01", 1); WRITE("But when I look ahead up the whi", 32); MOCK(crypto_rand, crypto_rand_return_tse_str); - tt_int_op(0, ==, connection_ext_or_process_inbuf(conn)); + tt_int_op(0, OP_EQ, connection_ext_or_process_inbuf(conn)); UNMOCK(crypto_rand); - tt_int_op(TO_CONN(conn)->state, ==, EXT_OR_CONN_STATE_AUTH_WAIT_CLIENT_HASH); + tt_int_op(TO_CONN(conn)->state, OP_EQ, + EXT_OR_CONN_STATE_AUTH_WAIT_CLIENT_HASH); CONTAINS("\xec\x80\xed\x6e\x54\x6d\x3b\x36\xfd\xfc\x22\xfe\x13\x15\x41\x6b" "\x02\x9f\x1a\xde\x76\x10\xd9\x10\x87\x8b\x62\xee\xb7\x40\x38\x21" "te road There is always another ", 64); @@ -431,10 +434,10 @@ do_ext_or_handshake(or_connection_t *conn) WRITE("\xab\x39\x17\x32\xdd\x2e\xd9\x68\xcd\x40\xc0\x87\xd1\xb1\xf2\x5b" "\x33\xb3\xcd\x77\xff\x79\xbd\x80\xc2\x07\x4b\xbf\x43\x81\x19\xa2", 32); - tt_int_op(0, ==, connection_ext_or_process_inbuf(conn)); + tt_int_op(0, OP_EQ, connection_ext_or_process_inbuf(conn)); CONTAINS("\x01", 1); tt_assert(! TO_CONN(conn)->marked_for_close); - tt_int_op(TO_CONN(conn)->state, ==, EXT_OR_CONN_STATE_OPEN); + tt_int_op(TO_CONN(conn)->state, OP_EQ, EXT_OR_CONN_STATE_OPEN); done: ; } @@ -456,14 +459,14 @@ test_ext_or_handshake(void *arg) init_connection_lists(); conn = or_connection_new(CONN_TYPE_EXT_OR, AF_INET); - tt_int_op(0, ==, connection_ext_or_start_auth(conn)); + tt_int_op(0, OP_EQ, connection_ext_or_start_auth(conn)); /* The server starts by telling us about the one supported authtype. */ CONTAINS("\x01\x00", 2); /* Say the client hasn't responded yet. */ - tt_int_op(0, ==, connection_ext_or_process_inbuf(conn)); + tt_int_op(0, OP_EQ, connection_ext_or_process_inbuf(conn)); /* Let's say the client replies badly. */ WRITE("\x99", 1); - tt_int_op(-1, ==, connection_ext_or_process_inbuf(conn)); + tt_int_op(-1, OP_EQ, connection_ext_or_process_inbuf(conn)); CONTAINS("", 0); tt_assert(TO_CONN(conn)->marked_for_close); close_closeable_connections(); @@ -471,23 +474,23 @@ test_ext_or_handshake(void *arg) /* Okay, try again. */ conn = or_connection_new(CONN_TYPE_EXT_OR, AF_INET); - tt_int_op(0, ==, connection_ext_or_start_auth(conn)); + tt_int_op(0, OP_EQ, connection_ext_or_start_auth(conn)); CONTAINS("\x01\x00", 2); /* Let's say the client replies sensibly this time. "Yes, AUTHTYPE_COOKIE * sounds delicious. Let's have some of that!" */ WRITE("\x01", 1); /* Let's say that the client also sends part of a nonce. */ WRITE("But when I look ", 16); - tt_int_op(0, ==, connection_ext_or_process_inbuf(conn)); + tt_int_op(0, OP_EQ, connection_ext_or_process_inbuf(conn)); CONTAINS("", 0); - tt_int_op(TO_CONN(conn)->state, ==, + tt_int_op(TO_CONN(conn)->state, OP_EQ, EXT_OR_CONN_STATE_AUTH_WAIT_CLIENT_NONCE); /* Pump it again. Nothing should happen. */ - tt_int_op(0, ==, connection_ext_or_process_inbuf(conn)); + tt_int_op(0, OP_EQ, connection_ext_or_process_inbuf(conn)); /* send the rest of the nonce. */ WRITE("ahead up the whi", 16); MOCK(crypto_rand, crypto_rand_return_tse_str); - tt_int_op(0, ==, connection_ext_or_process_inbuf(conn)); + tt_int_op(0, OP_EQ, connection_ext_or_process_inbuf(conn)); UNMOCK(crypto_rand); /* We should get the right reply from the server. */ CONTAINS("\xec\x80\xed\x6e\x54\x6d\x3b\x36\xfd\xfc\x22\xfe\x13\x15\x41\x6b" @@ -496,7 +499,7 @@ test_ext_or_handshake(void *arg) /* Send the wrong response. */ WRITE("not with a bang but a whimper...", 32); MOCK(control_event_bootstrap_problem, ignore_bootstrap_problem); - tt_int_op(-1, ==, connection_ext_or_process_inbuf(conn)); + tt_int_op(-1, OP_EQ, connection_ext_or_process_inbuf(conn)); CONTAINS("\x00", 1); tt_assert(TO_CONN(conn)->marked_for_close); /* XXXX Hold-open-until-flushed. */ @@ -515,32 +518,32 @@ test_ext_or_handshake(void *arg) /* Now let's run through some messages. */ /* First let's send some junk and make sure it's ignored. */ WRITE("\xff\xf0\x00\x03""ABC", 7); - tt_int_op(0, ==, connection_ext_or_process_inbuf(conn)); + tt_int_op(0, OP_EQ, connection_ext_or_process_inbuf(conn)); CONTAINS("", 0); /* Now let's send a USERADDR command. */ WRITE("\x00\x01\x00\x0c""1.2.3.4:5678", 16); - tt_int_op(0, ==, connection_ext_or_process_inbuf(conn)); - tt_int_op(TO_CONN(conn)->port, ==, 5678); - tt_int_op(tor_addr_to_ipv4h(&TO_CONN(conn)->addr), ==, 0x01020304); + tt_int_op(0, OP_EQ, connection_ext_or_process_inbuf(conn)); + tt_int_op(TO_CONN(conn)->port, OP_EQ, 5678); + tt_int_op(tor_addr_to_ipv4h(&TO_CONN(conn)->addr), OP_EQ, 0x01020304); /* Now let's send a TRANSPORT command. */ WRITE("\x00\x02\x00\x07""rfc1149", 11); - tt_int_op(0, ==, connection_ext_or_process_inbuf(conn)); - tt_ptr_op(NULL, !=, conn->ext_or_transport); - tt_str_op("rfc1149", ==, conn->ext_or_transport); - tt_int_op(is_reading,==,1); - tt_int_op(TO_CONN(conn)->state, ==, EXT_OR_CONN_STATE_OPEN); + tt_int_op(0, OP_EQ, connection_ext_or_process_inbuf(conn)); + tt_ptr_op(NULL, OP_NE, conn->ext_or_transport); + tt_str_op("rfc1149", OP_EQ, conn->ext_or_transport); + tt_int_op(is_reading,OP_EQ,1); + tt_int_op(TO_CONN(conn)->state, OP_EQ, EXT_OR_CONN_STATE_OPEN); /* DONE */ WRITE("\x00\x00\x00\x00", 4); - tt_int_op(0, ==, connection_ext_or_process_inbuf(conn)); - tt_int_op(TO_CONN(conn)->state, ==, EXT_OR_CONN_STATE_FLUSHING); - tt_int_op(is_reading,==,0); + tt_int_op(0, OP_EQ, connection_ext_or_process_inbuf(conn)); + tt_int_op(TO_CONN(conn)->state, OP_EQ, EXT_OR_CONN_STATE_FLUSHING); + tt_int_op(is_reading,OP_EQ,0); CONTAINS("\x10\x00\x00\x00", 4); - tt_int_op(handshake_start_called,==,0); - tt_int_op(0, ==, connection_ext_or_finished_flushing(conn)); - tt_int_op(is_reading,==,1); - tt_int_op(handshake_start_called,==,1); - tt_int_op(TO_CONN(conn)->type, ==, CONN_TYPE_OR); - tt_int_op(TO_CONN(conn)->state, ==, 0); + tt_int_op(handshake_start_called,OP_EQ,0); + tt_int_op(0, OP_EQ, connection_ext_or_finished_flushing(conn)); + tt_int_op(is_reading,OP_EQ,1); + tt_int_op(handshake_start_called,OP_EQ,1); + tt_int_op(TO_CONN(conn)->type, OP_EQ, CONN_TYPE_OR); + tt_int_op(TO_CONN(conn)->state, OP_EQ, 0); close_closeable_connections(); conn = NULL; @@ -551,7 +554,7 @@ test_ext_or_handshake(void *arg) /* USERADDR command with an extra NUL byte */ WRITE("\x00\x01\x00\x0d""1.2.3.4:5678\x00", 17); MOCK(control_event_bootstrap_problem, ignore_bootstrap_problem); - tt_int_op(-1, ==, connection_ext_or_process_inbuf(conn)); + tt_int_op(-1, OP_EQ, connection_ext_or_process_inbuf(conn)); CONTAINS("", 0); tt_assert(TO_CONN(conn)->marked_for_close); close_closeable_connections(); @@ -564,7 +567,7 @@ test_ext_or_handshake(void *arg) /* TRANSPORT command with an extra NUL byte */ WRITE("\x00\x02\x00\x08""rfc1149\x00", 12); MOCK(control_event_bootstrap_problem, ignore_bootstrap_problem); - tt_int_op(-1, ==, connection_ext_or_process_inbuf(conn)); + tt_int_op(-1, OP_EQ, connection_ext_or_process_inbuf(conn)); CONTAINS("", 0); tt_assert(TO_CONN(conn)->marked_for_close); close_closeable_connections(); @@ -578,7 +581,7 @@ test_ext_or_handshake(void *arg) C-identifier) */ WRITE("\x00\x02\x00\x07""rf*1149", 11); MOCK(control_event_bootstrap_problem, ignore_bootstrap_problem); - tt_int_op(-1, ==, connection_ext_or_process_inbuf(conn)); + tt_int_op(-1, OP_EQ, connection_ext_or_process_inbuf(conn)); CONTAINS("", 0); tt_assert(TO_CONN(conn)->marked_for_close); close_closeable_connections(); diff --git a/src/test/test_hs.c b/src/test/test_hs.c index c4820014c7..0246eaf648 100644 --- a/src/test/test_hs.c +++ b/src/test/test_hs.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2007-2014, The Tor Project, Inc. */ +/* Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -85,7 +85,7 @@ test_hs_desc_event(void *arg) expected_msg = "650 HS_DESC REQUESTED "STR_HS_ADDR" NO_AUTH "\ STR_HSDIR_EXIST_LONGNAME" "STR_HS_ID"\r\n"; tt_assert(received_msg); - tt_str_op(received_msg,==, expected_msg); + tt_str_op(received_msg,OP_EQ, expected_msg); tor_free(received_msg); /* test received event */ @@ -94,25 +94,27 @@ test_hs_desc_event(void *arg) expected_msg = "650 HS_DESC RECEIVED "STR_HS_ADDR" BASIC_AUTH "\ STR_HSDIR_EXIST_LONGNAME"\r\n"; tt_assert(received_msg); - tt_str_op(received_msg,==, expected_msg); + tt_str_op(received_msg,OP_EQ, expected_msg); tor_free(received_msg); /* test failed event */ rend_query.auth_type = 2; - control_event_hs_descriptor_failed(&rend_query, HSDIR_NONE_EXIST_ID); + control_event_hs_descriptor_failed(&rend_query, HSDIR_NONE_EXIST_ID, + "QUERY_REJECTED"); expected_msg = "650 HS_DESC FAILED "STR_HS_ADDR" STEALTH_AUTH "\ - STR_HSDIR_NONE_EXIST_LONGNAME"\r\n"; + STR_HSDIR_NONE_EXIST_LONGNAME" REASON=QUERY_REJECTED\r\n"; tt_assert(received_msg); - tt_str_op(received_msg,==, expected_msg); + tt_str_op(received_msg,OP_EQ, expected_msg); tor_free(received_msg); /* test invalid auth type */ rend_query.auth_type = 999; - control_event_hs_descriptor_failed(&rend_query, HSDIR_EXIST_ID); + control_event_hs_descriptor_failed(&rend_query, HSDIR_EXIST_ID, + "QUERY_REJECTED"); expected_msg = "650 HS_DESC FAILED "STR_HS_ADDR" UNKNOWN "\ - STR_HSDIR_EXIST_LONGNAME"\r\n"; + STR_HSDIR_EXIST_LONGNAME" REASON=QUERY_REJECTED\r\n"; tt_assert(received_msg); - tt_str_op(received_msg,==, expected_msg); + tt_str_op(received_msg,OP_EQ, expected_msg); tor_free(received_msg); done: diff --git a/src/test/test_introduce.c b/src/test/test_introduce.c index 0febd59276..0cab8ef4cc 100644 --- a/src/test/test_introduce.c +++ b/src/test/test_introduce.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2014, The Tor Project, Inc. */ +/* Copyright (c) 2012-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" @@ -310,7 +310,7 @@ do_parse_test(uint8_t *plaintext, size_t plaintext_len, int phase) parsed_req = rend_service_begin_parse_intro(cell, cell_len, 2, &err_msg); tt_assert(parsed_req); tt_assert(!err_msg); - tt_mem_op(parsed_req->pk,==, digest, DIGEST_LEN); + tt_mem_op(parsed_req->pk,OP_EQ, digest, DIGEST_LEN); tt_assert(parsed_req->ciphertext); tt_assert(parsed_req->ciphertext_len > 0); diff --git a/src/test/test_logging.c b/src/test/test_logging.c index 9d9cbae6a8..6205b3bdc5 100644 --- a/src/test/test_logging.c +++ b/src/test/test_logging.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2014, The Tor Project, Inc. */ +/* Copyright (c) 2013-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" @@ -22,8 +22,8 @@ test_get_sigsafe_err_fds(void *arg) init_logging(1); n = tor_log_get_sigsafe_err_fds(&fds); - tt_int_op(n, ==, 1); - tt_int_op(fds[0], ==, STDERR_FILENO); + tt_int_op(n, OP_EQ, 1); + tt_int_op(fds[0], OP_EQ, STDERR_FILENO); set_log_severity_config(LOG_WARN, LOG_ERR, &include_bug); set_log_severity_config(LOG_WARN, LOG_ERR, &no_bug); @@ -40,26 +40,26 @@ test_get_sigsafe_err_fds(void *arg) tor_log_update_sigsafe_err_fds(); n = tor_log_get_sigsafe_err_fds(&fds); - tt_int_op(n, ==, 2); - tt_int_op(fds[0], ==, STDERR_FILENO); - tt_int_op(fds[1], ==, 3); + tt_int_op(n, OP_EQ, 2); + tt_int_op(fds[0], OP_EQ, STDERR_FILENO); + tt_int_op(fds[1], OP_EQ, 3); /* Allow STDOUT to replace STDERR. */ add_stream_log(&include_bug, "dummy-4", STDOUT_FILENO); tor_log_update_sigsafe_err_fds(); n = tor_log_get_sigsafe_err_fds(&fds); - tt_int_op(n, ==, 2); - tt_int_op(fds[0], ==, 3); - tt_int_op(fds[1], ==, STDOUT_FILENO); + tt_int_op(n, OP_EQ, 2); + tt_int_op(fds[0], OP_EQ, 3); + tt_int_op(fds[1], OP_EQ, STDOUT_FILENO); /* But don't allow it to replace explicit STDERR. */ add_stream_log(&include_bug, "dummy-5", STDERR_FILENO); tor_log_update_sigsafe_err_fds(); n = tor_log_get_sigsafe_err_fds(&fds); - tt_int_op(n, ==, 3); - tt_int_op(fds[0], ==, STDERR_FILENO); - tt_int_op(fds[1], ==, STDOUT_FILENO); - tt_int_op(fds[2], ==, 3); + tt_int_op(n, OP_EQ, 3); + tt_int_op(fds[0], OP_EQ, STDERR_FILENO); + tt_int_op(fds[1], OP_EQ, STDOUT_FILENO); + tt_int_op(fds[2], OP_EQ, 3); /* Don't overflow the array. */ { @@ -70,7 +70,7 @@ test_get_sigsafe_err_fds(void *arg) } tor_log_update_sigsafe_err_fds(); n = tor_log_get_sigsafe_err_fds(&fds); - tt_int_op(n, ==, 8); + tt_int_op(n, OP_EQ, 8); done: ; @@ -109,7 +109,7 @@ test_sigsafe_err(void *arg) tt_assert(content != NULL); tor_split_lines(lines, content, (int)strlen(content)); - tt_int_op(smartlist_len(lines), >=, 5); + tt_int_op(smartlist_len(lines), OP_GE, 5); if (strstr(smartlist_get(lines, 0), "opening new log file")) smartlist_del_keeporder(lines, 0); @@ -119,7 +119,7 @@ test_sigsafe_err(void *arg) tt_assert(!strcmpstart(smartlist_get(lines, 2), "Minimal.")); /* Next line is blank. */ tt_assert(!strcmpstart(smartlist_get(lines, 3), "==============")); - tt_str_op(smartlist_get(lines, 4), ==, + tt_str_op(smartlist_get(lines, 4), OP_EQ, "Testing any attempt to manually log from a signal."); done: diff --git a/src/test/test_microdesc.c b/src/test/test_microdesc.c index aa4bdf2ae8..fb3df77edc 100644 --- a/src/test/test_microdesc.c +++ b/src/test/test_microdesc.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2010-2014, The Tor Project, Inc. */ +/* Copyright (c) 2010-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" @@ -75,9 +75,9 @@ test_md_cache(void *data) tor_free(options->DataDirectory); options->DataDirectory = tor_strdup(get_fname("md_datadir_test")); #ifdef _WIN32 - tt_int_op(0, ==, mkdir(options->DataDirectory)); + tt_int_op(0, OP_EQ, mkdir(options->DataDirectory)); #else - tt_int_op(0, ==, mkdir(options->DataDirectory, 0700)); + tt_int_op(0, OP_EQ, mkdir(options->DataDirectory, 0700)); #endif tt_assert(!strcmpstart(test_md3_noannotation, "onion-key")); @@ -91,7 +91,7 @@ test_md_cache(void *data) added = microdescs_add_to_cache(mc, test_md1, NULL, SAVED_NOWHERE, 0, time1, NULL); - tt_int_op(1, ==, smartlist_len(added)); + tt_int_op(1, OP_EQ, smartlist_len(added)); md1 = smartlist_get(added, 0); smartlist_free(added); added = NULL; @@ -100,7 +100,7 @@ test_md_cache(void *data) added = microdescs_add_to_cache(mc, test_md2, NULL, SAVED_NOWHERE, 0, time2, wanted); /* Should fail, since we didn't list test_md2's digest in wanted */ - tt_int_op(0, ==, smartlist_len(added)); + tt_int_op(0, OP_EQ, smartlist_len(added)); smartlist_free(added); added = NULL; @@ -109,75 +109,75 @@ test_md_cache(void *data) added = microdescs_add_to_cache(mc, test_md2, NULL, SAVED_NOWHERE, 0, time2, wanted); /* Now it can work. md2 should have been added */ - tt_int_op(1, ==, smartlist_len(added)); + tt_int_op(1, OP_EQ, smartlist_len(added)); md2 = smartlist_get(added, 0); /* And it should have gotten removed from 'wanted' */ - tt_int_op(smartlist_len(wanted), ==, 1); - tt_mem_op(smartlist_get(wanted, 0), ==, d3, DIGEST256_LEN); + tt_int_op(smartlist_len(wanted), OP_EQ, 1); + tt_mem_op(smartlist_get(wanted, 0), OP_EQ, d3, DIGEST256_LEN); smartlist_free(added); added = NULL; added = microdescs_add_to_cache(mc, test_md3, NULL, SAVED_NOWHERE, 0, -1, NULL); /* Must fail, since SAVED_NOWHERE precludes annotations */ - tt_int_op(0, ==, smartlist_len(added)); + tt_int_op(0, OP_EQ, smartlist_len(added)); smartlist_free(added); added = NULL; added = microdescs_add_to_cache(mc, test_md3_noannotation, NULL, SAVED_NOWHERE, 0, time3, NULL); /* Now it can work */ - tt_int_op(1, ==, smartlist_len(added)); + tt_int_op(1, OP_EQ, smartlist_len(added)); md3 = smartlist_get(added, 0); smartlist_free(added); added = NULL; /* Okay. We added 1...3. Let's poke them to see how they look, and make * sure they're really in the journal. */ - tt_ptr_op(md1, ==, microdesc_cache_lookup_by_digest256(mc, d1)); - tt_ptr_op(md2, ==, microdesc_cache_lookup_by_digest256(mc, d2)); - tt_ptr_op(md3, ==, microdesc_cache_lookup_by_digest256(mc, d3)); - - tt_int_op(md1->last_listed, ==, time1); - tt_int_op(md2->last_listed, ==, time2); - tt_int_op(md3->last_listed, ==, time3); - - tt_int_op(md1->saved_location, ==, SAVED_IN_JOURNAL); - tt_int_op(md2->saved_location, ==, SAVED_IN_JOURNAL); - tt_int_op(md3->saved_location, ==, SAVED_IN_JOURNAL); - - tt_int_op(md1->bodylen, ==, strlen(test_md1)); - tt_int_op(md2->bodylen, ==, strlen(test_md2)); - tt_int_op(md3->bodylen, ==, strlen(test_md3_noannotation)); - tt_mem_op(md1->body, ==, test_md1, strlen(test_md1)); - tt_mem_op(md2->body, ==, test_md2, strlen(test_md2)); - tt_mem_op(md3->body, ==, test_md3_noannotation, + tt_ptr_op(md1, OP_EQ, microdesc_cache_lookup_by_digest256(mc, d1)); + tt_ptr_op(md2, OP_EQ, microdesc_cache_lookup_by_digest256(mc, d2)); + tt_ptr_op(md3, OP_EQ, microdesc_cache_lookup_by_digest256(mc, d3)); + + tt_int_op(md1->last_listed, OP_EQ, time1); + tt_int_op(md2->last_listed, OP_EQ, time2); + tt_int_op(md3->last_listed, OP_EQ, time3); + + tt_int_op(md1->saved_location, OP_EQ, SAVED_IN_JOURNAL); + tt_int_op(md2->saved_location, OP_EQ, SAVED_IN_JOURNAL); + tt_int_op(md3->saved_location, OP_EQ, SAVED_IN_JOURNAL); + + tt_int_op(md1->bodylen, OP_EQ, strlen(test_md1)); + tt_int_op(md2->bodylen, OP_EQ, strlen(test_md2)); + tt_int_op(md3->bodylen, OP_EQ, strlen(test_md3_noannotation)); + tt_mem_op(md1->body, OP_EQ, test_md1, strlen(test_md1)); + tt_mem_op(md2->body, OP_EQ, test_md2, strlen(test_md2)); + tt_mem_op(md3->body, OP_EQ, test_md3_noannotation, strlen(test_md3_noannotation)); tor_asprintf(&fn, "%s"PATH_SEPARATOR"cached-microdescs.new", options->DataDirectory); s = read_file_to_str(fn, RFTS_BIN, NULL); tt_assert(s); - tt_mem_op(md1->body, ==, s + md1->off, md1->bodylen); - tt_mem_op(md2->body, ==, s + md2->off, md2->bodylen); - tt_mem_op(md3->body, ==, s + md3->off, md3->bodylen); + tt_mem_op(md1->body, OP_EQ, s + md1->off, md1->bodylen); + tt_mem_op(md2->body, OP_EQ, s + md2->off, md2->bodylen); + tt_mem_op(md3->body, OP_EQ, s + md3->off, md3->bodylen); - tt_ptr_op(md1->family, ==, NULL); - tt_ptr_op(md3->family, !=, NULL); - tt_int_op(smartlist_len(md3->family), ==, 3); - tt_str_op(smartlist_get(md3->family, 0), ==, "nodeX"); + tt_ptr_op(md1->family, OP_EQ, NULL); + tt_ptr_op(md3->family, OP_NE, NULL); + tt_int_op(smartlist_len(md3->family), OP_EQ, 3); + tt_str_op(smartlist_get(md3->family, 0), OP_EQ, "nodeX"); /* Now rebuild the cache! */ - tt_int_op(microdesc_cache_rebuild(mc, 1), ==, 0); + tt_int_op(microdesc_cache_rebuild(mc, 1), OP_EQ, 0); - tt_int_op(md1->saved_location, ==, SAVED_IN_CACHE); - tt_int_op(md2->saved_location, ==, SAVED_IN_CACHE); - tt_int_op(md3->saved_location, ==, SAVED_IN_CACHE); + tt_int_op(md1->saved_location, OP_EQ, SAVED_IN_CACHE); + tt_int_op(md2->saved_location, OP_EQ, SAVED_IN_CACHE); + tt_int_op(md3->saved_location, OP_EQ, SAVED_IN_CACHE); /* The journal should be empty now */ tor_free(s); s = read_file_to_str(fn, RFTS_BIN, NULL); - tt_str_op(s, ==, ""); + tt_str_op(s, OP_EQ, ""); tor_free(s); tor_free(fn); @@ -185,9 +185,9 @@ test_md_cache(void *data) tor_asprintf(&fn, "%s"PATH_SEPARATOR"cached-microdescs", options->DataDirectory); s = read_file_to_str(fn, RFTS_BIN, NULL); - tt_mem_op(md1->body, ==, s + md1->off, strlen(test_md1)); - tt_mem_op(md2->body, ==, s + md2->off, strlen(test_md2)); - tt_mem_op(md3->body, ==, s + md3->off, strlen(test_md3_noannotation)); + tt_mem_op(md1->body, OP_EQ, s + md1->off, strlen(test_md1)); + tt_mem_op(md2->body, OP_EQ, s + md2->off, strlen(test_md2)); + tt_mem_op(md3->body, OP_EQ, s + md3->off, strlen(test_md3_noannotation)); /* Okay, now we are going to forget about the cache entirely, and reload it * from the disk. */ @@ -199,41 +199,41 @@ test_md_cache(void *data) tt_assert(md1); tt_assert(md2); tt_assert(md3); - tt_mem_op(md1->body, ==, s + md1->off, strlen(test_md1)); - tt_mem_op(md2->body, ==, s + md2->off, strlen(test_md2)); - tt_mem_op(md3->body, ==, s + md3->off, strlen(test_md3_noannotation)); + tt_mem_op(md1->body, OP_EQ, s + md1->off, strlen(test_md1)); + tt_mem_op(md2->body, OP_EQ, s + md2->off, strlen(test_md2)); + tt_mem_op(md3->body, OP_EQ, s + md3->off, strlen(test_md3_noannotation)); - tt_int_op(md1->last_listed, ==, time1); - tt_int_op(md2->last_listed, ==, time2); - tt_int_op(md3->last_listed, ==, time3); + tt_int_op(md1->last_listed, OP_EQ, time1); + tt_int_op(md2->last_listed, OP_EQ, time2); + tt_int_op(md3->last_listed, OP_EQ, time3); /* Okay, now we are going to clear out everything older than a week old. * In practice, that means md3 */ microdesc_cache_clean(mc, time(NULL)-7*24*60*60, 1/*force*/); - tt_ptr_op(md1, ==, microdesc_cache_lookup_by_digest256(mc, d1)); - tt_ptr_op(md2, ==, microdesc_cache_lookup_by_digest256(mc, d2)); - tt_ptr_op(NULL, ==, microdesc_cache_lookup_by_digest256(mc, d3)); + tt_ptr_op(md1, OP_EQ, microdesc_cache_lookup_by_digest256(mc, d1)); + tt_ptr_op(md2, OP_EQ, microdesc_cache_lookup_by_digest256(mc, d2)); + tt_ptr_op(NULL, OP_EQ, microdesc_cache_lookup_by_digest256(mc, d3)); md3 = NULL; /* it's history now! */ /* rebuild again, make sure it stays gone. */ - tt_int_op(microdesc_cache_rebuild(mc, 1), ==, 0); - tt_ptr_op(md1, ==, microdesc_cache_lookup_by_digest256(mc, d1)); - tt_ptr_op(md2, ==, microdesc_cache_lookup_by_digest256(mc, d2)); - tt_ptr_op(NULL, ==, microdesc_cache_lookup_by_digest256(mc, d3)); + tt_int_op(microdesc_cache_rebuild(mc, 1), OP_EQ, 0); + tt_ptr_op(md1, OP_EQ, microdesc_cache_lookup_by_digest256(mc, d1)); + tt_ptr_op(md2, OP_EQ, microdesc_cache_lookup_by_digest256(mc, d2)); + tt_ptr_op(NULL, OP_EQ, microdesc_cache_lookup_by_digest256(mc, d3)); /* Re-add md3, and make sure we can rebuild the cache. */ added = microdescs_add_to_cache(mc, test_md3_noannotation, NULL, SAVED_NOWHERE, 0, time3, NULL); - tt_int_op(1, ==, smartlist_len(added)); + tt_int_op(1, OP_EQ, smartlist_len(added)); md3 = smartlist_get(added, 0); smartlist_free(added); added = NULL; - tt_int_op(md1->saved_location, ==, SAVED_IN_CACHE); - tt_int_op(md2->saved_location, ==, SAVED_IN_CACHE); - tt_int_op(md3->saved_location, ==, SAVED_IN_JOURNAL); + tt_int_op(md1->saved_location, OP_EQ, SAVED_IN_CACHE); + tt_int_op(md2->saved_location, OP_EQ, SAVED_IN_CACHE); + tt_int_op(md3->saved_location, OP_EQ, SAVED_IN_JOURNAL); - tt_int_op(microdesc_cache_rebuild(mc, 1), ==, 0); - tt_int_op(md3->saved_location, ==, SAVED_IN_CACHE); + tt_int_op(microdesc_cache_rebuild(mc, 1), OP_EQ, 0); + tt_int_op(md3->saved_location, OP_EQ, SAVED_IN_CACHE); done: if (options) @@ -273,9 +273,9 @@ test_md_cache_broken(void *data) options->DataDirectory = tor_strdup(get_fname("md_datadir_test2")); #ifdef _WIN32 - tt_int_op(0, ==, mkdir(options->DataDirectory)); + tt_int_op(0, OP_EQ, mkdir(options->DataDirectory)); #else - tt_int_op(0, ==, mkdir(options->DataDirectory, 0700)); + tt_int_op(0, OP_EQ, mkdir(options->DataDirectory, 0700)); #endif tor_asprintf(&fn, "%s"PATH_SEPARATOR"cached-microdescs", @@ -375,7 +375,7 @@ test_md_generate(void *arg) ri = router_parse_entry_from_string(test_ri, NULL, 0, 0, NULL, NULL); tt_assert(ri); md = dirvote_create_microdescriptor(ri, 8); - tt_str_op(md->body, ==, test_md_8); + tt_str_op(md->body, OP_EQ, test_md_8); /* XXXX test family lines. */ /* XXXX test method 14 for A lines. */ @@ -384,12 +384,12 @@ test_md_generate(void *arg) microdesc_free(md); md = NULL; md = dirvote_create_microdescriptor(ri, 16); - tt_str_op(md->body, ==, test_md_16); + tt_str_op(md->body, OP_EQ, test_md_16); microdesc_free(md); md = NULL; md = dirvote_create_microdescriptor(ri, 18); - tt_str_op(md->body, ==, test_md_18); + tt_str_op(md->body, OP_EQ, test_md_18); done: microdesc_free(md); @@ -564,8 +564,8 @@ test_md_parse(void *arg) smartlist_t *mds = microdescs_parse_from_string(MD_PARSE_TEST_DATA, NULL, 1, SAVED_NOWHERE, invalid); - tt_int_op(smartlist_len(mds), ==, 11); - tt_int_op(smartlist_len(invalid), ==, 4); + tt_int_op(smartlist_len(mds), OP_EQ, 11); + tt_int_op(smartlist_len(invalid), OP_EQ, 4); test_memeq_hex(smartlist_get(invalid,0), "5d76bf1c6614e885614a1e0ad074e1ab" @@ -585,11 +585,11 @@ test_md_parse(void *arg) test_memeq_hex(md->digest, "54bb6d733ddeb375d2456c79ae103961" "da0cae29620375ac4cf13d54da4d92b3"); - tt_int_op(md->last_listed, ==, 0); - tt_int_op(md->saved_location, ==, SAVED_NOWHERE); - tt_int_op(md->no_save, ==, 0); - tt_uint_op(md->held_in_map, ==, 0); - tt_uint_op(md->held_by_nodes, ==, 0); + tt_int_op(md->last_listed, OP_EQ, 0); + tt_int_op(md->saved_location, OP_EQ, SAVED_NOWHERE); + tt_int_op(md->no_save, OP_EQ, 0); + tt_uint_op(md->held_in_map, OP_EQ, 0); + tt_uint_op(md->held_by_nodes, OP_EQ, 0); tt_assert(md->onion_curve25519_pkey); md = smartlist_get(mds, 6); @@ -609,7 +609,7 @@ test_md_parse(void *arg) "409ebd87d23925a2732bd467a92813c9" "21ca378fcb9ca193d354c51550b6d5e9"); tt_assert(tor_addr_family(&md->ipv6_addr) == AF_INET6); - tt_int_op(md->ipv6_orport, ==, 9090); + tt_int_op(md->ipv6_orport, OP_EQ, 9090); done: SMARTLIST_FOREACH(mds, microdesc_t *, md, microdesc_free(md)); @@ -667,9 +667,9 @@ test_md_reject_cache(void *arg) mock_ns_val->flavor = FLAV_MICRODESC; #ifdef _WIN32 - tt_int_op(0, ==, mkdir(options->DataDirectory)); + tt_int_op(0, OP_EQ, mkdir(options->DataDirectory)); #else - tt_int_op(0, ==, mkdir(options->DataDirectory, 0700)); + tt_int_op(0, OP_EQ, mkdir(options->DataDirectory, 0700)); #endif MOCK(router_get_mutable_consensus_status_by_descriptor_digest, @@ -679,7 +679,7 @@ test_md_reject_cache(void *arg) mc = get_microdesc_cache(); #define ADD(hex) \ do { \ - tt_int_op(0,==,base16_decode(buf,sizeof(buf),hex,strlen(hex))); \ + tt_int_op(0,OP_EQ,base16_decode(buf,sizeof(buf),hex,strlen(hex))); \ smartlist_add(wanted, tor_memdup(buf, DIGEST256_LEN)); \ } while (0) @@ -695,16 +695,15 @@ test_md_reject_cache(void *arg) added = microdescs_add_to_cache(mc, MD_PARSE_TEST_DATA, NULL, SAVED_NOWHERE, 0, time(NULL), wanted); - tt_int_op(smartlist_len(added), ==, 2); - tt_int_op(mock_rgsbd_called, ==, 2); - tt_int_op(mock_rgsbd_val_a->dl_status.n_download_failures, ==, 255); - tt_int_op(mock_rgsbd_val_b->dl_status.n_download_failures, ==, 255); + tt_int_op(smartlist_len(added), OP_EQ, 2); + tt_int_op(mock_rgsbd_called, OP_EQ, 2); + tt_int_op(mock_rgsbd_val_a->dl_status.n_download_failures, OP_EQ, 255); + tt_int_op(mock_rgsbd_val_b->dl_status.n_download_failures, OP_EQ, 255); done: UNMOCK(networkstatus_get_latest_consensus_by_flavor); UNMOCK(router_get_mutable_consensus_status_by_descriptor_digest); - if (options) - tor_free(options->DataDirectory); + tor_free(options->DataDirectory); microdesc_free_all(); smartlist_free(added); SMARTLIST_FOREACH(wanted, char *, cp, tor_free(cp)); diff --git a/src/test/test_nodelist.c b/src/test/test_nodelist.c index 7c94084a02..a8693ec9b5 100644 --- a/src/test/test_nodelist.c +++ b/src/test/test_nodelist.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2007-2014, The Tor Project, Inc. */ +/* Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -10,7 +10,7 @@ #include "nodelist.h" #include "test.h" -/** Tese the case when node_get_by_id() returns NULL, +/** Test the case when node_get_by_id() returns NULL, * node_get_verbose_nickname_by_id should return the base 16 encoding * of the id. */ @@ -25,7 +25,7 @@ test_nodelist_node_get_verbose_nickname_by_id_null_node(void *arg) /* make sure node_get_by_id returns NULL */ tt_assert(!node_get_by_id(ID)); node_get_verbose_nickname_by_id(ID, vname); - tt_str_op(vname,==, "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"); + tt_str_op(vname,OP_EQ, "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"); done: return; } @@ -54,7 +54,7 @@ test_nodelist_node_get_verbose_nickname_not_named(void *arg) "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA", DIGEST_LEN); node_get_verbose_nickname(&mock_node, vname); - tt_str_op(vname,==, "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA~TestOR"); + tt_str_op(vname,OP_EQ, "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA~TestOR"); done: return; diff --git a/src/test/test_ntor_cl.c b/src/test/test_ntor_cl.c index 2899ad6710..955b508ef0 100644 --- a/src/test/test_ntor_cl.c +++ b/src/test/test_ntor_cl.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2014, The Tor Project, Inc. */ +/* Copyright (c) 2012-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" diff --git a/src/test/test_oom.c b/src/test/test_oom.c index 2726056b80..28b4c0435a 100644 --- a/src/test/test_oom.c +++ b/src/test/test_oom.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014, The Tor Project, Inc. */ +/* Copyright (c) 2014-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /* Unit tests for OOM handling logic */ @@ -151,9 +151,9 @@ test_oom_circbuf(void *arg) options->MaxMemInQueues = 256*packed_cell_mem_cost(); options->CellStatistics = 0; - tt_int_op(cell_queues_check_size(), ==, 0); /* We don't start out OOM. */ - tt_int_op(cell_queues_get_total_allocation(), ==, 0); - tt_int_op(buf_get_total_allocation(), ==, 0); + tt_int_op(cell_queues_check_size(), OP_EQ, 0); /* We don't start out OOM. */ + tt_int_op(cell_queues_get_total_allocation(), OP_EQ, 0); + tt_int_op(buf_get_total_allocation(), OP_EQ, 0); /* Now we're going to fake up some circuits and get them added to the global circuit list. */ @@ -165,21 +165,21 @@ test_oom_circbuf(void *arg) c2 = dummy_or_circuit_new(20, 20); #ifdef ENABLE_MEMPOOLS - tt_int_op(packed_cell_mem_cost(), ==, + tt_int_op(packed_cell_mem_cost(), OP_EQ, sizeof(packed_cell_t) + MP_POOL_ITEM_OVERHEAD); #else - tt_int_op(packed_cell_mem_cost(), ==, + tt_int_op(packed_cell_mem_cost(), OP_EQ, sizeof(packed_cell_t)); #endif /* ENABLE_MEMPOOLS */ - tt_int_op(cell_queues_get_total_allocation(), ==, + tt_int_op(cell_queues_get_total_allocation(), OP_EQ, packed_cell_mem_cost() * 70); - tt_int_op(cell_queues_check_size(), ==, 0); /* We are still not OOM */ + tt_int_op(cell_queues_check_size(), OP_EQ, 0); /* We are still not OOM */ tv.tv_usec = 20*1000; tor_gettimeofday_cache_set(&tv); c3 = dummy_or_circuit_new(100, 85); - tt_int_op(cell_queues_check_size(), ==, 0); /* We are still not OOM */ - tt_int_op(cell_queues_get_total_allocation(), ==, + tt_int_op(cell_queues_check_size(), OP_EQ, 0); /* We are still not OOM */ + tt_int_op(cell_queues_get_total_allocation(), OP_EQ, packed_cell_mem_cost() * 255); tv.tv_usec = 30*1000; @@ -187,17 +187,17 @@ test_oom_circbuf(void *arg) /* Adding this cell will trigger our OOM handler. */ c4 = dummy_or_circuit_new(2, 0); - tt_int_op(cell_queues_get_total_allocation(), ==, + tt_int_op(cell_queues_get_total_allocation(), OP_EQ, packed_cell_mem_cost() * 257); - tt_int_op(cell_queues_check_size(), ==, 1); /* We are now OOM */ + tt_int_op(cell_queues_check_size(), OP_EQ, 1); /* We are now OOM */ tt_assert(c1->marked_for_close); tt_assert(! c2->marked_for_close); tt_assert(! c3->marked_for_close); tt_assert(! c4->marked_for_close); - tt_int_op(cell_queues_get_total_allocation(), ==, + tt_int_op(cell_queues_get_total_allocation(), OP_EQ, packed_cell_mem_cost() * (257 - 30)); circuit_free(c1); @@ -208,14 +208,14 @@ test_oom_circbuf(void *arg) tv.tv_usec = 40*1000; /* go back to the future */ tor_gettimeofday_cache_set(&tv); - tt_int_op(cell_queues_check_size(), ==, 1); /* We are now OOM */ + tt_int_op(cell_queues_check_size(), OP_EQ, 1); /* We are now OOM */ tt_assert(c1->marked_for_close); tt_assert(! c2->marked_for_close); tt_assert(! c3->marked_for_close); tt_assert(! c4->marked_for_close); - tt_int_op(cell_queues_get_total_allocation(), ==, + tt_int_op(cell_queues_get_total_allocation(), OP_EQ, packed_cell_mem_cost() * (257 - 30)); done: @@ -250,9 +250,9 @@ test_oom_streambuf(void *arg) options->MaxMemInQueues = 81*packed_cell_mem_cost() + 4096 * 34; options->CellStatistics = 0; - tt_int_op(cell_queues_check_size(), ==, 0); /* We don't start out OOM. */ - tt_int_op(cell_queues_get_total_allocation(), ==, 0); - tt_int_op(buf_get_total_allocation(), ==, 0); + tt_int_op(cell_queues_check_size(), OP_EQ, 0); /* We don't start out OOM. */ + tt_int_op(cell_queues_get_total_allocation(), OP_EQ, 0); + tt_int_op(buf_get_total_allocation(), OP_EQ, 0); /* Start all circuits with a bit of data queued in cells */ tv.tv_usec = 500*1000; /* go halfway into the second. */ @@ -267,7 +267,7 @@ test_oom_streambuf(void *arg) tv.tv_usec = 530*1000; tor_gettimeofday_cache_set(&tv); c4 = dummy_or_circuit_new(0,0); - tt_int_op(cell_queues_get_total_allocation(), ==, + tt_int_op(cell_queues_get_total_allocation(), OP_EQ, packed_cell_mem_cost() * 80); tv.tv_usec = 600*1000; @@ -303,24 +303,24 @@ test_oom_streambuf(void *arg) tv.tv_usec = 0; tvms = (uint32_t) tv_to_msec(&tv); - tt_int_op(circuit_max_queued_cell_age(c1, tvms), ==, 500); - tt_int_op(circuit_max_queued_cell_age(c2, tvms), ==, 490); - tt_int_op(circuit_max_queued_cell_age(c3, tvms), ==, 480); - tt_int_op(circuit_max_queued_cell_age(c4, tvms), ==, 0); + tt_int_op(circuit_max_queued_cell_age(c1, tvms), OP_EQ, 500); + tt_int_op(circuit_max_queued_cell_age(c2, tvms), OP_EQ, 490); + tt_int_op(circuit_max_queued_cell_age(c3, tvms), OP_EQ, 480); + tt_int_op(circuit_max_queued_cell_age(c4, tvms), OP_EQ, 0); - tt_int_op(circuit_max_queued_data_age(c1, tvms), ==, 390); - tt_int_op(circuit_max_queued_data_age(c2, tvms), ==, 380); - tt_int_op(circuit_max_queued_data_age(c3, tvms), ==, 0); - tt_int_op(circuit_max_queued_data_age(c4, tvms), ==, 370); + tt_int_op(circuit_max_queued_data_age(c1, tvms), OP_EQ, 390); + tt_int_op(circuit_max_queued_data_age(c2, tvms), OP_EQ, 380); + tt_int_op(circuit_max_queued_data_age(c3, tvms), OP_EQ, 0); + tt_int_op(circuit_max_queued_data_age(c4, tvms), OP_EQ, 370); - tt_int_op(circuit_max_queued_item_age(c1, tvms), ==, 500); - tt_int_op(circuit_max_queued_item_age(c2, tvms), ==, 490); - tt_int_op(circuit_max_queued_item_age(c3, tvms), ==, 480); - tt_int_op(circuit_max_queued_item_age(c4, tvms), ==, 370); + tt_int_op(circuit_max_queued_item_age(c1, tvms), OP_EQ, 500); + tt_int_op(circuit_max_queued_item_age(c2, tvms), OP_EQ, 490); + tt_int_op(circuit_max_queued_item_age(c3, tvms), OP_EQ, 480); + tt_int_op(circuit_max_queued_item_age(c4, tvms), OP_EQ, 370); - tt_int_op(cell_queues_get_total_allocation(), ==, + tt_int_op(cell_queues_get_total_allocation(), OP_EQ, packed_cell_mem_cost() * 80); - tt_int_op(buf_get_total_allocation(), ==, 4096*16*2); + tt_int_op(buf_get_total_allocation(), OP_EQ, 4096*16*2); /* Now give c4 a very old buffer of modest size */ { @@ -332,21 +332,21 @@ test_oom_streambuf(void *arg) tt_assert(ec); smartlist_add(edgeconns, ec); } - tt_int_op(buf_get_total_allocation(), ==, 4096*17*2); - tt_int_op(circuit_max_queued_item_age(c4, tvms), ==, 1000); + tt_int_op(buf_get_total_allocation(), OP_EQ, 4096*17*2); + tt_int_op(circuit_max_queued_item_age(c4, tvms), OP_EQ, 1000); - tt_int_op(cell_queues_check_size(), ==, 0); + tt_int_op(cell_queues_check_size(), OP_EQ, 0); /* And run over the limit. */ tv.tv_usec = 800*1000; tor_gettimeofday_cache_set(&tv); c5 = dummy_or_circuit_new(0,5); - tt_int_op(cell_queues_get_total_allocation(), ==, + tt_int_op(cell_queues_get_total_allocation(), OP_EQ, packed_cell_mem_cost() * 85); - tt_int_op(buf_get_total_allocation(), ==, 4096*17*2); + tt_int_op(buf_get_total_allocation(), OP_EQ, 4096*17*2); - tt_int_op(cell_queues_check_size(), ==, 1); /* We are now OOM */ + tt_int_op(cell_queues_check_size(), OP_EQ, 1); /* We are now OOM */ /* C4 should have died. */ tt_assert(! c1->marked_for_close); @@ -355,9 +355,9 @@ test_oom_streambuf(void *arg) tt_assert(c4->marked_for_close); tt_assert(! c5->marked_for_close); - tt_int_op(cell_queues_get_total_allocation(), ==, + tt_int_op(cell_queues_get_total_allocation(), OP_EQ, packed_cell_mem_cost() * 85); - tt_int_op(buf_get_total_allocation(), ==, 4096*8*2); + tt_int_op(buf_get_total_allocation(), OP_EQ, 4096*8*2); done: circuit_free(c1); diff --git a/src/test/test_options.c b/src/test/test_options.c index 57ab38c027..a8ebadb14b 100644 --- a/src/test/test_options.c +++ b/src/test/test_options.c @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define CONFIG_PRIVATE @@ -87,10 +87,10 @@ test_options_validate_impl(const char *configuration, clear_log_messages(); r = config_get_lines(configuration, &cl, 1); - tt_int_op(r, ==, 0); + tt_int_op(r, OP_EQ, 0); r = config_assign(&options_format, opt, cl, 0, 0, &msg); - tt_int_op(r, ==, 0); + tt_int_op(r, OP_EQ, 0); r = options_validate(NULL, opt, dflt, 0, &msg); if (expect_errmsg && !msg) { @@ -103,7 +103,7 @@ test_options_validate_impl(const char *configuration, TT_DIE(("Expected no error message from <%s> but got <%s>.", configuration, msg)); } - tt_int_op((r == 0), ==, (msg == NULL)); + tt_int_op((r == 0), OP_EQ, (msg == NULL)); if (expect_log) { int found = 0; diff --git a/src/test/test_policy.c b/src/test/test_policy.c index c043ac6e3a..33f90c7da5 100644 --- a/src/test/test_policy.c +++ b/src/test/test_policy.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2014, The Tor Project, Inc. */ +/* Copyright (c) 2013-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "or.h" @@ -22,7 +22,7 @@ test_short_policy_parse(const char *input, short_policy = parse_short_policy(input); tt_assert(short_policy); out = write_short_policy(short_policy); - tt_str_op(out, ==, expected); + tt_str_op(out, OP_EQ, expected); done: tor_free(out); @@ -50,17 +50,17 @@ test_policy_summary_helper(const char *policy_str, r = policies_parse_exit_policy(&line, &policy, EXIT_POLICY_IPV6_ENABLED | EXIT_POLICY_ADD_DEFAULT ,0); - tt_int_op(r,==, 0); + tt_int_op(r,OP_EQ, 0); summary = policy_summarize(policy, AF_INET); tt_assert(summary != NULL); - tt_str_op(summary,==, expected_summary); + tt_str_op(summary,OP_EQ, expected_summary); short_policy = parse_short_policy(summary); tt_assert(short_policy); summary_after = write_short_policy(short_policy); - tt_str_op(summary,==, summary_after); + tt_str_op(summary,OP_EQ, summary_after); done: tor_free(summary_after); @@ -90,12 +90,12 @@ test_policies_general(void *arg) p = router_parse_addr_policy_item_from_string("reject 192.168.0.0/16:*",-1); tt_assert(p != NULL); - tt_int_op(ADDR_POLICY_REJECT,==, p->policy_type); + tt_int_op(ADDR_POLICY_REJECT,OP_EQ, p->policy_type); tor_addr_from_ipv4h(&tar, 0xc0a80000u); - tt_int_op(0,==, tor_addr_compare(&p->addr, &tar, CMP_EXACT)); - tt_int_op(16,==, p->maskbits); - tt_int_op(1,==, p->prt_min); - tt_int_op(65535,==, p->prt_max); + tt_int_op(0,OP_EQ, tor_addr_compare(&p->addr, &tar, CMP_EXACT)); + tt_int_op(16,OP_EQ, p->maskbits); + tt_int_op(1,OP_EQ, p->prt_min); + tt_int_op(65535,OP_EQ, p->prt_max); smartlist_add(policy, p); @@ -109,7 +109,7 @@ test_policies_general(void *arg) tt_assert(ADDR_POLICY_REJECTED == compare_tor_addr_to_addr_policy(&tar, 2, policy)); - tt_int_op(0, ==, policies_parse_exit_policy(NULL, &policy2, + tt_int_op(0, OP_EQ, policies_parse_exit_policy(NULL, &policy2, EXIT_POLICY_IPV6_ENABLED | EXIT_POLICY_REJECT_PRIVATE | EXIT_POLICY_ADD_DEFAULT, 0)); @@ -200,14 +200,14 @@ test_policies_general(void *arg) line.key = (char*)"foo"; line.value = (char*)"accept *:80,reject private:*,reject *:*"; line.next = NULL; - tt_int_op(0, ==, policies_parse_exit_policy(&line,&policy, + tt_int_op(0, OP_EQ, policies_parse_exit_policy(&line,&policy, EXIT_POLICY_IPV6_ENABLED | EXIT_POLICY_ADD_DEFAULT,0)); tt_assert(policy); //test_streq(policy->string, "accept *:80"); //test_streq(policy->next->string, "reject *:*"); - tt_int_op(smartlist_len(policy),==, 4); + tt_int_op(smartlist_len(policy),OP_EQ, 4); /* test policy summaries */ /* check if we properly ignore private IP addresses */ @@ -281,7 +281,7 @@ test_policies_general(void *arg) /* Try parsing various broken short policies */ #define TT_BAD_SHORT_POLICY(s) \ do { \ - tt_ptr_op(NULL, ==, (short_parsed = parse_short_policy((s)))); \ + tt_ptr_op(NULL, OP_EQ, (short_parsed = parse_short_policy((s)))); \ } while (0) TT_BAD_SHORT_POLICY("accept 200-199"); TT_BAD_SHORT_POLICY(""); @@ -311,7 +311,7 @@ test_policies_general(void *arg) smartlist_free(chunks); short_parsed = parse_short_policy(policy);/* shouldn't be accepted */ tor_free(policy); - tt_ptr_op(NULL, ==, short_parsed); + tt_ptr_op(NULL, OP_EQ, short_parsed); } /* truncation ports */ @@ -369,7 +369,7 @@ test_dump_exit_policy_to_string(void *arg) ri->exit_policy = NULL; // expecting "reject *:*" ep = router_dump_exit_policy_to_string(ri,1,1); - tt_str_op("reject *:*",==, ep); + tt_str_op("reject *:*",OP_EQ, ep); tor_free(ep); @@ -382,7 +382,7 @@ test_dump_exit_policy_to_string(void *arg) ep = router_dump_exit_policy_to_string(ri,1,1); - tt_str_op("accept *:*",==, ep); + tt_str_op("accept *:*",OP_EQ, ep); tor_free(ep); @@ -392,7 +392,7 @@ test_dump_exit_policy_to_string(void *arg) ep = router_dump_exit_policy_to_string(ri,1,1); - tt_str_op("accept *:*\nreject *:25",==, ep); + tt_str_op("accept *:*\nreject *:25",OP_EQ, ep); tor_free(ep); @@ -403,7 +403,7 @@ test_dump_exit_policy_to_string(void *arg) ep = router_dump_exit_policy_to_string(ri,1,1); - tt_str_op("accept *:*\nreject *:25\nreject 8.8.8.8:*",==, ep); + tt_str_op("accept *:*\nreject *:25\nreject 8.8.8.8:*",OP_EQ, ep); tor_free(ep); policy_entry = @@ -414,7 +414,7 @@ test_dump_exit_policy_to_string(void *arg) ep = router_dump_exit_policy_to_string(ri,1,1); tt_str_op("accept *:*\nreject *:25\nreject 8.8.8.8:*\n" - "reject6 [fc00::]/7:*",==, ep); + "reject6 [fc00::]/7:*",OP_EQ, ep); tor_free(ep); policy_entry = @@ -425,7 +425,7 @@ test_dump_exit_policy_to_string(void *arg) ep = router_dump_exit_policy_to_string(ri,1,1); tt_str_op("accept *:*\nreject *:25\nreject 8.8.8.8:*\n" - "reject6 [fc00::]/7:*\naccept6 [c000::]/3:*",==, ep); + "reject6 [fc00::]/7:*\naccept6 [c000::]/3:*",OP_EQ, ep); done: diff --git a/src/test/test_pt.c b/src/test/test_pt.c index 1be52ee5bd..996ef8666b 100644 --- a/src/test/test_pt.c +++ b/src/test/test_pt.c @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" @@ -69,7 +69,7 @@ test_pt_parsing(void *arg) /* test registered SOCKS version of transport */ tt_assert(transport->socks_version == PROXY_SOCKS5); /* test registered name of transport */ - tt_str_op(transport->name,==, "trebuchet"); + tt_str_op(transport->name,OP_EQ, "trebuchet"); reset_mp(mp); @@ -96,7 +96,7 @@ test_pt_parsing(void *arg) /* test registered port of transport */ tt_assert(transport->port == 2999); /* test registered name of transport */ - tt_str_op(transport->name,==, "trebuchy"); + tt_str_op(transport->name,OP_EQ, "trebuchy"); reset_mp(mp); @@ -105,14 +105,14 @@ test_pt_parsing(void *arg) "ARGS:counterweight=3,sling=snappy", sizeof(line)); tt_assert(parse_smethod_line(line, mp) == 0); - tt_int_op(1, ==, smartlist_len(mp->transports)); + tt_int_op(1, OP_EQ, smartlist_len(mp->transports)); { const transport_t *transport = smartlist_get(mp->transports, 0); tt_assert(transport); - tt_str_op(transport->name, ==, "trebuchet"); - tt_int_op(transport->port, ==, 9999); - tt_str_op(fmt_addr(&transport->addr), ==, "127.0.0.1"); - tt_str_op(transport->extra_info_args, ==, + tt_str_op(transport->name, OP_EQ, "trebuchet"); + tt_int_op(transport->port, OP_EQ, 9999); + tt_str_op(fmt_addr(&transport->addr), OP_EQ, "127.0.0.1"); + tt_str_op(transport->extra_info_args, OP_EQ, "counterweight=3,sling=snappy"); } reset_mp(mp); @@ -151,9 +151,9 @@ test_pt_get_transport_options(void *arg) execve_args[1] = NULL; mp = managed_proxy_create(transport_list, execve_args, 1); - tt_ptr_op(mp, !=, NULL); + tt_ptr_op(mp, OP_NE, NULL); opt_str = get_transport_options_for_server_proxy(mp); - tt_ptr_op(opt_str, ==, NULL); + tt_ptr_op(opt_str, OP_EQ, NULL); smartlist_add(mp->transports_to_launch, tor_strdup("gruyere")); smartlist_add(mp->transports_to_launch, tor_strdup("roquefort")); @@ -176,7 +176,7 @@ test_pt_get_transport_options(void *arg) options->ServerTransportOptions = cl; opt_str = get_transport_options_for_server_proxy(mp); - tt_str_op(opt_str, ==, + tt_str_op(opt_str, OP_EQ, "gruyere:melty=10;gruyere:hardness=se\\;ven;" "stnectaire:melty=4;stnectaire:hardness=three"); @@ -262,17 +262,17 @@ test_pt_get_extrainfo_string(void *arg) mp2 = managed_proxy_create(t2, argv2, 1); r = parse_smethod_line("SMETHOD hagbard 127.0.0.1:5555", mp1); - tt_int_op(r, ==, 0); + tt_int_op(r, OP_EQ, 0); r = parse_smethod_line("SMETHOD celine 127.0.0.1:1723 ARGS:card=no-enemy", mp2); - tt_int_op(r, ==, 0); + tt_int_op(r, OP_EQ, 0); /* Force these proxies to look "completed" or they won't generate output. */ mp1->conf_state = mp2->conf_state = PT_PROTO_COMPLETED; s = pt_get_extra_info_descriptor_string(); tt_assert(s); - tt_str_op(s, ==, + tt_str_op(s, OP_EQ, "transport hagbard 127.0.0.1:5555\n" "transport celine 127.0.0.1:1723 card=no-enemy\n"); @@ -380,7 +380,7 @@ test_pt_configure_proxy(void *arg) for (i = 0 ; i < 5 ; i++) { retval = configure_proxy(mp); /* retval should be zero because proxy hasn't finished configuring yet */ - tt_int_op(retval, ==, 0); + tt_int_op(retval, OP_EQ, 0); /* check the number of registered transports */ tt_assert(smartlist_len(mp->transports) == i+1); /* check that the mp is still waiting for transports */ @@ -390,23 +390,23 @@ test_pt_configure_proxy(void *arg) /* this last configure_proxy() should finalize the proxy configuration. */ retval = configure_proxy(mp); /* retval should be 1 since the proxy finished configuring */ - tt_int_op(retval, ==, 1); + tt_int_op(retval, OP_EQ, 1); /* check the mp state */ tt_assert(mp->conf_state == PT_PROTO_COMPLETED); - tt_int_op(controlevent_n, ==, 5); - tt_int_op(controlevent_event, ==, EVENT_TRANSPORT_LAUNCHED); - tt_int_op(smartlist_len(controlevent_msgs), ==, 5); + tt_int_op(controlevent_n, OP_EQ, 5); + tt_int_op(controlevent_event, OP_EQ, EVENT_TRANSPORT_LAUNCHED); + tt_int_op(smartlist_len(controlevent_msgs), OP_EQ, 5); smartlist_sort_strings(controlevent_msgs); - tt_str_op(smartlist_get(controlevent_msgs, 0), ==, + tt_str_op(smartlist_get(controlevent_msgs, 0), OP_EQ, "650 TRANSPORT_LAUNCHED server mock1 127.0.0.1 5551\r\n"); - tt_str_op(smartlist_get(controlevent_msgs, 1), ==, + tt_str_op(smartlist_get(controlevent_msgs, 1), OP_EQ, "650 TRANSPORT_LAUNCHED server mock2 127.0.0.1 5552\r\n"); - tt_str_op(smartlist_get(controlevent_msgs, 2), ==, + tt_str_op(smartlist_get(controlevent_msgs, 2), OP_EQ, "650 TRANSPORT_LAUNCHED server mock3 127.0.0.1 5553\r\n"); - tt_str_op(smartlist_get(controlevent_msgs, 3), ==, + tt_str_op(smartlist_get(controlevent_msgs, 3), OP_EQ, "650 TRANSPORT_LAUNCHED server mock4 127.0.0.1 5554\r\n"); - tt_str_op(smartlist_get(controlevent_msgs, 4), ==, + tt_str_op(smartlist_get(controlevent_msgs, 4), OP_EQ, "650 TRANSPORT_LAUNCHED server mock5 127.0.0.1 5555\r\n"); { /* check that the transport info were saved properly in the tor state */ @@ -423,8 +423,8 @@ test_pt_configure_proxy(void *arg) NULL, 0, 0); name_of_transport = smartlist_get(transport_info_sl, 0); bindaddr = smartlist_get(transport_info_sl, 1); - tt_str_op(name_of_transport, ==, "mock1"); - tt_str_op(bindaddr, ==, "127.0.0.1:5551"); + tt_str_op(name_of_transport, OP_EQ, "mock1"); + tt_str_op(bindaddr, OP_EQ, "127.0.0.1:5551"); SMARTLIST_FOREACH(transport_info_sl, char *, cp, tor_free(cp)); smartlist_free(transport_info_sl); @@ -470,9 +470,9 @@ test_get_pt_proxy_uri(void *arg) ret = tor_addr_port_lookup(options->Socks4Proxy, &options->Socks4ProxyAddr, &options->Socks4ProxyPort); - tt_int_op(ret, ==, 0); + tt_int_op(ret, OP_EQ, 0); uri = get_pt_proxy_uri(); - tt_str_op(uri, ==, "socks4a://192.0.2.1:1080"); + tt_str_op(uri, OP_EQ, "socks4a://192.0.2.1:1080"); tor_free(uri); tor_free(options->Socks4Proxy); @@ -481,16 +481,16 @@ test_get_pt_proxy_uri(void *arg) ret = tor_addr_port_lookup(options->Socks5Proxy, &options->Socks5ProxyAddr, &options->Socks5ProxyPort); - tt_int_op(ret, ==, 0); + tt_int_op(ret, OP_EQ, 0); uri = get_pt_proxy_uri(); - tt_str_op(uri, ==, "socks5://192.0.2.1:1080"); + tt_str_op(uri, OP_EQ, "socks5://192.0.2.1:1080"); tor_free(uri); /* Test with a SOCKS5 proxy, with username/password. */ options->Socks5ProxyUsername = tor_strdup("hwest"); options->Socks5ProxyPassword = tor_strdup("r34n1m470r"); uri = get_pt_proxy_uri(); - tt_str_op(uri, ==, "socks5://hwest:r34n1m470r@192.0.2.1:1080"); + tt_str_op(uri, OP_EQ, "socks5://hwest:r34n1m470r@192.0.2.1:1080"); tor_free(uri); tor_free(options->Socks5Proxy); tor_free(options->Socks5ProxyUsername); @@ -501,15 +501,15 @@ test_get_pt_proxy_uri(void *arg) ret = tor_addr_port_lookup(options->HTTPSProxy, &options->HTTPSProxyAddr, &options->HTTPSProxyPort); - tt_int_op(ret, ==, 0); + tt_int_op(ret, OP_EQ, 0); uri = get_pt_proxy_uri(); - tt_str_op(uri, ==, "http://192.0.2.1:80"); + tt_str_op(uri, OP_EQ, "http://192.0.2.1:80"); tor_free(uri); /* Test with a HTTPS proxy, with authenticator. */ options->HTTPSProxyAuthenticator = tor_strdup("hwest:r34n1m470r"); uri = get_pt_proxy_uri(); - tt_str_op(uri, ==, "http://hwest:r34n1m470r@192.0.2.1:80"); + tt_str_op(uri, OP_EQ, "http://hwest:r34n1m470r@192.0.2.1:80"); tor_free(uri); tor_free(options->HTTPSProxy); tor_free(options->HTTPSProxyAuthenticator); @@ -519,9 +519,9 @@ test_get_pt_proxy_uri(void *arg) ret = tor_addr_port_lookup(options->Socks4Proxy, &options->Socks4ProxyAddr, &options->Socks4ProxyPort); - tt_int_op(ret, ==, 0); + tt_int_op(ret, OP_EQ, 0); uri = get_pt_proxy_uri(); - tt_str_op(uri, ==, "socks4a://[2001:db8::1]:1080"); + tt_str_op(uri, OP_EQ, "socks4a://[2001:db8::1]:1080"); tor_free(uri); tor_free(options->Socks4Proxy); diff --git a/src/test/test_relay.c b/src/test/test_relay.c new file mode 100644 index 0000000000..2144ef335e --- /dev/null +++ b/src/test/test_relay.c @@ -0,0 +1,134 @@ +/* Copyright (c) 2014-2015, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "or.h" +#define CIRCUITBUILD_PRIVATE +#include "circuitbuild.h" +#define RELAY_PRIVATE +#include "relay.h" +/* For init/free stuff */ +#include "scheduler.h" + +/* Test suite stuff */ +#include "test.h" +#include "fakechans.h" + +static or_circuit_t * new_fake_orcirc(channel_t *nchan, channel_t *pchan); + +static void test_relay_append_cell_to_circuit_queue(void *arg); + +static or_circuit_t * +new_fake_orcirc(channel_t *nchan, channel_t *pchan) +{ + or_circuit_t *orcirc = NULL; + circuit_t *circ = NULL; + + orcirc = tor_malloc_zero(sizeof(*orcirc)); + circ = &(orcirc->base_); + circ->magic = OR_CIRCUIT_MAGIC; + + circ->n_chan = nchan; + circ->n_circ_id = get_unique_circ_id_by_chan(nchan); + circ->n_mux = NULL; /* ?? */ + cell_queue_init(&(circ->n_chan_cells)); + circ->n_hop = NULL; + circ->streams_blocked_on_n_chan = 0; + circ->streams_blocked_on_p_chan = 0; + circ->n_delete_pending = 0; + circ->p_delete_pending = 0; + circ->received_destroy = 0; + circ->state = CIRCUIT_STATE_OPEN; + circ->purpose = CIRCUIT_PURPOSE_OR; + circ->package_window = CIRCWINDOW_START_MAX; + circ->deliver_window = CIRCWINDOW_START_MAX; + circ->n_chan_create_cell = NULL; + + orcirc->p_chan = pchan; + orcirc->p_circ_id = get_unique_circ_id_by_chan(pchan); + cell_queue_init(&(orcirc->p_chan_cells)); + + return orcirc; +} + +static void +test_relay_append_cell_to_circuit_queue(void *arg) +{ + channel_t *nchan = NULL, *pchan = NULL; + or_circuit_t *orcirc = NULL; + cell_t *cell = NULL; + int old_count, new_count; + + (void)arg; + + /* We'll need the cell pool for append_cell_to_circuit_queue() to work */ +#ifdef ENABLE_MEMPOOLS + init_cell_pool(); +#endif /* ENABLE_MEMPOOLS */ + + /* Make fake channels to be nchan and pchan for the circuit */ + nchan = new_fake_channel(); + tt_assert(nchan); + + pchan = new_fake_channel(); + tt_assert(pchan); + + /* We'll need chans with working cmuxes */ + nchan->cmux = circuitmux_alloc(); + pchan->cmux = circuitmux_alloc(); + + /* Make a fake orcirc */ + orcirc = new_fake_orcirc(nchan, pchan); + tt_assert(orcirc); + + /* Make a cell */ + cell = tor_malloc_zero(sizeof(cell_t)); + make_fake_cell(cell); + + MOCK(scheduler_channel_has_waiting_cells, + scheduler_channel_has_waiting_cells_mock); + + /* Append it */ + old_count = get_mock_scheduler_has_waiting_cells_count(); + append_cell_to_circuit_queue(TO_CIRCUIT(orcirc), nchan, cell, + CELL_DIRECTION_OUT, 0); + new_count = get_mock_scheduler_has_waiting_cells_count(); + tt_int_op(new_count, ==, old_count + 1); + + /* Now try the reverse direction */ + old_count = get_mock_scheduler_has_waiting_cells_count(); + append_cell_to_circuit_queue(TO_CIRCUIT(orcirc), pchan, cell, + CELL_DIRECTION_IN, 0); + new_count = get_mock_scheduler_has_waiting_cells_count(); + tt_int_op(new_count, ==, old_count + 1); + + UNMOCK(scheduler_channel_has_waiting_cells); + + /* Get rid of the fake channels */ + MOCK(scheduler_release_channel, scheduler_release_channel_mock); + channel_mark_for_close(nchan); + channel_mark_for_close(pchan); + UNMOCK(scheduler_release_channel); + + /* Shut down channels */ + channel_free_all(); + + done: + tor_free(cell); + cell_queue_clear(&orcirc->base_.n_chan_cells); + cell_queue_clear(&orcirc->p_chan_cells); + tor_free(orcirc); + free_fake_channel(nchan); + free_fake_channel(pchan); +#ifdef ENABLE_MEMPOOLS + free_cell_pool(); +#endif /* ENABLE_MEMPOOLS */ + + return; +} + +struct testcase_t relay_tests[] = { + { "append_cell_to_circuit_queue", test_relay_append_cell_to_circuit_queue, + TT_FORK, NULL, NULL }, + END_OF_TESTCASES +}; + diff --git a/src/test/test_relaycell.c b/src/test/test_relaycell.c index 5deb36260f..0a6fef729c 100644 --- a/src/test/test_relaycell.c +++ b/src/test/test_relaycell.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014, The Tor Project, Inc. */ +/* Copyright (c) 2014-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /* Unit tests for handling different kinds of relay cell */ @@ -87,24 +87,24 @@ test_relaycell_resolved(void *arg) srm_ncalls = mum_ncalls = 0; \ } while (0) #define ASSERT_MARK_CALLED(reason) do { \ - tt_int_op(mum_ncalls, ==, 1); \ - tt_ptr_op(mum_conn, ==, entryconn); \ - tt_int_op(mum_endreason, ==, (reason)); \ + tt_int_op(mum_ncalls, OP_EQ, 1); \ + tt_ptr_op(mum_conn, OP_EQ, entryconn); \ + tt_int_op(mum_endreason, OP_EQ, (reason)); \ } while (0) #define ASSERT_RESOLVED_CALLED(atype, answer, ttl, expires) do { \ - tt_int_op(srm_ncalls, ==, 1); \ - tt_ptr_op(srm_conn, ==, entryconn); \ - tt_int_op(srm_atype, ==, (atype)); \ + tt_int_op(srm_ncalls, OP_EQ, 1); \ + tt_ptr_op(srm_conn, OP_EQ, entryconn); \ + tt_int_op(srm_atype, OP_EQ, (atype)); \ if (answer) { \ - tt_int_op(srm_alen, ==, sizeof(answer)-1); \ - tt_int_op(srm_alen, <, 512); \ - tt_int_op(srm_answer_is_set, ==, 1); \ - tt_mem_op(srm_answer, ==, answer, sizeof(answer)-1); \ + tt_int_op(srm_alen, OP_EQ, sizeof(answer)-1); \ + tt_int_op(srm_alen, OP_LT, 512); \ + tt_int_op(srm_answer_is_set, OP_EQ, 1); \ + tt_mem_op(srm_answer, OP_EQ, answer, sizeof(answer)-1); \ } else { \ - tt_int_op(srm_answer_is_set, ==, 0); \ + tt_int_op(srm_answer_is_set, OP_EQ, 0); \ } \ - tt_int_op(srm_ttl, ==, ttl); \ - tt_int_op(srm_expires, ==, expires); \ + tt_int_op(srm_ttl, OP_EQ, ttl); \ + tt_i64_op(srm_expires, OP_EQ, expires); \ } while (0) (void)arg; @@ -130,21 +130,21 @@ test_relaycell_resolved(void *arg) /* Try with connection in non-RESOLVE_WAIT state: cell gets ignored */ MOCK_RESET(); r = connection_edge_process_resolved_cell(edgeconn, &cell, &rh); - tt_int_op(r, ==, 0); - tt_int_op(srm_ncalls, ==, 0); - tt_int_op(mum_ncalls, ==, 0); + tt_int_op(r, OP_EQ, 0); + tt_int_op(srm_ncalls, OP_EQ, 0); + tt_int_op(mum_ncalls, OP_EQ, 0); /* Now put it in the right state. */ ENTRY_TO_CONN(entryconn)->state = AP_CONN_STATE_RESOLVE_WAIT; entryconn->socks_request->command = SOCKS_COMMAND_RESOLVE; - entryconn->ipv4_traffic_ok = 1; - entryconn->ipv6_traffic_ok = 1; - entryconn->prefer_ipv6_traffic = 0; + entryconn->entry_cfg.ipv4_traffic = 1; + entryconn->entry_cfg.ipv6_traffic = 1; + entryconn->entry_cfg.prefer_ipv6 = 0; /* We prefer ipv4, so we should get the first ipv4 answer */ MOCK_RESET(); r = connection_edge_process_resolved_cell(edgeconn, &cell, &rh); - tt_int_op(r, ==, 0); + tt_int_op(r, OP_EQ, 0); ASSERT_MARK_CALLED(END_STREAM_REASON_DONE| END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED); ASSERT_RESOLVED_CALLED(RESOLVED_TYPE_IPV4, "\x7f\x00\x01\x02", 256, -1); @@ -153,16 +153,16 @@ test_relaycell_resolved(void *arg) MOCK_RESET(); options->ClientDNSRejectInternalAddresses = 1; r = connection_edge_process_resolved_cell(edgeconn, &cell, &rh); - tt_int_op(r, ==, 0); + tt_int_op(r, OP_EQ, 0); ASSERT_MARK_CALLED(END_STREAM_REASON_DONE| END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED); ASSERT_RESOLVED_CALLED(RESOLVED_TYPE_IPV4, "\x12\x00\x00\x01", 512, -1); /* now prefer ipv6, and get the first ipv6 answer */ - entryconn->prefer_ipv6_traffic = 1; + entryconn->entry_cfg.prefer_ipv6 = 1; MOCK_RESET(); r = connection_edge_process_resolved_cell(edgeconn, &cell, &rh); - tt_int_op(r, ==, 0); + tt_int_op(r, OP_EQ, 0); ASSERT_MARK_CALLED(END_STREAM_REASON_DONE| END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED); ASSERT_RESOLVED_CALLED(RESOLVED_TYPE_IPV6, @@ -174,7 +174,7 @@ test_relaycell_resolved(void *arg) MOCK_RESET(); SET_CELL("\x04\x04\x12\x00\x00\x01\x00\x00\x02\x00"); r = connection_edge_process_resolved_cell(edgeconn, &cell, &rh); - tt_int_op(r, ==, 0); + tt_int_op(r, OP_EQ, 0); ASSERT_MARK_CALLED(END_STREAM_REASON_DONE| END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED); ASSERT_RESOLVED_CALLED(RESOLVED_TYPE_IPV4, "\x12\x00\x00\x01", 512, -1); @@ -182,19 +182,19 @@ test_relaycell_resolved(void *arg) /* But if we don't allow IPv4, we report nothing if the cell contains only * ipv4 */ MOCK_RESET(); - entryconn->ipv4_traffic_ok = 0; + entryconn->entry_cfg.ipv4_traffic = 0; r = connection_edge_process_resolved_cell(edgeconn, &cell, &rh); - tt_int_op(r, ==, 0); + tt_int_op(r, OP_EQ, 0); ASSERT_MARK_CALLED(END_STREAM_REASON_DONE| END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED); ASSERT_RESOLVED_CALLED(RESOLVED_TYPE_ERROR, NULL, -1, -1); /* If we wanted hostnames, we report nothing, since we only had IPs. */ MOCK_RESET(); - entryconn->ipv4_traffic_ok = 1; + entryconn->entry_cfg.ipv4_traffic = 1; entryconn->socks_request->command = SOCKS_COMMAND_RESOLVE_PTR; r = connection_edge_process_resolved_cell(edgeconn, &cell, &rh); - tt_int_op(r, ==, 0); + tt_int_op(r, OP_EQ, 0); ASSERT_MARK_CALLED(END_STREAM_REASON_DONE| END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED); ASSERT_RESOLVED_CALLED(RESOLVED_TYPE_ERROR, NULL, -1, -1); @@ -203,7 +203,7 @@ test_relaycell_resolved(void *arg) MOCK_RESET(); SET_CELL("\x00\x0fwww.example.com\x00\x01\x00\x00"); r = connection_edge_process_resolved_cell(edgeconn, &cell, &rh); - tt_int_op(r, ==, 0); + tt_int_op(r, OP_EQ, 0); ASSERT_MARK_CALLED(END_STREAM_REASON_DONE| END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED); ASSERT_RESOLVED_CALLED(RESOLVED_TYPE_HOSTNAME, "www.example.com", 65536, -1); @@ -213,9 +213,9 @@ test_relaycell_resolved(void *arg) entryconn->socks_request->command = SOCKS_COMMAND_RESOLVE; SET_CELL("\x04\x04\x01\x02\x03\x04"); /* no ttl */ r = connection_edge_process_resolved_cell(edgeconn, &cell, &rh); - tt_int_op(r, ==, 0); + tt_int_op(r, OP_EQ, 0); ASSERT_MARK_CALLED(END_STREAM_REASON_TORPROTOCOL); - tt_int_op(srm_ncalls, ==, 0); + tt_int_op(srm_ncalls, OP_EQ, 0); /* error on all addresses private */ MOCK_RESET(); @@ -224,7 +224,7 @@ test_relaycell_resolved(void *arg) /* IPv4: 192.168.1.1, ttl 256 */ "\x04\x04\xc0\xa8\x01\x01\x00\x00\x01\x00"); r = connection_edge_process_resolved_cell(edgeconn, &cell, &rh); - tt_int_op(r, ==, 0); + tt_int_op(r, OP_EQ, 0); ASSERT_MARK_CALLED(END_STREAM_REASON_TORPROTOCOL); ASSERT_RESOLVED_CALLED(RESOLVED_TYPE_ERROR_TRANSIENT, NULL, 0, TIME_MAX); @@ -232,7 +232,7 @@ test_relaycell_resolved(void *arg) MOCK_RESET(); SET_CELL("\xf0\x15" "quiet and meaningless" "\x00\x00\x0f\xff"); r = connection_edge_process_resolved_cell(edgeconn, &cell, &rh); - tt_int_op(r, ==, 0); + tt_int_op(r, OP_EQ, 0); ASSERT_MARK_CALLED(END_STREAM_REASON_DONE| END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED); ASSERT_RESOLVED_CALLED(RESOLVED_TYPE_ERROR_TRANSIENT, NULL, -1, -1); diff --git a/src/test/test_replay.c b/src/test/test_replay.c index bb8017d261..a02c160365 100644 --- a/src/test/test_replay.c +++ b/src/test/test_replay.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2014, The Tor Project, Inc. */ +/* Copyright (c) 2012-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define REPLAYCACHE_PRIVATE @@ -44,7 +44,7 @@ test_replaycache_badalloc(void *arg) /* Negative interval should get adjusted to zero */ r = replaycache_new(600, -300); tt_assert(r != NULL); - tt_int_op(r->scrub_interval,==, 0); + tt_int_op(r->scrub_interval,OP_EQ, 0); replaycache_free(r); /* Negative horizon and negative interval should still fail */ r = replaycache_new(-600, -300); @@ -81,13 +81,13 @@ test_replaycache_miss(void *arg) result = replaycache_add_and_test_internal(1200, r, test_buffer, strlen(test_buffer), NULL); - tt_int_op(result,==, 0); + tt_int_op(result,OP_EQ, 0); /* poke the bad-parameter error case too */ result = replaycache_add_and_test_internal(1200, NULL, test_buffer, strlen(test_buffer), NULL); - tt_int_op(result,==, 0); + tt_int_op(result,OP_EQ, 0); done: if (r) replaycache_free(r); @@ -108,12 +108,12 @@ test_replaycache_hit(void *arg) result = replaycache_add_and_test_internal(1200, r, test_buffer, strlen(test_buffer), NULL); - tt_int_op(result,==, 0); + tt_int_op(result,OP_EQ, 0); result = replaycache_add_and_test_internal(1300, r, test_buffer, strlen(test_buffer), NULL); - tt_int_op(result,==, 1); + tt_int_op(result,OP_EQ, 1); done: if (r) replaycache_free(r); @@ -134,17 +134,17 @@ test_replaycache_age(void *arg) result = replaycache_add_and_test_internal(1200, r, test_buffer, strlen(test_buffer), NULL); - tt_int_op(result,==, 0); + tt_int_op(result,OP_EQ, 0); result = replaycache_add_and_test_internal(1300, r, test_buffer, strlen(test_buffer), NULL); - tt_int_op(result,==, 1); + tt_int_op(result,OP_EQ, 1); result = replaycache_add_and_test_internal(3000, r, test_buffer, strlen(test_buffer), NULL); - tt_int_op(result,==, 0); + tt_int_op(result,OP_EQ, 0); done: if (r) replaycache_free(r); @@ -166,13 +166,13 @@ test_replaycache_elapsed(void *arg) result = replaycache_add_and_test_internal(1200, r, test_buffer, strlen(test_buffer), NULL); - tt_int_op(result,==, 0); + tt_int_op(result,OP_EQ, 0); result = replaycache_add_and_test_internal(1300, r, test_buffer, strlen(test_buffer), &elapsed); - tt_int_op(result,==, 1); - tt_int_op(elapsed,==, 100); + tt_int_op(result,OP_EQ, 1); + tt_int_op(elapsed,OP_EQ, 100); done: if (r) replaycache_free(r); @@ -193,17 +193,17 @@ test_replaycache_noexpire(void *arg) result = replaycache_add_and_test_internal(1200, r, test_buffer, strlen(test_buffer), NULL); - tt_int_op(result,==, 0); + tt_int_op(result,OP_EQ, 0); result = replaycache_add_and_test_internal(1300, r, test_buffer, strlen(test_buffer), NULL); - tt_int_op(result,==, 1); + tt_int_op(result,OP_EQ, 1); result = replaycache_add_and_test_internal(3000, r, test_buffer, strlen(test_buffer), NULL); - tt_int_op(result,==, 1); + tt_int_op(result,OP_EQ, 1); done: if (r) replaycache_free(r); @@ -225,12 +225,12 @@ test_replaycache_scrub(void *arg) result = replaycache_add_and_test_internal(100, r, test_buffer, strlen(test_buffer), NULL); - tt_int_op(result,==, 0); + tt_int_op(result,OP_EQ, 0); result = replaycache_add_and_test_internal(200, r, test_buffer, strlen(test_buffer), NULL); - tt_int_op(result,==, 1); + tt_int_op(result,OP_EQ, 1); /* * Poke a few replaycache_scrub_if_needed_internal() error cases that @@ -245,7 +245,7 @@ test_replaycache_scrub(void *arg) /* Make sure we hit the aging-out case too */ replaycache_scrub_if_needed_internal(1500, r); /* Assert that we aged it */ - tt_int_op(digestmap_size(r->digests_seen),==, 0); + tt_int_op(digestmap_size(r->digests_seen),OP_EQ, 0); done: if (r) replaycache_free(r); @@ -268,16 +268,16 @@ test_replaycache_future(void *arg) result = replaycache_add_and_test_internal(100, r, test_buffer, strlen(test_buffer), &elapsed); - tt_int_op(result,==, 0); + tt_int_op(result,OP_EQ, 0); /* elapsed should still be 0, since it wasn't written */ - tt_int_op(elapsed,==, 0); + tt_int_op(elapsed,OP_EQ, 0); result = replaycache_add_and_test_internal(200, r, test_buffer, strlen(test_buffer), &elapsed); - tt_int_op(result,==, 1); + tt_int_op(result,OP_EQ, 1); /* elapsed should be the time since the last hit */ - tt_int_op(elapsed,==, 100); + tt_int_op(elapsed,OP_EQ, 100); /* * Now let's turn the clock back to get coverage on the cache entry from the @@ -287,9 +287,9 @@ test_replaycache_future(void *arg) replaycache_add_and_test_internal(150, r, test_buffer, strlen(test_buffer), &elapsed); /* We should still get a hit */ - tt_int_op(result,==, 1); + tt_int_op(result,OP_EQ, 1); /* ...but it shouldn't let us see a negative elapsed time */ - tt_int_op(elapsed,==, 0); + tt_int_op(elapsed,OP_EQ, 0); done: if (r) replaycache_free(r); @@ -316,18 +316,18 @@ test_replaycache_realtime(void *arg) /* This should miss */ result = replaycache_add_and_test(r, test_buffer, strlen(test_buffer)); - tt_int_op(result,==, 0); + tt_int_op(result,OP_EQ, 0); /* This should hit */ result = replaycache_add_and_test(r, test_buffer, strlen(test_buffer)); - tt_int_op(result,==, 1); + tt_int_op(result,OP_EQ, 1); /* This should hit and return a small elapsed time */ result = replaycache_add_test_and_elapsed(r, test_buffer, strlen(test_buffer), &elapsed); - tt_int_op(result,==, 1); + tt_int_op(result,OP_EQ, 1); tt_assert(elapsed >= 0); tt_assert(elapsed <= 5); diff --git a/src/test/test_routerkeys.c b/src/test/test_routerkeys.c index 652d7d6c52..60b6bb5a72 100644 --- a/src/test/test_routerkeys.c +++ b/src/test/test_routerkeys.c @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" @@ -33,38 +33,38 @@ test_routerkeys_write_fingerprint(void *arg) set_server_identity_key(key); set_client_identity_key(crypto_pk_dup_key(key)); - tt_int_op(0, ==, check_private_dir(ddir, CPD_CREATE, NULL)); - tt_int_op(crypto_pk_cmp_keys(get_server_identity_key(),key),==,0); + tt_int_op(0, OP_EQ, check_private_dir(ddir, CPD_CREATE, NULL)); + tt_int_op(crypto_pk_cmp_keys(get_server_identity_key(),key),OP_EQ,0); /* Write fingerprint file */ - tt_int_op(0, ==, router_write_fingerprint(0)); + tt_int_op(0, OP_EQ, router_write_fingerprint(0)); cp = read_file_to_str(get_fname("write_fingerprint/fingerprint"), 0, NULL); crypto_pk_get_fingerprint(key, fp, 0); tor_asprintf(&cp2, "haflinger %s\n", fp); - tt_str_op(cp, ==, cp2); + tt_str_op(cp, OP_EQ, cp2); tor_free(cp); tor_free(cp2); /* Write hashed-fingerprint file */ - tt_int_op(0, ==, router_write_fingerprint(1)); + tt_int_op(0, OP_EQ, router_write_fingerprint(1)); cp = read_file_to_str(get_fname("write_fingerprint/hashed-fingerprint"), 0, NULL); crypto_pk_get_hashed_fingerprint(key, fp); tor_asprintf(&cp2, "haflinger %s\n", fp); - tt_str_op(cp, ==, cp2); + tt_str_op(cp, OP_EQ, cp2); tor_free(cp); tor_free(cp2); /* Replace outdated file */ write_str_to_file(get_fname("write_fingerprint/hashed-fingerprint"), "junk goes here", 0); - tt_int_op(0, ==, router_write_fingerprint(1)); + tt_int_op(0, OP_EQ, router_write_fingerprint(1)); cp = read_file_to_str(get_fname("write_fingerprint/hashed-fingerprint"), 0, NULL); crypto_pk_get_hashed_fingerprint(key, fp); tor_asprintf(&cp2, "haflinger %s\n", fp); - tt_str_op(cp, ==, cp2); + tt_str_op(cp, OP_EQ, cp2); tor_free(cp); tor_free(cp2); diff --git a/src/test/test_routerlist.c b/src/test/test_routerlist.c new file mode 100644 index 0000000000..381a592c5b --- /dev/null +++ b/src/test/test_routerlist.c @@ -0,0 +1,103 @@ +/* Copyright (c) 2014, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#define ROUTERLIST_PRIVATE +#include "or.h" +#include "routerlist.h" +#include "directory.h" +#include "test.h" + +/* 4 digests + 3 sep + pre + post + NULL */ +static char output[4*BASE64_DIGEST256_LEN+3+2+2+1]; + +static void +mock_get_from_dirserver(uint8_t dir_purpose, uint8_t router_purpose, + const char *resource, int pds_flags) +{ + (void)dir_purpose; + (void)router_purpose; + (void)pds_flags; + tt_assert(resource); + strlcpy(output, resource, sizeof(output)); + done: + ; +} + +static void +test_routerlist_initiate_descriptor_downloads(void *arg) +{ + const char *prose = "unhurried and wise, we perceive."; + smartlist_t *digests = smartlist_new(); + (void)arg; + + for (int i = 0; i < 20; i++) { + smartlist_add(digests, (char*)prose); + } + + MOCK(directory_get_from_dirserver, mock_get_from_dirserver); + initiate_descriptor_downloads(NULL, DIR_PURPOSE_FETCH_MICRODESC, + digests, 3, 7, 0); + UNMOCK(directory_get_from_dirserver); + + tt_str_op(output, OP_EQ, "d/" + "dW5odXJyaWVkIGFuZCB3aXNlLCB3ZSBwZXJjZWl2ZS4-" + "dW5odXJyaWVkIGFuZCB3aXNlLCB3ZSBwZXJjZWl2ZS4-" + "dW5odXJyaWVkIGFuZCB3aXNlLCB3ZSBwZXJjZWl2ZS4-" + "dW5odXJyaWVkIGFuZCB3aXNlLCB3ZSBwZXJjZWl2ZS4" + ".z"); + + done: + smartlist_free(digests); +} + +static int count = 0; + +static void +mock_initiate_descriptor_downloads(const routerstatus_t *source, + int purpose, smartlist_t *digests, + int lo, int hi, int pds_flags) +{ + (void)source; + (void)purpose; + (void)digests; + (void)pds_flags; + (void)hi; + (void)lo; + count += 1; +} + +static void +test_routerlist_launch_descriptor_downloads(void *arg) +{ + smartlist_t *downloadable = smartlist_new(); + time_t now = time(NULL); + char *cp; + (void)arg; + + for (int i = 0; i < 100; i++) { + cp = tor_malloc(DIGEST256_LEN); + tt_assert(cp); + crypto_rand(cp, DIGEST256_LEN); + smartlist_add(downloadable, cp); + } + + MOCK(initiate_descriptor_downloads, mock_initiate_descriptor_downloads); + launch_descriptor_downloads(DIR_PURPOSE_FETCH_MICRODESC, downloadable, + NULL, now); + tt_int_op(3, ==, count); + UNMOCK(initiate_descriptor_downloads); + + done: + SMARTLIST_FOREACH(downloadable, char *, cp1, tor_free(cp1)); + smartlist_free(downloadable); +} + +#define NODE(name, flags) \ + { #name, test_routerlist_##name, (flags), NULL, NULL } + +struct testcase_t routerlist_tests[] = { + NODE(initiate_descriptor_downloads, 0), + NODE(launch_descriptor_downloads, 0), + END_OF_TESTCASES +}; + diff --git a/src/test/test_routerset.c b/src/test/test_routerset.c index 81e4dbb1eb..9bd0c125c3 100644 --- a/src/test/test_routerset.c +++ b/src/test/test_routerset.c @@ -25,12 +25,12 @@ NS(test_main)(void *arg) rs = routerset_new(); - tt_ptr_op(rs, !=, NULL); - tt_ptr_op(rs->list, !=, NULL); - tt_ptr_op(rs->names, !=, NULL); - tt_ptr_op(rs->digests, !=, NULL); - tt_ptr_op(rs->policies, !=, NULL); - tt_ptr_op(rs->country_names, !=, NULL); + tt_ptr_op(rs, OP_NE, NULL); + tt_ptr_op(rs->list, OP_NE, NULL); + tt_ptr_op(rs->names, OP_NE, NULL); + tt_ptr_op(rs->digests, OP_NE, NULL); + tt_ptr_op(rs->policies, OP_NE, NULL); + tt_ptr_op(rs->country_names, OP_NE, NULL); done: routerset_free(rs); @@ -53,30 +53,30 @@ NS(test_main)(void *arg) /* strlen(c) < 4 */ input = "xxx"; name = routerset_get_countryname(input); - tt_ptr_op(name, ==, NULL); + tt_ptr_op(name, OP_EQ, NULL); tor_free(name); /* c[0] != '{' */ input = "xxx}"; name = routerset_get_countryname(input); - tt_ptr_op(name, ==, NULL); + tt_ptr_op(name, OP_EQ, NULL); tor_free(name); /* c[3] != '}' */ input = "{xxx"; name = routerset_get_countryname(input); - tt_ptr_op(name, ==, NULL); + tt_ptr_op(name, OP_EQ, NULL); tor_free(name); /* tor_strlower */ input = "{XX}"; name = routerset_get_countryname(input); - tt_str_op(name, ==, "xx"); + tt_str_op(name, OP_EQ, "xx"); tor_free(name); input = "{xx}"; name = routerset_get_countryname(input); - tt_str_op(name, ==, "xx"); + tt_str_op(name, OP_EQ, "xx"); done: tor_free(name); } @@ -103,10 +103,10 @@ NS(test_main)(void *arg) routerset_refresh_countries(set); - tt_ptr_op(set->countries, ==, NULL); - tt_int_op(set->n_countries, ==, 0); - tt_int_op(CALLED(geoip_is_loaded), ==, 1); - tt_int_op(CALLED(geoip_get_n_countries), ==, 0); + tt_ptr_op(set->countries, OP_EQ, NULL); + tt_int_op(set->n_countries, OP_EQ, 0); + tt_int_op(CALLED(geoip_is_loaded), OP_EQ, 1); + tt_int_op(CALLED(geoip_get_n_countries), OP_EQ, 0); done: NS_UNMOCK(geoip_is_loaded); @@ -154,12 +154,12 @@ NS(test_main)(void *arg) routerset_refresh_countries(set); - tt_ptr_op(set->countries, !=, NULL); - tt_int_op(set->n_countries, ==, 1); - tt_int_op((unsigned int)(*set->countries), ==, 0); - tt_int_op(CALLED(geoip_is_loaded), ==, 1); - tt_int_op(CALLED(geoip_get_n_countries), ==, 1); - tt_int_op(CALLED(geoip_get_country), ==, 0); + tt_ptr_op(set->countries, OP_NE, NULL); + tt_int_op(set->n_countries, OP_EQ, 1); + tt_int_op((unsigned int)(*set->countries), OP_EQ, 0); + tt_int_op(CALLED(geoip_is_loaded), OP_EQ, 1); + tt_int_op(CALLED(geoip_get_n_countries), OP_EQ, 1); + tt_int_op(CALLED(geoip_get_country), OP_EQ, 0); done: NS_UNMOCK(geoip_is_loaded); @@ -218,12 +218,12 @@ NS(test_main)(void *arg) routerset_refresh_countries(set); - tt_ptr_op(set->countries, !=, NULL); - tt_int_op(set->n_countries, ==, 2); - tt_int_op(CALLED(geoip_is_loaded), ==, 1); - tt_int_op(CALLED(geoip_get_n_countries), ==, 1); - tt_int_op(CALLED(geoip_get_country), ==, 1); - tt_int_op((unsigned int)(*set->countries), !=, 0); + tt_ptr_op(set->countries, OP_NE, NULL); + tt_int_op(set->n_countries, OP_EQ, 2); + tt_int_op(CALLED(geoip_is_loaded), OP_EQ, 1); + tt_int_op(CALLED(geoip_get_n_countries), OP_EQ, 1); + tt_int_op(CALLED(geoip_get_country), OP_EQ, 1); + tt_int_op((unsigned int)(*set->countries), OP_NE, 0); done: NS_UNMOCK(geoip_is_loaded); @@ -283,12 +283,12 @@ NS(test_main)(void *arg) routerset_refresh_countries(set); - tt_ptr_op(set->countries, !=, NULL); - tt_int_op(set->n_countries, ==, 2); - tt_int_op(CALLED(geoip_is_loaded), ==, 1); - tt_int_op(CALLED(geoip_get_n_countries), ==, 1); - tt_int_op(CALLED(geoip_get_country), ==, 1); - tt_int_op((unsigned int)(*set->countries), ==, 0); + tt_ptr_op(set->countries, OP_NE, NULL); + tt_int_op(set->n_countries, OP_EQ, 2); + tt_int_op(CALLED(geoip_is_loaded), OP_EQ, 1); + tt_int_op(CALLED(geoip_get_n_countries), OP_EQ, 1); + tt_int_op(CALLED(geoip_get_country), OP_EQ, 1); + tt_int_op((unsigned int)(*set->countries), OP_EQ, 0); done: NS_UNMOCK(geoip_is_loaded); @@ -340,7 +340,7 @@ NS(test_main)(void *arg) r = routerset_parse(set, s, ""); - tt_int_op(r, ==, -1); + tt_int_op(r, OP_EQ, -1); done: routerset_free(set); @@ -365,8 +365,8 @@ NS(test_main)(void *arg) set = routerset_new(); s = "$0000000000000000000000000000000000000000"; r = routerset_parse(set, s, ""); - tt_int_op(r, ==, 0); - tt_int_op(digestmap_isempty(set->digests), !=, 1); + tt_int_op(r, OP_EQ, 0); + tt_int_op(digestmap_isempty(set->digests), OP_NE, 1); done: routerset_free(set); @@ -390,8 +390,8 @@ NS(test_main)(void *arg) set = routerset_new(); s = "fred"; r = routerset_parse(set, s, ""); - tt_int_op(r, ==, 0); - tt_int_op(strmap_isempty(set->names), !=, 1); + tt_int_op(r, OP_EQ, 0); + tt_int_op(strmap_isempty(set->names), OP_NE, 1); done: routerset_free(set); @@ -415,8 +415,8 @@ NS(test_main)(void *arg) set = routerset_new(); s = "{cc}"; r = routerset_parse(set, s, ""); - tt_int_op(r, ==, 0); - tt_int_op(smartlist_len(set->country_names), !=, 0); + tt_int_op(r, OP_EQ, 0); + tt_int_op(smartlist_len(set->country_names), OP_NE, 0); done: routerset_free(set); @@ -448,9 +448,9 @@ NS(test_main)(void *arg) set = routerset_new(); s = "*"; r = routerset_parse(set, s, ""); - tt_int_op(r, ==, 0); - tt_int_op(smartlist_len(set->policies), !=, 0); - tt_int_op(CALLED(router_parse_addr_policy_item_from_string), ==, 1); + tt_int_op(r, OP_EQ, 0); + tt_int_op(smartlist_len(set->policies), OP_NE, 0); + tt_int_op(CALLED(router_parse_addr_policy_item_from_string), OP_EQ, 1); done: routerset_free(set); @@ -489,10 +489,10 @@ NS(test_main)(void *arg) NS_MOCK(smartlist_new); routerset_union(set, NULL); - tt_int_op(CALLED(smartlist_new), ==, 0); + tt_int_op(CALLED(smartlist_new), OP_EQ, 0); routerset_union(set, bad_set); - tt_int_op(CALLED(smartlist_new), ==, 0); + tt_int_op(CALLED(smartlist_new), OP_EQ, 0); done: NS_UNMOCK(smartlist_new); @@ -529,7 +529,7 @@ NS(test_main)(void *arg) smartlist_add(src->list, tor_strdup("{xx}")); routerset_union(tgt, src); - tt_int_op(smartlist_len(tgt->list), !=, 0); + tt_int_op(smartlist_len(tgt->list), OP_NE, 0); done: routerset_free(src); @@ -556,7 +556,7 @@ NS(test_main)(void *arg) is_list = routerset_is_list(set); routerset_free(set); set = NULL; - tt_int_op(is_list, !=, 0); + tt_int_op(is_list, OP_NE, 0); /* len(set->country_names) != 0, len(set->policies) == 0 */ set = routerset_new(); @@ -564,7 +564,7 @@ NS(test_main)(void *arg) is_list = routerset_is_list(set); routerset_free(set); set = NULL; - tt_int_op(is_list, ==, 0); + tt_int_op(is_list, OP_EQ, 0); /* len(set->country_names) == 0, len(set->policies) != 0 */ set = routerset_new(); @@ -573,7 +573,7 @@ NS(test_main)(void *arg) is_list = routerset_is_list(set); routerset_free(set); set = NULL; - tt_int_op(is_list, ==, 0); + tt_int_op(is_list, OP_EQ, 0); /* len(set->country_names) != 0, len(set->policies) != 0 */ set = routerset_new(); @@ -583,7 +583,7 @@ NS(test_main)(void *arg) is_list = routerset_is_list(set); routerset_free(set); set = NULL; - tt_int_op(is_list, ==, 0); + tt_int_op(is_list, OP_EQ, 0); done: ; @@ -605,12 +605,12 @@ NS(test_main)(void *arg) set = NULL; needs_geoip = routerset_needs_geoip(set); - tt_int_op(needs_geoip, ==, 0); + tt_int_op(needs_geoip, OP_EQ, 0); set = routerset_new(); needs_geoip = routerset_needs_geoip(set); routerset_free((routerset_t *)set); - tt_int_op(needs_geoip, ==, 0); + tt_int_op(needs_geoip, OP_EQ, 0); set = NULL; set = routerset_new(); @@ -618,7 +618,7 @@ NS(test_main)(void *arg) needs_geoip = routerset_needs_geoip(set); routerset_free((routerset_t *)set); set = NULL; - tt_int_op(needs_geoip, !=, 0); + tt_int_op(needs_geoip, OP_NE, 0); done: ; @@ -639,20 +639,20 @@ NS(test_main)(void *arg) (void)arg; is_empty = routerset_is_empty(set); - tt_int_op(is_empty, !=, 0); + tt_int_op(is_empty, OP_NE, 0); set = routerset_new(); is_empty = routerset_is_empty(set); routerset_free(set); set = NULL; - tt_int_op(is_empty, !=, 0); + tt_int_op(is_empty, OP_NE, 0); set = routerset_new(); smartlist_add(set->list, tor_strdup("{xx}")); is_empty = routerset_is_empty(set); routerset_free(set); set = NULL; - tt_int_op(is_empty, ==, 0); + tt_int_op(is_empty, OP_EQ, 0); done: ; @@ -675,13 +675,13 @@ NS(test_main)(void *arg) contains = routerset_contains(set, NULL, 0, NULL, NULL, 0); - tt_int_op(contains, ==, 0); + tt_int_op(contains, OP_EQ, 0); set = tor_malloc_zero(sizeof(routerset_t)); set->list = NULL; contains = routerset_contains(set, NULL, 0, NULL, NULL, 0); tor_free(set); - tt_int_op(contains, ==, 0); + tt_int_op(contains, OP_EQ, 0); done: ; @@ -706,7 +706,7 @@ NS(test_main)(void *arg) contains = routerset_contains(set, NULL, 0, nickname, NULL, 0); routerset_free(set); - tt_int_op(contains, ==, 0); + tt_int_op(contains, OP_EQ, 0); done: ; @@ -733,7 +733,7 @@ NS(test_main)(void *arg) contains = routerset_contains(set, NULL, 0, nickname, NULL, 0); routerset_free(set); - tt_int_op(contains, ==, 4); + tt_int_op(contains, OP_EQ, 4); done: ; } @@ -757,7 +757,7 @@ NS(test_main)(void *arg) contains = routerset_contains(set, NULL, 0, "foo", NULL, 0); routerset_free(set); - tt_int_op(contains, ==, 0); + tt_int_op(contains, OP_EQ, 0); done: ; } @@ -782,7 +782,7 @@ NS(test_main)(void *arg) contains = routerset_contains(set, NULL, 0, NULL, (const char*)foo, 0); routerset_free(set); - tt_int_op(contains, ==, 4); + tt_int_op(contains, OP_EQ, 4); done: ; } @@ -808,7 +808,7 @@ NS(test_main)(void *arg) contains = routerset_contains(set, NULL, 0, NULL, (const char*)foo, 0); routerset_free(set); - tt_int_op(contains, ==, 0); + tt_int_op(contains, OP_EQ, 0); done: ; } @@ -833,7 +833,7 @@ NS(test_main)(void *arg) contains = routerset_contains(set, NULL, 0, NULL, NULL, 0); routerset_free(set); - tt_int_op(contains, ==, 0); + tt_int_op(contains, OP_EQ, 0); done: ; } @@ -865,8 +865,8 @@ NS(test_main)(void *arg) contains = routerset_contains(set, addr, 0, NULL, NULL, 0); routerset_free(set); - tt_int_op(CALLED(compare_tor_addr_to_addr_policy), ==, 1); - tt_int_op(contains, ==, 3); + tt_int_op(CALLED(compare_tor_addr_to_addr_policy), OP_EQ, 1); + tt_int_op(contains, OP_EQ, 3); done: ; @@ -879,7 +879,7 @@ NS(compare_tor_addr_to_addr_policy)(const tor_addr_t *addr, uint16_t port, (void)port; (void)policy; CALLED(compare_tor_addr_to_addr_policy)++; - tt_ptr_op(addr, ==, MOCK_TOR_ADDR_PTR); + tt_ptr_op(addr, OP_EQ, MOCK_TOR_ADDR_PTR); return ADDR_POLICY_REJECTED; done: @@ -910,8 +910,8 @@ NS(test_main)(void *arg) contains = routerset_contains(set, addr, 0, NULL, NULL, 0); routerset_free(set); - tt_int_op(CALLED(compare_tor_addr_to_addr_policy), ==, 1); - tt_int_op(contains, ==, 0); + tt_int_op(CALLED(compare_tor_addr_to_addr_policy), OP_EQ, 1); + tt_int_op(contains, OP_EQ, 0); done: ; @@ -924,7 +924,7 @@ NS(compare_tor_addr_to_addr_policy)(const tor_addr_t *addr, uint16_t port, (void)port; (void)policy; CALLED(compare_tor_addr_to_addr_policy)++; - tt_ptr_op(addr, ==, MOCK_TOR_ADDR_PTR); + tt_ptr_op(addr, OP_EQ, MOCK_TOR_ADDR_PTR); return ADDR_POLICY_ACCEPTED; @@ -955,7 +955,7 @@ NS(test_main)(void *arg) contains = routerset_contains(set, NULL, 0, NULL, NULL, 0); routerset_free(set); - tt_int_op(contains, ==, 0); + tt_int_op(contains, OP_EQ, 0); done: ; @@ -968,7 +968,7 @@ NS(compare_tor_addr_to_addr_policy)(const tor_addr_t *addr, uint16_t port, (void)port; (void)policy; CALLED(compare_tor_addr_to_addr_policy)++; - tt_ptr_op(addr, ==, MOCK_TOR_ADDR_PTR); + tt_ptr_op(addr, OP_EQ, MOCK_TOR_ADDR_PTR); return ADDR_POLICY_ACCEPTED; @@ -1003,9 +1003,9 @@ NS(test_main)(void *arg) contains = routerset_contains(set, MOCK_TOR_ADDR_PTR, 0, NULL, NULL, -1); routerset_free(set); - tt_int_op(contains, ==, 0); - tt_int_op(CALLED(compare_tor_addr_to_addr_policy), ==, 1); - tt_int_op(CALLED(geoip_get_country_by_addr), ==, 1); + tt_int_op(contains, OP_EQ, 0); + tt_int_op(CALLED(compare_tor_addr_to_addr_policy), OP_EQ, 1); + tt_int_op(CALLED(geoip_get_country_by_addr), OP_EQ, 1); done: ; @@ -1018,7 +1018,7 @@ NS(compare_tor_addr_to_addr_policy)(const tor_addr_t *addr, uint16_t port, (void)port; (void)policy; CALLED(compare_tor_addr_to_addr_policy)++; - tt_ptr_op(addr, ==, MOCK_TOR_ADDR_PTR); + tt_ptr_op(addr, OP_EQ, MOCK_TOR_ADDR_PTR); done: return ADDR_POLICY_ACCEPTED; @@ -1028,7 +1028,7 @@ int NS(geoip_get_country_by_addr)(const tor_addr_t *addr) { CALLED(geoip_get_country_by_addr)++; - tt_ptr_op(addr, ==, MOCK_TOR_ADDR_PTR); + tt_ptr_op(addr, OP_EQ, MOCK_TOR_ADDR_PTR); done: return -1; @@ -1062,9 +1062,9 @@ NS(test_main)(void *arg) contains = routerset_contains(set, MOCK_TOR_ADDR_PTR, 0, NULL, NULL, -1); routerset_free(set); - tt_int_op(contains, ==, 2); - tt_int_op(CALLED(compare_tor_addr_to_addr_policy), ==, 1); - tt_int_op(CALLED(geoip_get_country_by_addr), ==, 1); + tt_int_op(contains, OP_EQ, 2); + tt_int_op(CALLED(compare_tor_addr_to_addr_policy), OP_EQ, 1); + tt_int_op(CALLED(geoip_get_country_by_addr), OP_EQ, 1); done: ; @@ -1077,7 +1077,7 @@ NS(compare_tor_addr_to_addr_policy)(const tor_addr_t *addr, uint16_t port, (void)port; (void)policy; CALLED(compare_tor_addr_to_addr_policy)++; - tt_ptr_op(addr, ==, MOCK_TOR_ADDR_PTR); + tt_ptr_op(addr, OP_EQ, MOCK_TOR_ADDR_PTR); done: return ADDR_POLICY_ACCEPTED; @@ -1087,7 +1087,7 @@ int NS(geoip_get_country_by_addr)(const tor_addr_t *addr) { CALLED(geoip_get_country_by_addr)++; - tt_ptr_op(addr, ==, MOCK_TOR_ADDR_PTR); + tt_ptr_op(addr, OP_EQ, MOCK_TOR_ADDR_PTR); done: return 1; @@ -1111,7 +1111,7 @@ NS(test_main)(void *arg) r = routerset_add_unknown_ccs(setp, 1); - tt_int_op(r, ==, 0); + tt_int_op(r, OP_EQ, 0); done: routerset_free(set); @@ -1140,8 +1140,8 @@ NS(test_main)(void *arg) r = routerset_add_unknown_ccs(setp, 0); - tt_ptr_op(*setp, !=, NULL); - tt_int_op(r, ==, 0); + tt_ptr_op(*setp, OP_NE, NULL); + tt_int_op(r, OP_EQ, 0); done: if (set != NULL) @@ -1181,9 +1181,9 @@ NS(test_main)(void *arg) r = routerset_add_unknown_ccs(setp, 0); - tt_int_op(r, ==, 1); - tt_int_op(smartlist_contains_string(set->country_names, "??"), ==, 1); - tt_int_op(smartlist_contains_string(set->list, "{??}"), ==, 1); + tt_int_op(r, OP_EQ, 1); + tt_int_op(smartlist_contains_string(set->country_names, "??"), OP_EQ, 1); + tt_int_op(smartlist_contains_string(set->list, "{??}"), OP_EQ, 1); done: if (set != NULL) @@ -1200,7 +1200,7 @@ NS(geoip_get_country)(const char *country) arg_is_qq = !strcmp(country, "??"); arg_is_a1 = !strcmp(country, "A1"); - tt_int_op(arg_is_qq || arg_is_a1, ==, 1); + tt_int_op(arg_is_qq || arg_is_a1, OP_EQ, 1); if (arg_is_qq) return 1; @@ -1214,7 +1214,7 @@ NS(geoip_is_loaded)(sa_family_t family) { CALLED(geoip_is_loaded)++; - tt_int_op(family, ==, AF_INET); + tt_int_op(family, OP_EQ, AF_INET); done: return 0; @@ -1244,9 +1244,9 @@ NS(test_main)(void *arg) r = routerset_add_unknown_ccs(setp, 0); - tt_int_op(r, ==, 1); - tt_int_op(smartlist_contains_string(set->country_names, "a1"), ==, 1); - tt_int_op(smartlist_contains_string(set->list, "{a1}"), ==, 1); + tt_int_op(r, OP_EQ, 1); + tt_int_op(smartlist_contains_string(set->country_names, "a1"), OP_EQ, 1); + tt_int_op(smartlist_contains_string(set->list, "{a1}"), OP_EQ, 1); done: if (set != NULL) @@ -1263,7 +1263,7 @@ NS(geoip_get_country)(const char *country) arg_is_qq = !strcmp(country, "??"); arg_is_a1 = !strcmp(country, "A1"); - tt_int_op(arg_is_qq || arg_is_a1, ==, 1); + tt_int_op(arg_is_qq || arg_is_a1, OP_EQ, 1); if (arg_is_a1) return 1; @@ -1277,7 +1277,7 @@ NS(geoip_is_loaded)(sa_family_t family) { CALLED(geoip_is_loaded)++; - tt_int_op(family, ==, AF_INET); + tt_int_op(family, OP_EQ, AF_INET); done: return 0; @@ -1306,7 +1306,7 @@ NS(test_main)(void *arg) r = routerset_contains_extendinfo(set, &ei); - tt_int_op(r, ==, 4); + tt_int_op(r, OP_EQ, 4); done: routerset_free(set); } @@ -1334,7 +1334,7 @@ NS(test_main)(void *arg) r = routerset_contains_router(set, &ri, country); - tt_int_op(r, ==, 4); + tt_int_op(r, OP_EQ, 4); done: routerset_free(set); } @@ -1367,7 +1367,7 @@ NS(test_main)(void *arg) r = routerset_contains_routerstatus(set, &rs, country); - tt_int_op(r, ==, 4); + tt_int_op(r, OP_EQ, 4); done: routerset_free(set); } @@ -1393,7 +1393,7 @@ NS(test_main)(void *arg) NS(mock_node).rs = NULL; r = routerset_contains_node(set, &NS(mock_node)); - tt_int_op(r, ==, 0); + tt_int_op(r, OP_EQ, 0); done: routerset_free(set); @@ -1427,7 +1427,7 @@ NS(test_main)(void *arg) r = routerset_contains_node(set, &NS(mock_node)); - tt_int_op(r, ==, 4); + tt_int_op(r, OP_EQ, 4); done: routerset_free(set); } @@ -1458,7 +1458,7 @@ NS(test_main)(void *arg) r = routerset_contains_node(set, &mock_node); - tt_int_op(r, ==, 4); + tt_int_op(r, OP_EQ, 4); done: routerset_free(set); } @@ -1478,15 +1478,15 @@ NS(test_main)(void *arg) routerset_t *set = NULL; (void)arg; - tt_int_op(smartlist_len(out), ==, 0); + tt_int_op(smartlist_len(out), OP_EQ, 0); routerset_get_all_nodes(out, NULL, NULL, 0); - tt_int_op(smartlist_len(out), ==, 0); + tt_int_op(smartlist_len(out), OP_EQ, 0); set = routerset_new(); smartlist_free(set->list); routerset_get_all_nodes(out, NULL, NULL, 0); - tt_int_op(smartlist_len(out), ==, 0); + tt_int_op(smartlist_len(out), OP_EQ, 0); /* Just recreate list, so we can simply use routerset_free. */ set->list = smartlist_new(); @@ -1527,8 +1527,8 @@ NS(test_main)(void *arg) smartlist_free(out); routerset_free(set); - tt_int_op(out_len, ==, 0); - tt_int_op(CALLED(node_get_by_nickname), ==, 1); + tt_int_op(out_len, OP_EQ, 0); + tt_int_op(CALLED(node_get_by_nickname), OP_EQ, 1); done: ; @@ -1538,8 +1538,8 @@ const node_t * NS(node_get_by_nickname)(const char *nickname, int warn_if_unused) { CALLED(node_get_by_nickname)++; - tt_str_op(nickname, ==, NS(mock_nickname)); - tt_int_op(warn_if_unused, ==, 1); + tt_str_op(nickname, OP_EQ, NS(mock_nickname)); + tt_int_op(warn_if_unused, OP_EQ, 1); done: return NULL; @@ -1578,8 +1578,8 @@ NS(test_main)(void *arg) smartlist_free(out); routerset_free(set); - tt_int_op(out_len, ==, 0); - tt_int_op(CALLED(node_get_by_nickname), ==, 1); + tt_int_op(out_len, OP_EQ, 0); + tt_int_op(CALLED(node_get_by_nickname), OP_EQ, 1); done: ; @@ -1589,8 +1589,8 @@ const node_t * NS(node_get_by_nickname)(const char *nickname, int warn_if_unused) { CALLED(node_get_by_nickname)++; - tt_str_op(nickname, ==, NS(mock_nickname)); - tt_int_op(warn_if_unused, ==, 1); + tt_str_op(nickname, OP_EQ, NS(mock_nickname)); + tt_int_op(warn_if_unused, OP_EQ, 1); done: return &NS(mock_node); @@ -1629,9 +1629,9 @@ NS(test_main)(void *arg) smartlist_free(out); routerset_free(set); - tt_int_op(out_len, ==, 1); - tt_ptr_op(ent, ==, &NS(mock_node)); - tt_int_op(CALLED(node_get_by_nickname), ==, 1); + tt_int_op(out_len, OP_EQ, 1); + tt_ptr_op(ent, OP_EQ, &NS(mock_node)); + tt_int_op(CALLED(node_get_by_nickname), OP_EQ, 1); done: ; @@ -1641,8 +1641,8 @@ const node_t * NS(node_get_by_nickname)(const char *nickname, int warn_if_unused) { CALLED(node_get_by_nickname)++; - tt_str_op(nickname, ==, NS(mock_nickname)); - tt_int_op(warn_if_unused, ==, 1); + tt_str_op(nickname, OP_EQ, NS(mock_nickname)); + tt_int_op(warn_if_unused, OP_EQ, 1); done: return &NS(mock_node); @@ -1678,8 +1678,8 @@ NS(test_main)(void *arg) smartlist_free(out); smartlist_free(NS(mock_smartlist)); - tt_int_op(r, ==, 0); - tt_int_op(CALLED(nodelist_get_list), ==, 1); + tt_int_op(r, OP_EQ, 0); + tt_int_op(CALLED(nodelist_get_list), OP_EQ, 1); done: ; @@ -1727,8 +1727,8 @@ NS(test_main)(void *arg) smartlist_free(out); smartlist_free(NS(mock_smartlist)); - tt_int_op(r, ==, 0); - tt_int_op(CALLED(nodelist_get_list), ==, 1); + tt_int_op(r, OP_EQ, 0); + tt_int_op(CALLED(nodelist_get_list), OP_EQ, 1); done: ; @@ -1766,10 +1766,10 @@ NS(test_main)(void *arg) mock_node.ri = &ri; smartlist_add(list, (void *)&mock_node); - tt_int_op(smartlist_len(list), !=, 0); + tt_int_op(smartlist_len(list), OP_NE, 0); routerset_subtract_nodes(list, set); - tt_int_op(smartlist_len(list), ==, 0); + tt_int_op(smartlist_len(list), OP_EQ, 0); done: routerset_free(set); smartlist_free(list); @@ -1796,10 +1796,10 @@ NS(test_main)(void *arg) mock_node.ri = &ri; smartlist_add(list, (void *)&mock_node); - tt_int_op(smartlist_len(list), !=, 0); + tt_int_op(smartlist_len(list), OP_NE, 0); routerset_subtract_nodes(list, set); - tt_int_op(smartlist_len(list), !=, 0); + tt_int_op(smartlist_len(list), OP_NE, 0); done: routerset_free(set); smartlist_free(list); @@ -1821,19 +1821,19 @@ NS(test_main)(void *arg) set = NULL; s = routerset_to_string(set); - tt_str_op(s, ==, ""); + tt_str_op(s, OP_EQ, ""); tor_free(s); set = routerset_new(); s = routerset_to_string(set); - tt_str_op(s, ==, ""); + tt_str_op(s, OP_EQ, ""); tor_free(s); routerset_free(set); set = NULL; set = routerset_new(); smartlist_add(set->list, tor_strndup("a", 1)); s = routerset_to_string(set); - tt_str_op(s, ==, "a"); + tt_str_op(s, OP_EQ, "a"); tor_free(s); routerset_free(set); set = NULL; @@ -1841,7 +1841,7 @@ NS(test_main)(void *arg) smartlist_add(set->list, tor_strndup("a", 1)); smartlist_add(set->list, tor_strndup("b", 1)); s = routerset_to_string(set); - tt_str_op(s, ==, "a,b"); + tt_str_op(s, OP_EQ, "a,b"); tor_free(s); routerset_free(set); set = NULL; @@ -1868,7 +1868,7 @@ NS(test_main)(void *arg) routerset_free(a); routerset_free(b); - tt_int_op(r, ==, 1); + tt_int_op(r, OP_EQ, 1); done: ; @@ -1893,7 +1893,7 @@ NS(test_main)(void *arg) routerset_free(a); routerset_free(b); - tt_int_op(r, ==, 0); + tt_int_op(r, OP_EQ, 0); done: ; } @@ -1920,7 +1920,7 @@ NS(test_main)(void *arg) routerset_free(a); routerset_free(b); - tt_int_op(r, ==, 0); + tt_int_op(r, OP_EQ, 0); done: ; } @@ -1946,7 +1946,7 @@ NS(test_main)(void *arg) routerset_free(a); routerset_free(b); - tt_int_op(r, ==, 0); + tt_int_op(r, OP_EQ, 0); done: ; } @@ -1972,7 +1972,7 @@ NS(test_main)(void *arg) routerset_free(a); routerset_free(b); - tt_int_op(r, ==, 1); + tt_int_op(r, OP_EQ, 1); done: ; } @@ -1995,7 +1995,7 @@ NS(test_main)(void *arg) routerset_free(NULL); - tt_int_op(CALLED(smartlist_free), ==, 0); + tt_int_op(CALLED(smartlist_free), OP_EQ, 0); done: ; @@ -2031,9 +2031,9 @@ NS(test_main)(void *arg) routerset_free(routerset); - tt_int_op(CALLED(smartlist_free), !=, 0); - tt_int_op(CALLED(strmap_free), !=, 0); - tt_int_op(CALLED(digestmap_free), !=, 0); + tt_int_op(CALLED(smartlist_free), OP_NE, 0); + tt_int_op(CALLED(strmap_free), OP_NE, 0); + tt_int_op(CALLED(digestmap_free), OP_NE, 0); done: ; diff --git a/src/test/test_scheduler.c b/src/test/test_scheduler.c new file mode 100644 index 0000000000..73a422088f --- /dev/null +++ b/src/test/test_scheduler.c @@ -0,0 +1,763 @@ +/* Copyright (c) 2014-2015, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include <math.h> + +#include "orconfig.h" + +/* Libevent stuff */ +#ifdef HAVE_EVENT2_EVENT_H +#include <event2/event.h> +#else +#include <event.h> +#endif + +#define TOR_CHANNEL_INTERNAL_ +#define CHANNEL_PRIVATE_ +#include "or.h" +#include "compat_libevent.h" +#include "channel.h" +#define SCHEDULER_PRIVATE_ +#include "scheduler.h" + +/* Test suite stuff */ +#include "test.h" +#include "fakechans.h" + +/* Statics in scheduler.c exposed to the test suite */ +extern smartlist_t *channels_pending; +extern struct event *run_sched_ev; +extern uint64_t queue_heuristic; +extern time_t queue_heuristic_timestamp; + +/* Event base for scheduelr tests */ +static struct event_base *mock_event_base = NULL; + +/* Statics controlling mocks */ +static circuitmux_t *mock_ccm_tgt_1 = NULL; +static circuitmux_t *mock_ccm_tgt_2 = NULL; + +static circuitmux_t *mock_cgp_tgt_1 = NULL; +static const circuitmux_policy_t *mock_cgp_val_1 = NULL; +static circuitmux_t *mock_cgp_tgt_2 = NULL; +static const circuitmux_policy_t *mock_cgp_val_2 = NULL; +static int scheduler_compare_channels_mock_ctr = 0; +static int scheduler_run_mock_ctr = 0; + +static void channel_flush_some_cells_mock_free_all(void); +static void channel_flush_some_cells_mock_set(channel_t *chan, + ssize_t num_cells); + +/* Setup for mock event stuff */ +static void mock_event_free_all(void); +static void mock_event_init(void); + +/* Mocks used by scheduler tests */ +static ssize_t channel_flush_some_cells_mock(channel_t *chan, + ssize_t num_cells); +static int circuitmux_compare_muxes_mock(circuitmux_t *cmux_1, + circuitmux_t *cmux_2); +static const circuitmux_policy_t * circuitmux_get_policy_mock( + circuitmux_t *cmux); +static int scheduler_compare_channels_mock(const void *c1_v, + const void *c2_v); +static void scheduler_run_noop_mock(void); +static struct event_base * tor_libevent_get_base_mock(void); + +/* Scheduler test cases */ +static void test_scheduler_channel_states(void *arg); +static void test_scheduler_compare_channels(void *arg); +static void test_scheduler_initfree(void *arg); +static void test_scheduler_loop(void *arg); +static void test_scheduler_queue_heuristic(void *arg); + +/* Mock event init/free */ + +/* Shamelessly stolen from compat_libevent.c */ +#define V(major, minor, patch) \ + (((major) << 24) | ((minor) << 16) | ((patch) << 8)) + +static void +mock_event_free_all(void) +{ + tt_assert(mock_event_base != NULL); + + if (mock_event_base) { + event_base_free(mock_event_base); + mock_event_base = NULL; + } + + tt_ptr_op(mock_event_base, ==, NULL); + + done: + return; +} + +static void +mock_event_init(void) +{ +#ifdef HAVE_EVENT2_EVENT_H + struct event_config *cfg = NULL; +#endif + + tt_ptr_op(mock_event_base, ==, NULL); + + /* + * Really cut down from tor_libevent_initialize of + * src/common/compat_libevent.c to kill config dependencies + */ + + if (!mock_event_base) { +#ifdef HAVE_EVENT2_EVENT_H + cfg = event_config_new(); +#if LIBEVENT_VERSION_NUMBER >= V(2,0,9) + /* We can enable changelist support with epoll, since we don't give + * Libevent any dup'd fds. This lets us avoid some syscalls. */ + event_config_set_flag(cfg, EVENT_BASE_FLAG_EPOLL_USE_CHANGELIST); +#endif + mock_event_base = event_base_new_with_config(cfg); + event_config_free(cfg); +#else + mock_event_base = event_init(); +#endif + } + + tt_assert(mock_event_base != NULL); + + done: + return; +} + +/* Mocks */ + +typedef struct { + const channel_t *chan; + ssize_t cells; +} flush_mock_channel_t; + +static smartlist_t *chans_for_flush_mock = NULL; + +static void +channel_flush_some_cells_mock_free_all(void) +{ + if (chans_for_flush_mock) { + SMARTLIST_FOREACH_BEGIN(chans_for_flush_mock, + flush_mock_channel_t *, + flush_mock_ch) { + SMARTLIST_DEL_CURRENT(chans_for_flush_mock, flush_mock_ch); + tor_free(flush_mock_ch); + } SMARTLIST_FOREACH_END(flush_mock_ch); + + smartlist_free(chans_for_flush_mock); + chans_for_flush_mock = NULL; + } +} + +static void +channel_flush_some_cells_mock_set(channel_t *chan, ssize_t num_cells) +{ + flush_mock_channel_t *flush_mock_ch = NULL; + + if (!chan) return; + if (num_cells <= 0) return; + + if (!chans_for_flush_mock) { + chans_for_flush_mock = smartlist_new(); + } + + SMARTLIST_FOREACH_BEGIN(chans_for_flush_mock, + flush_mock_channel_t *, + flush_mock_ch) { + if (flush_mock_ch != NULL && flush_mock_ch->chan != NULL) { + if (flush_mock_ch->chan == chan) { + /* Found it */ + flush_mock_ch->cells = num_cells; + break; + } + } else { + /* That shouldn't be there... */ + SMARTLIST_DEL_CURRENT(chans_for_flush_mock, flush_mock_ch); + tor_free(flush_mock_ch); + } + } SMARTLIST_FOREACH_END(flush_mock_ch); + + if (!flush_mock_ch) { + /* The loop didn't find it */ + flush_mock_ch = tor_malloc_zero(sizeof(*flush_mock_ch)); + flush_mock_ch->chan = chan; + flush_mock_ch->cells = num_cells; + smartlist_add(chans_for_flush_mock, flush_mock_ch); + } +} + +static ssize_t +channel_flush_some_cells_mock(channel_t *chan, ssize_t num_cells) +{ + ssize_t flushed = 0, max; + char unlimited = 0; + flush_mock_channel_t *found = NULL; + + tt_assert(chan != NULL); + if (chan) { + if (num_cells < 0) { + num_cells = 0; + unlimited = 1; + } + + /* Check if we have it */ + if (chans_for_flush_mock != NULL) { + SMARTLIST_FOREACH_BEGIN(chans_for_flush_mock, + flush_mock_channel_t *, + flush_mock_ch) { + if (flush_mock_ch != NULL && flush_mock_ch->chan != NULL) { + if (flush_mock_ch->chan == chan) { + /* Found it */ + found = flush_mock_ch; + break; + } + } else { + /* That shouldn't be there... */ + SMARTLIST_DEL_CURRENT(chans_for_flush_mock, flush_mock_ch); + tor_free(flush_mock_ch); + } + } SMARTLIST_FOREACH_END(flush_mock_ch); + + if (found) { + /* We found one */ + if (found->cells < 0) found->cells = 0; + + if (unlimited) max = found->cells; + else max = MIN(found->cells, num_cells); + + flushed += max; + found->cells -= max; + + if (found->cells <= 0) { + smartlist_remove(chans_for_flush_mock, found); + tor_free(found); + } + } + } + } + + done: + return flushed; +} + +static int +circuitmux_compare_muxes_mock(circuitmux_t *cmux_1, + circuitmux_t *cmux_2) +{ + int result = 0; + + tt_assert(cmux_1 != NULL); + tt_assert(cmux_2 != NULL); + + if (cmux_1 != cmux_2) { + if (cmux_1 == mock_ccm_tgt_1 && cmux_2 == mock_ccm_tgt_2) result = -1; + else if (cmux_1 == mock_ccm_tgt_2 && cmux_2 == mock_ccm_tgt_1) { + result = 1; + } else { + if (cmux_1 == mock_ccm_tgt_1 || cmux_1 == mock_ccm_tgt_2) result = -1; + else if (cmux_2 == mock_ccm_tgt_1 || cmux_2 == mock_ccm_tgt_2) { + result = 1; + } else { + result = circuitmux_compare_muxes__real(cmux_1, cmux_2); + } + } + } + /* else result = 0 always */ + + done: + return result; +} + +static const circuitmux_policy_t * +circuitmux_get_policy_mock(circuitmux_t *cmux) +{ + const circuitmux_policy_t *result = NULL; + + tt_assert(cmux != NULL); + if (cmux) { + if (cmux == mock_cgp_tgt_1) result = mock_cgp_val_1; + else if (cmux == mock_cgp_tgt_2) result = mock_cgp_val_2; + else result = circuitmux_get_policy__real(cmux); + } + + done: + return result; +} + +static int +scheduler_compare_channels_mock(const void *c1_v, + const void *c2_v) +{ + uintptr_t p1, p2; + + p1 = (uintptr_t)(c1_v); + p2 = (uintptr_t)(c2_v); + + ++scheduler_compare_channels_mock_ctr; + + if (p1 == p2) return 0; + else if (p1 < p2) return 1; + else return -1; +} + +static void +scheduler_run_noop_mock(void) +{ + ++scheduler_run_mock_ctr; +} + +static struct event_base * +tor_libevent_get_base_mock(void) +{ + return mock_event_base; +} + +/* Test cases */ + +static void +test_scheduler_channel_states(void *arg) +{ + channel_t *ch1 = NULL, *ch2 = NULL; + int old_count; + + (void)arg; + + /* Set up libevent and scheduler */ + + mock_event_init(); + MOCK(tor_libevent_get_base, tor_libevent_get_base_mock); + scheduler_init(); + /* + * Install the compare channels mock so we can test + * scheduler_touch_channel(). + */ + MOCK(scheduler_compare_channels, scheduler_compare_channels_mock); + /* + * Disable scheduler_run so we can just check the state transitions + * without having to make everything it might call work too. + */ + MOCK(scheduler_run, scheduler_run_noop_mock); + + tt_int_op(smartlist_len(channels_pending), ==, 0); + + /* Set up a fake channel */ + ch1 = new_fake_channel(); + tt_assert(ch1); + + /* Start it off in OPENING */ + ch1->state = CHANNEL_STATE_OPENING; + /* We'll need a cmux */ + ch1->cmux = circuitmux_alloc(); + /* Try to register it */ + channel_register(ch1); + tt_assert(ch1->registered); + + /* It should start off in SCHED_CHAN_IDLE */ + tt_int_op(ch1->scheduler_state, ==, SCHED_CHAN_IDLE); + + /* Now get another one */ + ch2 = new_fake_channel(); + tt_assert(ch2); + ch2->state = CHANNEL_STATE_OPENING; + ch2->cmux = circuitmux_alloc(); + channel_register(ch2); + tt_assert(ch2->registered); + + /* Send it to SCHED_CHAN_WAITING_TO_WRITE */ + scheduler_channel_has_waiting_cells(ch1); + tt_int_op(ch1->scheduler_state, ==, SCHED_CHAN_WAITING_TO_WRITE); + + /* This should send it to SCHED_CHAN_PENDING */ + scheduler_channel_wants_writes(ch1); + tt_int_op(ch1->scheduler_state, ==, SCHED_CHAN_PENDING); + tt_int_op(smartlist_len(channels_pending), ==, 1); + + /* Now send ch2 to SCHED_CHAN_WAITING_FOR_CELLS */ + scheduler_channel_wants_writes(ch2); + tt_int_op(ch2->scheduler_state, ==, SCHED_CHAN_WAITING_FOR_CELLS); + + /* Drop ch2 back to idle */ + scheduler_channel_doesnt_want_writes(ch2); + tt_int_op(ch2->scheduler_state, ==, SCHED_CHAN_IDLE); + + /* ...and back to SCHED_CHAN_WAITING_FOR_CELLS */ + scheduler_channel_wants_writes(ch2); + tt_int_op(ch2->scheduler_state, ==, SCHED_CHAN_WAITING_FOR_CELLS); + + /* ...and this should kick ch2 into SCHED_CHAN_PENDING */ + scheduler_channel_has_waiting_cells(ch2); + tt_int_op(ch2->scheduler_state, ==, SCHED_CHAN_PENDING); + tt_int_op(smartlist_len(channels_pending), ==, 2); + + /* This should send ch2 to SCHED_CHAN_WAITING_TO_WRITE */ + scheduler_channel_doesnt_want_writes(ch2); + tt_int_op(ch2->scheduler_state, ==, SCHED_CHAN_WAITING_TO_WRITE); + tt_int_op(smartlist_len(channels_pending), ==, 1); + + /* ...and back to SCHED_CHAN_PENDING */ + scheduler_channel_wants_writes(ch2); + tt_int_op(ch2->scheduler_state, ==, SCHED_CHAN_PENDING); + tt_int_op(smartlist_len(channels_pending), ==, 2); + + /* Now we exercise scheduler_touch_channel */ + old_count = scheduler_compare_channels_mock_ctr; + scheduler_touch_channel(ch1); + tt_assert(scheduler_compare_channels_mock_ctr > old_count); + + /* Close */ + channel_mark_for_close(ch1); + tt_int_op(ch1->state, ==, CHANNEL_STATE_CLOSING); + channel_mark_for_close(ch2); + tt_int_op(ch2->state, ==, CHANNEL_STATE_CLOSING); + channel_closed(ch1); + tt_int_op(ch1->state, ==, CHANNEL_STATE_CLOSED); + ch1 = NULL; + channel_closed(ch2); + tt_int_op(ch2->state, ==, CHANNEL_STATE_CLOSED); + ch2 = NULL; + + /* Shut things down */ + + channel_free_all(); + scheduler_free_all(); + mock_event_free_all(); + + done: + tor_free(ch1); + tor_free(ch2); + + UNMOCK(scheduler_compare_channels); + UNMOCK(scheduler_run); + UNMOCK(tor_libevent_get_base); + + return; +} + +static void +test_scheduler_compare_channels(void *arg) +{ + /* We don't actually need whole fake channels... */ + channel_t c1, c2; + /* ...and some dummy circuitmuxes too */ + circuitmux_t *cm1 = NULL, *cm2 = NULL; + int result; + + (void)arg; + + /* We can't actually see sizeof(circuitmux_t) from here */ + cm1 = tor_malloc_zero(sizeof(void *)); + cm2 = tor_malloc_zero(sizeof(void *)); + + c1.cmux = cm1; + c2.cmux = cm2; + + /* Configure circuitmux_get_policy() mock */ + mock_cgp_tgt_1 = cm1; + /* + * This is to test the different-policies case, which uses the policy + * cast to an intptr_t as an arbitrary but definite thing to compare. + */ + mock_cgp_val_1 = (const circuitmux_policy_t *)(1); + mock_cgp_tgt_2 = cm2; + mock_cgp_val_2 = (const circuitmux_policy_t *)(2); + + MOCK(circuitmux_get_policy, circuitmux_get_policy_mock); + + /* Now set up circuitmux_compare_muxes() mock using cm1/cm2 */ + mock_ccm_tgt_1 = cm1; + mock_ccm_tgt_2 = cm2; + MOCK(circuitmux_compare_muxes, circuitmux_compare_muxes_mock); + + /* Equal-channel case */ + result = scheduler_compare_channels(&c1, &c1); + tt_int_op(result, ==, 0); + + /* Distinct channels, distinct policies */ + result = scheduler_compare_channels(&c1, &c2); + tt_int_op(result, ==, -1); + result = scheduler_compare_channels(&c2, &c1); + tt_int_op(result, ==, 1); + + /* Distinct channels, same policy */ + mock_cgp_val_2 = mock_cgp_val_1; + result = scheduler_compare_channels(&c1, &c2); + tt_int_op(result, ==, -1); + result = scheduler_compare_channels(&c2, &c1); + tt_int_op(result, ==, 1); + + done: + + UNMOCK(circuitmux_compare_muxes); + mock_ccm_tgt_1 = NULL; + mock_ccm_tgt_2 = NULL; + + UNMOCK(circuitmux_get_policy); + mock_cgp_tgt_1 = NULL; + mock_cgp_val_1 = NULL; + mock_cgp_tgt_2 = NULL; + mock_cgp_val_2 = NULL; + + tor_free(cm1); + tor_free(cm2); + + return; +} + +static void +test_scheduler_initfree(void *arg) +{ + (void)arg; + + tt_ptr_op(channels_pending, ==, NULL); + tt_ptr_op(run_sched_ev, ==, NULL); + + mock_event_init(); + MOCK(tor_libevent_get_base, tor_libevent_get_base_mock); + + scheduler_init(); + + tt_assert(channels_pending != NULL); + tt_assert(run_sched_ev != NULL); + + scheduler_free_all(); + + UNMOCK(tor_libevent_get_base); + mock_event_free_all(); + + tt_ptr_op(channels_pending, ==, NULL); + tt_ptr_op(run_sched_ev, ==, NULL); + + done: + return; +} + +static void +test_scheduler_loop(void *arg) +{ + channel_t *ch1 = NULL, *ch2 = NULL; + + (void)arg; + + /* Set up libevent and scheduler */ + + mock_event_init(); + MOCK(tor_libevent_get_base, tor_libevent_get_base_mock); + scheduler_init(); + /* + * Install the compare channels mock so we can test + * scheduler_touch_channel(). + */ + MOCK(scheduler_compare_channels, scheduler_compare_channels_mock); + /* + * Disable scheduler_run so we can just check the state transitions + * without having to make everything it might call work too. + */ + MOCK(scheduler_run, scheduler_run_noop_mock); + + tt_int_op(smartlist_len(channels_pending), ==, 0); + + /* Set up a fake channel */ + ch1 = new_fake_channel(); + tt_assert(ch1); + + /* Start it off in OPENING */ + ch1->state = CHANNEL_STATE_OPENING; + /* We'll need a cmux */ + ch1->cmux = circuitmux_alloc(); + /* Try to register it */ + channel_register(ch1); + tt_assert(ch1->registered); + /* Finish opening it */ + channel_change_state(ch1, CHANNEL_STATE_OPEN); + + /* It should start off in SCHED_CHAN_IDLE */ + tt_int_op(ch1->scheduler_state, ==, SCHED_CHAN_IDLE); + + /* Now get another one */ + ch2 = new_fake_channel(); + tt_assert(ch2); + ch2->state = CHANNEL_STATE_OPENING; + ch2->cmux = circuitmux_alloc(); + channel_register(ch2); + tt_assert(ch2->registered); + /* + * Don't open ch2; then channel_num_cells_writeable() will return + * zero and we'll get coverage of that exception case in scheduler_run() + */ + + tt_int_op(ch1->state, ==, CHANNEL_STATE_OPEN); + tt_int_op(ch2->state, ==, CHANNEL_STATE_OPENING); + + /* Send it to SCHED_CHAN_WAITING_TO_WRITE */ + scheduler_channel_has_waiting_cells(ch1); + tt_int_op(ch1->scheduler_state, ==, SCHED_CHAN_WAITING_TO_WRITE); + + /* This should send it to SCHED_CHAN_PENDING */ + scheduler_channel_wants_writes(ch1); + tt_int_op(ch1->scheduler_state, ==, SCHED_CHAN_PENDING); + tt_int_op(smartlist_len(channels_pending), ==, 1); + + /* Now send ch2 to SCHED_CHAN_WAITING_FOR_CELLS */ + scheduler_channel_wants_writes(ch2); + tt_int_op(ch2->scheduler_state, ==, SCHED_CHAN_WAITING_FOR_CELLS); + + /* Drop ch2 back to idle */ + scheduler_channel_doesnt_want_writes(ch2); + tt_int_op(ch2->scheduler_state, ==, SCHED_CHAN_IDLE); + + /* ...and back to SCHED_CHAN_WAITING_FOR_CELLS */ + scheduler_channel_wants_writes(ch2); + tt_int_op(ch2->scheduler_state, ==, SCHED_CHAN_WAITING_FOR_CELLS); + + /* ...and this should kick ch2 into SCHED_CHAN_PENDING */ + scheduler_channel_has_waiting_cells(ch2); + tt_int_op(ch2->scheduler_state, ==, SCHED_CHAN_PENDING); + tt_int_op(smartlist_len(channels_pending), ==, 2); + + /* + * Now we've got two pending channels and need to fire off + * scheduler_run(); first, unmock it. + */ + + UNMOCK(scheduler_run); + + scheduler_run(); + + /* Now re-mock it */ + MOCK(scheduler_run, scheduler_run_noop_mock); + + /* + * Assert that they're still in the states we left and aren't still + * pending + */ + tt_int_op(ch1->state, ==, CHANNEL_STATE_OPEN); + tt_int_op(ch2->state, ==, CHANNEL_STATE_OPENING); + tt_assert(ch1->scheduler_state != SCHED_CHAN_PENDING); + tt_assert(ch2->scheduler_state != SCHED_CHAN_PENDING); + tt_int_op(smartlist_len(channels_pending), ==, 0); + + /* Now, finish opening ch2, and get both back to pending */ + channel_change_state(ch2, CHANNEL_STATE_OPEN); + scheduler_channel_wants_writes(ch1); + scheduler_channel_wants_writes(ch2); + scheduler_channel_has_waiting_cells(ch1); + scheduler_channel_has_waiting_cells(ch2); + tt_int_op(ch1->state, ==, CHANNEL_STATE_OPEN); + tt_int_op(ch2->state, ==, CHANNEL_STATE_OPEN); + tt_int_op(ch1->scheduler_state, ==, SCHED_CHAN_PENDING); + tt_int_op(ch2->scheduler_state, ==, SCHED_CHAN_PENDING); + tt_int_op(smartlist_len(channels_pending), ==, 2); + + /* Now, set up the channel_flush_some_cells() mock */ + MOCK(channel_flush_some_cells, channel_flush_some_cells_mock); + /* + * 16 cells on ch1 means it'll completely drain into the 32 cells + * fakechan's num_cells_writeable() returns. + */ + channel_flush_some_cells_mock_set(ch1, 16); + /* + * This one should get sent back to pending, since num_cells_writeable() + * will still return non-zero. + */ + channel_flush_some_cells_mock_set(ch2, 48); + + /* + * And re-run the scheduler_run() loop with non-zero returns from + * channel_flush_some_cells() this time. + */ + UNMOCK(scheduler_run); + + scheduler_run(); + + /* Now re-mock it */ + MOCK(scheduler_run, scheduler_run_noop_mock); + + /* + * ch1 should have gone to SCHED_CHAN_WAITING_FOR_CELLS, with 16 flushed + * and 32 writeable. + */ + tt_int_op(ch1->scheduler_state, ==, SCHED_CHAN_WAITING_FOR_CELLS); + /* + * ...ch2 should also have gone to SCHED_CHAN_WAITING_FOR_CELLS, with + * channel_more_to_flush() returning false and channel_num_cells_writeable() + * > 0/ + */ + tt_int_op(ch2->scheduler_state, ==, SCHED_CHAN_WAITING_FOR_CELLS); + + /* Close */ + channel_mark_for_close(ch1); + tt_int_op(ch1->state, ==, CHANNEL_STATE_CLOSING); + channel_mark_for_close(ch2); + tt_int_op(ch2->state, ==, CHANNEL_STATE_CLOSING); + channel_closed(ch1); + tt_int_op(ch1->state, ==, CHANNEL_STATE_CLOSED); + ch1 = NULL; + channel_closed(ch2); + tt_int_op(ch2->state, ==, CHANNEL_STATE_CLOSED); + ch2 = NULL; + + /* Shut things down */ + channel_flush_some_cells_mock_free_all(); + channel_free_all(); + scheduler_free_all(); + mock_event_free_all(); + + done: + tor_free(ch1); + tor_free(ch2); + + UNMOCK(channel_flush_some_cells); + UNMOCK(scheduler_compare_channels); + UNMOCK(scheduler_run); + UNMOCK(tor_libevent_get_base); +} + +static void +test_scheduler_queue_heuristic(void *arg) +{ + time_t now = approx_time(); + uint64_t qh; + + (void)arg; + + queue_heuristic = 0; + queue_heuristic_timestamp = 0; + + /* Not yet inited case */ + scheduler_update_queue_heuristic(now - 180); + tt_u64_op(queue_heuristic, ==, 0); + tt_int_op(queue_heuristic_timestamp, ==, now - 180); + + queue_heuristic = 1000000000L; + queue_heuristic_timestamp = now - 120; + + scheduler_update_queue_heuristic(now - 119); + tt_u64_op(queue_heuristic, ==, 500000000L); + tt_int_op(queue_heuristic_timestamp, ==, now - 119); + + scheduler_update_queue_heuristic(now - 116); + tt_u64_op(queue_heuristic, ==, 62500000L); + tt_int_op(queue_heuristic_timestamp, ==, now - 116); + + qh = scheduler_get_queue_heuristic(); + tt_u64_op(qh, ==, 0); + + done: + return; +} + +struct testcase_t scheduler_tests[] = { + { "channel_states", test_scheduler_channel_states, TT_FORK, NULL, NULL }, + { "compare_channels", test_scheduler_compare_channels, + TT_FORK, NULL, NULL }, + { "initfree", test_scheduler_initfree, TT_FORK, NULL, NULL }, + { "loop", test_scheduler_loop, TT_FORK, NULL, NULL }, + { "queue_heuristic", test_scheduler_queue_heuristic, + TT_FORK, NULL, NULL }, + END_OF_TESTCASES +}; + diff --git a/src/test/test_slow.c b/src/test/test_slow.c new file mode 100644 index 0000000000..32386b485e --- /dev/null +++ b/src/test/test_slow.c @@ -0,0 +1,29 @@ +/* Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2015, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file test_slow.c + * \brief Slower unit tests for many pieces of the lower level Tor modules. + **/ + +#include "orconfig.h" + +#include <stdio.h> +#ifdef HAVE_FCNTL_H +#include <fcntl.h> +#endif + +#include "or.h" +#include "test.h" + +extern struct testcase_t slow_crypto_tests[]; +extern struct testcase_t slow_util_tests[]; + +struct testgroup_t testgroups[] = { + { "slow/crypto/", slow_crypto_tests }, + { "slow/util/", slow_util_tests }, + END_OF_GROUPS +}; + diff --git a/src/test/test_socks.c b/src/test/test_socks.c index 29faa69fb8..465e427930 100644 --- a/src/test/test_socks.c +++ b/src/test/test_socks.c @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "or.h" @@ -63,8 +63,8 @@ test_socks_4_unsupported_commands(void *ptr) ADD_DATA(buf, "\x04\x02\x11\x11\x02\x02\x02\x02\x00"); tt_assert(fetch_from_buf_socks(buf, socks, get_options()->TestSocks, get_options()->SafeSocks) == -1); - tt_int_op(4,==, socks->socks_version); - tt_int_op(0,==, socks->replylen); /* XXX: shouldn't tor reply? */ + tt_int_op(4,OP_EQ, socks->socks_version); + tt_int_op(0,OP_EQ, socks->replylen); /* XXX: shouldn't tor reply? */ done: ; @@ -76,49 +76,49 @@ test_socks_4_supported_commands(void *ptr) { SOCKS_TEST_INIT(); - tt_int_op(0,==, buf_datalen(buf)); + tt_int_op(0,OP_EQ, buf_datalen(buf)); /* SOCKS 4 Send CONNECT [01] to IP address 2.2.2.2:4370 */ ADD_DATA(buf, "\x04\x01\x11\x12\x02\x02\x02\x03\x00"); tt_assert(fetch_from_buf_socks(buf, socks, get_options()->TestSocks, get_options()->SafeSocks) == 1); - tt_int_op(4,==, socks->socks_version); - tt_int_op(0,==, socks->replylen); /* XXX: shouldn't tor reply? */ - tt_int_op(SOCKS_COMMAND_CONNECT,==, socks->command); - tt_str_op("2.2.2.3",==, socks->address); - tt_int_op(4370,==, socks->port); + tt_int_op(4,OP_EQ, socks->socks_version); + tt_int_op(0,OP_EQ, socks->replylen); /* XXX: shouldn't tor reply? */ + tt_int_op(SOCKS_COMMAND_CONNECT,OP_EQ, socks->command); + tt_str_op("2.2.2.3",OP_EQ, socks->address); + tt_int_op(4370,OP_EQ, socks->port); tt_assert(socks->got_auth == 0); tt_assert(! socks->username); - tt_int_op(0,==, buf_datalen(buf)); + tt_int_op(0,OP_EQ, buf_datalen(buf)); socks_request_clear(socks); /* SOCKS 4 Send CONNECT [01] to IP address 2.2.2.2:4369 with userid*/ ADD_DATA(buf, "\x04\x01\x11\x12\x02\x02\x02\x04me\x00"); tt_assert(fetch_from_buf_socks(buf, socks, get_options()->TestSocks, get_options()->SafeSocks) == 1); - tt_int_op(4,==, socks->socks_version); - tt_int_op(0,==, socks->replylen); /* XXX: shouldn't tor reply? */ - tt_int_op(SOCKS_COMMAND_CONNECT,==, socks->command); - tt_str_op("2.2.2.4",==, socks->address); - tt_int_op(4370,==, socks->port); + tt_int_op(4,OP_EQ, socks->socks_version); + tt_int_op(0,OP_EQ, socks->replylen); /* XXX: shouldn't tor reply? */ + tt_int_op(SOCKS_COMMAND_CONNECT,OP_EQ, socks->command); + tt_str_op("2.2.2.4",OP_EQ, socks->address); + tt_int_op(4370,OP_EQ, socks->port); tt_assert(socks->got_auth == 1); tt_assert(socks->username); - tt_int_op(2,==, socks->usernamelen); - tt_mem_op("me",==, socks->username, 2); + tt_int_op(2,OP_EQ, socks->usernamelen); + tt_mem_op("me",OP_EQ, socks->username, 2); - tt_int_op(0,==, buf_datalen(buf)); + tt_int_op(0,OP_EQ, buf_datalen(buf)); socks_request_clear(socks); /* SOCKS 4a Send RESOLVE [F0] request for torproject.org */ ADD_DATA(buf, "\x04\xF0\x01\x01\x00\x00\x00\x02me\x00torproject.org\x00"); tt_assert(fetch_from_buf_socks(buf, socks, get_options()->TestSocks, get_options()->SafeSocks) == 1); - tt_int_op(4,==, socks->socks_version); - tt_int_op(0,==, socks->replylen); /* XXX: shouldn't tor reply? */ - tt_str_op("torproject.org",==, socks->address); + tt_int_op(4,OP_EQ, socks->socks_version); + tt_int_op(0,OP_EQ, socks->replylen); /* XXX: shouldn't tor reply? */ + tt_str_op("torproject.org",OP_EQ, socks->address); - tt_int_op(0,==, buf_datalen(buf)); + tt_int_op(0,OP_EQ, buf_datalen(buf)); done: ; @@ -134,21 +134,21 @@ test_socks_5_unsupported_commands(void *ptr) ADD_DATA(buf, "\x05\x02\x00\x01"); tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks, - get_options()->SafeSocks),==, 0); - tt_int_op(0,==, buf_datalen(buf)); - tt_int_op(5,==, socks->socks_version); - tt_int_op(2,==, socks->replylen); - tt_int_op(5,==, socks->reply[0]); - tt_int_op(0,==, socks->reply[1]); + get_options()->SafeSocks),OP_EQ, 0); + tt_int_op(0,OP_EQ, buf_datalen(buf)); + tt_int_op(5,OP_EQ, socks->socks_version); + tt_int_op(2,OP_EQ, socks->replylen); + tt_int_op(5,OP_EQ, socks->reply[0]); + tt_int_op(0,OP_EQ, socks->reply[1]); ADD_DATA(buf, "\x05\x02\x00\x01\x02\x02\x02\x01\x01\x01"); tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks, - get_options()->SafeSocks),==, -1); + get_options()->SafeSocks),OP_EQ, -1); - tt_int_op(5,==,socks->socks_version); - tt_int_op(10,==,socks->replylen); - tt_int_op(5,==,socks->reply[0]); - tt_int_op(SOCKS5_COMMAND_NOT_SUPPORTED,==,socks->reply[1]); - tt_int_op(1,==,socks->reply[3]); + tt_int_op(5,OP_EQ,socks->socks_version); + tt_int_op(10,OP_EQ,socks->replylen); + tt_int_op(5,OP_EQ,socks->reply[0]); + tt_int_op(SOCKS5_COMMAND_NOT_SUPPORTED,OP_EQ,socks->reply[1]); + tt_int_op(1,OP_EQ,socks->reply[3]); buf_clear(buf); socks_request_clear(socks); @@ -156,20 +156,20 @@ test_socks_5_unsupported_commands(void *ptr) /* SOCKS 5 Send unsupported UDP_ASSOCIATE [03] command */ ADD_DATA(buf, "\x05\x02\x00\x01"); tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks, - get_options()->SafeSocks),==, 0); - tt_int_op(5,==, socks->socks_version); - tt_int_op(2,==, socks->replylen); - tt_int_op(5,==, socks->reply[0]); - tt_int_op(0,==, socks->reply[1]); + get_options()->SafeSocks),OP_EQ, 0); + tt_int_op(5,OP_EQ, socks->socks_version); + tt_int_op(2,OP_EQ, socks->replylen); + tt_int_op(5,OP_EQ, socks->reply[0]); + tt_int_op(0,OP_EQ, socks->reply[1]); ADD_DATA(buf, "\x05\x03\x00\x01\x02\x02\x02\x01\x01\x01"); tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks, - get_options()->SafeSocks),==, -1); + get_options()->SafeSocks),OP_EQ, -1); - tt_int_op(5,==,socks->socks_version); - tt_int_op(10,==,socks->replylen); - tt_int_op(5,==,socks->reply[0]); - tt_int_op(SOCKS5_COMMAND_NOT_SUPPORTED,==,socks->reply[1]); - tt_int_op(1,==,socks->reply[3]); + tt_int_op(5,OP_EQ,socks->socks_version); + tt_int_op(10,OP_EQ,socks->replylen); + tt_int_op(5,OP_EQ,socks->reply[0]); + tt_int_op(SOCKS5_COMMAND_NOT_SUPPORTED,OP_EQ,socks->reply[1]); + tt_int_op(1,OP_EQ,socks->reply[3]); done: ; @@ -184,35 +184,35 @@ test_socks_5_supported_commands(void *ptr) /* SOCKS 5 Send CONNECT [01] to IP address 2.2.2.2:4369 */ ADD_DATA(buf, "\x05\x01\x00"); tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks, - get_options()->SafeSocks),==, 0); - tt_int_op(5,==, socks->socks_version); - tt_int_op(2,==, socks->replylen); - tt_int_op(5,==, socks->reply[0]); - tt_int_op(0,==, socks->reply[1]); + get_options()->SafeSocks),OP_EQ, 0); + tt_int_op(5,OP_EQ, socks->socks_version); + tt_int_op(2,OP_EQ, socks->replylen); + tt_int_op(5,OP_EQ, socks->reply[0]); + tt_int_op(0,OP_EQ, socks->reply[1]); ADD_DATA(buf, "\x05\x01\x00\x01\x02\x02\x02\x02\x11\x11"); tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks, - get_options()->SafeSocks),==, 1); - tt_str_op("2.2.2.2",==, socks->address); - tt_int_op(4369,==, socks->port); + get_options()->SafeSocks),OP_EQ, 1); + tt_str_op("2.2.2.2",OP_EQ, socks->address); + tt_int_op(4369,OP_EQ, socks->port); - tt_int_op(0,==, buf_datalen(buf)); + tt_int_op(0,OP_EQ, buf_datalen(buf)); socks_request_clear(socks); /* SOCKS 5 Send CONNECT [01] to FQDN torproject.org:4369 */ ADD_DATA(buf, "\x05\x01\x00"); ADD_DATA(buf, "\x05\x01\x00\x03\x0Etorproject.org\x11\x11"); tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks, - get_options()->SafeSocks),==, 1); + get_options()->SafeSocks),OP_EQ, 1); - tt_int_op(5,==, socks->socks_version); - tt_int_op(2,==, socks->replylen); - tt_int_op(5,==, socks->reply[0]); - tt_int_op(0,==, socks->reply[1]); - tt_str_op("torproject.org",==, socks->address); - tt_int_op(4369,==, socks->port); + tt_int_op(5,OP_EQ, socks->socks_version); + tt_int_op(2,OP_EQ, socks->replylen); + tt_int_op(5,OP_EQ, socks->reply[0]); + tt_int_op(0,OP_EQ, socks->reply[1]); + tt_str_op("torproject.org",OP_EQ, socks->address); + tt_int_op(4369,OP_EQ, socks->port); - tt_int_op(0,==, buf_datalen(buf)); + tt_int_op(0,OP_EQ, buf_datalen(buf)); socks_request_clear(socks); /* SOCKS 5 Send RESOLVE [F0] request for torproject.org:4369 */ @@ -220,13 +220,13 @@ test_socks_5_supported_commands(void *ptr) ADD_DATA(buf, "\x05\xF0\x00\x03\x0Etorproject.org\x01\x02"); tt_assert(fetch_from_buf_socks(buf, socks, get_options()->TestSocks, get_options()->SafeSocks) == 1); - tt_int_op(5,==, socks->socks_version); - tt_int_op(2,==, socks->replylen); - tt_int_op(5,==, socks->reply[0]); - tt_int_op(0,==, socks->reply[1]); - tt_str_op("torproject.org",==, socks->address); + tt_int_op(5,OP_EQ, socks->socks_version); + tt_int_op(2,OP_EQ, socks->replylen); + tt_int_op(5,OP_EQ, socks->reply[0]); + tt_int_op(0,OP_EQ, socks->reply[1]); + tt_str_op("torproject.org",OP_EQ, socks->address); - tt_int_op(0,==, buf_datalen(buf)); + tt_int_op(0,OP_EQ, buf_datalen(buf)); socks_request_clear(socks); /* SOCKS 5 Should reject RESOLVE [F0] request for IPv4 address @@ -239,11 +239,11 @@ test_socks_5_supported_commands(void *ptr) tt_assert(fetch_from_buf_socks(buf,socks,get_options()->TestSocks,1) == -1); - tt_int_op(5,==,socks->socks_version); - tt_int_op(10,==,socks->replylen); - tt_int_op(5,==,socks->reply[0]); - tt_int_op(SOCKS5_NOT_ALLOWED,==,socks->reply[1]); - tt_int_op(1,==,socks->reply[3]); + tt_int_op(5,OP_EQ,socks->socks_version); + tt_int_op(10,OP_EQ,socks->replylen); + tt_int_op(5,OP_EQ,socks->reply[0]); + tt_int_op(SOCKS5_NOT_ALLOWED,OP_EQ,socks->reply[1]); + tt_int_op(1,OP_EQ,socks->reply[3]); socks_request_clear(socks); @@ -257,11 +257,11 @@ test_socks_5_supported_commands(void *ptr) tt_assert(fetch_from_buf_socks(buf,socks,get_options()->TestSocks,1) == -1); - tt_int_op(5,==,socks->socks_version); - tt_int_op(10,==,socks->replylen); - tt_int_op(5,==,socks->reply[0]); - tt_int_op(SOCKS5_NOT_ALLOWED,==,socks->reply[1]); - tt_int_op(1,==,socks->reply[3]); + tt_int_op(5,OP_EQ,socks->socks_version); + tt_int_op(10,OP_EQ,socks->replylen); + tt_int_op(5,OP_EQ,socks->reply[0]); + tt_int_op(SOCKS5_NOT_ALLOWED,OP_EQ,socks->reply[1]); + tt_int_op(1,OP_EQ,socks->reply[3]); socks_request_clear(socks); @@ -270,13 +270,13 @@ test_socks_5_supported_commands(void *ptr) ADD_DATA(buf, "\x05\xF1\x00\x01\x02\x02\x02\x05\x01\x03"); tt_assert(fetch_from_buf_socks(buf, socks, get_options()->TestSocks, get_options()->SafeSocks) == 1); - tt_int_op(5,==, socks->socks_version); - tt_int_op(2,==, socks->replylen); - tt_int_op(5,==, socks->reply[0]); - tt_int_op(0,==, socks->reply[1]); - tt_str_op("2.2.2.5",==, socks->address); + tt_int_op(5,OP_EQ, socks->socks_version); + tt_int_op(2,OP_EQ, socks->replylen); + tt_int_op(5,OP_EQ, socks->reply[0]); + tt_int_op(0,OP_EQ, socks->reply[1]); + tt_str_op("2.2.2.5",OP_EQ, socks->address); - tt_int_op(0,==, buf_datalen(buf)); + tt_int_op(0,OP_EQ, buf_datalen(buf)); done: ; @@ -293,27 +293,27 @@ test_socks_5_no_authenticate(void *ptr) tt_assert(!fetch_from_buf_socks(buf, socks, get_options()->TestSocks, get_options()->SafeSocks)); - tt_int_op(2,==, socks->replylen); - tt_int_op(5,==, socks->reply[0]); - tt_int_op(SOCKS_NO_AUTH,==, socks->reply[1]); + tt_int_op(2,OP_EQ, socks->replylen); + tt_int_op(5,OP_EQ, socks->reply[0]); + tt_int_op(SOCKS_NO_AUTH,OP_EQ, socks->reply[1]); - tt_int_op(0,==, buf_datalen(buf)); + tt_int_op(0,OP_EQ, buf_datalen(buf)); /*SOCKS 5 Send username/password anyway - pretend to be broken */ ADD_DATA(buf,"\x01\x02\x01\x01\x02\x01\x01"); tt_assert(!fetch_from_buf_socks(buf, socks, get_options()->TestSocks, get_options()->SafeSocks)); - tt_int_op(5,==, socks->socks_version); - tt_int_op(2,==, socks->replylen); - tt_int_op(1,==, socks->reply[0]); - tt_int_op(0,==, socks->reply[1]); + tt_int_op(5,OP_EQ, socks->socks_version); + tt_int_op(2,OP_EQ, socks->replylen); + tt_int_op(1,OP_EQ, socks->reply[0]); + tt_int_op(0,OP_EQ, socks->reply[1]); - tt_int_op(2,==, socks->usernamelen); - tt_int_op(2,==, socks->passwordlen); + tt_int_op(2,OP_EQ, socks->usernamelen); + tt_int_op(2,OP_EQ, socks->passwordlen); - tt_mem_op("\x01\x01",==, socks->username, 2); - tt_mem_op("\x01\x01",==, socks->password, 2); + tt_mem_op("\x01\x01",OP_EQ, socks->username, 2); + tt_mem_op("\x01\x01",OP_EQ, socks->password, 2); done: ; @@ -331,28 +331,28 @@ test_socks_5_authenticate(void *ptr) tt_assert(!fetch_from_buf_socks(buf, socks, get_options()->TestSocks, get_options()->SafeSocks)); - tt_int_op(2,==, socks->replylen); - tt_int_op(5,==, socks->reply[0]); - tt_int_op(SOCKS_USER_PASS,==, socks->reply[1]); - tt_int_op(5,==, socks->socks_version); + tt_int_op(2,OP_EQ, socks->replylen); + tt_int_op(5,OP_EQ, socks->reply[0]); + tt_int_op(SOCKS_USER_PASS,OP_EQ, socks->reply[1]); + tt_int_op(5,OP_EQ, socks->socks_version); - tt_int_op(0,==, buf_datalen(buf)); + tt_int_op(0,OP_EQ, buf_datalen(buf)); /* SOCKS 5 Send username/password */ ADD_DATA(buf, "\x01\x02me\x08mypasswd"); tt_assert(!fetch_from_buf_socks(buf, socks, get_options()->TestSocks, get_options()->SafeSocks)); - tt_int_op(5,==, socks->socks_version); - tt_int_op(2,==, socks->replylen); - tt_int_op(1,==, socks->reply[0]); - tt_int_op(0,==, socks->reply[1]); + tt_int_op(5,OP_EQ, socks->socks_version); + tt_int_op(2,OP_EQ, socks->replylen); + tt_int_op(1,OP_EQ, socks->reply[0]); + tt_int_op(0,OP_EQ, socks->reply[1]); - tt_int_op(2,==, socks->usernamelen); - tt_int_op(8,==, socks->passwordlen); + tt_int_op(2,OP_EQ, socks->usernamelen); + tt_int_op(8,OP_EQ, socks->passwordlen); - tt_mem_op("me",==, socks->username, 2); - tt_mem_op("mypasswd",==, socks->password, 8); + tt_mem_op("me",OP_EQ, socks->username, 2); + tt_mem_op("mypasswd",OP_EQ, socks->password, 8); done: ; @@ -370,12 +370,12 @@ test_socks_5_authenticate_with_data(void *ptr) tt_assert(!fetch_from_buf_socks(buf, socks, get_options()->TestSocks, get_options()->SafeSocks)); - tt_int_op(2,==, socks->replylen); - tt_int_op(5,==, socks->reply[0]); - tt_int_op(SOCKS_USER_PASS,==, socks->reply[1]); - tt_int_op(5,==, socks->socks_version); + tt_int_op(2,OP_EQ, socks->replylen); + tt_int_op(5,OP_EQ, socks->reply[0]); + tt_int_op(SOCKS_USER_PASS,OP_EQ, socks->reply[1]); + tt_int_op(5,OP_EQ, socks->socks_version); - tt_int_op(0,==, buf_datalen(buf)); + tt_int_op(0,OP_EQ, buf_datalen(buf)); /* SOCKS 5 Send username/password */ /* SOCKS 5 Send CONNECT [01] to IP address 2.2.2.2:4369 */ @@ -383,18 +383,18 @@ test_socks_5_authenticate_with_data(void *ptr) tt_assert(fetch_from_buf_socks(buf, socks, get_options()->TestSocks, get_options()->SafeSocks) == 1); - tt_int_op(5,==, socks->socks_version); - tt_int_op(2,==, socks->replylen); - tt_int_op(1,==, socks->reply[0]); - tt_int_op(0,==, socks->reply[1]); + tt_int_op(5,OP_EQ, socks->socks_version); + tt_int_op(2,OP_EQ, socks->replylen); + tt_int_op(1,OP_EQ, socks->reply[0]); + tt_int_op(0,OP_EQ, socks->reply[1]); - tt_str_op("2.2.2.2",==, socks->address); - tt_int_op(4369,==, socks->port); + tt_str_op("2.2.2.2",OP_EQ, socks->address); + tt_int_op(4369,OP_EQ, socks->port); - tt_int_op(2,==, socks->usernamelen); - tt_int_op(3,==, socks->passwordlen); - tt_mem_op("me",==, socks->username, 2); - tt_mem_op("you",==, socks->password, 3); + tt_int_op(2,OP_EQ, socks->usernamelen); + tt_int_op(3,OP_EQ, socks->passwordlen); + tt_mem_op("me",OP_EQ, socks->username, 2); + tt_mem_op("you",OP_EQ, socks->password, 3); done: ; @@ -411,10 +411,10 @@ test_socks_5_auth_before_negotiation(void *ptr) tt_assert(fetch_from_buf_socks(buf, socks, get_options()->TestSocks, get_options()->SafeSocks) == -1); - tt_int_op(0,==, socks->socks_version); - tt_int_op(0,==, socks->replylen); - tt_int_op(0,==, socks->reply[0]); - tt_int_op(0,==, socks->reply[1]); + tt_int_op(0,OP_EQ, socks->socks_version); + tt_int_op(0,OP_EQ, socks->replylen); + tt_int_op(0,OP_EQ, socks->reply[0]); + tt_int_op(0,OP_EQ, socks->reply[1]); done: ; @@ -432,14 +432,14 @@ test_socks_5_malformed_commands(void *ptr) */ ADD_DATA(buf, "\x05\x01\x00"); ADD_DATA(buf, "\x05\x01\x00\x01\x02\x02\x02\x02\x11\x11"); - tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks, 1),==, - -1); + tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks, 1), + OP_EQ, -1); - tt_int_op(5,==,socks->socks_version); - tt_int_op(10,==,socks->replylen); - tt_int_op(5,==,socks->reply[0]); - tt_int_op(SOCKS5_NOT_ALLOWED,==,socks->reply[1]); - tt_int_op(1,==,socks->reply[3]); + tt_int_op(5,OP_EQ,socks->socks_version); + tt_int_op(10,OP_EQ,socks->replylen); + tt_int_op(5,OP_EQ,socks->reply[0]); + tt_int_op(SOCKS5_NOT_ALLOWED,OP_EQ,socks->reply[1]); + tt_int_op(1,OP_EQ,socks->reply[3]); buf_clear(buf); socks_request_clear(socks); @@ -448,13 +448,13 @@ test_socks_5_malformed_commands(void *ptr) ADD_DATA(buf, "\x05\x01\x00"); ADD_DATA(buf, "\x05\xF1\x00\x03\x0Etorproject.org\x11\x11"); tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks, - get_options()->SafeSocks),==, -1); + get_options()->SafeSocks),OP_EQ, -1); - tt_int_op(5,==,socks->socks_version); - tt_int_op(10,==,socks->replylen); - tt_int_op(5,==,socks->reply[0]); - tt_int_op(SOCKS5_ADDRESS_TYPE_NOT_SUPPORTED,==,socks->reply[1]); - tt_int_op(1,==,socks->reply[3]); + tt_int_op(5,OP_EQ,socks->socks_version); + tt_int_op(10,OP_EQ,socks->replylen); + tt_int_op(5,OP_EQ,socks->reply[0]); + tt_int_op(SOCKS5_ADDRESS_TYPE_NOT_SUPPORTED,OP_EQ,socks->reply[1]); + tt_int_op(1,OP_EQ,socks->reply[3]); buf_clear(buf); socks_request_clear(socks); @@ -465,13 +465,13 @@ test_socks_5_malformed_commands(void *ptr) ADD_DATA(buf, "\x05\x01\x00"); ADD_DATA(buf, "\x05\x01\x00\x03\x09\"\"\"\"\".com\x11\x11"); tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks, - get_options()->SafeSocks),==, -1); + get_options()->SafeSocks),OP_EQ, -1); - tt_int_op(5,==,socks->socks_version); - tt_int_op(10,==,socks->replylen); - tt_int_op(5,==,socks->reply[0]); - tt_int_op(SOCKS5_GENERAL_ERROR,==,socks->reply[1]); - tt_int_op(1,==,socks->reply[3]); + tt_int_op(5,OP_EQ,socks->socks_version); + tt_int_op(10,OP_EQ,socks->replylen); + tt_int_op(5,OP_EQ,socks->reply[0]); + tt_int_op(SOCKS5_GENERAL_ERROR,OP_EQ,socks->reply[1]); + tt_int_op(1,OP_EQ,socks->reply[3]); buf_clear(buf); socks_request_clear(socks); @@ -480,13 +480,13 @@ test_socks_5_malformed_commands(void *ptr) ADD_DATA(buf, "\x05\x01\x00"); ADD_DATA(buf, "\x05\x01\x00\x23\x02\x02\x02\x02\x11\x11"); tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks, - get_options()->SafeSocks),==, -1); + get_options()->SafeSocks),OP_EQ, -1); - tt_int_op(5,==,socks->socks_version); - tt_int_op(10,==,socks->replylen); - tt_int_op(5,==,socks->reply[0]); - tt_int_op(SOCKS5_ADDRESS_TYPE_NOT_SUPPORTED,==,socks->reply[1]); - tt_int_op(1,==,socks->reply[3]); + tt_int_op(5,OP_EQ,socks->socks_version); + tt_int_op(10,OP_EQ,socks->replylen); + tt_int_op(5,OP_EQ,socks->reply[0]); + tt_int_op(SOCKS5_ADDRESS_TYPE_NOT_SUPPORTED,OP_EQ,socks->reply[1]); + tt_int_op(1,OP_EQ,socks->reply[3]); done: ; diff --git a/src/test/test_status.c b/src/test/test_status.c index 8bc0152ffb..aa71aa6a9b 100644 --- a/src/test/test_status.c +++ b/src/test/test_status.c @@ -86,62 +86,62 @@ NS(test_main)(void *arg) expected = "0:00 hours"; actual = secs_to_uptime(0); - tt_str_op(actual, ==, expected); + tt_str_op(actual, OP_EQ, expected); tor_free(actual); expected = "0:00 hours"; actual = secs_to_uptime(1); - tt_str_op(actual, ==, expected); + tt_str_op(actual, OP_EQ, expected); tor_free(actual); expected = "0:01 hours"; actual = secs_to_uptime(60); - tt_str_op(actual, ==, expected); + tt_str_op(actual, OP_EQ, expected); tor_free(actual); expected = "0:59 hours"; actual = secs_to_uptime(60 * 59); - tt_str_op(actual, ==, expected); + tt_str_op(actual, OP_EQ, expected); tor_free(actual); expected = "1:00 hours"; actual = secs_to_uptime(60 * 60); - tt_str_op(actual, ==, expected); + tt_str_op(actual, OP_EQ, expected); tor_free(actual); expected = "23:59 hours"; actual = secs_to_uptime(60 * 60 * 23 + 60 * 59); - tt_str_op(actual, ==, expected); + tt_str_op(actual, OP_EQ, expected); tor_free(actual); expected = "1 day 0:00 hours"; actual = secs_to_uptime(60 * 60 * 23 + 60 * 60); - tt_str_op(actual, ==, expected); + tt_str_op(actual, OP_EQ, expected); tor_free(actual); expected = "1 day 0:00 hours"; actual = secs_to_uptime(86400 + 1); - tt_str_op(actual, ==, expected); + tt_str_op(actual, OP_EQ, expected); tor_free(actual); expected = "1 day 0:01 hours"; actual = secs_to_uptime(86400 + 60); - tt_str_op(actual, ==, expected); + tt_str_op(actual, OP_EQ, expected); tor_free(actual); expected = "10 days 0:00 hours"; actual = secs_to_uptime(86400 * 10); - tt_str_op(actual, ==, expected); + tt_str_op(actual, OP_EQ, expected); tor_free(actual); expected = "10 days 0:00 hours"; actual = secs_to_uptime(864000 + 1); - tt_str_op(actual, ==, expected); + tt_str_op(actual, OP_EQ, expected); tor_free(actual); expected = "10 days 0:01 hours"; actual = secs_to_uptime(864000 + 60); - tt_str_op(actual, ==, expected); + tt_str_op(actual, OP_EQ, expected); tor_free(actual); done: @@ -167,62 +167,62 @@ NS(test_main)(void *arg) expected = "0 kB"; actual = bytes_to_usage(0); - tt_str_op(actual, ==, expected); + tt_str_op(actual, OP_EQ, expected); tor_free(actual); expected = "0 kB"; actual = bytes_to_usage(1); - tt_str_op(actual, ==, expected); + tt_str_op(actual, OP_EQ, expected); tor_free(actual); expected = "1 kB"; actual = bytes_to_usage(1024); - tt_str_op(actual, ==, expected); + tt_str_op(actual, OP_EQ, expected); tor_free(actual); expected = "1023 kB"; actual = bytes_to_usage((1 << 20) - 1); - tt_str_op(actual, ==, expected); + tt_str_op(actual, OP_EQ, expected); tor_free(actual); expected = "1.00 MB"; actual = bytes_to_usage((1 << 20)); - tt_str_op(actual, ==, expected); + tt_str_op(actual, OP_EQ, expected); tor_free(actual); expected = "1.00 MB"; actual = bytes_to_usage((1 << 20) + 5242); - tt_str_op(actual, ==, expected); + tt_str_op(actual, OP_EQ, expected); tor_free(actual); expected = "1.01 MB"; actual = bytes_to_usage((1 << 20) + 5243); - tt_str_op(actual, ==, expected); + tt_str_op(actual, OP_EQ, expected); tor_free(actual); expected = "1024.00 MB"; actual = bytes_to_usage((1 << 30) - 1); - tt_str_op(actual, ==, expected); + tt_str_op(actual, OP_EQ, expected); tor_free(actual); expected = "1.00 GB"; actual = bytes_to_usage((1 << 30)); - tt_str_op(actual, ==, expected); + tt_str_op(actual, OP_EQ, expected); tor_free(actual); expected = "1.00 GB"; actual = bytes_to_usage((1 << 30) + 5368709); - tt_str_op(actual, ==, expected); + tt_str_op(actual, OP_EQ, expected); tor_free(actual); expected = "1.01 GB"; actual = bytes_to_usage((1 << 30) + 5368710); - tt_str_op(actual, ==, expected); + tt_str_op(actual, OP_EQ, expected); tor_free(actual); expected = "10.00 GB"; actual = bytes_to_usage((U64_LITERAL(1) << 30) * 10L); - tt_str_op(actual, ==, expected); + tt_str_op(actual, OP_EQ, expected); tor_free(actual); done: @@ -259,7 +259,7 @@ NS(test_main)(void *arg) expected = -1; actual = log_heartbeat(0); - tt_int_op(actual, ==, expected); + tt_int_op(actual, OP_EQ, expected); done: NS_UNMOCK(tls_get_write_overhead_ratio); @@ -347,8 +347,8 @@ NS(test_main)(void *arg) expected = 0; actual = log_heartbeat(0); - tt_int_op(actual, ==, expected); - tt_int_op(CALLED(logv), ==, 3); + tt_int_op(actual, OP_EQ, expected); + tt_int_op(CALLED(logv), OP_EQ, 3); done: NS_UNMOCK(tls_get_write_overhead_ratio); @@ -411,39 +411,39 @@ NS(logv)(int severity, log_domain_mask_t domain, switch (CALLED(logv)) { case 0: - tt_int_op(severity, ==, LOG_NOTICE); - tt_int_op(domain, ==, LD_HEARTBEAT); - tt_ptr_op(strstr(funcname, "log_heartbeat"), !=, NULL); - tt_ptr_op(suffix, ==, NULL); - tt_str_op(format, ==, + tt_int_op(severity, OP_EQ, LOG_NOTICE); + tt_int_op(domain, OP_EQ, LD_HEARTBEAT); + tt_ptr_op(strstr(funcname, "log_heartbeat"), OP_NE, NULL); + tt_ptr_op(suffix, OP_EQ, NULL); + tt_str_op(format, OP_EQ, "Heartbeat: It seems like we are not in the cached consensus."); break; case 1: - tt_int_op(severity, ==, LOG_NOTICE); - tt_int_op(domain, ==, LD_HEARTBEAT); - tt_ptr_op(strstr(funcname, "log_heartbeat"), !=, NULL); - tt_ptr_op(suffix, ==, NULL); - tt_str_op(format, ==, + tt_int_op(severity, OP_EQ, LOG_NOTICE); + tt_int_op(domain, OP_EQ, LD_HEARTBEAT); + tt_ptr_op(strstr(funcname, "log_heartbeat"), OP_NE, NULL); + tt_ptr_op(suffix, OP_EQ, NULL); + tt_str_op(format, OP_EQ, "Heartbeat: Tor's uptime is %s, with %d circuits open. " "I've sent %s and received %s.%s"); - tt_str_op(va_arg(ap, char *), ==, "0:00 hours"); /* uptime */ - tt_int_op(va_arg(ap, int), ==, 0); /* count_circuits() */ - tt_str_op(va_arg(ap, char *), ==, "0 kB"); /* bw_sent */ - tt_str_op(va_arg(ap, char *), ==, "0 kB"); /* bw_rcvd */ - tt_str_op(va_arg(ap, char *), ==, ""); /* hibernating */ + tt_str_op(va_arg(ap, char *), OP_EQ, "0:00 hours"); /* uptime */ + tt_int_op(va_arg(ap, int), OP_EQ, 0); /* count_circuits() */ + tt_str_op(va_arg(ap, char *), OP_EQ, "0 kB"); /* bw_sent */ + tt_str_op(va_arg(ap, char *), OP_EQ, "0 kB"); /* bw_rcvd */ + tt_str_op(va_arg(ap, char *), OP_EQ, ""); /* hibernating */ break; case 2: - tt_int_op(severity, ==, LOG_NOTICE); - tt_int_op(domain, ==, LD_HEARTBEAT); - tt_ptr_op( - strstr(funcname, "rep_hist_log_circuit_handshake_stats"), !=, NULL); - tt_ptr_op(suffix, ==, NULL); - tt_str_op(format, ==, + tt_int_op(severity, OP_EQ, LOG_NOTICE); + tt_int_op(domain, OP_EQ, LD_HEARTBEAT); + tt_ptr_op(strstr(funcname, "rep_hist_log_circuit_handshake_stats"), + OP_NE, NULL); + tt_ptr_op(suffix, OP_EQ, NULL); + tt_str_op(format, OP_EQ, "Circuit handshake stats since last time: %d/%d TAP, %d/%d NTor."); - tt_int_op(va_arg(ap, int), ==, 1); /* handshakes assigned (TAP) */ - tt_int_op(va_arg(ap, int), ==, 1); /* handshakes requested (TAP) */ - tt_int_op(va_arg(ap, int), ==, 1); /* handshakes assigned (NTOR) */ - tt_int_op(va_arg(ap, int), ==, 1); /* handshakes requested (NTOR) */ + tt_int_op(va_arg(ap, int), OP_EQ, 1); /* handshakes assigned (TAP) */ + tt_int_op(va_arg(ap, int), OP_EQ, 1); /* handshakes requested (TAP) */ + tt_int_op(va_arg(ap, int), OP_EQ, 1); /* handshakes assigned (NTOR) */ + tt_int_op(va_arg(ap, int), OP_EQ, 1); /* handshakes requested (NTOR) */ break; default: tt_abort_msg("unexpected call to logv()"); // TODO: prettyprint args @@ -502,7 +502,7 @@ NS(test_main)(void *arg) expected = 0; actual = log_heartbeat(0); - tt_int_op(actual, ==, expected); + tt_int_op(actual, OP_EQ, expected); done: NS_UNMOCK(tls_get_write_overhead_ratio); @@ -564,18 +564,18 @@ static void NS(logv)(int severity, log_domain_mask_t domain, const char *funcname, const char *suffix, const char *format, va_list ap) { - tt_int_op(severity, ==, LOG_NOTICE); - tt_int_op(domain, ==, LD_HEARTBEAT); - tt_ptr_op(strstr(funcname, "log_heartbeat"), !=, NULL); - tt_ptr_op(suffix, ==, NULL); - tt_str_op(format, ==, + tt_int_op(severity, OP_EQ, LOG_NOTICE); + tt_int_op(domain, OP_EQ, LD_HEARTBEAT); + tt_ptr_op(strstr(funcname, "log_heartbeat"), OP_NE, NULL); + tt_ptr_op(suffix, OP_EQ, NULL); + tt_str_op(format, OP_EQ, "Heartbeat: Tor's uptime is %s, with %d circuits open. " "I've sent %s and received %s.%s"); - tt_str_op(va_arg(ap, char *), ==, "0:00 hours"); /* uptime */ - tt_int_op(va_arg(ap, int), ==, 0); /* count_circuits() */ - tt_str_op(va_arg(ap, char *), ==, "0 kB"); /* bw_sent */ - tt_str_op(va_arg(ap, char *), ==, "0 kB"); /* bw_rcvd */ - tt_str_op(va_arg(ap, char *), ==, " We are currently hibernating."); + tt_str_op(va_arg(ap, char *), OP_EQ, "0:00 hours"); /* uptime */ + tt_int_op(va_arg(ap, int), OP_EQ, 0); /* count_circuits() */ + tt_str_op(va_arg(ap, char *), OP_EQ, "0 kB"); /* bw_sent */ + tt_str_op(va_arg(ap, char *), OP_EQ, "0 kB"); /* bw_rcvd */ + tt_str_op(va_arg(ap, char *), OP_EQ, " We are currently hibernating."); done: ; @@ -638,8 +638,8 @@ NS(test_main)(void *arg) expected = 0; actual = log_heartbeat(0); - tt_int_op(actual, ==, expected); - tt_int_op(CALLED(logv), ==, 2); + tt_int_op(actual, OP_EQ, expected); + tt_int_op(CALLED(logv), OP_EQ, 2); done: NS_UNMOCK(tls_get_write_overhead_ratio); @@ -711,34 +711,35 @@ NS(logv)(int severity, log_domain_mask_t domain, switch (CALLED(logv)) { case 0: - tt_int_op(severity, ==, LOG_NOTICE); - tt_int_op(domain, ==, LD_HEARTBEAT); - tt_ptr_op(strstr(funcname, "log_heartbeat"), !=, NULL); - tt_ptr_op(suffix, ==, NULL); - tt_str_op(format, ==, + tt_int_op(severity, OP_EQ, LOG_NOTICE); + tt_int_op(domain, OP_EQ, LD_HEARTBEAT); + tt_ptr_op(strstr(funcname, "log_heartbeat"), OP_NE, NULL); + tt_ptr_op(suffix, OP_EQ, NULL); + tt_str_op(format, OP_EQ, "Heartbeat: Tor's uptime is %s, with %d circuits open. " "I've sent %s and received %s.%s"); - tt_str_op(va_arg(ap, char *), ==, "0:00 hours"); /* uptime */ - tt_int_op(va_arg(ap, int), ==, 0); /* count_circuits() */ - tt_str_op(va_arg(ap, char *), ==, "0 kB"); /* bw_sent */ - tt_str_op(va_arg(ap, char *), ==, "0 kB"); /* bw_rcvd */ - tt_str_op(va_arg(ap, char *), ==, ""); /* hibernating */ + tt_str_op(va_arg(ap, char *), OP_EQ, "0:00 hours"); /* uptime */ + tt_int_op(va_arg(ap, int), OP_EQ, 0); /* count_circuits() */ + tt_str_op(va_arg(ap, char *), OP_EQ, "0 kB"); /* bw_sent */ + tt_str_op(va_arg(ap, char *), OP_EQ, "0 kB"); /* bw_rcvd */ + tt_str_op(va_arg(ap, char *), OP_EQ, ""); /* hibernating */ break; case 1: - tt_int_op(severity, ==, LOG_NOTICE); - tt_int_op(domain, ==, LD_HEARTBEAT); - tt_ptr_op(strstr(funcname, "log_accounting"), !=, NULL); - tt_ptr_op(suffix, ==, NULL); - tt_str_op(format, ==, + tt_int_op(severity, OP_EQ, LOG_NOTICE); + tt_int_op(domain, OP_EQ, LD_HEARTBEAT); + tt_ptr_op(strstr(funcname, "log_accounting"), OP_NE, NULL); + tt_ptr_op(suffix, OP_EQ, NULL); + tt_str_op(format, OP_EQ, "Heartbeat: Accounting enabled. Sent: %s / %s, Received: %s / %s. " "The current accounting interval ends on %s, in %s."); - tt_str_op(va_arg(ap, char *), ==, "0 kB"); /* acc_sent */ - tt_str_op(va_arg(ap, char *), ==, "0 kB"); /* acc_max */ - tt_str_op(va_arg(ap, char *), ==, "0 kB"); /* acc_rcvd */ - tt_str_op(va_arg(ap, char *), ==, "0 kB"); /* acc_max */ + tt_str_op(va_arg(ap, char *), OP_EQ, "0 kB"); /* acc_sent */ + tt_str_op(va_arg(ap, char *), OP_EQ, "0 kB"); /* acc_max */ + tt_str_op(va_arg(ap, char *), OP_EQ, "0 kB"); /* acc_rcvd */ + tt_str_op(va_arg(ap, char *), OP_EQ, "0 kB"); /* acc_max */ /* format_local_iso_time uses local tz, just check mins and secs. */ - tt_ptr_op(strstr(va_arg(ap, char *), ":01:00"), !=, NULL); /* end_buf */ - tt_str_op(va_arg(ap, char *), ==, "0:01 hours"); /* remaining */ + tt_ptr_op(strstr(va_arg(ap, char *), ":01:00"), + OP_NE, NULL); /* end_buf */ + tt_str_op(va_arg(ap, char *), OP_EQ, "0:01 hours"); /* remaining */ break; default: tt_abort_msg("unexpected call to logv()"); // TODO: prettyprint args @@ -824,8 +825,8 @@ NS(test_main)(void *arg) expected = 0; actual = log_heartbeat(0); - tt_int_op(actual, ==, expected); - tt_int_op(CALLED(logv), ==, 2); + tt_int_op(actual, OP_EQ, expected); + tt_int_op(CALLED(logv), OP_EQ, 2); done: stats_n_data_bytes_packaged = 0; @@ -893,27 +894,27 @@ NS(logv)(int severity, log_domain_mask_t domain, const char *funcname, switch (CALLED(logv)) { case 0: - tt_int_op(severity, ==, LOG_NOTICE); - tt_int_op(domain, ==, LD_HEARTBEAT); - tt_ptr_op(strstr(funcname, "log_heartbeat"), !=, NULL); - tt_ptr_op(suffix, ==, NULL); - tt_str_op(format, ==, + tt_int_op(severity, OP_EQ, LOG_NOTICE); + tt_int_op(domain, OP_EQ, LD_HEARTBEAT); + tt_ptr_op(strstr(funcname, "log_heartbeat"), OP_NE, NULL); + tt_ptr_op(suffix, OP_EQ, NULL); + tt_str_op(format, OP_EQ, "Heartbeat: Tor's uptime is %s, with %d circuits open. " "I've sent %s and received %s.%s"); - tt_str_op(va_arg(ap, char *), ==, "0:00 hours"); /* uptime */ - tt_int_op(va_arg(ap, int), ==, 0); /* count_circuits() */ - tt_str_op(va_arg(ap, char *), ==, "0 kB"); /* bw_sent */ - tt_str_op(va_arg(ap, char *), ==, "0 kB"); /* bw_rcvd */ - tt_str_op(va_arg(ap, char *), ==, ""); /* hibernating */ + tt_str_op(va_arg(ap, char *), OP_EQ, "0:00 hours"); /* uptime */ + tt_int_op(va_arg(ap, int), OP_EQ, 0); /* count_circuits() */ + tt_str_op(va_arg(ap, char *), OP_EQ, "0 kB"); /* bw_sent */ + tt_str_op(va_arg(ap, char *), OP_EQ, "0 kB"); /* bw_rcvd */ + tt_str_op(va_arg(ap, char *), OP_EQ, ""); /* hibernating */ break; case 1: - tt_int_op(severity, ==, LOG_NOTICE); - tt_int_op(domain, ==, LD_HEARTBEAT); - tt_ptr_op(strstr(funcname, "log_heartbeat"), !=, NULL); - tt_ptr_op(suffix, ==, NULL); - tt_str_op(format, ==, + tt_int_op(severity, OP_EQ, LOG_NOTICE); + tt_int_op(domain, OP_EQ, LD_HEARTBEAT); + tt_ptr_op(strstr(funcname, "log_heartbeat"), OP_NE, NULL); + tt_ptr_op(suffix, OP_EQ, NULL); + tt_str_op(format, OP_EQ, "Average packaged cell fullness: %2.3f%%"); - tt_int_op(fabs(va_arg(ap, double) - 100.0) <= DBL_EPSILON, ==, 1); + tt_int_op(fabs(va_arg(ap, double) - 100.0) <= DBL_EPSILON, OP_EQ, 1); break; default: tt_abort_msg("unexpected call to logv()"); // TODO: prettyprint args @@ -982,8 +983,8 @@ NS(test_main)(void *arg) expected = 0; actual = log_heartbeat(0); - tt_int_op(actual, ==, expected); - tt_int_op(CALLED(logv), ==, 2); + tt_int_op(actual, OP_EQ, expected); + tt_int_op(CALLED(logv), OP_EQ, 2); done: NS_UNMOCK(tls_get_write_overhead_ratio); @@ -1049,26 +1050,26 @@ NS(logv)(int severity, log_domain_mask_t domain, switch (CALLED(logv)) { case 0: - tt_int_op(severity, ==, LOG_NOTICE); - tt_int_op(domain, ==, LD_HEARTBEAT); - tt_ptr_op(strstr(funcname, "log_heartbeat"), !=, NULL); - tt_ptr_op(suffix, ==, NULL); - tt_str_op(format, ==, + tt_int_op(severity, OP_EQ, LOG_NOTICE); + tt_int_op(domain, OP_EQ, LD_HEARTBEAT); + tt_ptr_op(strstr(funcname, "log_heartbeat"), OP_NE, NULL); + tt_ptr_op(suffix, OP_EQ, NULL); + tt_str_op(format, OP_EQ, "Heartbeat: Tor's uptime is %s, with %d circuits open. " "I've sent %s and received %s.%s"); - tt_str_op(va_arg(ap, char *), ==, "0:00 hours"); /* uptime */ - tt_int_op(va_arg(ap, int), ==, 0); /* count_circuits() */ - tt_str_op(va_arg(ap, char *), ==, "0 kB"); /* bw_sent */ - tt_str_op(va_arg(ap, char *), ==, "0 kB"); /* bw_rcvd */ - tt_str_op(va_arg(ap, char *), ==, ""); /* hibernating */ + tt_str_op(va_arg(ap, char *), OP_EQ, "0:00 hours"); /* uptime */ + tt_int_op(va_arg(ap, int), OP_EQ, 0); /* count_circuits() */ + tt_str_op(va_arg(ap, char *), OP_EQ, "0 kB"); /* bw_sent */ + tt_str_op(va_arg(ap, char *), OP_EQ, "0 kB"); /* bw_rcvd */ + tt_str_op(va_arg(ap, char *), OP_EQ, ""); /* hibernating */ break; case 1: - tt_int_op(severity, ==, LOG_NOTICE); - tt_int_op(domain, ==, LD_HEARTBEAT); - tt_ptr_op(strstr(funcname, "log_heartbeat"), !=, NULL); - tt_ptr_op(suffix, ==, NULL); - tt_str_op(format, ==, "TLS write overhead: %.f%%"); - tt_int_op(fabs(va_arg(ap, double) - 100.0) <= DBL_EPSILON, ==, 1); + tt_int_op(severity, OP_EQ, LOG_NOTICE); + tt_int_op(domain, OP_EQ, LD_HEARTBEAT); + tt_ptr_op(strstr(funcname, "log_heartbeat"), OP_NE, NULL); + tt_ptr_op(suffix, OP_EQ, NULL); + tt_str_op(format, OP_EQ, "TLS write overhead: %.f%%"); + tt_int_op(fabs(va_arg(ap, double) - 100.0) <= DBL_EPSILON, OP_EQ, 1); break; default: tt_abort_msg("unexpected call to logv()"); // TODO: prettyprint args diff --git a/src/test/test_threads.c b/src/test/test_threads.c new file mode 100644 index 0000000000..2ac08d4d28 --- /dev/null +++ b/src/test/test_threads.c @@ -0,0 +1,316 @@ +/* Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2015, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "orconfig.h" +#include "or.h" +#include "compat_threads.h" +#include "test.h" + +/** mutex for thread test to stop the threads hitting data at the same time. */ +static tor_mutex_t *thread_test_mutex_ = NULL; +/** mutexes for the thread test to make sure that the threads have to + * interleave somewhat. */ +static tor_mutex_t *thread_test_start1_ = NULL, + *thread_test_start2_ = NULL; +/** Shared strmap for the thread test. */ +static strmap_t *thread_test_strmap_ = NULL; +/** The name of thread1 for the thread test */ +static char *thread1_name_ = NULL; +/** The name of thread2 for the thread test */ +static char *thread2_name_ = NULL; + +static int thread_fns_failed = 0; + +static unsigned long thread_fn_tid1, thread_fn_tid2; + +static void thread_test_func_(void* _s) ATTR_NORETURN; + +/** How many iterations have the threads in the unit test run? */ +static int t1_count = 0, t2_count = 0; + +/** Helper function for threading unit tests: This function runs in a + * subthread. It grabs its own mutex (start1 or start2) to make sure that it + * should start, then it repeatedly alters _test_thread_strmap protected by + * thread_test_mutex_. */ +static void +thread_test_func_(void* _s) +{ + char *s = _s; + int i, *count; + tor_mutex_t *m; + char buf[64]; + char **cp; + if (!strcmp(s, "thread 1")) { + m = thread_test_start1_; + cp = &thread1_name_; + count = &t1_count; + thread_fn_tid1 = tor_get_thread_id(); + } else { + m = thread_test_start2_; + cp = &thread2_name_; + count = &t2_count; + thread_fn_tid2 = tor_get_thread_id(); + } + + tor_snprintf(buf, sizeof(buf), "%lu", tor_get_thread_id()); + *cp = tor_strdup(buf); + + tor_mutex_acquire(m); + + for (i=0; i<10000; ++i) { + tor_mutex_acquire(thread_test_mutex_); + strmap_set(thread_test_strmap_, "last to run", *cp); + ++*count; + tor_mutex_release(thread_test_mutex_); + } + tor_mutex_acquire(thread_test_mutex_); + strmap_set(thread_test_strmap_, s, *cp); + if (in_main_thread()) + ++thread_fns_failed; + tor_mutex_release(thread_test_mutex_); + + tor_mutex_release(m); + + spawn_exit(); +} + +/** Run unit tests for threading logic. */ +static void +test_threads_basic(void *arg) +{ + char *s1 = NULL, *s2 = NULL; + int done = 0, timedout = 0; + time_t started; +#ifndef _WIN32 + struct timeval tv; + tv.tv_sec=0; + tv.tv_usec=100*1000; +#endif + (void) arg; + + set_main_thread(); + + thread_test_mutex_ = tor_mutex_new(); + thread_test_start1_ = tor_mutex_new(); + thread_test_start2_ = tor_mutex_new(); + thread_test_strmap_ = strmap_new(); + s1 = tor_strdup("thread 1"); + s2 = tor_strdup("thread 2"); + tor_mutex_acquire(thread_test_start1_); + tor_mutex_acquire(thread_test_start2_); + spawn_func(thread_test_func_, s1); + spawn_func(thread_test_func_, s2); + tor_mutex_release(thread_test_start2_); + tor_mutex_release(thread_test_start1_); + started = time(NULL); + while (!done) { + tor_mutex_acquire(thread_test_mutex_); + strmap_assert_ok(thread_test_strmap_); + if (strmap_get(thread_test_strmap_, "thread 1") && + strmap_get(thread_test_strmap_, "thread 2")) { + done = 1; + } else if (time(NULL) > started + 150) { + timedout = done = 1; + } + tor_mutex_release(thread_test_mutex_); +#ifndef _WIN32 + /* Prevent the main thread from starving the worker threads. */ + select(0, NULL, NULL, NULL, &tv); +#endif + } + tor_mutex_acquire(thread_test_start1_); + tor_mutex_release(thread_test_start1_); + tor_mutex_acquire(thread_test_start2_); + tor_mutex_release(thread_test_start2_); + + tor_mutex_free(thread_test_mutex_); + + if (timedout) { + printf("\nTimed out: %d %d", t1_count, t2_count); + tt_assert(strmap_get(thread_test_strmap_, "thread 1")); + tt_assert(strmap_get(thread_test_strmap_, "thread 2")); + tt_assert(!timedout); + } + + /* different thread IDs. */ + tt_assert(strcmp(strmap_get(thread_test_strmap_, "thread 1"), + strmap_get(thread_test_strmap_, "thread 2"))); + tt_assert(!strcmp(strmap_get(thread_test_strmap_, "thread 1"), + strmap_get(thread_test_strmap_, "last to run")) || + !strcmp(strmap_get(thread_test_strmap_, "thread 2"), + strmap_get(thread_test_strmap_, "last to run"))); + + tt_int_op(thread_fns_failed, ==, 0); + tt_int_op(thread_fn_tid1, !=, thread_fn_tid2); + + done: + tor_free(s1); + tor_free(s2); + tor_free(thread1_name_); + tor_free(thread2_name_); + if (thread_test_strmap_) + strmap_free(thread_test_strmap_, NULL); + if (thread_test_start1_) + tor_mutex_free(thread_test_start1_); + if (thread_test_start2_) + tor_mutex_free(thread_test_start2_); +} + +typedef struct cv_testinfo_s { + tor_cond_t *cond; + tor_mutex_t *mutex; + int value; + int addend; + int shutdown; + int n_shutdown; + int n_wakeups; + int n_timeouts; + int n_threads; + const struct timeval *tv; +} cv_testinfo_t; + +static cv_testinfo_t * +cv_testinfo_new(void) +{ + cv_testinfo_t *i = tor_malloc_zero(sizeof(*i)); + i->cond = tor_cond_new(); + i->mutex = tor_mutex_new_nonrecursive(); + return i; +} + +static void +cv_testinfo_free(cv_testinfo_t *i) +{ + if (!i) + return; + tor_cond_free(i->cond); + tor_mutex_free(i->mutex); + tor_free(i); +} + +static void cv_test_thr_fn_(void *arg) ATTR_NORETURN; + +static void +cv_test_thr_fn_(void *arg) +{ + cv_testinfo_t *i = arg; + int tid, r; + + tor_mutex_acquire(i->mutex); + tid = i->n_threads++; + tor_mutex_release(i->mutex); + (void) tid; + + tor_mutex_acquire(i->mutex); + while (1) { + if (i->addend) { + i->value += i->addend; + i->addend = 0; + } + + if (i->shutdown) { + ++i->n_shutdown; + i->shutdown = 0; + tor_mutex_release(i->mutex); + spawn_exit(); + } + r = tor_cond_wait(i->cond, i->mutex, i->tv); + ++i->n_wakeups; + if (r == 1) { + ++i->n_timeouts; + tor_mutex_release(i->mutex); + spawn_exit(); + } + } +} + +static void +test_threads_conditionvar(void *arg) +{ + cv_testinfo_t *ti=NULL; + const struct timeval msec100 = { 0, 100*1000 }; + const int timeout = !strcmp(arg, "tv"); + + ti = cv_testinfo_new(); + if (timeout) { + ti->tv = &msec100; + } + spawn_func(cv_test_thr_fn_, ti); + spawn_func(cv_test_thr_fn_, ti); + spawn_func(cv_test_thr_fn_, ti); + spawn_func(cv_test_thr_fn_, ti); + + tor_mutex_acquire(ti->mutex); + ti->addend = 7; + ti->shutdown = 1; + tor_cond_signal_one(ti->cond); + tor_mutex_release(ti->mutex); + +#define SPIN() \ + while (1) { \ + tor_mutex_acquire(ti->mutex); \ + if (ti->addend == 0) { \ + break; \ + } \ + tor_mutex_release(ti->mutex); \ + } + + SPIN(); + + ti->addend = 30; + ti->shutdown = 1; + tor_cond_signal_all(ti->cond); + tor_mutex_release(ti->mutex); + SPIN(); + + ti->addend = 1000; + if (! timeout) ti->shutdown = 1; + tor_cond_signal_one(ti->cond); + tor_mutex_release(ti->mutex); + SPIN(); + ti->addend = 300; + if (! timeout) ti->shutdown = 1; + tor_cond_signal_all(ti->cond); + tor_mutex_release(ti->mutex); + + SPIN(); + tor_mutex_release(ti->mutex); + + tt_int_op(ti->value, ==, 1337); + if (!timeout) { + tt_int_op(ti->n_shutdown, ==, 4); + } else { +#ifdef _WIN32 + Sleep(500); /* msec */ +#elif defined(HAVE_USLEEP) + usleep(500*1000); /* usec */ +#else + { + struct tv = { 0, 500*1000 }; + select(0, NULL, NULL, NULL, &tv); + } +#endif + tor_mutex_acquire(ti->mutex); + tt_int_op(ti->n_shutdown, ==, 2); + tt_int_op(ti->n_timeouts, ==, 2); + tor_mutex_release(ti->mutex); + } + + done: + cv_testinfo_free(ti); +} + +#define THREAD_TEST(name) \ + { #name, test_threads_##name, TT_FORK, NULL, NULL } + +struct testcase_t thread_tests[] = { + THREAD_TEST(basic), + { "conditionvar", test_threads_conditionvar, TT_FORK, + &passthrough_setup, (void*)"no-tv" }, + { "conditionvar_timeout", test_threads_conditionvar, TT_FORK, + &passthrough_setup, (void*)"tv" }, + END_OF_TESTCASES +}; + diff --git a/src/test/test_util.c b/src/test/test_util.c index 04dfe64f5a..e5df5b4494 100644 --- a/src/test/test_util.c +++ b/src/test/test_util.c @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2014, The Tor Project, Inc. */ + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" @@ -53,20 +53,20 @@ test_util_read_until_eof_impl(const char *fname, size_t file_len, crypto_rand(test_str, file_len); r = write_bytes_to_file(fifo_name, test_str, file_len, 1); - tt_int_op(r, ==, 0); + tt_int_op(r, OP_EQ, 0); fd = open(fifo_name, O_RDONLY|O_BINARY); - tt_int_op(fd, >=, 0); + tt_int_op(fd, OP_GE, 0); str = read_file_to_str_until_eof(fd, read_limit, &sz); tt_assert(str != NULL); if (read_limit < file_len) - tt_int_op(sz, ==, read_limit); + tt_int_op(sz, OP_EQ, read_limit); else - tt_int_op(sz, ==, file_len); + tt_int_op(sz, OP_EQ, file_len); - tt_mem_op(test_str, ==, str, sz); - tt_int_op(str[sz], ==, '\0'); + tt_mem_op(test_str, OP_EQ, str, sz); + tt_int_op(str[sz], OP_EQ, '\0'); done: unlink(fifo_name); @@ -168,17 +168,17 @@ test_util_write_chunks_to_file(void *arg) // write a known string to a file where the tempfile will be r = write_bytes_to_file(tempname, temp_str, temp_str_len, 1); - tt_int_op(r, ==, 0); + tt_int_op(r, OP_EQ, 0); // call write_chunks_to_file r = write_chunks_to_file(fname, chunks, 1, 0); - tt_int_op(r, ==, 0); + tt_int_op(r, OP_EQ, 0); // assert the file has been written (expected size) str = read_file_to_str(fname, RFTS_BIN, &st); tt_assert(str != NULL); - tt_u64_op((uint64_t)st.st_size, ==, data_str_len); - tt_mem_op(data_str, ==, str, data_str_len); + tt_u64_op((uint64_t)st.st_size, OP_EQ, data_str_len); + tt_mem_op(data_str, OP_EQ, str, data_str_len); tor_free(str); // assert that the tempfile is removed (should not leave artifacts) @@ -187,7 +187,7 @@ test_util_write_chunks_to_file(void *arg) // Remove old testfile for second test r = unlink(fname); - tt_int_op(r, ==, 0); + tt_int_op(r, OP_EQ, 0); tor_free(fname); tor_free(tempname); @@ -199,24 +199,24 @@ test_util_write_chunks_to_file(void *arg) // write a known string to a file where the tempfile will be r = write_bytes_to_file(tempname, temp_str, temp_str_len, 1); - tt_int_op(r, ==, 0); + tt_int_op(r, OP_EQ, 0); // call write_chunks_to_file with no_tempfile = true r = write_chunks_to_file(fname, chunks, 1, 1); - tt_int_op(r, ==, 0); + tt_int_op(r, OP_EQ, 0); // assert the file has been written (expected size) str = read_file_to_str(fname, RFTS_BIN, &st); tt_assert(str != NULL); - tt_u64_op((uint64_t)st.st_size, ==, data_str_len); - tt_mem_op(data_str, ==, str, data_str_len); + tt_u64_op((uint64_t)st.st_size, OP_EQ, data_str_len); + tt_mem_op(data_str, OP_EQ, str, data_str_len); tor_free(str); // assert the tempfile still contains the known string str = read_file_to_str(tempname, RFTS_BIN, &st); tt_assert(str != NULL); - tt_u64_op((uint64_t)st.st_size, ==, temp_str_len); - tt_mem_op(temp_str, ==, str, temp_str_len); + tt_u64_op((uint64_t)st.st_size, OP_EQ, temp_str_len); + tt_mem_op(temp_str, OP_EQ, str, temp_str_len); done: unlink(fname); @@ -229,7 +229,7 @@ test_util_write_chunks_to_file(void *arg) tor_free(temp_str); } -#define _TFE(a, b, f) tt_int_op((a).f, ==, (b).f) +#define _TFE(a, b, f) tt_int_op((a).f, OP_EQ, (b).f) /** test the minimum set of struct tm fields needed for a unique epoch value * this is also the set we use to test tor_timegm */ #define TM_EQUAL(a, b) \ @@ -261,23 +261,23 @@ test_util_time(void *arg) end.tv_sec = 5; end.tv_usec = 5000; - tt_int_op(0L,==, tv_udiff(&start, &end)); + tt_int_op(0L,OP_EQ, tv_udiff(&start, &end)); end.tv_usec = 7000; - tt_int_op(2000L,==, tv_udiff(&start, &end)); + tt_int_op(2000L,OP_EQ, tv_udiff(&start, &end)); end.tv_sec = 6; - tt_int_op(1002000L,==, tv_udiff(&start, &end)); + tt_int_op(1002000L,OP_EQ, tv_udiff(&start, &end)); end.tv_usec = 0; - tt_int_op(995000L,==, tv_udiff(&start, &end)); + tt_int_op(995000L,OP_EQ, tv_udiff(&start, &end)); end.tv_sec = 4; - tt_int_op(-1005000L,==, tv_udiff(&start, &end)); + tt_int_op(-1005000L,OP_EQ, tv_udiff(&start, &end)); /* Test tor_timegm & tor_gmtime_r */ @@ -299,26 +299,26 @@ test_util_time(void *arg) a_time.tm_min = 14; a_time.tm_sec = 55; t_res = 1062224095UL; - tt_int_op(t_res, ==, tor_timegm(&a_time)); + tt_int_op(t_res, OP_EQ, tor_timegm(&a_time)); tor_gmtime_r(&t_res, &b_time); TM_EQUAL(a_time, b_time); a_time.tm_year = 2004-1900; /* Try a leap year, after feb. */ t_res = 1093846495UL; - tt_int_op(t_res, ==, tor_timegm(&a_time)); + tt_int_op(t_res, OP_EQ, tor_timegm(&a_time)); tor_gmtime_r(&t_res, &b_time); TM_EQUAL(a_time, b_time); a_time.tm_mon = 1; /* Try a leap year, in feb. */ a_time.tm_mday = 10; t_res = 1076393695UL; - tt_int_op(t_res, ==, tor_timegm(&a_time)); + tt_int_op(t_res, OP_EQ, tor_timegm(&a_time)); tor_gmtime_r(&t_res, &b_time); TM_EQUAL(a_time, b_time); a_time.tm_mon = 0; t_res = 1073715295UL; - tt_int_op(t_res, ==, tor_timegm(&a_time)); + tt_int_op(t_res, OP_EQ, tor_timegm(&a_time)); tor_gmtime_r(&t_res, &b_time); TM_EQUAL(a_time, b_time); @@ -328,27 +328,27 @@ test_util_time(void *arg) /* Wrong year < 1970 */ a_time.tm_year = 1969-1900; - tt_int_op((time_t) -1,==, tor_timegm(&a_time)); + tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); a_time.tm_year = -1-1900; - tt_int_op((time_t) -1,==, tor_timegm(&a_time)); + tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); #if SIZEOF_INT == 4 || SIZEOF_INT == 8 a_time.tm_year = -1*(1 << 16); - tt_int_op((time_t) -1,==, tor_timegm(&a_time)); + tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); /* one of the smallest tm_year values my 64 bit system supports: * t_res = -9223372036854775LL without clamping */ a_time.tm_year = -292275055-1900; - tt_int_op((time_t) -1,==, tor_timegm(&a_time)); + tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); a_time.tm_year = INT32_MIN; - tt_int_op((time_t) -1,==, tor_timegm(&a_time)); + tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); #endif #if SIZEOF_INT == 8 a_time.tm_year = -1*(1 << 48); - tt_int_op((time_t) -1,==, tor_timegm(&a_time)); + tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); /* while unlikely, the system's gmtime(_r) could return * a "correct" retrospective gregorian negative year value, @@ -356,25 +356,25 @@ test_util_time(void *arg) * -1*(2^63)/60/60/24*2000/730485 + 1970 = -292277022657 * 730485 is the number of days in two millenia, including leap days */ a_time.tm_year = -292277022657-1900; - tt_int_op((time_t) -1,==, tor_timegm(&a_time)); + tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); a_time.tm_year = INT64_MIN; - tt_int_op((time_t) -1,==, tor_timegm(&a_time)); + tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); #endif /* Wrong year >= INT32_MAX - 1900 */ #if SIZEOF_INT == 4 || SIZEOF_INT == 8 a_time.tm_year = INT32_MAX-1900; - tt_int_op((time_t) -1,==, tor_timegm(&a_time)); + tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); a_time.tm_year = INT32_MAX; - tt_int_op((time_t) -1,==, tor_timegm(&a_time)); + tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); #endif #if SIZEOF_INT == 8 /* one of the largest tm_year values my 64 bit system supports */ a_time.tm_year = 292278994-1900; - tt_int_op((time_t) -1,==, tor_timegm(&a_time)); + tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); /* while unlikely, the system's gmtime(_r) could return * a "correct" proleptic gregorian year value, @@ -382,72 +382,72 @@ test_util_time(void *arg) * (2^63-1)/60/60/24*2000/730485 + 1970 = 292277026596 * 730485 is the number of days in two millenia, including leap days */ a_time.tm_year = 292277026596-1900; - tt_int_op((time_t) -1,==, tor_timegm(&a_time)); + tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); a_time.tm_year = INT64_MAX-1900; - tt_int_op((time_t) -1,==, tor_timegm(&a_time)); + tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); a_time.tm_year = INT64_MAX; - tt_int_op((time_t) -1,==, tor_timegm(&a_time)); + tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); #endif /* month */ a_time.tm_year = 2007-1900; /* restore valid year */ a_time.tm_mon = 12; /* Wrong month, it's 0-based */ - tt_int_op((time_t) -1,==, tor_timegm(&a_time)); + tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); a_time.tm_mon = -1; /* Wrong month */ - tt_int_op((time_t) -1,==, tor_timegm(&a_time)); + tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); /* day */ a_time.tm_mon = 6; /* Try July */ a_time.tm_mday = 32; /* Wrong day */ - tt_int_op((time_t) -1,==, tor_timegm(&a_time)); + tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); a_time.tm_mon = 5; /* Try June */ a_time.tm_mday = 31; /* Wrong day */ - tt_int_op((time_t) -1,==, tor_timegm(&a_time)); + tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); a_time.tm_year = 2008-1900; /* Try a leap year */ a_time.tm_mon = 1; /* in feb. */ a_time.tm_mday = 30; /* Wrong day */ - tt_int_op((time_t) -1,==, tor_timegm(&a_time)); + tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); a_time.tm_year = 2011-1900; /* Try a non-leap year */ a_time.tm_mon = 1; /* in feb. */ a_time.tm_mday = 29; /* Wrong day */ - tt_int_op((time_t) -1,==, tor_timegm(&a_time)); + tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); a_time.tm_mday = 0; /* Wrong day, it's 1-based (to be different) */ - tt_int_op((time_t) -1,==, tor_timegm(&a_time)); + tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); /* hour */ a_time.tm_mday = 3; /* restore valid month day */ a_time.tm_hour = 24; /* Wrong hour, it's 0-based */ - tt_int_op((time_t) -1,==, tor_timegm(&a_time)); + tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); a_time.tm_hour = -1; /* Wrong hour */ - tt_int_op((time_t) -1,==, tor_timegm(&a_time)); + tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); /* minute */ a_time.tm_hour = 22; /* restore valid hour */ a_time.tm_min = 60; /* Wrong minute, it's 0-based */ - tt_int_op((time_t) -1,==, tor_timegm(&a_time)); + tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); a_time.tm_min = -1; /* Wrong minute */ - tt_int_op((time_t) -1,==, tor_timegm(&a_time)); + tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); /* second */ a_time.tm_min = 37; /* restore valid minute */ a_time.tm_sec = 61; /* Wrong second: 0-based with leap seconds */ - tt_int_op((time_t) -1,==, tor_timegm(&a_time)); + tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); a_time.tm_sec = -1; /* Wrong second */ - tt_int_op((time_t) -1,==, tor_timegm(&a_time)); + tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time)); /* Test tor_gmtime_r out of range */ @@ -534,69 +534,72 @@ test_util_time(void *arg) /* Test {format,parse}_rfc1123_time */ format_rfc1123_time(timestr, 0); - tt_str_op("Thu, 01 Jan 1970 00:00:00 GMT",==, timestr); + tt_str_op("Thu, 01 Jan 1970 00:00:00 GMT",OP_EQ, timestr); format_rfc1123_time(timestr, (time_t)1091580502UL); - tt_str_op("Wed, 04 Aug 2004 00:48:22 GMT",==, timestr); + tt_str_op("Wed, 04 Aug 2004 00:48:22 GMT",OP_EQ, timestr); t_res = 0; i = parse_rfc1123_time(timestr, &t_res); - tt_int_op(0,==, i); - tt_int_op(t_res,==, (time_t)1091580502UL); + tt_int_op(0,OP_EQ, i); + tt_int_op(t_res,OP_EQ, (time_t)1091580502UL); /* The timezone doesn't matter */ t_res = 0; - tt_int_op(0,==, parse_rfc1123_time("Wed, 04 Aug 2004 00:48:22 ZUL", &t_res)); - tt_int_op(t_res,==, (time_t)1091580502UL); - tt_int_op(-1,==, + tt_int_op(0,OP_EQ, + parse_rfc1123_time("Wed, 04 Aug 2004 00:48:22 ZUL", &t_res)); + tt_int_op(t_res,OP_EQ, (time_t)1091580502UL); + tt_int_op(-1,OP_EQ, parse_rfc1123_time("Wed, zz Aug 2004 99-99x99 GMT", &t_res)); - tt_int_op(-1,==, + tt_int_op(-1,OP_EQ, parse_rfc1123_time("Wed, 32 Mar 2011 00:00:00 GMT", &t_res)); - tt_int_op(-1,==, + tt_int_op(-1,OP_EQ, parse_rfc1123_time("Wed, 30 Mar 2011 24:00:00 GMT", &t_res)); - tt_int_op(-1,==, + tt_int_op(-1,OP_EQ, parse_rfc1123_time("Wed, 30 Mar 2011 23:60:00 GMT", &t_res)); - tt_int_op(-1,==, + tt_int_op(-1,OP_EQ, parse_rfc1123_time("Wed, 30 Mar 2011 23:59:62 GMT", &t_res)); - tt_int_op(-1,==, + tt_int_op(-1,OP_EQ, parse_rfc1123_time("Wed, 30 Mar 1969 23:59:59 GMT", &t_res)); - tt_int_op(-1,==, + tt_int_op(-1,OP_EQ, parse_rfc1123_time("Wed, 30 Ene 2011 23:59:59 GMT", &t_res)); - tt_int_op(-1,==, + tt_int_op(-1,OP_EQ, parse_rfc1123_time("Wed, 30 Mar 2011 23:59:59 GM", &t_res)); - tt_int_op(-1,==, + tt_int_op(-1,OP_EQ, parse_rfc1123_time("Wed, 29 Feb 2011 16:00:00 GMT", &t_res)); - tt_int_op(-1,==, + tt_int_op(-1,OP_EQ, parse_rfc1123_time("Wed, 30 Mar 2011 23:59:61 GMT", &t_res)); /* Test parse_iso_time */ t_res = 0; i = parse_iso_time("", &t_res); - tt_int_op(-1,==, i); + tt_int_op(-1,OP_EQ, i); t_res = 0; i = parse_iso_time("2004-08-32 00:48:22", &t_res); - tt_int_op(-1,==, i); + tt_int_op(-1,OP_EQ, i); t_res = 0; i = parse_iso_time("1969-08-03 00:48:22", &t_res); - tt_int_op(-1,==, i); + tt_int_op(-1,OP_EQ, i); t_res = 0; i = parse_iso_time("2004-08-04 00:48:22", &t_res); - tt_int_op(0,==, i); - tt_int_op(t_res,==, (time_t)1091580502UL); + tt_int_op(0,OP_EQ, i); + tt_int_op(t_res,OP_EQ, (time_t)1091580502UL); t_res = 0; i = parse_iso_time("2004-8-4 0:48:22", &t_res); - tt_int_op(0,==, i); - tt_int_op(t_res,==, (time_t)1091580502UL); - tt_int_op(-1,==, parse_iso_time("2004-08-zz 99-99x99 GMT", &t_res)); - tt_int_op(-1,==, parse_iso_time("2011-03-32 00:00:00 GMT", &t_res)); - tt_int_op(-1,==, parse_iso_time("2011-03-30 24:00:00 GMT", &t_res)); - tt_int_op(-1,==, parse_iso_time("2011-03-30 23:60:00 GMT", &t_res)); - tt_int_op(-1,==, parse_iso_time("2011-03-30 23:59:62 GMT", &t_res)); - tt_int_op(-1,==, parse_iso_time("1969-03-30 23:59:59 GMT", &t_res)); - tt_int_op(-1,==, parse_iso_time("2011-00-30 23:59:59 GMT", &t_res)); - tt_int_op(-1,==, parse_iso_time("2147483647-08-29 14:00:00", &t_res)); - tt_int_op(-1,==, parse_iso_time("2011-03-30 23:59", &t_res)); + tt_int_op(0,OP_EQ, i); + tt_int_op(t_res,OP_EQ, (time_t)1091580502UL); + tt_int_op(-1,OP_EQ, parse_iso_time("2004-08-zz 99-99x99", &t_res)); + tt_int_op(-1,OP_EQ, parse_iso_time("2011-03-32 00:00:00", &t_res)); + tt_int_op(-1,OP_EQ, parse_iso_time("2011-03-30 24:00:00", &t_res)); + tt_int_op(-1,OP_EQ, parse_iso_time("2011-03-30 23:60:00", &t_res)); + tt_int_op(-1,OP_EQ, parse_iso_time("2011-03-30 23:59:62", &t_res)); + tt_int_op(-1,OP_EQ, parse_iso_time("1969-03-30 23:59:59", &t_res)); + tt_int_op(-1,OP_EQ, parse_iso_time("2011-00-30 23:59:59", &t_res)); + tt_int_op(-1,OP_EQ, parse_iso_time("2147483647-08-29 14:00:00", &t_res)); + tt_int_op(-1,OP_EQ, parse_iso_time("2011-03-30 23:59", &t_res)); + tt_int_op(-1,OP_EQ, parse_iso_time("2004-08-04 00:48:22.100", &t_res)); + tt_int_op(-1,OP_EQ, parse_iso_time("2004-08-04 00:48:22XYZ", &t_res)); /* Test tor_gettimeofday */ @@ -609,14 +612,14 @@ test_util_time(void *arg) /* now make sure time works. */ tor_gettimeofday(&end); /* We might've timewarped a little. */ - tt_int_op(tv_udiff(&start, &end), >=, -5000); + tt_int_op(tv_udiff(&start, &end), OP_GE, -5000); /* Test format_iso_time */ tv.tv_sec = (time_t)1326296338; tv.tv_usec = 3060; format_iso_time(timestr, (time_t)tv.tv_sec); - tt_str_op("2012-01-11 15:38:58",==, timestr); + tt_str_op("2012-01-11 15:38:58",OP_EQ, timestr); /* The output of format_local_iso_time will vary by timezone, and setting our timezone for testing purposes would be a nontrivial flaky pain. Skip this test for now. @@ -624,11 +627,11 @@ test_util_time(void *arg) test_streq("2012-01-11 10:38:58", timestr); */ format_iso_time_nospace(timestr, (time_t)tv.tv_sec); - tt_str_op("2012-01-11T15:38:58",==, timestr); - tt_int_op(strlen(timestr),==, ISO_TIME_LEN); + tt_str_op("2012-01-11T15:38:58",OP_EQ, timestr); + tt_int_op(strlen(timestr),OP_EQ, ISO_TIME_LEN); format_iso_time_nospace_usec(timestr, &tv); - tt_str_op("2012-01-11T15:38:58.003060",==, timestr); - tt_int_op(strlen(timestr),==, ISO_TIME_USEC_LEN); + tt_str_op("2012-01-11T15:38:58.003060",OP_EQ, timestr); + tt_int_op(strlen(timestr),OP_EQ, ISO_TIME_USEC_LEN); done: ; @@ -643,72 +646,74 @@ test_util_parse_http_time(void *arg) #define T(s) do { \ format_iso_time(b, tor_timegm(&a_time)); \ - tt_str_op(b, ==, (s)); \ + tt_str_op(b, OP_EQ, (s)); \ b[0]='\0'; \ } while (0) /* Test parse_http_time */ - tt_int_op(-1,==, + tt_int_op(-1,OP_EQ, parse_http_time("", &a_time)); - tt_int_op(-1,==, + tt_int_op(-1,OP_EQ, parse_http_time("Sunday, 32 Aug 2004 00:48:22 GMT", &a_time)); - tt_int_op(-1,==, + tt_int_op(-1,OP_EQ, parse_http_time("Sunday, 3 Aug 1869 00:48:22 GMT", &a_time)); - tt_int_op(-1,==, + tt_int_op(-1,OP_EQ, parse_http_time("Sunday, 32-Aug-94 00:48:22 GMT", &a_time)); - tt_int_op(-1,==, + tt_int_op(-1,OP_EQ, parse_http_time("Sunday, 3-Ago-04 00:48:22", &a_time)); - tt_int_op(-1,==, + tt_int_op(-1,OP_EQ, parse_http_time("Sunday, August the third", &a_time)); - tt_int_op(-1,==, + tt_int_op(-1,OP_EQ, parse_http_time("Wednesday,,04 Aug 1994 00:48:22 GMT", &a_time)); - tt_int_op(0,==, + tt_int_op(0,OP_EQ, parse_http_time("Wednesday, 04 Aug 1994 00:48:22 GMT", &a_time)); - tt_int_op((time_t)775961302UL,==, tor_timegm(&a_time)); + tt_int_op((time_t)775961302UL,OP_EQ, tor_timegm(&a_time)); T("1994-08-04 00:48:22"); - tt_int_op(0,==, + tt_int_op(0,OP_EQ, parse_http_time("Wednesday, 4 Aug 1994 0:48:22 GMT", &a_time)); - tt_int_op((time_t)775961302UL,==, tor_timegm(&a_time)); + tt_int_op((time_t)775961302UL,OP_EQ, tor_timegm(&a_time)); T("1994-08-04 00:48:22"); - tt_int_op(0,==, + tt_int_op(0,OP_EQ, parse_http_time("Miercoles, 4 Aug 1994 0:48:22 GMT", &a_time)); - tt_int_op((time_t)775961302UL,==, tor_timegm(&a_time)); + tt_int_op((time_t)775961302UL,OP_EQ, tor_timegm(&a_time)); T("1994-08-04 00:48:22"); - tt_int_op(0,==, + tt_int_op(0,OP_EQ, parse_http_time("Wednesday, 04-Aug-94 00:48:22 GMT", &a_time)); - tt_int_op((time_t)775961302UL,==, tor_timegm(&a_time)); + tt_int_op((time_t)775961302UL,OP_EQ, tor_timegm(&a_time)); T("1994-08-04 00:48:22"); - tt_int_op(0,==, parse_http_time("Wednesday, 4-Aug-94 0:48:22 GMT", &a_time)); - tt_int_op((time_t)775961302UL,==, tor_timegm(&a_time)); + tt_int_op(0,OP_EQ, + parse_http_time("Wednesday, 4-Aug-94 0:48:22 GMT", &a_time)); + tt_int_op((time_t)775961302UL,OP_EQ, tor_timegm(&a_time)); T("1994-08-04 00:48:22"); - tt_int_op(0,==, parse_http_time("Miercoles, 4-Aug-94 0:48:22 GMT", &a_time)); - tt_int_op((time_t)775961302UL,==, tor_timegm(&a_time)); + tt_int_op(0,OP_EQ, + parse_http_time("Miercoles, 4-Aug-94 0:48:22 GMT", &a_time)); + tt_int_op((time_t)775961302UL,OP_EQ, tor_timegm(&a_time)); T("1994-08-04 00:48:22"); - tt_int_op(0,==, parse_http_time("Wed Aug 04 00:48:22 1994", &a_time)); - tt_int_op((time_t)775961302UL,==, tor_timegm(&a_time)); + tt_int_op(0,OP_EQ, parse_http_time("Wed Aug 04 00:48:22 1994", &a_time)); + tt_int_op((time_t)775961302UL,OP_EQ, tor_timegm(&a_time)); T("1994-08-04 00:48:22"); - tt_int_op(0,==, parse_http_time("Wed Aug 4 0:48:22 1994", &a_time)); - tt_int_op((time_t)775961302UL,==, tor_timegm(&a_time)); + tt_int_op(0,OP_EQ, parse_http_time("Wed Aug 4 0:48:22 1994", &a_time)); + tt_int_op((time_t)775961302UL,OP_EQ, tor_timegm(&a_time)); T("1994-08-04 00:48:22"); - tt_int_op(0,==, parse_http_time("Mie Aug 4 0:48:22 1994", &a_time)); - tt_int_op((time_t)775961302UL,==, tor_timegm(&a_time)); + tt_int_op(0,OP_EQ, parse_http_time("Mie Aug 4 0:48:22 1994", &a_time)); + tt_int_op((time_t)775961302UL,OP_EQ, tor_timegm(&a_time)); T("1994-08-04 00:48:22"); - tt_int_op(0,==, parse_http_time("Sun, 1 Jan 2012 00:00:00 GMT", &a_time)); - tt_int_op((time_t)1325376000UL,==, tor_timegm(&a_time)); + tt_int_op(0,OP_EQ,parse_http_time("Sun, 1 Jan 2012 00:00:00 GMT", &a_time)); + tt_int_op((time_t)1325376000UL,OP_EQ, tor_timegm(&a_time)); T("2012-01-01 00:00:00"); - tt_int_op(0,==, parse_http_time("Mon, 31 Dec 2012 00:00:00 GMT", &a_time)); - tt_int_op((time_t)1356912000UL,==, tor_timegm(&a_time)); + tt_int_op(0,OP_EQ,parse_http_time("Mon, 31 Dec 2012 00:00:00 GMT", &a_time)); + tt_int_op((time_t)1356912000UL,OP_EQ, tor_timegm(&a_time)); T("2012-12-31 00:00:00"); - tt_int_op(-1,==, parse_http_time("2004-08-zz 99-99x99 GMT", &a_time)); - tt_int_op(-1,==, parse_http_time("2011-03-32 00:00:00 GMT", &a_time)); - tt_int_op(-1,==, parse_http_time("2011-03-30 24:00:00 GMT", &a_time)); - tt_int_op(-1,==, parse_http_time("2011-03-30 23:60:00 GMT", &a_time)); - tt_int_op(-1,==, parse_http_time("2011-03-30 23:59:62 GMT", &a_time)); - tt_int_op(-1,==, parse_http_time("1969-03-30 23:59:59 GMT", &a_time)); - tt_int_op(-1,==, parse_http_time("2011-00-30 23:59:59 GMT", &a_time)); - tt_int_op(-1,==, parse_http_time("2011-03-30 23:59", &a_time)); + tt_int_op(-1,OP_EQ, parse_http_time("2004-08-zz 99-99x99 GMT", &a_time)); + tt_int_op(-1,OP_EQ, parse_http_time("2011-03-32 00:00:00 GMT", &a_time)); + tt_int_op(-1,OP_EQ, parse_http_time("2011-03-30 24:00:00 GMT", &a_time)); + tt_int_op(-1,OP_EQ, parse_http_time("2011-03-30 23:60:00 GMT", &a_time)); + tt_int_op(-1,OP_EQ, parse_http_time("2011-03-30 23:59:62 GMT", &a_time)); + tt_int_op(-1,OP_EQ, parse_http_time("1969-03-30 23:59:59 GMT", &a_time)); + tt_int_op(-1,OP_EQ, parse_http_time("2011-00-30 23:59:59 GMT", &a_time)); + tt_int_op(-1,OP_EQ, parse_http_time("2011-03-30 23:59", &a_time)); #undef T done: @@ -743,110 +748,110 @@ test_util_config_line(void *arg) str = buf; str = parse_config_line_from_str(str, &k, &v); - tt_str_op(k,==, "k"); - tt_str_op(v,==, "v"); + tt_str_op(k,OP_EQ, "k"); + tt_str_op(v,OP_EQ, "v"); tor_free(k); tor_free(v); tt_assert(!strcmpstart(str, "key value with")); str = parse_config_line_from_str(str, &k, &v); - tt_str_op(k,==, "key"); - tt_str_op(v,==, "value with spaces"); + tt_str_op(k,OP_EQ, "key"); + tt_str_op(v,OP_EQ, "value with spaces"); tor_free(k); tor_free(v); tt_assert(!strcmpstart(str, "keykey")); str = parse_config_line_from_str(str, &k, &v); - tt_str_op(k,==, "keykey"); - tt_str_op(v,==, "val"); + tt_str_op(k,OP_EQ, "keykey"); + tt_str_op(v,OP_EQ, "val"); tor_free(k); tor_free(v); tt_assert(!strcmpstart(str, "k2\n")); str = parse_config_line_from_str(str, &k, &v); - tt_str_op(k,==, "k2"); - tt_str_op(v,==, ""); + tt_str_op(k,OP_EQ, "k2"); + tt_str_op(v,OP_EQ, ""); tor_free(k); tor_free(v); tt_assert(!strcmpstart(str, "k3 \n")); str = parse_config_line_from_str(str, &k, &v); - tt_str_op(k,==, "k3"); - tt_str_op(v,==, ""); + tt_str_op(k,OP_EQ, "k3"); + tt_str_op(v,OP_EQ, ""); tor_free(k); tor_free(v); tt_assert(!strcmpstart(str, "#comment")); str = parse_config_line_from_str(str, &k, &v); - tt_str_op(k,==, "k4"); - tt_str_op(v,==, ""); + tt_str_op(k,OP_EQ, "k4"); + tt_str_op(v,OP_EQ, ""); tor_free(k); tor_free(v); tt_assert(!strcmpstart(str, "k5#abc")); str = parse_config_line_from_str(str, &k, &v); - tt_str_op(k,==, "k5"); - tt_str_op(v,==, ""); + tt_str_op(k,OP_EQ, "k5"); + tt_str_op(v,OP_EQ, ""); tor_free(k); tor_free(v); tt_assert(!strcmpstart(str, "k6")); str = parse_config_line_from_str(str, &k, &v); - tt_str_op(k,==, "k6"); - tt_str_op(v,==, "val"); + tt_str_op(k,OP_EQ, "k6"); + tt_str_op(v,OP_EQ, "val"); tor_free(k); tor_free(v); tt_assert(!strcmpstart(str, "kseven")); str = parse_config_line_from_str(str, &k, &v); - tt_str_op(k,==, "kseven"); - tt_str_op(v,==, "a quoted \'string"); + tt_str_op(k,OP_EQ, "kseven"); + tt_str_op(v,OP_EQ, "a quoted \'string"); tor_free(k); tor_free(v); tt_assert(!strcmpstart(str, "k8 ")); str = parse_config_line_from_str(str, &k, &v); - tt_str_op(k,==, "k8"); - tt_str_op(v,==, "a quoted\n\"str\\ing\t\x01\x01\x01\""); + tt_str_op(k,OP_EQ, "k8"); + tt_str_op(v,OP_EQ, "a quoted\n\"str\\ing\t\x01\x01\x01\""); tor_free(k); tor_free(v); str = parse_config_line_from_str(str, &k, &v); - tt_str_op(k,==, "k9"); - tt_str_op(v,==, "a line that spans two lines."); + tt_str_op(k,OP_EQ, "k9"); + tt_str_op(v,OP_EQ, "a line that spans two lines."); tor_free(k); tor_free(v); str = parse_config_line_from_str(str, &k, &v); - tt_str_op(k,==, "k10"); - tt_str_op(v,==, "more than one continuation"); + tt_str_op(k,OP_EQ, "k10"); + tt_str_op(v,OP_EQ, "more than one continuation"); tor_free(k); tor_free(v); str = parse_config_line_from_str(str, &k, &v); - tt_str_op(k,==, "k11"); - tt_str_op(v,==, "continuation at the start"); + tt_str_op(k,OP_EQ, "k11"); + tt_str_op(v,OP_EQ, "continuation at the start"); tor_free(k); tor_free(v); str = parse_config_line_from_str(str, &k, &v); - tt_str_op(k,==, "k12"); - tt_str_op(v,==, "line with a embedded"); + tt_str_op(k,OP_EQ, "k12"); + tt_str_op(v,OP_EQ, "line with a embedded"); tor_free(k); tor_free(v); str = parse_config_line_from_str(str, &k, &v); - tt_str_op(k,==, "k13"); - tt_str_op(v,==, "continuation at the very start"); + tt_str_op(k,OP_EQ, "k13"); + tt_str_op(v,OP_EQ, "continuation at the very start"); tor_free(k); tor_free(v); str = parse_config_line_from_str(str, &k, &v); - tt_str_op(k,==, "k14"); - tt_str_op(v,==, "a line that has a comment and" ); + tt_str_op(k,OP_EQ, "k14"); + tt_str_op(v,OP_EQ, "a line that has a comment and" ); tor_free(k); tor_free(v); str = parse_config_line_from_str(str, &k, &v); - tt_str_op(k,==, "k15"); - tt_str_op(v,==, "this should be the next new line"); + tt_str_op(k,OP_EQ, "k15"); + tt_str_op(v,OP_EQ, "this should be the next new line"); tor_free(k); tor_free(v); str = parse_config_line_from_str(str, &k, &v); - tt_str_op(k,==, "k16"); - tt_str_op(v,==, "a line that has a comment and" ); + tt_str_op(k,OP_EQ, "k16"); + tt_str_op(v,OP_EQ, "a line that has a comment and" ); tor_free(k); tor_free(v); str = parse_config_line_from_str(str, &k, &v); - tt_str_op(k,==, "k17"); - tt_str_op(v,==, "this should be the next new line"); + tt_str_op(k,OP_EQ, "k17"); + tt_str_op(v,OP_EQ, "this should be the next new line"); tor_free(k); tor_free(v); - tt_str_op(str,==, ""); + tt_str_op(str,OP_EQ, ""); done: tor_free(k); @@ -877,30 +882,30 @@ test_util_config_line_quotes(void *arg) str = buf1; str = parse_config_line_from_str(str, &k, &v); - tt_str_op(k,==, "kTrailingSpace"); - tt_str_op(v,==, "quoted value"); + tt_str_op(k,OP_EQ, "kTrailingSpace"); + tt_str_op(v,OP_EQ, "quoted value"); tor_free(k); tor_free(v); str = parse_config_line_from_str(str, &k, &v); - tt_ptr_op(str,==, NULL); + tt_ptr_op(str,OP_EQ, NULL); tor_free(k); tor_free(v); str = buf2; str = parse_config_line_from_str(str, &k, &v); - tt_ptr_op(str,==, NULL); + tt_ptr_op(str,OP_EQ, NULL); tor_free(k); tor_free(v); str = buf3; str = parse_config_line_from_str(str, &k, &v); - tt_ptr_op(str,==, NULL); + tt_ptr_op(str,OP_EQ, NULL); tor_free(k); tor_free(v); str = buf4; str = parse_config_line_from_str(str, &k, &v); - tt_ptr_op(str,==, NULL); + tt_ptr_op(str,OP_EQ, NULL); tor_free(k); tor_free(v); done: @@ -924,16 +929,16 @@ test_util_config_line_comment_character(void *arg) str = buf; str = parse_config_line_from_str(str, &k, &v); - tt_str_op(k,==, "k1"); - tt_str_op(v,==, "# in quotes"); + tt_str_op(k,OP_EQ, "k1"); + tt_str_op(v,OP_EQ, "# in quotes"); tor_free(k); tor_free(v); str = parse_config_line_from_str(str, &k, &v); - tt_str_op(k,==, "k2"); - tt_str_op(v,==, "some value"); + tt_str_op(k,OP_EQ, "k2"); + tt_str_op(v,OP_EQ, "some value"); tor_free(k); tor_free(v); - tt_str_op(str,==, "k3 /home/user/myTorNetwork#2\n"); + tt_str_op(str,OP_EQ, "k3 /home/user/myTorNetwork#2\n"); #if 0 str = parse_config_line_from_str(str, &k, &v); @@ -994,91 +999,91 @@ test_util_config_line_escaped_content(void *arg) str = buf1; str = parse_config_line_from_str(str, &k, &v); - tt_str_op(k,==, "HexadecimalLower"); - tt_str_op(v,==, "*"); + tt_str_op(k,OP_EQ, "HexadecimalLower"); + tt_str_op(v,OP_EQ, "*"); tor_free(k); tor_free(v); str = parse_config_line_from_str(str, &k, &v); - tt_str_op(k,==, "HexadecimalUpper"); - tt_str_op(v,==, "*"); + tt_str_op(k,OP_EQ, "HexadecimalUpper"); + tt_str_op(v,OP_EQ, "*"); tor_free(k); tor_free(v); str = parse_config_line_from_str(str, &k, &v); - tt_str_op(k,==, "HexadecimalUpperX"); - tt_str_op(v,==, "*"); + tt_str_op(k,OP_EQ, "HexadecimalUpperX"); + tt_str_op(v,OP_EQ, "*"); tor_free(k); tor_free(v); str = parse_config_line_from_str(str, &k, &v); - tt_str_op(k,==, "Octal"); - tt_str_op(v,==, "*"); + tt_str_op(k,OP_EQ, "Octal"); + tt_str_op(v,OP_EQ, "*"); tor_free(k); tor_free(v); str = parse_config_line_from_str(str, &k, &v); - tt_str_op(k,==, "Newline"); - tt_str_op(v,==, "\n"); + tt_str_op(k,OP_EQ, "Newline"); + tt_str_op(v,OP_EQ, "\n"); tor_free(k); tor_free(v); str = parse_config_line_from_str(str, &k, &v); - tt_str_op(k,==, "Tab"); - tt_str_op(v,==, "\t"); + tt_str_op(k,OP_EQ, "Tab"); + tt_str_op(v,OP_EQ, "\t"); tor_free(k); tor_free(v); str = parse_config_line_from_str(str, &k, &v); - tt_str_op(k,==, "CarriageReturn"); - tt_str_op(v,==, "\r"); + tt_str_op(k,OP_EQ, "CarriageReturn"); + tt_str_op(v,OP_EQ, "\r"); tor_free(k); tor_free(v); str = parse_config_line_from_str(str, &k, &v); - tt_str_op(k,==, "DoubleQuote"); - tt_str_op(v,==, "\""); + tt_str_op(k,OP_EQ, "DoubleQuote"); + tt_str_op(v,OP_EQ, "\""); tor_free(k); tor_free(v); str = parse_config_line_from_str(str, &k, &v); - tt_str_op(k,==, "SimpleQuote"); - tt_str_op(v,==, "'"); + tt_str_op(k,OP_EQ, "SimpleQuote"); + tt_str_op(v,OP_EQ, "'"); tor_free(k); tor_free(v); str = parse_config_line_from_str(str, &k, &v); - tt_str_op(k,==, "Backslash"); - tt_str_op(v,==, "\\"); + tt_str_op(k,OP_EQ, "Backslash"); + tt_str_op(v,OP_EQ, "\\"); tor_free(k); tor_free(v); str = parse_config_line_from_str(str, &k, &v); - tt_str_op(k,==, "Mix"); - tt_str_op(v,==, "This is a \"star\":\t'*'\nAnd second line"); + tt_str_op(k,OP_EQ, "Mix"); + tt_str_op(v,OP_EQ, "This is a \"star\":\t'*'\nAnd second line"); tor_free(k); tor_free(v); - tt_str_op(str,==, ""); + tt_str_op(str,OP_EQ, ""); str = buf2; str = parse_config_line_from_str(str, &k, &v); - tt_ptr_op(str,==, NULL); + tt_ptr_op(str,OP_EQ, NULL); tor_free(k); tor_free(v); str = buf3; str = parse_config_line_from_str(str, &k, &v); - tt_ptr_op(str,==, NULL); + tt_ptr_op(str,OP_EQ, NULL); tor_free(k); tor_free(v); str = buf4; str = parse_config_line_from_str(str, &k, &v); - tt_ptr_op(str,==, NULL); + tt_ptr_op(str,OP_EQ, NULL); tor_free(k); tor_free(v); #if 0 str = buf5; str = parse_config_line_from_str(str, &k, &v); - tt_ptr_op(str, ==, NULL); + tt_ptr_op(str, OP_EQ, NULL); tor_free(k); tor_free(v); #endif str = buf6; str = parse_config_line_from_str(str, &k, &v); - tt_ptr_op(str,==, NULL); + tt_ptr_op(str,OP_EQ, NULL); tor_free(k); tor_free(v); done: @@ -1096,39 +1101,39 @@ test_util_expand_filename(void *arg) setenv("HOME", "/home/itv", 1); /* For "internal test value" */ str = expand_filename(""); - tt_str_op("",==, str); + tt_str_op("",OP_EQ, str); tor_free(str); str = expand_filename("/normal/path"); - tt_str_op("/normal/path",==, str); + tt_str_op("/normal/path",OP_EQ, str); tor_free(str); str = expand_filename("/normal/trailing/path/"); - tt_str_op("/normal/trailing/path/",==, str); + tt_str_op("/normal/trailing/path/",OP_EQ, str); tor_free(str); str = expand_filename("~"); - tt_str_op("/home/itv/",==, str); + tt_str_op("/home/itv/",OP_EQ, str); tor_free(str); str = expand_filename("$HOME/nodice"); - tt_str_op("$HOME/nodice",==, str); + tt_str_op("$HOME/nodice",OP_EQ, str); tor_free(str); str = expand_filename("~/"); - tt_str_op("/home/itv/",==, str); + tt_str_op("/home/itv/",OP_EQ, str); tor_free(str); str = expand_filename("~/foobarqux"); - tt_str_op("/home/itv/foobarqux",==, str); + tt_str_op("/home/itv/foobarqux",OP_EQ, str); tor_free(str); str = expand_filename("~/../../etc/passwd"); - tt_str_op("/home/itv/../../etc/passwd",==, str); + tt_str_op("/home/itv/../../etc/passwd",OP_EQ, str); tor_free(str); str = expand_filename("~/trailing/"); - tt_str_op("/home/itv/trailing/",==, str); + tt_str_op("/home/itv/trailing/",OP_EQ, str); tor_free(str); /* Ideally we'd test ~anotheruser, but that's shady to test (we'd have to somehow inject/fake the get_user_homedir call) */ @@ -1137,15 +1142,15 @@ test_util_expand_filename(void *arg) setenv("HOME", "/home/itv/", 1); str = expand_filename("~"); - tt_str_op("/home/itv/",==, str); + tt_str_op("/home/itv/",OP_EQ, str); tor_free(str); str = expand_filename("~/"); - tt_str_op("/home/itv/",==, str); + tt_str_op("/home/itv/",OP_EQ, str); tor_free(str); str = expand_filename("~/foo"); - tt_str_op("/home/itv/foo",==, str); + tt_str_op("/home/itv/foo",OP_EQ, str); tor_free(str); /* Try with empty $HOME */ @@ -1153,15 +1158,15 @@ test_util_expand_filename(void *arg) setenv("HOME", "", 1); str = expand_filename("~"); - tt_str_op("/",==, str); + tt_str_op("/",OP_EQ, str); tor_free(str); str = expand_filename("~/"); - tt_str_op("/",==, str); + tt_str_op("/",OP_EQ, str); tor_free(str); str = expand_filename("~/foobar"); - tt_str_op("/foobar",==, str); + tt_str_op("/foobar",OP_EQ, str); tor_free(str); /* Try with $HOME unset */ @@ -1169,15 +1174,15 @@ test_util_expand_filename(void *arg) unsetenv("HOME"); str = expand_filename("~"); - tt_str_op("/",==, str); + tt_str_op("/",OP_EQ, str); tor_free(str); str = expand_filename("~/"); - tt_str_op("/",==, str); + tt_str_op("/",OP_EQ, str); tor_free(str); str = expand_filename("~/foobar"); - tt_str_op("/foobar",==, str); + tt_str_op("/foobar",OP_EQ, str); tor_free(str); done: @@ -1195,30 +1200,30 @@ test_util_escape_string_socks(void *arg) (void)arg; escaped_string = tor_escape_str_for_pt_args("This is a backslash: \\",";\\"); tt_assert(escaped_string); - tt_str_op(escaped_string,==, "This is a backslash: \\\\"); + tt_str_op(escaped_string,OP_EQ, "This is a backslash: \\\\"); tor_free(escaped_string); /** Simple semicolon escape. */ escaped_string = tor_escape_str_for_pt_args("First rule:Do not use ;",";\\"); tt_assert(escaped_string); - tt_str_op(escaped_string,==, "First rule:Do not use \\;"); + tt_str_op(escaped_string,OP_EQ, "First rule:Do not use \\;"); tor_free(escaped_string); /** Empty string. */ escaped_string = tor_escape_str_for_pt_args("", ";\\"); tt_assert(escaped_string); - tt_str_op(escaped_string,==, ""); + tt_str_op(escaped_string,OP_EQ, ""); tor_free(escaped_string); /** Escape all characters. */ escaped_string = tor_escape_str_for_pt_args(";\\;\\", ";\\"); tt_assert(escaped_string); - tt_str_op(escaped_string,==, "\\;\\\\\\;\\\\"); + tt_str_op(escaped_string,OP_EQ, "\\;\\\\\\;\\\\"); tor_free(escaped_string); escaped_string = tor_escape_str_for_pt_args(";", ";\\"); tt_assert(escaped_string); - tt_str_op(escaped_string,==, "\\;"); + tt_str_op(escaped_string,OP_EQ, "\\;"); tor_free(escaped_string); done: @@ -1254,152 +1259,153 @@ test_util_strmisc(void *arg) /* Test strl operations */ (void)arg; - tt_int_op(5,==, strlcpy(buf, "Hello", 0)); - tt_int_op(5,==, strlcpy(buf, "Hello", 10)); - tt_str_op(buf,==, "Hello"); - tt_int_op(5,==, strlcpy(buf, "Hello", 6)); - tt_str_op(buf,==, "Hello"); - tt_int_op(5,==, strlcpy(buf, "Hello", 5)); - tt_str_op(buf,==, "Hell"); + tt_int_op(5,OP_EQ, strlcpy(buf, "Hello", 0)); + tt_int_op(5,OP_EQ, strlcpy(buf, "Hello", 10)); + tt_str_op(buf,OP_EQ, "Hello"); + tt_int_op(5,OP_EQ, strlcpy(buf, "Hello", 6)); + tt_str_op(buf,OP_EQ, "Hello"); + tt_int_op(5,OP_EQ, strlcpy(buf, "Hello", 5)); + tt_str_op(buf,OP_EQ, "Hell"); strlcpy(buf, "Hello", sizeof(buf)); - tt_int_op(10,==, strlcat(buf, "Hello", 5)); + tt_int_op(10,OP_EQ, strlcat(buf, "Hello", 5)); /* Test strstrip() */ strlcpy(buf, "Testing 1 2 3", sizeof(buf)); tor_strstrip(buf, ",!"); - tt_str_op(buf,==, "Testing 1 2 3"); + tt_str_op(buf,OP_EQ, "Testing 1 2 3"); strlcpy(buf, "!Testing 1 2 3?", sizeof(buf)); tor_strstrip(buf, "!? "); - tt_str_op(buf,==, "Testing123"); + tt_str_op(buf,OP_EQ, "Testing123"); strlcpy(buf, "!!!Testing 1 2 3??", sizeof(buf)); tor_strstrip(buf, "!? "); - tt_str_op(buf,==, "Testing123"); + tt_str_op(buf,OP_EQ, "Testing123"); /* Test parse_long */ /* Empty/zero input */ - tt_int_op(0L,==, tor_parse_long("",10,0,100,&i,NULL)); - tt_int_op(0,==, i); - tt_int_op(0L,==, tor_parse_long("0",10,0,100,&i,NULL)); - tt_int_op(1,==, i); + tt_int_op(0L,OP_EQ, tor_parse_long("",10,0,100,&i,NULL)); + tt_int_op(0,OP_EQ, i); + tt_int_op(0L,OP_EQ, tor_parse_long("0",10,0,100,&i,NULL)); + tt_int_op(1,OP_EQ, i); /* Normal cases */ - tt_int_op(10L,==, tor_parse_long("10",10,0,100,&i,NULL)); - tt_int_op(1,==, i); - tt_int_op(10L,==, tor_parse_long("10",10,0,10,&i,NULL)); - tt_int_op(1,==, i); - tt_int_op(10L,==, tor_parse_long("10",10,10,100,&i,NULL)); - tt_int_op(1,==, i); - tt_int_op(-50L,==, tor_parse_long("-50",10,-100,100,&i,NULL)); - tt_int_op(1,==, i); - tt_int_op(-50L,==, tor_parse_long("-50",10,-100,0,&i,NULL)); - tt_int_op(1,==, i); - tt_int_op(-50L,==, tor_parse_long("-50",10,-50,0,&i,NULL)); - tt_int_op(1,==, i); + tt_int_op(10L,OP_EQ, tor_parse_long("10",10,0,100,&i,NULL)); + tt_int_op(1,OP_EQ, i); + tt_int_op(10L,OP_EQ, tor_parse_long("10",10,0,10,&i,NULL)); + tt_int_op(1,OP_EQ, i); + tt_int_op(10L,OP_EQ, tor_parse_long("10",10,10,100,&i,NULL)); + tt_int_op(1,OP_EQ, i); + tt_int_op(-50L,OP_EQ, tor_parse_long("-50",10,-100,100,&i,NULL)); + tt_int_op(1,OP_EQ, i); + tt_int_op(-50L,OP_EQ, tor_parse_long("-50",10,-100,0,&i,NULL)); + tt_int_op(1,OP_EQ, i); + tt_int_op(-50L,OP_EQ, tor_parse_long("-50",10,-50,0,&i,NULL)); + tt_int_op(1,OP_EQ, i); /* Extra garbage */ - tt_int_op(0L,==, tor_parse_long("10m",10,0,100,&i,NULL)); - tt_int_op(0,==, i); - tt_int_op(0L,==, tor_parse_long("-50 plus garbage",10,-100,100,&i,NULL)); - tt_int_op(0,==, i); - tt_int_op(10L,==, tor_parse_long("10m",10,0,100,&i,&cp)); - tt_int_op(1,==, i); - tt_str_op(cp,==, "m"); - tt_int_op(-50L,==, tor_parse_long("-50 plus garbage",10,-100,100,&i,&cp)); - tt_int_op(1,==, i); - tt_str_op(cp,==, " plus garbage"); + tt_int_op(0L,OP_EQ, tor_parse_long("10m",10,0,100,&i,NULL)); + tt_int_op(0,OP_EQ, i); + tt_int_op(0L,OP_EQ, tor_parse_long("-50 plus garbage",10,-100,100,&i,NULL)); + tt_int_op(0,OP_EQ, i); + tt_int_op(10L,OP_EQ, tor_parse_long("10m",10,0,100,&i,&cp)); + tt_int_op(1,OP_EQ, i); + tt_str_op(cp,OP_EQ, "m"); + tt_int_op(-50L,OP_EQ, tor_parse_long("-50 plus garbage",10,-100,100,&i,&cp)); + tt_int_op(1,OP_EQ, i); + tt_str_op(cp,OP_EQ, " plus garbage"); /* Out of bounds */ - tt_int_op(0L,==, tor_parse_long("10",10,50,100,&i,NULL)); - tt_int_op(0,==, i); - tt_int_op(0L,==, tor_parse_long("-50",10,0,100,&i,NULL)); - tt_int_op(0,==, i); + tt_int_op(0L,OP_EQ, tor_parse_long("10",10,50,100,&i,NULL)); + tt_int_op(0,OP_EQ, i); + tt_int_op(0L,OP_EQ, tor_parse_long("-50",10,0,100,&i,NULL)); + tt_int_op(0,OP_EQ, i); /* Base different than 10 */ - tt_int_op(2L,==, tor_parse_long("10",2,0,100,NULL,NULL)); - tt_int_op(0L,==, tor_parse_long("2",2,0,100,NULL,NULL)); - tt_int_op(0L,==, tor_parse_long("10",-2,0,100,NULL,NULL)); - tt_int_op(68284L,==, tor_parse_long("10abc",16,0,70000,NULL,NULL)); - tt_int_op(68284L,==, tor_parse_long("10ABC",16,0,70000,NULL,NULL)); - tt_int_op(0,==, tor_parse_long("10ABC",-1,0,70000,&i,NULL)); - tt_int_op(i,==, 0); + tt_int_op(2L,OP_EQ, tor_parse_long("10",2,0,100,NULL,NULL)); + tt_int_op(0L,OP_EQ, tor_parse_long("2",2,0,100,NULL,NULL)); + tt_int_op(0L,OP_EQ, tor_parse_long("10",-2,0,100,NULL,NULL)); + tt_int_op(68284L,OP_EQ, tor_parse_long("10abc",16,0,70000,NULL,NULL)); + tt_int_op(68284L,OP_EQ, tor_parse_long("10ABC",16,0,70000,NULL,NULL)); + tt_int_op(0,OP_EQ, tor_parse_long("10ABC",-1,0,70000,&i,NULL)); + tt_int_op(i,OP_EQ, 0); /* Test parse_ulong */ - tt_int_op(0UL,==, tor_parse_ulong("",10,0,100,NULL,NULL)); - tt_int_op(0UL,==, tor_parse_ulong("0",10,0,100,NULL,NULL)); - tt_int_op(10UL,==, tor_parse_ulong("10",10,0,100,NULL,NULL)); - tt_int_op(0UL,==, tor_parse_ulong("10",10,50,100,NULL,NULL)); - tt_int_op(10UL,==, tor_parse_ulong("10",10,0,10,NULL,NULL)); - tt_int_op(10UL,==, tor_parse_ulong("10",10,10,100,NULL,NULL)); - tt_int_op(0UL,==, tor_parse_ulong("8",8,0,100,NULL,NULL)); - tt_int_op(50UL,==, tor_parse_ulong("50",10,50,100,NULL,NULL)); - tt_int_op(0UL,==, tor_parse_ulong("-50",10,-100,100,NULL,NULL)); - tt_int_op(0UL,==, tor_parse_ulong("50",-1,50,100,&i,NULL)); - tt_int_op(0,==, i); + tt_int_op(0UL,OP_EQ, tor_parse_ulong("",10,0,100,NULL,NULL)); + tt_int_op(0UL,OP_EQ, tor_parse_ulong("0",10,0,100,NULL,NULL)); + tt_int_op(10UL,OP_EQ, tor_parse_ulong("10",10,0,100,NULL,NULL)); + tt_int_op(0UL,OP_EQ, tor_parse_ulong("10",10,50,100,NULL,NULL)); + tt_int_op(10UL,OP_EQ, tor_parse_ulong("10",10,0,10,NULL,NULL)); + tt_int_op(10UL,OP_EQ, tor_parse_ulong("10",10,10,100,NULL,NULL)); + tt_int_op(0UL,OP_EQ, tor_parse_ulong("8",8,0,100,NULL,NULL)); + tt_int_op(50UL,OP_EQ, tor_parse_ulong("50",10,50,100,NULL,NULL)); + tt_int_op(0UL,OP_EQ, tor_parse_ulong("-50",10,-100,100,NULL,NULL)); + tt_int_op(0UL,OP_EQ, tor_parse_ulong("50",-1,50,100,&i,NULL)); + tt_int_op(0,OP_EQ, i); /* Test parse_uint64 */ tt_assert(U64_LITERAL(10) == tor_parse_uint64("10 x",10,0,100, &i, &cp)); - tt_int_op(1,==, i); - tt_str_op(cp,==, " x"); + tt_int_op(1,OP_EQ, i); + tt_str_op(cp,OP_EQ, " x"); tt_assert(U64_LITERAL(12345678901) == tor_parse_uint64("12345678901",10,0,UINT64_MAX, &i, &cp)); - tt_int_op(1,==, i); - tt_str_op(cp,==, ""); + tt_int_op(1,OP_EQ, i); + tt_str_op(cp,OP_EQ, ""); tt_assert(U64_LITERAL(0) == tor_parse_uint64("12345678901",10,500,INT32_MAX, &i, &cp)); - tt_int_op(0,==, i); + tt_int_op(0,OP_EQ, i); tt_assert(U64_LITERAL(0) == tor_parse_uint64("123",-1,0,INT32_MAX, &i, &cp)); - tt_int_op(0,==, i); + tt_int_op(0,OP_EQ, i); { /* Test parse_double */ double d = tor_parse_double("10", 0, UINT64_MAX,&i,NULL); - tt_int_op(1,==, i); + tt_int_op(1,OP_EQ, i); tt_assert(DBL_TO_U64(d) == 10); d = tor_parse_double("0", 0, UINT64_MAX,&i,NULL); - tt_int_op(1,==, i); + tt_int_op(1,OP_EQ, i); tt_assert(DBL_TO_U64(d) == 0); d = tor_parse_double(" ", 0, UINT64_MAX,&i,NULL); - tt_int_op(0,==, i); + tt_int_op(0,OP_EQ, i); d = tor_parse_double(".0a", 0, UINT64_MAX,&i,NULL); - tt_int_op(0,==, i); + tt_int_op(0,OP_EQ, i); d = tor_parse_double(".0a", 0, UINT64_MAX,&i,&cp); - tt_int_op(1,==, i); + tt_int_op(1,OP_EQ, i); d = tor_parse_double("-.0", 0, UINT64_MAX,&i,NULL); - tt_int_op(1,==, i); + tt_int_op(1,OP_EQ, i); tt_assert(DBL_TO_U64(d) == 0); d = tor_parse_double("-10", -100.0, 100.0,&i,NULL); - tt_int_op(1,==, i); - tt_int_op(-10.0,==, d); + tt_int_op(1,OP_EQ, i); + tt_int_op(-10.0,OP_EQ, d); } { /* Test tor_parse_* where we overflow/underflow the underlying type. */ /* This string should overflow 64-bit ints. */ #define TOOBIG "100000000000000000000000000" - tt_int_op(0L,==, tor_parse_long(TOOBIG, 10, LONG_MIN, LONG_MAX, &i, NULL)); - tt_int_op(i,==, 0); - tt_int_op(0L,==, + tt_int_op(0L, OP_EQ, + tor_parse_long(TOOBIG, 10, LONG_MIN, LONG_MAX, &i, NULL)); + tt_int_op(i,OP_EQ, 0); + tt_int_op(0L,OP_EQ, tor_parse_long("-"TOOBIG, 10, LONG_MIN, LONG_MAX, &i, NULL)); - tt_int_op(i,==, 0); - tt_int_op(0UL,==, tor_parse_ulong(TOOBIG, 10, 0, ULONG_MAX, &i, NULL)); - tt_int_op(i,==, 0); - tt_u64_op(U64_LITERAL(0), ==, tor_parse_uint64(TOOBIG, 10, + tt_int_op(i,OP_EQ, 0); + tt_int_op(0UL,OP_EQ, tor_parse_ulong(TOOBIG, 10, 0, ULONG_MAX, &i, NULL)); + tt_int_op(i,OP_EQ, 0); + tt_u64_op(U64_LITERAL(0), OP_EQ, tor_parse_uint64(TOOBIG, 10, 0, UINT64_MAX, &i, NULL)); - tt_int_op(i,==, 0); + tt_int_op(i,OP_EQ, 0); } /* Test snprintf */ /* Returning -1 when there's not enough room in the output buffer */ - tt_int_op(-1,==, tor_snprintf(buf, 0, "Foo")); - tt_int_op(-1,==, tor_snprintf(buf, 2, "Foo")); - tt_int_op(-1,==, tor_snprintf(buf, 3, "Foo")); - tt_int_op(-1,!=, tor_snprintf(buf, 4, "Foo")); + tt_int_op(-1,OP_EQ, tor_snprintf(buf, 0, "Foo")); + tt_int_op(-1,OP_EQ, tor_snprintf(buf, 2, "Foo")); + tt_int_op(-1,OP_EQ, tor_snprintf(buf, 3, "Foo")); + tt_int_op(-1,OP_NE, tor_snprintf(buf, 4, "Foo")); /* Always NUL-terminate the output */ tor_snprintf(buf, 5, "abcdef"); - tt_int_op(0,==, buf[4]); + tt_int_op(0,OP_EQ, buf[4]); tor_snprintf(buf, 10, "abcdef"); - tt_int_op(0,==, buf[6]); + tt_int_op(0,OP_EQ, buf[6]); /* uint64 */ tor_snprintf(buf, sizeof(buf), "x!"U64_FORMAT"!x", U64_PRINTF_ARG(U64_LITERAL(12345678901))); - tt_str_op("x!12345678901!x",==, buf); + tt_str_op("x!12345678901!x",OP_EQ, buf); /* Test str{,case}cmpstart */ tt_assert(strcmpstart("abcdef", "abcdef")==0); @@ -1450,31 +1456,31 @@ test_util_strmisc(void *arg) /* Test 'escaped' */ tt_assert(NULL == escaped(NULL)); - tt_str_op("\"\"",==, escaped("")); - tt_str_op("\"abcd\"",==, escaped("abcd")); - tt_str_op("\"\\\\ \\n\\r\\t\\\"\\'\"",==, escaped("\\ \n\r\t\"'")); - tt_str_op("\"unnecessary \\'backslashes\\'\"",==, + tt_str_op("\"\"",OP_EQ, escaped("")); + tt_str_op("\"abcd\"",OP_EQ, escaped("abcd")); + tt_str_op("\"\\\\ \\n\\r\\t\\\"\\'\"",OP_EQ, escaped("\\ \n\r\t\"'")); + tt_str_op("\"unnecessary \\'backslashes\\'\"",OP_EQ, escaped("unnecessary \'backslashes\'")); /* Non-printable characters appear as octal */ - tt_str_op("\"z\\001abc\\277d\"",==, escaped("z\001abc\277d")); - tt_str_op("\"z\\336\\255 ;foo\"",==, escaped("z\xde\xad\x20;foo")); + tt_str_op("\"z\\001abc\\277d\"",OP_EQ, escaped("z\001abc\277d")); + tt_str_op("\"z\\336\\255 ;foo\"",OP_EQ, escaped("z\xde\xad\x20;foo")); /* Test strndup and memdup */ { const char *s = "abcdefghijklmnopqrstuvwxyz"; cp_tmp = tor_strndup(s, 30); - tt_str_op(cp_tmp,==, s); /* same string, */ - tt_ptr_op(cp_tmp,!=,s); /* but different pointers. */ + tt_str_op(cp_tmp,OP_EQ, s); /* same string, */ + tt_ptr_op(cp_tmp,OP_NE,s); /* but different pointers. */ tor_free(cp_tmp); cp_tmp = tor_strndup(s, 5); - tt_str_op(cp_tmp,==, "abcde"); + tt_str_op(cp_tmp,OP_EQ, "abcde"); tor_free(cp_tmp); s = "a\0b\0c\0d\0e\0"; cp_tmp = tor_memdup(s,10); - tt_mem_op(cp_tmp,==, s, 10); /* same ram, */ - tt_ptr_op(cp_tmp,!=,s); /* but different pointers. */ + tt_mem_op(cp_tmp,OP_EQ, s, 10); /* same ram, */ + tt_ptr_op(cp_tmp,OP_NE,s); /* but different pointers. */ tor_free(cp_tmp); } @@ -1484,9 +1490,9 @@ test_util_strmisc(void *arg) cp_tmp[3] = 'D'; tt_assert(!tor_strisnonupper(cp_tmp)); tor_strupper(cp_tmp); - tt_str_op(cp_tmp,==, "ABCDEF"); + tt_str_op(cp_tmp,OP_EQ, "ABCDEF"); tor_strlower(cp_tmp); - tt_str_op(cp_tmp,==, "abcdef"); + tt_str_op(cp_tmp,OP_EQ, "abcdef"); tt_assert(tor_strisnonupper(cp_tmp)); tt_assert(tor_strisprint(cp_tmp)); cp_tmp[3] = 3; @@ -1497,18 +1503,18 @@ test_util_strmisc(void *arg) { const char *haystack = "abcde"; tt_assert(!tor_memmem(haystack, 5, "ef", 2)); - tt_ptr_op(tor_memmem(haystack, 5, "cd", 2),==, haystack + 2); - tt_ptr_op(tor_memmem(haystack, 5, "cde", 3),==, haystack + 2); + tt_ptr_op(tor_memmem(haystack, 5, "cd", 2),OP_EQ, haystack + 2); + tt_ptr_op(tor_memmem(haystack, 5, "cde", 3),OP_EQ, haystack + 2); tt_assert(!tor_memmem(haystack, 4, "cde", 3)); haystack = "ababcad"; - tt_ptr_op(tor_memmem(haystack, 7, "abc", 3),==, haystack + 2); - tt_ptr_op(tor_memmem(haystack, 7, "ad", 2),==, haystack + 5); - tt_ptr_op(tor_memmem(haystack, 7, "cad", 3),==, haystack + 4); + tt_ptr_op(tor_memmem(haystack, 7, "abc", 3),OP_EQ, haystack + 2); + tt_ptr_op(tor_memmem(haystack, 7, "ad", 2),OP_EQ, haystack + 5); + tt_ptr_op(tor_memmem(haystack, 7, "cad", 3),OP_EQ, haystack + 4); tt_assert(!tor_memmem(haystack, 7, "dadad", 5)); tt_assert(!tor_memmem(haystack, 7, "abcdefghij", 10)); /* memstr */ - tt_ptr_op(tor_memstr(haystack, 7, "abc"),==, haystack + 2); - tt_ptr_op(tor_memstr(haystack, 7, "cad"),==, haystack + 4); + tt_ptr_op(tor_memstr(haystack, 7, "abc"),OP_EQ, haystack + 2); + tt_ptr_op(tor_memstr(haystack, 7, "cad"),OP_EQ, haystack + 4); tt_assert(!tor_memstr(haystack, 6, "cad")); tt_assert(!tor_memstr(haystack, 7, "cadd")); tt_assert(!tor_memstr(haystack, 7, "fe")); @@ -1521,42 +1527,42 @@ test_util_strmisc(void *arg) size_t i; for (i = 0; i < sizeof(binary_data); ++i) binary_data[i] = i; - tt_str_op(hex_str(binary_data, 0),==, ""); - tt_str_op(hex_str(binary_data, 1),==, "00"); - tt_str_op(hex_str(binary_data, 17),==, + tt_str_op(hex_str(binary_data, 0),OP_EQ, ""); + tt_str_op(hex_str(binary_data, 1),OP_EQ, "00"); + tt_str_op(hex_str(binary_data, 17),OP_EQ, "000102030405060708090A0B0C0D0E0F10"); - tt_str_op(hex_str(binary_data, 32),==, + tt_str_op(hex_str(binary_data, 32),OP_EQ, "000102030405060708090A0B0C0D0E0F" "101112131415161718191A1B1C1D1E1F"); - tt_str_op(hex_str(binary_data, 34),==, + tt_str_op(hex_str(binary_data, 34),OP_EQ, "000102030405060708090A0B0C0D0E0F" "101112131415161718191A1B1C1D1E1F"); /* Repeat these tests for shorter strings after longer strings have been tried, to make sure we're correctly terminating strings */ - tt_str_op(hex_str(binary_data, 1),==, "00"); - tt_str_op(hex_str(binary_data, 0),==, ""); + tt_str_op(hex_str(binary_data, 1),OP_EQ, "00"); + tt_str_op(hex_str(binary_data, 0),OP_EQ, ""); } /* Test strcmp_opt */ - tt_int_op(strcmp_opt("", "foo"), <, 0); - tt_int_op(strcmp_opt("", ""), ==, 0); - tt_int_op(strcmp_opt("foo", ""), >, 0); + tt_int_op(strcmp_opt("", "foo"), OP_LT, 0); + tt_int_op(strcmp_opt("", ""), OP_EQ, 0); + tt_int_op(strcmp_opt("foo", ""), OP_GT, 0); - tt_int_op(strcmp_opt(NULL, ""), <, 0); - tt_int_op(strcmp_opt(NULL, NULL), ==, 0); - tt_int_op(strcmp_opt("", NULL), >, 0); + tt_int_op(strcmp_opt(NULL, ""), OP_LT, 0); + tt_int_op(strcmp_opt(NULL, NULL), OP_EQ, 0); + tt_int_op(strcmp_opt("", NULL), OP_GT, 0); - tt_int_op(strcmp_opt(NULL, "foo"), <, 0); - tt_int_op(strcmp_opt("foo", NULL), >, 0); + tt_int_op(strcmp_opt(NULL, "foo"), OP_LT, 0); + tt_int_op(strcmp_opt("foo", NULL), OP_GT, 0); /* Test strcmp_len */ - tt_int_op(strcmp_len("foo", "bar", 3), >, 0); - tt_int_op(strcmp_len("foo", "bar", 2), <, 0); /* First len, then lexical */ - tt_int_op(strcmp_len("foo2", "foo1", 4), >, 0); - tt_int_op(strcmp_len("foo2", "foo1", 3), <, 0); /* Really stop at len */ - tt_int_op(strcmp_len("foo2", "foo", 3), ==, 0); /* Really stop at len */ - tt_int_op(strcmp_len("blah", "", 4), >, 0); - tt_int_op(strcmp_len("blah", "", 0), ==, 0); + tt_int_op(strcmp_len("foo", "bar", 3), OP_GT, 0); + tt_int_op(strcmp_len("foo", "bar", 2), OP_LT, 0); + tt_int_op(strcmp_len("foo2", "foo1", 4), OP_GT, 0); + tt_int_op(strcmp_len("foo2", "foo1", 3), OP_LT, 0); /* Really stop at len */ + tt_int_op(strcmp_len("foo2", "foo", 3), OP_EQ, 0); /* Really stop at len */ + tt_int_op(strcmp_len("blah", "", 4), OP_GT, 0); + tt_int_op(strcmp_len("blah", "", 0), OP_EQ, 0); done: tor_free(cp_tmp); @@ -1567,175 +1573,40 @@ test_util_pow2(void *arg) { /* Test tor_log2(). */ (void)arg; - tt_int_op(tor_log2(64),==, 6); - tt_int_op(tor_log2(65),==, 6); - tt_int_op(tor_log2(63),==, 5); - tt_int_op(tor_log2(0),==, 0);/* incorrect mathematically, but as specified */ - tt_int_op(tor_log2(1),==, 0); - tt_int_op(tor_log2(2),==, 1); - tt_int_op(tor_log2(3),==, 1); - tt_int_op(tor_log2(4),==, 2); - tt_int_op(tor_log2(5),==, 2); - tt_int_op(tor_log2(U64_LITERAL(40000000000000000)),==, 55); - tt_int_op(tor_log2(UINT64_MAX),==, 63); + tt_int_op(tor_log2(64),OP_EQ, 6); + tt_int_op(tor_log2(65),OP_EQ, 6); + tt_int_op(tor_log2(63),OP_EQ, 5); + /* incorrect mathematically, but as specified: */ + tt_int_op(tor_log2(0),OP_EQ, 0); + tt_int_op(tor_log2(1),OP_EQ, 0); + tt_int_op(tor_log2(2),OP_EQ, 1); + tt_int_op(tor_log2(3),OP_EQ, 1); + tt_int_op(tor_log2(4),OP_EQ, 2); + tt_int_op(tor_log2(5),OP_EQ, 2); + tt_int_op(tor_log2(U64_LITERAL(40000000000000000)),OP_EQ, 55); + tt_int_op(tor_log2(UINT64_MAX),OP_EQ, 63); /* Test round_to_power_of_2 */ - tt_u64_op(round_to_power_of_2(120), ==, 128); - tt_u64_op(round_to_power_of_2(128), ==, 128); - tt_u64_op(round_to_power_of_2(130), ==, 128); - tt_u64_op(round_to_power_of_2(U64_LITERAL(40000000000000000)), ==, + tt_u64_op(round_to_power_of_2(120), OP_EQ, 128); + tt_u64_op(round_to_power_of_2(128), OP_EQ, 128); + tt_u64_op(round_to_power_of_2(130), OP_EQ, 128); + tt_u64_op(round_to_power_of_2(U64_LITERAL(40000000000000000)), OP_EQ, U64_LITERAL(1)<<55); - tt_u64_op(round_to_power_of_2(U64_LITERAL(0xffffffffffffffff)), ==, + tt_u64_op(round_to_power_of_2(U64_LITERAL(0xffffffffffffffff)), OP_EQ, U64_LITERAL(1)<<63); - tt_u64_op(round_to_power_of_2(0), ==, 1); - tt_u64_op(round_to_power_of_2(1), ==, 1); - tt_u64_op(round_to_power_of_2(2), ==, 2); - tt_u64_op(round_to_power_of_2(3), ==, 2); - tt_u64_op(round_to_power_of_2(4), ==, 4); - tt_u64_op(round_to_power_of_2(5), ==, 4); - tt_u64_op(round_to_power_of_2(6), ==, 4); - tt_u64_op(round_to_power_of_2(7), ==, 8); + tt_u64_op(round_to_power_of_2(0), OP_EQ, 1); + tt_u64_op(round_to_power_of_2(1), OP_EQ, 1); + tt_u64_op(round_to_power_of_2(2), OP_EQ, 2); + tt_u64_op(round_to_power_of_2(3), OP_EQ, 2); + tt_u64_op(round_to_power_of_2(4), OP_EQ, 4); + tt_u64_op(round_to_power_of_2(5), OP_EQ, 4); + tt_u64_op(round_to_power_of_2(6), OP_EQ, 4); + tt_u64_op(round_to_power_of_2(7), OP_EQ, 8); done: ; } -/** mutex for thread test to stop the threads hitting data at the same time. */ -static tor_mutex_t *thread_test_mutex_ = NULL; -/** mutexes for the thread test to make sure that the threads have to - * interleave somewhat. */ -static tor_mutex_t *thread_test_start1_ = NULL, - *thread_test_start2_ = NULL; -/** Shared strmap for the thread test. */ -static strmap_t *thread_test_strmap_ = NULL; -/** The name of thread1 for the thread test */ -static char *thread1_name_ = NULL; -/** The name of thread2 for the thread test */ -static char *thread2_name_ = NULL; - -static void thread_test_func_(void* _s) ATTR_NORETURN; - -/** How many iterations have the threads in the unit test run? */ -static int t1_count = 0, t2_count = 0; - -/** Helper function for threading unit tests: This function runs in a - * subthread. It grabs its own mutex (start1 or start2) to make sure that it - * should start, then it repeatedly alters _test_thread_strmap protected by - * thread_test_mutex_. */ -static void -thread_test_func_(void* _s) -{ - char *s = _s; - int i, *count; - tor_mutex_t *m; - char buf[64]; - char **cp; - if (!strcmp(s, "thread 1")) { - m = thread_test_start1_; - cp = &thread1_name_; - count = &t1_count; - } else { - m = thread_test_start2_; - cp = &thread2_name_; - count = &t2_count; - } - - tor_snprintf(buf, sizeof(buf), "%lu", tor_get_thread_id()); - *cp = tor_strdup(buf); - - tor_mutex_acquire(m); - - for (i=0; i<10000; ++i) { - tor_mutex_acquire(thread_test_mutex_); - strmap_set(thread_test_strmap_, "last to run", *cp); - ++*count; - tor_mutex_release(thread_test_mutex_); - } - tor_mutex_acquire(thread_test_mutex_); - strmap_set(thread_test_strmap_, s, *cp); - tor_mutex_release(thread_test_mutex_); - - tor_mutex_release(m); - - spawn_exit(); -} - -/** Run unit tests for threading logic. */ -static void -test_util_threads(void *arg) -{ - char *s1 = NULL, *s2 = NULL; - int done = 0, timedout = 0; - time_t started; -#ifndef _WIN32 - struct timeval tv; - tv.tv_sec=0; - tv.tv_usec=100*1000; -#endif - (void)arg; - thread_test_mutex_ = tor_mutex_new(); - thread_test_start1_ = tor_mutex_new(); - thread_test_start2_ = tor_mutex_new(); - thread_test_strmap_ = strmap_new(); - s1 = tor_strdup("thread 1"); - s2 = tor_strdup("thread 2"); - tor_mutex_acquire(thread_test_start1_); - tor_mutex_acquire(thread_test_start2_); - spawn_func(thread_test_func_, s1); - spawn_func(thread_test_func_, s2); - tor_mutex_release(thread_test_start2_); - tor_mutex_release(thread_test_start1_); - started = time(NULL); - while (!done) { - tor_mutex_acquire(thread_test_mutex_); - strmap_assert_ok(thread_test_strmap_); - if (strmap_get(thread_test_strmap_, "thread 1") && - strmap_get(thread_test_strmap_, "thread 2")) { - done = 1; - } else if (time(NULL) > started + 150) { - timedout = done = 1; - } - tor_mutex_release(thread_test_mutex_); -#ifndef _WIN32 - /* Prevent the main thread from starving the worker threads. */ - select(0, NULL, NULL, NULL, &tv); -#endif - } - tor_mutex_acquire(thread_test_start1_); - tor_mutex_release(thread_test_start1_); - tor_mutex_acquire(thread_test_start2_); - tor_mutex_release(thread_test_start2_); - - tor_mutex_free(thread_test_mutex_); - - if (timedout) { - printf("\nTimed out: %d %d", t1_count, t2_count); - tt_assert(strmap_get(thread_test_strmap_, "thread 1")); - tt_assert(strmap_get(thread_test_strmap_, "thread 2")); - tt_assert(!timedout); - } - - /* different thread IDs. */ - tt_assert(strcmp(strmap_get(thread_test_strmap_, "thread 1"), - strmap_get(thread_test_strmap_, "thread 2"))); - tt_assert(!strcmp(strmap_get(thread_test_strmap_, "thread 1"), - strmap_get(thread_test_strmap_, "last to run")) || - !strcmp(strmap_get(thread_test_strmap_, "thread 2"), - strmap_get(thread_test_strmap_, "last to run"))); - - done: - tor_free(s1); - tor_free(s2); - tor_free(thread1_name_); - tor_free(thread2_name_); - if (thread_test_strmap_) - strmap_free(thread_test_strmap_, NULL); - if (thread_test_start1_) - tor_mutex_free(thread_test_start1_); - if (thread_test_start2_) - tor_mutex_free(thread_test_start2_); -} - /** Run unit tests for compression functions */ static void test_util_gzip(void *arg) @@ -1758,8 +1629,8 @@ test_util_gzip(void *arg) tt_assert(!tor_gzip_uncompress(&buf3, &len2, buf2, len1, GZIP_METHOD, 1, LOG_INFO)); tt_assert(buf3); - tt_int_op(strlen(buf1) + 1,==, len2); - tt_str_op(buf1,==, buf3); + tt_int_op(strlen(buf1) + 1,OP_EQ, len2); + tt_str_op(buf1,OP_EQ, buf3); tor_free(buf2); tor_free(buf3); @@ -1773,8 +1644,8 @@ test_util_gzip(void *arg) tt_assert(!tor_gzip_uncompress(&buf3, &len2, buf2, len1, ZLIB_METHOD, 1, LOG_INFO)); tt_assert(buf3); - tt_int_op(strlen(buf1) + 1,==, len2); - tt_str_op(buf1,==, buf3); + tt_int_op(strlen(buf1) + 1,OP_EQ, len2); + tt_str_op(buf1,OP_EQ, buf3); /* Check whether we can uncompress concatenated, compressed strings. */ tor_free(buf3); @@ -1782,8 +1653,8 @@ test_util_gzip(void *arg) memcpy(buf2+len1, buf2, len1); tt_assert(!tor_gzip_uncompress(&buf3, &len2, buf2, len1*2, ZLIB_METHOD, 1, LOG_INFO)); - tt_int_op((strlen(buf1)+1)*2,==, len2); - tt_mem_op(buf3,==, + tt_int_op((strlen(buf1)+1)*2,OP_EQ, len2); + tt_mem_op(buf3,OP_EQ, "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAAAAAAAAAAAAAAAAAAAZ\0" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAAAAAAAAAAAAAAAAAAAZ\0", (strlen(buf1)+1)*2); @@ -1815,7 +1686,7 @@ test_util_gzip(void *arg) tor_free(buf1); tor_free(buf2); tor_free(buf3); - state = tor_zlib_new(1, ZLIB_METHOD); + state = tor_zlib_new(1, ZLIB_METHOD, HIGH_COMPRESSION); tt_assert(state); cp1 = buf1 = tor_malloc(1024); len1 = 1024; @@ -1823,20 +1694,21 @@ test_util_gzip(void *arg) len2 = 21; tt_assert(tor_zlib_process(state, &cp1, &len1, &ccp2, &len2, 0) == TOR_ZLIB_OK); - tt_int_op(0,==, len2); /* Make sure we compressed it all. */ + tt_int_op(0,OP_EQ, len2); /* Make sure we compressed it all. */ tt_assert(cp1 > buf1); len2 = 0; cp2 = cp1; tt_assert(tor_zlib_process(state, &cp1, &len1, &ccp2, &len2, 1) == TOR_ZLIB_DONE); - tt_int_op(0,==, len2); + tt_int_op(0,OP_EQ, len2); tt_assert(cp1 > cp2); /* Make sure we really added something. */ tt_assert(!tor_gzip_uncompress(&buf3, &len2, buf1, 1024-len1, ZLIB_METHOD, 1, LOG_WARN)); - tt_str_op(buf3,==,"ABCDEFGHIJABCDEFGHIJ"); /*Make sure it compressed right.*/ - tt_int_op(21,==, len2); + /* Make sure it compressed right. */ + tt_str_op(buf3, OP_EQ, "ABCDEFGHIJABCDEFGHIJ"); + tt_int_op(21,OP_EQ, len2); done: if (state) @@ -1867,25 +1739,25 @@ test_util_mmap(void *arg) mapping = tor_mmap_file(fname1); tt_assert(mapping); - tt_int_op(mapping->size,==, strlen("Short file.")); - tt_str_op(mapping->data,==, "Short file."); + tt_int_op(mapping->size,OP_EQ, strlen("Short file.")); + tt_str_op(mapping->data,OP_EQ, "Short file."); #ifdef _WIN32 - tt_int_op(0, ==, tor_munmap_file(mapping)); + tt_int_op(0, OP_EQ, tor_munmap_file(mapping)); mapping = NULL; tt_assert(unlink(fname1) == 0); #else /* make sure we can unlink. */ tt_assert(unlink(fname1) == 0); - tt_str_op(mapping->data,==, "Short file."); - tt_int_op(0, ==, tor_munmap_file(mapping)); + tt_str_op(mapping->data,OP_EQ, "Short file."); + tt_int_op(0, OP_EQ, tor_munmap_file(mapping)); mapping = NULL; #endif /* Now a zero-length file. */ write_str_to_file(fname1, "", 1); mapping = tor_mmap_file(fname1); - tt_ptr_op(mapping,==, NULL); - tt_int_op(ERANGE,==, errno); + tt_ptr_op(mapping,OP_EQ, NULL); + tt_int_op(ERANGE,OP_EQ, errno); unlink(fname1); /* Make sure that we fail to map a no-longer-existent file. */ @@ -1896,18 +1768,18 @@ test_util_mmap(void *arg) write_bytes_to_file(fname2, buf, buflen, 1); mapping = tor_mmap_file(fname2); tt_assert(mapping); - tt_int_op(mapping->size,==, buflen); - tt_mem_op(mapping->data,==, buf, buflen); - tt_int_op(0, ==, tor_munmap_file(mapping)); + tt_int_op(mapping->size,OP_EQ, buflen); + tt_mem_op(mapping->data,OP_EQ, buf, buflen); + tt_int_op(0, OP_EQ, tor_munmap_file(mapping)); mapping = NULL; /* Now try a big aligned file. */ write_bytes_to_file(fname3, buf, 16384, 1); mapping = tor_mmap_file(fname3); tt_assert(mapping); - tt_int_op(mapping->size,==, 16384); - tt_mem_op(mapping->data,==, buf, 16384); - tt_int_op(0, ==, tor_munmap_file(mapping)); + tt_int_op(mapping->size,OP_EQ, 16384); + tt_mem_op(mapping->data,OP_EQ, buf, 16384); + tt_int_op(0, OP_EQ, tor_munmap_file(mapping)); mapping = NULL; done: @@ -1934,9 +1806,9 @@ test_util_control_formats(void *arg) (void)arg; sz = read_escaped_data(inp, strlen(inp), &out); - tt_str_op(out,==, + tt_str_op(out,OP_EQ, ".This is a test\nof the emergency \n.system.\n\rZ.\n"); - tt_int_op(sz,==, strlen(out)); + tt_int_op(sz,OP_EQ, strlen(out)); done: tor_free(out); @@ -1968,334 +1840,335 @@ test_util_sscanf(void *arg) /* Simple tests (malformed patterns, literal matching, ...) */ (void)arg; - tt_int_op(-1,==, tor_sscanf("123", "%i", &r)); /* %i is not supported */ - tt_int_op(-1,==, + tt_int_op(-1,OP_EQ, tor_sscanf("123", "%i", &r)); /* %i is not supported */ + tt_int_op(-1,OP_EQ, tor_sscanf("wrong", "%5c", s1)); /* %c cannot have a number. */ - tt_int_op(-1,==, tor_sscanf("hello", "%s", s1)); /* %s needs a number. */ - tt_int_op(-1,==, tor_sscanf("prettylongstring", "%999999s", s1)); + tt_int_op(-1,OP_EQ, tor_sscanf("hello", "%s", s1)); /* %s needs a number. */ + tt_int_op(-1,OP_EQ, tor_sscanf("prettylongstring", "%999999s", s1)); #if 0 /* GCC thinks these two are illegal. */ test_eq(-1, tor_sscanf("prettylongstring", "%0s", s1)); test_eq(0, tor_sscanf("prettylongstring", "%10s", NULL)); #endif /* No '%'-strings: always "success" */ - tt_int_op(0,==, tor_sscanf("hello world", "hello world")); - tt_int_op(0,==, tor_sscanf("hello world", "good bye")); + tt_int_op(0,OP_EQ, tor_sscanf("hello world", "hello world")); + tt_int_op(0,OP_EQ, tor_sscanf("hello world", "good bye")); /* Excess data */ - tt_int_op(0,==, + tt_int_op(0,OP_EQ, tor_sscanf("hello 3", "%u", &u1)); /* have to match the start */ - tt_int_op(0,==, tor_sscanf(" 3 hello", "%u", &u1)); - tt_int_op(0,==, + tt_int_op(0,OP_EQ, tor_sscanf(" 3 hello", "%u", &u1)); + tt_int_op(0,OP_EQ, tor_sscanf(" 3 hello", "%2u", &u1)); /* not even in this case */ - tt_int_op(1,==, + tt_int_op(1,OP_EQ, tor_sscanf("3 hello", "%u", &u1)); /* but trailing is alright */ /* Numbers (ie. %u) */ - tt_int_op(0,==, + tt_int_op(0,OP_EQ, tor_sscanf("hello world 3", "hello worlb %u", &u1)); /* d vs b */ - tt_int_op(1,==, tor_sscanf("12345", "%u", &u1)); - tt_int_op(12345u,==, u1); - tt_int_op(1,==, tor_sscanf("12346 ", "%u", &u1)); - tt_int_op(12346u,==, u1); - tt_int_op(0,==, tor_sscanf(" 12347", "%u", &u1)); - tt_int_op(1,==, tor_sscanf(" 12348", " %u", &u1)); - tt_int_op(12348u,==, u1); - tt_int_op(1,==, tor_sscanf("0", "%u", &u1)); - tt_int_op(0u,==, u1); - tt_int_op(1,==, tor_sscanf("0000", "%u", &u2)); - tt_int_op(0u,==, u2); - tt_int_op(0,==, tor_sscanf("", "%u", &u1)); /* absent number */ - tt_int_op(0,==, tor_sscanf("A", "%u", &u1)); /* bogus number */ - tt_int_op(0,==, tor_sscanf("-1", "%u", &u1)); /* negative number */ + tt_int_op(1,OP_EQ, tor_sscanf("12345", "%u", &u1)); + tt_int_op(12345u,OP_EQ, u1); + tt_int_op(1,OP_EQ, tor_sscanf("12346 ", "%u", &u1)); + tt_int_op(12346u,OP_EQ, u1); + tt_int_op(0,OP_EQ, tor_sscanf(" 12347", "%u", &u1)); + tt_int_op(1,OP_EQ, tor_sscanf(" 12348", " %u", &u1)); + tt_int_op(12348u,OP_EQ, u1); + tt_int_op(1,OP_EQ, tor_sscanf("0", "%u", &u1)); + tt_int_op(0u,OP_EQ, u1); + tt_int_op(1,OP_EQ, tor_sscanf("0000", "%u", &u2)); + tt_int_op(0u,OP_EQ, u2); + tt_int_op(0,OP_EQ, tor_sscanf("", "%u", &u1)); /* absent number */ + tt_int_op(0,OP_EQ, tor_sscanf("A", "%u", &u1)); /* bogus number */ + tt_int_op(0,OP_EQ, tor_sscanf("-1", "%u", &u1)); /* negative number */ /* Numbers with size (eg. %2u) */ - tt_int_op(0,==, tor_sscanf("-1", "%2u", &u1)); - tt_int_op(2,==, tor_sscanf("123456", "%2u%u", &u1, &u2)); - tt_int_op(12u,==, u1); - tt_int_op(3456u,==, u2); - tt_int_op(1,==, tor_sscanf("123456", "%8u", &u1)); - tt_int_op(123456u,==, u1); - tt_int_op(1,==, tor_sscanf("123457 ", "%8u", &u1)); - tt_int_op(123457u,==, u1); - tt_int_op(0,==, tor_sscanf(" 123456", "%8u", &u1)); - tt_int_op(3,==, tor_sscanf("!12:3:456", "!%2u:%2u:%3u", &u1, &u2, &u3)); - tt_int_op(12u,==, u1); - tt_int_op(3u,==, u2); - tt_int_op(456u,==, u3); - tt_int_op(3,==, + tt_int_op(0,OP_EQ, tor_sscanf("-1", "%2u", &u1)); + tt_int_op(2,OP_EQ, tor_sscanf("123456", "%2u%u", &u1, &u2)); + tt_int_op(12u,OP_EQ, u1); + tt_int_op(3456u,OP_EQ, u2); + tt_int_op(1,OP_EQ, tor_sscanf("123456", "%8u", &u1)); + tt_int_op(123456u,OP_EQ, u1); + tt_int_op(1,OP_EQ, tor_sscanf("123457 ", "%8u", &u1)); + tt_int_op(123457u,OP_EQ, u1); + tt_int_op(0,OP_EQ, tor_sscanf(" 123456", "%8u", &u1)); + tt_int_op(3,OP_EQ, tor_sscanf("!12:3:456", "!%2u:%2u:%3u", &u1, &u2, &u3)); + tt_int_op(12u,OP_EQ, u1); + tt_int_op(3u,OP_EQ, u2); + tt_int_op(456u,OP_EQ, u3); + tt_int_op(3,OP_EQ, tor_sscanf("67:8:099", "%2u:%2u:%3u", &u1, &u2, &u3)); /* 0s */ - tt_int_op(67u,==, u1); - tt_int_op(8u,==, u2); - tt_int_op(99u,==, u3); + tt_int_op(67u,OP_EQ, u1); + tt_int_op(8u,OP_EQ, u2); + tt_int_op(99u,OP_EQ, u3); /* %u does not match space.*/ - tt_int_op(2,==, tor_sscanf("12:3: 45", "%2u:%2u:%3u", &u1, &u2, &u3)); - tt_int_op(12u,==, u1); - tt_int_op(3u,==, u2); + tt_int_op(2,OP_EQ, tor_sscanf("12:3: 45", "%2u:%2u:%3u", &u1, &u2, &u3)); + tt_int_op(12u,OP_EQ, u1); + tt_int_op(3u,OP_EQ, u2); /* %u does not match negative numbers. */ - tt_int_op(2,==, tor_sscanf("67:8:-9", "%2u:%2u:%3u", &u1, &u2, &u3)); - tt_int_op(67u,==, u1); - tt_int_op(8u,==, u2); + tt_int_op(2,OP_EQ, tor_sscanf("67:8:-9", "%2u:%2u:%3u", &u1, &u2, &u3)); + tt_int_op(67u,OP_EQ, u1); + tt_int_op(8u,OP_EQ, u2); /* Arbitrary amounts of 0-padding are okay */ - tt_int_op(3,==, tor_sscanf("12:03:000000000000000099", "%2u:%2u:%u", + tt_int_op(3,OP_EQ, tor_sscanf("12:03:000000000000000099", "%2u:%2u:%u", &u1, &u2, &u3)); - tt_int_op(12u,==, u1); - tt_int_op(3u,==, u2); - tt_int_op(99u,==, u3); + tt_int_op(12u,OP_EQ, u1); + tt_int_op(3u,OP_EQ, u2); + tt_int_op(99u,OP_EQ, u3); /* Hex (ie. %x) */ - tt_int_op(3,==, tor_sscanf("1234 02aBcdEf ff", "%x %x %x", &u1, &u2, &u3)); - tt_int_op(0x1234,==, u1); - tt_int_op(0x2ABCDEF,==, u2); - tt_int_op(0xFF,==, u3); + tt_int_op(3,OP_EQ, + tor_sscanf("1234 02aBcdEf ff", "%x %x %x", &u1, &u2, &u3)); + tt_int_op(0x1234,OP_EQ, u1); + tt_int_op(0x2ABCDEF,OP_EQ, u2); + tt_int_op(0xFF,OP_EQ, u3); /* Width works on %x */ - tt_int_op(3,==, tor_sscanf("f00dcafe444", "%4x%4x%u", &u1, &u2, &u3)); - tt_int_op(0xf00d,==, u1); - tt_int_op(0xcafe,==, u2); - tt_int_op(444,==, u3); + tt_int_op(3,OP_EQ, tor_sscanf("f00dcafe444", "%4x%4x%u", &u1, &u2, &u3)); + tt_int_op(0xf00d,OP_EQ, u1); + tt_int_op(0xcafe,OP_EQ, u2); + tt_int_op(444,OP_EQ, u3); /* Literal '%' (ie. '%%') */ - tt_int_op(1,==, tor_sscanf("99% fresh", "%3u%% fresh", &u1)); - tt_int_op(99,==, u1); - tt_int_op(0,==, tor_sscanf("99 fresh", "%% %3u %s", &u1, s1)); - tt_int_op(1,==, tor_sscanf("99 fresh", "%3u%% %s", &u1, s1)); - tt_int_op(2,==, tor_sscanf("99 fresh", "%3u %5s %%", &u1, s1)); - tt_int_op(99,==, u1); - tt_str_op(s1,==, "fresh"); - tt_int_op(1,==, tor_sscanf("% boo", "%% %3s", s1)); - tt_str_op("boo",==, s1); + tt_int_op(1,OP_EQ, tor_sscanf("99% fresh", "%3u%% fresh", &u1)); + tt_int_op(99,OP_EQ, u1); + tt_int_op(0,OP_EQ, tor_sscanf("99 fresh", "%% %3u %s", &u1, s1)); + tt_int_op(1,OP_EQ, tor_sscanf("99 fresh", "%3u%% %s", &u1, s1)); + tt_int_op(2,OP_EQ, tor_sscanf("99 fresh", "%3u %5s %%", &u1, s1)); + tt_int_op(99,OP_EQ, u1); + tt_str_op(s1,OP_EQ, "fresh"); + tt_int_op(1,OP_EQ, tor_sscanf("% boo", "%% %3s", s1)); + tt_str_op("boo",OP_EQ, s1); /* Strings (ie. %s) */ - tt_int_op(2,==, tor_sscanf("hello", "%3s%7s", s1, s2)); - tt_str_op(s1,==, "hel"); - tt_str_op(s2,==, "lo"); - tt_int_op(2,==, tor_sscanf("WD40", "%2s%u", s3, &u1)); /* %s%u */ - tt_str_op(s3,==, "WD"); - tt_int_op(40,==, u1); - tt_int_op(2,==, tor_sscanf("WD40", "%3s%u", s3, &u1)); /* %s%u */ - tt_str_op(s3,==, "WD4"); - tt_int_op(0,==, u1); - tt_int_op(2,==, tor_sscanf("76trombones", "%6u%9s", &u1, s1)); /* %u%s */ - tt_int_op(76,==, u1); - tt_str_op(s1,==, "trombones"); - tt_int_op(1,==, tor_sscanf("prettylongstring", "%999s", s1)); - tt_str_op(s1,==, "prettylongstring"); + tt_int_op(2,OP_EQ, tor_sscanf("hello", "%3s%7s", s1, s2)); + tt_str_op(s1,OP_EQ, "hel"); + tt_str_op(s2,OP_EQ, "lo"); + tt_int_op(2,OP_EQ, tor_sscanf("WD40", "%2s%u", s3, &u1)); /* %s%u */ + tt_str_op(s3,OP_EQ, "WD"); + tt_int_op(40,OP_EQ, u1); + tt_int_op(2,OP_EQ, tor_sscanf("WD40", "%3s%u", s3, &u1)); /* %s%u */ + tt_str_op(s3,OP_EQ, "WD4"); + tt_int_op(0,OP_EQ, u1); + tt_int_op(2,OP_EQ, tor_sscanf("76trombones", "%6u%9s", &u1, s1)); /* %u%s */ + tt_int_op(76,OP_EQ, u1); + tt_str_op(s1,OP_EQ, "trombones"); + tt_int_op(1,OP_EQ, tor_sscanf("prettylongstring", "%999s", s1)); + tt_str_op(s1,OP_EQ, "prettylongstring"); /* %s doesn't eat spaces */ - tt_int_op(2,==, tor_sscanf("hello world", "%9s %9s", s1, s2)); - tt_str_op(s1,==, "hello"); - tt_str_op(s2,==, "world"); - tt_int_op(2,==, tor_sscanf("bye world?", "%9s %9s", s1, s2)); - tt_str_op(s1,==, "bye"); - tt_str_op(s2,==, ""); - tt_int_op(3,==, + tt_int_op(2,OP_EQ, tor_sscanf("hello world", "%9s %9s", s1, s2)); + tt_str_op(s1,OP_EQ, "hello"); + tt_str_op(s2,OP_EQ, "world"); + tt_int_op(2,OP_EQ, tor_sscanf("bye world?", "%9s %9s", s1, s2)); + tt_str_op(s1,OP_EQ, "bye"); + tt_str_op(s2,OP_EQ, ""); + tt_int_op(3,OP_EQ, tor_sscanf("hi", "%9s%9s%3s", s1, s2, s3)); /* %s can be empty. */ - tt_str_op(s1,==, "hi"); - tt_str_op(s2,==, ""); - tt_str_op(s3,==, ""); + tt_str_op(s1,OP_EQ, "hi"); + tt_str_op(s2,OP_EQ, ""); + tt_str_op(s3,OP_EQ, ""); - tt_int_op(3,==, tor_sscanf("1.2.3", "%u.%u.%u%c", &u1, &u2, &u3, &ch)); - tt_int_op(4,==, + tt_int_op(3,OP_EQ, tor_sscanf("1.2.3", "%u.%u.%u%c", &u1, &u2, &u3, &ch)); + tt_int_op(4,OP_EQ, tor_sscanf("1.2.3 foobar", "%u.%u.%u%c", &u1, &u2, &u3, &ch)); - tt_int_op(' ',==, ch); + tt_int_op(' ',OP_EQ, ch); r = tor_sscanf("12345 -67890 -1", "%d %ld %d", &int1, &lng1, &int2); - tt_int_op(r,==, 3); - tt_int_op(int1,==, 12345); - tt_int_op(lng1,==, -67890); - tt_int_op(int2,==, -1); + tt_int_op(r,OP_EQ, 3); + tt_int_op(int1,OP_EQ, 12345); + tt_int_op(lng1,OP_EQ, -67890); + tt_int_op(int2,OP_EQ, -1); #if SIZEOF_INT == 4 /* %u */ /* UINT32_MAX should work */ - tt_int_op(1,==, tor_sscanf("4294967295", "%u", &u1)); - tt_int_op(4294967295U,==, u1); + tt_int_op(1,OP_EQ, tor_sscanf("4294967295", "%u", &u1)); + tt_int_op(4294967295U,OP_EQ, u1); /* But UINT32_MAX + 1 shouldn't work */ - tt_int_op(0,==, tor_sscanf("4294967296", "%u", &u1)); + tt_int_op(0,OP_EQ, tor_sscanf("4294967296", "%u", &u1)); /* but parsing only 9... */ - tt_int_op(1,==, tor_sscanf("4294967296", "%9u", &u1)); - tt_int_op(429496729U,==, u1); + tt_int_op(1,OP_EQ, tor_sscanf("4294967296", "%9u", &u1)); + tt_int_op(429496729U,OP_EQ, u1); /* %x */ /* UINT32_MAX should work */ - tt_int_op(1,==, tor_sscanf("FFFFFFFF", "%x", &u1)); - tt_int_op(0xFFFFFFFF,==, u1); + tt_int_op(1,OP_EQ, tor_sscanf("FFFFFFFF", "%x", &u1)); + tt_int_op(0xFFFFFFFF,OP_EQ, u1); /* But UINT32_MAX + 1 shouldn't work */ - tt_int_op(0,==, tor_sscanf("100000000", "%x", &u1)); + tt_int_op(0,OP_EQ, tor_sscanf("100000000", "%x", &u1)); /* %d */ /* INT32_MIN and INT32_MAX should work */ r = tor_sscanf("-2147483648. 2147483647.", "%d. %d.", &int1, &int2); - tt_int_op(r,==, 2); - tt_int_op(int1,==, -2147483647 - 1); - tt_int_op(int2,==, 2147483647); + tt_int_op(r,OP_EQ, 2); + tt_int_op(int1,OP_EQ, -2147483647 - 1); + tt_int_op(int2,OP_EQ, 2147483647); /* But INT32_MIN - 1 and INT32_MAX + 1 shouldn't work */ r = tor_sscanf("-2147483649.", "%d.", &int1); - tt_int_op(r,==, 0); + tt_int_op(r,OP_EQ, 0); r = tor_sscanf("2147483648.", "%d.", &int1); - tt_int_op(r,==, 0); + tt_int_op(r,OP_EQ, 0); /* and the first failure stops further processing */ r = tor_sscanf("-2147483648. 2147483648.", "%d. %d.", &int1, &int2); - tt_int_op(r,==, 1); + tt_int_op(r,OP_EQ, 1); r = tor_sscanf("-2147483649. 2147483647.", "%d. %d.", &int1, &int2); - tt_int_op(r,==, 0); + tt_int_op(r,OP_EQ, 0); r = tor_sscanf("2147483648. -2147483649.", "%d. %d.", &int1, &int2); - tt_int_op(r,==, 0); + tt_int_op(r,OP_EQ, 0); #elif SIZEOF_INT == 8 /* %u */ /* UINT64_MAX should work */ - tt_int_op(1,==, tor_sscanf("18446744073709551615", "%u", &u1)); - tt_int_op(18446744073709551615U,==, u1); + tt_int_op(1,OP_EQ, tor_sscanf("18446744073709551615", "%u", &u1)); + tt_int_op(18446744073709551615U,OP_EQ, u1); /* But UINT64_MAX + 1 shouldn't work */ - tt_int_op(0,==, tor_sscanf("18446744073709551616", "%u", &u1)); + tt_int_op(0,OP_EQ, tor_sscanf("18446744073709551616", "%u", &u1)); /* but parsing only 19... */ - tt_int_op(1,==, tor_sscanf("18446744073709551616", "%19u", &u1)); - tt_int_op(1844674407370955161U,==, u1); + tt_int_op(1,OP_EQ, tor_sscanf("18446744073709551616", "%19u", &u1)); + tt_int_op(1844674407370955161U,OP_EQ, u1); /* %x */ /* UINT64_MAX should work */ - tt_int_op(1,==, tor_sscanf("FFFFFFFFFFFFFFFF", "%x", &u1)); - tt_int_op(0xFFFFFFFFFFFFFFFF,==, u1); + tt_int_op(1,OP_EQ, tor_sscanf("FFFFFFFFFFFFFFFF", "%x", &u1)); + tt_int_op(0xFFFFFFFFFFFFFFFF,OP_EQ, u1); /* But UINT64_MAX + 1 shouldn't work */ - tt_int_op(0,==, tor_sscanf("10000000000000000", "%x", &u1)); + tt_int_op(0,OP_EQ, tor_sscanf("10000000000000000", "%x", &u1)); /* %d */ /* INT64_MIN and INT64_MAX should work */ r = tor_sscanf("-9223372036854775808. 9223372036854775807.", "%d. %d.", &int1, &int2); - tt_int_op(r,==, 2); - tt_int_op(int1,==, -9223372036854775807 - 1); - tt_int_op(int2,==, 9223372036854775807); + tt_int_op(r,OP_EQ, 2); + tt_int_op(int1,OP_EQ, -9223372036854775807 - 1); + tt_int_op(int2,OP_EQ, 9223372036854775807); /* But INT64_MIN - 1 and INT64_MAX + 1 shouldn't work */ r = tor_sscanf("-9223372036854775809.", "%d.", &int1); - tt_int_op(r,==, 0); + tt_int_op(r,OP_EQ, 0); r = tor_sscanf("9223372036854775808.", "%d.", &int1); - tt_int_op(r,==, 0); + tt_int_op(r,OP_EQ, 0); /* and the first failure stops further processing */ r = tor_sscanf("-9223372036854775808. 9223372036854775808.", "%d. %d.", &int1, &int2); - tt_int_op(r,==, 1); + tt_int_op(r,OP_EQ, 1); r = tor_sscanf("-9223372036854775809. 9223372036854775807.", "%d. %d.", &int1, &int2); - tt_int_op(r,==, 0); + tt_int_op(r,OP_EQ, 0); r = tor_sscanf("9223372036854775808. -9223372036854775809.", "%d. %d.", &int1, &int2); - tt_int_op(r,==, 0); + tt_int_op(r,OP_EQ, 0); #endif #if SIZEOF_LONG == 4 /* %lu */ /* UINT32_MAX should work */ - tt_int_op(1,==, tor_sscanf("4294967295", "%lu", &ulng)); - tt_int_op(4294967295UL,==, ulng); + tt_int_op(1,OP_EQ, tor_sscanf("4294967295", "%lu", &ulng)); + tt_int_op(4294967295UL,OP_EQ, ulng); /* But UINT32_MAX + 1 shouldn't work */ - tt_int_op(0,==, tor_sscanf("4294967296", "%lu", &ulng)); + tt_int_op(0,OP_EQ, tor_sscanf("4294967296", "%lu", &ulng)); /* but parsing only 9... */ - tt_int_op(1,==, tor_sscanf("4294967296", "%9lu", &ulng)); - tt_int_op(429496729UL,==, ulng); + tt_int_op(1,OP_EQ, tor_sscanf("4294967296", "%9lu", &ulng)); + tt_int_op(429496729UL,OP_EQ, ulng); /* %lx */ /* UINT32_MAX should work */ - tt_int_op(1,==, tor_sscanf("FFFFFFFF", "%lx", &ulng)); - tt_int_op(0xFFFFFFFFUL,==, ulng); + tt_int_op(1,OP_EQ, tor_sscanf("FFFFFFFF", "%lx", &ulng)); + tt_int_op(0xFFFFFFFFUL,OP_EQ, ulng); /* But UINT32_MAX + 1 shouldn't work */ - tt_int_op(0,==, tor_sscanf("100000000", "%lx", &ulng)); + tt_int_op(0,OP_EQ, tor_sscanf("100000000", "%lx", &ulng)); /* %ld */ /* INT32_MIN and INT32_MAX should work */ r = tor_sscanf("-2147483648. 2147483647.", "%ld. %ld.", &lng1, &lng2); - tt_int_op(r,==, 2); - tt_int_op(lng1,==, -2147483647L - 1L); - tt_int_op(lng2,==, 2147483647L); + tt_int_op(r,OP_EQ, 2); + tt_int_op(lng1,OP_EQ, -2147483647L - 1L); + tt_int_op(lng2,OP_EQ, 2147483647L); /* But INT32_MIN - 1 and INT32_MAX + 1 shouldn't work */ r = tor_sscanf("-2147483649.", "%ld.", &lng1); - tt_int_op(r,==, 0); + tt_int_op(r,OP_EQ, 0); r = tor_sscanf("2147483648.", "%ld.", &lng1); - tt_int_op(r,==, 0); + tt_int_op(r,OP_EQ, 0); /* and the first failure stops further processing */ r = tor_sscanf("-2147483648. 2147483648.", "%ld. %ld.", &lng1, &lng2); - tt_int_op(r,==, 1); + tt_int_op(r,OP_EQ, 1); r = tor_sscanf("-2147483649. 2147483647.", "%ld. %ld.", &lng1, &lng2); - tt_int_op(r,==, 0); + tt_int_op(r,OP_EQ, 0); r = tor_sscanf("2147483648. -2147483649.", "%ld. %ld.", &lng1, &lng2); - tt_int_op(r,==, 0); + tt_int_op(r,OP_EQ, 0); #elif SIZEOF_LONG == 8 /* %lu */ /* UINT64_MAX should work */ - tt_int_op(1,==, tor_sscanf("18446744073709551615", "%lu", &ulng)); - tt_int_op(18446744073709551615UL,==, ulng); + tt_int_op(1,OP_EQ, tor_sscanf("18446744073709551615", "%lu", &ulng)); + tt_int_op(18446744073709551615UL,OP_EQ, ulng); /* But UINT64_MAX + 1 shouldn't work */ - tt_int_op(0,==, tor_sscanf("18446744073709551616", "%lu", &ulng)); + tt_int_op(0,OP_EQ, tor_sscanf("18446744073709551616", "%lu", &ulng)); /* but parsing only 19... */ - tt_int_op(1,==, tor_sscanf("18446744073709551616", "%19lu", &ulng)); - tt_int_op(1844674407370955161UL,==, ulng); + tt_int_op(1,OP_EQ, tor_sscanf("18446744073709551616", "%19lu", &ulng)); + tt_int_op(1844674407370955161UL,OP_EQ, ulng); /* %lx */ /* UINT64_MAX should work */ - tt_int_op(1,==, tor_sscanf("FFFFFFFFFFFFFFFF", "%lx", &ulng)); - tt_int_op(0xFFFFFFFFFFFFFFFFUL,==, ulng); + tt_int_op(1,OP_EQ, tor_sscanf("FFFFFFFFFFFFFFFF", "%lx", &ulng)); + tt_int_op(0xFFFFFFFFFFFFFFFFUL,OP_EQ, ulng); /* But UINT64_MAX + 1 shouldn't work */ - tt_int_op(0,==, tor_sscanf("10000000000000000", "%lx", &ulng)); + tt_int_op(0,OP_EQ, tor_sscanf("10000000000000000", "%lx", &ulng)); /* %ld */ /* INT64_MIN and INT64_MAX should work */ r = tor_sscanf("-9223372036854775808. 9223372036854775807.", "%ld. %ld.", &lng1, &lng2); - tt_int_op(r,==, 2); - tt_int_op(lng1,==, -9223372036854775807L - 1L); - tt_int_op(lng2,==, 9223372036854775807L); + tt_int_op(r,OP_EQ, 2); + tt_int_op(lng1,OP_EQ, -9223372036854775807L - 1L); + tt_int_op(lng2,OP_EQ, 9223372036854775807L); /* But INT64_MIN - 1 and INT64_MAX + 1 shouldn't work */ r = tor_sscanf("-9223372036854775809.", "%ld.", &lng1); - tt_int_op(r,==, 0); + tt_int_op(r,OP_EQ, 0); r = tor_sscanf("9223372036854775808.", "%ld.", &lng1); - tt_int_op(r,==, 0); + tt_int_op(r,OP_EQ, 0); /* and the first failure stops further processing */ r = tor_sscanf("-9223372036854775808. 9223372036854775808.", "%ld. %ld.", &lng1, &lng2); - tt_int_op(r,==, 1); + tt_int_op(r,OP_EQ, 1); r = tor_sscanf("-9223372036854775809. 9223372036854775807.", "%ld. %ld.", &lng1, &lng2); - tt_int_op(r,==, 0); + tt_int_op(r,OP_EQ, 0); r = tor_sscanf("9223372036854775808. -9223372036854775809.", "%ld. %ld.", &lng1, &lng2); - tt_int_op(r,==, 0); + tt_int_op(r,OP_EQ, 0); #endif r = tor_sscanf("123.456 .000007 -900123123.2000787 00003.2", "%lf %lf %lf %lf", &d1,&d2,&d3,&d4); - tt_int_op(r,==, 4); + tt_int_op(r,OP_EQ, 4); test_feq(d1, 123.456); test_feq(d2, .000007); test_feq(d3, -900123123.2000787); @@ -2350,234 +2223,234 @@ test_util_format_time_interval(void *arg) /* ignore exact spelling of "second(s)"*/ format_time_interval(dbuf, sizeof(dbuf), 0); - tt_int_op(strnlen(dbuf, DBUF_SIZE),<=, DBUF_SIZE - 1); + tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1); r = tor_sscanf(dbuf, TL_, &sec, label_s); - tt_int_op(r,==, 2); - tt_ci_char_op(label_s[0],==, 's'); - tt_int_op(sec,==, 0); + tt_int_op(r,OP_EQ, 2); + tt_ci_char_op(label_s[0],OP_EQ, 's'); + tt_int_op(sec,OP_EQ, 0); format_time_interval(dbuf, sizeof(dbuf), 1); - tt_int_op(strnlen(dbuf, DBUF_SIZE),<=, DBUF_SIZE - 1); + tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1); r = tor_sscanf(dbuf, TL_, &sec, label_s); - tt_int_op(r,==, 2); - tt_ci_char_op(label_s[0],==, 's'); - tt_int_op(sec,==, 1); + tt_int_op(r,OP_EQ, 2); + tt_ci_char_op(label_s[0],OP_EQ, 's'); + tt_int_op(sec,OP_EQ, 1); format_time_interval(dbuf, sizeof(dbuf), 10); - tt_int_op(strnlen(dbuf, DBUF_SIZE),<=, DBUF_SIZE - 1); + tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1); r = tor_sscanf(dbuf, TL_, &sec, label_s); - tt_int_op(r,==, 2); - tt_ci_char_op(label_s[0],==, 's'); - tt_int_op(sec,==, 10); + tt_int_op(r,OP_EQ, 2); + tt_ci_char_op(label_s[0],OP_EQ, 's'); + tt_int_op(sec,OP_EQ, 10); format_time_interval(dbuf, sizeof(dbuf), 59); - tt_int_op(strnlen(dbuf, DBUF_SIZE),<=, DBUF_SIZE - 1); + tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1); r = tor_sscanf(dbuf, TL_, &sec, label_s); - tt_int_op(r,==, 2); - tt_ci_char_op(label_s[0],==, 's'); - tt_int_op(sec,==, 59); + tt_int_op(r,OP_EQ, 2); + tt_ci_char_op(label_s[0],OP_EQ, 's'); + tt_int_op(sec,OP_EQ, 59); /* negative seconds are reported as their absolute value */ format_time_interval(dbuf, sizeof(dbuf), -4); - tt_int_op(strnlen(dbuf, DBUF_SIZE),<=, DBUF_SIZE - 1); + tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1); r = tor_sscanf(dbuf, TL_, &sec, label_s); - tt_int_op(r,==, 2); - tt_ci_char_op(label_s[0],==, 's'); - tt_int_op(sec,==, 4); - tt_int_op(strnlen(dbuf, DBUF_SIZE),<=, DBUF_SIZE - 1); + tt_int_op(r,OP_EQ, 2); + tt_ci_char_op(label_s[0],OP_EQ, 's'); + tt_int_op(sec,OP_EQ, 4); + tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1); format_time_interval(dbuf, sizeof(dbuf), -32); - tt_int_op(strnlen(dbuf, DBUF_SIZE),<=, DBUF_SIZE - 1); + tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1); r = tor_sscanf(dbuf, TL_, &sec, label_s); - tt_int_op(r,==, 2); - tt_ci_char_op(label_s[0],==, 's'); - tt_int_op(sec,==, 32); - tt_int_op(strnlen(dbuf, DBUF_SIZE),<=, DBUF_SIZE - 1); + tt_int_op(r,OP_EQ, 2); + tt_ci_char_op(label_s[0],OP_EQ, 's'); + tt_int_op(sec,OP_EQ, 32); + tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1); /* minutes: 1:00, 1:01, 1:59, 2:00, 2:01, 59:59 */ /* ignore trailing "0 second(s)", if present */ format_time_interval(dbuf, sizeof(dbuf), 60); - tt_int_op(strnlen(dbuf, DBUF_SIZE),<=, DBUF_SIZE - 1); + tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1); r = tor_sscanf(dbuf, TL_, &min, label_m); - tt_int_op(r,==, 2); - tt_ci_char_op(label_m[0],==, 'm'); - tt_int_op(min,==, 1); - tt_int_op(strnlen(dbuf, DBUF_SIZE),<=, DBUF_SIZE - 1); + tt_int_op(r,OP_EQ, 2); + tt_ci_char_op(label_m[0],OP_EQ, 'm'); + tt_int_op(min,OP_EQ, 1); + tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1); /* ignore exact spelling of "minute(s)," and "second(s)" */ format_time_interval(dbuf, sizeof(dbuf), 60 + 1); - tt_int_op(strnlen(dbuf, DBUF_SIZE),<=, DBUF_SIZE - 1); + tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1); r = tor_sscanf(dbuf, TL_ " " TL_, &min, label_m, &sec, label_s); - tt_int_op(r,==, 4); - tt_int_op(min,==, 1); - tt_ci_char_op(label_m[0],==, 'm'); - tt_int_op(sec,==, 1); - tt_ci_char_op(label_s[0],==, 's'); - tt_int_op(strnlen(dbuf, DBUF_SIZE),<=, DBUF_SIZE - 1); + tt_int_op(r,OP_EQ, 4); + tt_int_op(min,OP_EQ, 1); + tt_ci_char_op(label_m[0],OP_EQ, 'm'); + tt_int_op(sec,OP_EQ, 1); + tt_ci_char_op(label_s[0],OP_EQ, 's'); + tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1); format_time_interval(dbuf, sizeof(dbuf), 60*2 - 1); - tt_int_op(strnlen(dbuf, DBUF_SIZE),<=, DBUF_SIZE - 1); + tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1); r = tor_sscanf(dbuf, TL_ " " TL_, &min, label_m, &sec, label_s); - tt_int_op(r,==, 4); - tt_int_op(min,==, 1); - tt_ci_char_op(label_m[0],==, 'm'); - tt_int_op(sec,==, 59); - tt_ci_char_op(label_s[0],==, 's'); + tt_int_op(r,OP_EQ, 4); + tt_int_op(min,OP_EQ, 1); + tt_ci_char_op(label_m[0],OP_EQ, 'm'); + tt_int_op(sec,OP_EQ, 59); + tt_ci_char_op(label_s[0],OP_EQ, 's'); /* ignore trailing "0 second(s)", if present */ format_time_interval(dbuf, sizeof(dbuf), 60*2); - tt_int_op(strnlen(dbuf, DBUF_SIZE),<=, DBUF_SIZE - 1); + tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1); r = tor_sscanf(dbuf, TL_, &min, label_m); - tt_int_op(r,==, 2); - tt_int_op(min,==, 2); - tt_ci_char_op(label_m[0],==, 'm'); + tt_int_op(r,OP_EQ, 2); + tt_int_op(min,OP_EQ, 2); + tt_ci_char_op(label_m[0],OP_EQ, 'm'); /* ignore exact spelling of "minute(s)," and "second(s)" */ format_time_interval(dbuf, sizeof(dbuf), 60*2 + 1); - tt_int_op(strnlen(dbuf, DBUF_SIZE),<=, DBUF_SIZE - 1); + tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1); r = tor_sscanf(dbuf, TL_ " " TL_, &min, label_m, &sec, label_s); - tt_int_op(r,==, 4); - tt_int_op(min,==, 2); - tt_ci_char_op(label_m[0],==, 'm'); - tt_int_op(sec,==, 1); - tt_ci_char_op(label_s[0],==, 's'); + tt_int_op(r,OP_EQ, 4); + tt_int_op(min,OP_EQ, 2); + tt_ci_char_op(label_m[0],OP_EQ, 'm'); + tt_int_op(sec,OP_EQ, 1); + tt_ci_char_op(label_s[0],OP_EQ, 's'); format_time_interval(dbuf, sizeof(dbuf), 60*60 - 1); - tt_int_op(strnlen(dbuf, DBUF_SIZE),<=, DBUF_SIZE - 1); + tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1); r = tor_sscanf(dbuf, TL_ " " TL_, &min, label_m, &sec, label_s); - tt_int_op(r,==, 4); - tt_int_op(min,==, 59); - tt_ci_char_op(label_m[0],==, 'm'); - tt_int_op(sec,==, 59); - tt_ci_char_op(label_s[0],==, 's'); + tt_int_op(r,OP_EQ, 4); + tt_int_op(min,OP_EQ, 59); + tt_ci_char_op(label_m[0],OP_EQ, 'm'); + tt_int_op(sec,OP_EQ, 59); + tt_ci_char_op(label_s[0],OP_EQ, 's'); /* negative minutes are reported as their absolute value */ /* ignore trailing "0 second(s)", if present */ format_time_interval(dbuf, sizeof(dbuf), -3*60); - tt_int_op(strnlen(dbuf, DBUF_SIZE),<=, DBUF_SIZE - 1); + tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1); r = tor_sscanf(dbuf, TL_, &min, label_m); - tt_int_op(r,==, 2); - tt_int_op(min,==, 3); - tt_ci_char_op(label_m[0],==, 'm'); + tt_int_op(r,OP_EQ, 2); + tt_int_op(min,OP_EQ, 3); + tt_ci_char_op(label_m[0],OP_EQ, 'm'); /* ignore exact spelling of "minute(s)," and "second(s)" */ format_time_interval(dbuf, sizeof(dbuf), -96); - tt_int_op(strnlen(dbuf, DBUF_SIZE),<=, DBUF_SIZE - 1); + tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1); r = tor_sscanf(dbuf, TL_ " " TL_, &min, label_m, &sec, label_s); - tt_int_op(r,==, 4); - tt_int_op(min,==, 1); - tt_ci_char_op(label_m[0],==, 'm'); - tt_int_op(sec,==, 36); - tt_ci_char_op(label_s[0],==, 's'); + tt_int_op(r,OP_EQ, 4); + tt_int_op(min,OP_EQ, 1); + tt_ci_char_op(label_m[0],OP_EQ, 'm'); + tt_int_op(sec,OP_EQ, 36); + tt_ci_char_op(label_s[0],OP_EQ, 's'); format_time_interval(dbuf, sizeof(dbuf), -2815); - tt_int_op(strnlen(dbuf, DBUF_SIZE),<=, DBUF_SIZE - 1); + tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1); r = tor_sscanf(dbuf, TL_ " " TL_, &min, label_m, &sec, label_s); - tt_int_op(r,==, 4); - tt_int_op(min,==, 46); - tt_ci_char_op(label_m[0],==, 'm'); - tt_int_op(sec,==, 55); - tt_ci_char_op(label_s[0],==, 's'); + tt_int_op(r,OP_EQ, 4); + tt_int_op(min,OP_EQ, 46); + tt_ci_char_op(label_m[0],OP_EQ, 'm'); + tt_int_op(sec,OP_EQ, 55); + tt_ci_char_op(label_s[0],OP_EQ, 's'); /* hours: 1:00, 1:00:01, 1:01, 23:59, 23:59:59 */ /* always ignore trailing seconds, if present */ /* ignore trailing "0 minute(s)" etc., if present */ format_time_interval(dbuf, sizeof(dbuf), 60*60); - tt_int_op(strnlen(dbuf, DBUF_SIZE),<=, DBUF_SIZE - 1); + tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1); r = tor_sscanf(dbuf, TL_, &hour, label_h); - tt_int_op(r,==, 2); - tt_int_op(hour,==, 1); - tt_ci_char_op(label_h[0],==, 'h'); + tt_int_op(r,OP_EQ, 2); + tt_int_op(hour,OP_EQ, 1); + tt_ci_char_op(label_h[0],OP_EQ, 'h'); format_time_interval(dbuf, sizeof(dbuf), 60*60 + 1); - tt_int_op(strnlen(dbuf, DBUF_SIZE),<=, DBUF_SIZE - 1); + tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1); r = tor_sscanf(dbuf, TL_, &hour, label_h); - tt_int_op(r,==, 2); - tt_int_op(hour,==, 1); - tt_ci_char_op(label_h[0],==, 'h'); + tt_int_op(r,OP_EQ, 2); + tt_int_op(hour,OP_EQ, 1); + tt_ci_char_op(label_h[0],OP_EQ, 'h'); /* ignore exact spelling of "hour(s)," etc. */ format_time_interval(dbuf, sizeof(dbuf), 60*60 + 60); - tt_int_op(strnlen(dbuf, DBUF_SIZE),<=, DBUF_SIZE - 1); + tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1); r = tor_sscanf(dbuf, TL_ " " TL_, &hour, label_h, &min, label_m); - tt_int_op(r,==, 4); - tt_int_op(hour,==, 1); - tt_ci_char_op(label_h[0],==, 'h'); - tt_int_op(min,==, 1); - tt_ci_char_op(label_m[0],==, 'm'); + tt_int_op(r,OP_EQ, 4); + tt_int_op(hour,OP_EQ, 1); + tt_ci_char_op(label_h[0],OP_EQ, 'h'); + tt_int_op(min,OP_EQ, 1); + tt_ci_char_op(label_m[0],OP_EQ, 'm'); format_time_interval(dbuf, sizeof(dbuf), 24*60*60 - 60); - tt_int_op(strnlen(dbuf, DBUF_SIZE),<=, DBUF_SIZE - 1); + tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1); r = tor_sscanf(dbuf, TL_ " " TL_, &hour, label_h, &min, label_m); - tt_int_op(r,==, 4); - tt_int_op(hour,==, 23); - tt_ci_char_op(label_h[0],==, 'h'); - tt_int_op(min,==, 59); - tt_ci_char_op(label_m[0],==, 'm'); + tt_int_op(r,OP_EQ, 4); + tt_int_op(hour,OP_EQ, 23); + tt_ci_char_op(label_h[0],OP_EQ, 'h'); + tt_int_op(min,OP_EQ, 59); + tt_ci_char_op(label_m[0],OP_EQ, 'm'); format_time_interval(dbuf, sizeof(dbuf), 24*60*60 - 1); - tt_int_op(strnlen(dbuf, DBUF_SIZE),<=, DBUF_SIZE - 1); + tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1); r = tor_sscanf(dbuf, TL_ " " TL_, &hour, label_h, &min, label_m); - tt_int_op(r,==, 4); - tt_int_op(hour,==, 23); - tt_ci_char_op(label_h[0],==, 'h'); - tt_int_op(min,==, 59); - tt_ci_char_op(label_m[0],==, 'm'); + tt_int_op(r,OP_EQ, 4); + tt_int_op(hour,OP_EQ, 23); + tt_ci_char_op(label_h[0],OP_EQ, 'h'); + tt_int_op(min,OP_EQ, 59); + tt_ci_char_op(label_m[0],OP_EQ, 'm'); /* negative hours are reported as their absolute value */ /* ignore exact spelling of "hour(s)," etc., if present */ format_time_interval(dbuf, sizeof(dbuf), -2*60*60); - tt_int_op(strnlen(dbuf, DBUF_SIZE),<=, DBUF_SIZE - 1); + tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1); r = tor_sscanf(dbuf, TL_, &hour, label_h); - tt_int_op(r,==, 2); - tt_int_op(hour,==, 2); - tt_ci_char_op(label_h[0],==, 'h'); + tt_int_op(r,OP_EQ, 2); + tt_int_op(hour,OP_EQ, 2); + tt_ci_char_op(label_h[0],OP_EQ, 'h'); format_time_interval(dbuf, sizeof(dbuf), -75804); - tt_int_op(strnlen(dbuf, DBUF_SIZE),<=, DBUF_SIZE - 1); + tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1); r = tor_sscanf(dbuf, TL_ " " TL_, &hour, label_h, &min, label_m); - tt_int_op(r,==, 4); - tt_int_op(hour,==, 21); - tt_ci_char_op(label_h[0],==, 'h'); - tt_int_op(min,==, 3); - tt_ci_char_op(label_m[0],==, 'm'); + tt_int_op(r,OP_EQ, 4); + tt_int_op(hour,OP_EQ, 21); + tt_ci_char_op(label_h[0],OP_EQ, 'h'); + tt_int_op(min,OP_EQ, 3); + tt_ci_char_op(label_m[0],OP_EQ, 'm'); /* days: 1:00, 1:00:00:01, 1:00:01, 1:01 */ /* always ignore trailing seconds, if present */ /* ignore trailing "0 hours(s)" etc., if present */ format_time_interval(dbuf, sizeof(dbuf), 24*60*60); - tt_int_op(strnlen(dbuf, DBUF_SIZE),<=, DBUF_SIZE - 1); + tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1); r = tor_sscanf(dbuf, TL_, &day, label_d); - tt_int_op(r,==, 2); - tt_int_op(day,==, 1); - tt_ci_char_op(label_d[0],==, 'd'); + tt_int_op(r,OP_EQ, 2); + tt_int_op(day,OP_EQ, 1); + tt_ci_char_op(label_d[0],OP_EQ, 'd'); format_time_interval(dbuf, sizeof(dbuf), 24*60*60 + 1); - tt_int_op(strnlen(dbuf, DBUF_SIZE),<=, DBUF_SIZE - 1); + tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1); r = tor_sscanf(dbuf, TL_, &day, label_d); - tt_int_op(r,==, 2); - tt_int_op(day,==, 1); - tt_ci_char_op(label_d[0],==, 'd'); + tt_int_op(r,OP_EQ, 2); + tt_int_op(day,OP_EQ, 1); + tt_ci_char_op(label_d[0],OP_EQ, 'd'); /* ignore exact spelling of "days(s)," etc. */ format_time_interval(dbuf, sizeof(dbuf), 24*60*60 + 60); - tt_int_op(strnlen(dbuf, DBUF_SIZE),<=, DBUF_SIZE - 1); + tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1); r = tor_sscanf(dbuf, TL_ " " TL_ " " TL_, &day, label_d, &hour, label_h, &min, label_m); if (r == -1) { @@ -2586,68 +2459,68 @@ test_util_format_time_interval(void *arg) &day, label_d, &min, label_m); } tt_assert(r == 4 || r == 6); - tt_int_op(day,==, 1); - tt_ci_char_op(label_d[0],==, 'd'); + tt_int_op(day,OP_EQ, 1); + tt_ci_char_op(label_d[0],OP_EQ, 'd'); if (r == 6) { - tt_int_op(hour,==, 0); - tt_ci_char_op(label_h[0],==, 'h'); + tt_int_op(hour,OP_EQ, 0); + tt_ci_char_op(label_h[0],OP_EQ, 'h'); } - tt_int_op(min,==, 1); - tt_ci_char_op(label_m[0],==, 'm'); + tt_int_op(min,OP_EQ, 1); + tt_ci_char_op(label_m[0],OP_EQ, 'm'); /* ignore trailing "0 minutes(s)" etc., if present */ format_time_interval(dbuf, sizeof(dbuf), 24*60*60 + 60*60); - tt_int_op(strnlen(dbuf, DBUF_SIZE),<=, DBUF_SIZE - 1); + tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1); r = tor_sscanf(dbuf, TL_ " " TL_, &day, label_d, &hour, label_h); - tt_int_op(r,==, 4); - tt_int_op(day,==, 1); - tt_ci_char_op(label_d[0],==, 'd'); - tt_int_op(hour,==, 1); - tt_ci_char_op(label_h[0],==, 'h'); + tt_int_op(r,OP_EQ, 4); + tt_int_op(day,OP_EQ, 1); + tt_ci_char_op(label_d[0],OP_EQ, 'd'); + tt_int_op(hour,OP_EQ, 1); + tt_ci_char_op(label_h[0],OP_EQ, 'h'); /* negative days are reported as their absolute value */ format_time_interval(dbuf, sizeof(dbuf), -21936184); - tt_int_op(strnlen(dbuf, DBUF_SIZE),<=, DBUF_SIZE - 1); + tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1); r = tor_sscanf(dbuf, TL_ " " TL_ " " TL_, &day, label_d, &hour, label_h, &min, label_m); - tt_int_op(r,==, 6); - tt_int_op(day,==, 253); - tt_ci_char_op(label_d[0],==, 'd'); - tt_int_op(hour,==, 21); - tt_ci_char_op(label_h[0],==, 'h'); - tt_int_op(min,==, 23); - tt_ci_char_op(label_m[0],==, 'm'); + tt_int_op(r,OP_EQ, 6); + tt_int_op(day,OP_EQ, 253); + tt_ci_char_op(label_d[0],OP_EQ, 'd'); + tt_int_op(hour,OP_EQ, 21); + tt_ci_char_op(label_h[0],OP_EQ, 'h'); + tt_int_op(min,OP_EQ, 23); + tt_ci_char_op(label_m[0],OP_EQ, 'm'); /* periods > 1 year are reported in days (warn?) */ /* ignore exact spelling of "days(s)," etc., if present */ format_time_interval(dbuf, sizeof(dbuf), 758635154); - tt_int_op(strnlen(dbuf, DBUF_SIZE),<=, DBUF_SIZE - 1); + tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1); r = tor_sscanf(dbuf, TL_ " " TL_ " " TL_, &day, label_d, &hour, label_h, &min, label_m); - tt_int_op(r,==, 6); - tt_int_op(day,==, 8780); - tt_ci_char_op(label_d[0],==, 'd'); - tt_int_op(hour,==, 11); - tt_ci_char_op(label_h[0],==, 'h'); - tt_int_op(min,==, 59); - tt_ci_char_op(label_m[0],==, 'm'); + tt_int_op(r,OP_EQ, 6); + tt_int_op(day,OP_EQ, 8780); + tt_ci_char_op(label_d[0],OP_EQ, 'd'); + tt_int_op(hour,OP_EQ, 11); + tt_ci_char_op(label_h[0],OP_EQ, 'h'); + tt_int_op(min,OP_EQ, 59); + tt_ci_char_op(label_m[0],OP_EQ, 'm'); /* negative periods > 1 year are reported in days (warn?) */ format_time_interval(dbuf, sizeof(dbuf), -1427014922); - tt_int_op(strnlen(dbuf, DBUF_SIZE),<=, DBUF_SIZE - 1); + tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1); r = tor_sscanf(dbuf, TL_ " " TL_ " " TL_, &day, label_d, &hour, label_h, &min, label_m); - tt_int_op(r,==, 6); - tt_int_op(day,==, 16516); - tt_ci_char_op(label_d[0],==, 'd'); - tt_int_op(hour,==, 9); - tt_ci_char_op(label_h[0],==, 'h'); - tt_int_op(min,==, 2); - tt_ci_char_op(label_m[0],==, 'm'); + tt_int_op(r,OP_EQ, 6); + tt_int_op(day,OP_EQ, 16516); + tt_ci_char_op(label_d[0],OP_EQ, 'd'); + tt_int_op(hour,OP_EQ, 9); + tt_ci_char_op(label_h[0],OP_EQ, 'h'); + tt_int_op(min,OP_EQ, 2); + tt_ci_char_op(label_m[0],OP_EQ, 'm'); #if SIZEOF_LONG == 4 || SIZEOF_LONG == 8 @@ -2656,32 +2529,32 @@ test_util_format_time_interval(void *arg) /* INT32_MAX */ format_time_interval(dbuf, sizeof(dbuf), 2147483647); - tt_int_op(strnlen(dbuf, DBUF_SIZE),<=, DBUF_SIZE - 1); + tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1); r = tor_sscanf(dbuf, TL_ " " TL_ " " TL_, &day, label_d, &hour, label_h, &min, label_m); - tt_int_op(r,==, 6); - tt_int_op(day,==, 24855); - tt_ci_char_op(label_d[0],==, 'd'); - tt_int_op(hour,==, 3); - tt_ci_char_op(label_h[0],==, 'h'); - tt_int_op(min,==, 14); - tt_ci_char_op(label_m[0],==, 'm'); + tt_int_op(r,OP_EQ, 6); + tt_int_op(day,OP_EQ, 24855); + tt_ci_char_op(label_d[0],OP_EQ, 'd'); + tt_int_op(hour,OP_EQ, 3); + tt_ci_char_op(label_h[0],OP_EQ, 'h'); + tt_int_op(min,OP_EQ, 14); + tt_ci_char_op(label_m[0],OP_EQ, 'm'); /* and 7 seconds - ignored */ /* INT32_MIN: check that we get the absolute value of interval, * which doesn't actually fit in int32_t. * We expect INT32_MAX or INT32_MAX + 1 with 64 bit longs */ format_time_interval(dbuf, sizeof(dbuf), -2147483647L - 1L); - tt_int_op(strnlen(dbuf, DBUF_SIZE),<=, DBUF_SIZE - 1); + tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1); r = tor_sscanf(dbuf, TL_ " " TL_ " " TL_, &day, label_d, &hour, label_h, &min, label_m); - tt_int_op(r,==, 6); - tt_int_op(day,==, 24855); - tt_ci_char_op(label_d[0],==, 'd'); - tt_int_op(hour,==, 3); - tt_ci_char_op(label_h[0],==, 'h'); - tt_int_op(min,==, 14); - tt_ci_char_op(label_m[0],==, 'm'); + tt_int_op(r,OP_EQ, 6); + tt_int_op(day,OP_EQ, 24855); + tt_ci_char_op(label_d[0],OP_EQ, 'd'); + tt_int_op(hour,OP_EQ, 3); + tt_ci_char_op(label_h[0],OP_EQ, 'h'); + tt_int_op(min,OP_EQ, 14); + tt_ci_char_op(label_m[0],OP_EQ, 'm'); /* and 7 or 8 seconds - ignored */ #endif @@ -2693,16 +2566,16 @@ test_util_format_time_interval(void *arg) /* INT64_MAX */ format_time_interval(dbuf, sizeof(dbuf), 9223372036854775807L); - tt_int_op(strnlen(dbuf, DBUF_SIZE),<=, DBUF_SIZE - 1); + tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1); r = tor_sscanf(dbuf, TL_ " " TL_ " " TL_, &day, label_d, &hour, label_h, &min, label_m); - tt_int_op(r,==, 6); - tt_int_op(day,==, 106751991167300L); - tt_ci_char_op(label_d[0],==, 'd'); - tt_int_op(hour,==, 15); - tt_ci_char_op(label_h[0],==, 'h'); - tt_int_op(min,==, 30); - tt_ci_char_op(label_m[0],==, 'm'); + tt_int_op(r,OP_EQ, 6); + tt_int_op(day,OP_EQ, 106751991167300L); + tt_ci_char_op(label_d[0],OP_EQ, 'd'); + tt_int_op(hour,OP_EQ, 15); + tt_ci_char_op(label_h[0],OP_EQ, 'h'); + tt_int_op(min,OP_EQ, 30); + tt_ci_char_op(label_m[0],OP_EQ, 'm'); /* and 7 seconds - ignored */ /* INT64_MIN: check that we get the absolute value of interval, @@ -2710,16 +2583,16 @@ test_util_format_time_interval(void *arg) * We expect INT64_MAX */ format_time_interval(dbuf, sizeof(dbuf), -9223372036854775807L - 1L); - tt_int_op(strnlen(dbuf, DBUF_SIZE),<=, DBUF_SIZE - 1); + tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1); r = tor_sscanf(dbuf, TL_ " " TL_ " " TL_, &day, label_d, &hour, label_h, &min, label_m); - tt_int_op(r,==, 6); - tt_int_op(day,==, 106751991167300L); - tt_ci_char_op(label_d[0],==, 'd'); - tt_int_op(hour,==, 15); - tt_ci_char_op(label_h[0],==, 'h'); - tt_int_op(min,==, 30); - tt_ci_char_op(label_m[0],==, 'm'); + tt_int_op(r,OP_EQ, 6); + tt_int_op(day,OP_EQ, 106751991167300L); + tt_ci_char_op(label_d[0],OP_EQ, 'd'); + tt_int_op(hour,OP_EQ, 15); + tt_ci_char_op(label_h[0],OP_EQ, 'h'); + tt_int_op(min,OP_EQ, 30); + tt_ci_char_op(label_m[0],OP_EQ, 'm'); /* and 7 or 8 seconds - ignored */ #endif @@ -2741,30 +2614,30 @@ test_util_path_is_relative(void *arg) { /* OS-independent tests */ (void)arg; - tt_int_op(1,==, path_is_relative("")); - tt_int_op(1,==, path_is_relative("dir")); - tt_int_op(1,==, path_is_relative("dir/")); - tt_int_op(1,==, path_is_relative("./dir")); - tt_int_op(1,==, path_is_relative("../dir")); + tt_int_op(1,OP_EQ, path_is_relative("")); + tt_int_op(1,OP_EQ, path_is_relative("dir")); + tt_int_op(1,OP_EQ, path_is_relative("dir/")); + tt_int_op(1,OP_EQ, path_is_relative("./dir")); + tt_int_op(1,OP_EQ, path_is_relative("../dir")); - tt_int_op(0,==, path_is_relative("/")); - tt_int_op(0,==, path_is_relative("/dir")); - tt_int_op(0,==, path_is_relative("/dir/")); + tt_int_op(0,OP_EQ, path_is_relative("/")); + tt_int_op(0,OP_EQ, path_is_relative("/dir")); + tt_int_op(0,OP_EQ, path_is_relative("/dir/")); /* Windows */ #ifdef _WIN32 /* I don't have Windows so I can't test this, hence the "#ifdef 0". These are tests that look useful, so please try to get them running and uncomment if it all works as it should */ - tt_int_op(1,==, path_is_relative("dir")); - tt_int_op(1,==, path_is_relative("dir\\")); - tt_int_op(1,==, path_is_relative("dir\\a:")); - tt_int_op(1,==, path_is_relative("dir\\a:\\")); - tt_int_op(1,==, path_is_relative("http:\\dir")); - - tt_int_op(0,==, path_is_relative("\\dir")); - tt_int_op(0,==, path_is_relative("a:\\dir")); - tt_int_op(0,==, path_is_relative("z:\\dir")); + tt_int_op(1,OP_EQ, path_is_relative("dir")); + tt_int_op(1,OP_EQ, path_is_relative("dir\\")); + tt_int_op(1,OP_EQ, path_is_relative("dir\\a:")); + tt_int_op(1,OP_EQ, path_is_relative("dir\\a:\\")); + tt_int_op(1,OP_EQ, path_is_relative("http:\\dir")); + + tt_int_op(0,OP_EQ, path_is_relative("\\dir")); + tt_int_op(0,OP_EQ, path_is_relative("a:\\dir")); + tt_int_op(0,OP_EQ, path_is_relative("z:\\dir")); #endif done: @@ -2793,7 +2666,7 @@ test_util_mempool(void *arg) tt_assert(pool); tt_assert(pool->new_chunk_capacity >= 10); tt_assert(pool->item_alloc_size >= sizeof(void*)+241); - tt_int_op(pool->item_alloc_size & 0x03,==, 0); + tt_int_op(pool->item_alloc_size & 0x03,OP_EQ, 0); tt_assert(pool->new_chunk_capacity < 60); allocated = smartlist_new(); @@ -2857,16 +2730,16 @@ test_util_memarea(void *arg) tt_assert(p1+64 <= p2); tt_assert(p2+52 <= p3); /* Make sure we aligned. */ - tt_int_op(((uintptr_t)p1) % sizeof(void*),==, 0); - tt_int_op(((uintptr_t)p2) % sizeof(void*),==, 0); - tt_int_op(((uintptr_t)p3) % sizeof(void*),==, 0); + tt_int_op(((uintptr_t)p1) % sizeof(void*),OP_EQ, 0); + tt_int_op(((uintptr_t)p2) % sizeof(void*),OP_EQ, 0); + tt_int_op(((uintptr_t)p3) % sizeof(void*),OP_EQ, 0); tt_assert(!memarea_owns_ptr(area, p3+8192)); tt_assert(!memarea_owns_ptr(area, p3+30)); tt_assert(tor_mem_is_zero(p2, 52)); /* Make sure we don't overalign. */ p1 = memarea_alloc(area, 1); p2 = memarea_alloc(area, 1); - tt_ptr_op(p1+sizeof(void*),==, p2); + tt_ptr_op(p1+sizeof(void*),OP_EQ, p2); { malloced_ptr = tor_malloc(64); tt_assert(!memarea_owns_ptr(area, malloced_ptr)); @@ -2879,7 +2752,7 @@ test_util_memarea(void *arg) crypto_rand((char*)malloced_ptr, 64); p1 = memarea_memdup(area, malloced_ptr, 64); tt_assert(p1 != malloced_ptr); - tt_mem_op(p1,==, malloced_ptr, 64); + tt_mem_op(p1,OP_EQ, malloced_ptr, 64); tor_free(malloced_ptr); } @@ -2888,8 +2761,8 @@ test_util_memarea(void *arg) p2 = memarea_strdup(area, "abcd"); tt_assert(p1); tt_assert(p2); - tt_str_op(p1,==, ""); - tt_str_op(p2,==, "abcd"); + tt_str_op(p1,OP_EQ, ""); + tt_str_op(p2,OP_EQ, "abcd"); /* memarea_strndup. */ { @@ -2898,20 +2771,20 @@ test_util_memarea(void *arg) size_t len = strlen(s); p1 = memarea_strndup(area, s, 1000); p2 = memarea_strndup(area, s, 10); - tt_str_op(p1,==, s); + tt_str_op(p1,OP_EQ, s); tt_assert(p2 >= p1 + len + 1); - tt_mem_op(s,==, p2, 10); - tt_int_op(p2[10],==, '\0'); + tt_mem_op(s,OP_EQ, p2, 10); + tt_int_op(p2[10],OP_EQ, '\0'); p3 = memarea_strndup(area, s, len); - tt_str_op(p3,==, s); + tt_str_op(p3,OP_EQ, s); p3 = memarea_strndup(area, s, len-1); - tt_mem_op(s,==, p3, len-1); - tt_int_op(p3[len-1],==, '\0'); + tt_mem_op(s,OP_EQ, p3, len-1); + tt_int_op(p3[len-1],OP_EQ, '\0'); } memarea_clear(area); p1 = memarea_alloc(area, 1); - tt_ptr_op(p1,==, p1_orig); + tt_ptr_op(p1,OP_EQ, p1_orig); memarea_clear(area); /* Check for running over an area's size. */ @@ -2944,22 +2817,22 @@ test_util_datadir(void *arg) temp_dir = get_datadir_fname(NULL); f = get_datadir_fname("state"); tor_snprintf(buf, sizeof(buf), "%s"PATH_SEPARATOR"state", temp_dir); - tt_str_op(f,==, buf); + tt_str_op(f,OP_EQ, buf); tor_free(f); f = get_datadir_fname2("cache", "thingy"); tor_snprintf(buf, sizeof(buf), "%s"PATH_SEPARATOR"cache"PATH_SEPARATOR"thingy", temp_dir); - tt_str_op(f,==, buf); + tt_str_op(f,OP_EQ, buf); tor_free(f); f = get_datadir_fname2_suffix("cache", "thingy", ".foo"); tor_snprintf(buf, sizeof(buf), "%s"PATH_SEPARATOR"cache"PATH_SEPARATOR"thingy.foo", temp_dir); - tt_str_op(f,==, buf); + tt_str_op(f,OP_EQ, buf); tor_free(f); f = get_datadir_fname_suffix("cache", ".foo"); tor_snprintf(buf, sizeof(buf), "%s"PATH_SEPARATOR"cache.foo", temp_dir); - tt_str_op(f,==, buf); + tt_str_op(f,OP_EQ, buf); done: tor_free(f); @@ -3000,43 +2873,43 @@ test_util_strtok(void *arg) "%sthey.seemed;;their!.own;most.perfect;monument%s",pad2,pad2); /* -- "Year's End", Richard Wilbur */ - tt_str_op("Graved",==, tor_strtok_r_impl(buf, " ", &cp1)); - tt_str_op("they",==, tor_strtok_r_impl(buf2, ".!..;!", &cp2)); + tt_str_op("Graved",OP_EQ, tor_strtok_r_impl(buf, " ", &cp1)); + tt_str_op("they",OP_EQ, tor_strtok_r_impl(buf2, ".!..;!", &cp2)); #define S1() tor_strtok_r_impl(NULL, " ", &cp1) #define S2() tor_strtok_r_impl(NULL, ".!..;!", &cp2) - tt_str_op("on",==, S1()); - tt_str_op("the",==, S1()); - tt_str_op("dark",==, S1()); - tt_str_op("seemed",==, S2()); - tt_str_op("their",==, S2()); - tt_str_op("own",==, S2()); - tt_str_op("in",==, S1()); - tt_str_op("gestures",==, S1()); - tt_str_op("of",==, S1()); - tt_str_op("most",==, S2()); - tt_str_op("perfect",==, S2()); - tt_str_op("descent",==, S1()); - tt_str_op("monument",==, S2()); - tt_ptr_op(NULL,==, S1()); - tt_ptr_op(NULL,==, S2()); + tt_str_op("on",OP_EQ, S1()); + tt_str_op("the",OP_EQ, S1()); + tt_str_op("dark",OP_EQ, S1()); + tt_str_op("seemed",OP_EQ, S2()); + tt_str_op("their",OP_EQ, S2()); + tt_str_op("own",OP_EQ, S2()); + tt_str_op("in",OP_EQ, S1()); + tt_str_op("gestures",OP_EQ, S1()); + tt_str_op("of",OP_EQ, S1()); + tt_str_op("most",OP_EQ, S2()); + tt_str_op("perfect",OP_EQ, S2()); + tt_str_op("descent",OP_EQ, S1()); + tt_str_op("monument",OP_EQ, S2()); + tt_ptr_op(NULL,OP_EQ, S1()); + tt_ptr_op(NULL,OP_EQ, S2()); } buf[0] = 0; - tt_ptr_op(NULL,==, tor_strtok_r_impl(buf, " ", &cp1)); - tt_ptr_op(NULL,==, tor_strtok_r_impl(buf, "!", &cp1)); + tt_ptr_op(NULL,OP_EQ, tor_strtok_r_impl(buf, " ", &cp1)); + tt_ptr_op(NULL,OP_EQ, tor_strtok_r_impl(buf, "!", &cp1)); strlcpy(buf, "Howdy!", sizeof(buf)); - tt_str_op("Howdy",==, tor_strtok_r_impl(buf, "!", &cp1)); - tt_ptr_op(NULL,==, tor_strtok_r_impl(NULL, "!", &cp1)); + tt_str_op("Howdy",OP_EQ, tor_strtok_r_impl(buf, "!", &cp1)); + tt_ptr_op(NULL,OP_EQ, tor_strtok_r_impl(NULL, "!", &cp1)); strlcpy(buf, " ", sizeof(buf)); - tt_ptr_op(NULL,==, tor_strtok_r_impl(buf, " ", &cp1)); + tt_ptr_op(NULL,OP_EQ, tor_strtok_r_impl(buf, " ", &cp1)); strlcpy(buf, " ", sizeof(buf)); - tt_ptr_op(NULL,==, tor_strtok_r_impl(buf, " ", &cp1)); + tt_ptr_op(NULL,OP_EQ, tor_strtok_r_impl(buf, " ", &cp1)); strlcpy(buf, "something ", sizeof(buf)); - tt_str_op("something",==, tor_strtok_r_impl(buf, " ", &cp1)); - tt_ptr_op(NULL,==, tor_strtok_r_impl(NULL, ";", &cp1)); + tt_str_op("something",OP_EQ, tor_strtok_r_impl(buf, " ", &cp1)); + tt_ptr_op(NULL,OP_EQ, tor_strtok_r_impl(NULL, ";", &cp1)); done: ; } @@ -3056,24 +2929,26 @@ test_util_find_str_at_start_of_line(void *ptr) (void)ptr; - tt_ptr_op(long_string,==, find_str_at_start_of_line(long_string, "")); - tt_ptr_op(NULL,==, find_str_at_start_of_line(short_string, "nonsense")); - tt_ptr_op(NULL,==, find_str_at_start_of_line(long_string, "nonsense")); - tt_ptr_op(NULL,==, find_str_at_start_of_line(long_string, "\n")); - tt_ptr_op(NULL,==, find_str_at_start_of_line(long_string, "how ")); - tt_ptr_op(NULL,==, find_str_at_start_of_line(long_string, "kitty")); - tt_ptr_op(long_string,==, find_str_at_start_of_line(long_string, "h")); - tt_ptr_op(long_string,==, find_str_at_start_of_line(long_string, "how")); - tt_ptr_op(line2,==, find_str_at_start_of_line(long_string, "he")); - tt_ptr_op(line2,==, find_str_at_start_of_line(long_string, "hell")); - tt_ptr_op(line2,==, find_str_at_start_of_line(long_string, "hello k")); - tt_ptr_op(line2,==, find_str_at_start_of_line(long_string, "hello kitty\n")); - tt_ptr_op(line2,==, + tt_ptr_op(long_string,OP_EQ, find_str_at_start_of_line(long_string, "")); + tt_ptr_op(NULL,OP_EQ, find_str_at_start_of_line(short_string, "nonsense")); + tt_ptr_op(NULL,OP_EQ, find_str_at_start_of_line(long_string, "nonsense")); + tt_ptr_op(NULL,OP_EQ, find_str_at_start_of_line(long_string, "\n")); + tt_ptr_op(NULL,OP_EQ, find_str_at_start_of_line(long_string, "how ")); + tt_ptr_op(NULL,OP_EQ, find_str_at_start_of_line(long_string, "kitty")); + tt_ptr_op(long_string,OP_EQ, find_str_at_start_of_line(long_string, "h")); + tt_ptr_op(long_string,OP_EQ, find_str_at_start_of_line(long_string, "how")); + tt_ptr_op(line2,OP_EQ, find_str_at_start_of_line(long_string, "he")); + tt_ptr_op(line2,OP_EQ, find_str_at_start_of_line(long_string, "hell")); + tt_ptr_op(line2,OP_EQ, find_str_at_start_of_line(long_string, "hello k")); + tt_ptr_op(line2,OP_EQ, + find_str_at_start_of_line(long_string, "hello kitty\n")); + tt_ptr_op(line2,OP_EQ, find_str_at_start_of_line(long_string, "hello kitty\nt")); - tt_ptr_op(line3,==, find_str_at_start_of_line(long_string, "third")); - tt_ptr_op(line3,==, find_str_at_start_of_line(long_string, "third line")); - tt_ptr_op(NULL,==, find_str_at_start_of_line(long_string, "third line\n")); - tt_ptr_op(short_line2,==, find_str_at_start_of_line(short_string, + tt_ptr_op(line3,OP_EQ, find_str_at_start_of_line(long_string, "third")); + tt_ptr_op(line3,OP_EQ, find_str_at_start_of_line(long_string, "third line")); + tt_ptr_op(NULL, OP_EQ, + find_str_at_start_of_line(long_string, "third line\n")); + tt_ptr_op(short_line2,OP_EQ, find_str_at_start_of_line(short_string, "second line\n")); done: ; @@ -3084,25 +2959,25 @@ test_util_string_is_C_identifier(void *ptr) { (void)ptr; - tt_int_op(1,==, string_is_C_identifier("string_is_C_identifier")); - tt_int_op(1,==, string_is_C_identifier("_string_is_C_identifier")); - tt_int_op(1,==, string_is_C_identifier("_")); - tt_int_op(1,==, string_is_C_identifier("i")); - tt_int_op(1,==, string_is_C_identifier("_____")); - tt_int_op(1,==, string_is_C_identifier("__00__")); - tt_int_op(1,==, string_is_C_identifier("__init__")); - tt_int_op(1,==, string_is_C_identifier("_0")); - tt_int_op(1,==, string_is_C_identifier("_0string_is_C_identifier")); - tt_int_op(1,==, string_is_C_identifier("_0")); - - tt_int_op(0,==, string_is_C_identifier("0_string_is_C_identifier")); - tt_int_op(0,==, string_is_C_identifier("0")); - tt_int_op(0,==, string_is_C_identifier("")); - tt_int_op(0,==, string_is_C_identifier(";")); - tt_int_op(0,==, string_is_C_identifier("i;")); - tt_int_op(0,==, string_is_C_identifier("_;")); - tt_int_op(0,==, string_is_C_identifier("Ã")); - tt_int_op(0,==, string_is_C_identifier("ñ")); + tt_int_op(1,OP_EQ, string_is_C_identifier("string_is_C_identifier")); + tt_int_op(1,OP_EQ, string_is_C_identifier("_string_is_C_identifier")); + tt_int_op(1,OP_EQ, string_is_C_identifier("_")); + tt_int_op(1,OP_EQ, string_is_C_identifier("i")); + tt_int_op(1,OP_EQ, string_is_C_identifier("_____")); + tt_int_op(1,OP_EQ, string_is_C_identifier("__00__")); + tt_int_op(1,OP_EQ, string_is_C_identifier("__init__")); + tt_int_op(1,OP_EQ, string_is_C_identifier("_0")); + tt_int_op(1,OP_EQ, string_is_C_identifier("_0string_is_C_identifier")); + tt_int_op(1,OP_EQ, string_is_C_identifier("_0")); + + tt_int_op(0,OP_EQ, string_is_C_identifier("0_string_is_C_identifier")); + tt_int_op(0,OP_EQ, string_is_C_identifier("0")); + tt_int_op(0,OP_EQ, string_is_C_identifier("")); + tt_int_op(0,OP_EQ, string_is_C_identifier(";")); + tt_int_op(0,OP_EQ, string_is_C_identifier("i;")); + tt_int_op(0,OP_EQ, string_is_C_identifier("_;")); + tt_int_op(0,OP_EQ, string_is_C_identifier("Ã")); + tt_int_op(0,OP_EQ, string_is_C_identifier("ñ")); done: ; @@ -3120,29 +2995,29 @@ test_util_asprintf(void *ptr) /* simple string */ r = tor_asprintf(&cp, "simple string 100%% safe"); tt_assert(cp); - tt_str_op("simple string 100% safe",==, cp); - tt_int_op(strlen(cp),==, r); + tt_str_op("simple string 100% safe",OP_EQ, cp); + tt_int_op(strlen(cp),OP_EQ, r); tor_free(cp); /* empty string */ r = tor_asprintf(&cp, "%s", ""); tt_assert(cp); - tt_str_op("",==, cp); - tt_int_op(strlen(cp),==, r); + tt_str_op("",OP_EQ, cp); + tt_int_op(strlen(cp),OP_EQ, r); tor_free(cp); /* numbers (%i) */ r = tor_asprintf(&cp, "I like numbers-%2i, %i, etc.", -1, 2); tt_assert(cp); - tt_str_op("I like numbers--1, 2, etc.",==, cp); - tt_int_op(strlen(cp),==, r); + tt_str_op("I like numbers--1, 2, etc.",OP_EQ, cp); + tt_int_op(strlen(cp),OP_EQ, r); /* don't free cp; next test uses it. */ /* numbers (%d) */ r = tor_asprintf(&cp2, "First=%d, Second=%d", 101, 202); tt_assert(cp2); - tt_int_op(strlen(cp2),==, r); - tt_str_op("First=101, Second=202",==, cp2); + tt_int_op(strlen(cp2),OP_EQ, r); + tt_str_op("First=101, Second=202",OP_EQ, cp2); tt_assert(cp != cp2); tor_free(cp); tor_free(cp2); @@ -3150,17 +3025,17 @@ test_util_asprintf(void *ptr) /* Glass-box test: a string exactly 128 characters long. */ r = tor_asprintf(&cp, "Lorem1: %sLorem2: %s", LOREMIPSUM, LOREMIPSUM); tt_assert(cp); - tt_int_op(128,==, r); - tt_int_op(cp[128], ==, '\0'); - tt_str_op("Lorem1: "LOREMIPSUM"Lorem2: "LOREMIPSUM,==, cp); + tt_int_op(128,OP_EQ, r); + tt_int_op(cp[128], OP_EQ, '\0'); + tt_str_op("Lorem1: "LOREMIPSUM"Lorem2: "LOREMIPSUM,OP_EQ, cp); tor_free(cp); /* String longer than 128 characters */ r = tor_asprintf(&cp, "1: %s 2: %s 3: %s", LOREMIPSUM, LOREMIPSUM, LOREMIPSUM); tt_assert(cp); - tt_int_op(strlen(cp),==, r); - tt_str_op("1: "LOREMIPSUM" 2: "LOREMIPSUM" 3: "LOREMIPSUM,==, cp); + tt_int_op(strlen(cp),OP_EQ, r); + tt_str_op("1: "LOREMIPSUM" 2: "LOREMIPSUM" 3: "LOREMIPSUM,OP_EQ, cp); done: tor_free(cp); @@ -3181,9 +3056,9 @@ test_util_listdir(void *ptr) dir1 = tor_strdup(get_fname("some-directory")); dirname = tor_strdup(get_fname(NULL)); - tt_int_op(0,==, write_str_to_file(fname1, "X\n", 0)); - tt_int_op(0,==, write_str_to_file(fname2, "Y\n", 0)); - tt_int_op(0,==, write_str_to_file(fname3, "Z\n", 0)); + tt_int_op(0,OP_EQ, write_str_to_file(fname1, "X\n", 0)); + tt_int_op(0,OP_EQ, write_str_to_file(fname2, "Y\n", 0)); + tt_int_op(0,OP_EQ, write_str_to_file(fname3, "Z\n", 0)); #ifdef _WIN32 r = mkdir(dir1); #else @@ -3229,9 +3104,9 @@ test_util_parent_dir(void *ptr) int ok; \ cp = tor_strdup(input); \ ok = get_parent_directory(cp); \ - tt_int_op(expect_ok, ==, ok); \ + tt_int_op(expect_ok, OP_EQ, ok); \ if (ok==0) \ - tt_str_op(output, ==, cp); \ + tt_str_op(output, OP_EQ, cp); \ tor_free(cp); \ } while (0); @@ -3280,32 +3155,32 @@ test_util_ftruncate(void *ptr) fname = get_fname("ftruncate"); fd = tor_open_cloexec(fname, O_WRONLY|O_CREAT, 0600); - tt_int_op(fd, >=, 0); + tt_int_op(fd, OP_GE, 0); /* Make the file be there. */ - tt_int_op(strlen(message), ==, write_all(fd, message, strlen(message), 0)); - tt_int_op((int)tor_fd_getpos(fd), ==, strlen(message)); - tt_int_op(0, ==, fstat(fd, &st)); - tt_int_op((int)st.st_size, ==, strlen(message)); + tt_int_op(strlen(message), OP_EQ, write_all(fd, message, strlen(message),0)); + tt_int_op((int)tor_fd_getpos(fd), OP_EQ, strlen(message)); + tt_int_op(0, OP_EQ, fstat(fd, &st)); + tt_int_op((int)st.st_size, OP_EQ, strlen(message)); /* Truncate and see if it got truncated */ - tt_int_op(0, ==, tor_ftruncate(fd)); - tt_int_op((int)tor_fd_getpos(fd), ==, 0); - tt_int_op(0, ==, fstat(fd, &st)); - tt_int_op((int)st.st_size, ==, 0); + tt_int_op(0, OP_EQ, tor_ftruncate(fd)); + tt_int_op((int)tor_fd_getpos(fd), OP_EQ, 0); + tt_int_op(0, OP_EQ, fstat(fd, &st)); + tt_int_op((int)st.st_size, OP_EQ, 0); /* Replace, and see if it got replaced */ - tt_int_op(strlen(message2), ==, + tt_int_op(strlen(message2), OP_EQ, write_all(fd, message2, strlen(message2), 0)); - tt_int_op((int)tor_fd_getpos(fd), ==, strlen(message2)); - tt_int_op(0, ==, fstat(fd, &st)); - tt_int_op((int)st.st_size, ==, strlen(message2)); + tt_int_op((int)tor_fd_getpos(fd), OP_EQ, strlen(message2)); + tt_int_op(0, OP_EQ, fstat(fd, &st)); + tt_int_op((int)st.st_size, OP_EQ, strlen(message2)); close(fd); fd = -1; buf = read_file_to_str(fname, 0, NULL); - tt_str_op(message2, ==, buf); + tt_str_op(message2, OP_EQ, buf); done: if (fd >= 0) @@ -3344,53 +3219,53 @@ test_util_exit_status(void *ptr) (void)ptr; clear_hex_errno(hex_errno); - tt_str_op("",==, hex_errno); + tt_str_op("",OP_EQ, hex_errno); clear_hex_errno(hex_errno); n = format_helper_exit_status(0, 0, hex_errno); - tt_str_op("0/0\n",==, hex_errno); - tt_int_op(n,==, strlen(hex_errno)); + tt_str_op("0/0\n",OP_EQ, hex_errno); + tt_int_op(n,OP_EQ, strlen(hex_errno)); #if SIZEOF_INT == 4 clear_hex_errno(hex_errno); n = format_helper_exit_status(0, 0x7FFFFFFF, hex_errno); - tt_str_op("0/7FFFFFFF\n",==, hex_errno); - tt_int_op(n,==, strlen(hex_errno)); + tt_str_op("0/7FFFFFFF\n",OP_EQ, hex_errno); + tt_int_op(n,OP_EQ, strlen(hex_errno)); clear_hex_errno(hex_errno); n = format_helper_exit_status(0xFF, -0x80000000, hex_errno); - tt_str_op("FF/-80000000\n",==, hex_errno); - tt_int_op(n,==, strlen(hex_errno)); - tt_int_op(n,==, HEX_ERRNO_SIZE); + tt_str_op("FF/-80000000\n",OP_EQ, hex_errno); + tt_int_op(n,OP_EQ, strlen(hex_errno)); + tt_int_op(n,OP_EQ, HEX_ERRNO_SIZE); #elif SIZEOF_INT == 8 clear_hex_errno(hex_errno); n = format_helper_exit_status(0, 0x7FFFFFFFFFFFFFFF, hex_errno); - tt_str_op("0/7FFFFFFFFFFFFFFF\n",==, hex_errno); - tt_int_op(n,==, strlen(hex_errno)); + tt_str_op("0/7FFFFFFFFFFFFFFF\n",OP_EQ, hex_errno); + tt_int_op(n,OP_EQ, strlen(hex_errno)); clear_hex_errno(hex_errno); n = format_helper_exit_status(0xFF, -0x8000000000000000, hex_errno); - tt_str_op("FF/-8000000000000000\n",==, hex_errno); - tt_int_op(n,==, strlen(hex_errno)); - tt_int_op(n,==, HEX_ERRNO_SIZE); + tt_str_op("FF/-8000000000000000\n",OP_EQ, hex_errno); + tt_int_op(n,OP_EQ, strlen(hex_errno)); + tt_int_op(n,OP_EQ, HEX_ERRNO_SIZE); #endif clear_hex_errno(hex_errno); n = format_helper_exit_status(0x7F, 0, hex_errno); - tt_str_op("7F/0\n",==, hex_errno); - tt_int_op(n,==, strlen(hex_errno)); + tt_str_op("7F/0\n",OP_EQ, hex_errno); + tt_int_op(n,OP_EQ, strlen(hex_errno)); clear_hex_errno(hex_errno); n = format_helper_exit_status(0x08, -0x242, hex_errno); - tt_str_op("8/-242\n",==, hex_errno); - tt_int_op(n,==, strlen(hex_errno)); + tt_str_op("8/-242\n",OP_EQ, hex_errno); + tt_int_op(n,OP_EQ, strlen(hex_errno)); clear_hex_errno(hex_errno); - tt_str_op("",==, hex_errno); + tt_str_op("",OP_EQ, hex_errno); done: ; @@ -3417,83 +3292,83 @@ test_util_fgets_eagain(void *ptr) /* Set up a pipe to test on */ retval = pipe(test_pipe); - tt_int_op(retval, ==, 0); + tt_int_op(retval, OP_EQ, 0); /* Set up the read-end to be non-blocking */ retval = fcntl(test_pipe[0], F_SETFL, O_NONBLOCK); - tt_int_op(retval, ==, 0); + tt_int_op(retval, OP_EQ, 0); /* Open it as a stdio stream */ test_stream = fdopen(test_pipe[0], "r"); - tt_ptr_op(test_stream, !=, NULL); + tt_ptr_op(test_stream, OP_NE, NULL); /* Send in a partial line */ retlen = write(test_pipe[1], "A", 1); - tt_int_op(retlen, ==, 1); + tt_int_op(retlen, OP_EQ, 1); retptr = fgets(buf, sizeof(buf), test_stream); - tt_int_op(errno, ==, EAGAIN); - tt_ptr_op(retptr, ==, buf); - tt_str_op(buf, ==, "A"); + tt_int_op(errno, OP_EQ, EAGAIN); + tt_ptr_op(retptr, OP_EQ, buf); + tt_str_op(buf, OP_EQ, "A"); errno = 0; /* Send in the rest */ retlen = write(test_pipe[1], "B\n", 2); - tt_int_op(retlen, ==, 2); + tt_int_op(retlen, OP_EQ, 2); retptr = fgets(buf, sizeof(buf), test_stream); - tt_int_op(errno, ==, 0); - tt_ptr_op(retptr, ==, buf); - tt_str_op(buf, ==, "B\n"); + tt_int_op(errno, OP_EQ, 0); + tt_ptr_op(retptr, OP_EQ, buf); + tt_str_op(buf, OP_EQ, "B\n"); errno = 0; /* Send in a full line */ retlen = write(test_pipe[1], "CD\n", 3); - tt_int_op(retlen, ==, 3); + tt_int_op(retlen, OP_EQ, 3); retptr = fgets(buf, sizeof(buf), test_stream); - tt_int_op(errno, ==, 0); - tt_ptr_op(retptr, ==, buf); - tt_str_op(buf, ==, "CD\n"); + tt_int_op(errno, OP_EQ, 0); + tt_ptr_op(retptr, OP_EQ, buf); + tt_str_op(buf, OP_EQ, "CD\n"); errno = 0; /* Send in a partial line */ retlen = write(test_pipe[1], "E", 1); - tt_int_op(retlen, ==, 1); + tt_int_op(retlen, OP_EQ, 1); retptr = fgets(buf, sizeof(buf), test_stream); - tt_int_op(errno, ==, EAGAIN); - tt_ptr_op(retptr, ==, buf); - tt_str_op(buf, ==, "E"); + tt_int_op(errno, OP_EQ, EAGAIN); + tt_ptr_op(retptr, OP_EQ, buf); + tt_str_op(buf, OP_EQ, "E"); errno = 0; /* Send in the rest */ retlen = write(test_pipe[1], "F\n", 2); - tt_int_op(retlen, ==, 2); + tt_int_op(retlen, OP_EQ, 2); retptr = fgets(buf, sizeof(buf), test_stream); - tt_int_op(errno, ==, 0); - tt_ptr_op(retptr, ==, buf); - tt_str_op(buf, ==, "F\n"); + tt_int_op(errno, OP_EQ, 0); + tt_ptr_op(retptr, OP_EQ, buf); + tt_str_op(buf, OP_EQ, "F\n"); errno = 0; /* Send in a full line and close */ retlen = write(test_pipe[1], "GH", 2); - tt_int_op(retlen, ==, 2); + tt_int_op(retlen, OP_EQ, 2); retval = close(test_pipe[1]); - tt_int_op(retval, ==, 0); + tt_int_op(retval, OP_EQ, 0); test_pipe[1] = -1; retptr = fgets(buf, sizeof(buf), test_stream); - tt_int_op(errno, ==, 0); - tt_ptr_op(retptr, ==, buf); - tt_str_op(buf, ==, "GH"); + tt_int_op(errno, OP_EQ, 0); + tt_ptr_op(retptr, OP_EQ, buf); + tt_str_op(buf, OP_EQ, "GH"); errno = 0; /* Check for EOF */ retptr = fgets(buf, sizeof(buf), test_stream); - tt_int_op(errno, ==, 0); - tt_ptr_op(retptr, ==, NULL); + tt_int_op(errno, OP_EQ, 0); + tt_ptr_op(retptr, OP_EQ, NULL); retval = feof(test_stream); - tt_int_op(retval, !=, 0); + tt_int_op(retval, OP_NE, 0); errno = 0; /* Check that buf is unchanged according to C99 and C11 */ - tt_str_op(buf, ==, "GH"); + tt_str_op(buf, OP_EQ, "GH"); done: if (test_stream != NULL) @@ -3505,370 +3380,6 @@ test_util_fgets_eagain(void *ptr) } #endif -#ifndef BUILDDIR -#define BUILDDIR "." -#endif - -#ifdef _WIN32 -#define notify_pending_waitpid_callbacks() STMT_NIL -#define TEST_CHILD "test-child.exe" -#define EOL "\r\n" -#else -#define TEST_CHILD (BUILDDIR "/src/test/test-child") -#define EOL "\n" -#endif - -#ifdef _WIN32 -/* I've assumed Windows doesn't have the gap between fork and exec - * that causes the race condition on unix-like platforms */ -#define MATCH_PROCESS_STATUS(s1,s2) ((s1) == (s2)) - -#else -/* work around a race condition of the timing of SIGCHLD handler updates - * to the process_handle's fields, and checks of those fields - * - * TODO: Once we can signal failure to exec, change PROCESS_STATUS_RUNNING to - * PROCESS_STATUS_ERROR (and similarly with *_OR_NOTRUNNING) */ -#define PROCESS_STATUS_RUNNING_OR_NOTRUNNING (PROCESS_STATUS_RUNNING+1) -#define IS_RUNNING_OR_NOTRUNNING(s) \ - ((s) == PROCESS_STATUS_RUNNING || (s) == PROCESS_STATUS_NOTRUNNING) -/* well, this is ugly */ -#define MATCH_PROCESS_STATUS(s1,s2) \ - ( (s1) == (s2) \ - ||((s1) == PROCESS_STATUS_RUNNING_OR_NOTRUNNING \ - && IS_RUNNING_OR_NOTRUNNING(s2)) \ - ||((s2) == PROCESS_STATUS_RUNNING_OR_NOTRUNNING \ - && IS_RUNNING_OR_NOTRUNNING(s1))) - -#endif // _WIN32 - -/** Helper function for testing tor_spawn_background */ -static void -run_util_spawn_background(const char *argv[], const char *expected_out, - const char *expected_err, int expected_exit, - int expected_status) -{ - int retval, exit_code; - ssize_t pos; - process_handle_t *process_handle=NULL; - char stdout_buf[100], stderr_buf[100]; - int status; - - /* Start the program */ -#ifdef _WIN32 - status = tor_spawn_background(NULL, argv, NULL, &process_handle); -#else - status = tor_spawn_background(argv[0], argv, NULL, &process_handle); -#endif - - notify_pending_waitpid_callbacks(); - - /* the race condition doesn't affect status, - * because status isn't updated by the SIGCHLD handler, - * but we still need to handle PROCESS_STATUS_RUNNING_OR_NOTRUNNING */ - tt_assert(MATCH_PROCESS_STATUS(expected_status, status)); - if (status == PROCESS_STATUS_ERROR) { - tt_ptr_op(process_handle, ==, NULL); - return; - } - - tt_assert(process_handle != NULL); - - /* When a spawned process forks, fails, then exits very quickly, - * (this typically occurs when exec fails) - * there is a race condition between the SIGCHLD handler - * updating the process_handle's fields, and this test - * checking the process status in those fields. - * The SIGCHLD update can occur before or after the code below executes. - * This causes intermittent failures in spawn_background_fail(), - * typically when the machine is under load. - * We use PROCESS_STATUS_RUNNING_OR_NOTRUNNING to avoid this issue. */ - - /* the race condition affects the change in - * process_handle->status from RUNNING to NOTRUNNING */ - tt_assert(MATCH_PROCESS_STATUS(expected_status, process_handle->status)); - -#ifndef _WIN32 - notify_pending_waitpid_callbacks(); - /* the race condition affects the change in - * process_handle->waitpid_cb to NULL, - * so we skip the check if expected_status is ambiguous, - * that is, PROCESS_STATUS_RUNNING_OR_NOTRUNNING */ - tt_assert(process_handle->waitpid_cb != NULL - || expected_status == PROCESS_STATUS_RUNNING_OR_NOTRUNNING); -#endif - -#ifdef _WIN32 - tt_assert(process_handle->stdout_pipe != INVALID_HANDLE_VALUE); - tt_assert(process_handle->stderr_pipe != INVALID_HANDLE_VALUE); -#else - tt_assert(process_handle->stdout_pipe >= 0); - tt_assert(process_handle->stderr_pipe >= 0); -#endif - - /* Check stdout */ - pos = tor_read_all_from_process_stdout(process_handle, stdout_buf, - sizeof(stdout_buf) - 1); - tt_assert(pos >= 0); - stdout_buf[pos] = '\0'; - tt_int_op(strlen(expected_out),==, pos); - tt_str_op(expected_out,==, stdout_buf); - - notify_pending_waitpid_callbacks(); - - /* Check it terminated correctly */ - retval = tor_get_exit_code(process_handle, 1, &exit_code); - tt_int_op(PROCESS_EXIT_EXITED,==, retval); - tt_int_op(expected_exit,==, exit_code); - // TODO: Make test-child exit with something other than 0 - -#ifndef _WIN32 - notify_pending_waitpid_callbacks(); - tt_ptr_op(process_handle->waitpid_cb, ==, NULL); -#endif - - /* Check stderr */ - pos = tor_read_all_from_process_stderr(process_handle, stderr_buf, - sizeof(stderr_buf) - 1); - tt_assert(pos >= 0); - stderr_buf[pos] = '\0'; - tt_str_op(expected_err,==, stderr_buf); - tt_int_op(strlen(expected_err),==, pos); - - notify_pending_waitpid_callbacks(); - - done: - if (process_handle) - tor_process_handle_destroy(process_handle, 1); -} - -/** Check that we can launch a process and read the output */ -static void -test_util_spawn_background_ok(void *ptr) -{ - const char *argv[] = {TEST_CHILD, "--test", NULL}; - const char *expected_out = "OUT"EOL "--test"EOL "SLEEPING"EOL "DONE" EOL; - const char *expected_err = "ERR"EOL; - - (void)ptr; - - run_util_spawn_background(argv, expected_out, expected_err, 0, - PROCESS_STATUS_RUNNING); -} - -/** Check that failing to find the executable works as expected */ -static void -test_util_spawn_background_fail(void *ptr) -{ - const char *argv[] = {BUILDDIR "/src/test/no-such-file", "--test", NULL}; - const char *expected_err = ""; - char expected_out[1024]; - char code[32]; -#ifdef _WIN32 - const int expected_status = PROCESS_STATUS_ERROR; -#else - /* TODO: Once we can signal failure to exec, set this to be - * PROCESS_STATUS_RUNNING_OR_ERROR */ - const int expected_status = PROCESS_STATUS_RUNNING_OR_NOTRUNNING; -#endif - - memset(expected_out, 0xf0, sizeof(expected_out)); - memset(code, 0xf0, sizeof(code)); - - (void)ptr; - - tor_snprintf(code, sizeof(code), "%x/%x", - 9 /* CHILD_STATE_FAILEXEC */ , ENOENT); - tor_snprintf(expected_out, sizeof(expected_out), - "ERR: Failed to spawn background process - code %s\n", code); - - run_util_spawn_background(argv, expected_out, expected_err, 255, - expected_status); -} - -/** Test that reading from a handle returns a partial read rather than - * blocking */ -static void -test_util_spawn_background_partial_read_impl(int exit_early) -{ - const int expected_exit = 0; - const int expected_status = PROCESS_STATUS_RUNNING; - - int retval, exit_code; - ssize_t pos = -1; - process_handle_t *process_handle=NULL; - int status; - char stdout_buf[100], stderr_buf[100]; - - const char *argv[] = {TEST_CHILD, "--test", NULL}; - const char *expected_out[] = { "OUT" EOL "--test" EOL "SLEEPING" EOL, - "DONE" EOL, - NULL }; - const char *expected_err = "ERR" EOL; - -#ifndef _WIN32 - int eof = 0; -#endif - int expected_out_ctr; - - if (exit_early) { - argv[1] = "--hang"; - expected_out[0] = "OUT"EOL "--hang"EOL "SLEEPING" EOL; - } - - /* Start the program */ -#ifdef _WIN32 - status = tor_spawn_background(NULL, argv, NULL, &process_handle); -#else - status = tor_spawn_background(argv[0], argv, NULL, &process_handle); -#endif - tt_int_op(expected_status,==, status); - tt_assert(process_handle); - tt_int_op(expected_status,==, process_handle->status); - - /* Check stdout */ - for (expected_out_ctr = 0; expected_out[expected_out_ctr] != NULL;) { -#ifdef _WIN32 - pos = tor_read_all_handle(process_handle->stdout_pipe, stdout_buf, - sizeof(stdout_buf) - 1, NULL); -#else - /* Check that we didn't read the end of file last time */ - tt_assert(!eof); - pos = tor_read_all_handle(process_handle->stdout_handle, stdout_buf, - sizeof(stdout_buf) - 1, NULL, &eof); -#endif - log_info(LD_GENERAL, "tor_read_all_handle() returned %d", (int)pos); - - /* We would have blocked, keep on trying */ - if (0 == pos) - continue; - - tt_assert(pos > 0); - stdout_buf[pos] = '\0'; - tt_str_op(expected_out[expected_out_ctr],==, stdout_buf); - tt_int_op(strlen(expected_out[expected_out_ctr]),==, pos); - expected_out_ctr++; - } - - if (exit_early) { - tor_process_handle_destroy(process_handle, 1); - process_handle = NULL; - goto done; - } - - /* The process should have exited without writing more */ -#ifdef _WIN32 - pos = tor_read_all_handle(process_handle->stdout_pipe, stdout_buf, - sizeof(stdout_buf) - 1, - process_handle); - tt_int_op(0,==, pos); -#else - if (!eof) { - /* We should have got all the data, but maybe not the EOF flag */ - pos = tor_read_all_handle(process_handle->stdout_handle, stdout_buf, - sizeof(stdout_buf) - 1, - process_handle, &eof); - tt_int_op(0,==, pos); - tt_assert(eof); - } - /* Otherwise, we got the EOF on the last read */ -#endif - - /* Check it terminated correctly */ - retval = tor_get_exit_code(process_handle, 1, &exit_code); - tt_int_op(PROCESS_EXIT_EXITED,==, retval); - tt_int_op(expected_exit,==, exit_code); - - // TODO: Make test-child exit with something other than 0 - - /* Check stderr */ - pos = tor_read_all_from_process_stderr(process_handle, stderr_buf, - sizeof(stderr_buf) - 1); - tt_assert(pos >= 0); - stderr_buf[pos] = '\0'; - tt_str_op(expected_err,==, stderr_buf); - tt_int_op(strlen(expected_err),==, pos); - - done: - tor_process_handle_destroy(process_handle, 1); -} - -static void -test_util_spawn_background_partial_read(void *arg) -{ - (void)arg; - test_util_spawn_background_partial_read_impl(0); -} - -static void -test_util_spawn_background_exit_early(void *arg) -{ - (void)arg; - test_util_spawn_background_partial_read_impl(1); -} - -static void -test_util_spawn_background_waitpid_notify(void *arg) -{ - int retval, exit_code; - process_handle_t *process_handle=NULL; - int status; - int ms_timer; - - const char *argv[] = {TEST_CHILD, "--fast", NULL}; - - (void) arg; - -#ifdef _WIN32 - status = tor_spawn_background(NULL, argv, NULL, &process_handle); -#else - status = tor_spawn_background(argv[0], argv, NULL, &process_handle); -#endif - - tt_int_op(status, ==, PROCESS_STATUS_RUNNING); - tt_ptr_op(process_handle, !=, NULL); - - /* We're not going to look at the stdout/stderr output this time. Instead, - * we're testing whether notify_pending_waitpid_calbacks() can report the - * process exit (on unix) and/or whether tor_get_exit_code() can notice it - * (on windows) */ - -#ifndef _WIN32 - ms_timer = 30*1000; - tt_ptr_op(process_handle->waitpid_cb, !=, NULL); - while (process_handle->waitpid_cb && ms_timer > 0) { - tor_sleep_msec(100); - ms_timer -= 100; - notify_pending_waitpid_callbacks(); - } - tt_int_op(ms_timer, >, 0); - tt_ptr_op(process_handle->waitpid_cb, ==, NULL); -#endif - - ms_timer = 30*1000; - while (((retval = tor_get_exit_code(process_handle, 0, &exit_code)) - == PROCESS_EXIT_RUNNING) && ms_timer > 0) { - tor_sleep_msec(100); - ms_timer -= 100; - } - tt_int_op(ms_timer, >, 0); - - tt_int_op(retval, ==, PROCESS_EXIT_EXITED); - - done: - tor_process_handle_destroy(process_handle, 1); -} - -#undef TEST_CHILD -#undef EOL - -#undef MATCH_PROCESS_STATUS - -#ifndef _WIN32 -#undef PROCESS_STATUS_RUNNING_OR_NOTRUNNING -#undef IS_RUNNING_OR_NOTRUNNING -#endif - /** * Test for format_hex_number_sigsafe() */ @@ -3899,15 +3410,15 @@ test_util_format_hex_number(void *ptr) for (i = 0; test_data[i].str != NULL; ++i) { len = format_hex_number_sigsafe(test_data[i].x, buf, sizeof(buf)); - tt_int_op(len,!=, 0); - tt_int_op(len,==, strlen(buf)); - tt_str_op(buf,==, test_data[i].str); + tt_int_op(len,OP_NE, 0); + tt_int_op(len,OP_EQ, strlen(buf)); + tt_str_op(buf,OP_EQ, test_data[i].str); } - tt_int_op(4,==, format_hex_number_sigsafe(0xffff, buf, 5)); - tt_str_op(buf,==, "FFFF"); - tt_int_op(0,==, format_hex_number_sigsafe(0xffff, buf, 4)); - tt_int_op(0,==, format_hex_number_sigsafe(0, buf, 1)); + tt_int_op(4,OP_EQ, format_hex_number_sigsafe(0xffff, buf, 5)); + tt_str_op(buf,OP_EQ, "FFFF"); + tt_int_op(0,OP_EQ, format_hex_number_sigsafe(0xffff, buf, 4)); + tt_int_op(0,OP_EQ, format_hex_number_sigsafe(0, buf, 1)); done: return; @@ -3943,21 +3454,21 @@ test_util_format_dec_number(void *ptr) for (i = 0; test_data[i].str != NULL; ++i) { len = format_dec_number_sigsafe(test_data[i].x, buf, sizeof(buf)); - tt_int_op(len,!=, 0); - tt_int_op(len,==, strlen(buf)); - tt_str_op(buf,==, test_data[i].str); + tt_int_op(len,OP_NE, 0); + tt_int_op(len,OP_EQ, strlen(buf)); + tt_str_op(buf,OP_EQ, test_data[i].str); len = format_dec_number_sigsafe(test_data[i].x, buf, (int)(strlen(test_data[i].str) + 1)); - tt_int_op(len,==, strlen(buf)); - tt_str_op(buf,==, test_data[i].str); + tt_int_op(len,OP_EQ, strlen(buf)); + tt_str_op(buf,OP_EQ, test_data[i].str); } - tt_int_op(4,==, format_dec_number_sigsafe(7331, buf, 5)); - tt_str_op(buf,==, "7331"); - tt_int_op(0,==, format_dec_number_sigsafe(7331, buf, 4)); - tt_int_op(1,==, format_dec_number_sigsafe(0, buf, 2)); - tt_int_op(0,==, format_dec_number_sigsafe(0, buf, 1)); + tt_int_op(4,OP_EQ, format_dec_number_sigsafe(7331, buf, 5)); + tt_str_op(buf,OP_EQ, "7331"); + tt_int_op(0,OP_EQ, format_dec_number_sigsafe(7331, buf, 4)); + tt_int_op(1,OP_EQ, format_dec_number_sigsafe(0, buf, 2)); + tt_int_op(0,OP_EQ, format_dec_number_sigsafe(0, buf, 1)); done: return; @@ -4006,7 +3517,7 @@ test_util_join_win_cmdline(void *ptr) for (i=0; cmdlines[i]!=NULL; i++) { log_info(LD_GENERAL, "Joining argvs[%d], expecting <%s>", i, cmdlines[i]); joined_argv = tor_join_win_cmdline(argvs[i]); - tt_str_op(cmdlines[i],==, joined_argv); + tt_str_op(cmdlines[i],OP_EQ, joined_argv); tor_free(joined_argv); } @@ -4061,17 +3572,17 @@ test_util_split_lines(void *ptr) i, tests[i].orig_length); SMARTLIST_FOREACH_BEGIN(sl, const char *, line) { /* Check we have not got too many lines */ - tt_int_op(MAX_SPLIT_LINE_COUNT, >, j); + tt_int_op(MAX_SPLIT_LINE_COUNT, OP_GT, j); /* Check that there actually should be a line here */ tt_assert(tests[i].split_line[j] != NULL); log_info(LD_GENERAL, "Line %d of test %d, should be <%s>", j, i, tests[i].split_line[j]); /* Check that the line is as expected */ - tt_str_op(line,==, tests[i].split_line[j]); + tt_str_op(line,OP_EQ, tests[i].split_line[j]); j++; } SMARTLIST_FOREACH_END(line); /* Check that we didn't miss some lines */ - tt_ptr_op(NULL,==, tests[i].split_line[j]); + tt_ptr_op(NULL,OP_EQ, tests[i].split_line[j]); tor_free(orig_line); smartlist_free(sl); sl = NULL; @@ -4107,7 +3618,7 @@ test_util_di_ops(void *arg) for (i = 0; examples[i].a; ++i) { size_t len = strlen(examples[i].a); int eq1, eq2, neq1, neq2, cmp1, cmp2; - tt_int_op(len,==, strlen(examples[i].b)); + tt_int_op(len,OP_EQ, strlen(examples[i].b)); /* We do all of the operations, with operands in both orders. */ eq1 = tor_memeq(examples[i].a, examples[i].b, len); eq2 = tor_memeq(examples[i].b, examples[i].a, len); @@ -4125,11 +3636,11 @@ test_util_di_ops(void *arg) TT_DIE(("Assertion failed.")); /* Check for consistency of everything else with cmp1 */ - tt_int_op(eq1,==, eq2); - tt_int_op(neq1,==, neq2); - tt_int_op(cmp1,==, -cmp2); - tt_int_op(eq1,==, cmp1 == 0); - tt_int_op(neq1,==, !eq1); + tt_int_op(eq1,OP_EQ, eq2); + tt_int_op(neq1,OP_EQ, neq2); + tt_int_op(cmp1,OP_EQ, -cmp2); + tt_int_op(eq1,OP_EQ, cmp1 == 0); + tt_int_op(neq1,OP_EQ, !eq1); } { @@ -4144,22 +3655,24 @@ test_util_di_ops(void *arg) for (i = 0; i < 256; i++) { ii = (uint8_t)i; zz = (uint8_t)z; - tt_int_op(tor_memeq(&zz, &ii, 1),==, zz == ii); - tt_int_op(tor_memcmp(&zz, &ii, 1) > 0 ? GT : EQ,==, zz > ii ? GT : EQ); - tt_int_op(tor_memcmp(&ii, &zz, 1) < 0 ? LT : EQ,==, ii < zz ? LT : EQ); + tt_int_op(tor_memeq(&zz, &ii, 1),OP_EQ, zz == ii); + tt_int_op(tor_memcmp(&zz, &ii, 1) > 0 ? GT : EQ,OP_EQ, + zz > ii ? GT : EQ); + tt_int_op(tor_memcmp(&ii, &zz, 1) < 0 ? LT : EQ,OP_EQ, + ii < zz ? LT : EQ); } } } - tt_int_op(1, ==, safe_mem_is_zero("", 0)); - tt_int_op(1, ==, safe_mem_is_zero("", 1)); - tt_int_op(0, ==, safe_mem_is_zero("a", 1)); - tt_int_op(0, ==, safe_mem_is_zero("a", 2)); - tt_int_op(0, ==, safe_mem_is_zero("\0a", 2)); - tt_int_op(1, ==, safe_mem_is_zero("\0\0a", 2)); - tt_int_op(1, ==, safe_mem_is_zero("\0\0\0\0\0\0\0\0", 8)); - tt_int_op(1, ==, safe_mem_is_zero("\0\0\0\0\0\0\0\0a", 8)); - tt_int_op(0, ==, safe_mem_is_zero("\0\0\0\0\0\0\0\0a", 9)); + tt_int_op(1, OP_EQ, safe_mem_is_zero("", 0)); + tt_int_op(1, OP_EQ, safe_mem_is_zero("", 1)); + tt_int_op(0, OP_EQ, safe_mem_is_zero("a", 1)); + tt_int_op(0, OP_EQ, safe_mem_is_zero("a", 2)); + tt_int_op(0, OP_EQ, safe_mem_is_zero("\0a", 2)); + tt_int_op(1, OP_EQ, safe_mem_is_zero("\0\0a", 2)); + tt_int_op(1, OP_EQ, safe_mem_is_zero("\0\0\0\0\0\0\0\0", 8)); + tt_int_op(1, OP_EQ, safe_mem_is_zero("\0\0\0\0\0\0\0\0a", 8)); + tt_int_op(0, OP_EQ, safe_mem_is_zero("\0\0\0\0\0\0\0\0a", 9)); done: ; @@ -4172,12 +3685,12 @@ static void test_util_n_bits_set(void *ptr) { (void)ptr; - tt_int_op(0,==, n_bits_set_u8(0)); - tt_int_op(1,==, n_bits_set_u8(1)); - tt_int_op(3,==, n_bits_set_u8(7)); - tt_int_op(1,==, n_bits_set_u8(8)); - tt_int_op(2,==, n_bits_set_u8(129)); - tt_int_op(8,==, n_bits_set_u8(255)); + tt_int_op(0,OP_EQ, n_bits_set_u8(0)); + tt_int_op(1,OP_EQ, n_bits_set_u8(1)); + tt_int_op(3,OP_EQ, n_bits_set_u8(7)); + tt_int_op(1,OP_EQ, n_bits_set_u8(8)); + tt_int_op(2,OP_EQ, n_bits_set_u8(129)); + tt_int_op(8,OP_EQ, n_bits_set_u8(255)); done: ; } @@ -4198,78 +3711,82 @@ test_util_eat_whitespace(void *ptr) strlcpy(str, "fuubaar", sizeof(str)); for (i = 0; i < sizeof(ws); ++i) { str[0] = ws[i]; - tt_ptr_op(str + 1,==, eat_whitespace(str)); - tt_ptr_op(str + 1,==, eat_whitespace_eos(str, str + strlen(str))); - tt_ptr_op(str + 1,==, eat_whitespace_no_nl(str)); - tt_ptr_op(str + 1,==, eat_whitespace_eos_no_nl(str, str + strlen(str))); + tt_ptr_op(str + 1,OP_EQ, eat_whitespace(str)); + tt_ptr_op(str + 1,OP_EQ, eat_whitespace_eos(str, str + strlen(str))); + tt_ptr_op(str + 1,OP_EQ, eat_whitespace_no_nl(str)); + tt_ptr_op(str + 1,OP_EQ, eat_whitespace_eos_no_nl(str, str + strlen(str))); } str[0] = '\n'; - tt_ptr_op(str + 1,==, eat_whitespace(str)); - tt_ptr_op(str + 1,==, eat_whitespace_eos(str, str + strlen(str))); - tt_ptr_op(str,==, eat_whitespace_no_nl(str)); - tt_ptr_op(str,==, eat_whitespace_eos_no_nl(str, str + strlen(str))); + tt_ptr_op(str + 1,OP_EQ, eat_whitespace(str)); + tt_ptr_op(str + 1,OP_EQ, eat_whitespace_eos(str, str + strlen(str))); + tt_ptr_op(str,OP_EQ, eat_whitespace_no_nl(str)); + tt_ptr_op(str,OP_EQ, eat_whitespace_eos_no_nl(str, str + strlen(str))); /* Empty string */ strlcpy(str, "", sizeof(str)); - tt_ptr_op(str,==, eat_whitespace(str)); - tt_ptr_op(str,==, eat_whitespace_eos(str, str)); - tt_ptr_op(str,==, eat_whitespace_no_nl(str)); - tt_ptr_op(str,==, eat_whitespace_eos_no_nl(str, str)); + tt_ptr_op(str,OP_EQ, eat_whitespace(str)); + tt_ptr_op(str,OP_EQ, eat_whitespace_eos(str, str)); + tt_ptr_op(str,OP_EQ, eat_whitespace_no_nl(str)); + tt_ptr_op(str,OP_EQ, eat_whitespace_eos_no_nl(str, str)); /* Only ws */ strlcpy(str, " \t\r\n", sizeof(str)); - tt_ptr_op(str + strlen(str),==, eat_whitespace(str)); - tt_ptr_op(str + strlen(str),==, eat_whitespace_eos(str, str + strlen(str))); - tt_ptr_op(str + strlen(str) - 1,==, + tt_ptr_op(str + strlen(str),OP_EQ, eat_whitespace(str)); + tt_ptr_op(str + strlen(str),OP_EQ, + eat_whitespace_eos(str, str + strlen(str))); + tt_ptr_op(str + strlen(str) - 1,OP_EQ, eat_whitespace_no_nl(str)); - tt_ptr_op(str + strlen(str) - 1,==, + tt_ptr_op(str + strlen(str) - 1,OP_EQ, eat_whitespace_eos_no_nl(str, str + strlen(str))); strlcpy(str, " \t\r ", sizeof(str)); - tt_ptr_op(str + strlen(str),==, eat_whitespace(str)); - tt_ptr_op(str + strlen(str),==, + tt_ptr_op(str + strlen(str),OP_EQ, eat_whitespace(str)); + tt_ptr_op(str + strlen(str),OP_EQ, eat_whitespace_eos(str, str + strlen(str))); - tt_ptr_op(str + strlen(str),==, eat_whitespace_no_nl(str)); - tt_ptr_op(str + strlen(str),==, + tt_ptr_op(str + strlen(str),OP_EQ, eat_whitespace_no_nl(str)); + tt_ptr_op(str + strlen(str),OP_EQ, eat_whitespace_eos_no_nl(str, str + strlen(str))); /* Multiple ws */ strlcpy(str, "fuubaar", sizeof(str)); for (i = 0; i < sizeof(ws); ++i) str[i] = ws[i]; - tt_ptr_op(str + sizeof(ws),==, eat_whitespace(str)); - tt_ptr_op(str + sizeof(ws),==, eat_whitespace_eos(str, str + strlen(str))); - tt_ptr_op(str + sizeof(ws),==, eat_whitespace_no_nl(str)); - tt_ptr_op(str + sizeof(ws),==, + tt_ptr_op(str + sizeof(ws),OP_EQ, eat_whitespace(str)); + tt_ptr_op(str + sizeof(ws),OP_EQ, + eat_whitespace_eos(str, str + strlen(str))); + tt_ptr_op(str + sizeof(ws),OP_EQ, eat_whitespace_no_nl(str)); + tt_ptr_op(str + sizeof(ws),OP_EQ, eat_whitespace_eos_no_nl(str, str + strlen(str))); /* Eat comment */ strlcpy(str, "# Comment \n No Comment", sizeof(str)); - tt_str_op("No Comment",==, eat_whitespace(str)); - tt_str_op("No Comment",==, eat_whitespace_eos(str, str + strlen(str))); - tt_ptr_op(str,==, eat_whitespace_no_nl(str)); - tt_ptr_op(str,==, eat_whitespace_eos_no_nl(str, str + strlen(str))); + tt_str_op("No Comment",OP_EQ, eat_whitespace(str)); + tt_str_op("No Comment",OP_EQ, eat_whitespace_eos(str, str + strlen(str))); + tt_ptr_op(str,OP_EQ, eat_whitespace_no_nl(str)); + tt_ptr_op(str,OP_EQ, eat_whitespace_eos_no_nl(str, str + strlen(str))); /* Eat comment & ws mix */ strlcpy(str, " # \t Comment \n\t\nNo Comment", sizeof(str)); - tt_str_op("No Comment",==, eat_whitespace(str)); - tt_str_op("No Comment",==, eat_whitespace_eos(str, str + strlen(str))); - tt_ptr_op(str + 1,==, eat_whitespace_no_nl(str)); - tt_ptr_op(str + 1,==, eat_whitespace_eos_no_nl(str, str + strlen(str))); + tt_str_op("No Comment",OP_EQ, eat_whitespace(str)); + tt_str_op("No Comment",OP_EQ, eat_whitespace_eos(str, str + strlen(str))); + tt_ptr_op(str + 1,OP_EQ, eat_whitespace_no_nl(str)); + tt_ptr_op(str + 1,OP_EQ, eat_whitespace_eos_no_nl(str, str + strlen(str))); /* Eat entire comment */ strlcpy(str, "#Comment", sizeof(str)); - tt_ptr_op(str + strlen(str),==, eat_whitespace(str)); - tt_ptr_op(str + strlen(str),==, eat_whitespace_eos(str, str + strlen(str))); - tt_ptr_op(str,==, eat_whitespace_no_nl(str)); - tt_ptr_op(str,==, eat_whitespace_eos_no_nl(str, str + strlen(str))); + tt_ptr_op(str + strlen(str),OP_EQ, eat_whitespace(str)); + tt_ptr_op(str + strlen(str),OP_EQ, + eat_whitespace_eos(str, str + strlen(str))); + tt_ptr_op(str,OP_EQ, eat_whitespace_no_nl(str)); + tt_ptr_op(str,OP_EQ, eat_whitespace_eos_no_nl(str, str + strlen(str))); /* Blank line, then comment */ strlcpy(str, " \t\n # Comment", sizeof(str)); - tt_ptr_op(str + strlen(str),==, eat_whitespace(str)); - tt_ptr_op(str + strlen(str),==, eat_whitespace_eos(str, str + strlen(str))); - tt_ptr_op(str + 2,==, eat_whitespace_no_nl(str)); - tt_ptr_op(str + 2,==, eat_whitespace_eos_no_nl(str, str + strlen(str))); + tt_ptr_op(str + strlen(str),OP_EQ, eat_whitespace(str)); + tt_ptr_op(str + strlen(str),OP_EQ, + eat_whitespace_eos(str, str + strlen(str))); + tt_ptr_op(str + 2,OP_EQ, eat_whitespace_no_nl(str)); + tt_ptr_op(str + 2,OP_EQ, eat_whitespace_eos_no_nl(str, str + strlen(str))); done: ; @@ -4308,11 +3825,11 @@ test_util_sl_new_from_text_lines(void *ptr) smartlist_t *sl = smartlist_new_from_text_lines("foo\nbar\nbaz\n"); int sl_len = smartlist_len(sl); - tt_want_int_op(sl_len, ==, 3); + tt_want_int_op(sl_len, OP_EQ, 3); - if (sl_len > 0) tt_want_str_op(smartlist_get(sl, 0), ==, "foo"); - if (sl_len > 1) tt_want_str_op(smartlist_get(sl, 1), ==, "bar"); - if (sl_len > 2) tt_want_str_op(smartlist_get(sl, 2), ==, "baz"); + if (sl_len > 0) tt_want_str_op(smartlist_get(sl, 0), OP_EQ, "foo"); + if (sl_len > 1) tt_want_str_op(smartlist_get(sl, 1), OP_EQ, "bar"); + if (sl_len > 2) tt_want_str_op(smartlist_get(sl, 2), OP_EQ, "baz"); SMARTLIST_FOREACH(sl, void *, x, tor_free(x)); smartlist_free(sl); @@ -4322,11 +3839,11 @@ test_util_sl_new_from_text_lines(void *ptr) smartlist_t *sl = smartlist_new_from_text_lines("foo\nbar\nbaz"); int sl_len = smartlist_len(sl); - tt_want_int_op(sl_len, ==, 3); + tt_want_int_op(sl_len, OP_EQ, 3); - if (sl_len > 0) tt_want_str_op(smartlist_get(sl, 0), ==, "foo"); - if (sl_len > 1) tt_want_str_op(smartlist_get(sl, 1), ==, "bar"); - if (sl_len > 2) tt_want_str_op(smartlist_get(sl, 2), ==, "baz"); + if (sl_len > 0) tt_want_str_op(smartlist_get(sl, 0), OP_EQ, "foo"); + if (sl_len > 1) tt_want_str_op(smartlist_get(sl, 1), OP_EQ, "bar"); + if (sl_len > 2) tt_want_str_op(smartlist_get(sl, 2), OP_EQ, "baz"); SMARTLIST_FOREACH(sl, void *, x, tor_free(x)); smartlist_free(sl); @@ -4336,9 +3853,9 @@ test_util_sl_new_from_text_lines(void *ptr) smartlist_t *sl = smartlist_new_from_text_lines("foo"); int sl_len = smartlist_len(sl); - tt_want_int_op(sl_len, ==, 1); + tt_want_int_op(sl_len, OP_EQ, 1); - if (sl_len > 0) tt_want_str_op(smartlist_get(sl, 0), ==, "foo"); + if (sl_len > 0) tt_want_str_op(smartlist_get(sl, 0), OP_EQ, "foo"); SMARTLIST_FOREACH(sl, void *, x, tor_free(x)); smartlist_free(sl); @@ -4348,7 +3865,7 @@ test_util_sl_new_from_text_lines(void *ptr) smartlist_t *sl = smartlist_new_from_text_lines(""); int sl_len = smartlist_len(sl); - tt_want_int_op(sl_len, ==, 0); + tt_want_int_op(sl_len, OP_EQ, 0); SMARTLIST_FOREACH(sl, void *, x, tor_free(x)); smartlist_free(sl); @@ -4431,7 +3948,7 @@ test_util_make_environment(void *ptr) smartlist_sort_strings(env_vars_sorted); smartlist_sort_strings(env_vars_in_unixoid_env_block_sorted); - tt_want_int_op(smartlist_len(env_vars_sorted), ==, + tt_want_int_op(smartlist_len(env_vars_sorted), OP_EQ, smartlist_len(env_vars_in_unixoid_env_block_sorted)); { int len = smartlist_len(env_vars_sorted); @@ -4442,7 +3959,7 @@ test_util_make_environment(void *ptr) } for (i = 0; i < len; ++i) { - tt_want_str_op(smartlist_get(env_vars_sorted, i), ==, + tt_want_str_op(smartlist_get(env_vars_sorted, i), OP_EQ, smartlist_get(env_vars_in_unixoid_env_block_sorted, i)); } } @@ -4524,7 +4041,7 @@ test_util_set_env_var_in_sl(void *ptr) smartlist_sort_strings(merged_env_vars); smartlist_sort_strings(expected_resulting_env_vars); - tt_want_int_op(smartlist_len(merged_env_vars), ==, + tt_want_int_op(smartlist_len(merged_env_vars), OP_EQ, smartlist_len(expected_resulting_env_vars)); { int len = smartlist_len(merged_env_vars); @@ -4535,7 +4052,7 @@ test_util_set_env_var_in_sl(void *ptr) } for (i = 0; i < len; ++i) { - tt_want_str_op(smartlist_get(merged_env_vars, i), ==, + tt_want_str_op(smartlist_get(merged_env_vars, i), OP_EQ, smartlist_get(expected_resulting_env_vars, i)); } } @@ -4562,8 +4079,8 @@ test_util_weak_random(void *arg) for (i = 1; i <= 256; ++i) { for (j=0;j<100;++j) { int r = tor_weak_random_range(&rng, i); - tt_int_op(0, <=, r); - tt_int_op(r, <, i); + tt_int_op(0, OP_LE, r); + tt_int_op(r, OP_LT, i); } } @@ -4573,7 +4090,7 @@ test_util_weak_random(void *arg) } for (i=0;i<16;++i) - tt_int_op(n[i], >, 0); + tt_int_op(n[i], OP_GT, 0); done: ; } @@ -4585,9 +4102,9 @@ test_util_mathlog(void *arg) (void) arg; d = tor_mathlog(2.718281828); - tt_double_op(fabs(d - 1.0), <, .000001); + tt_double_op(fabs(d - 1.0), OP_LT, .000001); d = tor_mathlog(10); - tt_double_op(fabs(d - 2.30258509), <, .000001); + tt_double_op(fabs(d - 2.30258509), OP_LT, .000001); done: ; } @@ -4597,12 +4114,65 @@ test_util_round_to_next_multiple_of(void *arg) { (void)arg; - tt_assert(round_uint64_to_next_multiple_of(0,1) == 0); - tt_assert(round_uint64_to_next_multiple_of(0,7) == 0); + tt_u64_op(round_uint64_to_next_multiple_of(0,1), ==, 0); + tt_u64_op(round_uint64_to_next_multiple_of(0,7), ==, 0); - tt_assert(round_uint64_to_next_multiple_of(99,1) == 99); - tt_assert(round_uint64_to_next_multiple_of(99,7) == 105); - tt_assert(round_uint64_to_next_multiple_of(99,9) == 99); + tt_u64_op(round_uint64_to_next_multiple_of(99,1), ==, 99); + tt_u64_op(round_uint64_to_next_multiple_of(99,7), ==, 105); + tt_u64_op(round_uint64_to_next_multiple_of(99,9), ==, 99); + + tt_i64_op(round_int64_to_next_multiple_of(0,1), ==, 0); + tt_i64_op(round_int64_to_next_multiple_of(0,7), ==, 0); + + tt_i64_op(round_int64_to_next_multiple_of(99,1), ==, 99); + tt_i64_op(round_int64_to_next_multiple_of(99,7), ==, 105); + tt_i64_op(round_int64_to_next_multiple_of(99,9), ==, 99); + + tt_i64_op(round_int64_to_next_multiple_of(-99,1), ==, -99); + tt_i64_op(round_int64_to_next_multiple_of(-99,7), ==, -98); + tt_i64_op(round_int64_to_next_multiple_of(-99,9), ==, -99); + + tt_i64_op(round_int64_to_next_multiple_of(INT64_MIN,2), ==, INT64_MIN); + tt_i64_op(round_int64_to_next_multiple_of(INT64_MAX,2), ==, + INT64_MAX-INT64_MAX%2); + done: + ; +} + +static void +test_util_laplace(void *arg) +{ + /* Sample values produced using Python's SciPy: + * + * >>> from scipy.stats import laplace + * >>> laplace.ppf([-0.01, 0.0, 0.01, 0.5, 0.51, 0.99, 1.0, 1.01], + ... loc = 24, scale = 24) + * array([ nan, -inf, -69.88855213, 24. , + * 24.48486498, 117.88855213, inf, nan]) + */ + const double mu = 24.0, b = 24.0; + const double delta_f = 15.0, epsilon = 0.3; /* b = 15.0 / 0.3 = 50.0 */ + (void)arg; + + tt_i64_op(INT64_MIN, ==, sample_laplace_distribution(mu, b, 0.0)); + tt_i64_op(-69, ==, sample_laplace_distribution(mu, b, 0.01)); + tt_i64_op(24, ==, sample_laplace_distribution(mu, b, 0.5)); + tt_i64_op(24, ==, sample_laplace_distribution(mu, b, 0.51)); + tt_i64_op(117, ==, sample_laplace_distribution(mu, b, 0.99)); + + /* >>> laplace.ppf([0.0, 0.1, 0.25, 0.5, 0.75, 0.9, 0.99], + * ... loc = 0, scale = 50) + * array([ -inf, -80.47189562, -34.65735903, 0. , + * 34.65735903, 80.47189562, 195.60115027]) + */ + tt_i64_op(INT64_MIN + 20, ==, + add_laplace_noise(20, 0.0, delta_f, epsilon)); + tt_i64_op(-60, ==, add_laplace_noise(20, 0.1, delta_f, epsilon)); + tt_i64_op(-14, ==, add_laplace_noise(20, 0.25, delta_f, epsilon)); + tt_i64_op(20, ==, add_laplace_noise(20, 0.5, delta_f, epsilon)); + tt_i64_op(54, ==, add_laplace_noise(20, 0.75, delta_f, epsilon)); + tt_i64_op(100, ==, add_laplace_noise(20, 0.9, delta_f, epsilon)); + tt_i64_op(215, ==, add_laplace_noise(20, 0.99, delta_f, epsilon)); done: ; @@ -4671,36 +4241,36 @@ test_util_socket(void *arg) fd2 = tor_open_socket_with_extensions(AF_INET, SOCK_STREAM, 0, 0, 1); tt_assert(SOCKET_OK(fd1)); tt_assert(SOCKET_OK(fd2)); - tt_int_op(get_n_open_sockets(), ==, n + 2); + tt_int_op(get_n_open_sockets(), OP_EQ, n + 2); //fd3 = tor_open_socket_with_extensions(AF_INET, SOCK_STREAM, 0, 1, 0); //fd4 = tor_open_socket_with_extensions(AF_INET, SOCK_STREAM, 0, 1, 1); fd3 = tor_open_socket(AF_INET, SOCK_STREAM, 0); fd4 = tor_open_socket_nonblocking(AF_INET, SOCK_STREAM, 0); tt_assert(SOCKET_OK(fd3)); tt_assert(SOCKET_OK(fd4)); - tt_int_op(get_n_open_sockets(), ==, n + 4); + tt_int_op(get_n_open_sockets(), OP_EQ, n + 4); #ifdef CAN_CHECK_CLOEXEC - tt_int_op(fd_is_cloexec(fd1), ==, 0); - tt_int_op(fd_is_cloexec(fd2), ==, 0); - tt_int_op(fd_is_cloexec(fd3), ==, 1); - tt_int_op(fd_is_cloexec(fd4), ==, 1); + tt_int_op(fd_is_cloexec(fd1), OP_EQ, 0); + tt_int_op(fd_is_cloexec(fd2), OP_EQ, 0); + tt_int_op(fd_is_cloexec(fd3), OP_EQ, 1); + tt_int_op(fd_is_cloexec(fd4), OP_EQ, 1); #endif #ifdef CAN_CHECK_NONBLOCK - tt_int_op(fd_is_nonblocking(fd1), ==, 0); - tt_int_op(fd_is_nonblocking(fd2), ==, 1); - tt_int_op(fd_is_nonblocking(fd3), ==, 0); - tt_int_op(fd_is_nonblocking(fd4), ==, 1); + tt_int_op(fd_is_nonblocking(fd1), OP_EQ, 0); + tt_int_op(fd_is_nonblocking(fd2), OP_EQ, 1); + tt_int_op(fd_is_nonblocking(fd3), OP_EQ, 0); + tt_int_op(fd_is_nonblocking(fd4), OP_EQ, 1); #endif tor_close_socket(fd1); tor_close_socket(fd2); fd1 = fd2 = TOR_INVALID_SOCKET; - tt_int_op(get_n_open_sockets(), ==, n + 2); + tt_int_op(get_n_open_sockets(), OP_EQ, n + 2); tor_close_socket(fd3); tor_close_socket(fd4); fd3 = fd4 = TOR_INVALID_SOCKET; - tt_int_op(get_n_open_sockets(), ==, n); + tt_int_op(get_n_open_sockets(), OP_EQ, n); done: if (SOCKET_OK(fd1)) @@ -4713,23 +4283,6 @@ test_util_socket(void *arg) tor_close_socket(fd4); } -static void * -socketpair_test_setup(const struct testcase_t *testcase) -{ - return testcase->setup_data; -} -static int -socketpair_test_cleanup(const struct testcase_t *testcase, void *ptr) -{ - (void)testcase; - (void)ptr; - return 1; -} - -static const struct testcase_setup_t socketpair_setup = { - socketpair_test_setup, socketpair_test_cleanup -}; - /* Test for socketpair and ersatz_socketpair(). We test them both, since * the latter is a tolerably good way to exersize tor_accept_socket(). */ static void @@ -4742,17 +4295,17 @@ test_util_socketpair(void *arg) tor_socket_t fds[2] = {TOR_INVALID_SOCKET, TOR_INVALID_SOCKET}; const int family = AF_UNIX; - tt_int_op(0, ==, tor_socketpair_fn(family, SOCK_STREAM, 0, fds)); + tt_int_op(0, OP_EQ, tor_socketpair_fn(family, SOCK_STREAM, 0, fds)); tt_assert(SOCKET_OK(fds[0])); tt_assert(SOCKET_OK(fds[1])); - tt_int_op(get_n_open_sockets(), ==, n + 2); + tt_int_op(get_n_open_sockets(), OP_EQ, n + 2); #ifdef CAN_CHECK_CLOEXEC - tt_int_op(fd_is_cloexec(fds[0]), ==, 1); - tt_int_op(fd_is_cloexec(fds[1]), ==, 1); + tt_int_op(fd_is_cloexec(fds[0]), OP_EQ, 1); + tt_int_op(fd_is_cloexec(fds[1]), OP_EQ, 1); #endif #ifdef CAN_CHECK_NONBLOCK - tt_int_op(fd_is_nonblocking(fds[0]), ==, 0); - tt_int_op(fd_is_nonblocking(fds[1]), ==, 0); + tt_int_op(fd_is_nonblocking(fds[0]), OP_EQ, 0); + tt_int_op(fd_is_nonblocking(fds[1]), OP_EQ, 0); #endif done: @@ -4771,18 +4324,18 @@ test_util_max_mem(void *arg) r = get_total_system_memory(&memory1); r2 = get_total_system_memory(&memory2); - tt_int_op(r, ==, r2); - tt_uint_op(memory2, ==, memory1); + tt_int_op(r, OP_EQ, r2); + tt_uint_op(memory2, OP_EQ, memory1); TT_BLATHER(("System memory: "U64_FORMAT, U64_PRINTF_ARG(memory1))); if (r==0) { /* You have at least a megabyte. */ - tt_uint_op(memory1, >, (1<<20)); + tt_uint_op(memory1, OP_GT, (1<<20)); } else { /* You do not have a petabyte. */ #if SIZEOF_SIZE_T == SIZEOF_UINT64_T - tt_uint_op(memory1, <, (U64_LITERAL(1)<<50)); + tt_u64_op(memory1, OP_LT, (U64_LITERAL(1)<<50)); #endif } @@ -4858,13 +4411,13 @@ struct testcase_t util_tests[] = { UTIL_LEGACY(memarea), UTIL_LEGACY(control_formats), UTIL_LEGACY(mmap), - UTIL_LEGACY(threads), UTIL_LEGACY(sscanf), UTIL_LEGACY(format_time_interval), UTIL_LEGACY(path_is_relative), UTIL_LEGACY(strtok), UTIL_LEGACY(di_ops), UTIL_TEST(round_to_next_multiple_of, 0), + UTIL_TEST(laplace, 0), UTIL_TEST(strclear, 0), UTIL_TEST(find_str_at_start_of_line, 0), UTIL_TEST(string_is_C_identifier, 0), @@ -4879,11 +4432,6 @@ struct testcase_t util_tests[] = { UTIL_TEST(exit_status, 0), UTIL_TEST(fgets_eagain, 0), #endif - UTIL_TEST(spawn_background_ok, 0), - UTIL_TEST(spawn_background_fail, 0), - UTIL_TEST(spawn_background_partial_read, 0), - UTIL_TEST(spawn_background_exit_early, 0), - UTIL_TEST(spawn_background_waitpid_notify, 0), UTIL_TEST(format_hex_number, 0), UTIL_TEST(format_dec_number, 0), UTIL_TEST(join_win_cmdline, 0), @@ -4904,10 +4452,10 @@ struct testcase_t util_tests[] = { UTIL_TEST(mathlog, 0), UTIL_TEST(weak_random, 0), UTIL_TEST(socket, TT_FORK), - { "socketpair", test_util_socketpair, TT_FORK, &socketpair_setup, + { "socketpair", test_util_socketpair, TT_FORK, &passthrough_setup, (void*)"0" }, { "socketpair_ersatz", test_util_socketpair, TT_FORK, - &socketpair_setup, (void*)"1" }, + &passthrough_setup, (void*)"1" }, UTIL_TEST(max_mem, 0), UTIL_TEST(hostname_validation, 0), UTIL_TEST(ipv4_validation, 0), diff --git a/src/test/test_util_slow.c b/src/test/test_util_slow.c new file mode 100644 index 0000000000..a597ef3cbc --- /dev/null +++ b/src/test/test_util_slow.c @@ -0,0 +1,389 @@ +/* Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2015, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "orconfig.h" +#define UTIL_PRIVATE +#include "util.h" +#include "util_process.h" +#include "crypto.h" +#include "torlog.h" +#include "test.h" + +#ifndef BUILDDIR +#define BUILDDIR "." +#endif + +#ifdef _WIN32 +#define notify_pending_waitpid_callbacks() STMT_NIL +#define TEST_CHILD "test-child.exe" +#define EOL "\r\n" +#else +#define TEST_CHILD (BUILDDIR "/src/test/test-child") +#define EOL "\n" +#endif + +#ifdef _WIN32 +/* I've assumed Windows doesn't have the gap between fork and exec + * that causes the race condition on unix-like platforms */ +#define MATCH_PROCESS_STATUS(s1,s2) ((s1) == (s2)) + +#else +/* work around a race condition of the timing of SIGCHLD handler updates + * to the process_handle's fields, and checks of those fields + * + * TODO: Once we can signal failure to exec, change PROCESS_STATUS_RUNNING to + * PROCESS_STATUS_ERROR (and similarly with *_OR_NOTRUNNING) */ +#define PROCESS_STATUS_RUNNING_OR_NOTRUNNING (PROCESS_STATUS_RUNNING+1) +#define IS_RUNNING_OR_NOTRUNNING(s) \ + ((s) == PROCESS_STATUS_RUNNING || (s) == PROCESS_STATUS_NOTRUNNING) +/* well, this is ugly */ +#define MATCH_PROCESS_STATUS(s1,s2) \ + ( (s1) == (s2) \ + ||((s1) == PROCESS_STATUS_RUNNING_OR_NOTRUNNING \ + && IS_RUNNING_OR_NOTRUNNING(s2)) \ + ||((s2) == PROCESS_STATUS_RUNNING_OR_NOTRUNNING \ + && IS_RUNNING_OR_NOTRUNNING(s1))) + +#endif // _WIN32 + +/** Helper function for testing tor_spawn_background */ +static void +run_util_spawn_background(const char *argv[], const char *expected_out, + const char *expected_err, int expected_exit, + int expected_status) +{ + int retval, exit_code; + ssize_t pos; + process_handle_t *process_handle=NULL; + char stdout_buf[100], stderr_buf[100]; + int status; + + /* Start the program */ +#ifdef _WIN32 + status = tor_spawn_background(NULL, argv, NULL, &process_handle); +#else + status = tor_spawn_background(argv[0], argv, NULL, &process_handle); +#endif + + notify_pending_waitpid_callbacks(); + + /* the race condition doesn't affect status, + * because status isn't updated by the SIGCHLD handler, + * but we still need to handle PROCESS_STATUS_RUNNING_OR_NOTRUNNING */ + tt_assert(MATCH_PROCESS_STATUS(expected_status, status)); + if (status == PROCESS_STATUS_ERROR) { + tt_ptr_op(process_handle, OP_EQ, NULL); + return; + } + + tt_assert(process_handle != NULL); + + /* When a spawned process forks, fails, then exits very quickly, + * (this typically occurs when exec fails) + * there is a race condition between the SIGCHLD handler + * updating the process_handle's fields, and this test + * checking the process status in those fields. + * The SIGCHLD update can occur before or after the code below executes. + * This causes intermittent failures in spawn_background_fail(), + * typically when the machine is under load. + * We use PROCESS_STATUS_RUNNING_OR_NOTRUNNING to avoid this issue. */ + + /* the race condition affects the change in + * process_handle->status from RUNNING to NOTRUNNING */ + tt_assert(MATCH_PROCESS_STATUS(expected_status, process_handle->status)); + +#ifndef _WIN32 + notify_pending_waitpid_callbacks(); + /* the race condition affects the change in + * process_handle->waitpid_cb to NULL, + * so we skip the check if expected_status is ambiguous, + * that is, PROCESS_STATUS_RUNNING_OR_NOTRUNNING */ + tt_assert(process_handle->waitpid_cb != NULL + || expected_status == PROCESS_STATUS_RUNNING_OR_NOTRUNNING); +#endif + +#ifdef _WIN32 + tt_assert(process_handle->stdout_pipe != INVALID_HANDLE_VALUE); + tt_assert(process_handle->stderr_pipe != INVALID_HANDLE_VALUE); +#else + tt_assert(process_handle->stdout_pipe >= 0); + tt_assert(process_handle->stderr_pipe >= 0); +#endif + + /* Check stdout */ + pos = tor_read_all_from_process_stdout(process_handle, stdout_buf, + sizeof(stdout_buf) - 1); + tt_assert(pos >= 0); + stdout_buf[pos] = '\0'; + tt_int_op(strlen(expected_out),OP_EQ, pos); + tt_str_op(expected_out,OP_EQ, stdout_buf); + + notify_pending_waitpid_callbacks(); + + /* Check it terminated correctly */ + retval = tor_get_exit_code(process_handle, 1, &exit_code); + tt_int_op(PROCESS_EXIT_EXITED,OP_EQ, retval); + tt_int_op(expected_exit,OP_EQ, exit_code); + // TODO: Make test-child exit with something other than 0 + +#ifndef _WIN32 + notify_pending_waitpid_callbacks(); + tt_ptr_op(process_handle->waitpid_cb, OP_EQ, NULL); +#endif + + /* Check stderr */ + pos = tor_read_all_from_process_stderr(process_handle, stderr_buf, + sizeof(stderr_buf) - 1); + tt_assert(pos >= 0); + stderr_buf[pos] = '\0'; + tt_str_op(expected_err,OP_EQ, stderr_buf); + tt_int_op(strlen(expected_err),OP_EQ, pos); + + notify_pending_waitpid_callbacks(); + + done: + if (process_handle) + tor_process_handle_destroy(process_handle, 1); +} + +/** Check that we can launch a process and read the output */ +static void +test_util_spawn_background_ok(void *ptr) +{ + const char *argv[] = {TEST_CHILD, "--test", NULL}; + const char *expected_out = "OUT"EOL "--test"EOL "SLEEPING"EOL "DONE" EOL; + const char *expected_err = "ERR"EOL; + + (void)ptr; + + run_util_spawn_background(argv, expected_out, expected_err, 0, + PROCESS_STATUS_RUNNING); +} + +/** Check that failing to find the executable works as expected */ +static void +test_util_spawn_background_fail(void *ptr) +{ + const char *argv[] = {BUILDDIR "/src/test/no-such-file", "--test", NULL}; + const char *expected_err = ""; + char expected_out[1024]; + char code[32]; +#ifdef _WIN32 + const int expected_status = PROCESS_STATUS_ERROR; +#else + /* TODO: Once we can signal failure to exec, set this to be + * PROCESS_STATUS_RUNNING_OR_ERROR */ + const int expected_status = PROCESS_STATUS_RUNNING_OR_NOTRUNNING; +#endif + + memset(expected_out, 0xf0, sizeof(expected_out)); + memset(code, 0xf0, sizeof(code)); + + (void)ptr; + + tor_snprintf(code, sizeof(code), "%x/%x", + 9 /* CHILD_STATE_FAILEXEC */ , ENOENT); + tor_snprintf(expected_out, sizeof(expected_out), + "ERR: Failed to spawn background process - code %s\n", code); + + run_util_spawn_background(argv, expected_out, expected_err, 255, + expected_status); +} + +/** Test that reading from a handle returns a partial read rather than + * blocking */ +static void +test_util_spawn_background_partial_read_impl(int exit_early) +{ + const int expected_exit = 0; + const int expected_status = PROCESS_STATUS_RUNNING; + + int retval, exit_code; + ssize_t pos = -1; + process_handle_t *process_handle=NULL; + int status; + char stdout_buf[100], stderr_buf[100]; + + const char *argv[] = {TEST_CHILD, "--test", NULL}; + const char *expected_out[] = { "OUT" EOL "--test" EOL "SLEEPING" EOL, + "DONE" EOL, + NULL }; + const char *expected_err = "ERR" EOL; + +#ifndef _WIN32 + int eof = 0; +#endif + int expected_out_ctr; + + if (exit_early) { + argv[1] = "--hang"; + expected_out[0] = "OUT"EOL "--hang"EOL "SLEEPING" EOL; + } + + /* Start the program */ +#ifdef _WIN32 + status = tor_spawn_background(NULL, argv, NULL, &process_handle); +#else + status = tor_spawn_background(argv[0], argv, NULL, &process_handle); +#endif + tt_int_op(expected_status,OP_EQ, status); + tt_assert(process_handle); + tt_int_op(expected_status,OP_EQ, process_handle->status); + + /* Check stdout */ + for (expected_out_ctr = 0; expected_out[expected_out_ctr] != NULL;) { +#ifdef _WIN32 + pos = tor_read_all_handle(process_handle->stdout_pipe, stdout_buf, + sizeof(stdout_buf) - 1, NULL); +#else + /* Check that we didn't read the end of file last time */ + tt_assert(!eof); + pos = tor_read_all_handle(process_handle->stdout_handle, stdout_buf, + sizeof(stdout_buf) - 1, NULL, &eof); +#endif + log_info(LD_GENERAL, "tor_read_all_handle() returned %d", (int)pos); + + /* We would have blocked, keep on trying */ + if (0 == pos) + continue; + + tt_assert(pos > 0); + stdout_buf[pos] = '\0'; + tt_str_op(expected_out[expected_out_ctr],OP_EQ, stdout_buf); + tt_int_op(strlen(expected_out[expected_out_ctr]),OP_EQ, pos); + expected_out_ctr++; + } + + if (exit_early) { + tor_process_handle_destroy(process_handle, 1); + process_handle = NULL; + goto done; + } + + /* The process should have exited without writing more */ +#ifdef _WIN32 + pos = tor_read_all_handle(process_handle->stdout_pipe, stdout_buf, + sizeof(stdout_buf) - 1, + process_handle); + tt_int_op(0,OP_EQ, pos); +#else + if (!eof) { + /* We should have got all the data, but maybe not the EOF flag */ + pos = tor_read_all_handle(process_handle->stdout_handle, stdout_buf, + sizeof(stdout_buf) - 1, + process_handle, &eof); + tt_int_op(0,OP_EQ, pos); + tt_assert(eof); + } + /* Otherwise, we got the EOF on the last read */ +#endif + + /* Check it terminated correctly */ + retval = tor_get_exit_code(process_handle, 1, &exit_code); + tt_int_op(PROCESS_EXIT_EXITED,OP_EQ, retval); + tt_int_op(expected_exit,OP_EQ, exit_code); + + // TODO: Make test-child exit with something other than 0 + + /* Check stderr */ + pos = tor_read_all_from_process_stderr(process_handle, stderr_buf, + sizeof(stderr_buf) - 1); + tt_assert(pos >= 0); + stderr_buf[pos] = '\0'; + tt_str_op(expected_err,OP_EQ, stderr_buf); + tt_int_op(strlen(expected_err),OP_EQ, pos); + + done: + tor_process_handle_destroy(process_handle, 1); +} + +static void +test_util_spawn_background_partial_read(void *arg) +{ + (void)arg; + test_util_spawn_background_partial_read_impl(0); +} + +static void +test_util_spawn_background_exit_early(void *arg) +{ + (void)arg; + test_util_spawn_background_partial_read_impl(1); +} + +static void +test_util_spawn_background_waitpid_notify(void *arg) +{ + int retval, exit_code; + process_handle_t *process_handle=NULL; + int status; + int ms_timer; + + const char *argv[] = {TEST_CHILD, "--fast", NULL}; + + (void) arg; + +#ifdef _WIN32 + status = tor_spawn_background(NULL, argv, NULL, &process_handle); +#else + status = tor_spawn_background(argv[0], argv, NULL, &process_handle); +#endif + + tt_int_op(status, OP_EQ, PROCESS_STATUS_RUNNING); + tt_ptr_op(process_handle, OP_NE, NULL); + + /* We're not going to look at the stdout/stderr output this time. Instead, + * we're testing whether notify_pending_waitpid_calbacks() can report the + * process exit (on unix) and/or whether tor_get_exit_code() can notice it + * (on windows) */ + +#ifndef _WIN32 + ms_timer = 30*1000; + tt_ptr_op(process_handle->waitpid_cb, OP_NE, NULL); + while (process_handle->waitpid_cb && ms_timer > 0) { + tor_sleep_msec(100); + ms_timer -= 100; + notify_pending_waitpid_callbacks(); + } + tt_int_op(ms_timer, OP_GT, 0); + tt_ptr_op(process_handle->waitpid_cb, OP_EQ, NULL); +#endif + + ms_timer = 30*1000; + while (((retval = tor_get_exit_code(process_handle, 0, &exit_code)) + == PROCESS_EXIT_RUNNING) && ms_timer > 0) { + tor_sleep_msec(100); + ms_timer -= 100; + } + tt_int_op(ms_timer, OP_GT, 0); + + tt_int_op(retval, OP_EQ, PROCESS_EXIT_EXITED); + + done: + tor_process_handle_destroy(process_handle, 1); +} + +#undef TEST_CHILD +#undef EOL + +#undef MATCH_PROCESS_STATUS + +#ifndef _WIN32 +#undef PROCESS_STATUS_RUNNING_OR_NOTRUNNING +#undef IS_RUNNING_OR_NOTRUNNING +#endif + +#define UTIL_TEST(name, flags) \ + { #name, test_util_ ## name, flags, NULL, NULL } + +struct testcase_t slow_util_tests[] = { + UTIL_TEST(spawn_background_ok, 0), + UTIL_TEST(spawn_background_fail, 0), + UTIL_TEST(spawn_background_partial_read, 0), + UTIL_TEST(spawn_background_exit_early, 0), + UTIL_TEST(spawn_background_waitpid_notify, 0), + END_OF_TESTCASES +}; + diff --git a/src/test/test_workqueue.c b/src/test/test_workqueue.c new file mode 100644 index 0000000000..aaff5069be --- /dev/null +++ b/src/test/test_workqueue.c @@ -0,0 +1,409 @@ +/* Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2015, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "or.h" +#include "compat_threads.h" +#include "onion.h" +#include "workqueue.h" +#include "crypto.h" +#include "crypto_curve25519.h" +#include "compat_libevent.h" + +#include <stdio.h> +#ifdef HAVE_EVENT2_EVENT_H +#include <event2/event.h> +#else +#include <event.h> +#endif + +static int opt_verbose = 0; +static int opt_n_threads = 8; +static int opt_n_items = 10000; +static int opt_n_inflight = 1000; +static int opt_n_lowwater = 250; +static int opt_n_cancel = 0; +static int opt_ratio_rsa = 5; + +#ifdef TRACK_RESPONSES +tor_mutex_t bitmap_mutex; +int handled_len; +bitarray_t *handled; +#endif + +typedef struct state_s { + int magic; + int n_handled; + crypto_pk_t *rsa; + curve25519_secret_key_t ecdh; + int is_shutdown; +} state_t; + +typedef struct rsa_work_s { + int serial; + uint8_t msg[128]; + uint8_t msglen; +} rsa_work_t; + +typedef struct ecdh_work_s { + int serial; + union { + curve25519_public_key_t pk; + uint8_t msg[32]; + } u; +} ecdh_work_t; + +static void +mark_handled(int serial) +{ +#ifdef TRACK_RESPONSES + tor_mutex_acquire(&bitmap_mutex); + tor_assert(serial < handled_len); + tor_assert(! bitarray_is_set(handled, serial)); + bitarray_set(handled, serial); + tor_mutex_release(&bitmap_mutex); +#else + (void)serial; +#endif +} + +static int +workqueue_do_rsa(void *state, void *work) +{ + rsa_work_t *rw = work; + state_t *st = state; + crypto_pk_t *rsa = st->rsa; + uint8_t sig[256]; + int len; + + tor_assert(st->magic == 13371337); + + len = crypto_pk_private_sign(rsa, (char*)sig, 256, + (char*)rw->msg, rw->msglen); + if (len < 0) { + rw->msglen = 0; + return WQ_RPL_ERROR; + } + + memset(rw->msg, 0, sizeof(rw->msg)); + rw->msglen = len; + memcpy(rw->msg, sig, len); + ++st->n_handled; + + mark_handled(rw->serial); + + return WQ_RPL_REPLY; +} + +static int +workqueue_do_shutdown(void *state, void *work) +{ + (void)state; + (void)work; + crypto_pk_free(((state_t*)state)->rsa); + tor_free(state); + return WQ_RPL_SHUTDOWN; +} + +static int +workqueue_do_ecdh(void *state, void *work) +{ + ecdh_work_t *ew = work; + uint8_t output[CURVE25519_OUTPUT_LEN]; + state_t *st = state; + + tor_assert(st->magic == 13371337); + + curve25519_handshake(output, &st->ecdh, &ew->u.pk); + memcpy(ew->u.msg, output, CURVE25519_OUTPUT_LEN); + ++st->n_handled; + mark_handled(ew->serial); + return WQ_RPL_REPLY; +} + +static void * +new_state(void *arg) +{ + state_t *st; + (void)arg; + + st = tor_malloc(sizeof(*st)); + /* Every thread gets its own keys. not a problem for benchmarking */ + st->rsa = crypto_pk_new(); + if (crypto_pk_generate_key_with_bits(st->rsa, 1024) < 0) { + crypto_pk_free(st->rsa); + tor_free(st); + return NULL; + } + curve25519_secret_key_generate(&st->ecdh, 0); + st->magic = 13371337; + return st; +} + +static void +free_state(void *arg) +{ + state_t *st = arg; + crypto_pk_free(st->rsa); + tor_free(st); +} + +static tor_weak_rng_t weak_rng; +static int n_sent = 0; +static int rsa_sent = 0; +static int ecdh_sent = 0; +static int n_received = 0; + +#ifdef TRACK_RESPONSES +bitarray_t *received; +#endif + +static void +handle_reply(void *arg) +{ +#ifdef TRACK_RESPONSES + rsa_work_t *rw = arg; /* Naughty cast, but only looking at serial. */ + tor_assert(! bitarray_is_set(received, rw->serial)); + bitarray_set(received,rw->serial); +#endif + + tor_free(arg); + ++n_received; +} + +static workqueue_entry_t * +add_work(threadpool_t *tp) +{ + int add_rsa = + opt_ratio_rsa == 0 || + tor_weak_random_range(&weak_rng, opt_ratio_rsa) == 0; + + if (add_rsa) { + rsa_work_t *w = tor_malloc_zero(sizeof(*w)); + w->serial = n_sent++; + crypto_rand((char*)w->msg, 20); + w->msglen = 20; + ++rsa_sent; + return threadpool_queue_work(tp, workqueue_do_rsa, handle_reply, w); + } else { + ecdh_work_t *w = tor_malloc_zero(sizeof(*w)); + w->serial = n_sent++; + /* Not strictly right, but this is just for benchmarks. */ + crypto_rand((char*)w->u.pk.public_key, 32); + ++ecdh_sent; + return threadpool_queue_work(tp, workqueue_do_ecdh, handle_reply, w); + } +} + +static int n_failed_cancel = 0; +static int n_successful_cancel = 0; + +static int +add_n_work_items(threadpool_t *tp, int n) +{ + int n_queued = 0; + int n_try_cancel = 0, i; + workqueue_entry_t **to_cancel; + workqueue_entry_t *ent; + + to_cancel = tor_malloc(sizeof(workqueue_entry_t*) * opt_n_cancel); + + while (n_queued++ < n) { + ent = add_work(tp); + if (! ent) { + tor_event_base_loopexit(tor_libevent_get_base(), NULL); + return -1; + } + if (n_try_cancel < opt_n_cancel && + tor_weak_random_range(&weak_rng, n) < opt_n_cancel) { + to_cancel[n_try_cancel++] = ent; + } + } + + for (i = 0; i < n_try_cancel; ++i) { + void *work = workqueue_entry_cancel(to_cancel[i]); + if (! work) { + n_failed_cancel++; + } else { + n_successful_cancel++; + tor_free(work); + } + } + + tor_free(to_cancel); + return 0; +} + +static int shutting_down = 0; + +static void +replysock_readable_cb(tor_socket_t sock, short what, void *arg) +{ + threadpool_t *tp = arg; + replyqueue_t *rq = threadpool_get_replyqueue(tp); + + int old_r = n_received; + (void) sock; + (void) what; + + replyqueue_process(rq); + if (old_r == n_received) + return; + + if (opt_verbose) { + printf("%d / %d", n_received, n_sent); + if (opt_n_cancel) + printf(" (%d cancelled, %d uncancellable)", + n_successful_cancel, n_failed_cancel); + puts(""); + } +#ifdef TRACK_RESPONSES + tor_mutex_acquire(&bitmap_mutex); + for (i = 0; i < opt_n_items; ++i) { + if (bitarray_is_set(received, i)) + putc('o', stdout); + else if (bitarray_is_set(handled, i)) + putc('!', stdout); + else + putc('.', stdout); + } + puts(""); + tor_mutex_release(&bitmap_mutex); +#endif + + if (n_sent - (n_received+n_successful_cancel) < opt_n_lowwater) { + int n_to_send = n_received + opt_n_inflight - n_sent; + if (n_to_send > opt_n_items - n_sent) + n_to_send = opt_n_items - n_sent; + add_n_work_items(tp, n_to_send); + } + + if (shutting_down == 0 && + n_received+n_successful_cancel == n_sent && + n_sent >= opt_n_items) { + shutting_down = 1; + threadpool_queue_update(tp, NULL, + workqueue_do_shutdown, NULL, NULL); + } +} + +static void +help(void) +{ + puts( + "Options:\n" + " -N <items> Run this many items of work\n" + " -T <threads> Use this many threads\n" + " -I <inflight> Have no more than this many requests queued at once\n" + " -L <lowwater> Add items whenever fewer than this many are pending\n" + " -C <cancel> Try to cancel N items of every batch that we add\n" + " -R <ratio> Make one out of this many items be a slow (RSA) one\n" + " --no-{eventfd2,eventfd,pipe2,pipe,socketpair}\n" + " Disable one of the alert_socket backends."); +} + +int +main(int argc, char **argv) +{ + replyqueue_t *rq; + threadpool_t *tp; + int i; + tor_libevent_cfg evcfg; + struct event *ev; + uint32_t as_flags = 0; + + for (i = 1; i < argc; ++i) { + if (!strcmp(argv[i], "-v")) { + opt_verbose = 1; + } else if (!strcmp(argv[i], "-T") && i+1<argc) { + opt_n_threads = atoi(argv[++i]); + } else if (!strcmp(argv[i], "-N") && i+1<argc) { + opt_n_items = atoi(argv[++i]); + } else if (!strcmp(argv[i], "-I") && i+1<argc) { + opt_n_inflight = atoi(argv[++i]); + } else if (!strcmp(argv[i], "-L") && i+1<argc) { + opt_n_lowwater = atoi(argv[++i]); + } else if (!strcmp(argv[i], "-R") && i+1<argc) { + opt_ratio_rsa = atoi(argv[++i]); + } else if (!strcmp(argv[i], "-C") && i+1<argc) { + opt_n_cancel = atoi(argv[++i]); + } else if (!strcmp(argv[i], "--no-eventfd2")) { + as_flags |= ASOCKS_NOEVENTFD2; + } else if (!strcmp(argv[i], "--no-eventfd")) { + as_flags |= ASOCKS_NOEVENTFD; + } else if (!strcmp(argv[i], "--no-pipe2")) { + as_flags |= ASOCKS_NOPIPE2; + } else if (!strcmp(argv[i], "--no-pipe")) { + as_flags |= ASOCKS_NOPIPE; + } else if (!strcmp(argv[i], "--no-socketpair")) { + as_flags |= ASOCKS_NOSOCKETPAIR; + } else if (!strcmp(argv[i], "-h")) { + help(); + return 0; + } else { + help(); + return 1; + } + } + if (opt_n_threads < 1 || + opt_n_items < 1 || opt_n_inflight < 1 || opt_n_lowwater < 0 || + opt_n_cancel > opt_n_inflight || + opt_ratio_rsa < 0) { + help(); + return 1; + } + + init_logging(1); + crypto_global_init(1, NULL, NULL); + crypto_seed_rng(1); + + rq = replyqueue_new(as_flags); + tor_assert(rq); + tp = threadpool_new(opt_n_threads, + rq, new_state, free_state, NULL); + tor_assert(tp); + + crypto_seed_weak_rng(&weak_rng); + + memset(&evcfg, 0, sizeof(evcfg)); + tor_libevent_initialize(&evcfg); + + ev = tor_event_new(tor_libevent_get_base(), + replyqueue_get_socket(rq), EV_READ|EV_PERSIST, + replysock_readable_cb, tp); + + event_add(ev, NULL); + +#ifdef TRACK_RESPONSES + handled = bitarray_init_zero(opt_n_items); + received = bitarray_init_zero(opt_n_items); + tor_mutex_init(&bitmap_mutex); + handled_len = opt_n_items; +#endif + + for (i = 0; i < opt_n_inflight; ++i) { + if (! add_work(tp)) { + puts("Couldn't add work."); + return 1; + } + } + + { + struct timeval limit = { 30, 0 }; + tor_event_base_loopexit(tor_libevent_get_base(), &limit); + } + + event_base_loop(tor_libevent_get_base(), 0); + + if (n_sent != opt_n_items || n_received+n_successful_cancel != n_sent) { + printf("%d vs %d\n", n_sent, opt_n_items); + printf("%d+%d vs %d\n", n_received, n_successful_cancel, n_sent); + puts("FAIL"); + return 1; + } else { + puts("OK"); + return 0; + } +} + diff --git a/src/test/testing_common.c b/src/test/testing_common.c new file mode 100644 index 0000000000..d7d6dacee6 --- /dev/null +++ b/src/test/testing_common.c @@ -0,0 +1,298 @@ +/* Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2015, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/* Ordinarily defined in tor_main.c; this bit is just here to provide one + * since we're not linking to tor_main.c */ +const char tor_git_revision[] = ""; + +/** + * \file test_common.c + * \brief Common pieces to implement unit tests. + **/ + +#include "orconfig.h" +#include "or.h" +#include "config.h" +#include "rephist.h" +#include "backtrace.h" +#include "test.h" + +#include <stdio.h> +#ifdef HAVE_FCNTL_H +#include <fcntl.h> +#endif + +#ifdef _WIN32 +/* For mkdir() */ +#include <direct.h> +#else +#include <dirent.h> +#endif + +#include "or.h" + +#ifdef USE_DMALLOC +#include <dmalloc.h> +#include <openssl/crypto.h> +#include "main.h" +#endif + +/** Temporary directory (set up by setup_directory) under which we store all + * our files during testing. */ +static char temp_dir[256]; +#ifdef _WIN32 +#define pid_t int +#endif +static pid_t temp_dir_setup_in_pid = 0; + +/** Select and create the temporary directory we'll use to run our unit tests. + * Store it in <b>temp_dir</b>. Exit immediately if we can't create it. + * idempotent. */ +static void +setup_directory(void) +{ + static int is_setup = 0; + int r; + char rnd[256], rnd32[256]; + if (is_setup) return; + +/* Due to base32 limitation needs to be a multiple of 5. */ +#define RAND_PATH_BYTES 5 + crypto_rand(rnd, RAND_PATH_BYTES); + base32_encode(rnd32, sizeof(rnd32), rnd, RAND_PATH_BYTES); + +#ifdef _WIN32 + { + char buf[MAX_PATH]; + const char *tmp = buf; + const char *extra_backslash = ""; + /* If this fails, we're probably screwed anyway */ + if (!GetTempPathA(sizeof(buf),buf)) + tmp = "c:\\windows\\temp\\"; + if (strcmpend(tmp, "\\")) { + /* According to MSDN, it should be impossible for GetTempPath to give us + * an answer that doesn't end with \. But let's make sure. */ + extra_backslash = "\\"; + } + tor_snprintf(temp_dir, sizeof(temp_dir), + "%s%stor_test_%d_%s", tmp, extra_backslash, + (int)getpid(), rnd32); + r = mkdir(temp_dir); + } +#else + tor_snprintf(temp_dir, sizeof(temp_dir), "/tmp/tor_test_%d_%s", + (int) getpid(), rnd32); + r = mkdir(temp_dir, 0700); + if (!r) { + /* undo sticky bit so tests don't get confused. */ + r = chown(temp_dir, getuid(), getgid()); + } +#endif + if (r) { + fprintf(stderr, "Can't create directory %s:", temp_dir); + perror(""); + exit(1); + } + is_setup = 1; + temp_dir_setup_in_pid = getpid(); +} + +/** Return a filename relative to our testing temporary directory */ +const char * +get_fname(const char *name) +{ + static char buf[1024]; + setup_directory(); + if (!name) + return temp_dir; + tor_snprintf(buf,sizeof(buf),"%s/%s",temp_dir,name); + return buf; +} + +/* Remove a directory and all of its subdirectories */ +static void +rm_rf(const char *dir) +{ + struct stat st; + smartlist_t *elements; + + elements = tor_listdir(dir); + if (elements) { + SMARTLIST_FOREACH_BEGIN(elements, const char *, cp) { + char *tmp = NULL; + tor_asprintf(&tmp, "%s"PATH_SEPARATOR"%s", dir, cp); + if (0 == stat(tmp,&st) && (st.st_mode & S_IFDIR)) { + rm_rf(tmp); + } else { + if (unlink(tmp)) { + fprintf(stderr, "Error removing %s: %s\n", tmp, strerror(errno)); + } + } + tor_free(tmp); + } SMARTLIST_FOREACH_END(cp); + SMARTLIST_FOREACH(elements, char *, cp, tor_free(cp)); + smartlist_free(elements); + } + if (rmdir(dir)) + fprintf(stderr, "Error removing directory %s: %s\n", dir, strerror(errno)); +} + +/** Remove all files stored under the temporary directory, and the directory + * itself. Called by atexit(). */ +static void +remove_directory(void) +{ + if (getpid() != temp_dir_setup_in_pid) { + /* Only clean out the tempdir when the main process is exiting. */ + return; + } + + rm_rf(temp_dir); +} + +/** Define this if unit tests spend too much time generating public keys*/ +#undef CACHE_GENERATED_KEYS + +static crypto_pk_t *pregen_keys[5] = {NULL, NULL, NULL, NULL, NULL}; +#define N_PREGEN_KEYS ARRAY_LENGTH(pregen_keys) + +/** Generate and return a new keypair for use in unit tests. If we're using + * the key cache optimization, we might reuse keys: we only guarantee that + * keys made with distinct values for <b>idx</b> are different. The value of + * <b>idx</b> must be at least 0, and less than N_PREGEN_KEYS. */ +crypto_pk_t * +pk_generate(int idx) +{ +#ifdef CACHE_GENERATED_KEYS + tor_assert(idx < N_PREGEN_KEYS); + if (! pregen_keys[idx]) { + pregen_keys[idx] = crypto_pk_new(); + tor_assert(!crypto_pk_generate_key(pregen_keys[idx])); + } + return crypto_pk_dup_key(pregen_keys[idx]); +#else + crypto_pk_t *result; + (void) idx; + result = crypto_pk_new(); + tor_assert(!crypto_pk_generate_key(result)); + return result; +#endif +} + +/** Free all storage used for the cached key optimization. */ +static void +free_pregenerated_keys(void) +{ + unsigned idx; + for (idx = 0; idx < N_PREGEN_KEYS; ++idx) { + if (pregen_keys[idx]) { + crypto_pk_free(pregen_keys[idx]); + pregen_keys[idx] = NULL; + } + } +} + +static void * +passthrough_test_setup(const struct testcase_t *testcase) +{ + return testcase->setup_data; +} +static int +passthrough_test_cleanup(const struct testcase_t *testcase, void *ptr) +{ + (void)testcase; + (void)ptr; + return 1; +} + +const struct testcase_setup_t passthrough_setup = { + passthrough_test_setup, passthrough_test_cleanup +}; + +extern struct testgroup_t testgroups[]; + +/** Main entry point for unit test code: parse the command line, and run + * some unit tests. */ +int +main(int c, const char **v) +{ + or_options_t *options; + char *errmsg = NULL; + int i, i_out; + int loglevel = LOG_ERR; + int accel_crypto = 0; + +#ifdef USE_DMALLOC + { + int r = CRYPTO_set_mem_ex_functions(tor_malloc_, tor_realloc_, tor_free_); + tor_assert(r); + } +#endif + + update_approx_time(time(NULL)); + options = options_new(); + tor_threads_init(); + init_logging(1); + configure_backtrace_handler(get_version()); + + for (i_out = i = 1; i < c; ++i) { + if (!strcmp(v[i], "--warn")) { + loglevel = LOG_WARN; + } else if (!strcmp(v[i], "--notice")) { + loglevel = LOG_NOTICE; + } else if (!strcmp(v[i], "--info")) { + loglevel = LOG_INFO; + } else if (!strcmp(v[i], "--debug")) { + loglevel = LOG_DEBUG; + } else if (!strcmp(v[i], "--accel")) { + accel_crypto = 1; + } else { + v[i_out++] = v[i]; + } + } + c = i_out; + + { + log_severity_list_t s; + memset(&s, 0, sizeof(s)); + set_log_severity_config(loglevel, LOG_ERR, &s); + add_stream_log(&s, "", fileno(stdout)); + } + + options->command = CMD_RUN_UNITTESTS; + if (crypto_global_init(accel_crypto, NULL, NULL)) { + printf("Can't initialize crypto subsystem; exiting.\n"); + return 1; + } + crypto_set_tls_dh_prime(NULL); + crypto_seed_rng(1); + rep_hist_init(); + network_init(); + setup_directory(); + options_init(options); + options->DataDirectory = tor_strdup(temp_dir); + options->EntryStatistics = 1; + if (set_options(options, &errmsg) < 0) { + printf("Failed to set initial options: %s\n", errmsg); + tor_free(errmsg); + return 1; + } + + atexit(remove_directory); + + int have_failed = (tinytest_main(c, v, testgroups) != 0); + + free_pregenerated_keys(); +#ifdef USE_DMALLOC + tor_free_all(0); + dmalloc_log_unfreed(); +#endif + + if (have_failed) + return 1; + else + return 0; +} + diff --git a/src/test/zero_length_keys.sh b/src/test/zero_length_keys.sh new file mode 100755 index 0000000000..3a99ca1f1d --- /dev/null +++ b/src/test/zero_length_keys.sh @@ -0,0 +1,115 @@ +#!/bin/sh +# Check that tor regenerates keys when key files are zero-length +# Test for bug #13111 - Tor fails to start if onion keys are zero length +# +# Usage: +# ./zero_length_keys.sh +# Run all the tests below +# ./zero_length_keys.sh -z +# Check tor will launch and regenerate zero-length keys +# ./zero_length_keys.sh -d +# Check tor regenerates deleted keys (existing behaviour) +# ./zero_length_keys.sh -e +# Check tor does not overwrite existing keys (existing behaviour) +# +# Exit Statuses: +# -2: test failed - tor did not generate the key files on first run +# -1: a command failed - the test could not be completed +# 0: test succeeded - tor regenerated/kept the files +# 1: test failed - tor did not regenerate/keep the files +# + +if [ $# -lt 1 ]; then + echo "Testing that tor correctly handles zero-length keys" + "$0" -z && "$0" -d && "$0" -e + exit $? +fi + +export DATA_DIR=`mktemp -d -t tor_zero_length_keys.XXXXXX` +# DisableNetwork means that the ORPort won't actually be opened. +# 'ExitRelay 0' suppresses a warning. +TOR="./src/or/tor --hush --DisableNetwork 1 --ShutdownWaitLength 0 --ORPort 12345 --ExitRelay 0" + +if [ -s "$DATA_DIR"/keys/secret_id_key -a -s "$DATA_DIR"/keys/secret_onion_key -a -s "$DATA_DIR"/keys/secret_onion_key_ntor ]; then + echo "Failure: Previous tor keys present in tor data directory" + exit -1 +else + echo "Generating initial tor keys" + $TOR --DataDirectory "$DATA_DIR" --PidFile "$DATA_DIR"/pid & + TOR_PID=$! + # generate SIGTERM, hopefully after the keys have been regenerated + sleep 5 + kill $TOR_PID + wait $TOR_PID + + # tor must successfully generate non-zero-length key files + if [ -s "$DATA_DIR"/keys/secret_id_key -a -s "$DATA_DIR"/keys/secret_onion_key -a -s "$DATA_DIR"/keys/secret_onion_key_ntor ]; then + true #echo "tor generated the initial key files" + else + echo "Failure: tor failed to generate the initial key files" + exit -2 + fi +fi + +#ls -lh "$DATA_DIR"/keys/ || exit -1 + +# backup and keep/delete/create zero-length files for the keys + +FILE_DESC="keeps existing" +# make a backup +cp -r "$DATA_DIR"/keys "$DATA_DIR"/keys.old + +# delete keys for -d or -z +if [ "$1" != "-e" ]; then + FILE_DESC="regenerates deleted" + rm "$DATA_DIR"/keys/secret_id_key || exit -1 + rm "$DATA_DIR"/keys/secret_onion_key || exit -1 + rm "$DATA_DIR"/keys/secret_onion_key_ntor || exit -1 +fi + +# create empty files for -z +if [ "$1" = "-z" ]; then + FILE_DESC="regenerates zero-length" + touch "$DATA_DIR"/keys/secret_id_key || exit -1 + touch "$DATA_DIR"/keys/secret_onion_key || exit -1 + touch "$DATA_DIR"/keys/secret_onion_key_ntor || exit -1 +fi + +echo "Running tor again to check if it $FILE_DESC keys" +$TOR --DataDirectory "$DATA_DIR" --PidFile "$DATA_DIR"/pid & +TOR_PID=$! +# generate SIGTERM, hopefully after the keys have been regenerated +sleep 5 +kill $TOR_PID +wait $TOR_PID + +#ls -lh "$DATA_DIR"/keys/ || exit -1 + +# tor must always have non-zero-length key files +if [ -s "$DATA_DIR"/keys/secret_id_key -a -s "$DATA_DIR"/keys/secret_onion_key -a -s "$DATA_DIR"/keys/secret_onion_key_ntor ]; then + # check if the keys are different to the old ones + diff -q -r "$DATA_DIR"/keys "$DATA_DIR"/keys.old > /dev/null + SAME_KEYS=$? + # if we're not testing existing keys, + # the current keys should be different to the old ones + if [ "$1" != "-e" ]; then + if [ $SAME_KEYS -ne 0 ]; then + echo "Success: test that tor $FILE_DESC key files: different keys" + exit 0 + else + echo "Failure: test that tor $FILE_DESC key files: same keys" + exit 1 + fi + else #[ "$1" == "-e" ]; then + if [ $SAME_KEYS -eq 0 ]; then + echo "Success: test that tor $FILE_DESC key files: same keys" + exit 0 + else + echo "Failure: test that tor $FILE_DESC key files: different keys" + exit 1 + fi + fi +else + echo "Failure: test that tor $FILE_DESC key files: no key files" + exit 1 +fi diff --git a/src/tools/tor-checkkey.c b/src/tools/tor-checkkey.c index f6c6508c33..e404b682cf 100644 --- a/src/tools/tor-checkkey.c +++ b/src/tools/tor-checkkey.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2008-2014, The Tor Project, Inc. */ +/* Copyright (c) 2008-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" diff --git a/src/tools/tor-fw-helper/tor-fw-helper-natpmp.c b/src/tools/tor-fw-helper/tor-fw-helper-natpmp.c index 74485f9803..6369966869 100644 --- a/src/tools/tor-fw-helper/tor-fw-helper-natpmp.c +++ b/src/tools/tor-fw-helper/tor-fw-helper-natpmp.c @@ -1,5 +1,5 @@ /* Copyright (c) 2010, Jacob Appelbaum, Steven J. Murdoch. - * Copyright (c) 2010-2014, The Tor Project, Inc. */ + * Copyright (c) 2010-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/tools/tor-fw-helper/tor-fw-helper-natpmp.h b/src/tools/tor-fw-helper/tor-fw-helper-natpmp.h index 1bfebd91f9..abc5e11857 100644 --- a/src/tools/tor-fw-helper/tor-fw-helper-natpmp.h +++ b/src/tools/tor-fw-helper/tor-fw-helper-natpmp.h @@ -1,5 +1,5 @@ /* Copyright (c) 2010, Jacob Appelbaum, Steven J. Murdoch. - * Copyright (c) 2010-2014, The Tor Project, Inc. */ + * Copyright (c) 2010-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/tools/tor-fw-helper/tor-fw-helper-upnp.c b/src/tools/tor-fw-helper/tor-fw-helper-upnp.c index 59bc232dd3..e5495c906e 100644 --- a/src/tools/tor-fw-helper/tor-fw-helper-upnp.c +++ b/src/tools/tor-fw-helper/tor-fw-helper-upnp.c @@ -1,5 +1,5 @@ /* Copyright (c) 2010, Jacob Appelbaum, Steven J. Murdoch. - * Copyright (c) 2010-2014, The Tor Project, Inc. */ + * Copyright (c) 2010-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/tools/tor-fw-helper/tor-fw-helper-upnp.h b/src/tools/tor-fw-helper/tor-fw-helper-upnp.h index 9a5123e09f..bc9476eb98 100644 --- a/src/tools/tor-fw-helper/tor-fw-helper-upnp.h +++ b/src/tools/tor-fw-helper/tor-fw-helper-upnp.h @@ -1,5 +1,5 @@ /* Copyright (c) 2010, Jacob Appelbaum, Steven J. Murdoch. - * Copyright (c) 2010-2014, The Tor Project, Inc. */ + * Copyright (c) 2010-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/tools/tor-fw-helper/tor-fw-helper.c b/src/tools/tor-fw-helper/tor-fw-helper.c index 9a32b0cbe2..fdc0e1adea 100644 --- a/src/tools/tor-fw-helper/tor-fw-helper.c +++ b/src/tools/tor-fw-helper/tor-fw-helper.c @@ -1,5 +1,5 @@ /* Copyright (c) 2010, Jacob Appelbaum, Steven J. Murdoch. - * Copyright (c) 2010-2014, The Tor Project, Inc. */ + * Copyright (c) 2010-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/tools/tor-fw-helper/tor-fw-helper.h b/src/tools/tor-fw-helper/tor-fw-helper.h index 71bc11e168..4ebc75d8f7 100644 --- a/src/tools/tor-fw-helper/tor-fw-helper.h +++ b/src/tools/tor-fw-helper/tor-fw-helper.h @@ -1,5 +1,5 @@ /* Copyright (c) 2010, Jacob Appelbaum, Steven J. Murdoch. - * Copyright (c) 2010-2014, The Tor Project, Inc. */ + * Copyright (c) 2010-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/tools/tor-gencert.c b/src/tools/tor-gencert.c index f6805c1193..c599822e07 100644 --- a/src/tools/tor-gencert.c +++ b/src/tools/tor-gencert.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2007-2014, The Tor Project, Inc. */ +/* Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" diff --git a/src/tools/tor-resolve.c b/src/tools/tor-resolve.c index 6ee155ade5..04815a63f7 100644 --- a/src/tools/tor-resolve.c +++ b/src/tools/tor-resolve.c @@ -1,5 +1,5 @@ /* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson - * Copyright (c) 2007-2014, The Tor Project, Inc. + * Copyright (c) 2007-2015, The Tor Project, Inc. */ /* See LICENSE for licensing information */ @@ -108,6 +108,18 @@ build_socks_resolve_request(char **out, return len; } +static void +onion_warning(const char *hostname) +{ + log_warn(LD_NET, + "%s is a hidden service; those don't have IP addresses. " + "You can use the AutomapHostsOnResolve option to have Tor return a " + "fake address for hidden services. Or you can have your " + "application send the address to Tor directly; we recommend an " + "application that uses SOCKS 5 with hostnames.", + hostname); +} + /** Given a <b>len</b>-byte SOCKS4a response in <b>response</b>, set * *<b>addr_out</b> to the address it contains (in host order). * Return 0 on success, -1 on error. @@ -137,10 +149,7 @@ parse_socks4a_resolve_response(const char *hostname, if (status != 90) { log_warn(LD_NET,"Got status response '%d': socks request failed.", status); if (!strcasecmpend(hostname, ".onion")) { - log_warn(LD_NET, - "%s is a hidden service; those don't have IP addresses. " - "To connect to a hidden service, you need to send the hostname " - "to Tor; we suggest an application that uses SOCKS 4a.",hostname); + onion_warning(hostname); return -1; } return -1; @@ -276,11 +285,7 @@ do_resolve(const char *hostname, uint32_t sockshost, uint16_t socksport, (unsigned)reply_buf[1], socks5_reason_to_string(reply_buf[1])); if (reply_buf[1] == 4 && !strcasecmpend(hostname, ".onion")) { - log_warn(LD_NET, - "%s is a hidden service; those don't have IP addresses. " - "To connect to a hidden service, you need to send the hostname " - "to Tor; we suggest an application that uses SOCKS 4a.", - hostname); + onion_warning(hostname); } goto err; } @@ -326,8 +331,8 @@ do_resolve(const char *hostname, uint32_t sockshost, uint16_t socksport, static void usage(void) { - puts("Syntax: tor-resolve [-4] [-v] [-x] [-F] [-p port] " - "hostname [sockshost:socksport]"); + puts("Syntax: tor-resolve [-4] [-5] [-v] [-x] [-F] [-p port] " + "hostname [sockshost[:socksport]]"); exit(1); } diff --git a/src/win32/orconfig.h b/src/win32/orconfig.h index cee81b31eb..d1a5b4b3e2 100644 --- a/src/win32/orconfig.h +++ b/src/win32/orconfig.h @@ -232,7 +232,7 @@ #define USING_TWOS_COMPLEMENT /* Version number of package */ -#define VERSION "0.2.6.1-alpha-dev" +#define VERSION "0.2.6.2-alpha-dev" |