tor-commits
Threads by month
- ----- 2025 -----
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- 213386 discussions

04 Apr '11
commit fe051a43c1fc5d8528ed46deaa818031b16a79eb
Author: Jacob Appelbaum <jacob(a)appelbaum.net>
Date: Thu Mar 10 01:22:32 2011 -0800
add --enable-static-tor to our configure script
This implements the feature request in bug #2702
---
INSTALL | 39 +++++++++++++++++++++++++++++++++++++++
changes/bug2702 | 5 +++++
configure.in | 25 +++++++++++++++++++++++++
3 files changed, 69 insertions(+), 0 deletions(-)
diff --git a/INSTALL b/INSTALL
index 5da50a6..1007b43 100644
--- a/INSTALL
+++ b/INSTALL
@@ -23,3 +23,42 @@ If it doesn't build for you:
Lastly, check out
https://www.torproject.org/docs/faq#DoesntWork
+An example of how to build a mostly static Tor:
+
+Libevent should be built with:
+% ./configure --disable-shared --enable-static --with-pic
+
+An example of how to build a mostly static Tor:
+./configure --enable-static-libevent \
+ --enable-static-openssl \
+ --enable-static-zlib \
+ --with-libevent-dir=/tmp/static-tor/libevent-1.4.14b-stable \
+ --with-openssl-dir=/tmp/static-tor/openssl-0.9.8r/ \
+ --with-zlib-dir=/tmp/static-tor/zlib-1.2.5
+
+An example of how to build an entirely static Tor (no Mac OS X support, sorry):
+./configure --enable-static-tor \
+ --enable-static-libevent \
+ --enable-static-openssl \
+ --enable-static-zlib \
+ --with-libevent-dir=/tmp/static-tor/libevent-1.4.14b-stable \
+ --with-openssl-dir=/tmp/static-tor/openssl-0.9.8r/ \
+ --with-zlib-dir=/tmp/static-tor/zlib-1.2.5
+
+This currently does not work with --enable-gcc-hardening because of libevent issues:
+
+configure:6176: gcc -o conftest -D_FORTIFY_SOURCE=2 -fstack-protector-all -fwrapv -fPIE -Wstack-protector
+--param ssp-buffer-size=1 -I/tmp/static-tor/libevent-1.4.14b-stable -I${top_srcdir}/src/common -
+L/tmp/static-tor/libevent-1.4.14b-stable -pie conftest.c -lpthread -ldl -levent -lrt >&5
+/usr/bin/ld: /tmp/static-tor/libevent-1.4.14b-stable/libevent.a(event.o): relocation R_X86_64_32 against `.rodata.str1.1' can not be used when making a shared object; recompile with -fPIC
+/tmp/static-tor/libevent-1.4.14b-stable/libevent.a: could not read symbols: Bad value
+ collect2: ld returned 1 exit status
+ configure:6176: $? = 1
+
+This produces the following Tor binaries on Gnu/Linux x86-64:
+
+% file src/or/tor
+src/or/tor: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, for GNU/Linux 2.6.15, not stripped
+
+% ldd src/or/tor
+ not a dynamic executable
diff --git a/changes/bug2702 b/changes/bug2702
new file mode 100644
index 0000000..cd004f5
--- /dev/null
+++ b/changes/bug2702
@@ -0,0 +1,5 @@
+ o Minor enhancement
+ - Implements --enable-static-tor for configure time. Closes bug 2702.
+ Idea, general hackery and thoughts from Alexei Czeskis, John Gilmore,
+ Jacob Appelbaum.
+
diff --git a/configure.in b/configure.in
index 83fd044..f7875df 100644
--- a/configure.in
+++ b/configure.in
@@ -32,6 +32,17 @@ AC_ARG_ENABLE(static-libevent,
AS_HELP_STRING(--enable-static-libevent, Link against a static libevent library. Requires --with-libevent-dir))
AC_ARG_ENABLE(static-zlib,
AS_HELP_STRING(--enable-static-zlib, Link against a static zlib library. Requires --with-zlib-dir))
+AC_ARG_ENABLE(static-tor,
+ AS_HELP_STRING(--enable-static-tor, Create an entirely static Tor binary. Requires --static-openssl
+ --static-libevent and --static-zlib))
+
+if test "$enable_static_tor" = "yes"; then
+ enable_static_libevent="yes";
+ enable_static_openssl="yes";
+ enable_static_zlib="yes";
+ AC_MSG_NOTICE("We're attempting to build a static Tor.")
+ CFLAGS="$CFLAGS -static"
+fi
if test x$enable_buf_freelists != xno; then
AC_DEFINE(ENABLE_BUF_FREELISTS, 1,
@@ -516,6 +527,20 @@ else
fi
AC_SUBST(TOR_ZLIB_LIBS)
+if test "$enable_static_tor" = "yes"; then
+ if test "$enable_static_libevent" = "no"; then
+ AC_MSG_ERROR("You must configure with --enable-static-libevent")
+ fi
+ if test "$enable_static_openssl" = "no"; then
+ AC_MSG_ERROR("You must configure with --enable-static-openssl")
+ fi
+ if test "$enable_static_zlib" = "no"; then
+ AC_MSG_ERROR("You must configure with --enable-static-zlib")
+ fi
+ AC_MSG_NOTICE("We're attempting to build a static Tor.")
+ CFLAGS="$CFLAGS -static"
+fi
+
dnl Make sure to enable support for large off_t if available.
1
0
commit ad1ae44154b023be76ce19278c3a18a3f1961055
Author: Nick Mathewson <nickm(a)torproject.org>
Date: Mon Apr 4 15:35:16 2011 -0400
Changes file for static-work branch
---
changes/static-flag | 4 ++++
1 files changed, 4 insertions(+), 0 deletions(-)
diff --git a/changes/static-flag b/changes/static-flag
new file mode 100644
index 0000000..2cf9e10
--- /dev/null
+++ b/changes/static-flag
@@ -0,0 +1,4 @@
+ o Minor features
+ - New "--enable-static-tor" configuration flag to try to build Tor
+ to link statically against as much as possible. Doesn't work on
+ all platforms.
1
0
commit 3cf23be712cad5537a77029e63895154c1c900ea
Merge: 1587e0d ad1ae44
Author: Nick Mathewson <nickm(a)torproject.org>
Date: Mon Apr 4 15:35:23 2011 -0400
Merge branch 'static-work'
INSTALL | 27 +++++++++++++++++++++++++++
changes/bug2702 | 5 +++++
changes/static-flag | 4 ++++
configure.in | 9 +++++++++
4 files changed, 45 insertions(+), 0 deletions(-)
1
0

r24556: {arm} Other version bumps for arm release. (in arm: resources resources/build/debian trunk trunk/src)
by Damian Johnson 04 Apr '11
by Damian Johnson 04 Apr '11
04 Apr '11
Author: atagar
Date: 2011-04-04 15:28:03 +0000 (Mon, 04 Apr 2011)
New Revision: 24556
Modified:
arm/resources/build/debian/changelog
arm/resources/deb-prep.sh
arm/trunk/ChangeLog
arm/trunk/src/version.py
Log:
Other version bumps for arm release.
Modified: arm/resources/build/debian/changelog
===================================================================
--- arm/resources/build/debian/changelog 2011-04-04 15:22:31 UTC (rev 24555)
+++ arm/resources/build/debian/changelog 2011-04-04 15:28:03 UTC (rev 24556)
@@ -1,3 +1,9 @@
+tor-arm (1.4.2.0-1) unstable; urgency=low
+
+ * Upstream release 1.4.2.0.
+
+ -- Damian Johnson <atagar(a)torproject.org> Sat, 4 Apr 2011 1:30:43 -0700
+
tor-arm (1.4.1.2-1) unstable; urgency=low
* Upstream release 1.4.1.2.
Modified: arm/resources/deb-prep.sh
===================================================================
--- arm/resources/deb-prep.sh 2011-04-04 15:22:31 UTC (rev 24555)
+++ arm/resources/deb-prep.sh 2011-04-04 15:28:03 UTC (rev 24556)
@@ -19,6 +19,6 @@
# /usr/share/doc/arm/armrc.sample -> /usr/share/doc/tor-arm/armrc.sample.gz
sed -i 's/\/usr\/share\/doc\/arm\/armrc.sample/\/usr\/share\/doc\/tor-arm\/armrc.sample.gz/g' release_deb/arm.1
-tar czf tor-arm_1.4.1.2.orig.tar.gz release_deb
+tar czf tor-arm_1.4.2.0.orig.tar.gz release_deb
svn export resources/build/debian release_deb/debian
Modified: arm/trunk/ChangeLog
===================================================================
--- arm/trunk/ChangeLog 2011-04-04 15:22:31 UTC (rev 24555)
+++ arm/trunk/ChangeLog 2011-04-04 15:28:03 UTC (rev 24556)
@@ -1,6 +1,6 @@
CHANGE LOG
-4/4/11 - version 1.4.2
+4/4/11 - version 1.4.2 (r24555)
This release chiefly consists of a fully reimplemented connection panel. Besides being a sane, maintainable implementation this includes numerous new features and improvements like full circuit paths, applications involved for local connections, and better type identification.
* added: full rewrite of the connection panel, providing:
Modified: arm/trunk/src/version.py
===================================================================
--- arm/trunk/src/version.py 2011-04-04 15:22:31 UTC (rev 24555)
+++ arm/trunk/src/version.py 2011-04-04 15:28:03 UTC (rev 24556)
@@ -2,6 +2,6 @@
Provides arm's version and release date.
"""
-VERSION = '1.4.2_dev'
-LAST_MODIFIED = "January 7, 2011"
+VERSION = '1.4.3_dev'
+LAST_MODIFIED = "April 4, 2011"
1
0

r24555: {arm} Arm version 1.4.2 release. (in arm/release: . src src/interface src/interface/connections src/interface/graphing src/util)
by Damian Johnson 04 Apr '11
by Damian Johnson 04 Apr '11
04 Apr '11
Author: atagar
Date: 2011-04-04 15:22:31 +0000 (Mon, 04 Apr 2011)
New Revision: 24555
Added:
arm/release/src/interface/connections/
arm/release/src/interface/connections/__init__.py
arm/release/src/interface/connections/circEntry.py
arm/release/src/interface/connections/connEntry.py
arm/release/src/interface/connections/connPanel.py
arm/release/src/interface/connections/entries.py
arm/release/src/util/enum.py
Removed:
arm/release/TODO
arm/release/src/interface/connections/__init__.py
arm/release/src/interface/connections/circEntry.py
arm/release/src/interface/connections/connEntry.py
arm/release/src/interface/connections/connPanel.py
arm/release/src/interface/connections/entries.py
Modified:
arm/release/
arm/release/ChangeLog
arm/release/README
arm/release/armrc.sample
arm/release/src/interface/configPanel.py
arm/release/src/interface/connPanel.py
arm/release/src/interface/controller.py
arm/release/src/interface/descriptorPopup.py
arm/release/src/interface/graphing/__init__.py
arm/release/src/interface/graphing/bandwidthStats.py
arm/release/src/interface/graphing/connStats.py
arm/release/src/interface/graphing/graphPanel.py
arm/release/src/interface/headerPanel.py
arm/release/src/interface/logPanel.py
arm/release/src/interface/torrcPanel.py
arm/release/src/settings.cfg
arm/release/src/starter.py
arm/release/src/test.py
arm/release/src/util/__init__.py
arm/release/src/util/conf.py
arm/release/src/util/connections.py
arm/release/src/util/log.py
arm/release/src/util/panel.py
arm/release/src/util/procTools.py
arm/release/src/util/sysTools.py
arm/release/src/util/torConfig.py
arm/release/src/util/torTools.py
arm/release/src/util/uiTools.py
arm/release/src/version.py
Log:
Arm version 1.4.2 release.
Property changes on: arm/release
___________________________________________________________________
Modified: svn:mergeinfo
- /arm/trunk:22227-24074
+ /arm/trunk:22227-24554
Modified: arm/release/ChangeLog
===================================================================
--- arm/release/ChangeLog 2011-04-04 15:15:20 UTC (rev 24554)
+++ arm/release/ChangeLog 2011-04-04 15:22:31 UTC (rev 24555)
@@ -1,5 +1,53 @@
CHANGE LOG
+4/4/11 - version 1.4.2
+This release chiefly consists of a fully reimplemented connection panel. Besides being a sane, maintainable implementation this includes numerous new features and improvements like full circuit paths, applications involved for local connections, and better type identification.
+
+ * added: full rewrite of the connection panel, providing:
+ o listing the full paths involved in active circuits
+ o identification of socks, hidden service, and controller applications (arm, vidalia, polipo, etc)
+ o identification of exit connections with the common usage for the port they're using
+ o display of the local -> internal -> external address when room is available (original patch by Fabian Keil)
+ o better accuracy and performance in identifying client and directory connections
+ o marking the uptimes for initial connections (arm only tracks connection uptimes since starting, so these entries are just minimum durations)
+ o lazily loading the initial IP -> fingerprint mappings to improve the startup time
+ o using the circuit-status to disambiguating multiple relays on the same IP address
+ o smarter space utilization, filling in smaller columns if there isn't room for higher priority but larger entries
+ o connection details popup changes:
+ + using the consensus exit policies rather than the longer descriptor versions when available
+ + displaying connection details no longer freezes the rest of the display
+ + detail panel uses the full screen width and is dynamically resizable
+ + more resilient to missing descriptors
+ * change: hiding most tor config values by default (idea by arma)
+ * change: dropping warning suggesting that users set the FetchUselessDescriptors option (suggestion by Sebastian and others)
+ * change: always starting the bandwidth field from zero rather than using the state file total, which only contains the last day's worth of data (thanks to guilhem)
+ * change: suggesting authentication and giving steps for it in the readme (suggestion by Sebastian)
+ * change: caching config display lines, which reduces the CPU usage when scrolling by around 40%
+ * change: added summaries for the remaining tor configuration options
+ * change: using a dedicated enum class rather than tuple sets
+ * fix: torrc validation requires 'GETINFO config-text' which was introduced in Tor verison 0.2.2.7 (caught by Sjon, talion, and torland, https://trac.torproject.org/projects/tor/ticket/2501)
+ * fix: off-by-one issue with the displayed line numbers for torrc errors (caught by Sjon)
+ * fix: bin function wasn't available before python 2.6 (caught by Paul Menzel)
+ * fix: mis-parsing family entries when there's no entry after the comma (caught by StrangeCharm, https://trac.torproject.org/projects/tor/ticket/2414)
+ * fix: preventing SOCKS and CONTROL connections from being expanded (patch by Fabian Keil)
+ * fix: disabling name resolution for application queries to avoid leaking to resolvers (patch by Fabian Keil)
+ * fix: reversing src and dst addresses of SOCKS and CONTROL connections (caught by Fabian Keil)
+ * fix: changing the 'APPLICATION' type to 'SOCKS' since the previous label was too long (caught by Fabian Keil)
+ * fix: crashing issue from unknown relay nicknames (caught by krkhan)
+ * fix: concurrency bug occasionally causing "syshook" stacktraces when shutting down
+ * fix: header panel displayed the wrong IP address if it changed since we first started (https://trac.torproject.org/projects/tor/ticket/2776)
+ * fix: unchecked OSError could cause us to crash when making directories (for instance if there was a permissions issue)
+ * fix: the availability check for bsd resolvers was broken, probably causing resolution to fail for a few seconds on that platform
+ * fix: dropping the pointless 'Log notice stdout' entry provided by config-text queries (https://trac.torproject.org/projects/tor/ticket/2362)
+ * fix: taking DirServer and AlternateDirAuthority into account when determining the directory authorities
+ * fix: consuming a little extra space in the connection panel when scrollbars aren't visible
+ * fix: dropping the deprecated 'features.config.descriptions.persistPath' config option
+ * fix: failed connection attempts to the control port were generating zombie connections (https://trac.torproject.org/projects/tor/ticket/2812)
+ * fix: concurrency bug in joining on the TorCtl thread when tor shut down
+ * fix: the 'startup.dataDirectory' config option was being ignored
+ * fix: recognizing the proper private ip ranges of the 172.* block
+ * fix: missing 'is default' option from config sort ordering
+
1/7/11 - version 1.4.1 (r24054)
Platform specific enhancements including BSD compatibility and vastly improved performance on Linux.
Modified: arm/release/README
===================================================================
--- arm/release/README 2011-04-04 15:15:20 UTC (rev 24554)
+++ arm/release/README 2011-04-04 15:22:31 UTC (rev 24555)
@@ -25,6 +25,22 @@
... starting Tor with '--controlport <PORT>'
... or including 'ControlPort <PORT>' in your torrc
+It's also highly suggested for the control port to require authentication.
+This can be done either with a cookie or password:
+ * Cookie Authentication - Controllers authenticate to Tor by providing the
+ contents of the control_auth_cookie file. To set this up...
+ - add "CookieAuthentication 1" to your torrc
+ - either restart Tor or run "pkill -sighup tor"
+ - this method of authentication is automatically handled by arm, so you
+ can still start arm as you normally would
+
+ * Password Authentication - Attaching to the control port requires a
+ password. To set this up...
+ - run "tor --hash-password <your password>"
+ - add "HashedControlPassword <hashed password>" to your torrc
+ - either restart Tor or run "pkill -sighup tor"
+ - when starting up arm will prompt you for this password
+
For full functionality this also needs:
- To be ran with the same user as tor to avoid permission issues with
connection resolution and reading the torrc.
@@ -111,7 +127,6 @@
ChangeLog - revision history
LICENSE - copy of the gpl v3
README - um... guess you figured this one out
- TODO - known issues, future plans, etc
setup.py - distutils installation script for arm
src/
@@ -125,6 +140,13 @@
uninstall - removal script
interface/
+ connections/
+ __init__.py
+ connPanel.py - (page 2) lists the active tor connections
+ circEntry.py - circuit entries in the connection panel
+ connEntry.py - individual connections to or from the system
+ entries.py - common parent for connPanel display entries
+
graphing/
__init__.py
graphPanel.py - (page 1) presents graphs for data instances
@@ -139,7 +161,7 @@
logPanel.py - (page 1) displays tor, arm, and torctl events
fileDescriptorPopup.py - (popup) displays file descriptors used by tor
- connPanel.py - (page 2) displays information on tor connections
+ connPanel.py - (page 2) deprecated counterpart for connections/*
descriptorPopup.py - (popup) displays connection descriptor data
configPanel.py - (page 3) editor panel for the tor configuration
@@ -149,6 +171,7 @@
__init__.py
conf.py - loading and persistence for user configuration
connections.py - service providing periodic connection lookups
+ enum.py - enumerations for ordered collections
hostnames.py - service providing nonblocking reverse dns lookups
log.py - aggregator for application events
panel.py - wrapper for safely working with curses subwindows
Deleted: arm/release/TODO
===================================================================
--- arm/release/TODO 2011-04-04 15:15:20 UTC (rev 24554)
+++ arm/release/TODO 2011-04-04 15:22:31 UTC (rev 24555)
@@ -1,281 +0,0 @@
-TODO
-
-- Roadmap and completed work for next release (1.4.2)
- [ ] refactor panels
- Currently the interface is a bit of a rat's nest (especially the
- controller). The goal is to use better modularization to both simplify
- the codebase and make it possible to use smarter caching to improve
- performance (far too much is done in the ui logic). This work is in
- progress - /init and /util are done and /interface is partly done. Known
- bugs are being fixed while refactoring.
-
- * conn panel
- - expand client connections and note location in circuit (entry-exit)
- - for clients give an option to list all connections, to tell which are
- going through tor and which might be leaking
- - check family members to see if they're alive (VERSION cell
- handshake?)
- - fallback when pid or connection querying via pid is unavailable
- List all connections listed both by netstat and the consensus
- - note when connection times are estimates (color?), ie connection
- was established before arm
- - connection uptime to associate inbound/outbound connections?
- - identify controller connections (if it's arm, vidalia, etc) with
- special detail page for them
- - provide bridge / client country / exiting port statistics
- Include bridge related data via GETINFO option (feature request
- by waltman and ioerror).
- - note the common port usage along with the exit statistics
- - show the port used in scrubbed exit connections
- - pick apart applications like iftop and pktstat to see how they get
- per-connection bandwidth usage. Forum thread discussing it:
- https://bbs.archlinux.org/viewtopic.php?pid=715906
- - include an option to show both the internal and external ips for the
- local connection, ie:
- myInternal --> myExternal --> foreign
- idea and initial patch by Fabian Keil
- - give a warning if family relays don't name us
- * classify config options as useful (defaultly shown), standard, and
- deprecated (configured to be hidden by default)
- * check tor source for deprecated options like 'group' (are they
- ignored? idea is thanks to NightMonkey)
- * elaborate on the password prompt (suggestion by weasel)
- * release prep
- * pylint --indent-string=" " --disable=C,R interface/foo.py | less
- * double check __init__.py and README for added or removed files
- * wait a week, then bump package versions
- * Debian
- Contact: weasel (Peter Palfrader)
- Initial Release: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=603056
- Update Instructions:
- * TBD
-
- * Gentoo
- Contact: NightMonkey (Jesse Adelman)
- Initial Release: https://bugs.gentoo.org/show_bug.cgi?id=341731
- Update Instructions:
- * go to https://bugs.gentoo.org
- * make a generic bug with "net-misc/arm-X.X.X version bump, please"
-
- * ArchLinux
- Contact: Spider.007
- Initial Release: http://aur.archlinux.org/packages.php?ID=44172
- Update Instructions:
- * go to aur.archlinux.org
- * select "Out-of-date" for the package
-
-- Roadmap for version 1.4.3
- [ ] refactor panels
- [ ] controller and popup panels
- [ ] attempt to clear controller password from memory
- - http://www.codexon.com/posts/clearing-passwords-in-memory-with-python
- * release prep
- * pylint --indent-string=" " --disable=C,R interface/foo.py | less
- * double check __init__.py and README for changes
-
-- Roadmap for version 1.3.9
- [ ] refactor panels
- [ ] controller and popup panels
- - allow arm to resume after restarting tor
- This requires a full move to the torTools controller.
- - improve on performance bottlenecks for startup time and cpu usage
- - intermittent concurrency bugs during shutdown, one possible source:
- https://trac.torproject.org/projects/tor/ticket/2144
- [ ] setup scripts for arm
- [ ] updater (checks for a new tarball and installs it automatically)
- - attempt to verify download signature, providing a warning if unable
- to do so
- [ ] look into CAPs to get around permission issues for connection
- listing sudo wrapper for arm to help arm run as the same user as
- tor? Irc suggestions:
- - man capabilities
- - http://www.linuxjournal.com/article/5737
-
-- Bugs
- * The default resolver isn't configurable.
- * When saving the config the Log entry should be filtered out if unnecessary.
- * The config write dialog (ie, the one for saving the config) has its a
- misaligned border when it's smaller than the top detail section.
- * The arm header panel doesn't properly reflect when the ip address
- changes. This provides a notice event saying:
- "Our IP Address has changed from X to Y; rebuilding descriptor (source Z)."
- * The cpu usage spikes for scrollable content when the key's held. Try
- coalescing the events.
- * The manpage layout is system dependent, so the scraper needs to be more
- resilient against being confused by whitespace. Another improvement is
- including fallback results if the man page can't be parsed (suggested by
- rransom, issue caught by NightMonkey).
- * Log deduplication is currently an n^2 operation. Hence it can't handle
- large logs (for instance, when at the DEBUG runlevel). Currently we're
- timing out the function if it takes too long, but a more efficient method
- for deduplication would be preferable.
- * when in client mode and tor stops the header panel doesn't say so
- * util/torTools.py: effective bandwidth rate/burst measurements don't take
- SETCONF into consideration, blocked on:
- https://trac.torproject.org/projects/tor/ticket/1692
- * log prepopulation fails to limit entries to the current tor instance if
- the file isn't logged to at the NOTICE level. A fix is to use the
- timestamps to see if it belongs to this tor instance. This requires
- tor's uptime - blocked on implementation of the following proposal:
- https://gitweb.torproject.org/tor.git/blob/HEAD:/doc/spec/proposals/173-get…
- * the STATUS_SERVER event may not be supported
- 18:52 < mikeperry> atagar: I believe there is no event parsing for STATUS_SERVER
- 18:53 < mikeperry> atagar: see TorCtl.EventSink and classes that inherit from it
- 18:54 < mikeperry> specifically, TorCtl.EventHandler._decode1, _handle1, and _map1
-
- * conn panel:
- * *never* do reverse dns lookups for first hops (could be resolving via
- tor and hence leaking to the exit)
- * If there's duplicate family entries (and harder case: both nickname and
- fingerprint entries for the same relay) then the duplicate should be
- removed. This is also causing a bad scrolling bug where the cursor can't
- get past the pair of duplicate entries.
- * revise multikey sort of connections
- Currently using a pretty ugly hack. Look at:
- http://www.velocityreviews.com/forums/
- t356461-sorting-a-list-of-objects-by-multiple-attributes.html
- and check for performance difference.
- * replace checks against exit policy with Mike's torctl version
- My version still isn't handling all inputs anyway (still need to handle
- masks, private keyword, and prepended policy). Parse it from the rest
- of the router if too heavy ("TorCtl.Router.will_exit_to instead").
- * avoid hostname lookups of private connections
- Stripped most of them but suspect there might be others (have assertions
- check for this in a debug mode?)
- * connection uptimes shouldn't show fractions of a second
- * connections aren't cleared when control port closes
-
-- Packaging
- * OpenWrt - OpenWrt uses the opkg packaging format which could make use of
- arm's current deb packages. Packaging for this platform would help with
- the Torouter project:
- https://trac.torproject.org/projects/tor/wiki/TheOnionRouter/Torouter
- * Mac - Couple of options include macport and dmg...
- * macport (http://guide.macports.org/#development)
- Build-from-source distribution method (like BSD portinstall). This has
- been suggested by several people.
-
- * dmg (http://en.wikipedia.org/wiki/Apple_Disk_Image)
- Most conventional method of software distribution on mac. This is just
- a container (no updating/removal support), but could contain an icon
- for the dock that starts a terminal with arm. This might include a pkg
- installer.
-
- * mpkg (http://pypi.python.org/pypi/bdist_mpkg/)
- Plugin for distutils. Like most mac packaging, this can only run on a
- mac. It also requires setuptools:
- http://www.errorhelp.com/search/details/74034/importerror-no-module-named-s…
-
-- Future Features
- * client mode use cases
- * not sure what sort of information would be useful in the header (to
- replace the orport, fingerprint, flags, etc)
- * one idea by velope:
- "whether you configured a dnsport, transport, etc. and whether they
- were successfully opened. might be nice to know this after the log
- messages might be gone."
- [notice] Opening Socks listener on 127.0.0.1:9050
- [notice] Opening Transparent pf/netfilter listener on 127.0.0.1:9040
- [notice] Opening DNS listener on 127.0.0.1:53
- * rdns and whois lookups (to find ISP, country, and jurisdiction, etc)
- To avoid disclosing connection data to third parties this needs to be
- an all-or-nothing operation (ie, needs to fetch information on all
- relays or none of them). Plan is something like:
- * add resolving/caching capabilities to fetch information on all relays
- and distil whois entries to just what we care about (hosting provider
- or ISP), by default updating the cache on a daily basis
- * construct tarball and make this available for download rather than
- fetching everything at each client
- * possibly make these archives downloadable from peer relays (this is a
- no-go for clients) via torrents or some dirport like scheme
- * look at Vidalia and TorK for ideas
- * need to solicit for ideas on what would be most helpful to clients
- * dialog with bridge statuses (idea by mikeperry)
- https://trac.vidalia-project.net/ticket/570
- https://trac.torproject.org/projects/tor/ticket/2068
- * menus
- * http://gnosis.cx/publish/programming/charming_python_6.html ?
- * additional options:
- * make update rates configurable via the ui
- * dialog with flag descriptions and other help
- * menu with all torrc options (making them editable/toggleable)
- * control port interpreter (interactive prompt)
- Panel and startup option (-t maybe?) for providing raw control port
- access along with usability improvements (piggybacking on the arm
- connection):
- * irc like help (ex "/help GETINFO" could provide a summary of
- getinfo commands, partly using the results from
- "GETINFO info/names")
- * tab completion and up/down for previous commands
- * warn and get confirmation if command would disrupt arm (for
- instance 'SETEVENTS')
- * 'safe' option that restricts to read-only access (start with this)
- * issue sighup reset
- * make use of the new process/* GETINFO options
- They'll be available in the next tor release, as per:
- https://trac.torproject.org/projects/tor/ticket/2291
- * feature parity for arm's config values (armrc entries)
- * editability
- * parse descriptions from the man page? autogeneration of the man page from
- something storing the descriptions
- * handle mutiple tor instances
- * screen style (dialog for switching between instances)
- * extra window with whatever stats can be aggregated over all instances,
- or a config option to aggregate stats for bw, resource usage, etc
- * option to save the current settings to the config
- * provide warning at startup if the armrc doesn't exist, with instructions
- for generating it
- * email alerts for changes to the relay's status, similar to tor-weather
- * simple alert if tor shuts down
- * accounting and alerts for if the bandwidth drops to zero
- * daily/weekly/etc alerts for basic status (log output, bandwidth history,
- etc), borrowing from the consensus tracker for some of the formatting
- * tab completion for input fields that expect a filesystem path
- * look through vidalia's tickets for more ideas
- https://trac.vidalia-project.net/
- * look into additions to the used apis
- * curses (python 2.6 extended?): http://docs.python.org/library/curses.html
- * new control options (like "desc-annotations/id/<OR identity>")?
- * look into better supporting hidden services (what could be useful here?)
- * provide option for a consensus page
- Shows full consensus with an interface similar to the connection panel.
- For this Mike's ConsensusTracker would be helpful (though boost the
- startup time by several seconds)
- * show qos stats
- Take a look at 'linux-tor-prio.sh' to see if any of the stats are
- available and interesting.
- * escaping function for uiTools' formatted strings
- * switch check of ip address validity to regex?
- match = re.match("(\d*)\.(\d*)\.(\d*)\.(\d*)", ip)
- http://wang.yuxuan.org/blog/2009/4/2/python_script_to_convert_from_ip_range…
- * setup wizard for new relays
- Setting the password and such for torrc generation. Maybe a netinstaller
- that fetches the right package for the plagform, verifies signatures, etc?
- Another alternative would be that when arm is started and tor isn't
- running offer to start tor as a client, relay, or bridge. (idea by ioerror)
- * audit what tor does
- * Provide warnings if tor connections misbehaves, for instance:
- * ensuring ExitPolicyRejectPrivate is being obeyed
- * check that ExitPolicy violations don't occur (not possible yet since
- not all relays aren't identified)
- * check that all connections are properly related to a circuit, for
- instance no outbound connections without a corresponding inbound (not
- possible yet due to being unable to correlate connections to circuits)
- * check file descriptors being accessed by tor to see if they're outside a
- known pattern
- * script that dumps relay stats to stdout
- Derived from an idea by StrangeCharm. Django has a small terminal coloring
- module that could be nice for formatting. Could possibly include:
- * desc / ns information for our relay
- * ps / netstat stats like load, uptime, and connection counts, etc
- * implement control-spec proposals:
- * https://gitweb.torproject.org/tor.git/blob/HEAD:/doc/spec/proposals/172-cir…
- * https://gitweb.torproject.org/tor.git/blob/HEAD:/doc/spec/proposals/173-get…
- * gui frontend (gtk?)
- Look into if the arm utilities and codebase would fit nicely for a gui
- controller like Vidalia and TorK.
- * unit tests
- Primarily for util, for instance 'addfstr' would be a good candidate.
- * python 3 compatibility
- Currently blocked on TorCtl support.
-
Modified: arm/release/armrc.sample
===================================================================
--- arm/release/armrc.sample 2011-04-04 15:15:20 UTC (rev 24554)
+++ arm/release/armrc.sample 2011-04-04 15:22:31 UTC (rev 24555)
@@ -62,12 +62,11 @@
# Paremters for the config panel
# ---------------------------
-# type
-# 0 -> tor state, 1 -> torrc, 2 -> arm state, 3 -> armrc
# order
# three comma separated configuration attributes, options including:
-# 0 -> Category, 1 -> Option Name, 2 -> Value, 3 -> Arg Type,
-# 4 -> Arg Usage, 5 -> Description, 6 -> Man Entry, 7 -> Is Default
+# 0 -> Category, 1 -> Option Name, 2 -> Value, 3 -> Arg Type,
+# 4 -> Arg Usage, 5 -> Summary, 6 -> Description, 7 -> Man Entry,
+# 8 -> Is Default
# selectionDetails.height
# rows of data for the panel showing details on the current selection, this
# is disabled entirely if zero
@@ -87,12 +86,11 @@
# file.maxLinesPerEntry
# max number of lines to display for a single entry in the torrc
-features.config.type 0
-features.config.order 0, 6, 7
+features.config.order 7, 1, 8
features.config.selectionDetails.height 6
features.config.prepopulateEditValues true
features.config.state.colWidth.option 25
-features.config.state.colWidth.value 10
+features.config.state.colWidth.value 15
features.config.state.showPrivateOptions false
features.config.state.showVirtualOptions false
features.config.file.showScrollbars true
@@ -104,12 +102,11 @@
# ---------------------------
# enabled
# allows the descriptions to be fetched from the man page if true
-# persistPath
-# location descriptions should be loaded from and saved to (this feature is
-# disabled if unset)
+# persist
+# caches the descriptions (substantially saving on future startup times)
features.config.descriptions.enabled true
-features.config.descriptions.persistPath /tmp/arm/torConfigDescriptions.txt
+features.config.descriptions.persist true
# General graph parameters
# ------------------------
@@ -139,6 +136,9 @@
# prepopulate
# attempts to use tor's state file to prepopulate the bandwidth graph at the
# 15-minute interval (this requires the minimum of a day's worth of uptime)
+# prepopulateTotal
+# populates the total stat from the state file if true (this only contains
+# the last day's worth of information, so this metric isn't the true total)
# transferInBystes
# shows rate measurments in bytes if true, bits otherwise
# accounting.show
@@ -149,11 +149,57 @@
# provides verbose measurements of time if true
features.graph.bw.prepopulate true
+features.graph.bw.prepopulateTotal false
features.graph.bw.transferInBytes false
features.graph.bw.accounting.show true
features.graph.bw.accounting.rate 10
features.graph.bw.accounting.isTimeLong false
+# Parameters for connection display
+# ---------------------------------
+# oldPanel
+# includes the old connection panel in the interface
+# newPanel
+# includes the new connection panel in the interface
+# listingType
+# the primary category of information shown by default, options including:
+# 0 -> IP Address / Port 1 -> Hostname
+# 2 -> Fingerprint 3 -> Nickname
+# order
+# three comma separated configuration attributes, options including:
+# 0 -> Category, 1 -> Uptime, 2 -> Listing, 3 -> IP Address,
+# 4 -> Port, 5 -> Hostname, 6 -> Fingerprint, 7 -> Nickname,
+# 8 -> Country
+# refreshRate
+# rate at which the connection panel contents is redrawn (if higher than the
+# connection resolution rate then reducing this won't casue new data to
+# appear more frequently - just increase the rate at which the uptime field
+# is updated)
+# resolveApps
+# issues lsof queries to determining the applications involved in local
+# SOCKS and CONTROL connections
+# markInitialConnections
+# if true, the uptime of the initial connections when we start are marked
+# with a '+' (these uptimes are estimates since arm can only track a
+# connection's duration while it runs)
+# showExitPort
+# shows port related information of exit connections we relay if true
+# showColumn.*
+# toggles the visability of the connection table columns
+
+features.connection.oldPanel false
+features.connection.newPanel true
+features.connection.listingType 0
+features.connection.order 0, 2, 1
+features.connection.refreshRate 5
+features.connection.resolveApps true
+features.connection.markInitialConnections true
+features.connection.showExitPort true
+features.connection.showColumn.fingerprint true
+features.connection.showColumn.nickname true
+features.connection.showColumn.destination true
+features.connection.showColumn.expandedIp true
+
# Thread pool size for hostname resolutions
# Determines the maximum number of concurrent requests. Upping this to around
# thirty or so seems to be problematic, causing intermittently seizing.
@@ -187,6 +233,7 @@
log.torGetInfo DEBUG
log.torGetInfoCache NONE
log.torGetConf DEBUG
+log.torGetConfCache NONE
log.torSetConf INFO
log.torEventTypeUnrecognized NOTICE
log.torPrefixPathInvalid NOTICE
@@ -224,6 +271,7 @@
log.cursesColorSupport INFO
log.bsdJailFound INFO
log.unknownBsdJailId WARN
+log.geoipUnavailable WARN
log.stats.failedProcResolution DEBUG
log.stats.procResolutionFailover INFO
log.stats.failedPsResolution INFO
Modified: arm/release/src/interface/configPanel.py
===================================================================
--- arm/release/src/interface/configPanel.py 2011-04-04 15:15:20 UTC (rev 24554)
+++ arm/release/src/interface/configPanel.py 2011-04-04 15:22:31 UTC (rev 24555)
@@ -6,65 +6,76 @@
import curses
import threading
-from util import conf, panel, torTools, torConfig, uiTools
+from util import conf, enum, panel, torTools, torConfig, uiTools
DEFAULT_CONFIG = {"features.config.selectionDetails.height": 6,
"features.config.state.showPrivateOptions": False,
"features.config.state.showVirtualOptions": False,
"features.config.state.colWidth.option": 25,
- "features.config.state.colWidth.value": 10}
+ "features.config.state.colWidth.value": 15}
# TODO: The arm use cases are incomplete since they currently can't be
# modified, have their descriptions fetched, or even get a complete listing
# of what's available.
-TOR_STATE, ARM_STATE = range(1, 3) # state to be presented
+State = enum.Enum("TOR", "ARM") # state to be presented
# mappings of option categories to the color for their entries
-CATEGORY_COLOR = {torConfig.GENERAL: "green",
- torConfig.CLIENT: "blue",
- torConfig.SERVER: "yellow",
- torConfig.DIRECTORY: "magenta",
- torConfig.AUTHORITY: "red",
- torConfig.HIDDEN_SERVICE: "cyan",
- torConfig.TESTING: "white",
- torConfig.UNKNOWN: "white"}
+CATEGORY_COLOR = {torConfig.Category.GENERAL: "green",
+ torConfig.Category.CLIENT: "blue",
+ torConfig.Category.RELAY: "yellow",
+ torConfig.Category.DIRECTORY: "magenta",
+ torConfig.Category.AUTHORITY: "red",
+ torConfig.Category.HIDDEN_SERVICE: "cyan",
+ torConfig.Category.TESTING: "white",
+ torConfig.Category.UNKNOWN: "white"}
# attributes of a ConfigEntry
-FIELD_CATEGORY, FIELD_OPTION, FIELD_VALUE, FIELD_TYPE, FIELD_ARG_USAGE, FIELD_SUMMARY, FIELD_DESCRIPTION, FIELD_MAN_ENTRY, FIELD_IS_DEFAULT = range(9)
-DEFAULT_SORT_ORDER = (FIELD_CATEGORY, FIELD_MAN_ENTRY, FIELD_IS_DEFAULT)
-FIELD_ATTR = {FIELD_CATEGORY: ("Category", "red"),
- FIELD_OPTION: ("Option Name", "blue"),
- FIELD_VALUE: ("Value", "cyan"),
- FIELD_TYPE: ("Arg Type", "green"),
- FIELD_ARG_USAGE: ("Arg Usage", "yellow"),
- FIELD_SUMMARY: ("Summary", "green"),
- FIELD_DESCRIPTION: ("Description", "white"),
- FIELD_MAN_ENTRY: ("Man Page Entry", "blue"),
- FIELD_IS_DEFAULT: ("Is Default", "magenta")}
+Field = enum.Enum("CATEGORY", "OPTION", "VALUE", "TYPE", "ARG_USAGE",
+ "SUMMARY", "DESCRIPTION", "MAN_ENTRY", "IS_DEFAULT")
+DEFAULT_SORT_ORDER = (Field.MAN_ENTRY, Field.OPTION, Field.IS_DEFAULT)
+FIELD_ATTR = {Field.CATEGORY: ("Category", "red"),
+ Field.OPTION: ("Option Name", "blue"),
+ Field.VALUE: ("Value", "cyan"),
+ Field.TYPE: ("Arg Type", "green"),
+ Field.ARG_USAGE: ("Arg Usage", "yellow"),
+ Field.SUMMARY: ("Summary", "green"),
+ Field.DESCRIPTION: ("Description", "white"),
+ Field.MAN_ENTRY: ("Man Page Entry", "blue"),
+ Field.IS_DEFAULT: ("Is Default", "magenta")}
class ConfigEntry():
"""
Configuration option in the panel.
"""
- def __init__(self, option, type, isDefault, summary, manEntry):
+ def __init__(self, option, type, isDefault):
self.fields = {}
- self.fields[FIELD_OPTION] = option
- self.fields[FIELD_TYPE] = type
- self.fields[FIELD_IS_DEFAULT] = isDefault
+ self.fields[Field.OPTION] = option
+ self.fields[Field.TYPE] = type
+ self.fields[Field.IS_DEFAULT] = isDefault
+ # Fetches extra infromation from external sources (the arm config and tor
+ # man page). These are None if unavailable for this config option.
+ summary = torConfig.getConfigSummary(option)
+ manEntry = torConfig.getConfigDescription(option)
+
if manEntry:
- self.fields[FIELD_MAN_ENTRY] = manEntry.index
- self.fields[FIELD_CATEGORY] = manEntry.category
- self.fields[FIELD_ARG_USAGE] = manEntry.argUsage
- self.fields[FIELD_DESCRIPTION] = manEntry.description
+ self.fields[Field.MAN_ENTRY] = manEntry.index
+ self.fields[Field.CATEGORY] = manEntry.category
+ self.fields[Field.ARG_USAGE] = manEntry.argUsage
+ self.fields[Field.DESCRIPTION] = manEntry.description
else:
- self.fields[FIELD_MAN_ENTRY] = 99999 # sorts non-man entries last
- self.fields[FIELD_CATEGORY] = torConfig.UNKNOWN
- self.fields[FIELD_ARG_USAGE] = ""
- self.fields[FIELD_DESCRIPTION] = ""
+ self.fields[Field.MAN_ENTRY] = 99999 # sorts non-man entries last
+ self.fields[Field.CATEGORY] = torConfig.Category.UNKNOWN
+ self.fields[Field.ARG_USAGE] = ""
+ self.fields[Field.DESCRIPTION] = ""
- self.fields[FIELD_SUMMARY] = summary if summary != None else self.fields[FIELD_DESCRIPTION]
+ # uses the full man page description if a summary is unavailable
+ self.fields[Field.SUMMARY] = summary if summary != None else self.fields[Field.DESCRIPTION]
+
+ # cache of what's displayed for this configuration option
+ self.labelCache = None
+ self.labelCacheArgs = None
def get(self, field):
"""
@@ -74,9 +85,44 @@
field - enum for the field to be provided back
"""
- if field == FIELD_VALUE: return self._getValue()
+ if field == Field.VALUE: return self._getValue()
else: return self.fields[field]
+ def getAll(self, fields):
+ """
+ Provides back a list with the given field values.
+
+ Arguments:
+ field - enums for the fields to be provided back
+ """
+
+ return [self.get(field) for field in fields]
+
+ def getLabel(self, optionWidth, valueWidth, summaryWidth):
+ """
+ Provides display string of the configuration entry with the given
+ constraints on the width of the contents.
+
+ Arguments:
+ optionWidth - width of the option column
+ valueWidth - width of the value column
+ summaryWidth - width of the summary column
+ """
+
+ # Fetching the display entries is very common so this caches the values.
+ # Doing this substantially drops cpu usage when scrolling (by around 40%).
+
+ argSet = (optionWidth, valueWidth, summaryWidth)
+ if not self.labelCache or self.labelCacheArgs != argSet:
+ optionLabel = uiTools.cropStr(self.get(Field.OPTION), optionWidth)
+ valueLabel = uiTools.cropStr(self.get(Field.VALUE), valueWidth)
+ summaryLabel = uiTools.cropStr(self.get(Field.SUMMARY), summaryWidth, None)
+ lineTextLayout = "%%-%is %%-%is %%-%is" % (optionWidth, valueWidth, summaryWidth)
+ self.labelCache = lineTextLayout % (optionLabel, valueLabel, summaryLabel)
+ self.labelCacheArgs = argSet
+
+ return self.labelCache
+
def _getValue(self):
"""
Provides the current value of the configuration entry, taking advantage of
@@ -84,28 +130,18 @@
value's type to provide a user friendly representation if able.
"""
- confValue = ", ".join(torTools.getConn().getOption(self.get(FIELD_OPTION), [], True))
+ confValue = ", ".join(torTools.getConn().getOption(self.get(Field.OPTION), [], True))
# provides nicer values for recognized types
if not confValue: confValue = "<none>"
- elif self.get(FIELD_TYPE) == "Boolean" and confValue in ("0", "1"):
+ elif self.get(Field.TYPE) == "Boolean" and confValue in ("0", "1"):
confValue = "False" if confValue == "0" else "True"
- elif self.get(FIELD_TYPE) == "DataSize" and confValue.isdigit():
+ elif self.get(Field.TYPE) == "DataSize" and confValue.isdigit():
confValue = uiTools.getSizeLabel(int(confValue))
- elif self.get(FIELD_TYPE) == "TimeInterval" and confValue.isdigit():
+ elif self.get(Field.TYPE) == "TimeInterval" and confValue.isdigit():
confValue = uiTools.getTimeLabel(int(confValue), isLong = True)
return confValue
-
- def getAttr(self, argTypes):
- """
- Provides back a list with the given parameters.
-
- Arguments:
- argTypes - list of enums for the arguments to be provided back
- """
-
- return [self.get(field) for field in argTypes]
class ConfigPanel(panel.Panel):
"""
@@ -124,14 +160,22 @@
"features.config.state.colWidth.option": 5,
"features.config.state.colWidth.value": 5})
- self.sortOrdering = config.getIntCSV("features.config.order", self.sortOrdering, 3, 0, 6)
+ sortFields = Field.values()
+ customOrdering = config.getIntCSV("features.config.order", None, 3, 0, len(sortFields))
+
+ if customOrdering:
+ self.sortOrdering = [sortFields[i] for i in customOrdering]
self.configType = configType
self.confContents = []
self.scroller = uiTools.Scroller(True)
self.valsLock = threading.RLock()
- if self.configType == TOR_STATE:
+ # shows all configuration options if true, otherwise only the ones with
+ # the 'important' flag are shown
+ self.showAll = False
+
+ if self.configType == State.TOR:
conn = torTools.getConn()
customOptions = torConfig.getCustomOptions()
configOptionLines = conn.getInfo("config/names", "").strip().split("\n")
@@ -141,29 +185,37 @@
# UseEntryGuards Boolean
confOption, confType = line.strip().split(" ", 1)
- # skips private and virtual entries if not set to show them
+ # skips private and virtual entries if not configured to show them
if not self._config["features.config.state.showPrivateOptions"] and confOption.startswith("__"):
continue
elif not self._config["features.config.state.showVirtualOptions"] and confType == "Virtual":
continue
- summary = torConfig.getConfigSummary(confOption)
- manEntry = torConfig.getConfigDescription(confOption)
- self.confContents.append(ConfigEntry(confOption, confType, not confOption in customOptions, summary, manEntry))
-
- self.setSortOrder() # initial sorting of the contents
- elif self.configType == ARM_STATE:
+ self.confContents.append(ConfigEntry(confOption, confType, not confOption in customOptions))
+ elif self.configType == State.ARM:
# loaded via the conf utility
armConf = conf.getConfig("arm")
for key in armConf.getKeys():
pass # TODO: implement
+
+ # mirror listing with only the important configuration options
+ self.confImportantContents = []
+ for entry in self.confContents:
+ if torConfig.isImportant(entry.get(Field.OPTION)):
+ self.confImportantContents.append(entry)
+
+ # if there aren't any important options then show everything
+ if not self.confImportantContents:
+ self.confImportantContents = self.confContents
+
+ self.setSortOrder() # initial sorting of the contents
def getSelection(self):
"""
Provides the currently selected entry.
"""
- return self.scroller.getCursorSelection(self.confContents)
+ return self.scroller.getCursorSelection(self._getConfigOptions())
def setSortOrder(self, ordering = None):
"""
@@ -177,7 +229,8 @@
self.valsLock.acquire()
if ordering: self.sortOrdering = ordering
- self.confContents.sort(key=lambda i: (i.getAttr(self.sortOrdering)))
+ self.confContents.sort(key=lambda i: (i.getAll(self.sortOrdering)))
+ self.confImportantContents.sort(key=lambda i: (i.getAll(self.sortOrdering)))
self.valsLock.release()
def handleKey(self, key):
@@ -188,107 +241,104 @@
if detailPanelHeight > 0 and detailPanelHeight + 2 <= pageHeight:
pageHeight -= (detailPanelHeight + 1)
- isChanged = self.scroller.handleKey(key, self.confContents, pageHeight)
+ isChanged = self.scroller.handleKey(key, self._getConfigOptions(), pageHeight)
if isChanged: self.redraw(True)
+ elif key == ord('a') or key == ord('A'):
+ self.showAll = not self.showAll
+ self.redraw(True)
self.valsLock.release()
- def draw(self, subwindow, width, height):
+ def draw(self, width, height):
self.valsLock.acquire()
# draws the top label
- titleLabel = "%s Configuration:" % ("Tor" if self.configType == TOR_STATE else "Arm")
- self.addstr(0, 0, titleLabel, curses.A_STANDOUT)
+ configType = "Tor" if self.configType == State.TOR else "Arm"
+ hiddenMsg = "press 'a' to hide most options" if self.showAll else "press 'a' to show all options"
# panel with details for the current selection
detailPanelHeight = self._config["features.config.selectionDetails.height"]
+ isScrollbarVisible = False
if detailPanelHeight == 0 or detailPanelHeight + 2 >= height:
# no detail panel
detailPanelHeight = 0
- scrollLoc = self.scroller.getScrollLoc(self.confContents, height - 1)
+ scrollLoc = self.scroller.getScrollLoc(self._getConfigOptions(), height - 1)
cursorSelection = self.getSelection()
+ isScrollbarVisible = len(self._getConfigOptions()) > height - 1
else:
# Shrink detail panel if there isn't sufficient room for the whole
# thing. The extra line is for the bottom border.
detailPanelHeight = min(height - 1, detailPanelHeight + 1)
- scrollLoc = self.scroller.getScrollLoc(self.confContents, height - 1 - detailPanelHeight)
+ scrollLoc = self.scroller.getScrollLoc(self._getConfigOptions(), height - 1 - detailPanelHeight)
cursorSelection = self.getSelection()
+ isScrollbarVisible = len(self._getConfigOptions()) > height - detailPanelHeight - 1
- self._drawSelectionPanel(cursorSelection, width, detailPanelHeight, titleLabel)
+ self._drawSelectionPanel(cursorSelection, width, detailPanelHeight, isScrollbarVisible)
+ titleLabel = "%s Configuration (%s):" % (configType, hiddenMsg)
+ self.addstr(0, 0, titleLabel, curses.A_STANDOUT)
+
# draws left-hand scroll bar if content's longer than the height
- scrollOffset = 0
- if len(self.confContents) > height - detailPanelHeight - 1:
+ scrollOffset = 1
+ if isScrollbarVisible:
scrollOffset = 3
- self.addScrollBar(scrollLoc, scrollLoc + height - detailPanelHeight - 1, len(self.confContents), 1 + detailPanelHeight)
+ self.addScrollBar(scrollLoc, scrollLoc + height - detailPanelHeight - 1, len(self._getConfigOptions()), 1 + detailPanelHeight)
optionWidth = self._config["features.config.state.colWidth.option"]
valueWidth = self._config["features.config.state.colWidth.value"]
descriptionWidth = max(0, width - scrollOffset - optionWidth - valueWidth - 2)
- for lineNum in range(scrollLoc, len(self.confContents)):
- entry = self.confContents[lineNum]
+ for lineNum in range(scrollLoc, len(self._getConfigOptions())):
+ entry = self._getConfigOptions()[lineNum]
drawLine = lineNum + detailPanelHeight + 1 - scrollLoc
- optionLabel = uiTools.cropStr(entry.get(FIELD_OPTION), optionWidth)
- valueLabel = uiTools.cropStr(entry.get(FIELD_VALUE), valueWidth)
- summaryLabel = uiTools.cropStr(entry.get(FIELD_SUMMARY), descriptionWidth, None)
-
- lineFormat = curses.A_NORMAL if entry.get(FIELD_IS_DEFAULT) else curses.A_BOLD
- if entry.get(FIELD_CATEGORY): lineFormat |= uiTools.getColor(CATEGORY_COLOR[entry.get(FIELD_CATEGORY)])
+ lineFormat = curses.A_NORMAL if entry.get(Field.IS_DEFAULT) else curses.A_BOLD
+ if entry.get(Field.CATEGORY): lineFormat |= uiTools.getColor(CATEGORY_COLOR[entry.get(Field.CATEGORY)])
if entry == cursorSelection: lineFormat |= curses.A_STANDOUT
- lineTextLayout = "%%-%is %%-%is %%-%is" % (optionWidth, valueWidth, descriptionWidth)
- lineText = lineTextLayout % (optionLabel, valueLabel, summaryLabel)
+ lineText = entry.getLabel(optionWidth, valueWidth, descriptionWidth)
self.addstr(drawLine, scrollOffset, lineText, lineFormat)
if drawLine >= height: break
self.valsLock.release()
- def _drawSelectionPanel(self, cursorSelection, width, detailPanelHeight, titleLabel):
+ def _getConfigOptions(self):
+ return self.confContents if self.showAll else self.confImportantContents
+
+ def _drawSelectionPanel(self, selection, width, detailPanelHeight, isScrollbarVisible):
"""
Renders a panel for the selected configuration option.
"""
- # border (top)
- if width >= len(titleLabel):
- self.win.hline(0, len(titleLabel), curses.ACS_HLINE, width - len(titleLabel))
- self.win.addch(0, width, curses.ACS_URCORNER)
+ # This is a solid border unless the scrollbar is visible, in which case a
+ # 'T' pipe connects the border to the bar.
+ uiTools.drawBox(self, 0, 0, width, detailPanelHeight + 1)
+ if isScrollbarVisible: self.addch(detailPanelHeight, 1, curses.ACS_TTEE)
- # border (sides)
- self.win.vline(1, 0, curses.ACS_VLINE, detailPanelHeight - 1)
- self.win.vline(1, width, curses.ACS_VLINE, detailPanelHeight - 1)
+ selectionFormat = curses.A_BOLD | uiTools.getColor(CATEGORY_COLOR[selection.get(Field.CATEGORY)])
- # border (bottom)
- self.win.addch(detailPanelHeight, 0, curses.ACS_LLCORNER)
- if width >= 2: self.win.addch(detailPanelHeight, 1, curses.ACS_TTEE)
- if width >= 3: self.win.hline(detailPanelHeight, 2, curses.ACS_HLINE, width - 2)
- self.win.addch(detailPanelHeight, width, curses.ACS_LRCORNER)
-
- selectionFormat = curses.A_BOLD | uiTools.getColor(CATEGORY_COLOR[cursorSelection.get(FIELD_CATEGORY)])
-
# first entry:
# <option> (<category> Option)
- optionLabel =" (%s Option)" % torConfig.OPTION_CATEGORY_STR[cursorSelection.get(FIELD_CATEGORY)]
- self.addstr(1, 2, cursorSelection.get(FIELD_OPTION) + optionLabel, selectionFormat)
+ optionLabel =" (%s Option)" % selection.get(Field.CATEGORY)
+ self.addstr(1, 2, selection.get(Field.OPTION) + optionLabel, selectionFormat)
# second entry:
# Value: <value> ([default|custom], <type>, usage: <argument usage>)
if detailPanelHeight >= 3:
valueAttr = []
- valueAttr.append("default" if cursorSelection.get(FIELD_IS_DEFAULT) else "custom")
- valueAttr.append(cursorSelection.get(FIELD_TYPE))
- valueAttr.append("usage: %s" % (cursorSelection.get(FIELD_ARG_USAGE)))
+ valueAttr.append("default" if selection.get(Field.IS_DEFAULT) else "custom")
+ valueAttr.append(selection.get(Field.TYPE))
+ valueAttr.append("usage: %s" % (selection.get(Field.ARG_USAGE)))
valueAttrLabel = ", ".join(valueAttr)
valueLabelWidth = width - 12 - len(valueAttrLabel)
- valueLabel = uiTools.cropStr(cursorSelection.get(FIELD_VALUE), valueLabelWidth)
+ valueLabel = uiTools.cropStr(selection.get(Field.VALUE), valueLabelWidth)
self.addstr(2, 2, "Value: %s (%s)" % (valueLabel, valueAttrLabel), selectionFormat)
# remainder is filled with the man page description
descriptionHeight = max(0, detailPanelHeight - 3)
- descriptionContent = "Description: " + cursorSelection.get(FIELD_DESCRIPTION)
+ descriptionContent = "Description: " + selection.get(Field.DESCRIPTION)
for i in range(descriptionHeight):
# checks if we're done writing the description
@@ -304,7 +354,7 @@
if i != descriptionHeight - 1:
# there's more lines to display
- msg, remainder = uiTools.cropStr(lineContent, width - 2, 4, 4, uiTools.END_WITH_HYPHEN, True)
+ msg, remainder = uiTools.cropStr(lineContent, width - 2, 4, 4, uiTools.Ending.HYPHEN, True)
descriptionContent = remainder.strip() + descriptionContent
else:
# this is the last line, end it with an ellipse
Modified: arm/release/src/interface/connPanel.py
===================================================================
--- arm/release/src/interface/connPanel.py 2011-04-04 15:15:20 UTC (rev 24554)
+++ arm/release/src/interface/connPanel.py 2011-04-04 15:22:31 UTC (rev 24555)
@@ -508,7 +508,7 @@
else: return # skip following redraw
self.redraw(True)
- def draw(self, subwindow, width, height):
+ def draw(self, width, height):
self.connectionsLock.acquire()
try:
# hostnames frequently get updated so frequent sorting needed
@@ -529,7 +529,7 @@
if self.showingDetails:
listingHeight -= 8
isScrollBarVisible = len(self.connections) > height - 9
- if width > 80: subwindow.hline(8, 80, curses.ACS_HLINE, width - 81)
+ if width > 80: self.win.hline(8, 80, curses.ACS_HLINE, width - 81)
else:
isScrollBarVisible = len(self.connections) > height - 1
xOffset = 3 if isScrollBarVisible else 0 # content offset for scroll bar
@@ -878,6 +878,8 @@
self.familyFingerprints = {}
for familyEntry in self.family:
+ if not familyEntry: continue
+
if familyEntry[0] == "$":
# relay identified by fingerprint
self.familyFingerprints[familyEntry] = familyEntry[1:]
Deleted: arm/release/src/interface/connections/__init__.py
===================================================================
--- arm/trunk/src/interface/connections/__init__.py 2011-04-04 15:15:20 UTC (rev 24554)
+++ arm/release/src/interface/connections/__init__.py 2011-04-04 15:22:31 UTC (rev 24555)
@@ -1,6 +0,0 @@
-"""
-Panels, popups, and handlers comprising the arm user interface.
-"""
-
-__all__ = ["circEntry", "connEntry", "connPanel", "entries"]
-
Copied: arm/release/src/interface/connections/__init__.py (from rev 24554, arm/trunk/src/interface/connections/__init__.py)
===================================================================
--- arm/release/src/interface/connections/__init__.py (rev 0)
+++ arm/release/src/interface/connections/__init__.py 2011-04-04 15:22:31 UTC (rev 24555)
@@ -0,0 +1,6 @@
+"""
+Panels, popups, and handlers comprising the arm user interface.
+"""
+
+__all__ = ["circEntry", "connEntry", "connPanel", "entries"]
+
Deleted: arm/release/src/interface/connections/circEntry.py
===================================================================
--- arm/trunk/src/interface/connections/circEntry.py 2011-04-04 15:15:20 UTC (rev 24554)
+++ arm/release/src/interface/connections/circEntry.py 2011-04-04 15:22:31 UTC (rev 24555)
@@ -1,216 +0,0 @@
-"""
-Connection panel entries for client circuits. This includes a header entry
-followed by an entry for each hop in the circuit. For instance:
-
-89.188.20.246:42667 --> 217.172.182.26 (de) General / Built 8.6m (CIRCUIT)
-| 85.8.28.4 (se) 98FBC3B2B93897A78CDD797EF549E6B62C9A8523 1 / Guard
-| 91.121.204.76 (fr) 546387D93F8D40CFF8842BB9D3A8EC477CEDA984 2 / Middle
-+- 217.172.182.26 (de) 5CFA9EA136C0EA0AC096E5CEA7EB674F1207CF86 3 / Exit
-"""
-
-import curses
-
-from interface.connections import entries, connEntry
-from util import torTools, uiTools
-
-# cached fingerprint -> (IP Address, ORPort) results
-RELAY_INFO = {}
-
-def getRelayInfo(fingerprint):
- """
- Provides the (IP Address, ORPort) tuple for the given relay. If the lookup
- fails then this returns ("192.168.0.1", "0").
-
- Arguments:
- fingerprint - relay to look up
- """
-
- if not fingerprint in RELAY_INFO:
- conn = torTools.getConn()
- failureResult = ("192.168.0.1", "0")
-
- nsEntry = conn.getConsensusEntry(fingerprint)
- if not nsEntry: return failureResult
-
- nsLineComp = nsEntry.split("\n")[0].split(" ")
- if len(nsLineComp) < 8: return failureResult
-
- RELAY_INFO[fingerprint] = (nsLineComp[6], nsLineComp[7])
-
- return RELAY_INFO[fingerprint]
-
-class CircEntry(connEntry.ConnectionEntry):
- def __init__(self, circuitID, status, purpose, path):
- connEntry.ConnectionEntry.__init__(self, "127.0.0.1", "0", "127.0.0.1", "0")
-
- self.circuitID = circuitID
- self.status = status
-
- # drops to lowercase except the first letter
- if len(purpose) >= 2:
- purpose = purpose[0].upper() + purpose[1:].lower()
-
- self.lines = [CircHeaderLine(self.circuitID, purpose)]
-
- # Overwrites attributes of the initial line to make it more fitting as the
- # header for our listing.
-
- self.lines[0].baseType = connEntry.Category.CIRCUIT
-
- self.update(status, path)
-
- def update(self, status, path):
- """
- Our status and path can change over time if the circuit is still in the
- process of being built. Updates these attributes of our relay.
-
- Arguments:
- status - new status of the circuit
- path - list of fingerprints for the series of relays involved in the
- circuit
- """
-
- self.status = status
- self.lines = [self.lines[0]]
-
- if status == "BUILT" and not self.lines[0].isBuilt:
- exitIp, exitORPort = getRelayInfo(path[-1])
- self.lines[0].setExit(exitIp, exitORPort, path[-1])
-
- for i in range(len(path)):
- relayFingerprint = path[i]
- relayIp, relayOrPort = getRelayInfo(relayFingerprint)
-
- if i == len(path) - 1:
- if status == "BUILT": placementType = "Exit"
- else: placementType = "Extending"
- elif i == 0: placementType = "Guard"
- else: placementType = "Middle"
-
- placementLabel = "%i / %s" % (i + 1, placementType)
-
- self.lines.append(CircLine(relayIp, relayOrPort, relayFingerprint, placementLabel))
-
- self.lines[-1].isLast = True
-
-class CircHeaderLine(connEntry.ConnectionLine):
- """
- Initial line of a client entry. This has the same basic format as connection
- lines except that its etc field has circuit attributes.
- """
-
- def __init__(self, circuitID, purpose):
- connEntry.ConnectionLine.__init__(self, "127.0.0.1", "0", "0.0.0.0", "0", False, False)
- self.circuitID = circuitID
- self.purpose = purpose
- self.isBuilt = False
-
- def setExit(self, exitIpAddr, exitPort, exitFingerprint):
- connEntry.ConnectionLine.__init__(self, "127.0.0.1", "0", exitIpAddr, exitPort, False, False)
- self.isBuilt = True
- self.foreign.fingerprintOverwrite = exitFingerprint
-
- def getType(self):
- return connEntry.Category.CIRCUIT
-
- def getDestinationLabel(self, maxLength, includeLocale=False, includeHostname=False):
- if not self.isBuilt: return "Building..."
- return connEntry.ConnectionLine.getDestinationLabel(self, maxLength, includeLocale, includeHostname)
-
- def getEtcContent(self, width, listingType):
- """
- Attempts to provide all circuit related stats. Anything that can't be
- shown completely (not enough room) is dropped.
- """
-
- etcAttr = ["Purpose: %s" % self.purpose, "Circuit ID: %i" % self.circuitID]
-
- for i in range(len(etcAttr), -1, -1):
- etcLabel = ", ".join(etcAttr[:i])
- if len(etcLabel) <= width:
- return ("%%-%is" % width) % etcLabel
-
- return ""
-
- def getDetails(self, width):
- if not self.isBuilt:
- detailFormat = curses.A_BOLD | uiTools.getColor(connEntry.CATEGORY_COLOR[self.getType()])
- return [uiTools.DrawEntry("Building Circuit...", detailFormat)]
- else: return connEntry.ConnectionLine.getDetails(self, width)
-
-class CircLine(connEntry.ConnectionLine):
- """
- An individual hop in a circuit. This overwrites the displayed listing, but
- otherwise makes use of the ConnectionLine attributes (for the detail display,
- caching, etc).
- """
-
- def __init__(self, fIpAddr, fPort, fFingerprint, placementLabel):
- connEntry.ConnectionLine.__init__(self, "127.0.0.1", "0", fIpAddr, fPort)
- self.foreign.fingerprintOverwrite = fFingerprint
- self.placementLabel = placementLabel
- self.includePort = False
-
- # determines the sort of left hand bracketing we use
- self.isLast = False
-
- def getType(self):
- return connEntry.Category.CIRCUIT
-
- def getListingEntry(self, width, currentTime, listingType):
- """
- Provides the DrawEntry for this relay in the circuilt listing. Lines are
- composed of the following components:
- <bracket> <dst> <etc> <placement label>
-
- The dst and etc entries largely match their ConnectionEntry counterparts.
-
- Arguments:
- width - maximum length of the line
- currentTime - the current unix time (ignored)
- listingType - primary attribute we're listing connections by
- """
-
- return entries.ConnectionPanelLine.getListingEntry(self, width, currentTime, listingType)
-
- def _getListingEntry(self, width, currentTime, listingType):
- lineFormat = uiTools.getColor(connEntry.CATEGORY_COLOR[self.getType()])
-
- # The required widths are the sum of the following:
- # bracketing (3 characters)
- # placementLabel (14 characters)
- # gap between etc and placement label (5 characters)
-
- if self.isLast: bracket = (curses.ACS_LLCORNER, curses.ACS_HLINE, ord(' '))
- else: bracket = (curses.ACS_VLINE, ord(' '), ord(' '))
- baselineSpace = len(bracket) + 14 + 5
-
- dst, etc = "", ""
- if listingType == entries.ListingType.IP_ADDRESS:
- # TODO: include hostname when that's available
- # dst width is derived as:
- # src (21) + dst (26) + divider (7) + right gap (2) - bracket (3) = 53 char
- dst = "%-53s" % self.getDestinationLabel(53, includeLocale = True)
- etc = self.getEtcContent(width - baselineSpace - len(dst), listingType)
- elif listingType == entries.ListingType.HOSTNAME:
- # min space for the hostname is 40 characters
- etc = self.getEtcContent(width - baselineSpace - 40, listingType)
- dstLayout = "%%-%is" % (width - baselineSpace - len(etc))
- dst = dstLayout % self.foreign.getHostname(self.foreign.getIpAddr())
- elif listingType == entries.ListingType.FINGERPRINT:
- # dst width is derived as:
- # src (9) + dst (40) + divider (7) + right gap (2) - bracket (3) = 55 char
- dst = "%-55s" % self.foreign.getFingerprint()
- etc = self.getEtcContent(width - baselineSpace - len(dst), listingType)
- else:
- # min space for the nickname is 56 characters
- etc = self.getEtcContent(width - baselineSpace - 56, listingType)
- dstLayout = "%%-%is" % (width - baselineSpace - len(etc))
- dst = dstLayout % self.foreign.getNickname()
-
- drawEntry = uiTools.DrawEntry("%-14s" % self.placementLabel, lineFormat)
- drawEntry = uiTools.DrawEntry(" " * (width - baselineSpace - len(dst) - len(etc) + 5), lineFormat, drawEntry)
- drawEntry = uiTools.DrawEntry(dst + etc, lineFormat, drawEntry)
- drawEntry = uiTools.DrawEntry(bracket, curses.A_NORMAL, drawEntry, lockFormat = True)
- return drawEntry
-
Copied: arm/release/src/interface/connections/circEntry.py (from rev 24554, arm/trunk/src/interface/connections/circEntry.py)
===================================================================
--- arm/release/src/interface/connections/circEntry.py (rev 0)
+++ arm/release/src/interface/connections/circEntry.py 2011-04-04 15:22:31 UTC (rev 24555)
@@ -0,0 +1,216 @@
+"""
+Connection panel entries for client circuits. This includes a header entry
+followed by an entry for each hop in the circuit. For instance:
+
+89.188.20.246:42667 --> 217.172.182.26 (de) General / Built 8.6m (CIRCUIT)
+| 85.8.28.4 (se) 98FBC3B2B93897A78CDD797EF549E6B62C9A8523 1 / Guard
+| 91.121.204.76 (fr) 546387D93F8D40CFF8842BB9D3A8EC477CEDA984 2 / Middle
++- 217.172.182.26 (de) 5CFA9EA136C0EA0AC096E5CEA7EB674F1207CF86 3 / Exit
+"""
+
+import curses
+
+from interface.connections import entries, connEntry
+from util import torTools, uiTools
+
+# cached fingerprint -> (IP Address, ORPort) results
+RELAY_INFO = {}
+
+def getRelayInfo(fingerprint):
+ """
+ Provides the (IP Address, ORPort) tuple for the given relay. If the lookup
+ fails then this returns ("192.168.0.1", "0").
+
+ Arguments:
+ fingerprint - relay to look up
+ """
+
+ if not fingerprint in RELAY_INFO:
+ conn = torTools.getConn()
+ failureResult = ("192.168.0.1", "0")
+
+ nsEntry = conn.getConsensusEntry(fingerprint)
+ if not nsEntry: return failureResult
+
+ nsLineComp = nsEntry.split("\n")[0].split(" ")
+ if len(nsLineComp) < 8: return failureResult
+
+ RELAY_INFO[fingerprint] = (nsLineComp[6], nsLineComp[7])
+
+ return RELAY_INFO[fingerprint]
+
+class CircEntry(connEntry.ConnectionEntry):
+ def __init__(self, circuitID, status, purpose, path):
+ connEntry.ConnectionEntry.__init__(self, "127.0.0.1", "0", "127.0.0.1", "0")
+
+ self.circuitID = circuitID
+ self.status = status
+
+ # drops to lowercase except the first letter
+ if len(purpose) >= 2:
+ purpose = purpose[0].upper() + purpose[1:].lower()
+
+ self.lines = [CircHeaderLine(self.circuitID, purpose)]
+
+ # Overwrites attributes of the initial line to make it more fitting as the
+ # header for our listing.
+
+ self.lines[0].baseType = connEntry.Category.CIRCUIT
+
+ self.update(status, path)
+
+ def update(self, status, path):
+ """
+ Our status and path can change over time if the circuit is still in the
+ process of being built. Updates these attributes of our relay.
+
+ Arguments:
+ status - new status of the circuit
+ path - list of fingerprints for the series of relays involved in the
+ circuit
+ """
+
+ self.status = status
+ self.lines = [self.lines[0]]
+
+ if status == "BUILT" and not self.lines[0].isBuilt:
+ exitIp, exitORPort = getRelayInfo(path[-1])
+ self.lines[0].setExit(exitIp, exitORPort, path[-1])
+
+ for i in range(len(path)):
+ relayFingerprint = path[i]
+ relayIp, relayOrPort = getRelayInfo(relayFingerprint)
+
+ if i == len(path) - 1:
+ if status == "BUILT": placementType = "Exit"
+ else: placementType = "Extending"
+ elif i == 0: placementType = "Guard"
+ else: placementType = "Middle"
+
+ placementLabel = "%i / %s" % (i + 1, placementType)
+
+ self.lines.append(CircLine(relayIp, relayOrPort, relayFingerprint, placementLabel))
+
+ self.lines[-1].isLast = True
+
+class CircHeaderLine(connEntry.ConnectionLine):
+ """
+ Initial line of a client entry. This has the same basic format as connection
+ lines except that its etc field has circuit attributes.
+ """
+
+ def __init__(self, circuitID, purpose):
+ connEntry.ConnectionLine.__init__(self, "127.0.0.1", "0", "0.0.0.0", "0", False, False)
+ self.circuitID = circuitID
+ self.purpose = purpose
+ self.isBuilt = False
+
+ def setExit(self, exitIpAddr, exitPort, exitFingerprint):
+ connEntry.ConnectionLine.__init__(self, "127.0.0.1", "0", exitIpAddr, exitPort, False, False)
+ self.isBuilt = True
+ self.foreign.fingerprintOverwrite = exitFingerprint
+
+ def getType(self):
+ return connEntry.Category.CIRCUIT
+
+ def getDestinationLabel(self, maxLength, includeLocale=False, includeHostname=False):
+ if not self.isBuilt: return "Building..."
+ return connEntry.ConnectionLine.getDestinationLabel(self, maxLength, includeLocale, includeHostname)
+
+ def getEtcContent(self, width, listingType):
+ """
+ Attempts to provide all circuit related stats. Anything that can't be
+ shown completely (not enough room) is dropped.
+ """
+
+ etcAttr = ["Purpose: %s" % self.purpose, "Circuit ID: %i" % self.circuitID]
+
+ for i in range(len(etcAttr), -1, -1):
+ etcLabel = ", ".join(etcAttr[:i])
+ if len(etcLabel) <= width:
+ return ("%%-%is" % width) % etcLabel
+
+ return ""
+
+ def getDetails(self, width):
+ if not self.isBuilt:
+ detailFormat = curses.A_BOLD | uiTools.getColor(connEntry.CATEGORY_COLOR[self.getType()])
+ return [uiTools.DrawEntry("Building Circuit...", detailFormat)]
+ else: return connEntry.ConnectionLine.getDetails(self, width)
+
+class CircLine(connEntry.ConnectionLine):
+ """
+ An individual hop in a circuit. This overwrites the displayed listing, but
+ otherwise makes use of the ConnectionLine attributes (for the detail display,
+ caching, etc).
+ """
+
+ def __init__(self, fIpAddr, fPort, fFingerprint, placementLabel):
+ connEntry.ConnectionLine.__init__(self, "127.0.0.1", "0", fIpAddr, fPort)
+ self.foreign.fingerprintOverwrite = fFingerprint
+ self.placementLabel = placementLabel
+ self.includePort = False
+
+ # determines the sort of left hand bracketing we use
+ self.isLast = False
+
+ def getType(self):
+ return connEntry.Category.CIRCUIT
+
+ def getListingEntry(self, width, currentTime, listingType):
+ """
+ Provides the DrawEntry for this relay in the circuilt listing. Lines are
+ composed of the following components:
+ <bracket> <dst> <etc> <placement label>
+
+ The dst and etc entries largely match their ConnectionEntry counterparts.
+
+ Arguments:
+ width - maximum length of the line
+ currentTime - the current unix time (ignored)
+ listingType - primary attribute we're listing connections by
+ """
+
+ return entries.ConnectionPanelLine.getListingEntry(self, width, currentTime, listingType)
+
+ def _getListingEntry(self, width, currentTime, listingType):
+ lineFormat = uiTools.getColor(connEntry.CATEGORY_COLOR[self.getType()])
+
+ # The required widths are the sum of the following:
+ # bracketing (3 characters)
+ # placementLabel (14 characters)
+ # gap between etc and placement label (5 characters)
+
+ if self.isLast: bracket = (curses.ACS_LLCORNER, curses.ACS_HLINE, ord(' '))
+ else: bracket = (curses.ACS_VLINE, ord(' '), ord(' '))
+ baselineSpace = len(bracket) + 14 + 5
+
+ dst, etc = "", ""
+ if listingType == entries.ListingType.IP_ADDRESS:
+ # TODO: include hostname when that's available
+ # dst width is derived as:
+ # src (21) + dst (26) + divider (7) + right gap (2) - bracket (3) = 53 char
+ dst = "%-53s" % self.getDestinationLabel(53, includeLocale = True)
+ etc = self.getEtcContent(width - baselineSpace - len(dst), listingType)
+ elif listingType == entries.ListingType.HOSTNAME:
+ # min space for the hostname is 40 characters
+ etc = self.getEtcContent(width - baselineSpace - 40, listingType)
+ dstLayout = "%%-%is" % (width - baselineSpace - len(etc))
+ dst = dstLayout % self.foreign.getHostname(self.foreign.getIpAddr())
+ elif listingType == entries.ListingType.FINGERPRINT:
+ # dst width is derived as:
+ # src (9) + dst (40) + divider (7) + right gap (2) - bracket (3) = 55 char
+ dst = "%-55s" % self.foreign.getFingerprint()
+ etc = self.getEtcContent(width - baselineSpace - len(dst), listingType)
+ else:
+ # min space for the nickname is 56 characters
+ etc = self.getEtcContent(width - baselineSpace - 56, listingType)
+ dstLayout = "%%-%is" % (width - baselineSpace - len(etc))
+ dst = dstLayout % self.foreign.getNickname()
+
+ drawEntry = uiTools.DrawEntry("%-14s" % self.placementLabel, lineFormat)
+ drawEntry = uiTools.DrawEntry(" " * (width - baselineSpace - len(dst) - len(etc) + 5), lineFormat, drawEntry)
+ drawEntry = uiTools.DrawEntry(dst + etc, lineFormat, drawEntry)
+ drawEntry = uiTools.DrawEntry(bracket, curses.A_NORMAL, drawEntry, lockFormat = True)
+ return drawEntry
+
Deleted: arm/release/src/interface/connections/connEntry.py
===================================================================
--- arm/trunk/src/interface/connections/connEntry.py 2011-04-04 15:15:20 UTC (rev 24554)
+++ arm/release/src/interface/connections/connEntry.py 2011-04-04 15:22:31 UTC (rev 24555)
@@ -1,864 +0,0 @@
-"""
-Connection panel entries related to actual connections to or from the system
-(ie, results seen by netstat, lsof, etc).
-"""
-
-import time
-import curses
-
-from util import connections, enum, torTools, uiTools
-from interface.connections import entries
-
-# Connection Categories:
-# Inbound Relay connection, coming to us.
-# Outbound Relay connection, leaving us.
-# Exit Outbound relay connection leaving the Tor network.
-# Hidden Connections to a hidden service we're providing.
-# Socks Socks connections for applications using Tor.
-# Circuit Circuits our tor client has created.
-# Directory Fetching tor consensus information.
-# Control Tor controller (arm, vidalia, etc).
-
-Category = enum.Enum("INBOUND", "OUTBOUND", "EXIT", "HIDDEN", "SOCKS", "CIRCUIT", "DIRECTORY", "CONTROL")
-CATEGORY_COLOR = {Category.INBOUND: "green", Category.OUTBOUND: "blue",
- Category.EXIT: "red", Category.HIDDEN: "magenta",
- Category.SOCKS: "yellow", Category.CIRCUIT: "cyan",
- Category.DIRECTORY: "magenta", Category.CONTROL: "red"}
-
-# static data for listing format
-# <src> --> <dst> <etc><padding>
-LABEL_FORMAT = "%s --> %s %s%s"
-LABEL_MIN_PADDING = 2 # min space between listing label and following data
-
-# sort value for scrubbed ip addresses
-SCRUBBED_IP_VAL = 255 ** 4
-
-CONFIG = {"features.connection.markInitialConnections": True,
- "features.connection.showExitPort": True,
- "features.connection.showColumn.fingerprint": True,
- "features.connection.showColumn.nickname": True,
- "features.connection.showColumn.destination": True,
- "features.connection.showColumn.expandedIp": True}
-
-def loadConfig(config):
- config.update(CONFIG)
-
-class Endpoint:
- """
- Collection of attributes associated with a connection endpoint. This is a
- thin wrapper for torUtil functions, making use of its caching for
- performance.
- """
-
- def __init__(self, ipAddr, port):
- self.ipAddr = ipAddr
- self.port = port
-
- # if true, we treat the port as an ORPort when searching for matching
- # fingerprints (otherwise the ORPort is assumed to be unknown)
- self.isORPort = False
-
- # if set then this overwrites fingerprint lookups
- self.fingerprintOverwrite = None
-
- def getIpAddr(self):
- """
- Provides the IP address of the endpoint.
- """
-
- return self.ipAddr
-
- def getPort(self):
- """
- Provides the port of the endpoint.
- """
-
- return self.port
-
- def getHostname(self, default = None):
- """
- Provides the hostname associated with the relay's address. This is a
- non-blocking call and returns None if the address either can't be resolved
- or hasn't been resolved yet.
-
- Arguments:
- default - return value if no hostname is available
- """
-
- # TODO: skipping all hostname resolution to be safe for now
- #try:
- # myHostname = hostnames.resolve(self.ipAddr)
- #except:
- # # either a ValueError or IOError depending on the source of the lookup failure
- # myHostname = None
- #
- #if not myHostname: return default
- #else: return myHostname
-
- return default
-
- def getLocale(self, default=None):
- """
- Provides the two letter country code for the IP address' locale.
-
- Arguments:
- default - return value if no locale information is available
- """
-
- conn = torTools.getConn()
- return conn.getInfo("ip-to-country/%s" % self.ipAddr, default)
-
- def getFingerprint(self):
- """
- Provides the fingerprint of the relay, returning "UNKNOWN" if it can't be
- determined.
- """
-
- if self.fingerprintOverwrite:
- return self.fingerprintOverwrite
-
- conn = torTools.getConn()
- orPort = self.port if self.isORPort else None
- myFingerprint = conn.getRelayFingerprint(self.ipAddr, orPort)
-
- if myFingerprint: return myFingerprint
- else: return "UNKNOWN"
-
- def getNickname(self):
- """
- Provides the nickname of the relay, retuning "UNKNOWN" if it can't be
- determined.
- """
-
- myFingerprint = self.getFingerprint()
-
- if myFingerprint != "UNKNOWN":
- conn = torTools.getConn()
- myNickname = conn.getRelayNickname(myFingerprint)
-
- if myNickname: return myNickname
- else: return "UNKNOWN"
- else: return "UNKNOWN"
-
-class ConnectionEntry(entries.ConnectionPanelEntry):
- """
- Represents a connection being made to or from this system. These only
- concern real connections so it includes the inbound, outbound, directory,
- application, and controller categories.
- """
-
- def __init__(self, lIpAddr, lPort, fIpAddr, fPort):
- entries.ConnectionPanelEntry.__init__(self)
- self.lines = [ConnectionLine(lIpAddr, lPort, fIpAddr, fPort)]
-
- def getSortValue(self, attr, listingType):
- """
- Provides the value of a single attribute used for sorting purposes.
- """
-
- connLine = self.lines[0]
- if attr == entries.SortAttr.IP_ADDRESS:
- if connLine.isPrivate(): return SCRUBBED_IP_VAL # orders at the end
- return connLine.sortIpAddr
- elif attr == entries.SortAttr.PORT:
- return connLine.sortPort
- elif attr == entries.SortAttr.HOSTNAME:
- if connLine.isPrivate(): return ""
- return connLine.foreign.getHostname("")
- elif attr == entries.SortAttr.FINGERPRINT:
- return connLine.foreign.getFingerprint()
- elif attr == entries.SortAttr.NICKNAME:
- myNickname = connLine.foreign.getNickname()
- if myNickname == "UNKNOWN": return "z" * 20 # orders at the end
- else: return myNickname.lower()
- elif attr == entries.SortAttr.CATEGORY:
- return Category.indexOf(connLine.getType())
- elif attr == entries.SortAttr.UPTIME:
- return connLine.startTime
- elif attr == entries.SortAttr.COUNTRY:
- if connections.isIpAddressPrivate(self.lines[0].foreign.getIpAddr()): return ""
- else: return connLine.foreign.getLocale("")
- else:
- return entries.ConnectionPanelEntry.getSortValue(self, attr, listingType)
-
-class ConnectionLine(entries.ConnectionPanelLine):
- """
- Display component of the ConnectionEntry.
- """
-
- def __init__(self, lIpAddr, lPort, fIpAddr, fPort, includePort=True, includeExpandedIpAddr=True):
- entries.ConnectionPanelLine.__init__(self)
-
- self.local = Endpoint(lIpAddr, lPort)
- self.foreign = Endpoint(fIpAddr, fPort)
- self.startTime = time.time()
- self.isInitialConnection = False
-
- # overwrite the local fingerprint with ours
- conn = torTools.getConn()
- self.local.fingerprintOverwrite = conn.getInfo("fingerprint")
-
- # True if the connection has matched the properties of a client/directory
- # connection every time we've checked. The criteria we check is...
- # client - first hop in an established circuit
- # directory - matches an established single-hop circuit (probably a
- # directory mirror)
-
- self._possibleClient = True
- self._possibleDirectory = True
-
- # attributes for SOCKS, HIDDEN, and CONTROL connections
- self.appName = None
- self.appPid = None
- self.isAppResolving = False
-
- myOrPort = conn.getOption("ORPort")
- myDirPort = conn.getOption("DirPort")
- mySocksPort = conn.getOption("SocksPort", "9050")
- myCtlPort = conn.getOption("ControlPort")
- myHiddenServicePorts = conn.getHiddenServicePorts()
-
- # the ORListenAddress can overwrite the ORPort
- listenAddr = conn.getOption("ORListenAddress")
- if listenAddr and ":" in listenAddr:
- myOrPort = listenAddr[listenAddr.find(":") + 1:]
-
- if lPort in (myOrPort, myDirPort):
- self.baseType = Category.INBOUND
- self.local.isORPort = True
- elif lPort == mySocksPort:
- self.baseType = Category.SOCKS
- elif fPort in myHiddenServicePorts:
- self.baseType = Category.HIDDEN
- elif lPort == myCtlPort:
- self.baseType = Category.CONTROL
- else:
- self.baseType = Category.OUTBOUND
- self.foreign.isORPort = True
-
- self.cachedType = None
-
- # includes the port or expanded ip address field when displaying listing
- # information if true
- self.includePort = includePort
- self.includeExpandedIpAddr = includeExpandedIpAddr
-
- # cached immutable values used for sorting
- self.sortIpAddr = connections.ipToInt(self.foreign.getIpAddr())
- self.sortPort = int(self.foreign.getPort())
-
- def getListingEntry(self, width, currentTime, listingType):
- """
- Provides the DrawEntry for this connection's listing. Lines are composed
- of the following components:
- <src> --> <dst> <etc> <uptime> (<type>)
-
- ListingType.IP_ADDRESS:
- src - <internal addr:port> --> <external addr:port>
- dst - <destination addr:port>
- etc - <fingerprint> <nickname>
-
- ListingType.HOSTNAME:
- src - localhost:<port>
- dst - <destination hostname:port>
- etc - <destination addr:port> <fingerprint> <nickname>
-
- ListingType.FINGERPRINT:
- src - localhost
- dst - <destination fingerprint>
- etc - <nickname> <destination addr:port>
-
- ListingType.NICKNAME:
- src - <source nickname>
- dst - <destination nickname>
- etc - <fingerprint> <destination addr:port>
-
- Arguments:
- width - maximum length of the line
- currentTime - unix timestamp for what the results should consider to be
- the current time
- listingType - primary attribute we're listing connections by
- """
-
- # fetch our (most likely cached) display entry for the listing
- myListing = entries.ConnectionPanelLine.getListingEntry(self, width, currentTime, listingType)
-
- # fill in the current uptime and return the results
- if CONFIG["features.connection.markInitialConnections"]:
- timePrefix = "+" if self.isInitialConnection else " "
- else: timePrefix = ""
-
- timeEntry = myListing.getNext()
- timeEntry.text = timePrefix + "%5s" % uiTools.getTimeLabel(currentTime - self.startTime, 1)
-
- return myListing
-
- def isUnresolvedApp(self):
- """
- True if our display uses application information that hasn't yet been resolved.
- """
-
- return self.appName == None and self.getType() in (Category.SOCKS, Category.HIDDEN, Category.CONTROL)
-
- def _getListingEntry(self, width, currentTime, listingType):
- entryType = self.getType()
-
- # Lines are split into the following components in reverse:
- # content - "<src> --> <dst> <etc> "
- # time - "<uptime>"
- # preType - " ("
- # category - "<type>"
- # postType - ") "
-
- lineFormat = uiTools.getColor(CATEGORY_COLOR[entryType])
- timeWidth = 6 if CONFIG["features.connection.markInitialConnections"] else 5
-
- drawEntry = uiTools.DrawEntry(")" + " " * (9 - len(entryType)), lineFormat)
- drawEntry = uiTools.DrawEntry(entryType.upper(), lineFormat | curses.A_BOLD, drawEntry)
- drawEntry = uiTools.DrawEntry(" (", lineFormat, drawEntry)
- drawEntry = uiTools.DrawEntry(" " * timeWidth, lineFormat, drawEntry)
- drawEntry = uiTools.DrawEntry(self._getListingContent(width - (12 + timeWidth), listingType), lineFormat, drawEntry)
- return drawEntry
-
- def _getDetails(self, width):
- """
- Provides details on the connection, correlated against available consensus
- data.
-
- Arguments:
- width - available space to display in
- """
-
- detailFormat = curses.A_BOLD | uiTools.getColor(CATEGORY_COLOR[self.getType()])
- return [uiTools.DrawEntry(line, detailFormat) for line in self._getDetailContent(width)]
-
- def _getDescriptors(self, width):
- """
- Provides raw descriptor information for the relay.
-
- Arguments:
- width - available space to display in
- """
-
- # TODO: Porting and refactoring the descriptorPopup.py functionality is
- # gonna take quite a bit of work. This is a very rarely used feature and
- # not worth delaying the 1.4.2 release any further, so this will be a part
- # of 1.4.3.
-
- return []
-
- def resetDisplay(self):
- entries.ConnectionPanelLine.resetDisplay(self)
- self.cachedType = None
-
- def isPrivate(self):
- """
- Returns true if the endpoint is private, possibly belonging to a client
- connection or exit traffic.
- """
-
- # This is used to scrub private information from the interface. Relaying
- # etiquette (and wiretapping laws) say these are bad things to look at so
- # DON'T CHANGE THIS UNLESS YOU HAVE A DAMN GOOD REASON!
-
- myType = self.getType()
-
- if myType == Category.INBOUND:
- # if we're a guard or bridge and the connection doesn't belong to a
- # known relay then it might be client traffic
-
- conn = torTools.getConn()
- if "Guard" in conn.getMyFlags() or conn.getOption("BridgeRelay") == "1":
- allMatches = conn.getRelayFingerprint(self.foreign.getIpAddr(), getAllMatches = True)
- return allMatches == []
- elif myType == Category.EXIT:
- # DNS connections exiting us aren't private (since they're hitting our
- # resolvers). Everything else, however, is.
-
- # TODO: Ideally this would also double check that it's a UDP connection
- # (since DNS is the only UDP connections Tor will relay), however this
- # will take a bit more work to propagate the information up from the
- # connection resolver.
- return self.foreign.getPort() != "53"
-
- # for everything else this isn't a concern
- return False
-
- def getType(self):
- """
- Provides our best guess at the current type of the connection. This
- depends on consensus results, our current client circuits, etc. Results
- are cached until this entry's display is reset.
- """
-
- # caches both to simplify the calls and to keep the type consistent until
- # we want to reflect changes
- if not self.cachedType:
- if self.baseType == Category.OUTBOUND:
- # Currently the only non-static categories are OUTBOUND vs...
- # - EXIT since this depends on the current consensus
- # - CIRCUIT if this is likely to belong to our guard usage
- # - DIRECTORY if this is a single-hop circuit (directory mirror?)
- #
- # The exitability, circuits, and fingerprints are all cached by the
- # torTools util keeping this a quick lookup.
-
- conn = torTools.getConn()
- destFingerprint = self.foreign.getFingerprint()
-
- if destFingerprint == "UNKNOWN":
- # Not a known relay. This might be an exit connection.
-
- if conn.isExitingAllowed(self.foreign.getIpAddr(), self.foreign.getPort()):
- self.cachedType = Category.EXIT
- elif self._possibleClient or self._possibleDirectory:
- # This belongs to a known relay. If we haven't eliminated ourselves as
- # a possible client or directory connection then check if it still
- # holds true.
-
- myCircuits = conn.getCircuits()
-
- if self._possibleClient:
- # Checks that this belongs to the first hop in a circuit that's
- # either unestablished or longer than a single hop (ie, anything but
- # a built 1-hop connection since those are most likely a directory
- # mirror).
-
- for _, status, _, path in myCircuits:
- if path[0] == destFingerprint and (status != "BUILT" or len(path) > 1):
- self.cachedType = Category.CIRCUIT # matched a probable guard connection
-
- # if we fell through, we can eliminate ourselves as a guard in the future
- if not self.cachedType:
- self._possibleClient = False
-
- if self._possibleDirectory:
- # Checks if we match a built, single hop circuit.
-
- for _, status, _, path in myCircuits:
- if path[0] == destFingerprint and status == "BUILT" and len(path) == 1:
- self.cachedType = Category.DIRECTORY
-
- # if we fell through, eliminate ourselves as a directory connection
- if not self.cachedType:
- self._possibleDirectory = False
-
- if not self.cachedType:
- self.cachedType = self.baseType
-
- return self.cachedType
-
- def getEtcContent(self, width, listingType):
- """
- Provides the optional content for the connection.
-
- Arguments:
- width - maximum length of the line
- listingType - primary attribute we're listing connections by
- """
-
- # for applications show the command/pid
- if self.getType() in (Category.SOCKS, Category.HIDDEN, Category.CONTROL):
- displayLabel = ""
-
- if self.appName:
- if self.appPid: displayLabel = "%s (%s)" % (self.appName, self.appPid)
- else: displayLabel = self.appName
- elif self.isAppResolving:
- displayLabel = "resolving..."
- else: displayLabel = "UNKNOWN"
-
- if len(displayLabel) < width:
- return ("%%-%is" % width) % displayLabel
- else: return ""
-
- # for everything else display connection/consensus information
- dstAddress = self.getDestinationLabel(26, includeLocale = True)
- etc, usedSpace = "", 0
- if listingType == entries.ListingType.IP_ADDRESS:
- if width > usedSpace + 42 and CONFIG["features.connection.showColumn.fingerprint"]:
- # show fingerprint (column width: 42 characters)
- etc += "%-40s " % self.foreign.getFingerprint()
- usedSpace += 42
-
- if width > usedSpace + 10 and CONFIG["features.connection.showColumn.nickname"]:
- # show nickname (column width: remainder)
- nicknameSpace = width - usedSpace
- nicknameLabel = uiTools.cropStr(self.foreign.getNickname(), nicknameSpace, 0)
- etc += ("%%-%is " % nicknameSpace) % nicknameLabel
- usedSpace += nicknameSpace + 2
- elif listingType == entries.ListingType.HOSTNAME:
- if width > usedSpace + 28 and CONFIG["features.connection.showColumn.destination"]:
- # show destination ip/port/locale (column width: 28 characters)
- etc += "%-26s " % dstAddress
- usedSpace += 28
-
- if width > usedSpace + 42 and CONFIG["features.connection.showColumn.fingerprint"]:
- # show fingerprint (column width: 42 characters)
- etc += "%-40s " % self.foreign.getFingerprint()
- usedSpace += 42
-
- if width > usedSpace + 17 and CONFIG["features.connection.showColumn.nickname"]:
- # show nickname (column width: min 17 characters, uses half of the remainder)
- nicknameSpace = 15 + (width - (usedSpace + 17)) / 2
- nicknameLabel = uiTools.cropStr(self.foreign.getNickname(), nicknameSpace, 0)
- etc += ("%%-%is " % nicknameSpace) % nicknameLabel
- usedSpace += (nicknameSpace + 2)
- elif listingType == entries.ListingType.FINGERPRINT:
- if width > usedSpace + 17:
- # show nickname (column width: min 17 characters, consumes any remaining space)
- nicknameSpace = width - usedSpace - 2
-
- # if there's room then also show a column with the destination
- # ip/port/locale (column width: 28 characters)
- isIpLocaleIncluded = width > usedSpace + 45
- isIpLocaleIncluded &= CONFIG["features.connection.showColumn.destination"]
- if isIpLocaleIncluded: nicknameSpace -= 28
-
- if CONFIG["features.connection.showColumn.nickname"]:
- nicknameLabel = uiTools.cropStr(self.foreign.getNickname(), nicknameSpace, 0)
- etc += ("%%-%is " % nicknameSpace) % nicknameLabel
- usedSpace += nicknameSpace + 2
-
- if isIpLocaleIncluded:
- etc += "%-26s " % dstAddress
- usedSpace += 28
- else:
- if width > usedSpace + 42 and CONFIG["features.connection.showColumn.fingerprint"]:
- # show fingerprint (column width: 42 characters)
- etc += "%-40s " % self.foreign.getFingerprint()
- usedSpace += 42
-
- if width > usedSpace + 28 and CONFIG["features.connection.showColumn.destination"]:
- # show destination ip/port/locale (column width: 28 characters)
- etc += "%-26s " % dstAddress
- usedSpace += 28
-
- return ("%%-%is" % width) % etc
-
- def _getListingContent(self, width, listingType):
- """
- Provides the source, destination, and extra info for our listing.
-
- Arguments:
- width - maximum length of the line
- listingType - primary attribute we're listing connections by
- """
-
- conn = torTools.getConn()
- myType = self.getType()
- dstAddress = self.getDestinationLabel(26, includeLocale = True)
-
- # The required widths are the sum of the following:
- # - room for LABEL_FORMAT and LABEL_MIN_PADDING (11 characters)
- # - base data for the listing
- # - that extra field plus any previous
-
- usedSpace = len(LABEL_FORMAT % tuple([""] * 4)) + LABEL_MIN_PADDING
- localPort = ":%s" % self.local.getPort() if self.includePort else ""
-
- src, dst, etc = "", "", ""
- if listingType == entries.ListingType.IP_ADDRESS:
- myExternalIpAddr = conn.getInfo("address", self.local.getIpAddr())
- addrDiffer = myExternalIpAddr != self.local.getIpAddr()
-
- # Expanding doesn't make sense, if the connection isn't actually
- # going through Tor's external IP address. As there isn't a known
- # method for checking if it is, we're checking the type instead.
- #
- # This isn't entirely correct. It might be a better idea to check if
- # the source and destination addresses are both private, but that might
- # not be perfectly reliable either.
-
- isExpansionType = not myType in (Category.SOCKS, Category.HIDDEN, Category.CONTROL)
-
- if isExpansionType: srcAddress = myExternalIpAddr + localPort
- else: srcAddress = self.local.getIpAddr() + localPort
-
- if myType in (Category.SOCKS, Category.CONTROL):
- # Like inbound connections these need their source and destination to
- # be swapped. However, this only applies when listing by IP or hostname
- # (their fingerprint and nickname are both for us). Reversing the
- # fields here to keep the same column alignments.
-
- src = "%-21s" % dstAddress
- dst = "%-26s" % srcAddress
- else:
- src = "%-21s" % srcAddress # ip:port = max of 21 characters
- dst = "%-26s" % dstAddress # ip:port (xx) = max of 26 characters
-
- usedSpace += len(src) + len(dst) # base data requires 47 characters
-
- # Showing the fingerprint (which has the width of 42) has priority over
- # an expanded address field. Hence check if we either have space for
- # both or wouldn't be showing the fingerprint regardless.
-
- isExpandedAddrVisible = width > usedSpace + 28
- if isExpandedAddrVisible and CONFIG["features.connection.showColumn.fingerprint"]:
- isExpandedAddrVisible = width < usedSpace + 42 or width > usedSpace + 70
-
- if addrDiffer and isExpansionType and isExpandedAddrVisible and self.includeExpandedIpAddr and CONFIG["features.connection.showColumn.expandedIp"]:
- # include the internal address in the src (extra 28 characters)
- internalAddress = self.local.getIpAddr() + localPort
-
- # If this is an inbound connection then reverse ordering so it's:
- # <foreign> --> <external> --> <internal>
- # when the src and dst are swapped later
-
- if myType == Category.INBOUND: src = "%-21s --> %s" % (src, internalAddress)
- else: src = "%-21s --> %s" % (internalAddress, src)
-
- usedSpace += 28
-
- etc = self.getEtcContent(width - usedSpace, listingType)
- usedSpace += len(etc)
- elif listingType == entries.ListingType.HOSTNAME:
- # 15 characters for source, and a min of 40 reserved for the destination
- # TODO: when actually functional the src and dst need to be swapped for
- # SOCKS and CONTROL connections
- src = "localhost%-6s" % localPort
- usedSpace += len(src)
- minHostnameSpace = 40
-
- etc = self.getEtcContent(width - usedSpace - minHostnameSpace, listingType)
- usedSpace += len(etc)
-
- hostnameSpace = width - usedSpace
- usedSpace = width # prevents padding at the end
- if self.isPrivate():
- dst = ("%%-%is" % hostnameSpace) % "<scrubbed>"
- else:
- hostname = self.foreign.getHostname(self.foreign.getIpAddr())
- portLabel = ":%-5s" % self.foreign.getPort() if self.includePort else ""
-
- # truncates long hostnames and sets dst to <hostname>:<port>
- hostname = uiTools.cropStr(hostname, hostnameSpace, 0)
- dst = ("%%-%is" % hostnameSpace) % (hostname + portLabel)
- elif listingType == entries.ListingType.FINGERPRINT:
- src = "localhost"
- if myType == Category.CONTROL: dst = "localhost"
- else: dst = self.foreign.getFingerprint()
- dst = "%-40s" % dst
-
- usedSpace += len(src) + len(dst) # base data requires 49 characters
-
- etc = self.getEtcContent(width - usedSpace, listingType)
- usedSpace += len(etc)
- else:
- # base data requires 50 min characters
- src = self.local.getNickname()
- if myType == Category.CONTROL: dst = self.local.getNickname()
- else: dst = self.foreign.getNickname()
- minBaseSpace = 50
-
- etc = self.getEtcContent(width - usedSpace - minBaseSpace, listingType)
- usedSpace += len(etc)
-
- baseSpace = width - usedSpace
- usedSpace = width # prevents padding at the end
-
- if len(src) + len(dst) > baseSpace:
- src = uiTools.cropStr(src, baseSpace / 3)
- dst = uiTools.cropStr(dst, baseSpace - len(src))
-
- # pads dst entry to its max space
- dst = ("%%-%is" % (baseSpace - len(src))) % dst
-
- if myType == Category.INBOUND: src, dst = dst, src
- padding = " " * (width - usedSpace + LABEL_MIN_PADDING)
- return LABEL_FORMAT % (src, dst, etc, padding)
-
- def _getDetailContent(self, width):
- """
- Provides a list with detailed information for this connection.
-
- Arguments:
- width - max length of lines
- """
-
- lines = [""] * 7
- lines[0] = "address: %s" % self.getDestinationLabel(width - 11)
- lines[1] = "locale: %s" % ("??" if self.isPrivate() else self.foreign.getLocale("??"))
-
- # Remaining data concerns the consensus results, with three possible cases:
- # - if there's a single match then display its details
- # - if there's multiple potential relays then list all of the combinations
- # of ORPorts / Fingerprints
- # - if no consensus data is available then say so (probably a client or
- # exit connection)
-
- fingerprint = self.foreign.getFingerprint()
- conn = torTools.getConn()
-
- if fingerprint != "UNKNOWN":
- # single match - display information available about it
- nsEntry = conn.getConsensusEntry(fingerprint)
- descEntry = conn.getDescriptorEntry(fingerprint)
-
- # append the fingerprint to the second line
- lines[1] = "%-13sfingerprint: %s" % (lines[1], fingerprint)
-
- if nsEntry:
- # example consensus entry:
- # r murble R8sCM1ar1sS2GulQYFVmvN95xsk RJr6q+wkTFG+ng5v2bdCbVVFfA4 2011-02-21 00:25:32 195.43.157.85 443 0
- # s Exit Fast Guard Named Running Stable Valid
- # w Bandwidth=2540
- # p accept 20-23,43,53,79-81,88,110,143,194,443
-
- nsLines = nsEntry.split("\n")
-
- firstLineComp = nsLines[0].split(" ")
- if len(firstLineComp) >= 9:
- _, nickname, _, _, pubDate, pubTime, _, orPort, dirPort = firstLineComp[:9]
- else: nickname, pubDate, pubTime, orPort, dirPort = "", "", "", "", ""
-
- flags = "unknown"
- if len(nsLines) >= 2 and nsLines[1].startswith("s "):
- flags = nsLines[1][2:]
-
- # The network status exit policy doesn't exist for older tor versions.
- # If unavailable we'll need the full exit policy which is on the
- # descriptor (if that's available).
-
- exitPolicy = "unknown"
- if len(nsLines) >= 4 and nsLines[3].startswith("p "):
- exitPolicy = nsLines[3][2:].replace(",", ", ")
- elif descEntry:
- # the descriptor has an individual line for each entry in the exit policy
- exitPolicyEntries = []
-
- for line in descEntry.split("\n"):
- if line.startswith("accept") or line.startswith("reject"):
- exitPolicyEntries.append(line.strip())
-
- exitPolicy = ", ".join(exitPolicyEntries)
-
- dirPortLabel = "" if dirPort == "0" else "dirport: %s" % dirPort
- lines[2] = "nickname: %-25s orport: %-10s %s" % (nickname, orPort, dirPortLabel)
- lines[3] = "published: %s %s" % (pubDate, pubTime)
- lines[4] = "flags: %s" % flags.replace(" ", ", ")
- lines[5] = "exit policy: %s" % exitPolicy
-
- if descEntry:
- torVersion, platform, contact = "", "", ""
-
- for descLine in descEntry.split("\n"):
- if descLine.startswith("platform"):
- # has the tor version and platform, ex:
- # platform Tor 0.2.1.29 (r318f470bc5f2ad43) on Linux x86_64
-
- torVersion = descLine[13:descLine.find(" ", 13)]
- platform = descLine[descLine.rfind(" on ") + 4:]
- elif descLine.startswith("contact"):
- contact = descLine[8:]
-
- # clears up some highly common obscuring
- for alias in (" at ", " AT "): contact = contact.replace(alias, "@")
- for alias in (" dot ", " DOT "): contact = contact.replace(alias, ".")
-
- break # contact lines come after the platform
-
- lines[3] = "%-35s os: %-14s version: %s" % (lines[3], platform, torVersion)
-
- # contact information is an optional field
- if contact: lines[6] = "contact: %s" % contact
- else:
- allMatches = conn.getRelayFingerprint(self.foreign.getIpAddr(), getAllMatches = True)
-
- if allMatches:
- # multiple matches
- lines[2] = "Multiple matches, possible fingerprints are:"
-
- for i in range(len(allMatches)):
- isLastLine = i == 3
-
- relayPort, relayFingerprint = allMatches[i]
- lineText = "%i. or port: %-5s fingerprint: %s" % (i, relayPort, relayFingerprint)
-
- # if there's multiple lines remaining at the end then give a count
- remainingRelays = len(allMatches) - i
- if isLastLine and remainingRelays > 1:
- lineText = "... %i more" % remainingRelays
-
- lines[3 + i] = lineText
-
- if isLastLine: break
- else:
- # no consensus entry for this ip address
- lines[2] = "No consensus data found"
-
- # crops any lines that are too long
- for i in range(len(lines)):
- lines[i] = uiTools.cropStr(lines[i], width - 2)
-
- return lines
-
- def getDestinationLabel(self, maxLength, includeLocale=False, includeHostname=False):
- """
- Provides a short description of the destination. This is made up of two
- components, the base <ip addr>:<port> and an extra piece of information in
- parentheses. The IP address is scrubbed from private connections.
-
- Extra information is...
- - the port's purpose for exit connections
- - the locale and/or hostname if set to do so, the address isn't private,
- and isn't on the local network
- - nothing otherwise
-
- Arguments:
- maxLength - maximum length of the string returned
- includeLocale - possibly includes the locale
- includeHostname - possibly includes the hostname
- """
-
- # the port and port derived data can be hidden by config or without includePort
- includePort = self.includePort and (CONFIG["features.connection.showExitPort"] or self.getType() != Category.EXIT)
-
- # destination of the connection
- ipLabel = "<scrubbed>" if self.isPrivate() else self.foreign.getIpAddr()
- portLabel = ":%s" % self.foreign.getPort() if includePort else ""
- dstAddress = ipLabel + portLabel
-
- # Only append the extra info if there's at least a couple characters of
- # space (this is what's needed for the country codes).
- if len(dstAddress) + 5 <= maxLength:
- spaceAvailable = maxLength - len(dstAddress) - 3
-
- if self.getType() == Category.EXIT and includePort:
- purpose = connections.getPortUsage(self.foreign.getPort())
-
- if purpose:
- # BitTorrent is a common protocol to truncate, so just use "Torrent"
- # if there's not enough room.
- if len(purpose) > spaceAvailable and purpose == "BitTorrent":
- purpose = "Torrent"
-
- # crops with a hyphen if too long
- purpose = uiTools.cropStr(purpose, spaceAvailable, endType = uiTools.Ending.HYPHEN)
-
- dstAddress += " (%s)" % purpose
- elif not connections.isIpAddressPrivate(self.foreign.getIpAddr()):
- extraInfo = []
-
- if includeLocale:
- foreignLocale = self.foreign.getLocale("??")
- extraInfo.append(foreignLocale)
- spaceAvailable -= len(foreignLocale) + 2
-
- if includeHostname:
- dstHostname = self.foreign.getHostname()
-
- if dstHostname:
- # determines the full space available, taking into account the ", "
- # dividers if there's multiple pieces of extra data
-
- maxHostnameSpace = spaceAvailable - 2 * len(extraInfo)
- dstHostname = uiTools.cropStr(dstHostname, maxHostnameSpace)
- extraInfo.append(dstHostname)
- spaceAvailable -= len(dstHostname)
-
- if extraInfo:
- dstAddress += " (%s)" % ", ".join(extraInfo)
-
- return dstAddress[:maxLength]
-
Copied: arm/release/src/interface/connections/connEntry.py (from rev 24554, arm/trunk/src/interface/connections/connEntry.py)
===================================================================
--- arm/release/src/interface/connections/connEntry.py (rev 0)
+++ arm/release/src/interface/connections/connEntry.py 2011-04-04 15:22:31 UTC (rev 24555)
@@ -0,0 +1,864 @@
+"""
+Connection panel entries related to actual connections to or from the system
+(ie, results seen by netstat, lsof, etc).
+"""
+
+import time
+import curses
+
+from util import connections, enum, torTools, uiTools
+from interface.connections import entries
+
+# Connection Categories:
+# Inbound Relay connection, coming to us.
+# Outbound Relay connection, leaving us.
+# Exit Outbound relay connection leaving the Tor network.
+# Hidden Connections to a hidden service we're providing.
+# Socks Socks connections for applications using Tor.
+# Circuit Circuits our tor client has created.
+# Directory Fetching tor consensus information.
+# Control Tor controller (arm, vidalia, etc).
+
+Category = enum.Enum("INBOUND", "OUTBOUND", "EXIT", "HIDDEN", "SOCKS", "CIRCUIT", "DIRECTORY", "CONTROL")
+CATEGORY_COLOR = {Category.INBOUND: "green", Category.OUTBOUND: "blue",
+ Category.EXIT: "red", Category.HIDDEN: "magenta",
+ Category.SOCKS: "yellow", Category.CIRCUIT: "cyan",
+ Category.DIRECTORY: "magenta", Category.CONTROL: "red"}
+
+# static data for listing format
+# <src> --> <dst> <etc><padding>
+LABEL_FORMAT = "%s --> %s %s%s"
+LABEL_MIN_PADDING = 2 # min space between listing label and following data
+
+# sort value for scrubbed ip addresses
+SCRUBBED_IP_VAL = 255 ** 4
+
+CONFIG = {"features.connection.markInitialConnections": True,
+ "features.connection.showExitPort": True,
+ "features.connection.showColumn.fingerprint": True,
+ "features.connection.showColumn.nickname": True,
+ "features.connection.showColumn.destination": True,
+ "features.connection.showColumn.expandedIp": True}
+
+def loadConfig(config):
+ config.update(CONFIG)
+
+class Endpoint:
+ """
+ Collection of attributes associated with a connection endpoint. This is a
+ thin wrapper for torUtil functions, making use of its caching for
+ performance.
+ """
+
+ def __init__(self, ipAddr, port):
+ self.ipAddr = ipAddr
+ self.port = port
+
+ # if true, we treat the port as an ORPort when searching for matching
+ # fingerprints (otherwise the ORPort is assumed to be unknown)
+ self.isORPort = False
+
+ # if set then this overwrites fingerprint lookups
+ self.fingerprintOverwrite = None
+
+ def getIpAddr(self):
+ """
+ Provides the IP address of the endpoint.
+ """
+
+ return self.ipAddr
+
+ def getPort(self):
+ """
+ Provides the port of the endpoint.
+ """
+
+ return self.port
+
+ def getHostname(self, default = None):
+ """
+ Provides the hostname associated with the relay's address. This is a
+ non-blocking call and returns None if the address either can't be resolved
+ or hasn't been resolved yet.
+
+ Arguments:
+ default - return value if no hostname is available
+ """
+
+ # TODO: skipping all hostname resolution to be safe for now
+ #try:
+ # myHostname = hostnames.resolve(self.ipAddr)
+ #except:
+ # # either a ValueError or IOError depending on the source of the lookup failure
+ # myHostname = None
+ #
+ #if not myHostname: return default
+ #else: return myHostname
+
+ return default
+
+ def getLocale(self, default=None):
+ """
+ Provides the two letter country code for the IP address' locale.
+
+ Arguments:
+ default - return value if no locale information is available
+ """
+
+ conn = torTools.getConn()
+ return conn.getInfo("ip-to-country/%s" % self.ipAddr, default)
+
+ def getFingerprint(self):
+ """
+ Provides the fingerprint of the relay, returning "UNKNOWN" if it can't be
+ determined.
+ """
+
+ if self.fingerprintOverwrite:
+ return self.fingerprintOverwrite
+
+ conn = torTools.getConn()
+ orPort = self.port if self.isORPort else None
+ myFingerprint = conn.getRelayFingerprint(self.ipAddr, orPort)
+
+ if myFingerprint: return myFingerprint
+ else: return "UNKNOWN"
+
+ def getNickname(self):
+ """
+ Provides the nickname of the relay, retuning "UNKNOWN" if it can't be
+ determined.
+ """
+
+ myFingerprint = self.getFingerprint()
+
+ if myFingerprint != "UNKNOWN":
+ conn = torTools.getConn()
+ myNickname = conn.getRelayNickname(myFingerprint)
+
+ if myNickname: return myNickname
+ else: return "UNKNOWN"
+ else: return "UNKNOWN"
+
+class ConnectionEntry(entries.ConnectionPanelEntry):
+ """
+ Represents a connection being made to or from this system. These only
+ concern real connections so it includes the inbound, outbound, directory,
+ application, and controller categories.
+ """
+
+ def __init__(self, lIpAddr, lPort, fIpAddr, fPort):
+ entries.ConnectionPanelEntry.__init__(self)
+ self.lines = [ConnectionLine(lIpAddr, lPort, fIpAddr, fPort)]
+
+ def getSortValue(self, attr, listingType):
+ """
+ Provides the value of a single attribute used for sorting purposes.
+ """
+
+ connLine = self.lines[0]
+ if attr == entries.SortAttr.IP_ADDRESS:
+ if connLine.isPrivate(): return SCRUBBED_IP_VAL # orders at the end
+ return connLine.sortIpAddr
+ elif attr == entries.SortAttr.PORT:
+ return connLine.sortPort
+ elif attr == entries.SortAttr.HOSTNAME:
+ if connLine.isPrivate(): return ""
+ return connLine.foreign.getHostname("")
+ elif attr == entries.SortAttr.FINGERPRINT:
+ return connLine.foreign.getFingerprint()
+ elif attr == entries.SortAttr.NICKNAME:
+ myNickname = connLine.foreign.getNickname()
+ if myNickname == "UNKNOWN": return "z" * 20 # orders at the end
+ else: return myNickname.lower()
+ elif attr == entries.SortAttr.CATEGORY:
+ return Category.indexOf(connLine.getType())
+ elif attr == entries.SortAttr.UPTIME:
+ return connLine.startTime
+ elif attr == entries.SortAttr.COUNTRY:
+ if connections.isIpAddressPrivate(self.lines[0].foreign.getIpAddr()): return ""
+ else: return connLine.foreign.getLocale("")
+ else:
+ return entries.ConnectionPanelEntry.getSortValue(self, attr, listingType)
+
+class ConnectionLine(entries.ConnectionPanelLine):
+ """
+ Display component of the ConnectionEntry.
+ """
+
+ def __init__(self, lIpAddr, lPort, fIpAddr, fPort, includePort=True, includeExpandedIpAddr=True):
+ entries.ConnectionPanelLine.__init__(self)
+
+ self.local = Endpoint(lIpAddr, lPort)
+ self.foreign = Endpoint(fIpAddr, fPort)
+ self.startTime = time.time()
+ self.isInitialConnection = False
+
+ # overwrite the local fingerprint with ours
+ conn = torTools.getConn()
+ self.local.fingerprintOverwrite = conn.getInfo("fingerprint")
+
+ # True if the connection has matched the properties of a client/directory
+ # connection every time we've checked. The criteria we check is...
+ # client - first hop in an established circuit
+ # directory - matches an established single-hop circuit (probably a
+ # directory mirror)
+
+ self._possibleClient = True
+ self._possibleDirectory = True
+
+ # attributes for SOCKS, HIDDEN, and CONTROL connections
+ self.appName = None
+ self.appPid = None
+ self.isAppResolving = False
+
+ myOrPort = conn.getOption("ORPort")
+ myDirPort = conn.getOption("DirPort")
+ mySocksPort = conn.getOption("SocksPort", "9050")
+ myCtlPort = conn.getOption("ControlPort")
+ myHiddenServicePorts = conn.getHiddenServicePorts()
+
+ # the ORListenAddress can overwrite the ORPort
+ listenAddr = conn.getOption("ORListenAddress")
+ if listenAddr and ":" in listenAddr:
+ myOrPort = listenAddr[listenAddr.find(":") + 1:]
+
+ if lPort in (myOrPort, myDirPort):
+ self.baseType = Category.INBOUND
+ self.local.isORPort = True
+ elif lPort == mySocksPort:
+ self.baseType = Category.SOCKS
+ elif fPort in myHiddenServicePorts:
+ self.baseType = Category.HIDDEN
+ elif lPort == myCtlPort:
+ self.baseType = Category.CONTROL
+ else:
+ self.baseType = Category.OUTBOUND
+ self.foreign.isORPort = True
+
+ self.cachedType = None
+
+ # includes the port or expanded ip address field when displaying listing
+ # information if true
+ self.includePort = includePort
+ self.includeExpandedIpAddr = includeExpandedIpAddr
+
+ # cached immutable values used for sorting
+ self.sortIpAddr = connections.ipToInt(self.foreign.getIpAddr())
+ self.sortPort = int(self.foreign.getPort())
+
+ def getListingEntry(self, width, currentTime, listingType):
+ """
+ Provides the DrawEntry for this connection's listing. Lines are composed
+ of the following components:
+ <src> --> <dst> <etc> <uptime> (<type>)
+
+ ListingType.IP_ADDRESS:
+ src - <internal addr:port> --> <external addr:port>
+ dst - <destination addr:port>
+ etc - <fingerprint> <nickname>
+
+ ListingType.HOSTNAME:
+ src - localhost:<port>
+ dst - <destination hostname:port>
+ etc - <destination addr:port> <fingerprint> <nickname>
+
+ ListingType.FINGERPRINT:
+ src - localhost
+ dst - <destination fingerprint>
+ etc - <nickname> <destination addr:port>
+
+ ListingType.NICKNAME:
+ src - <source nickname>
+ dst - <destination nickname>
+ etc - <fingerprint> <destination addr:port>
+
+ Arguments:
+ width - maximum length of the line
+ currentTime - unix timestamp for what the results should consider to be
+ the current time
+ listingType - primary attribute we're listing connections by
+ """
+
+ # fetch our (most likely cached) display entry for the listing
+ myListing = entries.ConnectionPanelLine.getListingEntry(self, width, currentTime, listingType)
+
+ # fill in the current uptime and return the results
+ if CONFIG["features.connection.markInitialConnections"]:
+ timePrefix = "+" if self.isInitialConnection else " "
+ else: timePrefix = ""
+
+ timeEntry = myListing.getNext()
+ timeEntry.text = timePrefix + "%5s" % uiTools.getTimeLabel(currentTime - self.startTime, 1)
+
+ return myListing
+
+ def isUnresolvedApp(self):
+ """
+ True if our display uses application information that hasn't yet been resolved.
+ """
+
+ return self.appName == None and self.getType() in (Category.SOCKS, Category.HIDDEN, Category.CONTROL)
+
+ def _getListingEntry(self, width, currentTime, listingType):
+ entryType = self.getType()
+
+ # Lines are split into the following components in reverse:
+ # content - "<src> --> <dst> <etc> "
+ # time - "<uptime>"
+ # preType - " ("
+ # category - "<type>"
+ # postType - ") "
+
+ lineFormat = uiTools.getColor(CATEGORY_COLOR[entryType])
+ timeWidth = 6 if CONFIG["features.connection.markInitialConnections"] else 5
+
+ drawEntry = uiTools.DrawEntry(")" + " " * (9 - len(entryType)), lineFormat)
+ drawEntry = uiTools.DrawEntry(entryType.upper(), lineFormat | curses.A_BOLD, drawEntry)
+ drawEntry = uiTools.DrawEntry(" (", lineFormat, drawEntry)
+ drawEntry = uiTools.DrawEntry(" " * timeWidth, lineFormat, drawEntry)
+ drawEntry = uiTools.DrawEntry(self._getListingContent(width - (12 + timeWidth), listingType), lineFormat, drawEntry)
+ return drawEntry
+
+ def _getDetails(self, width):
+ """
+ Provides details on the connection, correlated against available consensus
+ data.
+
+ Arguments:
+ width - available space to display in
+ """
+
+ detailFormat = curses.A_BOLD | uiTools.getColor(CATEGORY_COLOR[self.getType()])
+ return [uiTools.DrawEntry(line, detailFormat) for line in self._getDetailContent(width)]
+
+ def _getDescriptors(self, width):
+ """
+ Provides raw descriptor information for the relay.
+
+ Arguments:
+ width - available space to display in
+ """
+
+ # TODO: Porting and refactoring the descriptorPopup.py functionality is
+ # gonna take quite a bit of work. This is a very rarely used feature and
+ # not worth delaying the 1.4.2 release any further, so this will be a part
+ # of 1.4.3.
+
+ return []
+
+ def resetDisplay(self):
+ entries.ConnectionPanelLine.resetDisplay(self)
+ self.cachedType = None
+
+ def isPrivate(self):
+ """
+ Returns true if the endpoint is private, possibly belonging to a client
+ connection or exit traffic.
+ """
+
+ # This is used to scrub private information from the interface. Relaying
+ # etiquette (and wiretapping laws) say these are bad things to look at so
+ # DON'T CHANGE THIS UNLESS YOU HAVE A DAMN GOOD REASON!
+
+ myType = self.getType()
+
+ if myType == Category.INBOUND:
+ # if we're a guard or bridge and the connection doesn't belong to a
+ # known relay then it might be client traffic
+
+ conn = torTools.getConn()
+ if "Guard" in conn.getMyFlags() or conn.getOption("BridgeRelay") == "1":
+ allMatches = conn.getRelayFingerprint(self.foreign.getIpAddr(), getAllMatches = True)
+ return allMatches == []
+ elif myType == Category.EXIT:
+ # DNS connections exiting us aren't private (since they're hitting our
+ # resolvers). Everything else, however, is.
+
+ # TODO: Ideally this would also double check that it's a UDP connection
+ # (since DNS is the only UDP connections Tor will relay), however this
+ # will take a bit more work to propagate the information up from the
+ # connection resolver.
+ return self.foreign.getPort() != "53"
+
+ # for everything else this isn't a concern
+ return False
+
+ def getType(self):
+ """
+ Provides our best guess at the current type of the connection. This
+ depends on consensus results, our current client circuits, etc. Results
+ are cached until this entry's display is reset.
+ """
+
+ # caches both to simplify the calls and to keep the type consistent until
+ # we want to reflect changes
+ if not self.cachedType:
+ if self.baseType == Category.OUTBOUND:
+ # Currently the only non-static categories are OUTBOUND vs...
+ # - EXIT since this depends on the current consensus
+ # - CIRCUIT if this is likely to belong to our guard usage
+ # - DIRECTORY if this is a single-hop circuit (directory mirror?)
+ #
+ # The exitability, circuits, and fingerprints are all cached by the
+ # torTools util keeping this a quick lookup.
+
+ conn = torTools.getConn()
+ destFingerprint = self.foreign.getFingerprint()
+
+ if destFingerprint == "UNKNOWN":
+ # Not a known relay. This might be an exit connection.
+
+ if conn.isExitingAllowed(self.foreign.getIpAddr(), self.foreign.getPort()):
+ self.cachedType = Category.EXIT
+ elif self._possibleClient or self._possibleDirectory:
+ # This belongs to a known relay. If we haven't eliminated ourselves as
+ # a possible client or directory connection then check if it still
+ # holds true.
+
+ myCircuits = conn.getCircuits()
+
+ if self._possibleClient:
+ # Checks that this belongs to the first hop in a circuit that's
+ # either unestablished or longer than a single hop (ie, anything but
+ # a built 1-hop connection since those are most likely a directory
+ # mirror).
+
+ for _, status, _, path in myCircuits:
+ if path[0] == destFingerprint and (status != "BUILT" or len(path) > 1):
+ self.cachedType = Category.CIRCUIT # matched a probable guard connection
+
+ # if we fell through, we can eliminate ourselves as a guard in the future
+ if not self.cachedType:
+ self._possibleClient = False
+
+ if self._possibleDirectory:
+ # Checks if we match a built, single hop circuit.
+
+ for _, status, _, path in myCircuits:
+ if path[0] == destFingerprint and status == "BUILT" and len(path) == 1:
+ self.cachedType = Category.DIRECTORY
+
+ # if we fell through, eliminate ourselves as a directory connection
+ if not self.cachedType:
+ self._possibleDirectory = False
+
+ if not self.cachedType:
+ self.cachedType = self.baseType
+
+ return self.cachedType
+
+ def getEtcContent(self, width, listingType):
+ """
+ Provides the optional content for the connection.
+
+ Arguments:
+ width - maximum length of the line
+ listingType - primary attribute we're listing connections by
+ """
+
+ # for applications show the command/pid
+ if self.getType() in (Category.SOCKS, Category.HIDDEN, Category.CONTROL):
+ displayLabel = ""
+
+ if self.appName:
+ if self.appPid: displayLabel = "%s (%s)" % (self.appName, self.appPid)
+ else: displayLabel = self.appName
+ elif self.isAppResolving:
+ displayLabel = "resolving..."
+ else: displayLabel = "UNKNOWN"
+
+ if len(displayLabel) < width:
+ return ("%%-%is" % width) % displayLabel
+ else: return ""
+
+ # for everything else display connection/consensus information
+ dstAddress = self.getDestinationLabel(26, includeLocale = True)
+ etc, usedSpace = "", 0
+ if listingType == entries.ListingType.IP_ADDRESS:
+ if width > usedSpace + 42 and CONFIG["features.connection.showColumn.fingerprint"]:
+ # show fingerprint (column width: 42 characters)
+ etc += "%-40s " % self.foreign.getFingerprint()
+ usedSpace += 42
+
+ if width > usedSpace + 10 and CONFIG["features.connection.showColumn.nickname"]:
+ # show nickname (column width: remainder)
+ nicknameSpace = width - usedSpace
+ nicknameLabel = uiTools.cropStr(self.foreign.getNickname(), nicknameSpace, 0)
+ etc += ("%%-%is " % nicknameSpace) % nicknameLabel
+ usedSpace += nicknameSpace + 2
+ elif listingType == entries.ListingType.HOSTNAME:
+ if width > usedSpace + 28 and CONFIG["features.connection.showColumn.destination"]:
+ # show destination ip/port/locale (column width: 28 characters)
+ etc += "%-26s " % dstAddress
+ usedSpace += 28
+
+ if width > usedSpace + 42 and CONFIG["features.connection.showColumn.fingerprint"]:
+ # show fingerprint (column width: 42 characters)
+ etc += "%-40s " % self.foreign.getFingerprint()
+ usedSpace += 42
+
+ if width > usedSpace + 17 and CONFIG["features.connection.showColumn.nickname"]:
+ # show nickname (column width: min 17 characters, uses half of the remainder)
+ nicknameSpace = 15 + (width - (usedSpace + 17)) / 2
+ nicknameLabel = uiTools.cropStr(self.foreign.getNickname(), nicknameSpace, 0)
+ etc += ("%%-%is " % nicknameSpace) % nicknameLabel
+ usedSpace += (nicknameSpace + 2)
+ elif listingType == entries.ListingType.FINGERPRINT:
+ if width > usedSpace + 17:
+ # show nickname (column width: min 17 characters, consumes any remaining space)
+ nicknameSpace = width - usedSpace - 2
+
+ # if there's room then also show a column with the destination
+ # ip/port/locale (column width: 28 characters)
+ isIpLocaleIncluded = width > usedSpace + 45
+ isIpLocaleIncluded &= CONFIG["features.connection.showColumn.destination"]
+ if isIpLocaleIncluded: nicknameSpace -= 28
+
+ if CONFIG["features.connection.showColumn.nickname"]:
+ nicknameLabel = uiTools.cropStr(self.foreign.getNickname(), nicknameSpace, 0)
+ etc += ("%%-%is " % nicknameSpace) % nicknameLabel
+ usedSpace += nicknameSpace + 2
+
+ if isIpLocaleIncluded:
+ etc += "%-26s " % dstAddress
+ usedSpace += 28
+ else:
+ if width > usedSpace + 42 and CONFIG["features.connection.showColumn.fingerprint"]:
+ # show fingerprint (column width: 42 characters)
+ etc += "%-40s " % self.foreign.getFingerprint()
+ usedSpace += 42
+
+ if width > usedSpace + 28 and CONFIG["features.connection.showColumn.destination"]:
+ # show destination ip/port/locale (column width: 28 characters)
+ etc += "%-26s " % dstAddress
+ usedSpace += 28
+
+ return ("%%-%is" % width) % etc
+
+ def _getListingContent(self, width, listingType):
+ """
+ Provides the source, destination, and extra info for our listing.
+
+ Arguments:
+ width - maximum length of the line
+ listingType - primary attribute we're listing connections by
+ """
+
+ conn = torTools.getConn()
+ myType = self.getType()
+ dstAddress = self.getDestinationLabel(26, includeLocale = True)
+
+ # The required widths are the sum of the following:
+ # - room for LABEL_FORMAT and LABEL_MIN_PADDING (11 characters)
+ # - base data for the listing
+ # - that extra field plus any previous
+
+ usedSpace = len(LABEL_FORMAT % tuple([""] * 4)) + LABEL_MIN_PADDING
+ localPort = ":%s" % self.local.getPort() if self.includePort else ""
+
+ src, dst, etc = "", "", ""
+ if listingType == entries.ListingType.IP_ADDRESS:
+ myExternalIpAddr = conn.getInfo("address", self.local.getIpAddr())
+ addrDiffer = myExternalIpAddr != self.local.getIpAddr()
+
+ # Expanding doesn't make sense, if the connection isn't actually
+ # going through Tor's external IP address. As there isn't a known
+ # method for checking if it is, we're checking the type instead.
+ #
+ # This isn't entirely correct. It might be a better idea to check if
+ # the source and destination addresses are both private, but that might
+ # not be perfectly reliable either.
+
+ isExpansionType = not myType in (Category.SOCKS, Category.HIDDEN, Category.CONTROL)
+
+ if isExpansionType: srcAddress = myExternalIpAddr + localPort
+ else: srcAddress = self.local.getIpAddr() + localPort
+
+ if myType in (Category.SOCKS, Category.CONTROL):
+ # Like inbound connections these need their source and destination to
+ # be swapped. However, this only applies when listing by IP or hostname
+ # (their fingerprint and nickname are both for us). Reversing the
+ # fields here to keep the same column alignments.
+
+ src = "%-21s" % dstAddress
+ dst = "%-26s" % srcAddress
+ else:
+ src = "%-21s" % srcAddress # ip:port = max of 21 characters
+ dst = "%-26s" % dstAddress # ip:port (xx) = max of 26 characters
+
+ usedSpace += len(src) + len(dst) # base data requires 47 characters
+
+ # Showing the fingerprint (which has the width of 42) has priority over
+ # an expanded address field. Hence check if we either have space for
+ # both or wouldn't be showing the fingerprint regardless.
+
+ isExpandedAddrVisible = width > usedSpace + 28
+ if isExpandedAddrVisible and CONFIG["features.connection.showColumn.fingerprint"]:
+ isExpandedAddrVisible = width < usedSpace + 42 or width > usedSpace + 70
+
+ if addrDiffer and isExpansionType and isExpandedAddrVisible and self.includeExpandedIpAddr and CONFIG["features.connection.showColumn.expandedIp"]:
+ # include the internal address in the src (extra 28 characters)
+ internalAddress = self.local.getIpAddr() + localPort
+
+ # If this is an inbound connection then reverse ordering so it's:
+ # <foreign> --> <external> --> <internal>
+ # when the src and dst are swapped later
+
+ if myType == Category.INBOUND: src = "%-21s --> %s" % (src, internalAddress)
+ else: src = "%-21s --> %s" % (internalAddress, src)
+
+ usedSpace += 28
+
+ etc = self.getEtcContent(width - usedSpace, listingType)
+ usedSpace += len(etc)
+ elif listingType == entries.ListingType.HOSTNAME:
+ # 15 characters for source, and a min of 40 reserved for the destination
+ # TODO: when actually functional the src and dst need to be swapped for
+ # SOCKS and CONTROL connections
+ src = "localhost%-6s" % localPort
+ usedSpace += len(src)
+ minHostnameSpace = 40
+
+ etc = self.getEtcContent(width - usedSpace - minHostnameSpace, listingType)
+ usedSpace += len(etc)
+
+ hostnameSpace = width - usedSpace
+ usedSpace = width # prevents padding at the end
+ if self.isPrivate():
+ dst = ("%%-%is" % hostnameSpace) % "<scrubbed>"
+ else:
+ hostname = self.foreign.getHostname(self.foreign.getIpAddr())
+ portLabel = ":%-5s" % self.foreign.getPort() if self.includePort else ""
+
+ # truncates long hostnames and sets dst to <hostname>:<port>
+ hostname = uiTools.cropStr(hostname, hostnameSpace, 0)
+ dst = ("%%-%is" % hostnameSpace) % (hostname + portLabel)
+ elif listingType == entries.ListingType.FINGERPRINT:
+ src = "localhost"
+ if myType == Category.CONTROL: dst = "localhost"
+ else: dst = self.foreign.getFingerprint()
+ dst = "%-40s" % dst
+
+ usedSpace += len(src) + len(dst) # base data requires 49 characters
+
+ etc = self.getEtcContent(width - usedSpace, listingType)
+ usedSpace += len(etc)
+ else:
+ # base data requires 50 min characters
+ src = self.local.getNickname()
+ if myType == Category.CONTROL: dst = self.local.getNickname()
+ else: dst = self.foreign.getNickname()
+ minBaseSpace = 50
+
+ etc = self.getEtcContent(width - usedSpace - minBaseSpace, listingType)
+ usedSpace += len(etc)
+
+ baseSpace = width - usedSpace
+ usedSpace = width # prevents padding at the end
+
+ if len(src) + len(dst) > baseSpace:
+ src = uiTools.cropStr(src, baseSpace / 3)
+ dst = uiTools.cropStr(dst, baseSpace - len(src))
+
+ # pads dst entry to its max space
+ dst = ("%%-%is" % (baseSpace - len(src))) % dst
+
+ if myType == Category.INBOUND: src, dst = dst, src
+ padding = " " * (width - usedSpace + LABEL_MIN_PADDING)
+ return LABEL_FORMAT % (src, dst, etc, padding)
+
+ def _getDetailContent(self, width):
+ """
+ Provides a list with detailed information for this connection.
+
+ Arguments:
+ width - max length of lines
+ """
+
+ lines = [""] * 7
+ lines[0] = "address: %s" % self.getDestinationLabel(width - 11)
+ lines[1] = "locale: %s" % ("??" if self.isPrivate() else self.foreign.getLocale("??"))
+
+ # Remaining data concerns the consensus results, with three possible cases:
+ # - if there's a single match then display its details
+ # - if there's multiple potential relays then list all of the combinations
+ # of ORPorts / Fingerprints
+ # - if no consensus data is available then say so (probably a client or
+ # exit connection)
+
+ fingerprint = self.foreign.getFingerprint()
+ conn = torTools.getConn()
+
+ if fingerprint != "UNKNOWN":
+ # single match - display information available about it
+ nsEntry = conn.getConsensusEntry(fingerprint)
+ descEntry = conn.getDescriptorEntry(fingerprint)
+
+ # append the fingerprint to the second line
+ lines[1] = "%-13sfingerprint: %s" % (lines[1], fingerprint)
+
+ if nsEntry:
+ # example consensus entry:
+ # r murble R8sCM1ar1sS2GulQYFVmvN95xsk RJr6q+wkTFG+ng5v2bdCbVVFfA4 2011-02-21 00:25:32 195.43.157.85 443 0
+ # s Exit Fast Guard Named Running Stable Valid
+ # w Bandwidth=2540
+ # p accept 20-23,43,53,79-81,88,110,143,194,443
+
+ nsLines = nsEntry.split("\n")
+
+ firstLineComp = nsLines[0].split(" ")
+ if len(firstLineComp) >= 9:
+ _, nickname, _, _, pubDate, pubTime, _, orPort, dirPort = firstLineComp[:9]
+ else: nickname, pubDate, pubTime, orPort, dirPort = "", "", "", "", ""
+
+ flags = "unknown"
+ if len(nsLines) >= 2 and nsLines[1].startswith("s "):
+ flags = nsLines[1][2:]
+
+ # The network status exit policy doesn't exist for older tor versions.
+ # If unavailable we'll need the full exit policy which is on the
+ # descriptor (if that's available).
+
+ exitPolicy = "unknown"
+ if len(nsLines) >= 4 and nsLines[3].startswith("p "):
+ exitPolicy = nsLines[3][2:].replace(",", ", ")
+ elif descEntry:
+ # the descriptor has an individual line for each entry in the exit policy
+ exitPolicyEntries = []
+
+ for line in descEntry.split("\n"):
+ if line.startswith("accept") or line.startswith("reject"):
+ exitPolicyEntries.append(line.strip())
+
+ exitPolicy = ", ".join(exitPolicyEntries)
+
+ dirPortLabel = "" if dirPort == "0" else "dirport: %s" % dirPort
+ lines[2] = "nickname: %-25s orport: %-10s %s" % (nickname, orPort, dirPortLabel)
+ lines[3] = "published: %s %s" % (pubDate, pubTime)
+ lines[4] = "flags: %s" % flags.replace(" ", ", ")
+ lines[5] = "exit policy: %s" % exitPolicy
+
+ if descEntry:
+ torVersion, platform, contact = "", "", ""
+
+ for descLine in descEntry.split("\n"):
+ if descLine.startswith("platform"):
+ # has the tor version and platform, ex:
+ # platform Tor 0.2.1.29 (r318f470bc5f2ad43) on Linux x86_64
+
+ torVersion = descLine[13:descLine.find(" ", 13)]
+ platform = descLine[descLine.rfind(" on ") + 4:]
+ elif descLine.startswith("contact"):
+ contact = descLine[8:]
+
+ # clears up some highly common obscuring
+ for alias in (" at ", " AT "): contact = contact.replace(alias, "@")
+ for alias in (" dot ", " DOT "): contact = contact.replace(alias, ".")
+
+ break # contact lines come after the platform
+
+ lines[3] = "%-35s os: %-14s version: %s" % (lines[3], platform, torVersion)
+
+ # contact information is an optional field
+ if contact: lines[6] = "contact: %s" % contact
+ else:
+ allMatches = conn.getRelayFingerprint(self.foreign.getIpAddr(), getAllMatches = True)
+
+ if allMatches:
+ # multiple matches
+ lines[2] = "Multiple matches, possible fingerprints are:"
+
+ for i in range(len(allMatches)):
+ isLastLine = i == 3
+
+ relayPort, relayFingerprint = allMatches[i]
+ lineText = "%i. or port: %-5s fingerprint: %s" % (i, relayPort, relayFingerprint)
+
+ # if there's multiple lines remaining at the end then give a count
+ remainingRelays = len(allMatches) - i
+ if isLastLine and remainingRelays > 1:
+ lineText = "... %i more" % remainingRelays
+
+ lines[3 + i] = lineText
+
+ if isLastLine: break
+ else:
+ # no consensus entry for this ip address
+ lines[2] = "No consensus data found"
+
+ # crops any lines that are too long
+ for i in range(len(lines)):
+ lines[i] = uiTools.cropStr(lines[i], width - 2)
+
+ return lines
+
+ def getDestinationLabel(self, maxLength, includeLocale=False, includeHostname=False):
+ """
+ Provides a short description of the destination. This is made up of two
+ components, the base <ip addr>:<port> and an extra piece of information in
+ parentheses. The IP address is scrubbed from private connections.
+
+ Extra information is...
+ - the port's purpose for exit connections
+ - the locale and/or hostname if set to do so, the address isn't private,
+ and isn't on the local network
+ - nothing otherwise
+
+ Arguments:
+ maxLength - maximum length of the string returned
+ includeLocale - possibly includes the locale
+ includeHostname - possibly includes the hostname
+ """
+
+ # the port and port derived data can be hidden by config or without includePort
+ includePort = self.includePort and (CONFIG["features.connection.showExitPort"] or self.getType() != Category.EXIT)
+
+ # destination of the connection
+ ipLabel = "<scrubbed>" if self.isPrivate() else self.foreign.getIpAddr()
+ portLabel = ":%s" % self.foreign.getPort() if includePort else ""
+ dstAddress = ipLabel + portLabel
+
+ # Only append the extra info if there's at least a couple characters of
+ # space (this is what's needed for the country codes).
+ if len(dstAddress) + 5 <= maxLength:
+ spaceAvailable = maxLength - len(dstAddress) - 3
+
+ if self.getType() == Category.EXIT and includePort:
+ purpose = connections.getPortUsage(self.foreign.getPort())
+
+ if purpose:
+ # BitTorrent is a common protocol to truncate, so just use "Torrent"
+ # if there's not enough room.
+ if len(purpose) > spaceAvailable and purpose == "BitTorrent":
+ purpose = "Torrent"
+
+ # crops with a hyphen if too long
+ purpose = uiTools.cropStr(purpose, spaceAvailable, endType = uiTools.Ending.HYPHEN)
+
+ dstAddress += " (%s)" % purpose
+ elif not connections.isIpAddressPrivate(self.foreign.getIpAddr()):
+ extraInfo = []
+
+ if includeLocale:
+ foreignLocale = self.foreign.getLocale("??")
+ extraInfo.append(foreignLocale)
+ spaceAvailable -= len(foreignLocale) + 2
+
+ if includeHostname:
+ dstHostname = self.foreign.getHostname()
+
+ if dstHostname:
+ # determines the full space available, taking into account the ", "
+ # dividers if there's multiple pieces of extra data
+
+ maxHostnameSpace = spaceAvailable - 2 * len(extraInfo)
+ dstHostname = uiTools.cropStr(dstHostname, maxHostnameSpace)
+ extraInfo.append(dstHostname)
+ spaceAvailable -= len(dstHostname)
+
+ if extraInfo:
+ dstAddress += " (%s)" % ", ".join(extraInfo)
+
+ return dstAddress[:maxLength]
+
Deleted: arm/release/src/interface/connections/connPanel.py
===================================================================
--- arm/trunk/src/interface/connections/connPanel.py 2011-04-04 15:15:20 UTC (rev 24554)
+++ arm/release/src/interface/connections/connPanel.py 2011-04-04 15:22:31 UTC (rev 24555)
@@ -1,398 +0,0 @@
-"""
-Listing of the currently established connections tor has made.
-"""
-
-import time
-import curses
-import threading
-
-from interface.connections import entries, connEntry, circEntry
-from util import connections, enum, panel, torTools, uiTools
-
-DEFAULT_CONFIG = {"features.connection.resolveApps": True,
- "features.connection.listingType": 0,
- "features.connection.refreshRate": 5}
-
-# height of the detail panel content, not counting top and bottom border
-DETAILS_HEIGHT = 7
-
-# listing types
-Listing = enum.Enum(("IP_ADDRESS", "IP Address"), "HOSTNAME", "FINGERPRINT", "NICKNAME")
-
-DEFAULT_SORT_ORDER = (entries.SortAttr.CATEGORY, entries.SortAttr.LISTING, entries.SortAttr.UPTIME)
-
-class ConnectionPanel(panel.Panel, threading.Thread):
- """
- Listing of connections tor is making, with information correlated against
- the current consensus and other data sources.
- """
-
- def __init__(self, stdscr, config=None):
- panel.Panel.__init__(self, stdscr, "conn", 0)
- threading.Thread.__init__(self)
- self.setDaemon(True)
-
- self._sortOrdering = DEFAULT_SORT_ORDER
- self._config = dict(DEFAULT_CONFIG)
-
- if config:
- config.update(self._config, {
- "features.connection.listingType": (0, len(Listing.values()) - 1),
- "features.connection.refreshRate": 1})
-
- sortFields = entries.SortAttr.values()
- customOrdering = config.getIntCSV("features.connection.order", None, 3, 0, len(sortFields))
-
- if customOrdering:
- self._sortOrdering = [sortFields[i] for i in customOrdering]
-
- self._listingType = Listing.values()[self._config["features.connection.listingType"]]
- self._scroller = uiTools.Scroller(True)
- self._title = "Connections:" # title line of the panel
- self._entries = [] # last fetched display entries
- self._entryLines = [] # individual lines rendered from the entries listing
- self._showDetails = False # presents the details panel if true
-
- self._lastUpdate = -1 # time the content was last revised
- self._isTorRunning = True # indicates if tor is currently running or not
- self._isPaused = True # prevents updates if true
- self._pauseTime = None # time when the panel was paused
- self._halt = False # terminates thread if true
- self._cond = threading.Condition() # used for pausing the thread
- self.valsLock = threading.RLock()
-
- # Last sampling received from the ConnectionResolver, used to detect when
- # it changes.
- self._lastResourceFetch = -1
-
- # resolver for the command/pid associated with SOCKS, HIDDEN, and CONTROL connections
- self._appResolver = connections.AppResolver("arm")
-
- # rate limits appResolver queries to once per update
- self.appResolveSinceUpdate = False
-
- self._update() # populates initial entries
- self._resolveApps(False) # resolves initial applications
-
- # mark the initially exitsing connection uptimes as being estimates
- for entry in self._entries:
- if isinstance(entry, connEntry.ConnectionEntry):
- entry.getLines()[0].isInitialConnection = True
-
- # listens for when tor stops so we know to stop reflecting changes
- torTools.getConn().addStatusListener(self.torStateListener)
-
- def torStateListener(self, conn, eventType):
- """
- Freezes the connection contents when Tor stops.
-
- Arguments:
- conn - tor controller
- eventType - type of event detected
- """
-
- self._isTorRunning = eventType == torTools.State.INIT
-
- if self._isPaused or not self._isTorRunning:
- if not self._pauseTime: self._pauseTime = time.time()
- else: self._pauseTime = None
-
- self.redraw(True)
-
- def setPaused(self, isPause):
- """
- If true, prevents the panel from updating.
- """
-
- if not self._isPaused == isPause:
- self._isPaused = isPause
-
- if isPause or not self._isTorRunning:
- if not self._pauseTime: self._pauseTime = time.time()
- else: self._pauseTime = None
-
- # redraws so the display reflects any changes between the last update
- # and being paused
- self.redraw(True)
-
- def setSortOrder(self, ordering = None):
- """
- Sets the connection attributes we're sorting by and resorts the contents.
-
- Arguments:
- ordering - new ordering, if undefined then this resorts with the last
- set ordering
- """
-
- self.valsLock.acquire()
- if ordering: self._sortOrdering = ordering
- self._entries.sort(key=lambda i: (i.getSortValues(self._sortOrdering, self._listingType)))
-
- self._entryLines = []
- for entry in self._entries:
- self._entryLines += entry.getLines()
- self.valsLock.release()
-
- def setListingType(self, listingType):
- """
- Sets the priority information presented by the panel.
-
- Arguments:
- listingType - Listing instance for the primary information to be shown
- """
-
- self.valsLock.acquire()
- self._listingType = listingType
-
- # if we're sorting by the listing then we need to resort
- if entries.SortAttr.LISTING in self._sortOrdering:
- self.setSortOrder()
-
- self.valsLock.release()
-
- def handleKey(self, key):
- self.valsLock.acquire()
-
- if uiTools.isScrollKey(key):
- pageHeight = self.getPreferredSize()[0] - 1
- if self._showDetails: pageHeight -= (DETAILS_HEIGHT + 1)
- isChanged = self._scroller.handleKey(key, self._entryLines, pageHeight)
- if isChanged: self.redraw(True)
- elif uiTools.isSelectionKey(key):
- self._showDetails = not self._showDetails
- self.redraw(True)
-
- self.valsLock.release()
-
- def run(self):
- """
- Keeps connections listing updated, checking for new entries at a set rate.
- """
-
- lastDraw = time.time() - 1
- while not self._halt:
- currentTime = time.time()
-
- if self._isPaused or not self._isTorRunning or currentTime - lastDraw < self._config["features.connection.refreshRate"]:
- self._cond.acquire()
- if not self._halt: self._cond.wait(0.2)
- self._cond.release()
- else:
- # updates content if their's new results, otherwise just redraws
- self._update()
- self.redraw(True)
-
- # we may have missed multiple updates due to being paused, showing
- # another panel, etc so lastDraw might need to jump multiple ticks
- drawTicks = (time.time() - lastDraw) / self._config["features.connection.refreshRate"]
- lastDraw += self._config["features.connection.refreshRate"] * drawTicks
-
- def draw(self, width, height):
- self.valsLock.acquire()
-
- # extra line when showing the detail panel is for the bottom border
- detailPanelOffset = DETAILS_HEIGHT + 1 if self._showDetails else 0
- isScrollbarVisible = len(self._entryLines) > height - detailPanelOffset - 1
-
- scrollLoc = self._scroller.getScrollLoc(self._entryLines, height - detailPanelOffset - 1)
- cursorSelection = self._scroller.getCursorSelection(self._entryLines)
-
- # draws the detail panel if currently displaying it
- if self._showDetails:
- # This is a solid border unless the scrollbar is visible, in which case a
- # 'T' pipe connects the border to the bar.
- uiTools.drawBox(self, 0, 0, width, DETAILS_HEIGHT + 2)
- if isScrollbarVisible: self.addch(DETAILS_HEIGHT + 1, 1, curses.ACS_TTEE)
-
- drawEntries = cursorSelection.getDetails(width)
- for i in range(min(len(drawEntries), DETAILS_HEIGHT)):
- drawEntries[i].render(self, 1 + i, 2)
-
- # title label with connection counts
- title = "Connection Details:" if self._showDetails else self._title
- self.addstr(0, 0, title, curses.A_STANDOUT)
-
- scrollOffset = 1
- if isScrollbarVisible:
- scrollOffset = 3
- self.addScrollBar(scrollLoc, scrollLoc + height - detailPanelOffset - 1, len(self._entryLines), 1 + detailPanelOffset)
-
- currentTime = self._pauseTime if self._pauseTime else time.time()
- for lineNum in range(scrollLoc, len(self._entryLines)):
- entryLine = self._entryLines[lineNum]
-
- # if this is an unresolved SOCKS, HIDDEN, or CONTROL entry then queue up
- # resolution for the applicaitions they belong to
- if isinstance(entryLine, connEntry.ConnectionLine) and entryLine.isUnresolvedApp():
- self._resolveApps()
-
- # hilighting if this is the selected line
- extraFormat = curses.A_STANDOUT if entryLine == cursorSelection else curses.A_NORMAL
-
- drawEntry = entryLine.getListingEntry(width - scrollOffset, currentTime, self._listingType)
- drawLine = lineNum + detailPanelOffset + 1 - scrollLoc
- drawEntry.render(self, drawLine, scrollOffset, extraFormat)
- if drawLine >= height: break
-
- self.valsLock.release()
-
- def stop(self):
- """
- Halts further resolutions and terminates the thread.
- """
-
- self._cond.acquire()
- self._halt = True
- self._cond.notifyAll()
- self._cond.release()
-
- def _update(self):
- """
- Fetches the newest resolved connections.
- """
-
- connResolver = connections.getResolver("tor")
- currentResolutionCount = connResolver.getResolutionCount()
- self.appResolveSinceUpdate = False
-
- if self._lastResourceFetch != currentResolutionCount:
- self.valsLock.acquire()
-
- newEntries = [] # the new results we'll display
-
- # Fetches new connections and client circuits...
- # newConnections [(local ip, local port, foreign ip, foreign port)...]
- # newCircuits {circuitID => (status, purpose, path)...}
-
- newConnections = connResolver.getConnections()
- newCircuits = {}
-
- for circuitID, status, purpose, path in torTools.getConn().getCircuits():
- # Skips established single-hop circuits (these are for directory
- # fetches, not client circuits)
- if not (status == "BUILT" and len(path) == 1):
- newCircuits[circuitID] = (status, purpose, path)
-
- # Populates newEntries with any of our old entries that still exist.
- # This is both for performance and to keep from resetting the uptime
- # attributes. Note that CircEntries are a ConnectionEntry subclass so
- # we need to check for them first.
-
- for oldEntry in self._entries:
- if isinstance(oldEntry, circEntry.CircEntry):
- newEntry = newCircuits.get(oldEntry.circuitID)
-
- if newEntry:
- oldEntry.update(newEntry[0], newEntry[2])
- newEntries.append(oldEntry)
- del newCircuits[oldEntry.circuitID]
- elif isinstance(oldEntry, connEntry.ConnectionEntry):
- connLine = oldEntry.getLines()[0]
- connAttr = (connLine.local.getIpAddr(), connLine.local.getPort(),
- connLine.foreign.getIpAddr(), connLine.foreign.getPort())
-
- if connAttr in newConnections:
- newEntries.append(oldEntry)
- newConnections.remove(connAttr)
-
- # Reset any display attributes for the entries we're keeping
- for entry in newEntries: entry.resetDisplay()
-
- # Adds any new connection and circuit entries.
- for lIp, lPort, fIp, fPort in newConnections:
- newConnEntry = connEntry.ConnectionEntry(lIp, lPort, fIp, fPort)
- if newConnEntry.getLines()[0].getType() != connEntry.Category.CIRCUIT:
- newEntries.append(newConnEntry)
-
- for circuitID in newCircuits:
- status, purpose, path = newCircuits[circuitID]
- newEntries.append(circEntry.CircEntry(circuitID, status, purpose, path))
-
- # Counts the relays in each of the categories. This also flushes the
- # type cache for all of the connections (in case its changed since last
- # fetched).
-
- categoryTypes = connEntry.Category.values()
- typeCounts = dict((type, 0) for type in categoryTypes)
- for entry in newEntries:
- if isinstance(entry, connEntry.ConnectionEntry):
- typeCounts[entry.getLines()[0].getType()] += 1
- elif isinstance(entry, circEntry.CircEntry):
- typeCounts[connEntry.Category.CIRCUIT] += 1
-
- # makes labels for all the categories with connections (ie,
- # "21 outbound", "1 control", etc)
- countLabels = []
-
- for category in categoryTypes:
- if typeCounts[category] > 0:
- countLabels.append("%i %s" % (typeCounts[category], category.lower()))
-
- if countLabels: self._title = "Connections (%s):" % ", ".join(countLabels)
- else: self._title = "Connections:"
-
- self._entries = newEntries
-
- self._entryLines = []
- for entry in self._entries:
- self._entryLines += entry.getLines()
-
- self.setSortOrder()
- self._lastResourceFetch = currentResolutionCount
- self.valsLock.release()
-
- def _resolveApps(self, flagQuery = True):
- """
- Triggers an asynchronous query for all unresolved SOCKS, HIDDEN, and
- CONTROL entries.
-
- Arguments:
- flagQuery - sets a flag to prevent further call from being respected
- until the next update if true
- """
-
- if self.appResolveSinceUpdate or not self._config["features.connection.resolveApps"]: return
- unresolvedLines = [l for l in self._entryLines if isinstance(l, connEntry.ConnectionLine) and l.isUnresolvedApp()]
-
- # get the ports used for unresolved applications
- appPorts = []
-
- for line in unresolvedLines:
- appConn = line.local if line.getType() == connEntry.Category.HIDDEN else line.foreign
- appPorts.append(appConn.getPort())
-
- # Queue up resolution for the unresolved ports (skips if it's still working
- # on the last query).
- if appPorts and not self._appResolver.isResolving:
- self._appResolver.resolve(appPorts)
-
- # Fetches results. If the query finishes quickly then this is what we just
- # asked for, otherwise these belong to an earlier resolution.
- #
- # The application resolver might have given up querying (for instance, if
- # the lsof lookups aren't working on this platform or lacks permissions).
- # The isAppResolving flag lets the unresolved entries indicate if there's
- # a lookup in progress for them or not.
-
- appResults = self._appResolver.getResults(0.2)
-
- for line in unresolvedLines:
- isLocal = line.getType() == connEntry.Category.HIDDEN
- linePort = line.local.getPort() if isLocal else line.foreign.getPort()
-
- if linePort in appResults:
- # sets application attributes if there's a result with this as the
- # inbound port
- for inboundPort, outboundPort, cmd, pid in appResults[linePort]:
- appPort = outboundPort if isLocal else inboundPort
-
- if linePort == appPort:
- line.appName = cmd
- line.appPid = pid
- line.isAppResolving = False
- else:
- line.isAppResolving = self._appResolver.isResolving
-
- if flagQuery:
- self.appResolveSinceUpdate = True
-
Copied: arm/release/src/interface/connections/connPanel.py (from rev 24554, arm/trunk/src/interface/connections/connPanel.py)
===================================================================
--- arm/release/src/interface/connections/connPanel.py (rev 0)
+++ arm/release/src/interface/connections/connPanel.py 2011-04-04 15:22:31 UTC (rev 24555)
@@ -0,0 +1,398 @@
+"""
+Listing of the currently established connections tor has made.
+"""
+
+import time
+import curses
+import threading
+
+from interface.connections import entries, connEntry, circEntry
+from util import connections, enum, panel, torTools, uiTools
+
+DEFAULT_CONFIG = {"features.connection.resolveApps": True,
+ "features.connection.listingType": 0,
+ "features.connection.refreshRate": 5}
+
+# height of the detail panel content, not counting top and bottom border
+DETAILS_HEIGHT = 7
+
+# listing types
+Listing = enum.Enum(("IP_ADDRESS", "IP Address"), "HOSTNAME", "FINGERPRINT", "NICKNAME")
+
+DEFAULT_SORT_ORDER = (entries.SortAttr.CATEGORY, entries.SortAttr.LISTING, entries.SortAttr.UPTIME)
+
+class ConnectionPanel(panel.Panel, threading.Thread):
+ """
+ Listing of connections tor is making, with information correlated against
+ the current consensus and other data sources.
+ """
+
+ def __init__(self, stdscr, config=None):
+ panel.Panel.__init__(self, stdscr, "conn", 0)
+ threading.Thread.__init__(self)
+ self.setDaemon(True)
+
+ self._sortOrdering = DEFAULT_SORT_ORDER
+ self._config = dict(DEFAULT_CONFIG)
+
+ if config:
+ config.update(self._config, {
+ "features.connection.listingType": (0, len(Listing.values()) - 1),
+ "features.connection.refreshRate": 1})
+
+ sortFields = entries.SortAttr.values()
+ customOrdering = config.getIntCSV("features.connection.order", None, 3, 0, len(sortFields))
+
+ if customOrdering:
+ self._sortOrdering = [sortFields[i] for i in customOrdering]
+
+ self._listingType = Listing.values()[self._config["features.connection.listingType"]]
+ self._scroller = uiTools.Scroller(True)
+ self._title = "Connections:" # title line of the panel
+ self._entries = [] # last fetched display entries
+ self._entryLines = [] # individual lines rendered from the entries listing
+ self._showDetails = False # presents the details panel if true
+
+ self._lastUpdate = -1 # time the content was last revised
+ self._isTorRunning = True # indicates if tor is currently running or not
+ self._isPaused = True # prevents updates if true
+ self._pauseTime = None # time when the panel was paused
+ self._halt = False # terminates thread if true
+ self._cond = threading.Condition() # used for pausing the thread
+ self.valsLock = threading.RLock()
+
+ # Last sampling received from the ConnectionResolver, used to detect when
+ # it changes.
+ self._lastResourceFetch = -1
+
+ # resolver for the command/pid associated with SOCKS, HIDDEN, and CONTROL connections
+ self._appResolver = connections.AppResolver("arm")
+
+ # rate limits appResolver queries to once per update
+ self.appResolveSinceUpdate = False
+
+ self._update() # populates initial entries
+ self._resolveApps(False) # resolves initial applications
+
+ # mark the initially exitsing connection uptimes as being estimates
+ for entry in self._entries:
+ if isinstance(entry, connEntry.ConnectionEntry):
+ entry.getLines()[0].isInitialConnection = True
+
+ # listens for when tor stops so we know to stop reflecting changes
+ torTools.getConn().addStatusListener(self.torStateListener)
+
+ def torStateListener(self, conn, eventType):
+ """
+ Freezes the connection contents when Tor stops.
+
+ Arguments:
+ conn - tor controller
+ eventType - type of event detected
+ """
+
+ self._isTorRunning = eventType == torTools.State.INIT
+
+ if self._isPaused or not self._isTorRunning:
+ if not self._pauseTime: self._pauseTime = time.time()
+ else: self._pauseTime = None
+
+ self.redraw(True)
+
+ def setPaused(self, isPause):
+ """
+ If true, prevents the panel from updating.
+ """
+
+ if not self._isPaused == isPause:
+ self._isPaused = isPause
+
+ if isPause or not self._isTorRunning:
+ if not self._pauseTime: self._pauseTime = time.time()
+ else: self._pauseTime = None
+
+ # redraws so the display reflects any changes between the last update
+ # and being paused
+ self.redraw(True)
+
+ def setSortOrder(self, ordering = None):
+ """
+ Sets the connection attributes we're sorting by and resorts the contents.
+
+ Arguments:
+ ordering - new ordering, if undefined then this resorts with the last
+ set ordering
+ """
+
+ self.valsLock.acquire()
+ if ordering: self._sortOrdering = ordering
+ self._entries.sort(key=lambda i: (i.getSortValues(self._sortOrdering, self._listingType)))
+
+ self._entryLines = []
+ for entry in self._entries:
+ self._entryLines += entry.getLines()
+ self.valsLock.release()
+
+ def setListingType(self, listingType):
+ """
+ Sets the priority information presented by the panel.
+
+ Arguments:
+ listingType - Listing instance for the primary information to be shown
+ """
+
+ self.valsLock.acquire()
+ self._listingType = listingType
+
+ # if we're sorting by the listing then we need to resort
+ if entries.SortAttr.LISTING in self._sortOrdering:
+ self.setSortOrder()
+
+ self.valsLock.release()
+
+ def handleKey(self, key):
+ self.valsLock.acquire()
+
+ if uiTools.isScrollKey(key):
+ pageHeight = self.getPreferredSize()[0] - 1
+ if self._showDetails: pageHeight -= (DETAILS_HEIGHT + 1)
+ isChanged = self._scroller.handleKey(key, self._entryLines, pageHeight)
+ if isChanged: self.redraw(True)
+ elif uiTools.isSelectionKey(key):
+ self._showDetails = not self._showDetails
+ self.redraw(True)
+
+ self.valsLock.release()
+
+ def run(self):
+ """
+ Keeps connections listing updated, checking for new entries at a set rate.
+ """
+
+ lastDraw = time.time() - 1
+ while not self._halt:
+ currentTime = time.time()
+
+ if self._isPaused or not self._isTorRunning or currentTime - lastDraw < self._config["features.connection.refreshRate"]:
+ self._cond.acquire()
+ if not self._halt: self._cond.wait(0.2)
+ self._cond.release()
+ else:
+ # updates content if their's new results, otherwise just redraws
+ self._update()
+ self.redraw(True)
+
+ # we may have missed multiple updates due to being paused, showing
+ # another panel, etc so lastDraw might need to jump multiple ticks
+ drawTicks = (time.time() - lastDraw) / self._config["features.connection.refreshRate"]
+ lastDraw += self._config["features.connection.refreshRate"] * drawTicks
+
+ def draw(self, width, height):
+ self.valsLock.acquire()
+
+ # extra line when showing the detail panel is for the bottom border
+ detailPanelOffset = DETAILS_HEIGHT + 1 if self._showDetails else 0
+ isScrollbarVisible = len(self._entryLines) > height - detailPanelOffset - 1
+
+ scrollLoc = self._scroller.getScrollLoc(self._entryLines, height - detailPanelOffset - 1)
+ cursorSelection = self._scroller.getCursorSelection(self._entryLines)
+
+ # draws the detail panel if currently displaying it
+ if self._showDetails:
+ # This is a solid border unless the scrollbar is visible, in which case a
+ # 'T' pipe connects the border to the bar.
+ uiTools.drawBox(self, 0, 0, width, DETAILS_HEIGHT + 2)
+ if isScrollbarVisible: self.addch(DETAILS_HEIGHT + 1, 1, curses.ACS_TTEE)
+
+ drawEntries = cursorSelection.getDetails(width)
+ for i in range(min(len(drawEntries), DETAILS_HEIGHT)):
+ drawEntries[i].render(self, 1 + i, 2)
+
+ # title label with connection counts
+ title = "Connection Details:" if self._showDetails else self._title
+ self.addstr(0, 0, title, curses.A_STANDOUT)
+
+ scrollOffset = 1
+ if isScrollbarVisible:
+ scrollOffset = 3
+ self.addScrollBar(scrollLoc, scrollLoc + height - detailPanelOffset - 1, len(self._entryLines), 1 + detailPanelOffset)
+
+ currentTime = self._pauseTime if self._pauseTime else time.time()
+ for lineNum in range(scrollLoc, len(self._entryLines)):
+ entryLine = self._entryLines[lineNum]
+
+ # if this is an unresolved SOCKS, HIDDEN, or CONTROL entry then queue up
+ # resolution for the applicaitions they belong to
+ if isinstance(entryLine, connEntry.ConnectionLine) and entryLine.isUnresolvedApp():
+ self._resolveApps()
+
+ # hilighting if this is the selected line
+ extraFormat = curses.A_STANDOUT if entryLine == cursorSelection else curses.A_NORMAL
+
+ drawEntry = entryLine.getListingEntry(width - scrollOffset, currentTime, self._listingType)
+ drawLine = lineNum + detailPanelOffset + 1 - scrollLoc
+ drawEntry.render(self, drawLine, scrollOffset, extraFormat)
+ if drawLine >= height: break
+
+ self.valsLock.release()
+
+ def stop(self):
+ """
+ Halts further resolutions and terminates the thread.
+ """
+
+ self._cond.acquire()
+ self._halt = True
+ self._cond.notifyAll()
+ self._cond.release()
+
+ def _update(self):
+ """
+ Fetches the newest resolved connections.
+ """
+
+ connResolver = connections.getResolver("tor")
+ currentResolutionCount = connResolver.getResolutionCount()
+ self.appResolveSinceUpdate = False
+
+ if self._lastResourceFetch != currentResolutionCount:
+ self.valsLock.acquire()
+
+ newEntries = [] # the new results we'll display
+
+ # Fetches new connections and client circuits...
+ # newConnections [(local ip, local port, foreign ip, foreign port)...]
+ # newCircuits {circuitID => (status, purpose, path)...}
+
+ newConnections = connResolver.getConnections()
+ newCircuits = {}
+
+ for circuitID, status, purpose, path in torTools.getConn().getCircuits():
+ # Skips established single-hop circuits (these are for directory
+ # fetches, not client circuits)
+ if not (status == "BUILT" and len(path) == 1):
+ newCircuits[circuitID] = (status, purpose, path)
+
+ # Populates newEntries with any of our old entries that still exist.
+ # This is both for performance and to keep from resetting the uptime
+ # attributes. Note that CircEntries are a ConnectionEntry subclass so
+ # we need to check for them first.
+
+ for oldEntry in self._entries:
+ if isinstance(oldEntry, circEntry.CircEntry):
+ newEntry = newCircuits.get(oldEntry.circuitID)
+
+ if newEntry:
+ oldEntry.update(newEntry[0], newEntry[2])
+ newEntries.append(oldEntry)
+ del newCircuits[oldEntry.circuitID]
+ elif isinstance(oldEntry, connEntry.ConnectionEntry):
+ connLine = oldEntry.getLines()[0]
+ connAttr = (connLine.local.getIpAddr(), connLine.local.getPort(),
+ connLine.foreign.getIpAddr(), connLine.foreign.getPort())
+
+ if connAttr in newConnections:
+ newEntries.append(oldEntry)
+ newConnections.remove(connAttr)
+
+ # Reset any display attributes for the entries we're keeping
+ for entry in newEntries: entry.resetDisplay()
+
+ # Adds any new connection and circuit entries.
+ for lIp, lPort, fIp, fPort in newConnections:
+ newConnEntry = connEntry.ConnectionEntry(lIp, lPort, fIp, fPort)
+ if newConnEntry.getLines()[0].getType() != connEntry.Category.CIRCUIT:
+ newEntries.append(newConnEntry)
+
+ for circuitID in newCircuits:
+ status, purpose, path = newCircuits[circuitID]
+ newEntries.append(circEntry.CircEntry(circuitID, status, purpose, path))
+
+ # Counts the relays in each of the categories. This also flushes the
+ # type cache for all of the connections (in case its changed since last
+ # fetched).
+
+ categoryTypes = connEntry.Category.values()
+ typeCounts = dict((type, 0) for type in categoryTypes)
+ for entry in newEntries:
+ if isinstance(entry, connEntry.ConnectionEntry):
+ typeCounts[entry.getLines()[0].getType()] += 1
+ elif isinstance(entry, circEntry.CircEntry):
+ typeCounts[connEntry.Category.CIRCUIT] += 1
+
+ # makes labels for all the categories with connections (ie,
+ # "21 outbound", "1 control", etc)
+ countLabels = []
+
+ for category in categoryTypes:
+ if typeCounts[category] > 0:
+ countLabels.append("%i %s" % (typeCounts[category], category.lower()))
+
+ if countLabels: self._title = "Connections (%s):" % ", ".join(countLabels)
+ else: self._title = "Connections:"
+
+ self._entries = newEntries
+
+ self._entryLines = []
+ for entry in self._entries:
+ self._entryLines += entry.getLines()
+
+ self.setSortOrder()
+ self._lastResourceFetch = currentResolutionCount
+ self.valsLock.release()
+
+ def _resolveApps(self, flagQuery = True):
+ """
+ Triggers an asynchronous query for all unresolved SOCKS, HIDDEN, and
+ CONTROL entries.
+
+ Arguments:
+ flagQuery - sets a flag to prevent further call from being respected
+ until the next update if true
+ """
+
+ if self.appResolveSinceUpdate or not self._config["features.connection.resolveApps"]: return
+ unresolvedLines = [l for l in self._entryLines if isinstance(l, connEntry.ConnectionLine) and l.isUnresolvedApp()]
+
+ # get the ports used for unresolved applications
+ appPorts = []
+
+ for line in unresolvedLines:
+ appConn = line.local if line.getType() == connEntry.Category.HIDDEN else line.foreign
+ appPorts.append(appConn.getPort())
+
+ # Queue up resolution for the unresolved ports (skips if it's still working
+ # on the last query).
+ if appPorts and not self._appResolver.isResolving:
+ self._appResolver.resolve(appPorts)
+
+ # Fetches results. If the query finishes quickly then this is what we just
+ # asked for, otherwise these belong to an earlier resolution.
+ #
+ # The application resolver might have given up querying (for instance, if
+ # the lsof lookups aren't working on this platform or lacks permissions).
+ # The isAppResolving flag lets the unresolved entries indicate if there's
+ # a lookup in progress for them or not.
+
+ appResults = self._appResolver.getResults(0.2)
+
+ for line in unresolvedLines:
+ isLocal = line.getType() == connEntry.Category.HIDDEN
+ linePort = line.local.getPort() if isLocal else line.foreign.getPort()
+
+ if linePort in appResults:
+ # sets application attributes if there's a result with this as the
+ # inbound port
+ for inboundPort, outboundPort, cmd, pid in appResults[linePort]:
+ appPort = outboundPort if isLocal else inboundPort
+
+ if linePort == appPort:
+ line.appName = cmd
+ line.appPid = pid
+ line.isAppResolving = False
+ else:
+ line.isAppResolving = self._appResolver.isResolving
+
+ if flagQuery:
+ self.appResolveSinceUpdate = True
+
Deleted: arm/release/src/interface/connections/entries.py
===================================================================
--- arm/trunk/src/interface/connections/entries.py 2011-04-04 15:15:20 UTC (rev 24554)
+++ arm/release/src/interface/connections/entries.py 2011-04-04 15:22:31 UTC (rev 24555)
@@ -1,183 +0,0 @@
-"""
-Interface for entries in the connection panel. These consist of two parts: the
-entry itself (ie, Tor connection, client circuit, etc) and the lines it
-consists of in the listing.
-"""
-
-from util import enum
-
-# attributes we can list entries by
-ListingType = enum.Enum(("IP_ADDRESS", "IP Address"), "HOSTNAME", "FINGERPRINT", "NICKNAME")
-
-SortAttr = enum.Enum("CATEGORY", "UPTIME", "LISTING", "IP_ADDRESS", "PORT",
- "HOSTNAME", "FINGERPRINT", "NICKNAME", "COUNTRY")
-
-SORT_COLORS = {SortAttr.CATEGORY: "red", SortAttr.UPTIME: "yellow",
- SortAttr.LISTING: "green", SortAttr.IP_ADDRESS: "blue",
- SortAttr.PORT: "blue", SortAttr.HOSTNAME: "magenta",
- SortAttr.FINGERPRINT: "cyan", SortAttr.NICKNAME: "cyan",
- SortAttr.COUNTRY: "blue"}
-
-# maximum number of ports a system can have
-PORT_COUNT = 65536
-
-class ConnectionPanelEntry:
- """
- Common parent for connection panel entries. This consists of a list of lines
- in the panel listing. This caches results until the display indicates that
- they should be flushed.
- """
-
- def __init__(self):
- self.lines = []
- self.flushCache = True
-
- def getLines(self):
- """
- Provides the individual lines in the connection listing.
- """
-
- if self.flushCache:
- self.lines = self._getLines(self.lines)
- self.flushCache = False
-
- return self.lines
-
- def _getLines(self, oldResults):
- # implementation of getLines
-
- for line in oldResults:
- line.resetDisplay()
-
- return oldResults
-
- def getSortValues(self, sortAttrs, listingType):
- """
- Provides the value used in comparisons to sort based on the given
- attribute.
-
- Arguments:
- sortAttrs - list of SortAttr values for the field being sorted on
- listingType - ListingType enumeration for the attribute we're listing
- entries by
- """
-
- return [self.getSortValue(attr, listingType) for attr in sortAttrs]
-
- def getSortValue(self, attr, listingType):
- """
- Provides the value of a single attribute used for sorting purposes.
-
- Arguments:
- attr - list of SortAttr values for the field being sorted on
- listingType - ListingType enumeration for the attribute we're listing
- entries by
- """
-
- if attr == SortAttr.LISTING:
- if listingType == ListingType.IP_ADDRESS:
- # uses the IP address as the primary value, and port as secondary
- sortValue = self.getSortValue(SortAttr.IP_ADDRESS, listingType) * PORT_COUNT
- sortValue += self.getSortValue(SortAttr.PORT, listingType)
- return sortValue
- elif listingType == ListingType.HOSTNAME:
- return self.getSortValue(SortAttr.HOSTNAME, listingType)
- elif listingType == ListingType.FINGERPRINT:
- return self.getSortValue(SortAttr.FINGERPRINT, listingType)
- elif listingType == ListingType.NICKNAME:
- return self.getSortValue(SortAttr.NICKNAME, listingType)
-
- return ""
-
- def resetDisplay(self):
- """
- Flushes cached display results.
- """
-
- self.flushCache = True
-
-class ConnectionPanelLine:
- """
- Individual line in the connection panel listing.
- """
-
- def __init__(self):
- # cache for displayed information
- self._listingCache = None
- self._listingCacheArgs = (None, None)
-
- self._detailsCache = None
- self._detailsCacheArgs = None
-
- self._descriptorCache = None
- self._descriptorCacheArgs = None
-
- def getListingEntry(self, width, currentTime, listingType):
- """
- Provides a DrawEntry instance for contents to be displayed in the
- connection panel listing.
-
- Arguments:
- width - available space to display in
- currentTime - unix timestamp for what the results should consider to be
- the current time (this may be ignored due to caching)
- listingType - ListingType enumeration for the highest priority content
- to be displayed
- """
-
- if self._listingCacheArgs != (width, listingType):
- self._listingCache = self._getListingEntry(width, currentTime, listingType)
- self._listingCacheArgs = (width, listingType)
-
- return self._listingCache
-
- def _getListingEntry(self, width, currentTime, listingType):
- # implementation of getListingEntry
- return None
-
- def getDetails(self, width):
- """
- Provides a list of DrawEntry instances with detailed information for this
- connection.
-
- Arguments:
- width - available space to display in
- """
-
- if self._detailsCacheArgs != width:
- self._detailsCache = self._getDetails(width)
- self._detailsCacheArgs = width
-
- return self._detailsCache
-
- def _getDetails(self, width):
- # implementation of getDetails
- return []
-
- def getDescriptor(self, width):
- """
- Provides a list of DrawEntry instances with descriptor information for
- this connection.
-
- Arguments:
- width - available space to display in
- """
-
- if self._descriptorCacheArgs != width:
- self._descriptorCache = self._getDescriptor(width)
- self._descriptorCacheArgs = width
-
- return self._descriptorCache
-
- def _getDescriptor(self, width):
- # implementation of getDescriptor
- return []
-
- def resetDisplay(self):
- """
- Flushes cached display results.
- """
-
- self._listingCacheArgs = (None, None)
- self._detailsCacheArgs = None
-
Copied: arm/release/src/interface/connections/entries.py (from rev 24554, arm/trunk/src/interface/connections/entries.py)
===================================================================
--- arm/release/src/interface/connections/entries.py (rev 0)
+++ arm/release/src/interface/connections/entries.py 2011-04-04 15:22:31 UTC (rev 24555)
@@ -0,0 +1,183 @@
+"""
+Interface for entries in the connection panel. These consist of two parts: the
+entry itself (ie, Tor connection, client circuit, etc) and the lines it
+consists of in the listing.
+"""
+
+from util import enum
+
+# attributes we can list entries by
+ListingType = enum.Enum(("IP_ADDRESS", "IP Address"), "HOSTNAME", "FINGERPRINT", "NICKNAME")
+
+SortAttr = enum.Enum("CATEGORY", "UPTIME", "LISTING", "IP_ADDRESS", "PORT",
+ "HOSTNAME", "FINGERPRINT", "NICKNAME", "COUNTRY")
+
+SORT_COLORS = {SortAttr.CATEGORY: "red", SortAttr.UPTIME: "yellow",
+ SortAttr.LISTING: "green", SortAttr.IP_ADDRESS: "blue",
+ SortAttr.PORT: "blue", SortAttr.HOSTNAME: "magenta",
+ SortAttr.FINGERPRINT: "cyan", SortAttr.NICKNAME: "cyan",
+ SortAttr.COUNTRY: "blue"}
+
+# maximum number of ports a system can have
+PORT_COUNT = 65536
+
+class ConnectionPanelEntry:
+ """
+ Common parent for connection panel entries. This consists of a list of lines
+ in the panel listing. This caches results until the display indicates that
+ they should be flushed.
+ """
+
+ def __init__(self):
+ self.lines = []
+ self.flushCache = True
+
+ def getLines(self):
+ """
+ Provides the individual lines in the connection listing.
+ """
+
+ if self.flushCache:
+ self.lines = self._getLines(self.lines)
+ self.flushCache = False
+
+ return self.lines
+
+ def _getLines(self, oldResults):
+ # implementation of getLines
+
+ for line in oldResults:
+ line.resetDisplay()
+
+ return oldResults
+
+ def getSortValues(self, sortAttrs, listingType):
+ """
+ Provides the value used in comparisons to sort based on the given
+ attribute.
+
+ Arguments:
+ sortAttrs - list of SortAttr values for the field being sorted on
+ listingType - ListingType enumeration for the attribute we're listing
+ entries by
+ """
+
+ return [self.getSortValue(attr, listingType) for attr in sortAttrs]
+
+ def getSortValue(self, attr, listingType):
+ """
+ Provides the value of a single attribute used for sorting purposes.
+
+ Arguments:
+ attr - list of SortAttr values for the field being sorted on
+ listingType - ListingType enumeration for the attribute we're listing
+ entries by
+ """
+
+ if attr == SortAttr.LISTING:
+ if listingType == ListingType.IP_ADDRESS:
+ # uses the IP address as the primary value, and port as secondary
+ sortValue = self.getSortValue(SortAttr.IP_ADDRESS, listingType) * PORT_COUNT
+ sortValue += self.getSortValue(SortAttr.PORT, listingType)
+ return sortValue
+ elif listingType == ListingType.HOSTNAME:
+ return self.getSortValue(SortAttr.HOSTNAME, listingType)
+ elif listingType == ListingType.FINGERPRINT:
+ return self.getSortValue(SortAttr.FINGERPRINT, listingType)
+ elif listingType == ListingType.NICKNAME:
+ return self.getSortValue(SortAttr.NICKNAME, listingType)
+
+ return ""
+
+ def resetDisplay(self):
+ """
+ Flushes cached display results.
+ """
+
+ self.flushCache = True
+
+class ConnectionPanelLine:
+ """
+ Individual line in the connection panel listing.
+ """
+
+ def __init__(self):
+ # cache for displayed information
+ self._listingCache = None
+ self._listingCacheArgs = (None, None)
+
+ self._detailsCache = None
+ self._detailsCacheArgs = None
+
+ self._descriptorCache = None
+ self._descriptorCacheArgs = None
+
+ def getListingEntry(self, width, currentTime, listingType):
+ """
+ Provides a DrawEntry instance for contents to be displayed in the
+ connection panel listing.
+
+ Arguments:
+ width - available space to display in
+ currentTime - unix timestamp for what the results should consider to be
+ the current time (this may be ignored due to caching)
+ listingType - ListingType enumeration for the highest priority content
+ to be displayed
+ """
+
+ if self._listingCacheArgs != (width, listingType):
+ self._listingCache = self._getListingEntry(width, currentTime, listingType)
+ self._listingCacheArgs = (width, listingType)
+
+ return self._listingCache
+
+ def _getListingEntry(self, width, currentTime, listingType):
+ # implementation of getListingEntry
+ return None
+
+ def getDetails(self, width):
+ """
+ Provides a list of DrawEntry instances with detailed information for this
+ connection.
+
+ Arguments:
+ width - available space to display in
+ """
+
+ if self._detailsCacheArgs != width:
+ self._detailsCache = self._getDetails(width)
+ self._detailsCacheArgs = width
+
+ return self._detailsCache
+
+ def _getDetails(self, width):
+ # implementation of getDetails
+ return []
+
+ def getDescriptor(self, width):
+ """
+ Provides a list of DrawEntry instances with descriptor information for
+ this connection.
+
+ Arguments:
+ width - available space to display in
+ """
+
+ if self._descriptorCacheArgs != width:
+ self._descriptorCache = self._getDescriptor(width)
+ self._descriptorCacheArgs = width
+
+ return self._descriptorCache
+
+ def _getDescriptor(self, width):
+ # implementation of getDescriptor
+ return []
+
+ def resetDisplay(self):
+ """
+ Flushes cached display results.
+ """
+
+ self._listingCacheArgs = (None, None)
+ self._detailsCacheArgs = None
+
Modified: arm/release/src/interface/controller.py
===================================================================
--- arm/release/src/interface/controller.py 2011-04-04 15:15:20 UTC (rev 24554)
+++ arm/release/src/interface/controller.py 2011-04-04 15:22:31 UTC (rev 24555)
@@ -24,6 +24,9 @@
import descriptorPopup
import fileDescriptorPopup
+import interface.connections.connPanel
+import interface.connections.connEntry
+import interface.connections.entries
from util import conf, log, connections, hostnames, panel, sysTools, torConfig, torTools, uiTools
import graphing.bandwidthStats
import graphing.connStats
@@ -41,13 +44,17 @@
PAGES = [
["graph", "log"],
["conn"],
+ ["conn2"],
["config"],
["torrc"]]
-PAUSEABLE = ["header", "graph", "log", "conn"]
+PAUSEABLE = ["header", "graph", "log", "conn", "conn2"]
+
CONFIG = {"log.torrc.readFailed": log.WARN,
"features.graph.type": 1,
"features.config.prepopulateEditValues": True,
+ "features.connection.oldPanel": False,
+ "features.connection.newPanel": True,
"queries.refreshRate.rate": 5,
"log.torEventTypeUnrecognized": log.NOTICE,
"features.graph.bw.prepopulate": True,
@@ -78,7 +85,7 @@
self.msgText = msgText
self.msgAttr = msgAttr
- def draw(self, subwindow, width, height):
+ def draw(self, width, height):
msgText = self.msgText
msgAttr = self.msgAttr
barTab = 2 # space between msgText and progress bar
@@ -113,7 +120,11 @@
currentPage = self.page
pageCount = len(PAGES)
- if self.isBlindMode:
+ if not CONFIG["features.connection.newPanel"]:
+ if currentPage >= 3: currentPage -= 1
+ pageCount -= 1
+
+ if self.isBlindMode or not CONFIG["features.connection.oldPanel"]:
if currentPage >= 2: currentPage -= 1
pageCount -= 1
@@ -240,7 +251,7 @@
popup.recreate(stdscr, newWidth)
key = 0
- while key not in (curses.KEY_ENTER, 10, ord(' ')):
+ while not uiTools.isSelectionKey(key):
popup.clear()
popup.win.box()
popup.addstr(0, 0, title, curses.A_STANDOUT)
@@ -341,7 +352,7 @@
elif key == curses.KEY_RIGHT: cursorLoc = min(len(selectionOptions) - 1, cursorLoc + 1)
elif key == curses.KEY_UP: cursorLoc = max(0, cursorLoc - 4)
elif key == curses.KEY_DOWN: cursorLoc = min(len(selectionOptions) - 1, cursorLoc + 4)
- elif key in (curses.KEY_ENTER, 10, ord(' ')):
+ elif uiTools.isSelectionKey(key):
# selected entry (the ord of '10' seems needed to pick up enter)
selection = selectionOptions[cursorLoc]
if selection == "Cancel": break
@@ -394,7 +405,7 @@
if connections.isResolverAlive("tor"):
resolver = connections.getResolver("tor")
- resolver.setPaused(eventType == torTools.TOR_CLOSED)
+ resolver.setPaused(eventType == torTools.State.CLOSED)
def selectiveRefresh(panels, page):
"""
@@ -419,6 +430,7 @@
config = conf.getConfig("arm")
config.update(CONFIG)
graphing.graphPanel.loadConfig(config)
+ interface.connections.connEntry.loadConfig(config)
# adds events needed for arm functionality to the torTools REQ_EVENTS mapping
# (they're then included with any setControllerEvents call, and log a more
@@ -471,12 +483,12 @@
duplicateOptions, defaultOptions, mismatchLines, missingOptions = [], [], [], []
for lineNum, issue, msg in corrections:
- if issue == torConfig.VAL_DUPLICATE:
- duplicateOptions.append("%s (line %i)" % (msg, lineNum))
- elif issue == torConfig.VAL_IS_DEFAULT:
- defaultOptions.append("%s (line %i)" % (msg, lineNum))
- elif issue == torConfig.VAL_MISMATCH: mismatchLines.append(lineNum)
- elif issue == torConfig.VAL_MISSING: missingOptions.append(msg)
+ if issue == torConfig.ValidationError.DUPLICATE:
+ duplicateOptions.append("%s (line %i)" % (msg, lineNum + 1))
+ elif issue == torConfig.ValidationError.IS_DEFAULT:
+ defaultOptions.append("%s (line %i)" % (msg, lineNum + 1))
+ elif issue == torConfig.ValidationError.MISMATCH: mismatchLines.append(lineNum + 1)
+ elif issue == torConfig.ValidationError.MISSING: missingOptions.append(msg)
if duplicateOptions or defaultOptions:
msg = "Unneeded torrc entries found. They've been highlighted in blue on the torrc page."
@@ -551,10 +563,21 @@
# before being positioned - the following is a quick hack til rewritten
panels["log"].setPaused(True)
- panels["conn"] = connPanel.ConnPanel(stdscr, conn, isBlindMode)
+ if CONFIG["features.connection.oldPanel"]:
+ panels["conn"] = connPanel.ConnPanel(stdscr, conn, isBlindMode)
+ else:
+ panels["conn"] = panel.Panel(stdscr, "blank", 0, 0, 0)
+ PAUSEABLE.remove("conn")
+
+ if CONFIG["features.connection.newPanel"]:
+ panels["conn2"] = interface.connections.connPanel.ConnectionPanel(stdscr, config)
+ else:
+ panels["conn2"] = panel.Panel(stdscr, "blank", 0, 0, 0)
+ PAUSEABLE.remove("conn2")
+
panels["control"] = ControlPanel(stdscr, isBlindMode)
- panels["config"] = configPanel.ConfigPanel(stdscr, configPanel.TOR_STATE, config)
- panels["torrc"] = torrcPanel.TorrcPanel(stdscr, torrcPanel.TORRC, config)
+ panels["config"] = configPanel.ConfigPanel(stdscr, configPanel.State.TOR, config)
+ panels["torrc"] = torrcPanel.TorrcPanel(stdscr, torrcPanel.Config.TORRC, config)
# provides error if pid coulnd't be determined (hopefully shouldn't happen...)
if not torPid: log.log(log.WARN, "Unable to resolve tor pid, abandoning connection listing")
@@ -577,7 +600,8 @@
conn.add_event_listener(panels["graph"].stats["bandwidth"])
conn.add_event_listener(panels["graph"].stats["system resources"])
if not isBlindMode: conn.add_event_listener(panels["graph"].stats["connections"])
- conn.add_event_listener(panels["conn"])
+ if CONFIG["features.connection.oldPanel"]:
+ conn.add_event_listener(panels["conn"])
conn.add_event_listener(sighupTracker)
# prepopulates bandwidth values from state file
@@ -604,16 +628,18 @@
# tells revised panels to run as daemons
panels["header"].start()
panels["log"].start()
+ if CONFIG["features.connection.newPanel"]:
+ panels["conn2"].start()
# warns if tor isn't updating descriptors
- try:
- if conn.get_option("FetchUselessDescriptors")[0][1] == "0" and conn.get_option("DirPort")[0][1] == "0":
- warning = """Descriptors won't be updated (causing some connection information to be stale) unless:
- a. 'FetchUselessDescriptors 1' is set in your torrc
- b. the directory service is provided ('DirPort' defined)
- c. or tor is used as a client"""
- log.log(log.WARN, warning)
- except (socket.error, TorCtl.ErrorReply, TorCtl.TorCtlClosed): pass
+ #try:
+ # if conn.get_option("FetchUselessDescriptors")[0][1] == "0" and conn.get_option("DirPort")[0][1] == "0":
+ # warning = """Descriptors won't be updated (causing some connection information to be stale) unless:
+ #a. 'FetchUselessDescriptors 1' is set in your torrc
+ #b. the directory service is provided ('DirPort' defined)
+ #c. or tor is used as a client"""
+ # log.log(log.WARN, warning)
+ #except (socket.error, TorCtl.ErrorReply, TorCtl.TorCtlClosed): pass
isUnresponsive = False # true if it's been over ten seconds since the last BW event (probably due to Tor closing)
isPaused = False # if true updates are frozen
@@ -641,6 +667,11 @@
lastSize = None
+ # sets initial visiblity for the pages
+ for i in range(len(PAGES)):
+ isVisible = i == page
+ for entry in PAGES[i]: panels[entry].setVisible(isVisible)
+
# TODO: come up with a nice, clean method for other threads to immediately
# terminate the draw loop and provide a stacktrace
while True:
@@ -657,7 +688,8 @@
#panels["header"]._updateParams(True)
# other panels that use torrc data
- panels["conn"].resetOptions()
+ if CONFIG["features.connection.oldPanel"]:
+ panels["conn"].resetOptions()
#if not isBlindMode: panels["graph"].stats["connections"].resetOptions(conn)
#panels["graph"].stats["bandwidth"].resetOptions()
@@ -718,7 +750,8 @@
isUnresponsive = False
log.log(log.NOTICE, "Relay resumed")
- panels["conn"].reset()
+ if CONFIG["features.connection.oldPanel"]:
+ panels["conn"].reset()
# TODO: part two of hack to prevent premature drawing by log panel
if page == 0 and not isPaused: panels["log"].setPaused(False)
@@ -731,7 +764,7 @@
isResize = lastSize != newSize
lastSize = newSize
- if panelKey in ("header", "graph", "log", "config", "torrc"):
+ if panelKey in ("header", "graph", "log", "config", "torrc", "conn2"):
# revised panel (manages its own content refreshing)
panels[panelKey].redraw(isResize)
else:
@@ -808,11 +841,15 @@
# this appears to be a python bug: http://bugs.python.org/issue3014
# (haven't seen this is quite some time... mysteriously resolved?)
+ torTools.NO_SPAWN = True # prevents further worker threads from being spawned
+
# stops panel daemons
panels["header"].stop()
+ if CONFIG["features.connection.newPanel"]: panels["conn2"].stop()
panels["log"].stop()
panels["header"].join()
+ if CONFIG["features.connection.newPanel"]: panels["conn2"].join()
panels["log"].join()
# joins on utility daemon threads - this might take a moment since
@@ -835,15 +872,25 @@
if key == curses.KEY_LEFT: page = (page - 1) % len(PAGES)
else: page = (page + 1) % len(PAGES)
- # skip connections listing if it's disabled
- if page == 1 and isBlindMode:
- if key == curses.KEY_LEFT: page = (page - 1) % len(PAGES)
- else: page = (page + 1) % len(PAGES)
+ # skip connections listings if it's disabled
+ while True:
+ if page == 1 and (isBlindMode or not CONFIG["features.connection.oldPanel"]):
+ if key == curses.KEY_LEFT: page = (page - 1) % len(PAGES)
+ else: page = (page + 1) % len(PAGES)
+ elif page == 2 and (isBlindMode or not CONFIG["features.connection.newPanel"]):
+ if key == curses.KEY_LEFT: page = (page - 1) % len(PAGES)
+ else: page = (page + 1) % len(PAGES)
+ else: break
# pauses panels that aren't visible to prevent events from accumilating
# (otherwise they'll wait on the curses lock which might get demanding)
setPauseState(panels, isPaused, page)
+ # prevents panels on other pages from redrawing
+ for i in range(len(PAGES)):
+ isVisible = i == page
+ for entry in PAGES[i]: panels[entry].setVisible(isVisible)
+
panels["control"].page = page + 1
# TODO: this redraw doesn't seem necessary (redraws anyway after this
@@ -914,7 +961,7 @@
popup.addfstr(2, 41, "<b>n</b>: decrease graph size")
popup.addfstr(3, 2, "<b>s</b>: graphed stats (<b>%s</b>)" % graphedStats)
popup.addfstr(3, 41, "<b>i</b>: graph update interval (<b>%s</b>)" % graphing.graphPanel.UPDATE_INTERVALS[panels["graph"].updateInterval][0])
- popup.addfstr(4, 2, "<b>b</b>: graph bounds (<b>%s</b>)" % graphing.graphPanel.BOUND_LABELS[panels["graph"].bounds])
+ popup.addfstr(4, 2, "<b>b</b>: graph bounds (<b>%s</b>)" % panels["graph"].bounds.lower())
popup.addfstr(4, 41, "<b>d</b>: file descriptors")
popup.addfstr(5, 2, "<b>e</b>: change logged events")
@@ -940,10 +987,11 @@
resolverUtil = connections.getResolver("tor").overwriteResolver
if resolverUtil == None: resolverUtil = "auto"
- else: resolverUtil = connections.CMD_STR[resolverUtil]
popup.addfstr(4, 41, "<b>u</b>: resolving utility (<b>%s</b>)" % resolverUtil)
- allowDnsLabel = "allow" if panels["conn"].allowDNS else "disallow"
+ if CONFIG["features.connection.oldPanel"]:
+ allowDnsLabel = "allow" if panels["conn"].allowDNS else "disallow"
+ else: allowDnsLabel = "disallow"
popup.addfstr(5, 2, "<b>r</b>: permit DNS resolution (<b>%s</b>)" % allowDnsLabel)
popup.addfstr(5, 41, "<b>s</b>: sort ordering")
@@ -959,8 +1007,18 @@
popup.addfstr(2, 41, "<b>page down</b>: scroll down a page")
popup.addfstr(3, 2, "<b>enter</b>: edit configuration option")
- popup.addfstr(3, 41, "<b>w</b>: save current configuration")
- popup.addfstr(4, 2, "<b>s</b>: sort ordering")
+ #popup.addfstr(3, 41, "<b>d</b>: raw consensus descriptor")
+
+ listingType = panels["conn2"]._listingType.lower()
+ popup.addfstr(4, 2, "<b>l</b>: listed identity (<b>%s</b>)" % listingType)
+
+ popup.addfstr(4, 41, "<b>s</b>: sort ordering")
+
+ resolverUtil = connections.getResolver("tor").overwriteResolver
+ if resolverUtil == None: resolverUtil = "auto"
+ popup.addfstr(3, 41, "<b>u</b>: resolving utility (<b>%s</b>)" % resolverUtil)
+
+ pageOverrideKeys = (ord('l'), ord('s'), ord('u'))
elif page == 3:
popup.addfstr(1, 2, "<b>up arrow</b>: scroll up a line")
popup.addfstr(1, 41, "<b>down arrow</b>: scroll down a line")
@@ -975,6 +1033,12 @@
popup.addfstr(4, 2, "<b>r</b>: reload torrc")
popup.addfstr(4, 41, "<b>x</b>: reset tor (issue sighup)")
+ elif page == 4:
+ popup.addfstr(1, 2, "<b>up arrow</b>: scroll up a line")
+ popup.addfstr(1, 41, "<b>down arrow</b>: scroll down a line")
+ popup.addfstr(2, 2, "<b>page up</b>: scroll up a page")
+ popup.addfstr(2, 41, "<b>page down</b>: scroll down a page")
+ popup.addfstr(3, 2, "<b>enter</b>: connection details")
popup.addstr(7, 2, "Press any key...")
popup.refresh()
@@ -1054,7 +1118,7 @@
selectiveRefresh(panels, page)
elif page == 0 and (key == ord('b') or key == ord('B')):
# uses the next boundary type for graph
- panels["graph"].bounds = (panels["graph"].bounds + 1) % 3
+ panels["graph"].bounds = graphing.graphPanel.Bounds.next(panels["graph"].bounds)
selectiveRefresh(panels, page)
elif page == 0 and key in (ord('d'), ord('D')):
@@ -1245,13 +1309,16 @@
setPauseState(panels, isPaused, page)
finally:
panel.CURSES_LOCK.release()
- elif key == 27 and panels["conn"].listingType == connPanel.LIST_HOSTNAME and panels["control"].resolvingCounter != -1:
+ elif CONFIG["features.connection.oldPanel"] and key == 27 and panels["conn"].listingType == connPanel.LIST_HOSTNAME and panels["control"].resolvingCounter != -1:
# canceling hostname resolution (esc on any page)
panels["conn"].listingType = connPanel.LIST_IP
panels["control"].resolvingCounter = -1
hostnames.setPaused(True)
panels["conn"].sortConnections()
- elif page == 1 and panels["conn"].isCursorEnabled and key in (curses.KEY_ENTER, 10, ord(' ')):
+ elif page == 1 and panels["conn"].isCursorEnabled and uiTools.isSelectionKey(key):
+ # TODO: deprecated when migrated to the new connection panel, thought as
+ # well keep around until there's a counterpart for hostname fetching
+
# provides details on selected connection
panel.CURSES_LOCK.acquire()
try:
@@ -1269,7 +1336,7 @@
curses.cbreak() # wait indefinitely for key presses (no timeout)
key = 0
- while key not in (curses.KEY_ENTER, 10, ord(' ')):
+ while not uiTools.isSelectionKey(key):
popup.clear()
popup.win.box()
popup.addstr(0, 0, "Connection Details:", curses.A_STANDOUT)
@@ -1455,13 +1522,13 @@
hostnames.setPaused(True)
panels["conn"].sortConnections()
- elif page == 1 and (key == ord('u') or key == ord('U')):
+ elif page in (1, 2) and (key == ord('u') or key == ord('U')):
# provides menu to pick identification resolving utility
- optionTypes = [None, connections.CMD_PROC, connections.CMD_NETSTAT, connections.CMD_SOCKSTAT, connections.CMD_LSOF, connections.CMD_SS, connections.CMD_BSD_SOCKSTAT, connections.CMD_BSD_PROCSTAT]
- options = ["auto"] + [connections.CMD_STR[util] for util in optionTypes[1:]]
+ options = ["auto"] + connections.Resolver.values()
- initialSelection = connections.getResolver("tor").overwriteResolver # enums correspond to indices
- if initialSelection == None: initialSelection = 0
+ currentOverwrite = connections.getResolver("tor").overwriteResolver # enums correspond to indices
+ if currentOverwrite == None: initialSelection = 0
+ else: initialSelection = options.index(currentOverwrite)
# hides top label of conn panel and pauses panels
panels["conn"].showLabel = False
@@ -1469,14 +1536,15 @@
setPauseState(panels, isPaused, page, True)
selection = showMenu(stdscr, panels["popup"], "Resolver Util:", options, initialSelection)
+ selectedOption = options[selection] if selection != "auto" else None
# reverts changes made for popup
panels["conn"].showLabel = True
setPauseState(panels, isPaused, page)
# applies new setting
- if selection != -1 and optionTypes[selection] != connections.getResolver("tor").overwriteResolver:
- connections.getResolver("tor").overwriteResolver = optionTypes[selection]
+ if selection != -1 and selectedOption != connections.getResolver("tor").overwriteResolver:
+ connections.getResolver("tor").overwriteResolver = selectedOption
elif page == 1 and (key == ord('s') or key == ord('S')):
# set ordering for connection listing
titleLabel = "Connection Ordering:"
@@ -1543,7 +1611,44 @@
setPauseState(panels, isPaused, page)
finally:
panel.CURSES_LOCK.release()
- elif page == 2 and (key == ord('c') or key == ord('C')) and False:
+ elif page == 2 and (key == ord('l') or key == ord('L')):
+ # provides a menu to pick the primary information we list connections by
+ options = interface.connections.entries.ListingType.values()
+
+ # dropping the HOSTNAME listing type until we support displaying that content
+ options.remove(interface.connections.entries.ListingType.HOSTNAME)
+
+ initialSelection = options.index(panels["conn2"]._listingType)
+
+ # hides top label of connection panel and pauses the display
+ panelTitle = panels["conn2"]._title
+ panels["conn2"]._title = ""
+ panels["conn2"].redraw(True)
+ setPauseState(panels, isPaused, page, True)
+
+ selection = showMenu(stdscr, panels["popup"], "List By:", options, initialSelection)
+
+ # reverts changes made for popup
+ panels["conn2"]._title = panelTitle
+ setPauseState(panels, isPaused, page)
+
+ # applies new setting
+ if selection != -1 and options[selection] != panels["conn2"]._listingType:
+ panels["conn2"].setListingType(options[selection])
+ panels["conn2"].redraw(True)
+ elif page == 2 and (key == ord('s') or key == ord('S')):
+ # set ordering for connection options
+ titleLabel = "Connection Ordering:"
+ options = interface.connections.entries.SortAttr.values()
+ oldSelection = panels["conn2"]._sortOrdering
+ optionColors = dict([(attr, interface.connections.entries.SORT_COLORS[attr]) for attr in options])
+ results = showSortDialog(stdscr, panels, isPaused, page, titleLabel, options, oldSelection, optionColors)
+
+ if results:
+ panels["conn2"].setSortOrder(results)
+
+ panels["conn2"].redraw(True)
+ elif page == 3 and (key == ord('c') or key == ord('C')) and False:
# TODO: disabled for now (probably gonna be going with separate pages
# rather than popup menu)
# provides menu to pick config being displayed
@@ -1566,12 +1671,11 @@
if selection != -1: panels["torrc"].setConfigType(selection)
selectiveRefresh(panels, page)
- elif page == 2 and (key == ord('w') or key == ord('W')):
+ elif page == 3 and (key == ord('w') or key == ord('W')):
# display a popup for saving the current configuration
panel.CURSES_LOCK.acquire()
try:
- configText = torTools.getConn().getInfo("config-text", "").strip()
- configLines = configText.split("\n")
+ configLines = torConfig.getCustomOptions(True)
# lists event types
popup = panels["popup"]
@@ -1594,7 +1698,7 @@
popup.recreate(stdscr)
key, selection = 0, 2
- while key not in (curses.KEY_ENTER, 10, ord(' ')):
+ while not uiTools.isSelectionKey(key):
# if the popup has been resized then recreate it (needed for the
# proper border height)
newHeight, newWidth = panels["popup"].getPreferredSize()
@@ -1669,7 +1773,7 @@
# saves the configuration to the file
configFile = open(configLocation, "w")
- configFile.write(configText)
+ configFile.write("\n".join(configLines))
configFile.close()
# reloads the cached torrc if overwriting it
@@ -1696,12 +1800,12 @@
panel.CURSES_LOCK.release()
panels["config"].redraw(True)
- elif page == 2 and (key == ord('s') or key == ord('S')):
+ elif page == 3 and (key == ord('s') or key == ord('S')):
# set ordering for config options
titleLabel = "Config Option Ordering:"
- options = [configPanel.FIELD_ATTR[i][0] for i in range(8)]
- oldSelection = [configPanel.FIELD_ATTR[entry][0] for entry in panels["config"].sortOrdering]
- optionColors = dict([configPanel.FIELD_ATTR[i] for i in range(8)])
+ options = [configPanel.FIELD_ATTR[field][0] for field in configPanel.Field.values()]
+ oldSelection = [configPanel.FIELD_ATTR[field][0] for field in panels["config"].sortOrdering]
+ optionColors = dict([configPanel.FIELD_ATTR[field] for field in configPanel.Field.values()])
results = showSortDialog(stdscr, panels, isPaused, page, titleLabel, options, oldSelection, optionColors)
if results:
@@ -1717,7 +1821,7 @@
panels["config"].setSortOrder(resultEnums)
panels["config"].redraw(True)
- elif page == 2 and key in (curses.KEY_ENTER, 10, ord(' ')):
+ elif page == 3 and uiTools.isSelectionKey(key):
# let the user edit the configuration value, unchanged if left blank
panel.CURSES_LOCK.acquire()
try:
@@ -1725,13 +1829,13 @@
# provides prompt
selection = panels["config"].getSelection()
- configOption = selection.get(configPanel.FIELD_OPTION)
+ configOption = selection.get(configPanel.Field.OPTION)
titleMsg = "%s Value (esc to cancel): " % configOption
panels["control"].setMsg(titleMsg)
panels["control"].redraw(True)
displayWidth = panels["control"].getPreferredSize()[1]
- initialValue = selection.get(configPanel.FIELD_VALUE)
+ initialValue = selection.get(configPanel.Field.VALUE)
# initial input for the text field
initialText = ""
@@ -1745,19 +1849,19 @@
conn = torTools.getConn()
# if the value's a boolean then allow for 'true' and 'false' inputs
- if selection.get(configPanel.FIELD_TYPE) == "Boolean":
+ if selection.get(configPanel.Field.TYPE) == "Boolean":
if newConfigValue.lower() == "true": newConfigValue = "1"
elif newConfigValue.lower() == "false": newConfigValue = "0"
try:
- if selection.get(configPanel.FIELD_TYPE) == "LineList":
+ if selection.get(configPanel.Field.TYPE) == "LineList":
newConfigValue = newConfigValue.split(",")
conn.setOption(configOption, newConfigValue)
# resets the isDefault flag
customOptions = torConfig.getCustomOptions()
- selection.fields[configPanel.FIELD_IS_DEFAULT] = not configOption in customOptions
+ selection.fields[configPanel.Field.IS_DEFAULT] = not configOption in customOptions
panels["config"].redraw(True)
except Exception, exc:
@@ -1773,7 +1877,7 @@
setPauseState(panels, isPaused, page)
finally:
panel.CURSES_LOCK.release()
- elif page == 3 and key == ord('r') or key == ord('R'):
+ elif page == 4 and key == ord('r') or key == ord('R'):
# reloads torrc, providing a notice if successful or not
loadedTorrc = torConfig.getTorrc()
loadedTorrc.getLock().acquire()
@@ -1803,8 +1907,10 @@
elif page == 1:
panels["conn"].handleKey(key)
elif page == 2:
+ panels["conn2"].handleKey(key)
+ elif page == 3:
panels["config"].handleKey(key)
- elif page == 3:
+ elif page == 4:
panels["torrc"].handleKey(key)
def startTorMonitor(startTime, loggedEvents, isBlindMode):
Modified: arm/release/src/interface/descriptorPopup.py
===================================================================
--- arm/release/src/interface/descriptorPopup.py 2011-04-04 15:15:20 UTC (rev 24554)
+++ arm/release/src/interface/descriptorPopup.py 2011-04-04 15:22:31 UTC (rev 24555)
@@ -106,7 +106,7 @@
draw(popup, properties)
key = stdscr.getch()
- if key in (curses.KEY_ENTER, 10, ord(' '), ord('d'), ord('D')):
+ if uiTools.isSelectionKey(key) or key in (ord('d'), ord('D')):
# closes popup
isVisible = False
elif key in (curses.KEY_LEFT, curses.KEY_RIGHT):
Modified: arm/release/src/interface/graphing/__init__.py
===================================================================
--- arm/release/src/interface/graphing/__init__.py 2011-04-04 15:15:20 UTC (rev 24554)
+++ arm/release/src/interface/graphing/__init__.py 2011-04-04 15:22:31 UTC (rev 24555)
@@ -2,5 +2,5 @@
Panels, popups, and handlers comprising the arm user interface.
"""
-__all__ = ["graphPanel.py", "bandwidthStats", "connStats", "resourceStats"]
+__all__ = ["graphPanel", "bandwidthStats", "connStats", "resourceStats"]
Modified: arm/release/src/interface/graphing/bandwidthStats.py
===================================================================
--- arm/release/src/interface/graphing/bandwidthStats.py 2011-04-04 15:15:20 UTC (rev 24554)
+++ arm/release/src/interface/graphing/bandwidthStats.py 2011-04-04 15:22:31 UTC (rev 24555)
@@ -20,7 +20,8 @@
PREPOPULATE_SUCCESS_MSG = "Read the last day of bandwidth history from the state file"
PREPOPULATE_FAILURE_MSG = "Unable to prepopulate bandwidth information (%s)"
-DEFAULT_CONFIG = {"features.graph.bw.transferInBytes": False,
+DEFAULT_CONFIG = {"features.graph.bw.prepopulateTotal": False,
+ "features.graph.bw.transferInBytes": False,
"features.graph.bw.accounting.show": True,
"features.graph.bw.accounting.rate": 10,
"features.graph.bw.accounting.isTimeLong": False,
@@ -39,6 +40,11 @@
if config:
config.update(self._config, {"features.graph.bw.accounting.rate": 1})
+ # stats prepopulated from tor's state file
+ self.prepopulatePrimaryTotal = 0
+ self.prepopulateSecondaryTotal = 0
+ self.prepopulateTicks = 0
+
# accounting data (set by _updateAccountingInfo method)
self.accountingLastUpdated = 0
self.accountingInfo = dict([(arg, "") for arg in ACCOUNTING_ARGS])
@@ -47,7 +53,7 @@
# rate/burst and if tor's using accounting
conn = torTools.getConn()
self._titleStats, self.isAccounting = [], False
- self.resetListener(conn, torTools.TOR_INIT) # initializes values
+ self.resetListener(conn, torTools.State.INIT) # initializes values
conn.addStatusListener(self.resetListener)
def resetListener(self, conn, eventType):
@@ -55,7 +61,7 @@
self._titleStats = [] # force reset of title
self.new_desc_event(None) # updates title params
- if eventType == torTools.TOR_INIT and self._config["features.graph.bw.accounting.show"]:
+ if eventType == torTools.State.INIT and self._config["features.graph.bw.accounting.show"]:
self.isAccounting = conn.getInfo('accounting/enabled') == '1'
def prepopulateFromState(self):
@@ -164,10 +170,11 @@
readVal, writeVal = bwReadEntries[i], bwWriteEntries[i]
self.lastPrimary, self.lastSecondary = readVal, writeVal
- self.primaryTotal += readVal * 900
- self.secondaryTotal += writeVal * 900
- self.tick += 900
+ self.prepopulatePrimaryTotal += readVal * 900
+ self.prepopulateSecondaryTotal += writeVal * 900
+ self.prepopulateTicks += 900
+
self.primaryCounts[intervalIndex].insert(0, readVal)
self.secondaryCounts[intervalIndex].insert(0, writeVal)
@@ -316,10 +323,15 @@
def _getAvgLabel(self, isPrimary):
total = self.primaryTotal if isPrimary else self.secondaryTotal
- return "avg: %s/sec" % uiTools.getSizeLabel((total / max(1, self.tick)) * 1024, 1, False, self._config["features.graph.bw.transferInBytes"])
+ total += self.prepopulatePrimaryTotal if isPrimary else self.prepopulateSecondaryTotal
+ return "avg: %s/sec" % uiTools.getSizeLabel((total / max(1, self.tick + self.prepopulateTicks)) * 1024, 1, False, self._config["features.graph.bw.transferInBytes"])
def _getTotalLabel(self, isPrimary):
total = self.primaryTotal if isPrimary else self.secondaryTotal
+
+ if self._config["features.graph.bw.prepopulateTotal"]:
+ total += self.prepopulatePrimaryTotal if isPrimary else self.prepopulateSecondaryTotal
+
return "total: %s" % uiTools.getSizeLabel(total * 1024, 1)
def _updateAccountingInfo(self):
Modified: arm/release/src/interface/graphing/connStats.py
===================================================================
--- arm/release/src/interface/graphing/connStats.py 2011-04-04 15:15:20 UTC (rev 24554)
+++ arm/release/src/interface/graphing/connStats.py 2011-04-04 15:22:31 UTC (rev 24555)
@@ -17,11 +17,11 @@
# listens for tor reload (sighup) events which can reset the ports tor uses
conn = torTools.getConn()
self.orPort, self.dirPort, self.controlPort = "0", "0", "0"
- self.resetListener(conn, torTools.TOR_INIT) # initialize port values
+ self.resetListener(conn, torTools.State.INIT) # initialize port values
conn.addStatusListener(self.resetListener)
def resetListener(self, conn, eventType):
- if eventType == torTools.TOR_INIT:
+ if eventType == torTools.State.INIT:
self.orPort = conn.getOption("ORPort", "0")
self.dirPort = conn.getOption("DirPort", "0")
self.controlPort = conn.getOption("ControlPort", "0")
Modified: arm/release/src/interface/graphing/graphPanel.py
===================================================================
--- arm/release/src/interface/graphing/graphPanel.py 2011-04-04 15:15:20 UTC (rev 24554)
+++ arm/release/src/interface/graphing/graphPanel.py 2011-04-04 15:22:31 UTC (rev 24555)
@@ -20,7 +20,7 @@
import curses
from TorCtl import TorCtl
-from util import panel, uiTools
+from util import enum, panel, uiTools
# time intervals at which graphs can be updated
UPDATE_INTERVALS = [("each second", 1), ("5 seconds", 5), ("30 seconds", 30),
@@ -32,11 +32,10 @@
MIN_GRAPH_HEIGHT = 1
# enums for graph bounds:
-# BOUNDS_GLOBAL_MAX - global maximum (highest value ever seen)
-# BOUNDS_LOCAL_MAX - local maximum (highest value currently on the graph)
-# BOUNDS_TIGHT - local maximum and minimum
-BOUNDS_GLOBAL_MAX, BOUNDS_LOCAL_MAX, BOUNDS_TIGHT = range(3)
-BOUND_LABELS = {BOUNDS_GLOBAL_MAX: "global max", BOUNDS_LOCAL_MAX: "local max", BOUNDS_TIGHT: "tight"}
+# Bounds.GLOBAL_MAX - global maximum (highest value ever seen)
+# Bounds.LOCAL_MAX - local maximum (highest value currently on the graph)
+# Bounds.TIGHT - local maximum and minimum
+Bounds = enum.Enum("GLOBAL_MAX", "LOCAL_MAX", "TIGHT")
WIDE_LABELING_GRAPH_COL = 50 # minimum graph columns to use wide spacing for x-axis labels
@@ -248,7 +247,7 @@
def __init__(self, stdscr):
panel.Panel.__init__(self, stdscr, "graph", 0)
self.updateInterval = CONFIG["features.graph.interval"]
- self.bounds = CONFIG["features.graph.bound"]
+ self.bounds = Bounds.values()[CONFIG["features.graph.bound"]]
self.graphHeight = CONFIG["features.graph.height"]
self.currentDisplay = None # label of the stats currently being displayed
self.stats = {} # available stats (mappings of label -> instance)
@@ -276,7 +275,7 @@
self.graphHeight = max(MIN_GRAPH_HEIGHT, newGraphHeight)
- def draw(self, subwindow, width, height):
+ def draw(self, width, height):
""" Redraws graph panel """
if self.currentDisplay:
@@ -294,11 +293,11 @@
if right: self.addstr(1, graphCol + 5, right, curses.A_BOLD | secondaryColor)
# determines max/min value on the graph
- if self.bounds == BOUNDS_GLOBAL_MAX:
+ if self.bounds == Bounds.GLOBAL_MAX:
primaryMaxBound = int(param.maxPrimary[self.updateInterval])
secondaryMaxBound = int(param.maxSecondary[self.updateInterval])
else:
- # both BOUNDS_LOCAL_MAX and BOUNDS_TIGHT use local maxima
+ # both Bounds.LOCAL_MAX and Bounds.TIGHT use local maxima
if graphCol < 2:
# nothing being displayed
primaryMaxBound, secondaryMaxBound = 0, 0
@@ -307,7 +306,7 @@
secondaryMaxBound = int(max(param.secondaryCounts[self.updateInterval][1:graphCol + 1]))
primaryMinBound = secondaryMinBound = 0
- if self.bounds == BOUNDS_TIGHT:
+ if self.bounds == Bounds.TIGHT:
primaryMinBound = int(min(param.primaryCounts[self.updateInterval][1:graphCol + 1]))
secondaryMinBound = int(min(param.secondaryCounts[self.updateInterval][1:graphCol + 1]))
Modified: arm/release/src/interface/headerPanel.py
===================================================================
--- arm/release/src/interface/headerPanel.py 2011-04-04 15:15:20 UTC (rev 24554)
+++ arm/release/src/interface/headerPanel.py 2011-04-04 15:22:31 UTC (rev 24555)
@@ -37,8 +37,8 @@
Top area contenting tor settings and system information. Stats are stored in
the vals mapping, keys including:
tor/ version, versionStatus, nickname, orPort, dirPort, controlPort,
- exitPolicy, isAuthPassword (bool), isAuthCookie (bool)
- *address, *fingerprint, *flags, pid, startTime
+ exitPolicy, isAuthPassword (bool), isAuthCookie (bool),
+ orListenAddr, *address, *fingerprint, *flags, pid, startTime
sys/ hostname, os, version
stat/ *%torCpu, *%armCpu, *rss, *%mem
@@ -95,7 +95,7 @@
if self.vals["tor/orPort"]: return 4 if isWide else 6
else: return 3 if isWide else 4
- def draw(self, subwindow, width, height):
+ def draw(self, width, height):
self.valsLock.acquire()
isWide = width + 1 >= MIN_DUAL_COL_WIDTH
@@ -127,10 +127,14 @@
# Line 2 / Line 2 Left (tor ip/port information)
if self.vals["tor/orPort"]:
+ myAddress = "Unknown"
+ if self.vals["tor/orListenAddr"]: myAddress = self.vals["tor/orListenAddr"]
+ elif self.vals["tor/address"]: myAddress = self.vals["tor/address"]
+
# acting as a relay (we can assume certain parameters are set
entry = ""
dirPortLabel = ", Dir Port: %s" % self.vals["tor/dirPort"] if self.vals["tor/dirPort"] != "0" else ""
- for label in (self.vals["tor/nickname"], " - " + self.vals["tor/address"], ":" + self.vals["tor/orPort"], dirPortLabel):
+ for label in (self.vals["tor/nickname"], " - " + myAddress, ":" + self.vals["tor/orPort"], dirPortLabel):
if len(entry) + len(label) <= leftWidth: entry += label
else: break
else:
@@ -239,7 +243,7 @@
def run(self):
"""
- Keeps stats updated, querying new information at a set rate.
+ Keeps stats updated, checking for new information at a set rate.
"""
lastDraw = time.time() - 1
@@ -288,14 +292,14 @@
eventType - type of event detected
"""
- if eventType == torTools.TOR_INIT:
+ if eventType == torTools.State.INIT:
self._isTorConnected = True
if self._isPaused: self._haltTime = time.time()
else: self._haltTime = None
self._update(True)
self.redraw(True)
- elif eventType == torTools.TOR_CLOSED:
+ elif eventType == torTools.State.CLOSED:
self._isTorConnected = False
self._haltTime = time.time()
self._update()
@@ -329,15 +333,15 @@
if self.vals["tor/orPort"] == "0": self.vals["tor/orPort"] = ""
# overwrite address if ORListenAddress is set (and possibly orPort too)
- self.vals["tor/address"] = "Unknown"
+ self.vals["tor/orListenAddr"] = ""
listenAddr = conn.getOption("ORListenAddress")
if listenAddr:
if ":" in listenAddr:
# both ip and port overwritten
- self.vals["tor/address"] = listenAddr[:listenAddr.find(":")]
+ self.vals["tor/orListenAddr"] = listenAddr[:listenAddr.find(":")]
self.vals["tor/orPort"] = listenAddr[listenAddr.find(":") + 1:]
else:
- self.vals["tor/address"] = listenAddr
+ self.vals["tor/orListenAddr"] = listenAddr
# fetch exit policy (might span over multiple lines)
policyEntries = []
@@ -368,8 +372,7 @@
# sets volatile parameters
# TODO: This can change, being reported by STATUS_SERVER -> EXTERNAL_ADDRESS
# events. Introduce caching via torTools?
- if self.vals["tor/address"] == "Unknown":
- self.vals["tor/address"] = conn.getInfo("address", self.vals["tor/address"])
+ self.vals["tor/address"] = conn.getInfo("address", "")
self.vals["tor/fingerprint"] = conn.getInfo("fingerprint", self.vals["tor/fingerprint"])
self.vals["tor/flags"] = conn.getMyFlags(self.vals["tor/flags"])
Modified: arm/release/src/interface/logPanel.py
===================================================================
--- arm/release/src/interface/logPanel.py 2011-04-04 15:15:20 UTC (rev 24554)
+++ arm/release/src/interface/logPanel.py 2011-04-04 15:22:31 UTC (rev 24555)
@@ -32,8 +32,8 @@
12345 arm runlevel+ X No Events
67890 torctl runlevel+ U Unknown Events"""
-RUNLEVELS = ["DEBUG", "INFO", "NOTICE", "WARN", "ERR"]
-RUNLEVEL_EVENT_COLOR = {"DEBUG": "magenta", "INFO": "blue", "NOTICE": "green", "WARN": "yellow", "ERR": "red"}
+RUNLEVEL_EVENT_COLOR = {log.DEBUG: "magenta", log.INFO: "blue", log.NOTICE: "green",
+ log.WARN: "yellow", log.ERR: "red"}
DAYBREAK_EVENT = "DAYBREAK" # special event for marking when the date changes
TIMEZONE_OFFSET = time.altzone if time.localtime()[8] else time.timezone
@@ -112,8 +112,8 @@
for flag in eventAbbr:
if flag == "A":
- armRunlevels = ["ARM_" + runlevel for runlevel in RUNLEVELS]
- torctlRunlevels = ["TORCTL_" + runlevel for runlevel in RUNLEVELS]
+ armRunlevels = ["ARM_" + runlevel for runlevel in log.Runlevel.values()]
+ torctlRunlevels = ["TORCTL_" + runlevel for runlevel in log.Runlevel.values()]
expandedEvents = set(TOR_EVENT_TYPES.values() + armRunlevels + torctlRunlevels + ["UNKNOWN"])
break
elif flag == "X":
@@ -131,7 +131,7 @@
elif flag in "W49": runlevelIndex = 3
elif flag in "E50": runlevelIndex = 4
- runlevelSet = [typePrefix + runlevel for runlevel in RUNLEVELS[runlevelIndex:]]
+ runlevelSet = [typePrefix + runlevel for runlevel in log.Runlevel.values()[runlevelIndex:]]
expandedEvents = expandedEvents.union(set(runlevelSet))
elif flag == "U":
expandedEvents.add("UNKNOWN")
@@ -210,16 +210,17 @@
# if the runlevels argument is a superset of the log file then we can
# limit the read contents to the addLimit
+ runlevels = log.Runlevel.values()
loggingTypes = loggingTypes.upper()
if addLimit and (not readLimit or readLimit > addLimit):
if "-" in loggingTypes:
divIndex = loggingTypes.find("-")
- sIndex = RUNLEVELS.index(loggingTypes[:divIndex])
- eIndex = RUNLEVELS.index(loggingTypes[divIndex+1:])
- logFileRunlevels = RUNLEVELS[sIndex:eIndex+1]
+ sIndex = runlevels.index(loggingTypes[:divIndex])
+ eIndex = runlevels.index(loggingTypes[divIndex+1:])
+ logFileRunlevels = runlevels[sIndex:eIndex+1]
else:
- sIndex = RUNLEVELS.index(loggingTypes)
- logFileRunlevels = RUNLEVELS[sIndex:]
+ sIndex = runlevels.index(loggingTypes)
+ logFileRunlevels = runlevels[sIndex:]
# checks if runlevels we're reporting are a superset of the file's contents
isFileSubset = True
@@ -570,7 +571,7 @@
# fetches past tor events from log file, if available
torEventBacklog = []
if self._config["features.log.prepopulate"]:
- setRunlevels = list(set.intersection(set(self.loggedEvents), set(RUNLEVELS)))
+ setRunlevels = list(set.intersection(set(self.loggedEvents), set(log.Runlevel.values())))
readLimit = self._config["features.log.prepopulateReadLimit"]
addLimit = self._config["cache.logPanel.size"]
torEventBacklog = getLogFileEntries(setRunlevels, readLimit, addLimit, self._config)
@@ -584,13 +585,12 @@
# gets the set of arm events we're logging
setRunlevels = []
for i in range(len(armRunlevels)):
- if "ARM_" + RUNLEVELS[i] in self.loggedEvents:
+ if "ARM_" + log.Runlevel.values()[i] in self.loggedEvents:
setRunlevels.append(armRunlevels[i])
armEventBacklog = []
for level, msg, eventTime in log._getEntries(setRunlevels):
- runlevelStr = log.RUNLEVEL_STR[level]
- armEventEntry = LogEntry(eventTime, "ARM_" + runlevelStr, msg, RUNLEVEL_EVENT_COLOR[runlevelStr])
+ armEventEntry = LogEntry(eventTime, "ARM_" + level, msg, RUNLEVEL_EVENT_COLOR[level])
armEventBacklog.insert(0, armEventEntry)
# joins armEventBacklog and torEventBacklog chronologically into msgLog
@@ -621,14 +621,14 @@
if self._config["features.logFile"]:
logPath = self._config["features.logFile"]
- # make dir if the path doesn't already exist
- baseDir = os.path.dirname(logPath)
- if not os.path.exists(baseDir): os.makedirs(baseDir)
-
try:
+ # make dir if the path doesn't already exist
+ baseDir = os.path.dirname(logPath)
+ if not os.path.exists(baseDir): os.makedirs(baseDir)
+
self.logFile = open(logPath, "a")
log.log(self._config["log.logPanel.logFileOpened"], "arm %s opening log file (%s)" % (VERSION, logPath))
- except IOError, exc:
+ except (IOError, OSError), exc:
log.log(self._config["log.logPanel.logFileWriteFailed"], "Unable to write to log file: %s" % sysTools.getFileErrorMsg(exc))
self.logFile = None
@@ -778,7 +778,7 @@
self.redraw(True)
self.valsLock.release()
- def draw(self, subwindow, width, height):
+ def draw(self, width, height):
"""
Redraws message log. Entries stretch to use available space and may
contain up to two lines. Starts with newest entries.
@@ -831,23 +831,22 @@
# bottom of the divider
if seenFirstDateDivider:
if lineCount >= 1 and lineCount < height and showDaybreaks:
- self.win.vline(lineCount, dividerIndent, curses.ACS_LLCORNER | dividerAttr, 1)
- self.win.hline(lineCount, dividerIndent + 1, curses.ACS_HLINE | dividerAttr, width - dividerIndent - 1)
- self.win.vline(lineCount, width, curses.ACS_LRCORNER | dividerAttr, 1)
+ self.addch(lineCount, dividerIndent, curses.ACS_LLCORNER, dividerAttr)
+ self.hline(lineCount, dividerIndent + 1, width - dividerIndent - 1, dividerAttr)
+ self.addch(lineCount, width, curses.ACS_LRCORNER, dividerAttr)
lineCount += 1
# top of the divider
if lineCount >= 1 and lineCount < height and showDaybreaks:
timeLabel = time.strftime(" %B %d, %Y ", time.localtime(entry.timestamp))
- self.win.vline(lineCount, dividerIndent, curses.ACS_ULCORNER | dividerAttr, 1)
- self.win.hline(lineCount, dividerIndent + 1, curses.ACS_HLINE | dividerAttr, 1)
+ self.addch(lineCount, dividerIndent, curses.ACS_ULCORNER, dividerAttr)
+ self.addch(lineCount, dividerIndent + 1, curses.ACS_HLINE, dividerAttr)
self.addstr(lineCount, dividerIndent + 2, timeLabel, curses.A_BOLD | dividerAttr)
- if dividerIndent + len(timeLabel) + 2 <= width:
- lineLength = width - dividerIndent - len(timeLabel) - 2
- self.win.hline(lineCount, dividerIndent + len(timeLabel) + 2, curses.ACS_HLINE | dividerAttr, lineLength)
- self.win.vline(lineCount, dividerIndent + len(timeLabel) + 2 + lineLength, curses.ACS_URCORNER | dividerAttr, 1)
+ lineLength = width - dividerIndent - len(timeLabel) - 2
+ self.hline(lineCount, dividerIndent + len(timeLabel) + 2, lineLength, dividerAttr)
+ self.addch(lineCount, dividerIndent + len(timeLabel) + 2 + lineLength, curses.ACS_URCORNER, dividerAttr)
seenFirstDateDivider = True
lineCount += 1
@@ -879,15 +878,15 @@
if lineOffset == maxEntriesPerLine - 1:
msg = uiTools.cropStr(msg, maxMsgSize)
else:
- msg, remainder = uiTools.cropStr(msg, maxMsgSize, 4, 4, uiTools.END_WITH_HYPHEN, True)
+ msg, remainder = uiTools.cropStr(msg, maxMsgSize, 4, 4, uiTools.Ending.HYPHEN, True)
displayQueue.insert(0, (remainder.strip(), format, includeBreak))
includeBreak = True
if drawLine < height and drawLine >= 1:
if seenFirstDateDivider and width - dividerIndent >= 3 and showDaybreaks:
- self.win.vline(drawLine, dividerIndent, curses.ACS_VLINE | dividerAttr, 1)
- self.win.vline(drawLine, width, curses.ACS_VLINE | dividerAttr, 1)
+ self.addch(drawLine, dividerIndent, curses.ACS_VLINE, dividerAttr)
+ self.addch(drawLine, width, curses.ACS_VLINE, dividerAttr)
self.addstr(drawLine, cursorLoc, msg, format)
@@ -902,13 +901,9 @@
# if this is the last line and there's room, then draw the bottom of the divider
if not deduplicatedLog and seenFirstDateDivider:
if lineCount < height and showDaybreaks:
- # when resizing with a small width the following entries can be
- # problematc (though I'm not sure why)
- try:
- self.win.vline(lineCount, dividerIndent, curses.ACS_LLCORNER | dividerAttr, 1)
- self.win.hline(lineCount, dividerIndent + 1, curses.ACS_HLINE | dividerAttr, width - dividerIndent - 1)
- self.win.vline(lineCount, width, curses.ACS_LRCORNER | dividerAttr, 1)
- except: pass
+ self.addch(lineCount, dividerIndent, curses.ACS_LLCORNER, dividerAttr)
+ self.hline(lineCount, dividerIndent + 1, width - dividerIndent - 1, dividerAttr)
+ self.addch(lineCount, width, curses.ACS_LRCORNER, dividerAttr)
lineCount += 1
@@ -1019,7 +1014,7 @@
runlevelRanges = [] # tuple of type, startLevel, endLevel for ranges to be consensed
# reverses runlevels and types so they're appended in the right order
- reversedRunlevels = list(RUNLEVELS)
+ reversedRunlevels = log.Runlevel.values()
reversedRunlevels.reverse()
for prefix in ("TORCTL_", "ARM_", ""):
# blank ending runlevel forces the break condition to be reached at the end
Modified: arm/release/src/interface/torrcPanel.py
===================================================================
--- arm/release/src/interface/torrcPanel.py 2011-04-04 15:15:20 UTC (rev 24554)
+++ arm/release/src/interface/torrcPanel.py 2011-04-04 15:22:31 UTC (rev 24555)
@@ -6,14 +6,14 @@
import curses
import threading
-from util import conf, panel, torConfig, uiTools
+from util import conf, enum, panel, torConfig, uiTools
DEFAULT_CONFIG = {"features.config.file.showScrollbars": True,
"features.config.file.maxLinesPerEntry": 8}
# TODO: The armrc use case is incomplete. There should be equivilant reloading
# and validation capabilities to the torrc.
-TORRC, ARMRC = range(1, 3) # configuration file types that can be displayed
+Config = enum.Enum("TORRC", "ARMRC") # configuration file types that can be displayed
class TorrcPanel(panel.Panel):
"""
@@ -60,7 +60,7 @@
self.valsLock.release()
- def draw(self, subwindow, width, height):
+ def draw(self, width, height):
self.valsLock.acquire()
# If true, we assume that the cached value in self._lastContentHeight is
@@ -74,7 +74,7 @@
self.scroll = max(0, min(self.scroll, self._lastContentHeight - height + 1))
renderedContents, corrections, confLocation = None, {}, None
- if self.configType == TORRC:
+ if self.configType == Config.TORRC:
loadedTorrc = torConfig.getTorrc()
loadedTorrc.getLock().acquire()
confLocation = loadedTorrc.getConfigLocation()
@@ -109,7 +109,7 @@
# draws the top label
if self.showLabel:
- sourceLabel = "Tor" if self.configType == TORRC else "Arm"
+ sourceLabel = "Tor" if self.configType == Config.TORRC else "Arm"
locationLabel = " (%s)" % confLocation if confLocation else ""
self.addstr(0, 0, "%s Configuration File%s:" % (sourceLabel, locationLabel), curses.A_STANDOUT)
@@ -157,10 +157,10 @@
if lineNumber in corrections:
lineIssue, lineIssueMsg = corrections[lineNumber]
- if lineIssue in (torConfig.VAL_DUPLICATE, torConfig.VAL_IS_DEFAULT):
+ if lineIssue in (torConfig.ValidationError.DUPLICATE, torConfig.ValidationError.IS_DEFAULT):
lineComp["option"][1] = curses.A_BOLD | uiTools.getColor("blue")
lineComp["argument"][1] = curses.A_BOLD | uiTools.getColor("blue")
- elif lineIssue == torConfig.VAL_MISMATCH:
+ elif lineIssue == torConfig.ValidationError.MISMATCH:
lineComp["argument"][1] = curses.A_BOLD | uiTools.getColor("red")
lineComp["correction"][0] = " (%s)" % lineIssueMsg
else:
@@ -189,7 +189,7 @@
msg = uiTools.cropStr(msg, maxMsgSize)
else:
includeBreak = True
- msg, remainder = uiTools.cropStr(msg, maxMsgSize, 4, 4, uiTools.END_WITH_HYPHEN, True)
+ msg, remainder = uiTools.cropStr(msg, maxMsgSize, 4, 4, uiTools.Ending.HYPHEN, True)
displayQueue.insert(0, (remainder.strip(), format))
drawLine = displayLine + lineOffset
Modified: arm/release/src/settings.cfg
===================================================================
--- arm/release/src/settings.cfg 2011-04-04 15:15:20 UTC (rev 24554)
+++ arm/release/src/settings.cfg 2011-04-04 15:22:31 UTC (rev 24555)
@@ -1,3 +1,32 @@
+# Important tor configuration options (shown by default)
+config.important BandwidthRate
+config.important BandwidthBurst
+config.important RelayBandwidthRate
+config.important RelayBandwidthBurst
+config.important ControlPort
+config.important HashedControlPassword
+config.important CookieAuthentication
+config.important DataDirectory
+config.important Log
+config.important RunAsDaemon
+config.important User
+config.important Bridge
+config.important ExcludeNodes
+config.important SocksPort
+config.important UseBridges
+config.important BridgeRelay
+config.important ContactInfo
+config.important ExitPolicy
+config.important MyFamily
+config.important Nickname
+config.important ORPort
+config.important AccountingMax
+config.important AccountingStart
+config.important DirPortFrontPage
+config.important DirPort
+config.important HiddenServiceDir
+config.important HiddenServicePort
+
# Summary descriptions for Tor configuration options
# General Config Options
config.summary.BandwidthRate Average bandwidth usage limit
@@ -145,6 +174,58 @@
config.summary.ExitPortStatistics Toggles storing traffic and port usage data to disk
config.summary.ExtraInfoStatistics Publishes statistic data in the extra-info documents
+# Directory Server Options
+config.summary.AuthoritativeDirectory act as a directory authority
+config.summary.DirPortFrontPage publish this html file on the DirPort
+config.summary.V1AuthoritativeDirectory generates a version 1 consensus
+config.summary.V2AuthoritativeDirectory generates a version 2 consensus
+config.summary.V3AuthoritativeDirectory generates a version 3 consensus
+config.summary.VersioningAuthoritativeDirectory provides opinions on recommended versions of tor
+config.summary.NamingAuthoritativeDirectory provides opinions on fingerprint to nickname bindings
+config.summary.HSAuthoritativeDir toggles accepting hidden service descriptors
+config.summary.HidServDirectoryV2 toggles accepting version 2 hidden service descriptors
+config.summary.BridgeAuthoritativeDir acts as a bridge authority
+config.summary.MinUptimeHidServDirectoryV2 required uptime before accepting hidden service directory
+config.summary.DirPort port for directory connections
+config.summary.DirListenAddress address the directory service is bound to
+config.summary.DirPolicy access policy for the DirPort
+
+# Directory Authority Server Options
+config.summary.RecommendedVersions tor versions believed to be safe
+config.summary.RecommendedClientVersions tor versions believed to be safe for clients
+config.summary.RecommendedServerVersions tor versions believed to be safe for relays
+config.summary.ConsensusParams params entry of the networkstatus vote
+config.summary.DirAllowPrivateAddresses toggles allowing arbitrary input or non-public IPs in descriptors
+config.summary.AuthDirBadDir relays to be flagged as bad directory caches
+config.summary.AuthDirBadExit relays to be flagged as bad exits
+config.summary.AuthDirInvalid relays from which the valid flag is withheld
+config.summary.AuthDirReject relays to be dropped from the consensus
+config.summary.AuthDirListBadDirs toggles if we provide an opinion on bad directory caches
+config.summary.AuthDirListBadExits toggles if we provide an opinion on bad exits
+config.summary.AuthDirRejectUnlisted rejects further relay descriptors
+config.summary.AuthDirMaxServersPerAddr limit on the number of relays accepted per ip
+config.summary.AuthDirMaxServersPerAuthAddr limit on the number of relays accepted per an authority's ip
+config.summary.V3AuthVotingInterval consensus voting interval
+config.summary.V3AuthVoteDelay wait time to collect votes of other authorities
+config.summary.V3AuthDistDelay wait time to collect the signatures of other authorities
+config.summary.V3AuthNIntervalsValid number of voting intervals a consensus is valid for
+config.summary.V3BandwidthsFile path to a file containing measured relay bandwidths
+
+# Hidden Service Options
+config.summary.HiddenServiceDir directory contents for the hidden service
+config.summary.HiddenServicePort port the hidden service is provided on
+config.summary.PublishHidServDescriptors toggles automated publishing of the hidden service to the rendezvous directory
+config.summary.HiddenServiceAuthorizeClient restricts access to the hidden service
+config.summary.RendPostPeriod period at which the rendezvous service descriptors are refreshed
+
+# Testing Network Options
+config.summary.TestingTorNetwork overrides other options to be a testing network
+config.summary.TestingV3AuthInitialVotingInterval overrides V3AuthVotingInterval for the first consensus
+config.summary.TestingV3AuthInitialVoteDelay overrides TestingV3AuthInitialVoteDelay for the first consensus
+config.summary.TestingV3AuthInitialDistDelay overrides TestingV3AuthInitialDistDelay for the first consensus
+config.summary.TestingAuthDirTimeToLearnReachability delay until opinions are given about which relays are running or not
+config.summary.TestingEstimatedDescriptorPropagationTime delay before clients attempt to fetch descriptors from directory caches
+
# Snippets from common log messages
# These are static bits of log messages, used to determine when entries with
# dynamic content (hostnames, numbers, etc) are the same. If this matches the
@@ -285,3 +366,287 @@
torrc.label.time.day day, days
torrc.label.time.week week, weeks
+# Common usages for ports based on:
+# https://secure.wikimedia.org/wikipedia/en/wiki/List_of_TCP_and_UDP_port_num…
+# http://isc.sans.edu/services.html
+#
+# Including all the official low ports (< 1024), and higher ones I recognize.
+
+port.label.1 TCPMUX
+port.label.2 CompressNET
+port.label.3 CompressNET
+port.label.5 RJE
+port.label.7 Echo
+port.label.9 Discard
+port.label.11 SYSTAT
+port.label.13 Daytime
+port.label.15 netstat
+port.label.17 QOTD
+port.label.18 MSP
+port.label.19 CHARGEN
+port.label.20 FTP
+port.label.21 FTP
+port.label.22 SSH
+port.label.23 Telnet
+port.label.24 Priv-mail
+port.label.25 SMTP
+port.label.34 RF
+port.label.35 Printer
+port.label.37 TIME
+port.label.39 RLP
+port.label.41 Graphics
+port.label.42 WINS
+port.label.43 WHOIS
+port.label.47 NI FTP
+port.label.49 TACACS
+port.label.50 Remote Mail
+port.label.51 IMP
+port.label.52 XNS
+port.label.53 DNS
+port.label.54 XNS
+port.label.55 ISI-GL
+port.label.56 RAP
+port.label.57 MTP
+port.label.58 XNS
+port.label.67 BOOTP
+port.label.68 BOOTP
+port.label.69 TFTP
+port.label.70 Gopher
+port.label.79 Finger
+port.label.80 HTTP
+port.label.81 Torpark
+port.label.82 Torpark
+port.label.83 MIT ML
+port.label.88 Kerberos
+port.label.90 dnsix
+port.label.99 WIP
+port.label.101 NIC
+port.label.102 ISO-TSAP
+port.label.104 ACR/NEMA
+port.label.105 CCSO
+port.label.107 Telnet
+port.label.108 SNA
+port.label.109 POP2
+port.label.110 POP3
+port.label.111 ONC RPC
+port.label.113 ident
+port.label.115 SFTP
+port.label.117 UUCP
+port.label.118 SQL
+port.label.119 NNTP
+port.label.123 NTP
+port.label.135 DCE
+port.label.137 NetBIOS
+port.label.138 NetBIOS
+port.label.139 NetBIOS
+port.label.143 IMAP
+port.label.152 BFTP
+port.label.153 SGMP
+port.label.156 SQL
+port.label.158 DMSP
+port.label.161 SNMP
+port.label.162 SNMPTRAP
+port.label.170 Print-srv
+port.label.177 XDMCP
+port.label.179 BGP
+port.label.194 IRC
+port.label.199 SMUX
+port.label.201 AppleTalk
+port.label.209 QMTP
+port.label.210 ANSI
+port.label.213 IPX
+port.label.218 MPP
+port.label.220 IMAP
+port.label.256 2DEV
+port.label.259 ESRO
+port.label.264 BGMP
+port.label.308 Novastor
+port.label.311 OSX Admin
+port.label.318 PKIX TSP
+port.label.319 PTP
+port.label.320 PTP
+port.label.323 IMMP
+port.label.350 MATIP
+port.label.351 MATIP
+port.label.366 ODMR
+port.label.369 Rpc2portmap
+port.label.370 codaauth2
+port.label.371 ClearCase
+port.label.383 HP Alarm Mgr
+port.label.384 ARNS
+port.label.387 AURP
+port.label.389 LDAP
+port.label.401 UPS
+port.label.402 Altiris
+port.label.427 SLP
+port.label.443 HTTPS
+port.label.444 SNPP
+port.label.445 SMB
+port.label.464 Kerberos
+port.label.465 SMTP
+port.label.475 tcpnethaspsrv
+port.label.497 Retrospect
+port.label.500 ISAKMP
+port.label.501 STMF
+port.label.502 Modbus
+port.label.504 Citadel
+port.label.510 FirstClass
+port.label.512 Rexec
+port.label.513 rlogin
+port.label.514 rsh
+port.label.515 LPD
+port.label.517 Talk
+port.label.518 NTalk
+port.label.520 efs
+port.label.524 NCP
+port.label.530 RPC
+port.label.531 AIM/IRC
+port.label.532 netnews
+port.label.533 netwall
+port.label.540 UUCP
+port.label.542 commerce
+port.label.543 klogin
+port.label.544 klogin
+port.label.545 OSISoft PI
+port.label.546 DHCPv6
+port.label.547 DHCPv6
+port.label.548 AFP
+port.label.550 new-who
+port.label.554 RTSP
+port.label.556 RFS
+port.label.560 rmonitor
+port.label.561 monitor
+port.label.563 NNTPS
+port.label.587 SMTP
+port.label.591 FileMaker
+port.label.593 HTTP RPC
+port.label.604 TUNNEL
+port.label.623 ASF-RMCP
+port.label.631 CUPS
+port.label.635 RLZ DBase
+port.label.636 LDAPS
+port.label.639 MSDP
+port.label.641 SupportSoft
+port.label.646 LDP
+port.label.647 DHCP
+port.label.648 RRP
+port.label.651 IEEE-MMS
+port.label.652 DTCP
+port.label.653 SupportSoft
+port.label.654 MMS/MMP
+port.label.657 RMC
+port.label.660 OSX Admin
+port.label.665 sun-dr
+port.label.666 Doom
+port.label.674 ACAP
+port.label.691 MS Exchange
+port.label.692 Hyperwave-ISP
+port.label.694 Linux-HA
+port.label.695 IEEE-MMS-SSL
+port.label.698 OLSR
+port.label.699 Access Network
+port.label.700 EPP
+port.label.701 LMP
+port.label.702 IRIS
+port.label.706 SILC
+port.label.711 MPLS
+port.label.712 TBRPF
+port.label.720 SMQP
+port.label.749 Kerberos
+port.label.750 rfile
+port.label.751 pump
+port.label.752 qrh
+port.label.753 rrh
+port.label.754 tell send
+port.label.760 ns
+port.label.782 Conserver
+port.label.783 spamd
+port.label.829 CMP
+port.label.843 Flash
+port.label.847 DHCP
+port.label.860 iSCSI
+port.label.873 rsync
+port.label.888 CDDB
+port.label.901 SWAT
+port.label.902 VMware
+port.label.903 VMware
+port.label.904 VMware
+port.label.911 NCA
+port.label.953 DNS RNDC
+port.label.981 SofaWare
+port.label.989 FTPS
+port.label.990 FTPS
+port.label.991 NAS
+port.label.992 Telnet
+port.label.993 IMAPS
+port.label.995 POP3S
+port.label.999 ScimoreDB
+port.label.1001 JtoMB
+port.label.1002 cogbot
+
+port.label.1080 SOCKS
+port.label.1085 WebObjects
+port.label.1109 KPOP
+port.label.1169 Tripwire
+port.label.1194 OpenVPN
+port.label.1214 Kazaa
+port.label.1220 QuickTime
+port.label.1234 VLC
+port.label.1241 Nessus
+port.label.1270 SCOM
+port.label.1293 IPSec
+port.label.1433 MSSQL
+port.label.1434 MSSQL
+port.label.1503 MSN
+port.label.1512 WINS
+port.label.1521 Oracle
+port.label.1526 Oracle
+port.label.1666 Perforce
+port.label.1725 Steam
+port.label.1863 MSNP
+port.label.2049 NFS
+port.label.2086 GNUnet
+port.label.2401 CVS
+port.label.2525 SMTP
+port.label.2710 BitTorrent
+port.label.3074 XBox LIVE
+port.label.3101 BlackBerry
+port.label.3306 MySQL
+port.label.3690 SVN
+port.label.3723 Battle.net
+port.label.3724 WoW
+port.label.4662 eMule
+port.label.5003 FileMaker
+port.label.5050 Yahoo IM
+port.label.5060 SIP
+port.label.5061 SIP
+port.label.5190 AIM/ICQ
+port.label.5222 Jabber
+port.label.5223 Jabber
+port.label.5269 Jabber
+port.label.5298 Jabber
+port.label.5432 PostgreSQL
+port.label.5500 VNC
+port.label.5556 Freeciv
+port.label.5666 NRPE
+port.label.5667 NSCA
+port.label.5800 VNC
+port.label.5900 VNC
+port.label.6346 gnutella
+port.label.6347 gnutella
+port.label.6660-6669 IRC
+port.label.6679 IRC
+port.label.6697 IRC
+port.label.6881-6999 BitTorrent
+port.label.8008 HTTP
+port.label.8010 XMPP
+port.label.8080 Tomcat
+port.label.8118 Privoxy
+port.label.8123 Polipo
+port.label.9030 Tor
+port.label.9050 Tor
+port.label.9051 Tor
+port.label.23399 Skype
+port.label.30301 BitTorrent
+port.label.33434 traceroute
+
Modified: arm/release/src/starter.py
===================================================================
--- arm/release/src/starter.py 2011-04-04 15:15:20 UTC (rev 24554)
+++ arm/release/src/starter.py 2011-04-04 15:22:31 UTC (rev 24555)
@@ -36,8 +36,9 @@
"startup.interface.port": 9051,
"startup.blindModeEnabled": False,
"startup.events": "N3",
- "data.cache.path": "~/.arm/cache",
+ "startup.dataDirectory": "~/.arm",
"features.config.descriptions.enabled": True,
+ "features.config.descriptions.persist": True,
"log.configDescriptions.readManPageSuccess": util.log.INFO,
"log.configDescriptions.readManPageFailed": util.log.NOTICE,
"log.configDescriptions.internalLoadSuccess": util.log.NOTICE,
@@ -88,29 +89,6 @@
# torrc entries that are scrubbed when dumping
PRIVATE_TORRC_ENTRIES = ["HashedControlPassword", "Bridge", "HiddenServiceDir"]
-def isValidIpAddr(ipStr):
- """
- Returns true if input is a valid IPv4 address, false otherwise.
- """
-
- for i in range(4):
- if i < 3:
- divIndex = ipStr.find(".")
- if divIndex == -1: return False # expected a period to be valid
- octetStr = ipStr[:divIndex]
- ipStr = ipStr[divIndex + 1:]
- else:
- octetStr = ipStr
-
- try:
- octet = int(octetStr)
- if not octet >= 0 or not octet <= 255: return False
- except ValueError:
- # address value isn't an integer
- return False
-
- return True
-
def _loadConfigurationDescriptions(pathPrefix):
"""
Attempts to load descriptions for tor's configuration options, fetching them
@@ -125,13 +103,14 @@
isConfigDescriptionsLoaded = False
# determines the path where cached descriptions should be persisted (left
- # undefined of arm caching is disabled)
- cachePath, descriptorPath = CONFIG["data.cache.path"], None
+ # undefined if caching is disabled)
+ descriptorPath = None
+ if CONFIG["features.config.descriptions.persist"]:
+ dataDir = CONFIG["startup.dataDirectory"]
+ if not dataDir.endswith("/"): dataDir += "/"
+
+ descriptorPath = os.path.expanduser(dataDir + "cache/") + CONFIG_DESC_FILENAME
- if cachePath:
- if not cachePath.endswith("/"): cachePath += "/"
- descriptorPath = os.path.expanduser(cachePath) + CONFIG_DESC_FILENAME
-
# attempts to load configuration descriptions cached in the data directory
if descriptorPath:
try:
@@ -166,7 +145,7 @@
msg = DESC_SAVE_SUCCESS_MSG % (descriptorPath, time.time() - loadStartTime)
util.log.log(CONFIG["log.configDescriptions.persistance.loadSuccess"], msg)
- except IOError, exc:
+ except (IOError, OSError), exc:
msg = DESC_SAVE_FAILED_MSG % util.sysTools.getFileErrorMsg(exc)
util.log.log(CONFIG["log.configDescriptions.persistance.saveFailed"], msg)
@@ -324,7 +303,7 @@
controlAddr = param["startup.interface.ipAddress"]
controlPort = param["startup.interface.port"]
- if not isValidIpAddr(controlAddr):
+ if not util.connections.isValidIpAddress(controlAddr):
print "'%s' isn't a valid IP address" % controlAddr
sys.exit()
elif controlPort < 0 or controlPort > 65535:
@@ -409,5 +388,4 @@
_dumpConfig()
interface.controller.startTorMonitor(time.time() - initTime, expandedEvents, param["startup.blindModeEnabled"])
- conn.close()
Modified: arm/release/src/test.py
===================================================================
--- arm/release/src/test.py 2011-04-04 15:15:20 UTC (rev 24554)
+++ arm/release/src/test.py 2011-04-04 15:22:31 UTC (rev 24555)
@@ -11,6 +11,7 @@
1. Resolver Performance Test
2. Resolver Dump
3. Glyph Demo
+ 4. Exit Policy Check
q. Quit
Selection: """
@@ -23,7 +24,7 @@
userInput = raw_input(MENU)
# initiate the TorCtl connection if the test needs it
- if userInput in ("1", "2") and not conn:
+ if userInput in ("1", "2", "4") and not conn:
conn = torTools.getConn()
conn.init()
@@ -43,7 +44,7 @@
connectionResults.sort()
allConnectionResults.append(connectionResults)
- resolverLabel = "%-10s" % connections.CMD_STR[resolver]
+ resolverLabel = "%-10s" % resolver
countLabel = "%4i results" % len(connectionResults)
timeLabel = "%0.4f seconds" % (time.time() - startTime)
print "%s %s %s" % (resolverLabel, countLabel, timeLabel)
@@ -67,8 +68,9 @@
# provide the selection options
printDivider()
print("Select a resolver:")
- for i in range(1, 8):
- print(" %i. %s" % (i, connections.CMD_STR[i]))
+ availableResolvers = connections.Resolver.values()
+ for i in range(len(availableResolvers)):
+ print(" %i. %s" % (i, availableResolvers[i]))
print(" q. Go back to the main menu")
userSelection = raw_input("\nSelection: ")
@@ -101,6 +103,42 @@
# Switching to a curses context and back repeatedly seems to screw up the
# terminal. Just to be safe this ends the process after the demo.
break
+ elif userInput == "4":
+ # display the current exit policy and query if destinations are allowed by it
+ exitPolicy = conn.getExitPolicy()
+ print("Exit Policy: %s" % exitPolicy)
+ printDivider()
+
+ while True:
+ # provide the selection options
+ userSelection = raw_input("\nCheck if destination is allowed (q to go back): ")
+ userSelection = userSelection.replace(" ", "").strip() # removes all whitespace
+
+ isValidQuery, isExitAllowed = True, False
+ if userSelection == "q":
+ printDivider()
+ break
+ elif connections.isValidIpAddress(userSelection):
+ # just an ip address (use port 80)
+ isExitAllowed = exitPolicy.check(userSelection, 80)
+ elif userSelection.isdigit():
+ # just a port (use a common ip like 4.2.2.2)
+ isExitAllowed = exitPolicy.check("4.2.2.2", userSelection)
+ elif ":" in userSelection:
+ # ip/port combination
+ ipAddr, port = userSelection.split(":", 1)
+
+ if connections.isValidIpAddress(ipAddr) and port.isdigit():
+ isExitAllowed = exitPolicy.check(ipAddr, port)
+ else: isValidQuery = False
+ else: isValidQuery = False # invalid input
+
+ if isValidQuery:
+ resultStr = "is" if isExitAllowed else "is *not*"
+ print("Exiting %s allowed to that destination" % resultStr)
+ else:
+ print("'%s' isn't a valid destination (should be an ip, port, or ip:port)\n" % userSelection)
+
else:
print("'%s' isn't a valid selection\n" % userInput)
Modified: arm/release/src/util/__init__.py
===================================================================
--- arm/release/src/util/__init__.py 2011-04-04 15:15:20 UTC (rev 24554)
+++ arm/release/src/util/__init__.py 2011-04-04 15:22:31 UTC (rev 24555)
@@ -4,5 +4,5 @@
and safely working with curses (hiding some of the gory details).
"""
-__all__ = ["conf", "connections", "hostnames", "log", "panel", "procTools", "sysTools", "torConfig", "torTools", "uiTools"]
+__all__ = ["conf", "connections", "enum", "hostnames", "log", "panel", "procTools", "sysTools", "torConfig", "torTools", "uiTools"]
Modified: arm/release/src/util/conf.py
===================================================================
--- arm/release/src/util/conf.py 2011-04-04 15:15:20 UTC (rev 24554)
+++ arm/release/src/util/conf.py 2011-04-04 15:22:31 UTC (rev 24555)
@@ -105,36 +105,35 @@
default - value provided if no such key exists
"""
- callDefault = log.runlevelToStr(default) if key.startswith("log.") else default
isMultivalue = isinstance(default, list) or isinstance(default, dict)
- val = self.getValue(key, callDefault, isMultivalue)
+ val = self.getValue(key, default, isMultivalue)
if val == default: return val
if key.startswith("log."):
- if val.lower() in ("none", "debug", "info", "notice", "warn", "err"):
- val = log.strToRunlevel(val)
+ if val.upper() == "NONE": val = None
+ elif val.upper() in log.Runlevel.values(): val = val.upper()
else:
- msg = "config entry '%s' is expected to be a runlevel" % key
- if default != None: msg += ", defaulting to '%s'" % callDefault
+ msg = "Config entry '%s' is expected to be a runlevel" % key
+ if default != None: msg += ", defaulting to '%s'" % default
log.log(CONFIG["log.configEntryTypeError"], msg)
val = default
elif isinstance(default, bool):
if val.lower() == "true": val = True
elif val.lower() == "false": val = False
else:
- msg = "config entry '%s' is expected to be a boolean, defaulting to '%s'" % (key, str(default))
+ msg = "Config entry '%s' is expected to be a boolean, defaulting to '%s'" % (key, str(default))
log.log(CONFIG["log.configEntryTypeError"], msg)
val = default
elif isinstance(default, int):
try: val = int(val)
except ValueError:
- msg = "config entry '%s' is expected to be an integer, defaulting to '%i'" % (key, default)
+ msg = "Config entry '%s' is expected to be an integer, defaulting to '%i'" % (key, default)
log.log(CONFIG["log.configEntryTypeError"], msg)
val = default
elif isinstance(default, float):
try: val = float(val)
except ValueError:
- msg = "config entry '%s' is expected to be a float, defaulting to '%f'" % (key, default)
+ msg = "Config entry '%s' is expected to be a float, defaulting to '%f'" % (key, default)
log.log(CONFIG["log.configEntryTypeError"], msg)
val = default
elif isinstance(default, list):
@@ -146,7 +145,7 @@
entryKey, entryVal = entry.split("=>", 1)
valMap[entryKey.strip()] = entryVal.strip()
else:
- msg = "ignoring invalid %s config entry (expected a mapping, but \"%s\" was missing \"=>\")" % (key, entry)
+ msg = "Ignoring invalid %s config entry (expected a mapping, but \"%s\" was missing \"=>\")" % (key, entry)
log.log(CONFIG["log.configEntryTypeError"], msg)
val = valMap
@@ -171,7 +170,7 @@
# check if the count doesn't match
if count != None and len(confComp) != count:
- msg = "config entry '%s' is expected to be %i comma separated values" % (key, count)
+ msg = "Config entry '%s' is expected to be %i comma separated values" % (key, count)
if default != None and (isinstance(default, list) or isinstance(default, tuple)):
defaultStr = ", ".join([str(i) for i in default])
msg += ", defaulting to '%s'" % defaultStr
@@ -201,7 +200,7 @@
# validates the input, setting the errorMsg if there's a problem
errorMsg = None
- baseErrorMsg = "config entry '%s' is expected to %%s" % key
+ baseErrorMsg = "Config entry '%s' is expected to %%s" % key
if default != None and (isinstance(default, list) or isinstance(default, tuple)):
defaultStr = ", ".join([str(i) for i in default])
baseErrorMsg += ", defaulting to '%s'" % defaultStr
Modified: arm/release/src/util/connections.py
===================================================================
--- arm/release/src/util/connections.py 2011-04-04 15:15:20 UTC (rev 24554)
+++ arm/release/src/util/connections.py 2011-04-04 15:22:31 UTC (rev 24555)
@@ -21,17 +21,16 @@
import time
import threading
-from util import log, procTools, sysTools
+from util import enum, log, procTools, sysTools
# enums for connection resolution utilities
-CMD_PROC, CMD_NETSTAT, CMD_SOCKSTAT, CMD_LSOF, CMD_SS, CMD_BSD_SOCKSTAT, CMD_BSD_PROCSTAT = range(1, 8)
-CMD_STR = {CMD_PROC: "proc",
- CMD_NETSTAT: "netstat",
- CMD_SS: "ss",
- CMD_LSOF: "lsof",
- CMD_SOCKSTAT: "sockstat",
- CMD_BSD_SOCKSTAT: "sockstat (bsd)",
- CMD_BSD_PROCSTAT: "procstat (bsd)"}
+Resolver = enum.Enum(("PROC", "proc"),
+ ("NETSTAT", "netstat"),
+ ("SS", "ss"),
+ ("LSOF", "lsof"),
+ ("SOCKSTAT", "sockstat"),
+ ("BSD_SOCKSTAT", "sockstat (bsd)"),
+ ("BSD_PROCSTAT", "procstat (bsd)"))
# If true this provides new instantiations for resolvers if the old one has
# been stopped. This can make it difficult ensure all threads are terminated
@@ -80,11 +79,107 @@
"log.connLookupFailed": log.INFO,
"log.connLookupFailover": log.NOTICE,
"log.connLookupAbandon": log.WARN,
- "log.connLookupRateGrowing": None}
+ "log.connLookupRateGrowing": None,
+ "log.configEntryTypeError": log.NOTICE}
+PORT_USAGE = {}
+
def loadConfig(config):
config.update(CONFIG)
+
+ for configKey in config.getKeys():
+ # fetches any port.label.* values
+ if configKey.startswith("port.label."):
+ portEntry = configKey[11:]
+ purpose = config.get(configKey)
+
+ divIndex = portEntry.find("-")
+ if divIndex == -1:
+ # single port
+ if portEntry.isdigit():
+ PORT_USAGE[portEntry] = purpose
+ else:
+ msg = "Port value isn't numeric for entry: %s" % configKey
+ log.log(CONFIG["log.configEntryTypeError"], msg)
+ else:
+ try:
+ # range of ports (inclusive)
+ minPort = int(portEntry[:divIndex])
+ maxPort = int(portEntry[divIndex + 1:])
+ if minPort > maxPort: raise ValueError()
+
+ for port in range(minPort, maxPort + 1):
+ PORT_USAGE[str(port)] = purpose
+ except ValueError:
+ msg = "Unable to parse port range for entry: %s" % configKey
+ log.log(CONFIG["log.configEntryTypeError"], msg)
+def isValidIpAddress(ipStr):
+ """
+ Returns true if input is a valid IPv4 address, false otherwise.
+ """
+
+ # checks if theres four period separated values
+ if not ipStr.count(".") == 3: return False
+
+ # checks that each value in the octet are decimal values between 0-255
+ for ipComp in ipStr.split("."):
+ if not ipComp.isdigit() or int(ipComp) < 0 or int(ipComp) > 255:
+ return False
+
+ return True
+
+def isIpAddressPrivate(ipAddr):
+ """
+ Provides true if the IP address belongs on the local network or belongs to
+ loopback, false otherwise. These include:
+ Private ranges: 10.*, 172.16.* - 172.31.*, 192.168.*
+ Loopback: 127.*
+
+ Arguments:
+ ipAddr - IP address to be checked
+ """
+
+ # checks for any of the simple wildcard ranges
+ if ipAddr.startswith("10.") or ipAddr.startswith("192.168.") or ipAddr.startswith("127."):
+ return True
+
+ # checks for the 172.16.* - 172.31.* range
+ if ipAddr.startswith("172.") and ipAddr.count(".") == 3:
+ secondOctet = ipAddr[4:ipAddr.find(".", 4)]
+
+ if secondOctet.isdigit() and int(secondOctet) >= 16 and int(secondOctet) <= 31:
+ return True
+
+ return False
+
+def ipToInt(ipAddr):
+ """
+ Provides an integer representation of the ip address, suitable for sorting.
+
+ Arguments:
+ ipAddr - ip address to be converted
+ """
+
+ total = 0
+
+ for comp in ipAddr.split("."):
+ total *= 255
+ total += int(comp)
+
+ return total
+
+def getPortUsage(port):
+ """
+ Provides the common use of a given port. If no useage is known then this
+ provides None.
+
+ Arguments:
+ port - port number to look up
+ """
+
+ return PORT_USAGE.get(port)
+
def getResolverCommand(resolutionCmd, processName, processPid = ""):
"""
Provides the command that would be processed for the given resolver type.
@@ -99,19 +194,19 @@
if not processPid:
# the pid is required for procstat resolution
- if resolutionCmd == CMD_BSD_PROCSTAT:
+ if resolutionCmd == Resolver.BSD_PROCSTAT:
raise ValueError("procstat resolution requires a pid")
# if the pid was undefined then match any in that field
processPid = "[0-9]*"
- if resolutionCmd == CMD_PROC: return ""
- elif resolutionCmd == CMD_NETSTAT: return RUN_NETSTAT % (processPid, processName)
- elif resolutionCmd == CMD_SS: return RUN_SS % (processName, processPid)
- elif resolutionCmd == CMD_LSOF: return RUN_LSOF % (processName, processPid)
- elif resolutionCmd == CMD_SOCKSTAT: return RUN_SOCKSTAT % (processName, processPid)
- elif resolutionCmd == CMD_BSD_SOCKSTAT: return RUN_BSD_SOCKSTAT % (processName, processPid)
- elif resolutionCmd == CMD_BSD_PROCSTAT: return RUN_BSD_PROCSTAT % processPid
+ if resolutionCmd == Resolver.PROC: return ""
+ elif resolutionCmd == Resolver.NETSTAT: return RUN_NETSTAT % (processPid, processName)
+ elif resolutionCmd == Resolver.SS: return RUN_SS % (processName, processPid)
+ elif resolutionCmd == Resolver.LSOF: return RUN_LSOF % (processName, processPid)
+ elif resolutionCmd == Resolver.SOCKSTAT: return RUN_SOCKSTAT % (processName, processPid)
+ elif resolutionCmd == Resolver.BSD_SOCKSTAT: return RUN_BSD_SOCKSTAT % (processName, processPid)
+ elif resolutionCmd == Resolver.BSD_PROCSTAT: return RUN_BSD_PROCSTAT % processPid
else: raise ValueError("Unrecognized resolution type: %s" % resolutionCmd)
def getConnections(resolutionCmd, processName, processPid = ""):
@@ -131,7 +226,7 @@
processPid - process ID (this helps improve accuracy)
"""
- if resolutionCmd == CMD_PROC:
+ if resolutionCmd == Resolver.PROC:
# Attempts resolution via checking the proc contents.
if not processPid:
raise ValueError("proc resolution requires a pid")
@@ -151,30 +246,30 @@
# parses results for the resolution command
conn = []
for line in results:
- if resolutionCmd == CMD_LSOF:
+ if resolutionCmd == Resolver.LSOF:
# Different versions of lsof have different numbers of columns, so
# stripping off the optional 'established' entry so we can just use
# the last one.
comp = line.replace("(ESTABLISHED)", "").strip().split()
else: comp = line.split()
- if resolutionCmd == CMD_NETSTAT:
+ if resolutionCmd == Resolver.NETSTAT:
localIp, localPort = comp[3].split(":")
foreignIp, foreignPort = comp[4].split(":")
- elif resolutionCmd == CMD_SS:
+ elif resolutionCmd == Resolver.SS:
localIp, localPort = comp[4].split(":")
foreignIp, foreignPort = comp[5].split(":")
- elif resolutionCmd == CMD_LSOF:
+ elif resolutionCmd == Resolver.LSOF:
local, foreign = comp[-1].split("->")
localIp, localPort = local.split(":")
foreignIp, foreignPort = foreign.split(":")
- elif resolutionCmd == CMD_SOCKSTAT:
+ elif resolutionCmd == Resolver.SOCKSTAT:
localIp, localPort = comp[4].split(":")
foreignIp, foreignPort = comp[5].split(":")
- elif resolutionCmd == CMD_BSD_SOCKSTAT:
+ elif resolutionCmd == Resolver.BSD_SOCKSTAT:
localIp, localPort = comp[5].split(":")
foreignIp, foreignPort = comp[6].split(":")
- elif resolutionCmd == CMD_BSD_PROCSTAT:
+ elif resolutionCmd == Resolver.BSD_PROCSTAT:
localIp, localPort = comp[9].split(":")
foreignIp, foreignPort = comp[10].split(":")
@@ -241,13 +336,13 @@
if osType == None: osType = os.uname()[0]
if osType == "FreeBSD":
- resolvers = [CMD_BSD_SOCKSTAT, CMD_BSD_PROCSTAT, CMD_LSOF]
+ resolvers = [Resolver.BSD_SOCKSTAT, Resolver.BSD_PROCSTAT, Resolver.LSOF]
else:
- resolvers = [CMD_NETSTAT, CMD_SOCKSTAT, CMD_LSOF, CMD_SS]
+ resolvers = [Resolver.NETSTAT, Resolver.SOCKSTAT, Resolver.LSOF, Resolver.SS]
# proc resolution, by far, outperforms the others so defaults to this is able
if procTools.isProcAvailable():
- resolvers = [CMD_PROC] + resolvers
+ resolvers = [Resolver.PROC] + resolvers
return resolvers
@@ -317,22 +412,26 @@
self.defaultRate = CONFIG["queries.connections.minRate"]
self.lastLookup = -1
self.overwriteResolver = None
- self.defaultResolver = CMD_PROC
+ self.defaultResolver = Resolver.PROC
osType = os.uname()[0]
self.resolverOptions = getSystemResolvers(osType)
- resolverLabels = ", ".join([CMD_STR[option] for option in self.resolverOptions])
- log.log(CONFIG["log.connResolverOptions"], "Operating System: %s, Connection Resolvers: %s" % (osType, resolverLabels))
+ log.log(CONFIG["log.connResolverOptions"], "Operating System: %s, Connection Resolvers: %s" % (osType, ", ".join(self.resolverOptions)))
# sets the default resolver to be the first found in the system's PATH
# (left as netstat if none are found)
for resolver in self.resolverOptions:
- if resolver == CMD_PROC or sysTools.isAvailable(CMD_STR[resolver]):
+ # Resolver strings correspond to their command with the exception of bsd
+ # resolvers.
+ resolverCmd = resolver.replace(" (bsd)", "")
+
+ if resolver == Resolver.PROC or sysTools.isAvailable(resolverCmd):
self.defaultResolver = resolver
break
self._connections = [] # connection cache (latest results)
+ self._resolutionCounter = 0 # number of successful connection resolutions
self._isPaused = False
self._halt = False # terminates thread if true
self._cond = threading.Condition() # used for pausing the thread
@@ -371,6 +470,7 @@
lookupTime = time.time() - resolveStart
self._connections = connResults
+ self._resolutionCounter += 1
newMinDefaultRate = 100 * lookupTime
if self.defaultRate < newMinDefaultRate:
@@ -409,7 +509,7 @@
if newResolver:
# provide notice that failures have occurred and resolver is changing
- msg = RESOLVER_SERIAL_FAILURE_MSG % (CMD_STR[resolver], CMD_STR[newResolver])
+ msg = RESOLVER_SERIAL_FAILURE_MSG % (resolver, newResolver)
log.log(CONFIG["log.connLookupFailover"], msg)
else:
# exhausted all resolvers, give warning
@@ -428,6 +528,14 @@
if self._halt: return []
else: return list(self._connections)
+ def getResolutionCount(self):
+ """
+ Provides the number of successful resolutions so far. This can be used to
+ determine if the connection results are new for the caller or not.
+ """
+
+ return self._resolutionCounter
+
def setPaused(self, isPause):
"""
Allows or prevents further connection resolutions (this still makes use of
@@ -451,3 +559,168 @@
self._cond.notifyAll()
self._cond.release()
+class AppResolver:
+ """
+ Provides the names and pids of appliations attached to the given ports. This
+ stops attempting to query if it fails three times without successfully
+ getting lsof results.
+ """
+
+ def __init__(self, scriptName = "python"):
+ """
+ Constructs a resolver instance.
+
+ Arguments:
+ scriptName - name by which to all our own entries
+ """
+
+ self.scriptName = scriptName
+ self.queryResults = {}
+ self.resultsLock = threading.RLock()
+ self._cond = threading.Condition() # used for pausing when waiting for results
+ self.isResolving = False # flag set if we're in the process of making a query
+ self.failureCount = 0 # -1 if we've made a successful query
+
+ def getResults(self, maxWait=0):
+ """
+ Provides the last queried results. If we're in the process of making a
+ query then we can optionally block for a time to see if it finishes.
+
+ Arguments:
+ maxWait - maximum second duration to block on getting results before
+ returning
+ """
+
+ self._cond.acquire()
+ if self.isResolving and maxWait > 0:
+ self._cond.wait(maxWait)
+ self._cond.release()
+
+ self.resultsLock.acquire()
+ results = dict(self.queryResults)
+ self.resultsLock.release()
+
+ return results
+
+ def resolve(self, ports):
+ """
+ Queues the given listing of ports to be resolved. This clears the last set
+ of results when completed.
+
+ Arguments:
+ ports - list of ports to be resolved to applications
+ """
+
+ if self.failureCount < 3:
+ self.isResolving = True
+ t = threading.Thread(target = self._queryApplications, kwargs = {"ports": ports})
+ t.setDaemon(True)
+ t.start()
+
+ def _queryApplications(self, ports=[]):
+ """
+ Performs an lsof lookup on the given ports to get the command/pid tuples.
+
+ Arguments:
+ ports - list of ports to be resolved to applications
+ """
+
+ # atagar@fenrir:~/Desktop/arm$ lsof -i tcp:51849 -i tcp:37277
+ # COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
+ # tor 2001 atagar 14u IPv4 14048 0t0 TCP localhost:9051->localhost:37277 (ESTABLISHED)
+ # tor 2001 atagar 15u IPv4 22024 0t0 TCP localhost:9051->localhost:51849 (ESTABLISHED)
+ # python 2462 atagar 3u IPv4 14047 0t0 TCP localhost:37277->localhost:9051 (ESTABLISHED)
+ # python 3444 atagar 3u IPv4 22023 0t0 TCP localhost:51849->localhost:9051 (ESTABLISHED)
+
+ if not ports:
+ self.resultsLock.acquire()
+ self.queryResults = {}
+ self.isResolving = False
+ self.resultsLock.release()
+
+ # wakes threads waiting on results
+ self._cond.acquire()
+ self._cond.notifyAll()
+ self._cond.release()
+
+ return
+
+ results = {}
+ lsofArgs = []
+
+ # Uses results from the last query if we have any, otherwise appends the
+ # port to the lsof command. This has the potential for persisting dirty
+ # results but if we're querying by the dynamic port on the local tcp
+ # connections then this should be very rare (and definitely worth the
+ # chance of being able to skip an lsof query altogether).
+ for port in ports:
+ if port in self.queryResults:
+ results[port] = self.queryResults[port]
+ else: lsofArgs.append("-i tcp:%s" % port)
+
+ if lsofArgs:
+ lsofResults = sysTools.call("lsof -nP " + " ".join(lsofArgs))
+ else: lsofResults = None
+
+ if not lsofResults and self.failureCount != -1:
+ # lsof query failed and we aren't yet sure if it's possible to
+ # successfully get results on this platform
+ self.failureCount += 1
+ self.isResolving = False
+ return
+ elif lsofResults:
+ # (iPort, oPort) tuple for our own process, if it was fetched
+ ourConnection = None
+
+ for line in lsofResults:
+ lineComp = line.split()
+
+ if len(lineComp) == 10 and lineComp[9] == "(ESTABLISHED)":
+ cmd, pid, _, _, _, _, _, _, portMap, _ = lineComp
+
+ if "->" in portMap:
+ iPort, oPort = portMap.split("->")
+ iPort = iPort.split(":")[1]
+ oPort = oPort.split(":")[1]
+
+ # entry belongs to our own process
+ if pid == str(os.getpid()):
+ cmd = self.scriptName
+ ourConnection = (iPort, oPort)
+
+ if iPort.isdigit() and oPort.isdigit():
+ newEntry = (iPort, oPort, cmd, pid)
+
+ # adds the entry under the key of whatever we queried it with
+ # (this might be both the inbound _and_ outbound ports)
+ for portMatch in (iPort, oPort):
+ if portMatch in ports:
+ if portMatch in results:
+ results[portMatch].append(newEntry)
+ else: results[portMatch] = [newEntry]
+
+ # making the lsof call generated an extraneous sh entry for our own connection
+ if ourConnection:
+ for ourPort in ourConnection:
+ if ourPort in results:
+ shIndex = None
+
+ for i in range(len(results[ourPort])):
+ if results[ourPort][i][2] == "sh":
+ shIndex = i
+ break
+
+ if shIndex != None:
+ del results[ourPort][shIndex]
+
+ self.resultsLock.acquire()
+ self.failureCount = -1
+ self.queryResults = results
+ self.isResolving = False
+ self.resultsLock.release()
+
+ # wakes threads waiting on results
+ self._cond.acquire()
+ self._cond.notifyAll()
+ self._cond.release()
+
Copied: arm/release/src/util/enum.py (from rev 24554, arm/trunk/src/util/enum.py)
===================================================================
--- arm/release/src/util/enum.py (rev 0)
+++ arm/release/src/util/enum.py 2011-04-04 15:22:31 UTC (rev 24555)
@@ -0,0 +1,116 @@
+"""
+Basic enumeration, providing ordered types for collections. These can be
+constructed as simple type listings, ie:
+>>> insects = Enum("ANT", "WASP", "LADYBUG", "FIREFLY")
+>>> insects.ANT
+'Ant'
+>>> insects.values()
+['Ant', 'Wasp', 'Ladybug', 'Firefly']
+
+with overwritten string counterparts:
+>>> pets = Enum(("DOG", "Skippy"), "CAT", ("FISH", "Nemo"))
+>>> pets.DOG
+'Skippy'
+>>> pets.CAT
+'Cat'
+
+or with entirely custom string components as an unordered enum with:
+>>> pets = LEnum(DOG="Skippy", CAT="Kitty", FISH="Nemo")
+>>> pets.CAT
+'Kitty'
+"""
+
+def toCamelCase(label):
+ """
+ Converts the given string to camel case, ie:
+ >>> toCamelCase("I_LIKE_PEPPERJACK!")
+ 'I Like Pepperjack!'
+
+ Arguments:
+ label - input string to be converted
+ """
+
+ words = []
+ for entry in label.split("_"):
+ if len(entry) == 0: words.append("")
+ elif len(entry) == 1: words.append(entry.upper())
+ else: words.append(entry[0].upper() + entry[1:].lower())
+
+ return " ".join(words)
+
+class Enum:
+ """
+ Basic enumeration.
+ """
+
+ def __init__(self, *args):
+ self.orderedValues = []
+
+ for entry in args:
+ if isinstance(entry, str):
+ key, val = entry, toCamelCase(entry)
+ elif isinstance(entry, tuple) and len(entry) == 2:
+ key, val = entry
+ else: raise ValueError("Unrecognized input: %s" % args)
+
+ self.__dict__[key] = val
+ self.orderedValues.append(val)
+
+ def values(self):
+ """
+ Provides an ordered listing of the enumerations in this set.
+ """
+
+ return list(self.orderedValues)
+
+ def indexOf(self, value):
+ """
+ Provides the index of the given value in the collection. This raises a
+ ValueError if no such element exists.
+
+ Arguments:
+ value - entry to be looked up
+ """
+
+ return self.orderedValues.index(value)
+
+ def next(self, value):
+ """
+ Provides the next enumeration after the given value, raising a ValueError
+ if no such enum exists.
+
+ Arguments:
+ value - enumeration for which to get the next entry
+ """
+
+ if not value in self.orderedValues:
+ raise ValueError("No such enumeration exists: %s (options: %s)" % (value, ", ".join(self.orderedValues)))
+
+ nextIndex = (self.orderedValues.index(value) + 1) % len(self.orderedValues)
+ return self.orderedValues[nextIndex]
+
+ def previous(self, value):
+ """
+ Provides the previous enumeration before the given value, raising a
+ ValueError if no such enum exists.
+
+ Arguments:
+ value - enumeration for which to get the previous entry
+ """
+
+ if not value in self.orderedValues:
+ raise ValueError("No such enumeration exists: %s (options: %s)" % (value, ", ".join(self.orderedValues)))
+
+ prevIndex = (self.orderedValues.index(value) - 1) % len(self.orderedValues)
+ return self.orderedValues[prevIndex]
+
+class LEnum(Enum):
+ """
+ Enumeration that accepts custom string mappings.
+ """
+
+ def __init__(self, **args):
+ Enum.__init__(self)
+ self.__dict__.update(args)
+ self.orderedValues = sorted(args.values())
+
Modified: arm/release/src/util/log.py
===================================================================
--- arm/release/src/util/log.py 2011-04-04 15:15:20 UTC (rev 24554)
+++ arm/release/src/util/log.py 2011-04-04 15:22:31 UTC (rev 24555)
@@ -11,19 +11,23 @@
from sys import maxint
from threading import RLock
-# logging runlevels
-DEBUG, INFO, NOTICE, WARN, ERR = range(1, 6)
-RUNLEVEL_STR = {DEBUG: "DEBUG", INFO: "INFO", NOTICE: "NOTICE", WARN: "WARN", ERR: "ERR"}
+from util import enum
+# Logging runlevels. These are *very* commonly used so including shorter
+# aliases (so they can be referenced as log.DEBUG, log.WARN, etc).
+Runlevel = enum.Enum(("DEBUG", "DEBUG"), ("INFO", "INFO"), ("NOTICE", "NOTICE"),
+ ("WARN", "WARN"), ("ERR", "ERR"))
+DEBUG, INFO, NOTICE, WARN, ERR = Runlevel.values()
+
# provides thread safety for logging operations
LOG_LOCK = RLock()
# chronologically ordered records of events for each runlevel, stored as tuples
# consisting of: (time, message)
-_backlog = dict([(level, []) for level in range(1, 6)])
+_backlog = dict([(level, []) for level in Runlevel.values()])
# mapping of runlevels to the listeners interested in receiving events from it
-_listeners = dict([(level, []) for level in range(1, 6)])
+_listeners = dict([(level, []) for level in Runlevel.values()])
CONFIG = {"cache.armLog.size": 1000,
"cache.armLog.trimSize": 200}
@@ -55,36 +59,6 @@
DUMP_FILE = open(logPath, "w")
-def strToRunlevel(runlevelStr):
- """
- Converts runlevel strings ("DEBUG", "INFO", "NOTICE", etc) to their
- corresponding enumeations. This isn't case sensitive and provides None if
- unrecognized.
-
- Arguments:
- runlevelStr - string to be converted to runlevel
- """
-
- if not runlevelStr: return None
-
- runlevelStr = runlevelStr.upper()
- for enum, level in RUNLEVEL_STR.items():
- if level == runlevelStr: return enum
-
- return None
-
-def runlevelToStr(runlevelEnum):
- """
- Converts runlevel enumerations to corresponding string. If unrecognized then
- this provides "NONE".
-
- Arguments:
- runlevelEnum - enumeration to be converted to string
- """
-
- if runlevelEnum in RUNLEVEL_STR: return RUNLEVEL_STR[runlevelEnum]
- else: return "NONE"
-
def log(level, msg, eventTime = None):
"""
Registers an event, directing it to interested listeners and preserving it in
@@ -128,7 +102,7 @@
try:
entryTime = time.localtime(eventTime)
timeLabel = "%i/%i/%i %02i:%02i:%02i" % (entryTime[1], entryTime[2], entryTime[0], entryTime[3], entryTime[4], entryTime[5])
- logEntry = "%s [%s] %s\n" % (timeLabel, runlevelToStr(level), msg)
+ logEntry = "%s [%s] %s\n" % (timeLabel, level, msg)
DUMP_FILE.write(logEntry)
DUMP_FILE.flush()
except IOError, exc:
@@ -137,7 +111,7 @@
# notifies listeners
for callback in _listeners[level]:
- callback(RUNLEVEL_STR[level], msg, eventTime)
+ callback(level, msg, eventTime)
finally:
LOG_LOCK.release()
@@ -175,7 +149,7 @@
if dumpBacklog:
for level, msg, eventTime in _getEntries(levels):
- callback(RUNLEVEL_STR[level], msg, eventTime)
+ callback(level, msg, eventTime)
finally:
LOG_LOCK.release()
Modified: arm/release/src/util/panel.py
===================================================================
--- arm/release/src/util/panel.py 2011-04-04 15:15:20 UTC (rev 24554)
+++ arm/release/src/util/panel.py 2011-04-04 15:22:31 UTC (rev 24555)
@@ -56,8 +56,9 @@
# implementations aren't entirely deterministic (for instance panels
# might chose their height based on its parent's current width).
+ self.panelName = name
self.parent = parent
- self.panelName = name
+ self.visible = True
self.top = top
self.height = height
self.width = width
@@ -99,6 +100,23 @@
self.parent = parent
self.win = None
+ def isVisible(self):
+ """
+ Provides if the panel's configured to be visible or not.
+ """
+
+ return self.visible
+
+ def setVisible(self, isVisible):
+ """
+ Toggles if the panel is visible or not.
+
+ Arguments:
+ isVisible - panel is redrawn when requested if true, skipped otherwise
+ """
+
+ self.visible = isVisible
+
def getTop(self):
"""
Provides the position subwindows are placed at within its parent.
@@ -170,7 +188,7 @@
if setWidth != -1: newWidth = min(newWidth, setWidth)
return (newHeight, newWidth)
- def draw(self, subwindow, width, height):
+ def draw(self, width, height):
"""
Draws display's content. This is meant to be overwritten by
implementations and not called directly (use redraw() instead). The
@@ -178,10 +196,8 @@
a column less than the actual space.
Arguments:
- sudwindow - panel's current subwindow instance, providing raw access to
- its curses functions
- width - horizontal space available for content
- height - vertical space available for content
+ width - horizontal space available for content
+ height - vertical space available for content
"""
pass
@@ -198,6 +214,9 @@
abandoned
"""
+ # skipped if not currently visible
+ if not self.isVisible(): return
+
# if the panel's completely outside its parent then this is a no-op
newHeight, newWidth = self.getPreferredSize()
if newHeight == 0:
@@ -222,11 +241,70 @@
try:
if forceRedraw:
self.win.erase() # clears any old contents
- self.draw(self.win, self.maxX - 1, self.maxY)
+ self.draw(self.maxX - 1, self.maxY)
self.win.refresh()
finally:
CURSES_LOCK.release()
+ def hline(self, y, x, length, attr=curses.A_NORMAL):
+ """
+ Draws a horizontal line. This should only be called from the context of a
+ panel's draw method.
+
+ Arguments:
+ y - vertical location
+ x - horizontal location
+ length - length the line spans
+ attr - text attributes
+ """
+
+ if self.win and self.maxX > x and self.maxY > y:
+ try:
+ drawLength = min(length, self.maxX - x)
+ self.win.hline(y, x, curses.ACS_HLINE | attr, drawLength)
+ except:
+ # in edge cases drawing could cause a _curses.error
+ pass
+
+ def vline(self, y, x, length, attr=curses.A_NORMAL):
+ """
+ Draws a vertical line. This should only be called from the context of a
+ panel's draw method.
+
+ Arguments:
+ y - vertical location
+ x - horizontal location
+ length - length the line spans
+ attr - text attributes
+ """
+
+ if self.win and self.maxX > x and self.maxY > y:
+ try:
+ drawLength = min(length, self.maxY - y)
+ self.win.vline(y, x, curses.ACS_VLINE | attr, drawLength)
+ except:
+ # in edge cases drawing could cause a _curses.error
+ pass
+
+ def addch(self, y, x, char, attr=curses.A_NORMAL):
+ """
+ Draws a single character. This should only be called from the context of a
+ panel's draw method.
+
+ Arguments:
+ y - vertical location
+ x - horizontal location
+ char - character to be drawn
+ attr - text attributes
+ """
+
+ if self.win and self.maxX > x and self.maxY > y:
+ try:
+ self.win.addch(y, x, char, attr)
+ except:
+ # in edge cases drawing could cause a _curses.error
+ pass
+
def addstr(self, y, x, msg, attr=curses.A_NORMAL):
"""
Writes string to subwindow if able. This takes into account screen bounds
Modified: arm/release/src/util/procTools.py
===================================================================
--- arm/release/src/util/procTools.py 2011-04-04 15:15:20 UTC (rev 24554)
+++ arm/release/src/util/procTools.py 2011-04-04 15:22:31 UTC (rev 24555)
@@ -20,12 +20,12 @@
import socket
import base64
-from util import log
+from util import enum, log
# cached system values
SYS_START_TIME, SYS_PHYSICAL_MEMORY = None, None
CLOCK_TICKS = os.sysconf(os.sysconf_names["SC_CLK_TCK"])
-STAT_COMMAND, STAT_CPU_UTIME, STAT_CPU_STIME, STAT_START_TIME = range(4)
+Stat = enum.Enum("COMMAND", "CPU_UTIME", "CPU_STIME", "START_TIME")
CONFIG = {"queries.useProc": True,
"log.procCallMade": log.DEBUG}
@@ -128,10 +128,10 @@
def getStats(pid, *statTypes):
"""
Provides process specific information. Options are:
- STAT_COMMAND command name under which the process is running
- STAT_CPU_UTIME total user time spent on the process
- STAT_CPU_STIME total system time spent on the process
- STAT_START_TIME when this process began, in unix time
+ Stat.COMMAND command name under which the process is running
+ Stat.CPU_UTIME total user time spent on the process
+ Stat.CPU_STIME total system time spent on the process
+ Stat.START_TIME when this process began, in unix time
Arguments:
pid - queried process
@@ -159,19 +159,19 @@
results, queriedStats = [], []
for statType in statTypes:
- if statType == STAT_COMMAND:
+ if statType == Stat.COMMAND:
queriedStats.append("command")
if pid == 0: results.append("sched")
else: results.append(statComp[1])
- elif statType == STAT_CPU_UTIME:
+ elif statType == Stat.CPU_UTIME:
queriedStats.append("utime")
if pid == 0: results.append("0")
else: results.append(str(float(statComp[13]) / CLOCK_TICKS))
- elif statType == STAT_CPU_STIME:
+ elif statType == Stat.CPU_STIME:
queriedStats.append("stime")
if pid == 0: results.append("0")
else: results.append(str(float(statComp[14]) / CLOCK_TICKS))
- elif statType == STAT_START_TIME:
+ elif statType == Stat.START_TIME:
queriedStats.append("start time")
if pid == 0: return getSystemStartTime()
else:
Modified: arm/release/src/util/sysTools.py
===================================================================
--- arm/release/src/util/sysTools.py 2011-04-04 15:15:20 UTC (rev 24554)
+++ arm/release/src/util/sysTools.py 2011-04-04 15:22:31 UTC (rev 24555)
@@ -126,7 +126,7 @@
# fetch it from proc contents if available
if procTools.isProcAvailable():
try:
- processName = procTools.getStats(pid, procTools.STAT_COMMAND)[0]
+ processName = procTools.getStats(pid, procTools.Stat.COMMAND)[0]
except IOError, exc:
raisedExc = exc
@@ -466,7 +466,7 @@
newValues = {}
try:
if self._useProc:
- utime, stime, startTime = procTools.getStats(self.processPid, procTools.STAT_CPU_UTIME, procTools.STAT_CPU_STIME, procTools.STAT_START_TIME)
+ utime, stime, startTime = procTools.getStats(self.processPid, procTools.Stat.CPU_UTIME, procTools.Stat.CPU_STIME, procTools.Stat.START_TIME)
totalCpuTime = float(utime) + float(stime)
cpuDelta = totalCpuTime - self._lastCpuTotal
newValues["cpuSampling"] = cpuDelta / timeSinceReset
Modified: arm/release/src/util/torConfig.py
===================================================================
--- arm/release/src/util/torConfig.py 2011-04-04 15:15:20 UTC (rev 24554)
+++ arm/release/src/util/torConfig.py 2011-04-04 15:22:31 UTC (rev 24555)
@@ -5,9 +5,10 @@
import os
import threading
-from util import log, sysTools, torTools, uiTools
+from util import enum, log, sysTools, torTools, uiTools
CONFIG = {"features.torrc.validate": True,
+ "config.important": [],
"torrc.alias": {},
"torrc.label.size.b": [],
"torrc.label.size.kb": [],
@@ -22,27 +23,23 @@
"log.configDescriptions.unrecognizedCategory": log.NOTICE}
# enums and values for numeric torrc entries
-UNRECOGNIZED, SIZE_VALUE, TIME_VALUE = range(1, 4)
+ValueType = enum.Enum("UNRECOGNIZED", "SIZE", "TIME")
SIZE_MULT = {"b": 1, "kb": 1024, "mb": 1048576, "gb": 1073741824, "tb": 1099511627776}
TIME_MULT = {"sec": 1, "min": 60, "hour": 3600, "day": 86400, "week": 604800}
# enums for issues found during torrc validation:
-# VAL_DUPLICATE - entry is ignored due to being a duplicate
-# VAL_MISMATCH - the value doesn't match tor's current state
-# VAL_MISSING - value differs from its default but is missing from the torrc
-# VAL_IS_DEFAULT - the configuration option matches tor's default
-VAL_DUPLICATE, VAL_MISMATCH, VAL_MISSING, VAL_IS_DEFAULT = range(1, 5)
+# DUPLICATE - entry is ignored due to being a duplicate
+# MISMATCH - the value doesn't match tor's current state
+# MISSING - value differs from its default but is missing from the torrc
+# IS_DEFAULT - the configuration option matches tor's default
+ValidationError = enum.Enum("DUPLICATE", "MISMATCH", "MISSING", "IS_DEFAULT")
# descriptions of tor's configuration options fetched from its man page
CONFIG_DESCRIPTIONS_LOCK = threading.RLock()
CONFIG_DESCRIPTIONS = {}
# categories for tor configuration options
-GENERAL, CLIENT, SERVER, DIRECTORY, AUTHORITY, HIDDEN_SERVICE, TESTING, UNKNOWN = range(1, 9)
-OPTION_CATEGORY_STR = {GENERAL: "General", CLIENT: "Client",
- SERVER: "Relay", DIRECTORY: "Directory",
- AUTHORITY: "Authority", HIDDEN_SERVICE: "Hidden Service",
- TESTING: "Testing", UNKNOWN: "Unknown"}
+Category = enum.Enum("GENERAL", "CLIENT", "RELAY", "DIRECTORY", "AUTHORITY", "HIDDEN_SERVICE", "TESTING", "UNKNOWN")
TORRC = None # singleton torrc instance
MAN_OPT_INDENT = 7 # indentation before options in the man page
@@ -51,10 +48,13 @@
MULTILINE_PARAM = None # cached multiline parameters (lazily loaded)
def loadConfig(config):
- CONFIG["torrc.alias"] = config.get("torrc.alias", {})
+ config.update(CONFIG)
- # fetches any config.summary.* values
+ # stores lowercase entries to drop case sensitivity
+ CONFIG["config.important"] = [entry.lower() for entry in CONFIG["config.important"]]
+
for configKey in config.getKeys():
+ # fetches any config.summary.* values
if configKey.startswith("config.summary."):
CONFIG[configKey.lower()] = config.get(configKey)
@@ -119,9 +119,6 @@
inputFileContents = inputFile.readlines()
inputFile.close()
- # constructs a reverse mapping for categories
- strToCat = dict([(OPTION_CATEGORY_STR[cat], cat) for cat in OPTION_CATEGORY_STR])
-
try:
versionLine = inputFileContents.pop(0).rstrip()
@@ -138,10 +135,8 @@
while inputFileContents:
# gets category enum, failing if it doesn't exist
- categoryStr = inputFileContents.pop(0).rstrip()
- if categoryStr in strToCat:
- category = strToCat[categoryStr]
- else:
+ category = inputFileContents.pop(0).rstrip()
+ if not category in Category.values():
baseMsg = "invalid category in input file: '%s'"
raise IOError(baseMsg % categoryStr)
@@ -183,7 +178,7 @@
validOptions = [line[:line.find(" ")].lower() for line in configOptionQuery]
optionCount, lastOption, lastArg = 0, None, None
- lastCategory, lastDescription = GENERAL, ""
+ lastCategory, lastDescription = Category.GENERAL, ""
for line in manCallResults:
line = uiTools.getPrintable(line)
strippedLine = line.strip()
@@ -217,13 +212,13 @@
# if this is a category header then switch it
if isCategoryLine:
- if line.startswith("OPTIONS"): lastCategory = GENERAL
- elif line.startswith("CLIENT"): lastCategory = CLIENT
- elif line.startswith("SERVER"): lastCategory = SERVER
- elif line.startswith("DIRECTORY SERVER"): lastCategory = DIRECTORY
- elif line.startswith("DIRECTORY AUTHORITY SERVER"): lastCategory = AUTHORITY
- elif line.startswith("HIDDEN SERVICE"): lastCategory = HIDDEN_SERVICE
- elif line.startswith("TESTING NETWORK"): lastCategory = TESTING
+ if line.startswith("OPTIONS"): lastCategory = Category.GENERAL
+ elif line.startswith("CLIENT"): lastCategory = Category.CLIENT
+ elif line.startswith("SERVER"): lastCategory = Category.RELAY
+ elif line.startswith("DIRECTORY SERVER"): lastCategory = Category.DIRECTORY
+ elif line.startswith("DIRECTORY AUTHORITY SERVER"): lastCategory = Category.AUTHORITY
+ elif line.startswith("HIDDEN SERVICE"): lastCategory = Category.HIDDEN_SERVICE
+ elif line.startswith("TESTING NETWORK"): lastCategory = Category.TESTING
else:
msg = "Unrecognized category in the man page: %s" % line.strip()
log.log(CONFIG["log.configDescriptions.unrecognizedCategory"], msg)
@@ -249,7 +244,7 @@
def saveOptionDescriptions(path):
"""
Preserves the current configuration descriptors to the given path. This
- raises an IOError if unable to do so.
+ raises an IOError or OSError if unable to do so.
Arguments:
path - location to persist configuration descriptors
@@ -269,7 +264,7 @@
for i in range(len(sortedOptions)):
option = sortedOptions[i]
manEntry = getConfigDescription(option)
- outputFile.write("%s\nindex: %i\n%s\n%s\n%s\n" % (OPTION_CATEGORY_STR[manEntry.category], manEntry.index, option, manEntry.argUsage, manEntry.description))
+ outputFile.write("%s\nindex: %i\n%s\n%s\n%s\n" % (manEntry.category, manEntry.index, option, manEntry.argUsage, manEntry.description))
if i != len(sortedOptions) - 1: outputFile.write(PERSIST_ENTRY_DIVIDER)
outputFile.close()
@@ -286,6 +281,17 @@
return CONFIG.get("config.summary.%s" % option.lower())
+def isImportant(option):
+ """
+ Provides True if the option has the 'important' flag in the configuration,
+ False otherwise.
+
+ Arguments:
+ option - tor config option
+ """
+
+ return option.lower() in CONFIG["config.important"]
+
def getConfigDescription(option):
"""
Provides ManPageEntry instances populated with information fetched from the
@@ -345,19 +351,31 @@
return tuple(MULTILINE_PARAM)
-def getCustomOptions():
+def getCustomOptions(includeValue = False):
"""
- Provides the set of torrc parameters that differ from their defaults.
+ Provides the torrc parameters that differ from their defaults.
+
+ Arguments:
+ includeValue - provides the current value with results if true, otherwise
+ this just contains the options
"""
- customOptions, conn = set(), torTools.getConn()
- configTextQuery = conn.getInfo("config-text", "").strip().split("\n")
+ configText = torTools.getConn().getInfo("config-text", "").strip()
+ configLines = configText.split("\n")
- for entry in configTextQuery:
- # tor provides a Log entry even if it matches the default
- if entry != "Log notice stdout":
- customOptions.add(entry[:entry.find(" ")])
- return customOptions
+ # removes any duplicates
+ configLines = list(set(configLines))
+
+ # The "GETINFO config-text" query only provides options that differ
+ # from Tor's defaults with the exception of its Log entry which, even
+ # if undefined, returns "Log notice stdout" as per:
+ # https://trac.torproject.org/projects/tor/ticket/2362
+
+ try: configLines.remove("Log notice stdout")
+ except ValueError: pass
+
+ if includeValue: return configLines
+ else: return [line[:line.find(" ")] for line in configLines]
def validate(contents = None):
"""
@@ -403,13 +421,13 @@
# most parameters are overwritten if defined multiple times
if option in seenOptions and not option in getMultilineParameters():
- issuesFound.append((lineNumber, VAL_DUPLICATE, option))
+ issuesFound.append((lineNumber, ValidationError.DUPLICATE, option))
continue
else: seenOptions.append(option)
# checks if the value isn't necessary due to matching the defaults
if not option in customOptions:
- issuesFound.append((lineNumber, VAL_IS_DEFAULT, option))
+ issuesFound.append((lineNumber, ValidationError.IS_DEFAULT, option))
# replace aliases with their recognized representation
if option in CONFIG["torrc.alias"]:
@@ -444,17 +462,17 @@
if not isBlankMatch and not val in torValues:
# converts corrections to reader friedly size values
displayValues = torValues
- if valueType == SIZE_VALUE:
+ if valueType == ValueType.SIZE:
displayValues = [uiTools.getSizeLabel(int(val)) for val in torValues]
- elif valueType == TIME_VALUE:
+ elif valueType == ValueType.TIME:
displayValues = [uiTools.getTimeLabel(int(val)) for val in torValues]
- issuesFound.append((lineNumber, VAL_MISMATCH, ", ".join(displayValues)))
+ issuesFound.append((lineNumber, ValidationError.MISMATCH, ", ".join(displayValues)))
# checks if any custom options are missing from the torrc
for option in customOptions:
if not option in seenOptions:
- issuesFound.append((None, VAL_MISSING, option))
+ issuesFound.append((None, ValidationError.MISSING, option))
return issuesFound
@@ -470,13 +488,13 @@
if confArg.count(" ") == 1:
val, unit = confArg.lower().split(" ", 1)
- if not val.isdigit(): return confArg, UNRECOGNIZED
+ if not val.isdigit(): return confArg, ValueType.UNRECOGNIZED
mult, multType = _getUnitType(unit)
if mult != None:
return str(int(val) * mult), multType
- return confArg, UNRECOGNIZED
+ return confArg, ValueType.UNRECOGNIZED
def _getUnitType(unit):
"""
@@ -489,13 +507,13 @@
for label in SIZE_MULT:
if unit in CONFIG["torrc.label.size." + label]:
- return SIZE_MULT[label], SIZE_VALUE
+ return SIZE_MULT[label], ValueType.SIZE
for label in TIME_MULT:
if unit in CONFIG["torrc.label.time." + label]:
- return TIME_MULT[label], TIME_VALUE
+ return TIME_MULT[label], ValueType.TIME
- return None, UNRECOGNIZED
+ return None, ValueType.UNRECOGNIZED
def _stripComments(contents):
"""
@@ -622,13 +640,23 @@
self.valsLock.acquire()
+ # The torrc validation relies on 'GETINFO config-text' which was
+ # introduced in tor 0.2.2.7-alpha so if we're using an earlier version
+ # (or configured to skip torrc validation) then this is a no-op. For more
+ # information see:
+ # https://trac.torproject.org/projects/tor/ticket/2501
+
if not self.isLoaded(): returnVal = None
- elif not CONFIG["features.torrc.validate"]: returnVal = {}
else:
- if self.corrections == None:
- self.corrections = validate(self.contents)
+ skipValidation = not CONFIG["features.torrc.validate"]
+ skipValidation |= not torTools.getConn().isVersion("0.2.2.7-alpha")
- returnVal = list(self.corrections)
+ if skipValidation: returnVal = {}
+ else:
+ if self.corrections == None:
+ self.corrections = validate(self.contents)
+
+ returnVal = list(self.corrections)
self.valsLock.release()
return returnVal
Modified: arm/release/src/util/torTools.py
===================================================================
--- arm/release/src/util/torTools.py 2011-04-04 15:15:20 UTC (rev 24554)
+++ arm/release/src/util/torTools.py 2011-04-04 15:22:31 UTC (rev 24555)
@@ -17,13 +17,25 @@
from TorCtl import TorCtl, TorUtil
-from util import log, procTools, sysTools, uiTools
+from util import enum, log, procTools, sysTools, uiTools
# enums for tor's controller state:
-# TOR_INIT - attached to a new controller or restart/sighup signal received
-# TOR_CLOSED - control port closed
-TOR_INIT, TOR_CLOSED = range(1, 3)
+# INIT - attached to a new controller or restart/sighup signal received
+# CLOSED - control port closed
+State = enum.Enum("INIT", "CLOSED")
+# Addresses of the default directory authorities for tor version 0.2.3.0-alpha
+# (this comes from the dirservers array in src/or/config.c).
+DIR_SERVERS = [("86.59.21.38", "80"), # tor26
+ ("128.31.0.39", "9031"), # moria1
+ ("216.224.124.114", "9030"), # ides
+ ("212.112.245.170", "80"), # gabelmoo
+ ("194.109.206.212", "80"), # dizum
+ ("193.23.244.244", "80"), # dannenberg
+ ("208.83.223.34", "443"), # urras
+ ("213.115.239.118", "443"), # maatuska
+ ("82.94.251.203", "80")] # Tonga
+
# message logged by default when a controller can't set an event type
DEFAULT_FAILED_EVENT_MSG = "Unsupported event type: %s"
@@ -41,9 +53,21 @@
# options (unchangable, even with a SETCONF) and other useful stats
CACHE_ARGS = ("version", "config-file", "exit-policy/default", "fingerprint",
"config/names", "info/names", "features/names", "events/names",
- "nsEntry", "descEntry", "bwRate", "bwBurst", "bwObserved",
- "bwMeasured", "flags", "pid", "pathPrefix", "startTime")
+ "nsEntry", "descEntry", "address", "bwRate", "bwBurst",
+ "bwObserved", "bwMeasured", "flags", "parsedVersion", "pid",
+ "pathPrefix", "startTime", "authorities", "circuits", "hsPorts")
+CACHE_GETINFO_PREFIX_ARGS = ("ip-to-country/", )
+# Tor has a couple messages (in or/router.c) for when our ip address changes:
+# "Our IP Address has changed from <previous> to <current>; rebuilding
+# descriptor (source: <source>)."
+# "Guessed our IP address as <current> (source: <source>)."
+#
+# It would probably be preferable to use the EXTERNAL_ADDRESS event, but I'm
+# not quite sure why it's not provided by check_descriptor_ipaddress_changed
+# so erring on the side of inclusiveness by using the notice event instead.
+ADDR_CHANGED_MSG_PREFIX = ("Our IP Address has changed from", "Guessed our IP address as")
+
TOR_CTL_CLOSE_MSG = "Tor closed control connection. Exiting event thread."
UNKNOWN = "UNKNOWN" # value used by cached information if undefined
CONFIG = {"torrc.map": {},
@@ -52,6 +76,7 @@
"log.torGetInfo": log.DEBUG,
"log.torGetInfoCache": None,
"log.torGetConf": log.DEBUG,
+ "log.torGetConfCache": None,
"log.torSetConf": log.INFO,
"log.torPrefixPathInvalid": log.NOTICE,
"log.bsdJailFound": log.INFO,
@@ -65,9 +90,22 @@
"NS": "information related to the consensus will grow stale",
"NEWCONSENSUS": "information related to the consensus will grow stale"}
+# number of sequential attempts before we decide that the Tor geoip database
+# is unavailable
+GEOIP_FAILURE_THRESHOLD = 5
+
# provides int -> str mappings for torctl event runlevels
TORCTL_RUNLEVELS = dict([(val, key) for (key, val) in TorUtil.loglevels.items()])
+# ip address ranges substituted by the 'private' keyword
+PRIVATE_IP_RANGES = ("0.0.0.0/8", "169.254.0.0/16", "127.0.0.0/8", "192.168.0.0/16", "10.0.0.0/8", "172.16.0.0/12")
+
+# This prevents controllers from spawning worker threads (and by extension
+# notifying status listeners). This is important when shutting down to prevent
+# rogue threads from being alive during shutdown.
+
+NO_SPAWN = False
+
def loadConfig(config):
config.update(CONFIG)
@@ -185,6 +223,41 @@
log.log(CONFIG["log.unknownBsdJailId"], "Failed to figure out the FreeBSD jail id. Assuming 0.")
return 0
+def parseVersion(versionStr):
+ """
+ Parses the given version string into its expected components, for instance...
+ '0.2.2.13-alpha (git-feb8c1b5f67f2c6f)'
+
+ would provide:
+ (0, 2, 2, 13, 'alpha')
+
+ If the input isn't recognized then this returns None.
+
+ Arguments:
+ versionStr - version string to be parsed
+ """
+
+ # crops off extra arguments, for instance:
+ # '0.2.2.13-alpha (git-feb8c1b5f67f2c6f)' -> '0.2.2.13-alpha'
+ versionStr = versionStr.split()[0]
+
+ result = None
+ if versionStr.count(".") in (2, 3):
+ # parses the optional suffix ('alpha', 'release', etc)
+ if versionStr.count("-") == 1:
+ versionStr, versionSuffix = versionStr.split("-")
+ else: versionSuffix = ""
+
+ # Parses the numeric portion of the version. This can have three or four
+ # entries depending on if an optional patch level was provided.
+ try:
+ versionComp = [int(entry) for entry in versionStr.split(".")]
+ if len(versionComp) == 3: versionComp += [0]
+ result = tuple(versionComp + [versionSuffix])
+ except ValueError: pass
+
+ return result
+
def getConn():
"""
Singleton constructor for a Controller. Be aware that this starts as being
@@ -210,18 +283,29 @@
self.torctlListeners = [] # callback functions for TorCtl events
self.statusListeners = [] # callback functions for tor's state changes
self.controllerEvents = [] # list of successfully set controller events
+ self._fingerprintMappings = None # mappings of ip -> [(port, fingerprint), ...]
+ self._fingerprintLookupCache = {} # lookup cache with (ip, port) -> fingerprint mappings
+ self._fingerprintsAttachedCache = None # cache of relays we're connected to
+ self._nicknameLookupCache = {} # lookup cache with fingerprint -> nickname mappings
+ self._consensusLookupCache = {} # lookup cache with network status entries
+ self._descriptorLookupCache = {} # lookup cache with relay descriptors
self._isReset = False # internal flag for tracking resets
- self._status = TOR_CLOSED # current status of the attached control port
+ self._status = State.CLOSED # current status of the attached control port
self._statusTime = 0 # unix time-stamp for the duration of the status
self.lastHeartbeat = 0 # time of the last tor event
+ self._exitPolicyChecker = None
+ self._isExitingAllowed = False
+ self._exitPolicyLookupCache = {} # mappings of ip/port tuples to if they were accepted by the policy or not
+
# Logs issues and notices when fetching the path prefix if true. This is
# only done once for the duration of the application to avoid pointless
# messages.
self._pathPrefixLogging = True
- # cached GETINFO parameters (None if unset or possibly changed)
- self._cachedParam = dict([(arg, "") for arg in CACHE_ARGS])
+ # cached parameters for GETINFO and custom getters (None if unset or
+ # possibly changed)
+ self._cachedParam = {}
# cached GETCONF parameters, entries consisting of:
# (option, fetch_type) => value
@@ -230,6 +314,9 @@
# directs TorCtl to notify us of events
TorUtil.logger = self
TorUtil.loglevel = "DEBUG"
+
+ # tracks the number of sequential geoip lookup failures
+ self.geoipFailureCount = 0
def init(self, conn=None):
"""
@@ -254,17 +341,30 @@
self.conn.add_event_listener(self)
for listener in self.eventListeners: self.conn.add_event_listener(listener)
+ # reset caches for ip -> fingerprint lookups
+ self._fingerprintMappings = None
+ self._fingerprintLookupCache = {}
+ self._fingerprintsAttachedCache = None
+ self._nicknameLookupCache = {}
+ self._consensusLookupCache = {}
+ self._descriptorLookupCache = {}
+
+ self._exitPolicyChecker = self.getExitPolicy()
+ self._isExitingAllowed = self._exitPolicyChecker.isExitingAllowed()
+ self._exitPolicyLookupCache = {}
+
# sets the events listened for by the new controller (incompatible events
# are dropped with a logged warning)
self.setControllerEvents(self.controllerEvents)
self.connLock.release()
- self._status = TOR_INIT
+ self._status = State.INIT
self._statusTime = time.time()
# notifies listeners that a new controller is available
- thread.start_new_thread(self._notifyStatusListeners, (TOR_INIT,))
+ if not NO_SPAWN:
+ thread.start_new_thread(self._notifyStatusListeners, (State.INIT,))
def close(self):
"""
@@ -274,14 +374,29 @@
self.connLock.acquire()
if self.conn:
self.conn.close()
+
+ # If we're closing due to an event from TorCtl (for instance, tor was
+ # stopped) then TorCtl is shutting itself down and there's no need to
+ # join on its thread (actually, this *is* the TorCtl thread in that
+ # case so joining on it causes deadlock).
+ #
+ # This poses a slight possability of shutting down with a live orphaned
+ # thread if Tor is shut down, then arm shuts down before TorCtl has a
+ # chance to terminate. However, I've never seen that occure so leaving
+ # that alone for now.
+
+ if not threading.currentThread() == self.conn._thread:
+ self.conn._thread.join()
+
self.conn = None
self.connLock.release()
- self._status = TOR_CLOSED
+ self._status = State.CLOSED
self._statusTime = time.time()
# notifies listeners that the controller's been shut down
- thread.start_new_thread(self._notifyStatusListeners, (TOR_CLOSED,))
+ if not NO_SPAWN:
+ thread.start_new_thread(self._notifyStatusListeners, (State.CLOSED,))
else: self.connLock.release()
def isAlive(self):
@@ -337,21 +452,44 @@
self.connLock.acquire()
+ isGeoipRequest = param.startswith("ip-to-country/")
+
+ # checks if this is an arg caching covers
+ isCacheArg = param in CACHE_ARGS
+
+ if not isCacheArg:
+ for prefix in CACHE_GETINFO_PREFIX_ARGS:
+ if param.startswith(prefix):
+ isCacheArg = True
+ break
+
startTime = time.time()
result, raisedExc, isFromCache = default, None, False
if self.isAlive():
- if param in CACHE_ARGS and self._cachedParam[param]:
- result = self._cachedParam[param]
+ cachedValue = self._cachedParam.get(param)
+
+ if isCacheArg and cachedValue:
+ result = cachedValue
isFromCache = True
+ elif isGeoipRequest and self.geoipFailureCount == GEOIP_FAILURE_THRESHOLD:
+ # the geoip database aleady looks to be unavailable - abort the request
+ raisedExc = TorCtl.ErrorReply("Tor geoip database is unavailable.")
else:
try:
getInfoVal = self.conn.get_info(param)[param]
if getInfoVal != None: result = getInfoVal
+ if isGeoipRequest: self.geoipFailureCount = 0
except (socket.error, TorCtl.ErrorReply, TorCtl.TorCtlClosed), exc:
if type(exc) == TorCtl.TorCtlClosed: self.close()
raisedExc = exc
+
+ if isGeoipRequest:
+ self.geoipFailureCount += 1
+
+ if self.geoipFailureCount == GEOIP_FAILURE_THRESHOLD:
+ log.log(CONFIG["log.geoipUnavailable"], "Tor geoip database is unavailable.")
- if not isFromCache and result and param in CACHE_ARGS:
+ if isCacheArg and result and not isFromCache:
self._cachedParam[param] = result
if isFromCache:
@@ -439,9 +577,9 @@
result = {} if fetchType == "map" else []
if self.isAlive():
- if (param, fetchType) in self._cachedConf:
+ if (param.lower(), fetchType) in self._cachedConf:
isFromCache = True
- result = self._cachedConf[(param, fetchType)]
+ result = self._cachedConf[(param.lower(), fetchType)]
else:
try:
if fetchType == "str":
@@ -458,15 +596,18 @@
if type(exc) == TorCtl.TorCtlClosed: self.close()
result, raisedExc = default, exc
- if not isFromCache and result:
+ if not isFromCache:
cacheValue = result
if fetchType == "list": cacheValue = list(result)
elif fetchType == "map": cacheValue = dict(result)
- self._cachedConf[(param, fetchType)] = cacheValue
+ self._cachedConf[(param.lower(), fetchType)] = cacheValue
- runtimeLabel = "cache fetch" if isFromCache else "runtime: %0.4f" % (time.time() - startTime)
- msg = "GETCONF %s (%s)" % (param, runtimeLabel)
- log.log(CONFIG["log.torGetConf"], msg)
+ if isFromCache:
+ msg = "GETCONF %s (cache fetch)" % param
+ log.log(CONFIG["log.torGetConfCache"], msg)
+ else:
+ msg = "GETCONF %s (runtime: %0.4f)" % (param, time.time() - startTime)
+ log.log(CONFIG["log.torGetConf"], msg)
self.connLock.release()
@@ -496,10 +637,16 @@
# flushing cached values (needed until we can detect SETCONF calls)
for fetchType in ("str", "list", "map"):
- entry = (param, fetchType)
+ entry = (param.lower(), fetchType)
if entry in self._cachedConf:
del self._cachedConf[entry]
+
+ # special caches for the exit policy
+ if param.lower() == "exitpolicy":
+ self._exitPolicyChecker = self.getExitPolicy()
+ self._isExitingAllowed = self._exitPolicyChecker.isExitingAllowed()
+ self._exitPolicyLookupCache = {}
except (socket.error, TorCtl.ErrorReply, TorCtl.TorCtlClosed), exc:
if type(exc) == TorCtl.TorCtlClosed: self.close()
elif type(exc) == TorCtl.ErrorReply:
@@ -527,6 +674,27 @@
if raisedExc: raise raisedExc
+ def getCircuits(self, default = []):
+ """
+ This provides a list with tuples of the form:
+ (circuitID, status, purpose, (fingerprint1, fingerprint2...))
+
+ Arguments:
+ default - value provided back if unable to query the circuit-status
+ """
+
+ return self._getRelayAttr("circuits", default)
+
+ def getHiddenServicePorts(self, default = []):
+ """
+ Provides the target ports hidden services are configured to use.
+
+ Arguments:
+ default - value provided back if unable to query the hidden service ports
+ """
+
+ return self._getRelayAttr("hsPorts", default)
+
def getMyNetworkStatus(self, default = None):
"""
Provides the network status entry for this relay if available. This is
@@ -615,6 +783,53 @@
return self._getRelayAttr("flags", default)
+ def isVersion(self, minVersionStr):
+ """
+ Checks if we meet the given version. Recognized versions are of the form:
+ <major>.<minor>.<micro>[.<patch>][-<status_tag>]
+
+ for instance, "0.2.2.13-alpha" or "0.2.1.5". This raises a ValueError if
+ the input isn't recognized, and returns False if unable to fetch our
+ instance's version.
+
+ According to the spec the status_tag is purely informal, so it's ignored
+ in comparisons.
+
+ Arguments:
+ minVersionStr - version to be compared against
+ """
+
+ minVersion = parseVersion(minVersionStr)
+
+ if minVersion == None:
+ raise ValueError("unrecognized version: %s" % minVersionStr)
+
+ self.connLock.acquire()
+
+ result = False
+ if self.isAlive():
+ myVersion = self._getRelayAttr("parsedVersion", None)
+
+ if not myVersion:
+ result = False
+ elif myVersion[:4] == minVersion[:4]:
+ result = True # versions match
+ else:
+ # compares each of the numeric portions of the version
+ for i in range(4):
+ myVal, minVal = myVersion[i], minVersion[i]
+
+ if myVal > minVal:
+ result = True
+ break
+ elif myVal < minVal:
+ result = False
+ break
+
+ self.connLock.release()
+
+ return result
+
def getMyPid(self):
"""
Provides the pid of the attached tor process (None if no controller exists
@@ -623,6 +838,16 @@
return self._getRelayAttr("pid", None)
+ def getMyDirAuthorities(self):
+ """
+ Provides a listing of IP/port tuples for the directory authorities we've
+ been configured to use. If set in the configuration then these are custom
+ authorities, otherwise its an estimate of what Tor has been hardcoded to
+ use (unfortunately, this might be out of date).
+ """
+
+ return self._getRelayAttr("authorities", [])
+
def getPathPrefix(self):
"""
Provides the path prefix that should be used for fetching tor resources.
@@ -630,10 +855,7 @@
jail's path.
"""
- result = self._getRelayAttr("pathPrefix", "")
-
- if result == UNKNOWN: return ""
- else: return result
+ return self._getRelayAttr("pathPrefix", "")
def getStartTime(self):
"""
@@ -641,10 +863,7 @@
can't be determined then this provides None.
"""
- result = self._getRelayAttr("startTime", None)
-
- if result == UNKNOWN: return None
- else: return result
+ return self._getRelayAttr("startTime", None)
def getStatus(self):
"""
@@ -655,6 +874,199 @@
return (self._status, self._statusTime)
+ def isExitingAllowed(self, ipAddress, port):
+ """
+ Checks if the given destination can be exited to by this relay, returning
+ True if so and False otherwise.
+ """
+
+ self.connLock.acquire()
+
+ result = False
+ if self.isAlive():
+ # query the policy if it isn't yet cached
+ if not (ipAddress, port) in self._exitPolicyLookupCache:
+ # If we allow any exiting then this could be relayed DNS queries,
+ # otherwise the policy is checked. Tor still makes DNS connections to
+ # test when exiting isn't allowed, but nothing is relayed over them.
+ # I'm registering these as non-exiting to avoid likely user confusion:
+ # https://trac.torproject.org/projects/tor/ticket/965
+
+ if self._isExitingAllowed and port == "53": isAccepted = True
+ else: isAccepted = self._exitPolicyChecker.check(ipAddress, port)
+ self._exitPolicyLookupCache[(ipAddress, port)] = isAccepted
+
+ result = self._exitPolicyLookupCache[(ipAddress, port)]
+
+ self.connLock.release()
+
+ return result
+
+ def getExitPolicy(self):
+ """
+ Provides an ExitPolicy instance for the head of this relay's exit policy
+ chain. If there's no active connection then this provides None.
+ """
+
+ self.connLock.acquire()
+
+ result = None
+ if self.isAlive():
+ if self.getOption("ORPort"):
+ policyEntries = []
+ for exitPolicy in self.getOption("ExitPolicy", [], True):
+ policyEntries += [policy.strip() for policy in exitPolicy.split(",")]
+
+ # appends the default exit policy
+ defaultExitPolicy = self.getInfo("exit-policy/default")
+
+ if defaultExitPolicy:
+ policyEntries += defaultExitPolicy.split(",")
+
+ # construct the policy chain backwards
+ policyEntries.reverse()
+
+ for entry in policyEntries:
+ result = ExitPolicy(entry, result)
+
+ # Checks if we are rejecting private connections. If set, this appends
+ # 'reject private' and 'reject <my ip>' to the start of our policy chain.
+ isPrivateRejected = self.getOption("ExitPolicyRejectPrivate", True)
+
+ if isPrivateRejected:
+ result = ExitPolicy("reject private", result)
+
+ myAddress = self.getInfo("address")
+ if myAddress: result = ExitPolicy("reject %s" % myAddress, result)
+ else:
+ # no ORPort is set so all relaying is disabled
+ result = ExitPolicy("reject *:*")
+
+ self.connLock.release()
+
+ return result
+
+ def getConsensusEntry(self, relayFingerprint):
+ """
+ Provides the most recently available consensus information for the given
+ relay. This is none if no such information exists.
+
+ Arguments:
+ relayFingerprint - fingerprint of the relay
+ """
+
+ self.connLock.acquire()
+
+ result = None
+ if self.isAlive():
+ if not relayFingerprint in self._consensusLookupCache:
+ nsEntry = self.getInfo("ns/id/%s" % relayFingerprint)
+ self._consensusLookupCache[relayFingerprint] = nsEntry
+
+ result = self._consensusLookupCache[relayFingerprint]
+
+ self.connLock.release()
+
+ return result
+
+ def getDescriptorEntry(self, relayFingerprint):
+ """
+ Provides the most recently available descriptor information for the given
+ relay. Unless FetchUselessDescriptors is set this may frequently be
+ unavailable. If no such descriptor is available then this returns None.
+
+ Arguments:
+ relayFingerprint - fingerprint of the relay
+ """
+
+ self.connLock.acquire()
+
+ result = None
+ if self.isAlive():
+ if not relayFingerprint in self._descriptorLookupCache:
+ descEntry = self.getInfo("desc/id/%s" % relayFingerprint)
+ self._descriptorLookupCache[relayFingerprint] = descEntry
+
+ result = self._descriptorLookupCache[relayFingerprint]
+
+ self.connLock.release()
+
+ return result
+
+ def getRelayFingerprint(self, relayAddress, relayPort = None, getAllMatches = False):
+ """
+ Provides the fingerprint associated with the given address. If there's
+ multiple potential matches or the mapping is unknown then this returns
+ None. This disambiguates the fingerprint if there's multiple relays on
+ the same ip address by several methods, one of them being to pick relays
+ we have a connection with.
+
+ Arguments:
+ relayAddress - address of relay to be returned
+ relayPort - orport of relay (to further narrow the results)
+ getAllMatches - ignores the relayPort and provides all of the
+ (port, fingerprint) tuples matching the given
+ address
+ """
+
+ self.connLock.acquire()
+
+ result = None
+ if self.isAlive():
+ if getAllMatches:
+ # populates the ip -> fingerprint mappings if not yet available
+ if self._fingerprintMappings == None:
+ self._fingerprintMappings = self._getFingerprintMappings()
+
+ if relayAddress in self._fingerprintMappings:
+ result = self._fingerprintMappings[relayAddress]
+ else: result = []
+ else:
+ # query the fingerprint if it isn't yet cached
+ if not (relayAddress, relayPort) in self._fingerprintLookupCache:
+ relayFingerprint = self._getRelayFingerprint(relayAddress, relayPort)
+ self._fingerprintLookupCache[(relayAddress, relayPort)] = relayFingerprint
+
+ result = self._fingerprintLookupCache[(relayAddress, relayPort)]
+
+ self.connLock.release()
+
+ return result
+
+ def getRelayNickname(self, relayFingerprint):
+ """
+ Provides the nickname associated with the given relay. This provides None
+ if no such relay exists, and "Unnamed" if the name hasn't been set.
+
+ Arguments:
+ relayFingerprint - fingerprint of the relay
+ """
+
+ self.connLock.acquire()
+
+ result = None
+ if self.isAlive():
+ # query the nickname if it isn't yet cached
+ if not relayFingerprint in self._nicknameLookupCache:
+ if relayFingerprint == self.getInfo("fingerprint"):
+ # this is us, simply check the config
+ myNickname = self.getOption("Nickname", "Unnamed")
+ self._nicknameLookupCache[relayFingerprint] = myNickname
+ else:
+ # check the consensus for the relay
+ nsEntry = self.getConsensusEntry(relayFingerprint)
+
+ if nsEntry: relayNickname = nsEntry[2:nsEntry.find(" ", 2)]
+ else: relayNickname = None
+
+ self._nicknameLookupCache[relayFingerprint] = relayNickname
+
+ result = self._nicknameLookupCache[relayFingerprint]
+
+ self.connLock.release()
+
+ return result
+
def addEventListener(self, listener):
"""
Directs further tor controller events to callback functions of the
@@ -825,7 +1237,7 @@
if not issueSighup:
try:
self.conn.send_signal("RELOAD")
- self._cachedParam = dict([(arg, "") for arg in CACHE_ARGS])
+ self._cachedParam = {}
self._cachedConf = {}
except Exception, exc:
# new torrc parameters caused an error (tor's likely shut down)
@@ -870,7 +1282,7 @@
if errorLine: raise IOError(" ".join(errorLine.split()[3:]))
else: raise IOError("failed silently")
- self._cachedParam = dict([(arg, "") for arg in CACHE_ARGS])
+ self._cachedParam = {}
self._cachedConf = {}
except IOError, exc:
raisedException = exc
@@ -888,13 +1300,15 @@
if event.level == "NOTICE" and event.msg.startswith("Received reload signal (hup)"):
self._isReset = True
- self._status = TOR_INIT
+ self._status = State.INIT
self._statusTime = time.time()
- thread.start_new_thread(self._notifyStatusListeners, (TOR_INIT,))
+ if not NO_SPAWN:
+ thread.start_new_thread(self._notifyStatusListeners, (State.INIT,))
def ns_event(self, event):
self._updateHeartbeat()
+ self._consensusLookupCache = {}
myFingerprint = self.getInfo("fingerprint")
if myFingerprint:
@@ -912,20 +1326,77 @@
def new_consensus_event(self, event):
self._updateHeartbeat()
+ self.connLock.acquire()
+
self._cachedParam["nsEntry"] = None
self._cachedParam["flags"] = None
self._cachedParam["bwMeasured"] = None
+
+ # reconstructs consensus based mappings
+ self._fingerprintLookupCache = {}
+ self._fingerprintsAttachedCache = None
+ self._nicknameLookupCache = {}
+ self._consensusLookupCache = {}
+
+ if self._fingerprintMappings != None:
+ self._fingerprintMappings = self._getFingerprintMappings(event.nslist)
+
+ self.connLock.release()
def new_desc_event(self, event):
self._updateHeartbeat()
+ self.connLock.acquire()
+
myFingerprint = self.getInfo("fingerprint")
if not myFingerprint or myFingerprint in event.idlist:
self._cachedParam["descEntry"] = None
self._cachedParam["bwObserved"] = None
+
+ # If we're tracking ip address -> fingerprint mappings then update with
+ # the new relays.
+ self._fingerprintLookupCache = {}
+ self._fingerprintsAttachedCache = None
+ self._descriptorLookupCache = {}
+
+ if self._fingerprintMappings != None:
+ for fingerprint in event.idlist:
+ # gets consensus data for the new descriptor
+ try: nsLookup = self.conn.get_network_status("id/%s" % fingerprint)
+ except (socket.error, TorCtl.ErrorReply, TorCtl.TorCtlClosed): continue
+
+ if len(nsLookup) > 1:
+ # multiple records for fingerprint (shouldn't happen)
+ log.log(log.WARN, "Multiple consensus entries for fingerprint: %s" % fingerprint)
+ continue
+
+ # updates fingerprintMappings with new data
+ newRelay = nsLookup[0]
+ if newRelay.ip in self._fingerprintMappings:
+ # if entry already exists with the same orport, remove it
+ orportMatch = None
+ for entryPort, entryFingerprint in self._fingerprintMappings[newRelay.ip]:
+ if entryPort == newRelay.orport:
+ orportMatch = (entryPort, entryFingerprint)
+ break
+
+ if orportMatch: self._fingerprintMappings[newRelay.ip].remove(orportMatch)
+
+ # add the new entry
+ self._fingerprintMappings[newRelay.ip].append((newRelay.orport, newRelay.idhex))
+ else:
+ self._fingerprintMappings[newRelay.ip] = [(newRelay.orport, newRelay.idhex)]
+
+ self.connLock.release()
def circ_status_event(self, event):
self._updateHeartbeat()
+
+ # CIRC events aren't required, but if one's received then flush this cache
+ # since it uses circuit-status results.
+ self._fingerprintsAttachedCache = None
+
+ self._cachedParam["circuits"] = None
def buildtimeout_set_event(self, event):
self._updateHeartbeat()
@@ -959,6 +1430,13 @@
# checks if TorCtl is providing a notice that control port is closed
if TOR_CTL_CLOSE_MSG in msg: self.close()
+
+ # if the message is informing us of our ip address changing then clear
+ # its cached value
+ for prefix in ADDR_CHANGED_MSG_PREFIX:
+ if msg.startswith(prefix):
+ self._cachedParam["address"] = None
+ break
def _updateHeartbeat(self):
"""
@@ -968,6 +1446,126 @@
# alternative is to use the event's timestamp (via event.arrived_at)
self.lastHeartbeat = time.time()
+ def _getFingerprintMappings(self, nsList = None):
+ """
+ Provides IP address to (port, fingerprint) tuple mappings for all of the
+ currently cached relays.
+
+ Arguments:
+ nsList - network status listing (fetched if not provided)
+ """
+
+ results = {}
+ if self.isAlive():
+ # fetch the current network status if not provided
+ if not nsList:
+ try: nsList = self.conn.get_network_status()
+ except (socket.error, TorCtl.TorCtlClosed, TorCtl.ErrorReply): nsList = []
+
+ # construct mappings of ips to relay data
+ for relay in nsList:
+ if relay.ip in results: results[relay.ip].append((relay.orport, relay.idhex))
+ else: results[relay.ip] = [(relay.orport, relay.idhex)]
+
+ return results
+
+ def _getRelayFingerprint(self, relayAddress, relayPort):
+ """
+ Provides the fingerprint associated with the address/port combination.
+
+ Arguments:
+ relayAddress - address of relay to be returned
+ relayPort - orport of relay (to further narrow the results)
+ """
+
+ # If we were provided with a string port then convert to an int (so
+ # lookups won't mismatch based on type).
+ if isinstance(relayPort, str): relayPort = int(relayPort)
+
+ # checks if this matches us
+ if relayAddress == self.getInfo("address"):
+ if not relayPort or relayPort == self.getOption("ORPort"):
+ return self.getInfo("fingerprint")
+
+ # if we haven't yet populated the ip -> fingerprint mappings then do so
+ if self._fingerprintMappings == None:
+ self._fingerprintMappings = self._getFingerprintMappings()
+
+ potentialMatches = self._fingerprintMappings.get(relayAddress)
+ if not potentialMatches: return None # no relay matches this ip address
+
+ if len(potentialMatches) == 1:
+ # There's only one relay belonging to this ip address. If the port
+ # matches then we're done.
+ match = potentialMatches[0]
+
+ if relayPort and match[0] != relayPort: return None
+ else: return match[1]
+ elif relayPort:
+ # Multiple potential matches, so trying to match based on the port.
+ for entryPort, entryFingerprint in potentialMatches:
+ if entryPort == relayPort:
+ return entryFingerprint
+
+ # Disambiguates based on our orconn-status and circuit-status results.
+ # This only includes relays we're connected to, so chances are pretty
+ # slim that we'll still have a problem narrowing this down. Note that we
+ # aren't necessarily checking for events that can create new client
+ # circuits (so this cache might be a little dirty).
+
+ # populates the cache
+ if self._fingerprintsAttachedCache == None:
+ self._fingerprintsAttachedCache = []
+
+ # orconn-status has entries of the form:
+ # $33173252B70A50FE3928C7453077936D71E45C52=shiven CONNECTED
+ orconnResults = self.getInfo("orconn-status")
+ if orconnResults:
+ for line in orconnResults.split("\n"):
+ self._fingerprintsAttachedCache.append(line[1:line.find("=")])
+
+ # circuit-status results (we only make connections to the first hop)
+ for _, _, _, path in self.getCircuits():
+ self._fingerprintsAttachedCache.append(path[0])
+
+ # narrow to only relays we have a connection to
+ attachedMatches = []
+ for _, entryFingerprint in potentialMatches:
+ if entryFingerprint in self._fingerprintsAttachedCache:
+ attachedMatches.append(entryFingerprint)
+
+ if len(attachedMatches) == 1:
+ return attachedMatches[0]
+
+ # Highly unlikely, but still haven't found it. Last we'll use some
+ # tricks from Mike's ConsensusTracker, excluding possiblities that
+ # have...
+ # - lost their Running flag
+ # - list a bandwidth of 0
+ # - have 'opt hibernating' set
+ #
+ # This involves constructing a TorCtl Router and checking its 'down'
+ # flag (which is set by the three conditions above). This is the last
+ # resort since it involves a couple GETINFO queries.
+
+ for entryPort, entryFingerprint in list(potentialMatches):
+ try:
+ nsCall = self.conn.get_network_status("id/%s" % entryFingerprint)
+ if not nsCall: raise TorCtl.ErrorReply() # network consensus couldn't be fetched
+ nsEntry = nsCall[0]
+
+ descEntry = self.getInfo("desc/id/%s" % entryFingerprint)
+ if not descEntry: raise TorCtl.ErrorReply() # relay descriptor couldn't be fetched
+ descLines = descEntry.split("\n")
+
+ isDown = TorCtl.Router.build_from_desc(descLines, nsEntry).down
+ if isDown: potentialMatches.remove((entryPort, entryFingerprint))
+ except (socket.error, TorCtl.ErrorReply, TorCtl.TorCtlClosed): pass
+
+ if len(potentialMatches) == 1:
+ return potentialMatches[0][1]
+ else: return None
+
def _getRelayAttr(self, key, default, cacheUndefined = True):
"""
Provides information associated with this relay, using the cached value if
@@ -980,15 +1578,15 @@
lookups if true
"""
- currentVal = self._cachedParam[key]
- if currentVal:
+ currentVal = self._cachedParam.get(key)
+ if currentVal != None:
if currentVal == UNKNOWN: return default
else: return currentVal
self.connLock.acquire()
- currentVal, result = self._cachedParam[key], None
- if not currentVal and self.isAlive():
+ currentVal, result = self._cachedParam.get(key), None
+ if currentVal == None and self.isAlive():
# still unset - fetch value
if key in ("nsEntry", "descEntry"):
myFingerprint = self.getInfo("fingerprint")
@@ -1043,6 +1641,8 @@
if line.startswith("s "):
result = line[2:].split()
break
+ elif key == "parsedVersion":
+ result = parseVersion(self.getInfo("version", ""))
elif key == "pid":
result = getPid(int(self.getOption("ControlPort", 9051)), self.getOption("PidFile"))
elif key == "pathPrefix":
@@ -1084,7 +1684,7 @@
if myPid:
try:
if procTools.isProcAvailable():
- result = float(procTools.getStats(myPid, procTools.STAT_START_TIME)[0])
+ result = float(procTools.getStats(myPid, procTools.Stat.START_TIME)[0])
else:
psCall = sysTools.call("ps -p %s -o etime" % myPid)
@@ -1092,16 +1692,83 @@
etimeEntry = psCall[1].strip()
result = time.time() - uiTools.parseShortTimeLabel(etimeEntry)
except: pass
+ elif key == "authorities":
+ # There's two configuration options that can overwrite the default
+ # authorities: DirServer and AlternateDirAuthority.
+
+ # TODO: Both options accept a set of flags to more precisely set what they
+ # overwrite. Ideally this would account for these flags to more accurately
+ # identify authority connections from relays.
+
+ dirServerCfg = self.getOption("DirServer", [], True)
+ altDirAuthCfg = self.getOption("AlternateDirAuthority", [], True)
+ altAuthoritiesCfg = dirServerCfg + altDirAuthCfg
+
+ if altAuthoritiesCfg:
+ result = []
+
+ # entries are of the form:
+ # [nickname] [flags] address:port fingerprint
+ for entry in altAuthoritiesCfg:
+ locationComp = entry.split()[-2] # address:port component
+ result.append(tuple(locationComp.split(":", 1)))
+ else: result = list(DIR_SERVERS)
+ elif key == "circuits":
+ # Parses our circuit-status results, for instance
+ # 91 BUILT $E4AE6E2FE320FBBD31924E8577F3289D4BE0B4AD=Qwerty PURPOSE=GENERAL
+ # would belong to a single hop circuit, most likely fetching the
+ # consensus via a directory mirror.
+ circStatusResults = self.getInfo("circuit-status")
+
+ if circStatusResults == "":
+ result = [] # we don't have any circuits
+ elif circStatusResults != None:
+ result = []
+
+ for line in circStatusResults.split("\n"):
+ # appends a tuple with the (status, purpose, path)
+ lineComp = line.split(" ")
+
+ # skips blank lines and circuits without a path, for instance:
+ # 5 LAUNCHED PURPOSE=TESTING
+ if len(lineComp) < 4: continue
+
+ path = tuple([hopEntry[1:41] for hopEntry in lineComp[2].split(",")])
+ result.append((int(lineComp[0]), lineComp[1], lineComp[3][8:], path))
+ elif key == "hsPorts":
+ result = []
+ hsOptions = self.getOptionMap("HiddenServiceOptions")
+
+ if hsOptions and "HiddenServicePort" in hsOptions:
+ for hsEntry in hsOptions["HiddenServicePort"]:
+ # hidden service port entries are of the form:
+ # VIRTPORT [TARGET]
+ # with the TARGET being an IP, port, or IP:Port. If the target port
+ # isn't defined then uses the VIRTPORT.
+
+ hsPort = None
+
+ if " " in hsEntry:
+ # parses the target, checking if it's a port or IP:Port combination
+ hsTarget = hsEntry.split(" ")[1]
+
+ if ":" in hsTarget:
+ hsPort = hsTarget.split(":")[1] # target is the IP:Port
+ elif hsTarget.isdigit():
+ hsPort = hsTarget # target is just the port
+ else: hsPort = hsEntry # just has the virtual port
+
+ if hsPort.isdigit():
+ result.append(hsPort)
# cache value
- if result: self._cachedParam[key] = result
+ if result != None: self._cachedParam[key] = result
elif cacheUndefined: self._cachedParam[key] = UNKNOWN
- elif currentVal == UNKNOWN: result = currentVal
self.connLock.release()
- if result: return result
- else: return default
+ if result == None or result == UNKNOWN: return default
+ else: return result
def _notifyStatusListeners(self, eventType):
"""
@@ -1113,13 +1780,156 @@
"""
# resets cached GETINFO and GETCONF parameters
- self._cachedParam = dict([(arg, "") for arg in CACHE_ARGS])
+ self._cachedParam = {}
self._cachedConf = {}
# gives a notice that the control port has closed
- if eventType == TOR_CLOSED:
+ if eventType == State.CLOSED:
log.log(CONFIG["log.torCtlPortClosed"], "Tor control port closed")
for callback in self.statusListeners:
callback(self, eventType)
+class ExitPolicy:
+ """
+ Single rule from the user's exit policy. These are chained together to form
+ complete policies.
+ """
+
+ def __init__(self, ruleEntry, nextRule):
+ """
+ Exit policy rule constructor.
+
+ Arguments:
+ ruleEntry - tor exit policy rule (for instance, "reject *:135-139")
+ nextRule - next rule to be checked when queries don't match this policy
+ """
+
+ # sanitize the input a bit, cleaning up tabs and stripping quotes
+ ruleEntry = ruleEntry.replace("\\t", " ").replace("\"", "")
+
+ self.ruleEntry = ruleEntry
+ self.nextRule = nextRule
+ self.isAccept = ruleEntry.startswith("accept")
+
+ # strips off "accept " or "reject " and extra spaces
+ ruleEntry = ruleEntry[7:].replace(" ", "")
+
+ # split ip address (with mask if provided) and port
+ if ":" in ruleEntry: entryIp, entryPort = ruleEntry.split(":", 1)
+ else: entryIp, entryPort = ruleEntry, "*"
+
+ # sets the ip address component
+ self.isIpWildcard = entryIp == "*" or entryIp.endswith("/0")
+
+ # checks for the private alias (which expands this to a chain of entries)
+ if entryIp.lower() == "private":
+ entryIp = PRIVATE_IP_RANGES[0]
+
+ # constructs the chain backwards (last first)
+ lastHop = self.nextRule
+ prefix = "accept " if self.isAccept else "reject "
+ suffix = ":" + entryPort
+ for addr in PRIVATE_IP_RANGES[-1:0:-1]:
+ lastHop = ExitPolicy(prefix + addr + suffix, lastHop)
+
+ self.nextRule = lastHop # our next hop is the start of the chain
+
+ if "/" in entryIp:
+ ipComp = entryIp.split("/", 1)
+ self.ipAddress = ipComp[0]
+ self.ipMask = int(ipComp[1])
+ else:
+ self.ipAddress = entryIp
+ self.ipMask = 32
+
+ # constructs the binary address just in case of comparison with a mask
+ if self.ipAddress != "*":
+ self.ipAddressBin = ""
+ for octet in self.ipAddress.split("."):
+ # Converts the int to a binary string, padded with zeros. Source:
+ # http://www.daniweb.com/code/snippet216539.html
+ self.ipAddressBin += "".join([str((int(octet) >> y) & 1) for y in range(7, -1, -1)])
+ else:
+ self.ipAddressBin = "0" * 32
+
+ # sets the port component
+ self.minPort, self.maxPort = 0, 0
+ self.isPortWildcard = entryPort == "*"
+
+ if entryPort != "*":
+ if "-" in entryPort:
+ portComp = entryPort.split("-", 1)
+ self.minPort = int(portComp[0])
+ self.maxPort = int(portComp[1])
+ else:
+ self.minPort = int(entryPort)
+ self.maxPort = int(entryPort)
+
+ # if both the address and port are wildcards then we're effectively the
+ # last entry so cut off the remaining chain
+ if self.isIpWildcard and self.isPortWildcard:
+ self.nextRule = None
+
+ def isExitingAllowed(self):
+ """
+ Provides true if the policy allows exiting whatsoever, false otherwise.
+ """
+
+ if self.isAccept: return True
+ elif self.isIpWildcard and self.isPortWildcard: return False
+ elif not self.nextRule: return False # fell off policy (shouldn't happen)
+ else: return self.nextRule.isExitingAllowed()
+
+ def check(self, ipAddress, port):
+ """
+ Checks if the rule chain allows exiting to this address, returning true if
+ so and false otherwise.
+ """
+
+ port = int(port)
+
+ # does the port check first since comparing ip masks is more work
+ isPortMatch = self.isPortWildcard or (port >= self.minPort and port <= self.maxPort)
+
+ if isPortMatch:
+ isIpMatch = self.isIpWildcard or self.ipAddress == ipAddress
+
+ # expands the check to include the mask if it has one
+ if not isIpMatch and self.ipMask != 32:
+ inputAddressBin = ""
+ for octet in ipAddress.split("."):
+ inputAddressBin += "".join([str((int(octet) >> y) & 1) for y in range(7, -1, -1)])
+
+ isIpMatch = self.ipAddressBin[:self.ipMask] == inputAddressBin[:self.ipMask]
+
+ if isIpMatch: return self.isAccept
+
+ # our policy doesn't concern this address, move on to the next one
+ if self.nextRule: return self.nextRule.check(ipAddress, port)
+ else: return True # fell off the chain without a conclusion (shouldn't happen...)
+
+ def __str__(self):
+ # This provides the actual policy rather than the entry used to construct
+ # it so the 'private' keyword is expanded.
+
+ acceptanceLabel = "accept" if self.isAccept else "reject"
+
+ if self.isIpWildcard:
+ ipLabel = "*"
+ elif self.ipMask != 32:
+ ipLabel = "%s/%i" % (self.ipAddress, self.ipMask)
+ else: ipLabel = self.ipAddress
+
+ if self.isPortWildcard:
+ portLabel = "*"
+ elif self.minPort != self.maxPort:
+ portLabel = "%i-%i" % (self.minPort, self.maxPort)
+ else: portLabel = str(self.minPort)
+
+ myPolicy = "%s %s:%s" % (acceptanceLabel, ipLabel, portLabel)
+
+ if self.nextRule:
+ return myPolicy + ", " + str(self.nextRule)
+ else: return myPolicy
+
Modified: arm/release/src/util/uiTools.py
===================================================================
--- arm/release/src/util/uiTools.py 2011-04-04 15:15:20 UTC (rev 24554)
+++ arm/release/src/util/uiTools.py 2011-04-04 15:22:31 UTC (rev 24555)
@@ -9,7 +9,7 @@
import curses
from curses.ascii import isprint
-from util import log
+from util import enum, log
# colors curses can handle
COLOR_LIST = {"red": curses.COLOR_RED, "green": curses.COLOR_GREEN,
@@ -32,7 +32,7 @@
TIME_UNITS = [(86400.0, "d", " day"), (3600.0, "h", " hour"),
(60.0, "m", " minute"), (1.0, "s", " second")]
-END_WITH_ELLIPSE, END_WITH_HYPHEN = range(1, 3)
+Ending = enum.Enum("ELLIPSE", "HYPHEN")
SCROLL_KEYS = (curses.KEY_UP, curses.KEY_DOWN, curses.KEY_PPAGE, curses.KEY_NPAGE, curses.KEY_HOME, curses.KEY_END)
CONFIG = {"features.colorInterface": True,
"log.cursesColorSupport": log.INFO}
@@ -117,7 +117,7 @@
if not COLOR_ATTR_INITIALIZED: _initColors()
return COLOR_ATTR[color]
-def cropStr(msg, size, minWordLen = 4, minCrop = 0, endType = END_WITH_ELLIPSE, getRemainder = False):
+def cropStr(msg, size, minWordLen = 4, minCrop = 0, endType = Ending.ELLIPSE, getRemainder = False):
"""
Provides the msg constrained to the given length, truncating on word breaks.
If the last words is long this truncates mid-word with an ellipse. If there
@@ -143,8 +143,8 @@
minCrop - minimum characters that must be dropped if a word's cropped
endType - type of ending used when truncating:
None - blank ending
- END_WITH_ELLIPSE - includes an ellipse
- END_WITH_HYPHEN - adds hyphen when breaking words
+ Ending.ELLIPSE - includes an ellipse
+ Ending.HYPHEN - adds hyphen when breaking words
getRemainder - returns a tuple instead, with the second part being the
cropped portion of the message
"""
@@ -161,11 +161,12 @@
# since we're cropping, the effective space available is less with an
# ellipse, and cropping words requires an extra space for hyphens
- if endType == END_WITH_ELLIPSE: size -= 3
- elif endType == END_WITH_HYPHEN and minWordLen != None: minWordLen += 1
+ if endType == Ending.ELLIPSE: size -= 3
+ elif endType == Ending.HYPHEN and minWordLen != None: minWordLen += 1
# checks if there isn't the minimum space needed to include anything
lastWordbreak = msg.rfind(" ", 0, size + 1)
+ lastWordbreak = len(msg[:lastWordbreak].rstrip()) # drops extra ending whitespaces
if (minWordLen != None and size < minWordLen) or (minWordLen == None and lastWordbreak < 1):
if getRemainder: return ("", msg)
else: return ""
@@ -181,23 +182,64 @@
if includeCrop:
returnMsg, remainder = msg[:size], msg[size:]
- if endType == END_WITH_HYPHEN:
+ if endType == Ending.HYPHEN:
remainder = returnMsg[-1] + remainder
- returnMsg = returnMsg[:-1] + "-"
+ returnMsg = returnMsg[:-1].rstrip() + "-"
else: returnMsg, remainder = msg[:lastWordbreak], msg[lastWordbreak:]
# if this is ending with a comma or period then strip it off
if not getRemainder and returnMsg[-1] in (",", "."): returnMsg = returnMsg[:-1]
- if endType == END_WITH_ELLIPSE: returnMsg += "..."
+ if endType == Ending.ELLIPSE:
+ returnMsg = returnMsg.rstrip() + "..."
if getRemainder: return (returnMsg, remainder)
else: return returnMsg
+def drawBox(panel, top, left, width, height, attr=curses.A_NORMAL):
+ """
+ Draws a box in the panel with the given bounds.
+
+ Arguments:
+ panel - panel in which to draw
+ top - vertical position of the box's top
+ left - horizontal position of the box's left side
+ width - width of the drawn box
+ height - height of the drawn box
+ attr - text attributes
+ """
+
+ # draws the top and bottom
+ panel.hline(top, left + 1, width - 1, attr)
+ panel.hline(top + height - 1, left + 1, width - 1, attr)
+
+ # draws the left and right sides
+ panel.vline(top + 1, left, height - 2, attr)
+ panel.vline(top + 1, left + width, height - 2, attr)
+
+ # draws the corners
+ panel.addch(top, left, curses.ACS_ULCORNER, attr)
+ panel.addch(top, left + width, curses.ACS_URCORNER, attr)
+ panel.addch(top + height - 1, left, curses.ACS_LLCORNER, attr)
+ panel.addch(top + height - 1, left + width, curses.ACS_LRCORNER, attr)
+
+def isSelectionKey(key):
+ """
+ Returns true if the keycode matches the enter or space keys.
+
+ Argument:
+ key - keycode to be checked
+ """
+
+ return key in (curses.KEY_ENTER, 10, ord(' '))
+
def isScrollKey(key):
"""
Returns true if the keycode is recognized by the getScrollPosition function
for scrolling.
+
+ Argument:
+ key - keycode to be checked
"""
return key in SCROLL_KEYS
@@ -367,6 +409,73 @@
except ValueError:
raise ValueError(errorMsg)
+class DrawEntry:
+ """
+ Renderable content, encapsulating the text and formatting. These can be
+ chained together to compose lines with multiple types of formatting.
+ """
+
+ def __init__(self, text, format=curses.A_NORMAL, nextEntry=None, lockFormat=False):
+ """
+ Constructor for prepared draw entries.
+
+ Arguments:
+ text - content to be drawn, this can either be a string or list of
+ integer character codes
+ format - properties to apply when drawing
+ nextEntry - entry to be drawn after this one
+ lockFormat - prevents extra formatting attributes from being applied
+ when rendered if true
+ """
+
+ self.text = text
+ self.format = format
+ self.nextEntry = nextEntry
+ self.lockFormat = lockFormat
+
+ def getNext(self):
+ """
+ Provides the next DrawEntry in the chain.
+ """
+
+ return self.nextEntry
+
+ def setNext(self, nextEntry):
+ """
+ Sets additional content to be drawn after this entry. If None then
+ rendering is terminated after this entry.
+
+ Arguments:
+ nextEntry - DrawEntry instance to be rendered after this one
+ """
+
+ self.nextEntry = nextEntry
+
+ def render(self, drawPanel, y, x, extraFormat=curses.A_NORMAL):
+ """
+ Draws this content at the given position.
+
+ Arguments:
+ drawPanel - context in which to be drawn
+ y - vertical location
+ x - horizontal location
+ extraFormat - additional formatting
+ """
+
+ if self.lockFormat: drawFormat = self.format
+ else: drawFormat = self.format | extraFormat
+
+ if isinstance(self.text, str):
+ drawPanel.addstr(y, x, self.text, drawFormat)
+ else:
+ for i in range(len(self.text)):
+ drawChar = self.text[i]
+ drawPanel.addch(y, x + i, drawChar, drawFormat)
+
+ # if there's additional content to show then render it too
+ if self.nextEntry:
+ self.nextEntry.render(drawPanel, y, x + len(self.text), extraFormat)
+
class Scroller:
"""
Tracks the scrolling position when there might be a visible cursor. This
@@ -394,10 +503,16 @@
if self.isCursorEnabled:
self.getCursorSelection(content) # resets the cursor location
+ # makes sure the cursor is visible
if self.cursorLoc < self.scrollLoc:
self.scrollLoc = self.cursorLoc
elif self.cursorLoc > self.scrollLoc + pageHeight - 1:
self.scrollLoc = self.cursorLoc - pageHeight + 1
+
+ # checks if the bottom would run off the content (this could be the
+ # case when the content's size is dynamic and entries are removed)
+ if len(content) > pageHeight:
+ self.scrollLoc = min(self.scrollLoc, len(content) - pageHeight)
return self.scrollLoc
Modified: arm/release/src/version.py
===================================================================
--- arm/release/src/version.py 2011-04-04 15:15:20 UTC (rev 24554)
+++ arm/release/src/version.py 2011-04-04 15:22:31 UTC (rev 24555)
@@ -2,6 +2,6 @@
Provides arm's version and release date.
"""
-VERSION = '1.4.1.3'
-LAST_MODIFIED = "January 15, 2011"
+VERSION = '1.4.2'
+LAST_MODIFIED = "April 4, 2011"
1
0
Author: atagar
Date: 2011-04-04 15:15:20 +0000 (Mon, 04 Apr 2011)
New Revision: 24554
Modified:
arm/trunk/ChangeLog
Log:
Release notes for version 1.4.2.
Modified: arm/trunk/ChangeLog
===================================================================
--- arm/trunk/ChangeLog 2011-04-03 19:44:18 UTC (rev 24553)
+++ arm/trunk/ChangeLog 2011-04-04 15:15:20 UTC (rev 24554)
@@ -1,5 +1,53 @@
CHANGE LOG
+4/4/11 - version 1.4.2
+This release chiefly consists of a fully reimplemented connection panel. Besides being a sane, maintainable implementation this includes numerous new features and improvements like full circuit paths, applications involved for local connections, and better type identification.
+
+ * added: full rewrite of the connection panel, providing:
+ o listing the full paths involved in active circuits
+ o identification of socks, hidden service, and controller applications (arm, vidalia, polipo, etc)
+ o identification of exit connections with the common usage for the port they're using
+ o display of the local -> internal -> external address when room is available (original patch by Fabian Keil)
+ o better accuracy and performance in identifying client and directory connections
+ o marking the uptimes for initial connections (arm only tracks connection uptimes since starting, so these entries are just minimum durations)
+ o lazily loading the initial IP -> fingerprint mappings to improve the startup time
+ o using the circuit-status to disambiguating multiple relays on the same IP address
+ o smarter space utilization, filling in smaller columns if there isn't room for higher priority but larger entries
+ o connection details popup changes:
+ + using the consensus exit policies rather than the longer descriptor versions when available
+ + displaying connection details no longer freezes the rest of the display
+ + detail panel uses the full screen width and is dynamically resizable
+ + more resilient to missing descriptors
+ * change: hiding most tor config values by default (idea by arma)
+ * change: dropping warning suggesting that users set the FetchUselessDescriptors option (suggestion by Sebastian and others)
+ * change: always starting the bandwidth field from zero rather than using the state file total, which only contains the last day's worth of data (thanks to guilhem)
+ * change: suggesting authentication and giving steps for it in the readme (suggestion by Sebastian)
+ * change: caching config display lines, which reduces the CPU usage when scrolling by around 40%
+ * change: added summaries for the remaining tor configuration options
+ * change: using a dedicated enum class rather than tuple sets
+ * fix: torrc validation requires 'GETINFO config-text' which was introduced in Tor verison 0.2.2.7 (caught by Sjon, talion, and torland, https://trac.torproject.org/projects/tor/ticket/2501)
+ * fix: off-by-one issue with the displayed line numbers for torrc errors (caught by Sjon)
+ * fix: bin function wasn't available before python 2.6 (caught by Paul Menzel)
+ * fix: mis-parsing family entries when there's no entry after the comma (caught by StrangeCharm, https://trac.torproject.org/projects/tor/ticket/2414)
+ * fix: preventing SOCKS and CONTROL connections from being expanded (patch by Fabian Keil)
+ * fix: disabling name resolution for application queries to avoid leaking to resolvers (patch by Fabian Keil)
+ * fix: reversing src and dst addresses of SOCKS and CONTROL connections (caught by Fabian Keil)
+ * fix: changing the 'APPLICATION' type to 'SOCKS' since the previous label was too long (caught by Fabian Keil)
+ * fix: crashing issue from unknown relay nicknames (caught by krkhan)
+ * fix: concurrency bug occasionally causing "syshook" stacktraces when shutting down
+ * fix: header panel displayed the wrong IP address if it changed since we first started (https://trac.torproject.org/projects/tor/ticket/2776)
+ * fix: unchecked OSError could cause us to crash when making directories (for instance if there was a permissions issue)
+ * fix: the availability check for bsd resolvers was broken, probably causing resolution to fail for a few seconds on that platform
+ * fix: dropping the pointless 'Log notice stdout' entry provided by config-text queries (https://trac.torproject.org/projects/tor/ticket/2362)
+ * fix: taking DirServer and AlternateDirAuthority into account when determining the directory authorities
+ * fix: consuming a little extra space in the connection panel when scrollbars aren't visible
+ * fix: dropping the deprecated 'features.config.descriptions.persistPath' config option
+ * fix: failed connection attempts to the control port were generating zombie connections (https://trac.torproject.org/projects/tor/ticket/2812)
+ * fix: concurrency bug in joining on the TorCtl thread when tor shut down
+ * fix: the 'startup.dataDirectory' config option was being ignored
+ * fix: recognizing the proper private ip ranges of the 172.* block
+ * fix: missing 'is default' option from config sort ordering
+
1/7/11 - version 1.4.1 (r24054)
Platform specific enhancements including BSD compatibility and vastly improved performance on Linux.
1
0

04 Apr '11
commit 9d2b3849b2052bc6b54028c658a8b27fae452ea4
Merge: 65eb0e4 0cdd262
Author: Roger Dingledine <arma(a)torproject.org>
Date: Mon Apr 4 03:53:38 2011 -0400
Merge branch 'maint-0.2.1' into maint-0.2.2
changes/geoip-apr2011 | 3 +
src/config/geoip | 6197 ++++++++++++++++++++++++++++++++++---------------
2 files changed, 4341 insertions(+), 1859 deletions(-)
1
0

04 Apr '11
commit 7cee98f5fdaedda4acc80768b9c9751e48025129
Merge: 101503b 9d2b384
Author: Roger Dingledine <arma(a)torproject.org>
Date: Mon Apr 4 03:55:06 2011 -0400
Merge branch 'maint-0.2.2' into release-0.2.2
changes/geoip-apr2011 | 3 +
src/config/geoip | 6197 ++++++++++++++++++++++++++++++++++---------------
2 files changed, 4341 insertions(+), 1859 deletions(-)
1
0
commit 0cdd2629418f019bda5fa2daa271aae4f7131fa6
Author: Roger Dingledine <arma(a)torproject.org>
Date: Mon Apr 4 03:52:58 2011 -0400
switch to the apr 2011 geoip db
---
changes/geoip-apr2011 | 3 +
src/config/geoip | 6197 ++++++++++++++++++++++++++++++++++---------------
2 files changed, 4341 insertions(+), 1859 deletions(-)
diff --git a/changes/geoip-apr2011 b/changes/geoip-apr2011
new file mode 100644
index 0000000..c38f8ae
--- /dev/null
+++ b/changes/geoip-apr2011
@@ -0,0 +1,3 @@
+ o Minor features:
+ - Update to the April 1 2011 Maxmind GeoLite Country database.
+
diff --git a/src/config/geoip b/src/config/geoip
index c177b19..39acedd 100644
--- a/src/config/geoip
+++ b/src/config/geoip
@@ -1,7 +1,12 @@
-# Last updated based on March 1 2011 Maxmind GeoLite Country
+# Last updated based on April 1 2011 Maxmind GeoLite Country
# wget http://geolite.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip
# cut -d, -f3-5 < GeoIPCountryWhois.csv|sed 's/"//g' > geoip
-16777216,17301503,AU
+16777216,16908287,AU
+16908800,16909055,CN
+16909056,16909311,AU
+17039360,17039615,AU
+17040384,17040639,CN
+17170432,17301503,IN
17367040,17432575,MY
17435136,17435391,AU
17498112,17563647,KR
@@ -35,12 +40,13 @@
28573696,28966911,CN
28966912,29032447,IN
29097984,29884415,CN
-29884416,29885439,AU
29949952,30015487,KR
30015488,30408703,CN
30408704,33554431,KR
33554432,34603007,FR
-34603008,34620415,EU
+34603008,34604543,EU
+34604544,34605055,DE
+34605056,34620415,EU
34620416,34620927,SE
34620928,34621439,IT
34621440,34636799,EU
@@ -61,18 +67,20 @@
34866176,34867199,IT
34867200,34880511,EU
34880512,34881535,DE
-34881536,35127295,EU
+34881536,34910975,EU
+34910976,34911231,ES
+34911232,34911743,DE
+34911744,34911999,AT
+34912000,34912255,GB
+34912256,34913279,DE
+34913280,34930687,EU
+34930688,34938879,DE
+34938880,35127295,EU
35127296,35651583,GB
35651584,36700159,IT
36700160,36962303,AE
36962304,37224447,IL
-37224448,37265407,UA
-37265408,37268479,CZ
-37268480,37289983,UA
-37289984,37298175,RU
-37298176,37355519,UA
-37355520,37421055,RU
-37421056,37486591,UA
+37224448,37486591,UA
37486592,37748735,RU
37748736,38273023,SE
38273024,38797311,KZ
@@ -130,6 +138,7 @@
72348928,72349055,US
72349056,72349119,BM
72349120,83886079,US
+83886080,88080383,EU
100663296,121195295,US
121195296,121195327,IT
121195328,134693119,US
@@ -656,7 +665,8 @@
243531776,243662847,JP
243662848,243793919,CN
243793920,243859455,HK
-243859456,243924991,AU
+243859456,243916799,AU
+243916800,243924991,JP
243924992,243990527,KR
243990528,244318207,IN
244318208,245366783,CN
@@ -795,10 +805,9 @@
411779072,411828223,PR
411828224,411893759,US
411893760,411975679,CA
-411975680,411992063,US
-412024832,412221439,US
+411975680,412221439,US
412221440,412229631,CA
-412286976,412483583,US
+412254208,412483583,US
412483584,412549119,CA
412549120,412614655,US
412614656,412647423,CL
@@ -868,6 +877,7 @@
452988928,452997119,JP
452997120,453001215,IN
453001216,453009407,AU
+453009408,453017599,BD
453017600,453050367,JP
453050368,453115903,KR
453115904,453246975,VN
@@ -890,6 +900,7 @@
456265728,456269823,ID
456269824,456271871,HK
456273920,456286207,AU
+456286208,456294399,JP
456294400,456327167,CN
456327168,456523775,TW
456523776,456540159,SG
@@ -915,6 +926,7 @@
459300864,459309055,SG
459309056,459325439,KR
459325440,459333631,AU
+459333632,459341823,TW
459341824,459407359,IN
459407360,459456511,JP
459456512,459460607,HK
@@ -946,6 +958,7 @@
459997184,460062719,IN
460062720,460128255,PH
460128256,460136447,IN
+460136448,460144639,CN
460144640,460152831,PH
460152832,460154879,JP
460154880,460155903,SG
@@ -1016,10 +1029,11 @@
460939264,460940287,NZ
460940288,460941311,IN
460941312,460942335,AU
+460942336,460943359,MY
460943360,460945407,AU
460947456,460980223,JP
460980224,460981247,NC
-460982272,460983295,JP
+460981248,460983295,JP
460983296,460984319,HK
460984320,460988415,PG
460988416,460994559,JP
@@ -1045,7 +1059,7 @@
461111296,461127679,IN
461127680,461131775,PH
461131776,461135871,ID
-461135872,461139967,AU
+461135872,461144063,AU
461144064,461209599,KR
461209600,461225983,SG
461225984,461227007,WF
@@ -1094,11 +1108,30 @@
468713472,469237759,TW
469237760,469499903,IN
469499904,469565439,NZ
+469565440,469598207,AU
+469598208,469630975,JP
469630976,469696511,TH
469696512,469712895,PK
469712896,469729279,KR
469729280,469762047,IN
469762048,520093695,US
+521142272,521404415,DE
+521404416,521535487,NL
+521535488,521537535,GB
+521537536,521539583,RU
+521539584,521541631,BE
+521541632,521543679,DE
+521543680,521545727,RU
+521545728,521547775,GB
+521547776,521551871,AL
+521551872,521553919,DE
+521555968,521558015,NL
+521558016,521560063,CY
+521560064,521562111,PL
+521564160,521566207,GR
+521566208,521568255,LU
+521568256,521601023,PT
+521601024,521666559,RU
521666560,521668607,GB
521668608,521670655,CH
521670656,521672703,HU
@@ -1127,18 +1160,98 @@
521719808,521721855,UA
521721856,521723903,GB
521723904,521725951,SA
+521725952,521727999,IR
+521728000,521732095,FR
+521732096,521736191,GB
+521736192,521738239,DK
+521738240,521740287,RU
+521740288,521742335,IT
+521742336,521746431,DE
+521746432,521748479,NL
+521748480,521750527,SE
+521750528,521752575,PS
+521752576,521754623,FR
+521754624,521756671,IR
+521756672,521758719,NL
+521758720,521760767,IR
+521760768,521762815,IL
+521762816,521764863,CH
+521764864,521766911,IR
+521766912,521768959,IQ
+521768960,521771007,FI
+521771008,521773055,DE
+521773056,521775103,GB
+521775104,521777151,TR
+521777152,521779199,ES
+521779200,521783295,GB
+521783296,521785343,RU
+521785344,521787391,GB
+521787392,521789439,NO
+521789440,521791487,RU
+521791488,521793535,IR
+521793536,521795583,RU
+521795584,521797631,PL
+521797632,521928703,IT
521928704,521945087,RU
521945088,521953279,GB
521953280,521961471,RU
521961472,521969663,CZ
521969664,521977855,UA
521977856,521986047,RU
+521986048,521994239,UA
+521994240,522002431,KG
+522002432,522010623,IR
+522010624,522018815,AE
+522018816,522027007,FR
+522027008,522059775,RU
+522059776,522125311,CZ
+522125312,522133503,MD
+522133504,522135551,NL
+522135552,522137599,SE
+522137600,522141695,CH
+522141696,522143743,RU
+522143744,522145791,CZ
+522145792,522147839,DK
+522147840,522149887,ES
+522149888,522158079,UA
+522158080,522166271,BE
+522166272,522168319,SE
+522168320,522170367,RU
+522170368,522174463,YE
+522174464,522178559,RU
+522178560,522180607,DE
+522180608,522182655,KZ
+522182656,522190847,CZ
522190848,522715135,FR
-522788864,522790911,RU
+522780672,522782719,RU
+522782720,522784767,UA
+522784768,522786815,BG
+522786816,522788863,PL
+522788864,522797055,RU
+522797056,522801151,UA
+522801152,522803199,PL
+522803200,522805247,UA
+522805248,522807295,RU
+522807296,522811391,UA
+522811392,522813439,RU
+522813440,522815487,UA
+522815488,522819583,PL
+522819584,522821631,KG
+522821632,522823679,RU
+522823680,522827775,PL
+522827776,522831871,RU
+522846208,522854399,PL
+522854400,522858495,RU
+522858496,522866687,UA
+522866688,522870783,LV
+522870784,522874879,RU
+522874880,522878975,UA
522878976,522887167,RO
522887168,522895359,UA
522895360,522911743,RU
-522911744,522944511,UA
+522911744,522960895,UA
+522960896,522969087,RU
+522969088,522977279,UA
522977280,522981375,RU
522981376,522985471,IT
522985472,522989567,CH
@@ -1147,25 +1260,176 @@
522997760,523001855,RU
523001856,523005951,LT
523005952,523010047,IT
+523010048,523014143,IL
+523014144,523018239,ES
+523018240,523022335,IT
+523022336,523026431,RU
+523026432,523030527,TR
+523030528,523034623,FR
+523034624,523038719,SE
+523038720,523042815,RU
+523042816,523075583,NO
+523075584,523108351,HR
+523108352,523173887,HU
+523173888,523182079,BA
+523182080,523190271,IR
+523190272,523192319,FI
+523192320,523194367,ES
+523194368,523196415,DE
+523196416,523198463,AE
+523198464,523202559,CZ
+523202560,523223039,RU
+523223040,523225087,AM
+523225088,523227135,SE
+523227136,523229183,RO
+523229184,523231231,GB
+523231232,523239423,DE
523239424,523763711,GB
523763712,524025855,IR
524025856,524287999,PL
524288000,528482303,GB
+528482304,528490495,PL
+528490496,528498687,RU
+528498688,528515071,UA
+528515072,528523263,RU
+528523264,528531455,UA
+528531456,528539647,RU
+528539648,528547839,UA
+528547840,528564223,RU
+528564224,528580607,UA
+528580608,528588799,RU
+528588800,528596991,UA
+528596992,528605183,RU
+528875520,528879615,RU
+529006592,529268735,NL
+529268736,529530879,TR
529530880,529596415,UA
529596416,529661951,TR
529661952,529727487,GE
529727488,529793023,HR
-529793024,529825791,RU
-529825792,529858559,CZ
+529793024,529826815,RU
+529826816,529827839,GB
+529827840,529828863,RO
+529828864,529829887,RU
+529829888,529830399,UA
+529830400,529830911,RU
+529830912,529831935,DE
+529831936,529832959,UA
+529832960,529835007,RU
+529835008,529836031,KG
+529836032,529836543,UA
+529836544,529837055,IL
+529837056,529839103,RU
+529839104,529839615,UA
+529839616,529840127,CY
+529840128,529842175,UA
+529842176,529843199,IN
+529843200,529844735,RU
+529844736,529845247,UA
+529845248,529846271,UZ
+529846272,529846783,UA
+529846784,529849343,RU
+529849344,529855487,CZ
+529855488,529857535,RU
+529857536,529858559,UA
529858560,529924095,NL
529924096,529989631,DE
529989632,530055167,NL
530055168,530120703,GR
530120704,530186239,CY
+530186240,530251775,IL
+530251776,530317311,TR
+530317312,530579455,IT
530579456,530710527,NL
530710528,530841599,RU
530841600,530972671,CH
+530972672,531103743,SA
+531103744,531169279,IL
+531169280,531177471,KZ
+531177472,531183615,GB
+531183616,531185663,NL
+531185664,531193855,TR
+531193856,531194111,IE
+531194112,531195903,GB
+531195904,531197951,IT
+531197952,531199999,GB
+531200000,531202047,RU
+531202048,531234815,CZ
+531234816,531236863,IE
+531236864,531238911,FR
+531238912,531240959,LV
+531240960,531243007,SE
+531243008,531245055,RU
+531245056,531247103,IT
+531247104,531251199,IR
+531251200,531259391,SK
+531259392,531261439,ES
+531261440,531263487,DE
+531263488,531265535,RU
+531265536,531267583,GB
+531267584,531275775,UA
+531275776,531277823,LT
+531277824,531279871,RU
+531281920,531283967,RU
+531283968,531292159,DE
+531292160,531333119,AZ
+531333120,531335167,NL
+531335168,531337215,IT
+531341312,531349503,KZ
+531628032,531660799,TR
+531660800,531693567,BA
+531693568,531695615,RU
+531695616,531697663,LT
+531697664,531699711,GB
+531699712,531701759,CZ
+531703808,531705855,IT
+531705856,531707903,ES
+531707904,531709951,GR
+531709952,531718143,RU
+531718144,531720191,ES
+531720192,531722239,RU
+531722240,531724287,IT
+531724288,531726335,DE
+531726336,531759103,TR
+531759104,531890175,PL
+531890176,532021247,RU
+532021248,532152319,PL
532152320,532168703,DE
+532168704,532185087,NL
+532185088,532201471,IR
+532201472,532221951,RU
+532221952,532223999,IT
+532224000,532226047,NO
+532226048,532234239,GB
+532234240,532242431,DK
+532242432,532244479,IT
+532244480,532246527,DE
+532246528,532250623,BA
+532250624,532283391,GB
+532283392,532291583,TR
+532291584,532293631,IE
+532293632,532295679,IT
+532295680,532297727,KG
+532297728,532303871,RU
+532303872,532305919,PL
+532305920,532307967,NO
+532307968,532310015,RU
+532310016,532312063,GR
+532312064,532314111,JE
+532314112,532316159,DE
+532316160,532324351,RU
+532324352,532328447,NL
+532328448,532330495,PS
+532330496,532332543,CZ
+532332544,532340735,PL
+532340736,532348927,GB
+532348928,532365311,PL
+532365312,532373503,DE
+532373504,532375551,RU
+532375552,532377599,IT
+532377600,532381695,DE
+532381696,532414463,NL
+532414464,532676607,IT
536870912,539624567,US
539624568,539624575,IE
539624576,539624703,US
@@ -1266,7 +1530,9 @@
540814016,540814079,US
540814080,540814271,TW
540814272,540814279,DE
-540814280,540814511,US
+540814280,540814327,US
+540814328,540814335,IN
+540814336,540814511,US
540814512,540814519,SG
540814520,540814719,US
540814720,540814735,SG
@@ -1305,11 +1571,16 @@
543691008,543844351,US
543844352,543844607,CH
543844608,603979775,US
-603979776,604110847,CN
+603980800,603981823,NP
+603981824,603983871,CN
+603996160,604110847,CN
604110848,604241919,JP
604241920,604504063,CN
604504064,605028351,JP
605028352,606404607,CN
+606412800,606413823,HK
+606420992,606437375,ID
+606437376,606470143,KH
606470144,606601215,KR
606601216,607387647,CN
607387648,607649791,JP
@@ -1321,6 +1592,7 @@
620232704,620494847,CN
620494848,620625919,NP
620625920,620691455,CN
+620756992,624951295,EU
637534208,644067391,US
644067392,644067455,CA
644067456,644835071,US
@@ -1330,6 +1602,11 @@
644840448,645225471,US
645225472,645225503,CA
645225504,654311423,US
+654311680,654311935,AU
+654376960,654442495,TW
+655360000,656408575,KR
+656408576,658505727,PK
+658505728,660602879,CN
671088640,687865855,US
687865856,689963007,ZA
689963008,691011583,EG
@@ -1490,6 +1767,13 @@
693038080,693039103,ZW
693039104,693040127,GA
693040128,693041151,ZA
+693041152,693042175,MW
+693042176,693043199,NG
+693043200,693044223,ZW
+693044224,693045247,NG
+693045248,693046271,KE
+693046272,693047295,ZW
+693047296,693048319,ZA
693101568,693102591,KE
693102592,693103615,CD
693103616,693104639,GN
@@ -1899,38 +2183,72 @@
703594496,704118783,ZA
704118784,704380927,MA
704380928,704643071,LY
+704644096,704645119,BD
+704650240,704651263,MY
+704659456,704675839,TW
+704675840,704708607,CN
+704723968,704724991,MY
+704724992,704741375,VN
+704741376,704774143,CN
704774144,704905215,HK
704905216,705167359,CN
705167360,707788799,KR
707788800,708575231,CN
708575232,708706303,SG
+708706304,708739071,CN
+708751360,708752383,ID
+708755456,708771839,AU
708771840,708837375,CN
708837376,709885951,TW
709885952,710017023,CN
710017024,710082559,KR
-710148096,710934527,CN
-711000064,711065599,CN
+710082560,710098943,JP
+710104064,710105087,PK
+710115328,710934527,CN
+710934528,710950911,VN
+710961152,710962175,TH
+710967296,711065599,CN
711065600,711131135,HK
+711160832,711161855,BD
+711163904,711196671,JP
711196672,711458815,CN
711458816,711983103,IN
711983104,712507391,VN
-712507392,712769535,CN
+712507392,712703999,CN
+712712192,712713215,JP
+712736768,712769535,CN
712769536,713031679,JP
713031680,714080255,CN
714080256,714604543,JP
-714997760,721420287,CN
+714604544,714866687,MY
+714874880,714875903,MY
+714899456,716898303,CN
+716930048,716931071,JP
+716931072,716963839,CN
+716963840,717225983,MY
+717225984,717750271,CN
+717750272,717815807,HK
+717848576,717881343,PK
+717881344,720371711,CN
+720404480,720437247,CN
+720437248,720502783,AU
+720502784,721420287,CN
721420288,738197503,JP
738197504,771751935,US
771751936,771817471,RU
771817472,771948543,TR
771948544,772014079,RU
-772014080,772051223,DE
+772014080,772050575,DE
+772050576,772050583,TR
+772050584,772051223,DE
772051224,772051231,CH
772051232,772054815,DE
772054816,772054847,ES
772054848,772057727,DE
772057728,772057735,IT
-772057736,772145151,DE
+772057736,772076095,DE
+772076096,772076103,IT
+772076104,772145151,DE
772145152,772210687,ES
772210688,772276223,IE
772276224,772341759,RU
@@ -1966,7 +2284,9 @@
772837376,772839423,KZ
772839424,772841471,CH
772841472,772843519,GB
-772843520,772845567,IT
+772843520,772844287,IT
+772844288,772844543,US
+772844544,772845567,IT
772845568,772847615,RU
772847616,772849663,GB
772849664,772851711,BG
@@ -2043,7 +2363,10 @@
772986880,772988927,GB
772988928,772990975,FR
772990976,772993023,IT
-772993024,772995071,DE
+772993024,772994559,DE
+772994560,772994815,NL
+772994816,772994943,US
+772994944,772995071,DE
772995072,772997119,IR
772997120,772999167,BE
772999168,773001215,SI
@@ -2081,7 +2404,9 @@
773063168,773063424,TR
773063425,773063436,US
773063437,773064447,TR
-773064448,773065215,US
+773064448,773064703,US
+773064704,773064959,TR
+773064960,773065215,US
773065216,773066751,TR
773066752,773070847,AT
773070848,773074943,DE
@@ -2108,11 +2433,15 @@
773140480,773144575,CY
773144576,773148671,RU
773148672,773152767,IR
-773152768,773156863,SE
+773152768,773153791,SE
+773153792,773154815,US
+773154816,773156863,SE
773156864,773165055,FR
773165056,773168127,NL
773168128,773168383,US
-773168384,773168511,NL
+773168384,773168399,NL
+773168400,773168415,US
+773168416,773168511,NL
773168512,773168639,US
773168640,773169023,NL
773169024,773169151,US
@@ -2138,7 +2467,9 @@
773234688,773238783,PL
773238784,773242879,NL
773242880,773246975,FR
-773246976,773251071,EE
+773246976,773247231,RU
+773247232,773247999,EE
+773248000,773251071,US
773251072,773255167,AZ
773255168,773259263,RU
773259264,773263359,SI
@@ -2273,7 +2604,11 @@
773793792,773795839,FR
773795840,773797887,NL
773797888,773799935,ES
-773799936,773801983,CY
+773799936,773800447,GB
+773800448,773800703,CY
+773800704,773800959,GB
+773800960,773801727,CY
+773801728,773801983,GB
773801984,773804031,IQ
773804032,773806079,GB
773806080,773808127,BE
@@ -2512,22 +2847,44 @@
774162071,774162075,EC
774162076,774162080,SH
774162081,774162085,ZM
-774162086,774168575,VA
+774162086,774162090,KH
+774162091,774162095,VN
+774162096,774162100,FM
+774162101,774162105,US
+774162106,774162110,LY
+774162111,774162115,SO
+774162116,774162120,FI
+774162121,774162125,DZ
+774162126,774162130,CD
+774162131,774162135,MR
+774162136,774162140,CM
+774162141,774162145,SV
+774162146,774162150,HN
+774162151,774162155,US
+774162156,774162160,UY
+774162161,774162165,LV
+774162166,774162170,MD
+774162171,774162173,LB
+774162174,774162176,VA
+774162177,774162181,LK
+774162182,774162186,IE
+774162187,774168575,VA
774168576,774176767,PL
774176768,774184959,IT
774184960,774193151,GB
774193152,774209535,ES
774209536,774217727,RU
774217728,774217759,PH
-774217760,774217791,RU
+774217760,774217791,GB
774217792,774217823,US
774217824,774217855,AE
774217856,774217919,US
-774217920,774217927,CN
+774217920,774217927,GB
774217928,774217935,LK
774217936,774217983,CN
-774217984,774218239,GB
-774218240,774218495,US
+774217984,774218047,CA
+774218048,774218111,GB
+774218112,774218495,US
774218496,774218503,SG
774218504,774218519,CN
774218520,774218527,PK
@@ -2563,54 +2920,65 @@
774219288,774219295,CY
774219296,774219327,GB
774219328,774219335,TW
-774219336,774219343,GB
-774219344,774219351,CN
-774219352,774219359,GB
+774219336,774219343,EG
+774219344,774219359,CN
774219360,774219367,PT
-774219368,774219391,GB
+774219368,774219375,IN
+774219376,774219383,GB
+774219384,774219391,IN
774219392,774219399,US
-774219400,774219407,GB
-774219408,774219415,CN
-774219416,774219423,GB
+774219400,774219407,IN
+774219408,774219423,CN
774219424,774219431,IN
-774219432,774219439,GB
+774219432,774219439,HU
774219440,774219447,CN
-774219448,774219455,GB
-774219456,774219463,CN
-774219464,774219471,GB
-774219472,774219479,CN
-774219480,774219487,GB
+774219448,774219455,ES
+774219456,774219479,CN
+774219480,774219487,HU
774219488,774219495,CN
-774219496,774219503,GB
+774219496,774219503,EG
774219504,774219511,CN
-774219512,774219519,GB
-774219520,774219543,CN
-774219544,774219679,GB
+774219512,774219519,SG
+774219520,774219551,CN
+774219552,774219559,PS
+774219560,774219575,CN
+774219576,774219583,GR
+774219584,774219591,TR
+774219592,774219599,US
+774219600,774219607,CN
+774219608,774219679,GB
774219680,774219687,GR
-774219688,774219695,UA
+774219688,774219695,GB
774219696,774219711,US
774219712,774219727,GB
774219728,774219743,RU
-774219744,774219759,GB
+774219744,774219751,GB
+774219752,774219759,CN
774219760,774219775,RU
774219776,774219839,CN
-774219840,774219903,GB
+774219840,774219847,UA
+774219848,774219855,CN
+774219856,774219871,GB
+774219872,774219887,CN
+774219888,774219895,RU
+774219896,774219903,LK
774219904,774219967,US
-774219968,774220031,GB
+774219968,774220031,CN
774220032,774220287,US
774220288,774220543,CN
-774220544,774220799,US
-774220800,774221055,GB
+774220544,774221055,GB
774221056,774221311,US
-774221312,774221567,GB
+774221312,774221567,CN
774221568,774221823,US
774221824,774222463,GB
774222464,774222495,CN
-774222496,774222847,GB
+774222496,774222511,FI
+774222512,774222527,CN
+774222528,774222847,GB
774222848,774222863,UA
774222864,774222879,TR
774222880,774222911,US
-774222912,774222943,CN
+774222912,774222943,MA
774222944,774222951,GR
774222952,774222967,CN
774222968,774222975,GB
@@ -2630,7 +2998,7 @@
774223280,774223287,GB
774223288,774223295,CN
774223296,774223303,TR
-774223304,774223311,GB
+774223304,774223311,CN
774223312,774223319,IN
774223320,774223327,ID
774223328,774223335,PK
@@ -2674,8 +3042,7 @@
774224512,774224767,GB
774224768,774224831,CN
774224832,774224847,UA
-774224848,774224863,RU
-774224864,774224967,GB
+774224848,774224967,GB
774224968,774224975,UA
774224976,774224983,TR
774224984,774224991,CN
@@ -2689,14 +3056,15 @@
774225344,774225351,CN
774225352,774225359,LT
774225360,774225375,UA
-774225376,774225391,RU
+774225376,774225391,GB
774225392,774225415,UA
774225416,774225423,CN
774225424,774225431,TR
-774225432,774225511,GB
+774225432,774225439,DE
+774225440,774225447,CN
+774225448,774225511,GB
774225512,774225519,TR
-774225520,774225535,GB
-774225536,774225567,CN
+774225520,774225567,GB
774225568,774225599,RU
774225600,774225615,PK
774225616,774225647,TR
@@ -2705,15 +3073,12 @@
774225672,774225679,IT
774225680,774225687,GB
774225688,774225695,CA
-774225696,774225703,RU
-774225704,774225711,GB
-774225712,774225719,PK
-774225720,774225727,GB
+774225696,774225727,GB
774225728,774225743,LT
774225744,774225775,GB
774225776,774225791,US
774225792,774225807,UA
-774225808,774225823,RU
+774225808,774225823,GB
774225824,774225855,US
774225856,774225919,IN
774225920,774234111,UA
@@ -2845,7 +3210,39 @@
778500096,778502143,RO
778502144,778567679,GR
778567680,778633215,TR
-778633216,778698751,FR
+778633216,778638975,FR
+778638976,778639103,CZ
+778639104,778639231,LT
+778639232,778639359,FI
+778639360,778639615,ES
+778639616,778639871,PL
+778639872,778640127,DE
+778640128,778640383,GB
+778640384,778640639,IT
+778640640,778640895,PT
+778640896,778641151,NL
+778641152,778641407,IE
+778641408,778665983,FR
+778665984,778666015,BE
+778666016,778666031,FR
+778666032,778666047,PL
+778666048,778666063,FR
+778666064,778666095,PL
+778666096,778666099,DE
+778666100,778666103,ES
+778666104,778666107,GB
+778666108,778666111,IE
+778666112,778666119,FR
+778666120,778666123,GB
+778666124,778666127,FR
+778666128,778666143,PL
+778666144,778666151,FR
+778666152,778666155,GB
+778666156,778666159,ES
+778666160,778666175,PL
+778666176,778666207,FR
+778666208,778666239,PL
+778666240,778698751,FR
778698752,778764287,TR
778764288,778829823,HU
778829824,778895359,RO
@@ -3070,7 +3467,11 @@
782254080,782270463,UA
782270464,782305791,RU
782305792,782306303,RO
-782306304,782319615,RU
+782306304,782310399,RU
+782310400,782310527,RO
+782310528,782310655,RU
+782310656,782310911,RO
+782310912,782319615,RU
782319616,782335999,ME
782336000,782352383,RU
782352384,782368767,SY
@@ -3092,12 +3493,14 @@
782647296,782663679,RU
782663680,782664191,GB
782664192,782664447,DK
-782664448,782664704,FR
+782664448,782664703,LU
+782664704,782664704,GB
782664705,782665471,NL
782665472,782680063,LU
782680064,782696447,RU
782696448,782712831,DE
782712832,782729215,RU
+782729216,782745599,DE
782745600,782761983,CZ
782761984,783024127,PL
783024128,783040511,RU
@@ -3225,7 +3628,8 @@
783800320,783802367,LV
783802368,783804415,FR
783804416,783806463,IT
-783806464,783810559,NL
+783806464,783810303,NL
+783810304,783810559,BE
783810560,783843327,SA
783843328,783876095,BH
783876096,783908863,UA
@@ -3245,8 +3649,8 @@
784334848,784465919,FR
784465920,784596991,SE
784596992,784728063,TR
-784728064,784760831,GR
-784760832,784859135,CY
+784728064,784763903,GR
+784763904,784859135,CY
784859136,785121279,UA
785121280,785252351,PL
785252352,785383423,AT
@@ -3343,7 +3747,9 @@
786747392,786751487,SK
786751488,786755583,PL
786755584,786759679,IT
-786759680,786771967,DE
+786759680,786771711,DE
+786771712,786771775,AT
+786771776,786771967,DE
786771968,786776063,UA
786776064,786780159,RU
786780160,786784255,IT
@@ -3410,6 +3816,7 @@
787021824,787038207,BG
787038208,787054591,GB
787054592,787070975,IT
+787070976,787087359,RU
787087360,787095551,TR
787095552,787103743,EU
787103744,787111935,HR
@@ -3539,9 +3946,9 @@
788234240,788242431,SA
788242432,788250623,IR
788250624,788258815,KG
-788258816,788259839,DE
-788259840,788260351,NL
-788260352,788267007,DE
+788258816,788259583,DE
+788259584,788260863,NL
+788260864,788267007,DE
788267008,788271103,SE
788271104,788275199,DE
788275200,788279295,AL
@@ -3623,7 +4030,8 @@
788502528,788504575,IE
788504576,788506623,FR
788506624,788508671,CH
-788508672,788510719,AT
+788508672,788509183,FR
+788509184,788510719,AT
788510720,788512767,ES
788512768,788514815,FI
788514816,788516863,FR
@@ -3635,7 +4043,6 @@
788527104,788529151,GB
788529152,805306367,CA
805306368,822083583,US
-822083840,822084095,AU
822084608,822085631,ID
822085632,822087679,AU
822087680,822089727,JP
@@ -3652,6 +4059,7 @@
823132160,824180735,KR
824180736,825229311,IN
825229312,825360383,TH
+825360384,825361407,KR
825361408,825363455,ID
825363456,825364479,MY
825364480,825376767,KR
@@ -3661,7 +4069,6 @@
825419776,825420799,TH
825420800,825421823,MY
825421824,825425919,NZ
-825425920,825491455,AU
825491456,825753599,CN
825753600,826277887,KR
826277888,828375039,CN
@@ -3669,7 +4076,7 @@
829423616,830210047,CN
830210048,830341119,MY
830341120,830406655,NP
-830406656,830474239,AU
+830472192,830474239,AU
830474240,830475263,SG
830475264,830476287,AU
830476288,830480383,JP
@@ -3752,30 +4159,48 @@
838336512,838467583,IN
838467584,838729727,JP
838729728,838795263,KR
+838795264,838860799,AU
838860800,838999039,US
838999040,838999295,CA
-838999296,839010559,US
+838999296,839010175,US
+839010176,839010207,CA
+839010208,839010559,US
839010560,839010815,CA
839010816,839017983,US
839017984,839018239,CA
839018240,839023359,US
839023360,839023615,CA
-839023616,839061503,US
+839023616,839025663,US
+839025664,839026175,CA
+839026176,839061503,US
839061504,839061759,CA
839061760,839062271,US
839062272,839064063,CA
-839064064,839113215,US
+839064064,839069183,US
+839069184,839074303,CA
+839074304,839095807,US
+839095808,839096063,CA
+839096064,839101695,US
+839101696,839102207,CA
+839102208,839103999,US
+839104000,839104255,CA
+839104256,839110143,US
+839110144,839110399,CA
+839110400,839112447,US
+839112448,839112703,CA
+839112704,839113215,US
839113216,839113471,CA
839113472,840269823,US
840269824,840273919,CA
840273920,840278015,US
840278016,840282111,CA
840282112,840294399,US
-840302592,843055103,US
+840294400,840298495,CA
+840298496,843055103,US
843055104,843644927,CA
843644928,844890111,US
844890112,844988415,CA
-844988416,845021183,US
+844988416,845217791,US
847249408,855638015,US
855638016,872415231,GB
872415232,889192447,US
@@ -4461,9 +4886,7 @@
1041704480,1041704487,GB
1041704488,1041704551,FR
1041704552,1041704575,GB
-1041704576,1041704671,FR
-1041704672,1041704687,GB
-1041704688,1041704751,FR
+1041704576,1041704751,FR
1041704752,1041704759,GB
1041704760,1041704775,FR
1041704776,1041704783,GB
@@ -4473,8 +4896,8 @@
1041704848,1041704863,GB
1041704864,1041704879,FR
1041704880,1041704887,GB
-1041704888,1041704943,FR
-1041704944,1041704959,GB
+1041704888,1041704927,FR
+1041704928,1041704959,GB
1041704960,1041705231,FR
1041705232,1041705239,GB
1041705240,1041705255,FR
@@ -4606,8 +5029,8 @@
1041710016,1041710047,FR
1041710048,1041710055,GB
1041710056,1041710343,FR
-1041710344,1041710359,GB
-1041710360,1041710391,FR
+1041710344,1041710367,GB
+1041710368,1041710391,FR
1041710392,1041710407,GB
1041710408,1041710431,FR
1041710432,1041710455,GB
@@ -4637,7 +5060,9 @@
1041711944,1041711951,GB
1041711952,1041712415,FR
1041712416,1041712431,GB
-1041712432,1041713095,FR
+1041712432,1041712975,FR
+1041712976,1041712983,GB
+1041712984,1041713095,FR
1041713096,1041713103,GB
1041713104,1041713127,FR
1041713128,1041713135,GB
@@ -4655,10 +5080,10 @@
1041714096,1041714103,GB
1041714104,1041714111,FR
1041714112,1041714175,GB
-1041714176,1041714487,FR
-1041714488,1041714495,GB
-1041714496,1041714631,FR
-1041714632,1041714687,GB
+1041714176,1041714631,FR
+1041714632,1041714639,GB
+1041714640,1041714655,FR
+1041714656,1041714687,GB
1041714688,1041714775,FR
1041714776,1041714783,GB
1041714784,1041714815,FR
@@ -4669,8 +5094,8 @@
1041714912,1041714919,GB
1041714920,1041714999,FR
1041715000,1041715015,GB
-1041715016,1041715055,FR
-1041715056,1041715071,GB
+1041715016,1041715063,FR
+1041715064,1041715071,GB
1041715072,1041715079,FR
1041715080,1041715087,GB
1041715088,1041715095,FR
@@ -4729,7 +5154,9 @@
1041717200,1041717247,GB
1041717248,1041717503,FR
1041717504,1041717511,IT
-1041717512,1041717687,FR
+1041717512,1041717631,FR
+1041717632,1041717639,GB
+1041717640,1041717687,FR
1041717688,1041717695,GB
1041717696,1041718112,FR
1041718113,1041718119,GB
@@ -4787,8 +5214,8 @@
1041719920,1041719935,GB
1041719936,1041720015,FR
1041720016,1041720031,GB
-1041720032,1041720335,FR
-1041720336,1041720351,GB
+1041720032,1041720343,FR
+1041720344,1041720351,GB
1041720352,1041720551,FR
1041720552,1041720559,GB
1041720560,1041720567,FR
@@ -4847,7 +5274,9 @@
1041723888,1041723903,GB
1041723904,1041724455,FR
1041724456,1041724463,GB
-1041724464,1041724535,FR
+1041724464,1041724511,FR
+1041724512,1041724519,GB
+1041724520,1041724535,FR
1041724536,1041724543,GB
1041724544,1041724671,FR
1041724672,1041724927,GB
@@ -4857,7 +5286,9 @@
1041725120,1041725167,GB
1041725168,1041725175,FR
1041725176,1041725183,GB
-1041725184,1041725207,FR
+1041725184,1041725191,FR
+1041725192,1041725199,GB
+1041725200,1041725207,FR
1041725208,1041725231,GB
1041725232,1041725255,FR
1041725256,1041725279,GB
@@ -4945,8 +5376,8 @@
1041730240,1041730247,GB
1041730248,1041730639,FR
1041730640,1041730655,GB
-1041730656,1041731983,FR
-1041731984,1041732031,GB
+1041730656,1041731975,FR
+1041731976,1041732031,GB
1041732032,1041732055,FR
1041732056,1041732063,GB
1041732064,1041732103,FR
@@ -4981,7 +5412,9 @@
1041735000,1041735039,GB
1041735040,1041735055,FR
1041735056,1041735087,GB
-1041735088,1041735119,FR
+1041735088,1041735095,FR
+1041735096,1041735103,GB
+1041735104,1041735119,FR
1041735120,1041735167,GB
1041735168,1041735431,FR
1041735432,1041735495,GB
@@ -4991,7 +5424,9 @@
1041735568,1041735583,GB
1041735584,1041735615,FR
1041735616,1041735663,GB
-1041735664,1041736375,FR
+1041735664,1041736247,FR
+1041736248,1041736255,GB
+1041736256,1041736375,FR
1041736376,1041736383,GB
1041736384,1041736423,FR
1041736424,1041736463,GB
@@ -5063,16 +5498,16 @@
1041738584,1041738591,GB
1041738592,1041738599,FR
1041738600,1041738615,GB
-1041738616,1041738703,FR
+1041738616,1041738663,FR
+1041738664,1041738671,GB
+1041738672,1041738703,FR
1041738704,1041738711,GB
1041738712,1041738735,FR
1041738736,1041738751,GB
1041738752,1041739079,FR
1041739080,1041739087,GB
1041739088,1041739167,FR
-1041739168,1041739175,GB
-1041739176,1041739183,FR
-1041739184,1041739207,GB
+1041739168,1041739207,GB
1041739208,1041739215,FR
1041739216,1041739231,GB
1041739232,1041739295,FR
@@ -5258,8 +5693,8 @@
1041749776,1041749783,GB
1041749784,1041749807,FR
1041749808,1041749815,GB
-1041749816,1041749847,FR
-1041749848,1041749855,GB
+1041749816,1041749839,FR
+1041749840,1041749855,GB
1041749856,1041749967,FR
1041749968,1041749983,GB
1041749984,1041749999,FR
@@ -5272,7 +5707,9 @@
1041750744,1041750751,GB
1041750752,1041750775,FR
1041750776,1041750783,GB
-1041750784,1041751567,FR
+1041750784,1041751351,FR
+1041751352,1041751359,GB
+1041751360,1041751567,FR
1041751568,1041751575,GB
1041751576,1041751695,FR
1041751696,1041751719,GB
@@ -5518,7 +5955,11 @@
1042894144,1042894175,SE
1042894176,1042894335,NL
1042894336,1042894355,FR
-1042894356,1042894431,NL
+1042894356,1042894359,NL
+1042894360,1042894367,GB
+1042894368,1042894399,NL
+1042894400,1042894415,GB
+1042894416,1042894431,NL
1042894432,1042894463,PT
1042894464,1042894559,NL
1042894560,1042894591,DE
@@ -5575,24 +6016,28 @@
1043466320,1043466327,GB
1043466328,1043466335,NL
1043466336,1043466351,GB
-1043466352,1043466431,NL
+1043466352,1043466391,NL
+1043466392,1043466399,GB
+1043466400,1043466431,NL
1043466432,1043466447,GB
1043466448,1043466455,NL
1043466456,1043466463,GB
1043466464,1043466495,NL
1043466496,1043466503,GB
1043466504,1043466511,NL
-1043466512,1043466519,GB
-1043466520,1043466559,NL
+1043466512,1043466527,GB
+1043466528,1043466559,NL
1043466560,1043466575,GB
1043466576,1043466583,NL
1043466584,1043466607,GB
-1043466608,1043466887,NL
+1043466608,1043466623,NL
+1043466624,1043466639,GB
+1043466640,1043466671,NL
+1043466672,1043466687,GB
+1043466688,1043466887,NL
1043466888,1043466895,GB
1043466896,1043466911,NL
-1043466912,1043466927,GB
-1043466928,1043466943,NL
-1043466944,1043467039,GB
+1043466912,1043467039,GB
1043467040,1043467071,NL
1043467072,1043467087,GB
1043467088,1043467103,NL
@@ -6363,8 +6808,8 @@
1044932832,1044932839,GB
1044932840,1044932847,BE
1044932848,1044932863,GB
-1044932864,1044932939,BE
-1044932940,1044932947,GB
+1044932864,1044932935,BE
+1044932936,1044932947,GB
1044932948,1044932951,BE
1044932952,1044932959,GB
1044932960,1044933007,BE
@@ -6554,8 +6999,7 @@
1045018560,1045018623,GB
1045018624,1045018751,ES
1045018752,1045020159,GB
-1045020160,1045020655,ES
-1045020656,1045020671,GB
+1045020160,1045020671,ES
1045020672,1045037055,NO
1045037056,1045119231,GR
1045119232,1045119743,AL
@@ -6567,7 +7011,7 @@
1045154592,1045154623,DE
1045154624,1045154655,GB
1045154656,1045154687,DE
-1045154688,1045154719,NL
+1045154688,1045154719,US
1045154720,1045154751,DE
1045154752,1045154783,SE
1045154784,1045155071,DE
@@ -6576,9 +7020,7 @@
1045160960,1045160991,TR
1045160992,1045161023,DE
1045161024,1045161055,AT
-1045161056,1045161151,DE
-1045161152,1045161183,PT
-1045161184,1045168127,DE
+1045161056,1045168127,DE
1045168128,1045233663,RU
1045233664,1045241855,GB
1045241856,1045250047,IT
@@ -6601,27 +7043,11 @@
1045446656,1045446911,HU
1045446912,1045447167,SK
1045447168,1045447231,HU
-1045447232,1045447239,SK
-1045447240,1045447263,HU
-1045447264,1045447295,SK
+1045447232,1045447295,SK
1045447296,1045447311,HU
-1045447312,1045447423,SK
-1045447424,1045447431,HU
-1045447432,1045447439,SK
-1045447440,1045447447,HU
-1045447448,1045447471,SK
-1045447472,1045447487,HU
-1045447488,1045447519,SK
+1045447312,1045447519,SK
1045447520,1045447551,HU
-1045447552,1045448031,SK
-1045448032,1045448039,HU
-1045448040,1045448055,SK
-1045448056,1045448063,HU
-1045448064,1045448159,SK
-1045448160,1045448191,HU
-1045448192,1045448239,SK
-1045448240,1045448247,HU
-1045448248,1045448255,SK
+1045447552,1045448255,SK
1045448256,1045448263,HU
1045448264,1045448703,SK
1045448704,1045448767,HU
@@ -7133,8 +7559,8 @@
1046535488,1046535551,DE
1046535552,1046535619,GB
1046535620,1046535623,DE
-1046535624,1046535631,GB
-1046535632,1046535935,DE
+1046535624,1046535679,GB
+1046535680,1046535935,DE
1046535936,1046536023,GB
1046536024,1046536039,DE
1046536040,1046536063,GB
@@ -7155,9 +7581,7 @@
1046536320,1046536351,DE
1046536352,1046536355,GB
1046536356,1046536359,DE
-1046536360,1046536423,GB
-1046536424,1046536431,DE
-1046536432,1046536607,GB
+1046536360,1046536607,GB
1046536608,1046536667,DE
1046536668,1046536703,GB
1046536704,1046537023,DE
@@ -7184,8 +7608,8 @@
1046541696,1046541727,GB
1046541728,1046541759,DE
1046541760,1046541767,GB
-1046541768,1046541783,DE
-1046541784,1046541807,GB
+1046541768,1046541775,DE
+1046541776,1046541807,GB
1046541808,1046543103,DE
1046543104,1046543263,GB
1046543264,1046543295,DE
@@ -7209,7 +7633,9 @@
1046757376,1046765567,IT
1046765568,1046773759,ES
1046773760,1046781951,FR
-1046781952,1046798335,GB
+1046781952,1046790143,GB
+1046790144,1046791167,US
+1046791168,1046798335,GB
1046798336,1046806527,HU
1046806528,1046814719,IT
1046814720,1046822911,SE
@@ -7302,6 +7728,12 @@
1046898688,1046898943,BE
1046898944,1046899167,EU
1046899168,1046904831,BE
+1046904832,1046908927,SK
+1046908928,1046910975,SE
+1046910976,1046913023,IT
+1046913024,1046921215,NO
+1046921216,1046929407,DE
+1046929408,1046937599,FR
1046937600,1047003135,GR
1047003136,1047068671,DE
1047068672,1047085055,RU
@@ -7317,7 +7749,9 @@
1047265280,1047273471,NL
1047273472,1047281663,DE
1047281664,1047289855,TR
-1047289856,1047298047,RS
+1047289856,1047295351,RS
+1047295352,1047295359,HU
+1047295360,1047298047,RS
1047298048,1047300095,CH
1047300096,1047300415,GB
1047300416,1047300479,CH
@@ -7418,9 +7852,7 @@
1047566872,1047566879,CH
1047566880,1047566891,DE
1047566892,1047566903,CH
-1047566904,1047566911,DE
-1047566912,1047566915,CH
-1047566916,1047566947,DE
+1047566904,1047566947,DE
1047566948,1047566951,AT
1047566952,1047566963,DE
1047566964,1047566967,AT
@@ -7445,7 +7877,9 @@
1047567160,1047567163,DE
1047567164,1047567167,AT
1047567168,1047567175,CH
-1047567176,1047567211,DE
+1047567176,1047567183,DE
+1047567184,1047567191,CH
+1047567192,1047567211,DE
1047567212,1047567227,CH
1047567228,1047567239,DE
1047567240,1047567243,CH
@@ -7454,11 +7888,11 @@
1047567256,1047567279,DE
1047567280,1047567287,CH
1047567288,1047567307,DE
-1047567308,1047567315,CH
+1047567308,1047567311,CH
+1047567312,1047567315,DE
1047567316,1047567319,AT
-1047567320,1047567359,DE
-1047567360,1047567375,ES
-1047567376,1047567447,DE
+1047567320,1047567327,CH
+1047567328,1047567447,DE
1047567448,1047567451,CH
1047567452,1047567455,AT
1047567456,1047567459,CH
@@ -7607,9 +8041,7 @@
1048604688,1048604743,UA
1048604744,1048604759,EE
1048604760,1048604927,UA
-1048604928,1048604965,LT
-1048604966,1048604967,UA
-1048604968,1048605079,LT
+1048604928,1048605079,LT
1048605080,1048607231,UA
1048607232,1048607247,EE
1048607248,1048607487,UA
@@ -8615,9 +9047,7 @@
1050505248,1050505279,CA
1050505280,1050507503,DE
1050507504,1050507519,A2
-1050507520,1050515647,DE
-1050515648,1050515663,DK
-1050515664,1050522407,DE
+1050507520,1050522407,DE
1050522408,1050522415,CH
1050522416,1050619503,DE
1050619504,1050619511,CH
@@ -8773,39 +9203,21 @@
1051566080,1051574271,IT
1051574272,1051574623,GB
1051574624,1051574655,GM
-1051574656,1051575999,GB
-1051576000,1051576015,IT
-1051576016,1051577503,GB
-1051577504,1051577519,NL
-1051577520,1051577535,GB
+1051574656,1051577535,GB
1051577536,1051577567,NL
-1051577568,1051577575,BE
-1051577576,1051577583,GB
-1051577584,1051577587,FI
-1051577588,1051577591,GB
-1051577592,1051577599,NL
-1051577600,1051577855,GB
+1051577568,1051577855,GB
1051577856,1051578111,NL
1051578112,1051578143,GB
1051578144,1051578175,NL
-1051578176,1051578239,GB
-1051578240,1051578263,FR
-1051578264,1051578271,GB
-1051578272,1051578279,ES
-1051578280,1051578287,GR
-1051578288,1051578295,GB
-1051578296,1051578303,PL
+1051578176,1051578247,GB
+1051578248,1051578255,FR
+1051578256,1051578303,GB
1051578304,1051578335,NL
-1051578336,1051578343,DE
-1051578344,1051578351,NL
-1051578352,1051578363,GB
-1051578364,1051578367,DE
-1051578368,1051580415,SZ
-1051580416,1051584767,GB
-1051584768,1051585535,MG
-1051585536,1051585599,GB
-1051585600,1051585663,MG
-1051585664,1051590655,GB
+1051578336,1051580535,GB
+1051580536,1051580543,SZ
+1051580544,1051584207,GB
+1051584208,1051584223,BE
+1051584224,1051590655,GB
1051590656,1051702527,ES
1051702528,1051702783,US
1051702784,1051721727,ES
@@ -8823,8 +9235,10 @@
1051852800,1051918335,AT
1051918336,1051919359,PL
1051919360,1051920383,AT
-1051920384,1051922431,PL
-1051922432,1051949823,AT
+1051920384,1051920895,PL
+1051920896,1051934719,AT
+1051934720,1051938815,DE
+1051938816,1051949823,AT
1051949824,1051949951,NL
1051949952,1051983871,AT
1051983872,1051986687,EU
@@ -9115,7 +9529,9 @@
1052065792,1052082175,SE
1052082176,1052090367,DE
1052090368,1052098559,PL
-1052098560,1052116991,SE
+1052098560,1052099471,SE
+1052099472,1052099479,NO
+1052099480,1052116991,SE
1052116992,1052119039,RU
1052119040,1052121087,RO
1052121088,1052129279,RU
@@ -10080,8 +10496,8 @@
1053312928,1053312959,DK
1053312960,1053313023,EU
1053313024,1053313343,GB
-1053313344,1053313439,EU
-1053313440,1053313599,GB
+1053313344,1053313407,EU
+1053313408,1053313599,GB
1053313600,1053313663,EU
1053313664,1053313671,GB
1053313672,1053313679,EU
@@ -10124,8 +10540,8 @@
1053327360,1053327871,EU
1053327872,1053328383,ZA
1053328384,1053328639,EU
-1053328640,1053328799,ZA
-1053328800,1053328895,EU
+1053328640,1053328863,ZA
+1053328864,1053328895,EU
1053328896,1053329087,ZA
1053329088,1053329119,EU
1053329120,1053329135,ZA
@@ -10134,8 +10550,8 @@
1053329152,1053329183,EU
1053329184,1053329279,ZA
1053329280,1053329407,EU
-1053329408,1053329439,ES
-1053329440,1053329503,EU
+1053329408,1053329471,ES
+1053329472,1053329503,EU
1053329504,1053329527,ES
1053329528,1053329631,EU
1053329632,1053329663,ES
@@ -10289,7 +10705,9 @@
1053824024,1053824127,EU
1053824128,1053824255,NL
1053824256,1053825023,EU
-1053825024,1053826047,ES
+1053825024,1053825791,ES
+1053825792,1053825919,GB
+1053825920,1053826047,ES
1053826048,1053826815,EU
1053826816,1053827327,DE
1053827328,1053827583,BE
@@ -10974,7 +11392,7 @@
1066332160,1066336255,CA
1066336256,1066344447,US
1066352640,1066369023,JM
-1066401792,1066584063,US
+1066369024,1066584063,US
1066584064,1066586111,PE
1066586112,1066604927,US
1066604928,1066604959,CA
@@ -11475,9 +11893,7 @@
1074675312,1074675327,NO
1074675328,1074675679,US
1074675680,1074675687,GB
-1074675688,1074677759,US
-1074677760,1074678271,BG
-1074678272,1074680623,US
+1074675688,1074680623,US
1074680624,1074680639,CA
1074680640,1074680703,US
1074680704,1074680719,IL
@@ -11702,8 +12118,8 @@
1075972352,1075973887,US
1075973888,1075974143,CA
1075974144,1075975167,US
-1075975168,1075975999,CA
-1075976000,1075976063,US
+1075975168,1075976031,CA
+1075976032,1075976063,US
1075976064,1075976511,CA
1075976512,1075976543,US
1075976544,1075976647,CA
@@ -11730,7 +12146,7 @@
1075982592,1075982599,US
1075982600,1075982607,NZ
1075982608,1075982655,CA
-1075982656,1075982671,US
+1075982656,1075982671,MX
1075982672,1075982687,CA
1075982688,1075982703,US
1075982704,1075982751,CA
@@ -11745,27 +12161,14 @@
1075983232,1075984383,CA
1075984384,1075984823,US
1075984824,1075984831,CA
-1075984832,1075985415,US
-1075985416,1075985423,CR
-1075985424,1075985919,US
-1075985920,1075986431,CA
-1075986432,1075986687,US
-1075986688,1075986943,CA
-1075986944,1075987199,US
-1075987200,1075987455,CA
-1075987456,1075987711,US
-1075987712,1075987951,CA
-1075987952,1075987967,US
-1075987968,1075988287,CA
-1075988288,1075988319,US
-1075988320,1075988479,CA
-1075988480,1075988735,US
-1075988736,1075988991,CA
-1075988992,1075989119,US
-1075989120,1075989239,CA
-1075989240,1075989247,US
+1075984832,1075985919,US
+1075985920,1075989055,CA
+1075989056,1075989119,US
+1075989120,1075989247,CA
1075989248,1075989311,FI
-1075989312,1075989359,CA
+1075989312,1075989327,CA
+1075989328,1075989335,US
+1075989336,1075989359,CA
1075989360,1075989375,US
1075989376,1075989455,CA
1075989456,1075989471,US
@@ -11780,11 +12183,16 @@
1075992320,1075992447,GB
1075992448,1075993087,US
1075993088,1075993103,CA
-1075993104,1075995007,US
+1075993104,1075994607,US
+1075994608,1075994623,BE
+1075994624,1075995007,CA
1075995008,1075995023,VG
-1075995024,1075995047,US
-1075995048,1075995055,CA
-1075995056,1075995103,US
+1075995024,1075995039,US
+1075995040,1075995055,CA
+1075995056,1075995071,US
+1075995072,1075995079,MX
+1075995080,1075995087,CA
+1075995088,1075995103,US
1075995104,1075995263,CA
1075995264,1075995295,US
1075995296,1075995326,CA
@@ -11872,9 +12280,7 @@
1076007168,1076007183,US
1076007184,1076007247,CA
1076007248,1076007263,US
-1076007264,1076007679,CA
-1076007680,1076007935,US
-1076007936,1076007947,CA
+1076007264,1076007947,CA
1076007948,1076007951,US
1076007952,1076007967,CA
1076007968,1076007983,US
@@ -11888,9 +12294,7 @@
1076009696,1076009711,US
1076009712,1076009887,CA
1076009888,1076009919,US
-1076009920,1076010687,CA
-1076010688,1076010695,US
-1076010696,1076011007,CA
+1076009920,1076011007,CA
1076011008,1076012236,US
1076012237,1076012237,IN
1076012238,1076013094,US
@@ -11916,9 +12320,7 @@
1076027776,1076027791,US
1076027792,1076027911,CA
1076027912,1076027919,US
-1076027920,1076027927,CA
-1076027928,1076027935,US
-1076027936,1076028143,CA
+1076027920,1076028143,CA
1076028144,1076028151,US
1076028152,1076028479,CA
1076028480,1076028543,GB
@@ -11930,7 +12332,9 @@
1076029224,1076029231,DM
1076029232,1076029239,CA
1076029240,1076029247,US
-1076029248,1076029415,CA
+1076029248,1076029311,CA
+1076029312,1076029319,GB
+1076029320,1076029415,CA
1076029416,1076029422,US
1076029423,1076029430,CA
1076029431,1076029439,US
@@ -12942,10 +13346,8 @@
1077859952,1077859967,US
1077859968,1077860095,IT
1077860096,1077861119,US
-1077861120,1077861631,IT
-1077861632,1077862911,US
-1077862912,1077863167,IT
-1077863168,1077863207,US
+1077861120,1077861375,IT
+1077861376,1077863207,US
1077863208,1077863215,NG
1077863216,1077864703,US
1077864704,1077864719,IT
@@ -13055,7 +13457,292 @@
1077936623,1077936630,US
1077936631,1077936634,PE
1077936635,1077936638,CA
-1077936639,1077938702,US
+1077936639,1077936645,US
+1077936646,1077936649,HK
+1077936650,1077936695,US
+1077936696,1077936699,OM
+1077936700,1077936759,US
+1077936760,1077936763,GB
+1077936764,1077936771,US
+1077936772,1077936775,IT
+1077936776,1077936818,US
+1077936819,1077936822,RS
+1077936823,1077936834,US
+1077936835,1077936838,VE
+1077936839,1077936846,US
+1077936847,1077936850,PK
+1077936851,1077936854,US
+1077936855,1077936859,IN
+1077936860,1077936891,US
+1077936892,1077936892,OM
+1077936893,1077936913,US
+1077936914,1077936917,ES
+1077936918,1077936921,ID
+1077936922,1077936945,US
+1077936946,1077936949,GB
+1077936950,1077936957,US
+1077936958,1077936961,MA
+1077936962,1077936965,TR
+1077936966,1077936969,SE
+1077936970,1077936981,US
+1077936982,1077936985,AR
+1077936986,1077936989,ES
+1077936990,1077937005,US
+1077937006,1077937007,CA
+1077937008,1077937015,US
+1077937016,1077937019,CA
+1077937020,1077937023,GB
+1077937024,1077937027,DE
+1077937028,1077937047,US
+1077937048,1077937051,BZ
+1077937052,1077937067,US
+1077937068,1077937071,GB
+1077937072,1077937079,US
+1077937080,1077937083,SE
+1077937084,1077937087,US
+1077937088,1077937088,BE
+1077937089,1077937089,CA
+1077937090,1077937093,IT
+1077937094,1077937105,US
+1077937106,1077937109,CA
+1077937110,1077937129,US
+1077937130,1077937133,CA
+1077937134,1077937137,NG
+1077937138,1077937145,US
+1077937146,1077937149,CA
+1077937150,1077937157,US
+1077937158,1077937161,TR
+1077937162,1077937165,NI
+1077937166,1077937180,US
+1077937181,1077937184,SA
+1077937185,1077937196,US
+1077937197,1077937200,LK
+1077937201,1077937204,GB
+1077937205,1077937208,AT
+1077937209,1077937212,US
+1077937213,1077937214,CA
+1077937215,1077937222,US
+1077937223,1077937226,CA
+1077937227,1077937230,JM
+1077937231,1077937235,US
+1077937236,1077937239,JO
+1077937240,1077937260,US
+1077937261,1077937269,EE
+1077937270,1077937273,LV
+1077937274,1077937289,US
+1077937290,1077937293,GF
+1077937294,1077937297,US
+1077937298,1077937301,GB
+1077937302,1077937305,US
+1077937306,1077937309,ES
+1077937310,1077937335,US
+1077937336,1077937349,GB
+1077937350,1077937353,CA
+1077937354,1077937357,US
+1077937358,1077937361,CA
+1077937362,1077937365,US
+1077937366,1077937369,AR
+1077937370,1077937394,CA
+1077937395,1077937398,CN
+1077937399,1077937402,MX
+1077937403,1077937417,US
+1077937418,1077937421,IN
+1077937422,1077937429,US
+1077937430,1077937433,TH
+1077937434,1077937437,GB
+1077937438,1077937441,CA
+1077937442,1077937445,US
+1077937446,1077937447,ES
+1077937448,1077937449,US
+1077937450,1077937453,GR
+1077937454,1077937457,SA
+1077937458,1077937461,GB
+1077937462,1077937474,US
+1077937475,1077937478,DK
+1077937479,1077937482,MX
+1077937483,1077937484,GB
+1077937485,1077937485,LK
+1077937486,1077937502,US
+1077937503,1077937506,GB
+1077937507,1077937510,CH
+1077937511,1077937514,CR
+1077937515,1077937531,US
+1077937532,1077937535,IN
+1077937536,1077937539,ES
+1077937540,1077937547,AT
+1077937548,1077937571,US
+1077937572,1077937575,CY
+1077937576,1077937577,GB
+1077937578,1077937597,US
+1077937598,1077937601,IN
+1077937602,1077937609,US
+1077937610,1077937613,NZ
+1077937614,1077937617,US
+1077937618,1077937621,IN
+1077937622,1077937625,GB
+1077937626,1077937629,IT
+1077937630,1077937678,US
+1077937679,1077937682,ZA
+1077937683,1077937686,US
+1077937687,1077937690,IN
+1077937691,1077937702,US
+1077937703,1077937706,PK
+1077937707,1077937710,RS
+1077937711,1077937714,AN
+1077937715,1077937718,US
+1077937719,1077937722,IN
+1077937723,1077937726,AU
+1077937727,1077937730,SG
+1077937731,1077937734,US
+1077937735,1077937738,BA
+1077937739,1077937742,IL
+1077937743,1077937750,US
+1077937751,1077937754,AU
+1077937755,1077937758,US
+1077937759,1077937762,NL
+1077937763,1077937766,US
+1077937767,1077937770,RU
+1077937771,1077937782,US
+1077937783,1077937786,GR
+1077937787,1077937790,GB
+1077937791,1077937802,US
+1077937803,1077937806,BE
+1077937807,1077937822,US
+1077937823,1077937826,GB
+1077937827,1077937846,US
+1077937847,1077937850,TH
+1077937851,1077937854,US
+1077937855,1077937866,TH
+1077937867,1077937870,GB
+1077937871,1077937878,US
+1077937879,1077937882,GB
+1077937883,1077937886,US
+1077937887,1077937890,GR
+1077937891,1077937902,US
+1077937903,1077937906,IN
+1077937907,1077937933,US
+1077937934,1077937937,IT
+1077937938,1077937941,US
+1077937942,1077937945,NO
+1077937946,1077937949,MY
+1077937950,1077937953,CL
+1077937954,1077937963,US
+1077937964,1077937967,NO
+1077937968,1077937975,US
+1077937976,1077937979,TH
+1077937980,1077937983,CN
+1077937984,1077938003,US
+1077938004,1077938007,TH
+1077938008,1077938011,US
+1077938012,1077938021,GB
+1077938022,1077938025,US
+1077938026,1077938029,FR
+1077938030,1077938033,US
+1077938034,1077938037,SA
+1077938038,1077938041,AU
+1077938042,1077938045,US
+1077938046,1077938049,RU
+1077938050,1077938053,US
+1077938054,1077938057,AU
+1077938058,1077938073,US
+1077938074,1077938077,CN
+1077938078,1077938081,US
+1077938082,1077938085,IN
+1077938086,1077938089,US
+1077938090,1077938093,CA
+1077938094,1077938121,US
+1077938122,1077938125,DZ
+1077938126,1077938129,IN
+1077938130,1077938133,ID
+1077938134,1077938137,CA
+1077938138,1077938141,GB
+1077938142,1077938145,CA
+1077938146,1077938149,US
+1077938150,1077938153,IN
+1077938154,1077938157,AR
+1077938158,1077938185,US
+1077938186,1077938189,PH
+1077938190,1077938201,US
+1077938202,1077938205,CA
+1077938206,1077938209,AR
+1077938210,1077938221,US
+1077938222,1077938225,IN
+1077938226,1077938233,US
+1077938234,1077938237,AR
+1077938238,1077938258,US
+1077938259,1077938262,PE
+1077938263,1077938266,CA
+1077938267,1077938269,GB
+1077938270,1077938277,US
+1077938278,1077938281,GB
+1077938282,1077938283,DE
+1077938284,1077938284,CH
+1077938285,1077938288,CA
+1077938289,1077938296,GB
+1077938297,1077938301,US
+1077938302,1077938305,GB
+1077938306,1077938309,US
+1077938310,1077938313,TH
+1077938314,1077938321,US
+1077938322,1077938325,GB
+1077938326,1077938329,PK
+1077938330,1077938333,US
+1077938334,1077938337,MX
+1077938338,1077938345,US
+1077938346,1077938349,SA
+1077938350,1077938357,US
+1077938358,1077938361,ID
+1077938362,1077938365,US
+1077938366,1077938372,IN
+1077938373,1077938376,DK
+1077938377,1077938380,IL
+1077938381,1077938384,LT
+1077938385,1077938396,US
+1077938397,1077938400,CA
+1077938401,1077938404,US
+1077938405,1077938408,IT
+1077938409,1077938412,US
+1077938413,1077938416,PT
+1077938417,1077938426,US
+1077938427,1077938430,SE
+1077938431,1077938437,US
+1077938438,1077938441,PE
+1077938442,1077938445,US
+1077938446,1077938446,BE
+1077938447,1077938490,US
+1077938491,1077938494,MT
+1077938495,1077938502,US
+1077938503,1077938506,ES
+1077938507,1077938510,DK
+1077938511,1077938529,US
+1077938530,1077938533,NZ
+1077938534,1077938537,CA
+1077938538,1077938541,ES
+1077938542,1077938545,CY
+1077938546,1077938551,US
+1077938552,1077938552,ES
+1077938553,1077938570,US
+1077938571,1077938571,NL
+1077938572,1077938572,US
+1077938573,1077938576,CO
+1077938577,1077938580,US
+1077938581,1077938584,CA
+1077938585,1077938588,US
+1077938589,1077938592,MX
+1077938593,1077938596,US
+1077938597,1077938600,DO
+1077938601,1077938630,US
+1077938631,1077938644,IN
+1077938645,1077938648,US
+1077938649,1077938652,CA
+1077938653,1077938656,CN
+1077938657,1077938660,RO
+1077938661,1077938664,TR
+1077938665,1077938668,CA
+1077938669,1077938672,US
+1077938673,1077938676,GB
+1077938677,1077938680,IN
+1077938681,1077938702,US
1077938703,1077938706,ID
1077938707,1077938734,GB
1077938735,1077938735,PK
@@ -13064,14 +13751,13 @@
1077938750,1077938750,NL
1077938751,1077938765,US
1077938766,1077938769,CN
-1077938770,1077938773,US
-1077938774,1077938777,GB
+1077938770,1077938777,US
1077938778,1077938781,RO
1077938782,1077938785,US
1077938786,1077938789,GR
1077938790,1077938793,CA
1077938794,1077938797,IE
-1077938798,1077938801,AR
+1077938798,1077938801,SG
1077938802,1077938805,US
1077938806,1077938809,DK
1077938810,1077938813,HK
@@ -13111,8 +13797,7 @@
1077939061,1077939064,IE
1077939065,1077939065,TH
1077939066,1077939069,CA
-1077939070,1077939074,TH
-1077939075,1077939078,US
+1077939070,1077939078,US
1077939079,1077939082,IN
1077939083,1077939086,CA
1077939087,1077939090,ES
@@ -13131,7 +13816,12 @@
1077939211,1077939218,US
1077939219,1077939219,NL
1077939220,1077939223,CA
-1077939224,1077939304,US
+1077939224,1077939240,US
+1077939241,1077939244,NL
+1077939245,1077939251,US
+1077939252,1077939255,BR
+1077939256,1077939259,FR
+1077939260,1077939304,US
1077939305,1077939308,GB
1077939309,1077939321,US
1077939322,1077939329,CA
@@ -13150,11 +13840,179 @@
1077939396,1077939399,SE
1077939400,1077939415,US
1077939416,1077939423,BE
-1077939424,1077960751,US
+1077939424,1077939491,US
+1077939492,1077939495,GB
+1077939496,1077939523,US
+1077939524,1077939533,CA
+1077939534,1077939569,US
+1077939570,1077939574,OM
+1077939575,1077939625,US
+1077939626,1077939630,UY
+1077939631,1077939634,GB
+1077939635,1077939644,US
+1077939645,1077939648,GR
+1077939649,1077939652,IE
+1077939653,1077939725,US
+1077939726,1077939727,DE
+1077939728,1077939790,US
+1077939791,1077939794,PE
+1077939795,1077939823,US
+1077939824,1077939827,BR
+1077939828,1077939837,PT
+1077939838,1077939895,US
+1077939896,1077939899,GB
+1077939900,1077939973,US
+1077939974,1077939977,CL
+1077939978,1077939981,US
+1077939982,1077939985,MU
+1077939986,1077939997,US
+1077939998,1077940001,GB
+1077940002,1077940005,EG
+1077940006,1077940072,US
+1077940073,1077940076,BE
+1077940077,1077940285,US
+1077940286,1077940289,AU
+1077940290,1077940378,US
+1077940379,1077940382,PK
+1077940383,1077942394,US
+1077942395,1077942398,CA
+1077942399,1077942493,US
+1077942494,1077942497,MX
+1077942498,1077942501,VN
+1077942502,1077942505,IN
+1077942506,1077942509,GB
+1077942510,1077942513,AE
+1077942514,1077942572,US
+1077942573,1077942576,CA
+1077942577,1077942600,US
+1077942601,1077942604,PE
+1077942605,1077942620,US
+1077942621,1077942624,BD
+1077942625,1077942746,US
+1077942747,1077942750,GB
+1077942751,1077943045,US
+1077943046,1077943053,FI
+1077943054,1077943109,US
+1077943110,1077943110,CN
+1077943111,1077943187,US
+1077943188,1077943191,CA
+1077943192,1077943313,US
+1077943314,1077943314,BE
+1077943315,1077943378,US
+1077943379,1077943379,CZ
+1077943380,1077943406,US
+1077943407,1077943410,AU
+1077943411,1077943420,US
+1077943421,1077943421,CN
+1077943422,1077943425,US
+1077943426,1077943426,CN
+1077943427,1077943430,MY
+1077943431,1077943503,US
+1077943504,1077943507,CA
+1077943508,1077943523,US
+1077943524,1077943527,AU
+1077943528,1077943531,US
+1077943532,1077943535,AU
+1077943536,1077943539,ID
+1077943540,1077943540,US
+1077943541,1077943544,CA
+1077943545,1077943574,US
+1077943575,1077943575,BE
+1077943576,1077943576,CZ
+1077943577,1077943634,US
+1077943635,1077943638,ZA
+1077943639,1077943674,US
+1077943675,1077943675,CN
+1077943676,1077943789,US
+1077943790,1077943790,AU
+1077943791,1077943794,US
+1077943795,1077943796,SG
+1077943797,1077943825,US
+1077943826,1077943829,HK
+1077943830,1077943845,US
+1077943846,1077943849,AU
+1077943850,1077943853,UA
+1077943854,1077943867,US
+1077943868,1077943868,CN
+1077943869,1077943876,US
+1077943877,1077943880,CA
+1077943881,1077943896,US
+1077943897,1077943897,CN
+1077943898,1077943901,US
+1077943902,1077943905,AU
+1077943906,1077943921,US
+1077943922,1077943925,AU
+1077943926,1077943939,US
+1077943940,1077943940,BE
+1077943941,1077943944,US
+1077943945,1077943948,KH
+1077943949,1077943964,US
+1077943965,1077943968,IN
+1077943969,1077943970,US
+1077943971,1077943972,CN
+1077943973,1077943976,PK
+1077943977,1077943984,AU
+1077943985,1077943992,US
+1077943993,1077943996,CA
+1077943997,1077944000,AR
+1077944001,1077944013,US
+1077944014,1077944017,IN
+1077944018,1077944025,US
+1077944026,1077944028,CN
+1077944029,1077944058,US
+1077944059,1077944062,CA
+1077944063,1077944081,US
+1077944082,1077944085,CA
+1077944086,1077944097,US
+1077944098,1077944101,AU
+1077944102,1077944127,US
+1077944128,1077944128,BE
+1077944129,1077944136,US
+1077944137,1077944137,BE
+1077944138,1077944141,PL
+1077944142,1077944173,US
+1077944174,1077944177,CA
+1077944178,1077944181,US
+1077944182,1077944182,CN
+1077944183,1077944186,US
+1077944187,1077944190,PH
+1077944191,1077944198,US
+1077944199,1077944202,CA
+1077944203,1077944210,CN
+1077944211,1077944218,US
+1077944219,1077944219,BE
+1077944220,1077944223,US
+1077944224,1077944227,CA
+1077944228,1077944231,US
+1077944232,1077944235,JP
+1077944236,1077944243,US
+1077944244,1077944247,AU
+1077944248,1077944255,US
+1077944256,1077944259,TH
+1077944260,1077944263,PY
+1077944264,1077944271,US
+1077944272,1077944275,CA
+1077944276,1077944279,US
+1077944280,1077944283,TH
+1077944284,1077944284,US
+1077944285,1077944286,RO
+1077944287,1077944295,US
+1077944296,1077944299,CZ
+1077944300,1077944308,US
+1077944309,1077944312,CN
+1077944313,1077944316,US
+1077944317,1077944317,CZ
+1077944318,1077960703,US
+1077960704,1077960711,CA
+1077960712,1077960727,US
+1077960728,1077960735,SE
+1077960736,1077960751,US
1077960752,1077960759,CA
1077960760,1077965855,US
1077965856,1077965887,BA
-1077965888,1077968831,US
+1077965888,1077965911,US
+1077965912,1077965919,CA
+1077965920,1077968831,US
1077968832,1077968839,CA
1077968840,1077977087,US
1077977088,1077985279,CA
@@ -13217,7 +14075,9 @@
1078283648,1078283679,US
1078283680,1078283687,CA
1078283688,1078283695,US
-1078283696,1078283751,CA
+1078283696,1078283735,CA
+1078283736,1078283743,US
+1078283744,1078283751,CA
1078283752,1078283775,US
1078283776,1078283999,CA
1078284000,1078284007,US
@@ -13562,9 +14422,7 @@
1078798688,1078798703,AU
1078798704,1078798911,US
1078798912,1078798927,IT
-1078798928,1078799039,US
-1078799040,1078799055,IT
-1078799056,1078799071,US
+1078798928,1078799071,US
1078799072,1078799087,CA
1078799088,1078799263,US
1078799264,1078799295,MX
@@ -13708,7 +14566,9 @@
1079394208,1079394239,CA
1079394240,1079394303,US
1079394304,1079395327,EC
-1079395328,1079396351,CA
+1079395328,1079395839,CA
+1079395840,1079396095,US
+1079396096,1079396351,CA
1079396352,1079397375,MP
1079397376,1079397631,MH
1079397632,1079399583,CA
@@ -13804,7 +14664,9 @@
1079857888,1079857903,NZ
1079857904,1079861247,US
1079861248,1079865343,CA
-1079865344,1079944295,US
+1079865344,1079943999,US
+1079944000,1079944031,AU
+1079944032,1079944295,US
1079944296,1079944303,IL
1079944304,1079946271,US
1079946272,1079946303,IE
@@ -14042,9 +14904,7 @@
1081397760,1081398783,CL
1081398784,1081399295,US
1081399296,1081401343,CL
-1081401344,1081401375,AR
-1081401376,1081401383,US
-1081401384,1081401391,AR
+1081401344,1081401391,AR
1081401392,1081401415,US
1081401416,1081401471,AR
1081401472,1081401567,US
@@ -14136,7 +14996,29 @@
1081483248,1081483255,US
1081483256,1081483263,CA
1081483264,1081487359,US
-1081487360,1081491455,A2
+1081487360,1081487375,A2
+1081487376,1081487383,US
+1081487384,1081487391,A2
+1081487392,1081487407,US
+1081487408,1081487567,A2
+1081487568,1081487583,US
+1081487584,1081487919,A2
+1081487920,1081487927,US
+1081487928,1081487959,A2
+1081487960,1081487967,US
+1081487968,1081488055,A2
+1081488056,1081488079,US
+1081488080,1081488087,A2
+1081488088,1081488095,US
+1081488096,1081488135,A2
+1081488136,1081488151,US
+1081488152,1081488199,A2
+1081488200,1081488215,US
+1081488216,1081488223,A2
+1081488224,1081488247,US
+1081488248,1081488255,A2
+1081488256,1081488287,US
+1081488288,1081491455,A2
1081491456,1081565183,US
1081565184,1081573375,CA
1081573376,1081581615,US
@@ -14284,9 +15166,7 @@
1081912576,1081912639,DE
1081912640,1081927135,US
1081927136,1081927143,GB
-1081927144,1081955327,US
-1081955328,1081955583,CA
-1081955584,1081955839,US
+1081927144,1081955839,US
1081955840,1081956095,CA
1081956096,1081966871,US
1081966872,1081966879,AS
@@ -14355,7 +15235,9 @@
1082885344,1082885855,US
1082885856,1082885887,CA
1082885888,1082945535,US
-1082945536,1082949631,CA
+1082945536,1082948943,CA
+1082948944,1082948959,US
+1082948960,1082949631,CA
1082949632,1082952703,US
1082952704,1082952959,CA
1082952960,1082982399,US
@@ -14503,7 +15385,9 @@
1085685670,1085685685,CA
1085685686,1085698199,US
1085698200,1085698207,AS
-1085698208,1085849599,US
+1085698208,1085823775,US
+1085823776,1085823807,DE
+1085823808,1085849599,US
1085849600,1085857791,CA
1085857792,1085915135,US
1085915136,1085923327,PR
@@ -14529,11 +15413,7 @@
1086025448,1086025455,CA
1086025456,1086027391,US
1086027392,1086027407,IT
-1086027408,1086027423,US
-1086027424,1086027455,VN
-1086027456,1086028031,US
-1086028032,1086028287,PA
-1086028288,1086028663,US
+1086027408,1086028663,US
1086028664,1086028671,BR
1086028672,1086028751,US
1086028752,1086028759,BR
@@ -14673,9 +15553,7 @@
1088101024,1088101031,PR
1088101032,1088108351,US
1088108352,1088108359,PR
-1088108360,1088117199,US
-1088117200,1088117207,PR
-1088117208,1088120527,US
+1088108360,1088120527,US
1088120528,1088120535,PR
1088120536,1088146151,US
1088146152,1088146159,PR
@@ -15159,7 +16037,9 @@
1093113480,1093113487,CA
1093113488,1093113503,US
1093113504,1093113535,CA
-1093113536,1093113727,US
+1093113536,1093113639,US
+1093113640,1093113647,CA
+1093113648,1093113727,US
1093113728,1093113743,CA
1093113744,1093113759,US
1093113760,1093113783,CA
@@ -16205,8 +17085,7 @@
1102019584,1102019711,IN
1102019712,1102389247,US
1102389248,1102393343,CA
-1102393344,1102397439,US
-1102413824,1102446591,US
+1102393344,1102446591,US
1102446592,1102448383,HN
1102448384,1102449151,US
1102449152,1102449407,SV
@@ -16791,7 +17670,9 @@
1110887424,1110887679,IE
1110887680,1110929407,US
1110929408,1110933503,BM
-1110933504,1111195647,US
+1110933504,1110940751,US
+1110940752,1110940767,A1
+1110940768,1111195647,US
1111195648,1111212031,CA
1111212032,1111228415,US
1111228416,1111244799,AR
@@ -16882,7 +17763,9 @@
1114170112,1114505215,US
1114505216,1114507263,CA
1114507264,1114507295,US
-1114507296,1114507423,CA
+1114507296,1114507327,CA
+1114507328,1114507391,US
+1114507392,1114507423,CA
1114507424,1114507431,GB
1114507432,1114511359,CA
1114511360,1114511871,US
@@ -16901,9 +17784,7 @@
1114533376,1114533887,ZA
1114533888,1114537983,AO
1114537984,1114550271,CA
-1114550272,1114627071,US
-1114627072,1114628095,NZ
-1114628096,1114653951,US
+1114550272,1114653951,US
1114653952,1114653983,MO
1114653984,1114657927,US
1114657928,1114657935,LA
@@ -16954,13 +17835,9 @@
1115111936,1115112063,PR
1115112064,1115112079,US
1115112080,1115112087,ES
-1115112088,1115112159,US
-1115112160,1115112191,SV
-1115112192,1115112575,US
+1115112088,1115112575,US
1115112576,1115112607,IN
-1115112608,1115113167,US
-1115113168,1115113175,SV
-1115113176,1115113471,US
+1115112608,1115113471,US
1115113472,1115114495,HN
1115114496,1115114751,MX
1115114752,1115115007,GT
@@ -17090,9 +17967,7 @@
1116214160,1116214167,PR
1116214168,1116217151,US
1116217152,1116217159,PR
-1116217160,1116217439,US
-1116217440,1116217447,PR
-1116217448,1116218527,US
+1116217160,1116218527,US
1116218528,1116218535,PR
1116218536,1116220231,US
1116220232,1116220239,PR
@@ -17260,21 +18135,17 @@
1117163024,1117163031,CA
1117163032,1117169503,US
1117169504,1117169535,CA
-1117169536,1117178287,US
+1117169536,1117171071,US
+1117171072,1117171103,CA
+1117171104,1117178287,US
1117178288,1117178303,GB
-1117178304,1117182271,US
-1117182272,1117182335,CA
-1117182336,1117189951,US
+1117178304,1117189951,US
1117189952,1117190015,KR
1117190016,1117195991,US
1117195992,1117195999,A2
1117196000,1117198591,US
1117198592,1117198847,CA
-1117198848,1117206599,US
-1117206600,1117206623,FR
-1117206624,1117253247,US
-1117253248,1117253255,IL
-1117253256,1117274111,US
+1117198848,1117274111,US
1117274112,1117282303,CA
1117282304,1117299615,US
1117299616,1117299623,GB
@@ -17585,7 +18456,9 @@
1118564608,1118564639,NO
1118564640,1118564655,US
1118564656,1118564671,IN
-1118564672,1118789783,US
+1118564672,1118564895,US
+1118564896,1118564927,AU
+1118564928,1118789783,US
1118789784,1118789791,BB
1118789792,1118790351,US
1118790352,1118790367,GB
@@ -17771,7 +18644,7 @@
1118970112,1118970119,KE
1118970120,1118970239,A2
1118970240,1118970367,NG
-1118970368,1118970623,GY
+1118970368,1118970623,GB
1118970624,1118970751,SA
1118970752,1118970879,GY
1118970880,1118971520,SR
@@ -17779,7 +18652,7 @@
1118971648,1118971903,GY
1118971904,1118972159,A2
1118972160,1118972415,VE
-1118972416,1118972671,EC
+1118972416,1118972671,GB
1118972672,1118972927,SA
1118972928,1118972943,NI
1118972944,1118972959,VE
@@ -17802,7 +18675,7 @@
1118973160,1118973167,NI
1118973168,1118973183,A2
1118973184,1118973439,VE
-1118973440,1118973695,GY
+1118973440,1118973695,HK
1118973696,1118973951,NG
1118973952,1118974015,GY
1118974016,1118974047,A2
@@ -17856,8 +18729,8 @@
1118977552,1118977575,A2
1118977576,1118977583,SA
1118977584,1118977631,A2
-1118977632,1118977663,NG
-1118977664,1118977839,A2
+1118977632,1118977639,US
+1118977640,1118977839,A2
1118977840,1118977847,LB
1118977848,1118977879,A2
1118977880,1118977887,NI
@@ -17977,7 +18850,7 @@
1118984896,1118984943,SA
1118984944,1118984951,LB
1118984952,1118984959,SA
-1118984960,1118985215,VE
+1118984960,1118985215,LB
1118985216,1118985983,A2
1118985984,1118986111,NG
1118986112,1118986239,A2
@@ -18060,7 +18933,9 @@
1119171208,1119171215,CA
1119171216,1119171383,US
1119171384,1119171391,CA
-1119171392,1119172895,US
+1119171392,1119172199,US
+1119172200,1119172207,CA
+1119172208,1119172895,US
1119172896,1119172991,MX
1119172992,1119173007,US
1119173008,1119173095,MX
@@ -18161,9 +19036,7 @@
1120151696,1120151711,TW
1120151712,1120152159,CA
1120152160,1120152191,US
-1120152192,1120152319,CA
-1120152320,1120152575,US
-1120152576,1120153599,CA
+1120152192,1120153599,CA
1120153600,1120272383,US
1120272384,1120280575,CA
1120280576,1120280831,US
@@ -19000,8 +19873,8 @@
1121717432,1121717439,JP
1121717440,1121717759,US
1121717760,1121718015,IT
-1121718016,1121721695,US
-1121721696,1121721727,CN
+1121718016,1121721703,US
+1121721704,1121721727,CN
1121721728,1121878015,US
1121878016,1121910783,CA
1121910784,1122074623,US
@@ -19010,11 +19883,19 @@
1122088192,1122091007,CA
1122091008,1122092623,US
1122092624,1122092631,CA
-1122092632,1122092799,US
+1122092632,1122092687,US
+1122092688,1122092695,GB
+1122092696,1122092799,US
1122092800,1122093055,CA
1122093056,1122093807,US
1122093808,1122093815,HK
-1122093816,1122103471,US
+1122093816,1122101071,US
+1122101072,1122101079,CA
+1122101080,1122101111,US
+1122101112,1122101119,CA
+1122101120,1122101431,US
+1122101432,1122101439,SG
+1122101440,1122103471,US
1122103472,1122103479,BE
1122103480,1122125996,US
1122125997,1122126004,GB
@@ -19071,9 +19952,7 @@
1122493440,1122494207,PR
1122494208,1122495231,US
1122495232,1122495999,PR
-1122496000,1122497407,US
-1122497408,1122497471,SV
-1122497472,1122497535,US
+1122496000,1122497535,US
1122497536,1122498047,PR
1122498048,1122498559,US
1122498560,1122498815,PR
@@ -19458,7 +20337,9 @@
1125541392,1125541407,US
1125541408,1125541487,CA
1125541488,1125541503,US
-1125541504,1125543543,CA
+1125541504,1125541543,CA
+1125541544,1125541551,CN
+1125541552,1125543543,CA
1125543544,1125543551,US
1125543552,1125543935,CA
1125543936,1125545983,US
@@ -21054,7 +21935,9 @@
1138662274,1138662309,EG
1138662310,1138662333,US
1138662334,1138662353,GB
-1138662354,1138662409,US
+1138662354,1138662369,US
+1138662370,1138662393,GB
+1138662394,1138662409,US
1138662410,1138662473,EG
1138662474,1138662505,GB
1138662506,1138662537,US
@@ -21112,7 +21995,9 @@
1139167744,1139169023,PR
1139169024,1139169279,US
1139169280,1139170047,PR
-1139170048,1139179519,US
+1139170048,1139171327,US
+1139171328,1139175423,GT
+1139175424,1139179519,US
1139179520,1139188223,CA
1139188224,1139188479,GB
1139188480,1139188735,CA
@@ -21183,11 +22068,7 @@
1145333864,1145333871,EG
1145333872,1145333879,US
1145333880,1145333903,CN
-1145333904,1145333911,US
-1145333912,1145333919,CN
-1145333920,1145334055,US
-1145334056,1145334063,CN
-1145334064,1145334143,US
+1145333904,1145334143,US
1145334144,1145334167,CN
1145334168,1145334175,US
1145334176,1145334223,CN
@@ -21196,8 +22077,8 @@
1145334240,1145335103,US
1145335104,1145335135,NL
1145335136,1145335167,US
-1145335168,1145335191,CN
-1145335192,1145335215,US
+1145335168,1145335183,CN
+1145335184,1145335215,US
1145335216,1145335223,CN
1145335224,1145376767,US
1145376768,1145380863,CA
@@ -21670,7 +22551,9 @@
1158946640,1158946647,IL
1158946648,1158946711,US
1158946712,1158946719,HK
-1158946720,1158947087,US
+1158946720,1158946771,US
+1158946772,1158946772,MX
+1158946773,1158947087,US
1158947088,1158947095,ZA
1158947096,1158947391,US
1158947392,1158947399,CA
@@ -21705,7 +22588,9 @@
1158949408,1158949415,ZA
1158949416,1158949775,US
1158949776,1158949783,GB
-1158949784,1158950319,US
+1158949784,1158950105,US
+1158950106,1158950107,CA
+1158950108,1158950319,US
1158950320,1158950327,CA
1158950328,1158950335,US
1158950336,1158950351,CA
@@ -21738,10 +22623,14 @@
1158952816,1158952823,CA
1158952824,1158952895,US
1158952896,1158952903,IL
-1158952904,1158954815,US
+1158952904,1158953503,US
+1158953504,1158953511,NL
+1158953512,1158954815,US
1158954816,1158954823,GB
1158954824,1158954831,CA
-1158954832,1158955039,US
+1158954832,1158955015,US
+1158955016,1158955023,CA
+1158955024,1158955039,US
1158955040,1158955047,GB
1158955048,1158956063,US
1158956064,1158956079,NL
@@ -21791,9 +22680,7 @@
1158961256,1158961263,ES
1158961264,1158961775,US
1158961776,1158961783,CA
-1158961784,1158961823,US
-1158961824,1158961855,BD
-1158961856,1158962175,US
+1158961784,1158962175,US
1158962176,1158962183,GB
1158962184,1158962287,US
1158962288,1158962295,ZA
@@ -21815,7 +22702,9 @@
1158963728,1158963735,GB
1158963736,1158964103,US
1158964104,1158964111,IN
-1158964112,1158964255,US
+1158964112,1158964189,US
+1158964190,1158964191,CA
+1158964192,1158964255,US
1158964256,1158964263,IN
1158964264,1158964287,US
1158964288,1158964319,CA
@@ -22504,15 +23393,20 @@
1161629240,1161629247,PL
1161629248,1161629263,US
1161629264,1161629271,PL
-1161629272,1161629335,US
-1161629336,1161629343,NL
+1161629272,1161629343,US
1161629344,1161629375,FI
1161629376,1161629383,CA
-1161629384,1161629519,US
+1161629384,1161629415,US
+1161629416,1161629423,HR
+1161629424,1161629439,MY
+1161629440,1161629519,US
1161629520,1161629527,GB
1161629528,1161629535,MY
1161629536,1161629567,GB
-1161629568,1161629695,US
+1161629568,1161629583,US
+1161629584,1161629599,GB
+1161629600,1161629615,HR
+1161629616,1161629695,US
1161629696,1161629951,PL
1161629952,1161630335,US
1161630336,1161630343,PL
@@ -22827,8 +23721,8 @@
1161795980,1161795983,CA
1161795984,1161818111,US
1161818112,1161822207,CA
-1161822208,1161832799,US
-1161832800,1161832831,BR
+1161822208,1161832767,US
+1161832768,1161832831,BR
1161832832,1161833759,US
1161833760,1161833791,FR
1161833792,1161833855,US
@@ -22885,7 +23779,9 @@
1161891528,1161891535,CA
1161891536,1161891543,US
1161891544,1161891551,CA
-1161891552,1161901647,US
+1161891552,1161900863,US
+1161900864,1161900895,A1
+1161900896,1161901647,US
1161901648,1161901655,VN
1161901656,1161925631,US
1161925632,1161925887,EC
@@ -22981,7 +23877,8 @@
1162811648,1162812159,US
1162812160,1162812415,DO
1162812416,1162813439,BS
-1162813440,1162821631,US
+1162813440,1162817535,AN
+1162817536,1162821631,GT
1162821632,1162823679,PR
1162823680,1162825727,GT
1162825728,1162827775,US
@@ -22991,7 +23888,12 @@
1162836224,1162836735,AN
1162836736,1162836991,US
1162836992,1162838015,BS
-1162838016,1162870783,US
+1162838016,1162840063,PR
+1162840064,1162853375,US
+1162853376,1162854399,PR
+1162854400,1162858495,JM
+1162858496,1162862591,HN
+1162862592,1162870783,US
1162870784,1162871295,BB
1162871296,1162879999,LC
1162880000,1162882559,DM
@@ -23121,7 +24023,9 @@
1163407360,1163411455,CA
1163411456,1163468799,US
1163468800,1163472895,PR
-1163472896,1163526143,US
+1163472896,1163477695,US
+1163477696,1163477727,JP
+1163477728,1163526143,US
1163526144,1163526463,CA
1163526464,1163526911,US
1163526912,1163527007,CA
@@ -23315,9 +24219,7 @@
1163558029,1163560191,US
1163560192,1163560447,CA
1163560448,1163560959,US
-1163560960,1163561727,CA
-1163561728,1163561983,FI
-1163561984,1163562063,CA
+1163560960,1163562063,CA
1163562064,1163562079,US
1163562080,1163562119,CA
1163562120,1163562127,SG
@@ -23613,11 +24515,14 @@
1170461056,1170461439,CO
1170461440,1170461695,US
1170461696,1170462719,IL
-1170462720,1170466767,US
+1170462720,1170465791,US
+1170465792,1170466047,CY
+1170466048,1170466767,US
1170466768,1170466783,MQ
1170466784,1170466815,US
1170466816,1170467839,IL
-1170467840,1170472959,US
+1170467840,1170468351,DO
+1170468352,1170472959,US
1170472960,1170481151,CA
1170481152,1170489343,US
1170489344,1170497535,CA
@@ -23627,44 +24532,114 @@
1170538496,1170538751,KH
1170538752,1170539329,US
1170539330,1170539330,CN
-1170539331,1170539331,US
+1170539331,1170539331,TR
1170539332,1170539332,CA
-1170539333,1170539590,US
+1170539333,1170539460,US
+1170539461,1170539461,PK
+1170539462,1170539522,US
+1170539523,1170539523,AU
+1170539524,1170539589,US
+1170539590,1170539590,SA
1170539591,1170539591,CN
-1170539592,1170539652,US
+1170539592,1170539592,AU
+1170539593,1170539650,US
+1170539651,1170539651,TR
+1170539652,1170539652,US
1170539653,1170539653,GB
-1170539654,1170539714,US
+1170539654,1170539712,US
+1170539713,1170539713,CN
+1170539714,1170539714,US
1170539715,1170539715,PK
-1170539716,1170539969,US
+1170539716,1170539777,US
+1170539778,1170539778,CN
+1170539779,1170539780,US
+1170539781,1170539781,KR
+1170539782,1170539842,US
+1170539843,1170539843,MY
+1170539844,1170539910,US
+1170539911,1170539911,KH
+1170539912,1170539969,US
1170539970,1170539970,KH
-1170539971,1170540038,US
+1170539971,1170539971,TR
+1170539972,1170540036,US
+1170540037,1170540037,TR
+1170540038,1170540038,US
1170540039,1170540039,PH
-1170540040,1170540097,US
+1170540040,1170540096,US
+1170540097,1170540097,CN
1170540098,1170540098,TR
-1170540099,1170540231,US
+1170540099,1170540105,US
+1170540106,1170540106,CN
+1170540107,1170540163,US
+1170540164,1170540164,RO
+1170540165,1170540228,US
+1170540229,1170540229,TR
+1170540230,1170540230,US
+1170540231,1170540231,KR
1170540232,1170540232,CN
-1170540233,1170540289,US
-1170540290,1170540290,CN
-1170540291,1170544199,US
+1170540233,1170540288,US
+1170540289,1170540290,CN
+1170540291,1170540294,US
+1170540295,1170540295,CN
+1170540296,1170540296,TR
+1170540297,1170540360,US
+1170540361,1170540361,CA
+1170540362,1170540369,US
+1170540370,1170540370,CN
+1170540371,1170540371,US
+1170540372,1170540372,CN
+1170540373,1170540416,US
+1170540417,1170540417,CN
+1170540418,1170540480,US
+1170540481,1170540481,TR
+1170540482,1170540492,US
+1170540493,1170540493,TR
+1170540494,1170544127,US
+1170544128,1170544191,CN
+1170544192,1170544199,US
1170544200,1170544207,TR
1170544208,1170544255,US
1170544256,1170544383,IN
1170544384,1170544387,US
1170544388,1170544391,BD
-1170544392,1170544431,US
+1170544392,1170544395,TR
+1170544396,1170544431,US
1170544432,1170544439,CN
1170544440,1170544443,AU
1170544444,1170544511,US
-1170544512,1170544575,SE
-1170544576,1170553343,US
-1170553344,1170553407,CN
+1170544512,1170544543,TR
+1170544544,1170544831,US
+1170544832,1170544959,CN
+1170544960,1170545407,US
+1170545408,1170545439,TR
+1170545440,1170552959,US
+1170552960,1170553023,CN
+1170553024,1170553279,US
+1170553280,1170553407,CN
1170553408,1170553431,US
1170553432,1170553435,TR
1170553436,1170553471,US
1170553472,1170553535,PK
-1170553536,1170553855,US
+1170553536,1170553599,US
+1170553600,1170553603,TR
+1170553604,1170553615,US
+1170553616,1170553619,SA
+1170553620,1170553623,TR
+1170553624,1170553627,US
+1170553628,1170553631,TR
+1170553632,1170553635,US
+1170553636,1170553643,SA
+1170553644,1170553647,TR
+1170553648,1170553651,US
+1170553652,1170553655,TR
+1170553656,1170553663,US
+1170553664,1170553667,SA
+1170553668,1170553707,US
+1170553708,1170553711,TR
+1170553712,1170553855,US
1170553856,1170553983,MY
-1170553984,1170554367,US
+1170553984,1170554047,CN
+1170554048,1170554367,US
1170554368,1170554431,CN
1170554432,1170554463,US
1170554464,1170554479,CN
@@ -23721,8 +24696,8 @@
1176620976,1176620991,CA
1176620992,1176620999,US
1176621000,1176621567,CA
-1176621568,1176623103,US
-1176623104,1176623359,CA
+1176621568,1176622591,US
+1176622592,1176623359,CA
1176623360,1176623487,US
1176623488,1176623567,CA
1176623568,1176623583,US
@@ -23740,8 +24715,7 @@
1176629464,1176629503,US
1176629504,1176629519,CA
1176629520,1176629535,NZ
-1176629536,1176629567,US
-1176629568,1176629631,CA
+1176629536,1176629631,CA
1176629632,1176629727,US
1176629728,1176631295,CA
1176631296,1176631551,NL
@@ -24032,7 +25006,9 @@
1177164928,1177164943,CA
1177164944,1177165311,US
1177165312,1177165823,CA
-1177165824,1177175199,US
+1177165824,1177168223,US
+1177168224,1177168231,IE
+1177168232,1177175199,US
1177175200,1177175231,CZ
1177175232,1177182527,US
1177182528,1177182591,CA
@@ -24448,37 +25424,75 @@
1208337920,1208338175,A2
1208338176,1208516607,US
1208516608,1208516623,MX
-1208516624,1208516671,US
-1208516672,1208516735,TR
+1208516624,1208516639,US
+1208516640,1208516735,TR
1208516736,1208516799,ID
-1208516800,1208517119,US
+1208516800,1208517010,US
+1208517011,1208517011,TR
+1208517012,1208517012,GB
+1208517013,1208517119,US
1208517120,1208517375,KH
-1208517376,1208517631,US
+1208517376,1208517503,US
+1208517504,1208517567,CN
+1208517568,1208517631,US
1208517632,1208517887,KH
-1208517888,1208518243,US
+1208517888,1208518015,US
+1208518016,1208518079,CN
+1208518080,1208518143,US
+1208518144,1208518207,CN
+1208518208,1208518243,US
1208518244,1208518244,CN
1208518245,1208518246,US
1208518247,1208518247,KH
-1208518248,1208518263,US
+1208518248,1208518261,US
+1208518262,1208518262,TR
+1208518263,1208518263,CN
1208518264,1208518264,GB
-1208518265,1208518335,US
+1208518265,1208518299,US
+1208518300,1208518303,BD
+1208518304,1208518335,US
1208518336,1208518399,TR
1208518400,1208519167,US
1208519168,1208519423,CN
-1208519424,1208521983,US
+1208519424,1208519551,TR
+1208519552,1208521983,US
1208521984,1208522239,CN
-1208522240,1208523991,US
+1208522240,1208522271,US
+1208522272,1208522303,TR
+1208522304,1208522367,US
+1208522368,1208522431,CN
+1208522432,1208523991,US
1208523992,1208523995,TR
-1208523996,1208524063,US
+1208523996,1208523999,US
+1208524000,1208524031,TR
+1208524032,1208524047,US
+1208524048,1208524055,TR
+1208524056,1208524063,US
1208524064,1208524079,CN
-1208524080,1208524159,US
+1208524080,1208524083,US
+1208524084,1208524087,KR
+1208524088,1208524159,US
1208524160,1208524223,ID
1208524224,1208524287,US
1208524288,1208524351,PK
1208524352,1208524415,CN
-1208524416,1208527871,US
+1208524416,1208524863,US
+1208524864,1208524927,PK
+1208524928,1208525823,US
+1208525824,1208526079,KH
+1208526080,1208526335,US
+1208526336,1208526591,CN
+1208526592,1208527871,US
1208527872,1208528127,VN
-1208528128,1208586364,US
+1208528128,1208531007,US
+1208531008,1208531071,CN
+1208531072,1208531455,US
+1208531456,1208531583,CN
+1208531584,1208531711,US
+1208531712,1208531967,PK
+1208531968,1208532287,US
+1208532288,1208532351,PK
+1208532352,1208586364,US
1208586365,1208586372,MA
1208586373,1208586419,US
1208586420,1208586427,AE
@@ -24773,32 +25787,81 @@
1209190912,1209191167,MX
1209191168,1209270579,US
1209270580,1209270583,ID
-1209270584,1209271067,US
+1209270584,1209270607,US
+1209270608,1209270611,KR
+1209270612,1209270615,CN
+1209270616,1209270783,US
+1209270784,1209270787,TR
+1209270788,1209271067,US
1209271068,1209271071,VN
-1209271072,1209271371,US
+1209271072,1209271083,US
+1209271084,1209271087,BR
+1209271088,1209271127,US
+1209271128,1209271131,SA
+1209271132,1209271187,US
+1209271188,1209271191,TR
+1209271192,1209271367,US
+1209271368,1209271371,TR
1209271372,1209271375,PE
1209271376,1209271435,US
1209271436,1209271439,CN
-1209271440,1209271463,US
-1209271464,1209271467,IN
-1209271468,1209271495,US
+1209271440,1209271451,US
+1209271452,1209271455,CN
+1209271456,1209271463,US
+1209271464,1209271467,PK
+1209271468,1209271487,US
+1209271488,1209271495,CN
1209271496,1209271499,CA
1209271500,1209271503,MX
-1209271504,1209271579,US
+1209271504,1209271543,US
+1209271544,1209271551,CN
+1209271552,1209271571,US
+1209271572,1209271575,TR
+1209271576,1209271579,US
1209271580,1209271583,BD
1209271584,1209271607,US
1209271608,1209271611,KH
-1209271612,1209271639,US
+1209271612,1209271615,CA
+1209271616,1209271639,US
1209271640,1209271643,CZ
-1209271644,1209271691,US
+1209271644,1209271659,US
+1209271660,1209271663,PK
+1209271664,1209271691,US
1209271692,1209271695,CA
-1209271696,1209271967,US
+1209271696,1209271703,US
+1209271704,1209271707,CN
+1209271708,1209271719,US
+1209271720,1209271723,CN
+1209271724,1209271727,US
+1209271728,1209271731,PK
+1209271732,1209271735,CN
+1209271736,1209271847,US
+1209271848,1209271855,IN
+1209271856,1209271867,US
+1209271868,1209271871,BR
+1209271872,1209271951,US
+1209271952,1209271955,KH
+1209271956,1209271963,US
+1209271964,1209271967,TR
1209271968,1209271971,VN
1209271972,1209271975,TR
1209271976,1209271979,CA
-1209271980,1209272127,US
+1209271980,1209271983,ZA
+1209271984,1209271999,US
+1209272000,1209272007,TR
+1209272008,1209272043,US
+1209272044,1209272047,TR
+1209272048,1209272079,US
+1209272080,1209272095,TR
+1209272096,1209272127,US
1209272128,1209272159,CN
-1209272160,1209272383,US
+1209272160,1209272175,US
+1209272176,1209272191,BR
+1209272192,1209272223,TR
+1209272224,1209272239,US
+1209272240,1209272255,TR
+1209272256,1209272287,CN
+1209272288,1209272383,US
1209272384,1209272399,CA
1209272400,1209272407,US
1209272408,1209272415,PE
@@ -24808,52 +25871,123 @@
1209272512,1209272575,CN
1209272576,1209272583,US
1209272584,1209272591,PH
-1209272592,1209272655,US
+1209272592,1209272607,US
+1209272608,1209272623,TR
+1209272624,1209272655,US
1209272656,1209272671,TR
-1209272672,1209273555,US
+1209272672,1209272719,US
+1209272720,1209272767,CN
+1209272768,1209272783,TR
+1209272784,1209272847,US
+1209272848,1209272863,TR
+1209272864,1209272895,US
+1209272896,1209272959,CN
+1209272960,1209273023,BR
+1209273024,1209273055,US
+1209273056,1209273071,TR
+1209273072,1209273119,US
+1209273120,1209273135,BR
+1209273136,1209273151,TR
+1209273152,1209273207,US
+1209273208,1209273215,CA
+1209273216,1209273279,US
+1209273280,1209273311,BR
+1209273312,1209273359,US
+1209273360,1209273375,TR
+1209273376,1209273555,US
1209273556,1209273559,CA
1209273560,1209273647,US
1209273648,1209273655,CN
-1209273656,1209273663,US
+1209273656,1209273663,AU
1209273664,1209273671,BD
-1209273672,1209274031,US
+1209273672,1209273999,US
+1209274000,1209274015,TR
+1209274016,1209274031,US
1209274032,1209274039,TR
-1209274040,1209274115,US
+1209274040,1209274047,US
+1209274048,1209274111,CN
+1209274112,1209274115,US
1209274116,1209274119,CZ
1209274120,1209274135,US
1209274136,1209274151,TR
-1209274152,1209274815,US
+1209274152,1209274367,US
+1209274368,1209274495,TR
+1209274496,1209274527,CN
+1209274528,1209274543,US
+1209274544,1209274559,TR
+1209274560,1209274815,US
1209274816,1209274879,CA
1209274880,1209274911,CZ
1209274912,1209274927,US
1209274928,1209274943,TR
1209274944,1209274959,US
1209274960,1209274967,PH
-1209274968,1209275906,US
+1209274968,1209275679,US
+1209275680,1209275695,TR
+1209275696,1209275791,US
+1209275792,1209275799,TR
+1209275800,1209275823,US
+1209275824,1209275827,CN
+1209275828,1209275906,US
1209275907,1209275908,KH
-1209275909,1209275928,US
+1209275909,1209275913,US
+1209275914,1209275914,KH
+1209275915,1209275917,US
+1209275918,1209275918,KH
+1209275919,1209275924,US
+1209275925,1209275925,TR
+1209275926,1209275928,US
1209275929,1209275929,MY
1209275930,1209275930,US
1209275931,1209275931,AU
1209275932,1209275932,CN
-1209275933,1209276351,US
+1209275933,1209275999,US
+1209276000,1209276031,MY
+1209276032,1209276063,BR
+1209276064,1209276351,US
1209276352,1209276415,CN
-1209276416,1209276799,US
-1209276800,1209276807,BD
+1209276416,1209276671,US
+1209276672,1209276703,CN
+1209276704,1209276799,US
+1209276800,1209276803,SA
+1209276804,1209276807,BD
1209276808,1209276903,US
1209276904,1209276911,CN
1209276912,1209276927,TR
1209276928,1209277103,US
1209277104,1209277119,TR
-1209277120,1209277155,US
+1209277120,1209277143,US
+1209277144,1209277147,TR
+1209277148,1209277154,US
+1209277155,1209277155,TR
1209277156,1209277156,SE
-1209277157,1209277159,US
+1209277157,1209277157,US
+1209277158,1209277158,IN
+1209277159,1209277159,US
1209277160,1209277160,CN
-1209277161,1209277575,US
+1209277161,1209277166,US
+1209277167,1209277167,CN
+1209277168,1209277168,AU
+1209277169,1209277215,US
+1209277216,1209277231,BR
+1209277232,1209277247,US
+1209277248,1209277263,BR
+1209277264,1209277279,US
+1209277280,1209277283,CA
+1209277284,1209277575,US
1209277576,1209277583,BD
-1209277584,1209278207,US
+1209277584,1209278083,US
+1209278084,1209278087,CN
+1209278088,1209278095,AU
+1209278096,1209278207,US
1209278208,1209278463,IE
-1209278464,1209278911,US
+1209278464,1209278523,US
+1209278524,1209278527,CN
+1209278528,1209278591,US
+1209278592,1209278719,CN
+1209278720,1209278827,US
+1209278828,1209278831,CN
+1209278832,1209278911,US
1209278912,1209278919,TR
1209278920,1209278975,US
1209278976,1209279103,CA
@@ -24861,44 +25995,103 @@
1209279120,1209279135,CA
1209279136,1209279167,US
1209279168,1209279231,VN
-1209279232,1209279871,US
+1209279232,1209279295,BR
+1209279296,1209279855,US
+1209279856,1209279871,TR
1209279872,1209279935,MY
-1209279936,1209280191,US
+1209279936,1209279951,GB
+1209279952,1209279967,US
+1209279968,1209279999,CN
+1209280000,1209280015,TR
+1209280016,1209280027,US
+1209280028,1209280031,SA
+1209280032,1209280047,IN
+1209280048,1209280191,US
1209280192,1209280255,VN
1209280256,1209280495,US
1209280496,1209280511,CA
-1209280512,1209280623,US
+1209280512,1209280515,US
+1209280516,1209280519,TR
+1209280520,1209280527,AU
+1209280528,1209280623,US
1209280624,1209280639,CN
-1209280640,1209281247,US
+1209280640,1209280895,US
+1209280896,1209280959,BR
+1209280960,1209281007,US
+1209281008,1209281023,TR
+1209281024,1209281151,US
+1209281152,1209281231,CN
+1209281232,1209281247,US
1209281248,1209281279,CA
1209281280,1209281535,KH
-1209281536,1209281983,US
+1209281536,1209281791,IN
+1209281792,1209281871,US
+1209281872,1209281887,TR
+1209281888,1209281983,US
1209281984,1209282047,TR
-1209282048,1209283751,US
+1209282048,1209282063,US
+1209282064,1209282067,SA
+1209282068,1209282559,US
+1209282560,1209282623,CN
+1209282624,1209283487,US
+1209283488,1209283503,TR
+1209283504,1209283543,US
+1209283544,1209283547,SA
+1209283548,1209283583,US
+1209283584,1209283587,SA
+1209283588,1209283751,US
1209283752,1209283759,BD
-1209283760,1209283807,US
+1209283760,1209283775,US
+1209283776,1209283807,ZA
1209283808,1209283839,CA
1209283840,1209283871,US
1209283872,1209283875,TR
-1209283876,1209284223,US
+1209283876,1209283887,US
+1209283888,1209283903,BR
+1209283904,1209283915,US
+1209283916,1209283919,KR
+1209283920,1209284159,US
+1209284160,1209284223,TR
1209284224,1209284351,IE
-1209284352,1209284799,US
-1209284800,1209284815,TR
-1209284816,1209284855,US
+1209284352,1209284399,US
+1209284400,1209284415,TR
+1209284416,1209284431,US
+1209284432,1209284447,TR
+1209284448,1209284607,US
+1209284608,1209284671,TR
+1209284672,1209284735,CN
+1209284736,1209284767,US
+1209284768,1209284799,MY
+1209284800,1209284831,TR
+1209284832,1209284839,US
+1209284840,1209284843,TR
+1209284844,1209284855,US
1209284856,1209284863,TR
-1209284864,1209284999,US
+1209284864,1209284993,US
+1209284994,1209284994,TR
+1209284995,1209284995,US
+1209284996,1209284996,TR
+1209284997,1209284997,US
+1209284998,1209284998,CN
+1209284999,1209284999,US
1209285000,1209285000,CA
-1209285001,1209285003,US
+1209285001,1209285002,US
+1209285003,1209285003,CN
1209285004,1209285004,CA
-1209285005,1209285017,US
+1209285005,1209285009,US
+1209285010,1209285010,CA
+1209285011,1209285017,US
1209285018,1209285018,CA
1209285019,1209285021,US
1209285022,1209285022,CA
1209285023,1209285063,US
1209285064,1209285071,TR
-1209285072,1209285183,US
+1209285072,1209285151,US
+1209285152,1209285183,RO
1209285184,1209285247,TR
-1209285248,1209347839,US
+1209285248,1209286143,US
+1209286144,1209286399,KH
+1209286400,1209347839,US
1209347840,1209348095,GB
1209348096,1209357215,US
1209357216,1209357231,SI
@@ -25692,7 +26885,9 @@
1211038064,1211038079,TT
1211038080,1211038719,US
1211038720,1211038975,CY
-1211038976,1211039087,US
+1211038976,1211039007,US
+1211039008,1211039023,VG
+1211039024,1211039087,US
1211039088,1211039103,RU
1211039104,1211039503,US
1211039504,1211039519,A2
@@ -25706,7 +26901,8 @@
1211303936,1211304159,CA
1211304160,1211304223,US
1211304224,1211304255,CA
-1211304256,1211304319,US
+1211304256,1211304287,US
+1211304288,1211304319,CA
1211304320,1211304351,NL
1211304352,1211304703,CA
1211304704,1211304767,GB
@@ -26020,21 +27216,33 @@
1249010688,1249011711,CA
1249011712,1249019903,US
1249019904,1249020927,CA
-1249020928,1249027135,US
+1249020928,1249026703,US
+1249026704,1249026711,ZA
+1249026712,1249026719,CA
+1249026720,1249026767,US
+1249026768,1249026775,CA
+1249026776,1249027127,US
+1249027128,1249027135,ZA
1249027136,1249027143,AU
1249027144,1249027175,US
1249027176,1249027183,IN
-1249027184,1249027391,US
+1249027184,1249027271,US
+1249027272,1249027279,GB
+1249027280,1249027391,US
1249027392,1249027407,PH
1249027408,1249027503,US
1249027504,1249027519,CA
1249027520,1249027551,US
1249027552,1249027559,CA
1249027560,1249027647,US
-1249027648,1249027655,AU
-1249027656,1249027823,US
+1249027648,1249027655,GB
+1249027656,1249027719,US
+1249027720,1249027727,GR
+1249027728,1249027823,US
1249027824,1249027839,CA
-1249027840,1249027919,US
+1249027840,1249027895,US
+1249027896,1249027903,PL
+1249027904,1249027919,US
1249027920,1249027935,AU
1249027936,1249029119,US
1249029120,1249030143,CA
@@ -26245,9 +27453,7 @@
1254704384,1254704639,PH
1254704640,1254704903,US
1254704904,1254704911,PH
-1254704912,1254708927,US
-1254708928,1254708959,SG
-1254708960,1254713359,US
+1254704912,1254713359,US
1254713360,1254713407,CA
1254713408,1254725119,US
1254725120,1254725151,GB
@@ -26791,9 +27997,7 @@
1255042752,1255042783,CA
1255042784,1255047167,US
1255047168,1255055359,CA
-1255055360,1255055487,US
-1255055488,1255055503,CA
-1255055504,1255056063,US
+1255055360,1255056063,US
1255056064,1255056095,NL
1255056096,1255057887,US
1255057888,1255057919,NL
@@ -27447,7 +28651,9 @@
1279979008,1279979263,IN
1279979264,1279979327,US
1279979328,1279979391,IN
-1279979392,1279979559,US
+1279979392,1279979424,US
+1279979425,1279979425,IN
+1279979426,1279979559,US
1279979560,1279979575,CA
1279979576,1279979583,US
1279979584,1279980063,CA
@@ -27856,12 +29062,12 @@
1296466384,1296466399,NO
1296466400,1296466415,AO
1296466416,1296466431,NG
-1296466432,1296466439,TZ
-1296466440,1296466495,NO
+1296466432,1296466447,TZ
+1296466448,1296466495,NO
1296466496,1296466543,GN
1296466544,1296466559,NO
-1296466560,1296466583,NG
-1296466584,1296466623,NO
+1296466560,1296466575,NG
+1296466576,1296466623,NO
1296466624,1296466631,MR
1296466632,1296466639,NO
1296466640,1296466655,NG
@@ -27873,9 +29079,7 @@
1296466760,1296466767,SL
1296466768,1296466775,BF
1296466776,1296466783,GN
-1296466784,1296467711,NO
-1296467712,1296467967,NG
-1296467968,1296468479,NO
+1296466784,1296468479,NO
1296468480,1296469247,NG
1296469248,1296472351,NO
1296472352,1296472383,NG
@@ -27923,6 +29127,7 @@
1296613376,1296615423,IT
1296615424,1296617471,GB
1296617472,1296619519,ES
+1296619520,1296621567,DE
1296621568,1296623615,SE
1296623616,1296625663,BE
1296625664,1296629759,RU
@@ -28037,6 +29242,7 @@
1296756736,1296758783,FR
1296758784,1296760831,RS
1296760832,1296762879,GB
+1296762880,1296764927,RU
1296764928,1296769023,AT
1296769024,1296771071,TR
1296771072,1296773119,LT
@@ -28278,7 +29484,9 @@
1299016960,1299017215,NL
1299017216,1299017727,RU
1299017728,1299021823,BE
-1299021824,1299024559,CH
+1299021824,1299023879,CH
+1299023880,1299023887,DE
+1299023888,1299024559,CH
1299024560,1299024575,DE
1299024576,1299026111,CH
1299026112,1299026127,ES
@@ -28311,7 +29519,9 @@
1305477120,1305739263,ES
1305739264,1306001407,DK
1306001408,1306132479,RU
-1306132480,1306263551,SE
+1306132480,1306198015,SE
+1306198016,1306206207,LV
+1306206208,1306263551,SE
1306263552,1306271743,KE
1306271744,1306279935,RU
1306279936,1306286079,IT
@@ -28471,6 +29681,7 @@
1307701248,1307709439,RU
1307709440,1307713535,AL
1307713536,1307717631,IT
+1307717632,1307721727,GE
1307721728,1307725823,AT
1307725824,1307729919,CZ
1307729920,1307734015,RU
@@ -28492,8 +29703,8 @@
1307756912,1307757063,GB
1307757064,1307757071,US
1307757072,1307757183,GB
-1307757184,1307757247,US
-1307757248,1307758591,GB
+1307757184,1307757279,US
+1307757280,1307758591,GB
1307758592,1307762687,SM
1307762688,1307766783,PL
1307766784,1307770879,GB
@@ -28646,7 +29857,9 @@
1310214144,1310216191,UA
1310216192,1310218239,IT
1310218240,1310220287,NO
-1310220288,1310222335,NL
+1310220288,1310221311,NL
+1310221312,1310221567,MK
+1310221568,1310222335,NL
1310222336,1310224383,RS
1310224384,1310226431,GB
1310226432,1310228479,BE
@@ -28968,7 +30181,7 @@
1311367888,1311367895,DE
1311367896,1311367903,NG
1311367904,1311367927,A2
-1311367928,1311367935,IR
+1311367928,1311367935,DE
1311367936,1311367967,BJ
1311367968,1311367999,ET
1311368000,1311368015,A2
@@ -29188,22 +30401,7 @@
1315885056,1315889151,CZ
1315889152,1315893247,DE
1315893248,1315897343,RU
-1315897344,1315897855,IR
-1315897856,1315897863,AE
-1315897864,1315897951,IR
-1315897952,1315897991,AE
-1315897992,1315897999,IR
-1315898000,1315898015,AE
-1315898016,1315898031,IR
-1315898032,1315898111,AE
-1315898112,1315900671,IR
-1315900672,1315900735,AE
-1315900736,1315900799,IR
-1315900800,1315900927,AE
-1315900928,1315901223,IR
-1315901224,1315901247,AE
-1315901248,1315901279,IR
-1315901280,1315901439,AE
+1315897344,1315901439,IR
1315901440,1315905535,UA
1315905536,1315907583,BA
1315907584,1315908095,SI
@@ -29363,8 +30561,8 @@
1317667776,1317667783,US
1317667784,1317667799,NG
1317667800,1317667807,A2
-1317667808,1317667823,NG
-1317667824,1317668095,A2
+1317667808,1317667815,NG
+1317667816,1317668095,A2
1317668096,1317668103,GH
1317668104,1317668111,ZM
1317668112,1317668143,A2
@@ -29494,8 +30692,8 @@
1317670648,1317670655,NG
1317670656,1317670663,AO
1317670664,1317670679,A2
-1317670680,1317670703,NG
-1317670704,1317670711,A2
+1317670680,1317670695,NG
+1317670696,1317670711,A2
1317670712,1317670719,GH
1317670720,1317670727,A2
1317670728,1317670735,GH
@@ -29726,14 +30924,10 @@
1317675056,1317675063,NG
1317675064,1317675071,AO
1317675072,1317675095,NG
-1317675096,1317675103,A2
-1317675104,1317675111,CD
-1317675112,1317675183,A2
+1317675096,1317675183,A2
1317675184,1317675199,CM
1317675200,1317675215,NG
-1317675216,1317675231,A2
-1317675232,1317675239,LR
-1317675240,1317675247,A2
+1317675216,1317675247,A2
1317675248,1317675255,AO
1317675256,1317675271,A2
1317675272,1317675279,NG
@@ -29795,8 +30989,7 @@
1317675928,1317675943,A2
1317675944,1317675951,GB
1317675952,1317675975,NG
-1317675976,1317675983,A2
-1317675984,1317675991,LR
+1317675976,1317675991,A2
1317675992,1317675999,NG
1317676000,1317676007,GN
1317676008,1317676015,GH
@@ -29804,7 +30997,8 @@
1317676024,1317676031,GQ
1317676032,1317676039,NG
1317676040,1317676047,CD
-1317676048,1317676063,A2
+1317676048,1317676055,A2
+1317676056,1317676063,NG
1317676064,1317676071,CM
1317676072,1317676079,A2
1317676080,1317676087,AO
@@ -29821,15 +31015,15 @@
1317676168,1317676175,ML
1317676176,1317676191,A2
1317676192,1317676207,SD
-1317676208,1317676223,A2
-1317676224,1317676231,AO
+1317676208,1317676231,A2
1317676232,1317676239,NG
1317676240,1317676247,SD
1317676248,1317676255,NG
1317676256,1317676263,CD
1317676264,1317676271,NG
1317676272,1317676287,A2
-1317676288,1317676551,LR
+1317676288,1317676543,LR
+1317676544,1317676551,A2
1317676552,1317676559,AO
1317676560,1317676567,NG
1317676568,1317676575,LR
@@ -29846,8 +31040,7 @@
1317676688,1317676695,LR
1317676696,1317676711,A2
1317676712,1317676719,NG
-1317676720,1317676727,GQ
-1317676728,1317676751,A2
+1317676720,1317676751,A2
1317676752,1317676759,ML
1317676760,1317676767,LR
1317676768,1317676775,A2
@@ -29879,7 +31072,9 @@
1317677080,1317677087,SD
1317677088,1317677095,A2
1317677096,1317677103,BF
-1317677104,1317677143,A2
+1317677104,1317677127,A2
+1317677128,1317677135,NG
+1317677136,1317677143,A2
1317677144,1317677151,SD
1317677152,1317677191,A2
1317677192,1317677199,SD
@@ -29923,8 +31118,7 @@
1317677840,1317677847,LR
1317677848,1317677855,NG
1317677856,1317677863,BF
-1317677864,1317677871,CM
-1317677872,1317677895,A2
+1317677864,1317677895,A2
1317677896,1317677903,GN
1317677904,1317678007,A2
1317678008,1317678015,NG
@@ -29934,7 +31128,9 @@
1317678080,1317678095,NG
1317678096,1317678103,GQ
1317678104,1317678111,BE
-1317678112,1317678143,A2
+1317678112,1317678127,A2
+1317678128,1317678135,SD
+1317678136,1317678143,NG
1317678144,1317678151,CD
1317678152,1317678159,NG
1317678160,1317678167,GQ
@@ -29943,8 +31139,7 @@
1317678184,1317678191,NG
1317678192,1317678199,A2
1317678200,1317678207,CD
-1317678208,1317678215,NG
-1317678216,1317678231,A2
+1317678208,1317678231,A2
1317678232,1317678239,BF
1317678240,1317678271,A2
1317678272,1317678287,NG
@@ -29966,15 +31161,16 @@
1317678456,1317678463,CD
1317678464,1317678471,NG
1317678472,1317678479,AO
-1317678480,1317678487,A2
-1317678488,1317678495,NG
-1317678496,1317678519,A2
-1317678520,1317678527,NG
+1317678480,1317678487,CD
+1317678488,1317678495,ML
+1317678496,1317678511,A2
+1317678512,1317678527,NG
1317678528,1317678543,A2
1317678544,1317678551,CD
1317678552,1317678559,A2
1317678560,1317678567,NG
-1317678568,1317679615,A2
+1317678568,1317678575,CD
+1317678576,1317679615,A2
1317679616,1317679631,AO
1317679632,1317679639,A2
1317679640,1317679647,ZW
@@ -29987,14 +31183,13 @@
1317679704,1317679719,NG
1317679720,1317679727,A2
1317679728,1317679735,GN
-1317679736,1317679743,A2
+1317679736,1317679743,NG
1317679744,1317679751,AO
1317679752,1317679767,NG
1317679768,1317679775,A2
1317679776,1317679799,NG
1317679800,1317679831,A2
-1317679832,1317679839,CD
-1317679840,1317679847,NG
+1317679832,1317679847,NG
1317679848,1317679855,A2
1317679856,1317679863,NG
1317679864,1317683199,A2
@@ -30004,16 +31199,13 @@
1317683864,1317683871,FR
1317683872,1317685503,DE
1317685504,1317685631,BE
-1317685632,1317686271,DE
-1317686272,1317686287,NL
-1317686288,1317686335,DE
+1317685632,1317686335,DE
1317686336,1317686399,NL
1317686400,1317695743,DE
1317695744,1317695999,CH
1317696000,1317698559,DE
1317698560,1317698687,NL
-1317698688,1317699071,DE
-1317699072,1317699583,CN
+1317698688,1317699583,DE
1317699584,1317715967,RU
1317715968,1317732351,SA
1317732352,1317748735,HU
@@ -30067,7 +31259,7 @@
1317843136,1317843199,CY
1317843200,1317843391,US
1317843392,1317843423,NL
-1317843424,1317843455,PA
+1317843424,1317843455,PR
1317843456,1317843519,NL
1317843520,1317843583,GI
1317843584,1317843967,NL
@@ -30083,8 +31275,8 @@
1317965048,1317965055,DE
1317965056,1317978111,AT
1317978112,1317994495,RU
-1317994496,1317996031,NL
-1317996032,1317996095,DE
+1317994496,1317995519,NL
+1317995520,1317996095,DE
1317996096,1317996287,NL
1317996288,1317997567,DE
1317997568,1317998591,NL
@@ -30100,8 +31292,8 @@
1318008000,1318008031,NL
1318008032,1318009423,DE
1318009424,1318009471,NL
-1318009472,1318010495,DE
-1318010496,1318010879,NL
+1318009472,1318010511,DE
+1318010512,1318010879,NL
1318010880,1318027263,DK
1318027264,1318043647,IE
1318043648,1318584319,GB
@@ -30140,10 +31332,10 @@
1318708624,1318708627,GB
1318708628,1318708639,FR
1318708640,1318708647,GB
-1318708648,1318708679,FR
-1318708680,1318708687,GB
-1318708688,1318708703,FR
-1318708704,1318708731,GB
+1318708648,1318708683,FR
+1318708684,1318708687,GB
+1318708688,1318708723,FR
+1318708724,1318708731,GB
1318708732,1318708735,FR
1318708736,1318708991,GB
1318708992,1318711647,FR
@@ -30209,15 +31401,14 @@
1319069777,1319069823,CN
1319069824,1319070217,DE
1319070218,1319070254,CN
-1319070255,1319070271,GB
+1319070255,1319070271,DE
1319070272,1319070335,PT
1319070336,1319070463,RU
1319070464,1319070975,DE
1319070976,1319071103,PL
1319071104,1319071231,RU
1319071232,1319071487,PL
-1319071488,1319072767,DE
-1319072768,1319073023,IT
+1319071488,1319073023,DE
1319073024,1319073279,TR
1319073280,1319074303,DE
1319074304,1319074559,HK
@@ -30244,7 +31435,9 @@
1331757056,1331822591,IE
1331822592,1331824639,IT
1331824640,1331826687,RU
-1331826688,1331828735,FR
+1331826688,1331828607,FR
+1331828608,1331828615,BE
+1331828616,1331828735,FR
1331828736,1331830783,LT
1331830784,1331831335,GB
1331831336,1331831343,IE
@@ -30318,7 +31511,9 @@
1331938840,1331938847,IE
1331938848,1331938879,GB
1331938880,1331938895,NG
-1331938896,1331939327,GB
+1331938896,1331938943,GB
+1331938944,1331938958,US
+1331938959,1331939327,GB
1331939328,1331941375,BE
1331941376,1331943423,ES
1331943424,1331945471,RU
@@ -30506,7 +31701,9 @@
1334710272,1334714367,RU
1334714368,1334718463,DE
1334718464,1334722559,KZ
-1334722560,1334726655,NL
+1334722560,1334725631,NL
+1334725632,1334726143,SE
+1334726144,1334726655,NL
1334726656,1334729983,RU
1334729984,1334730431,KZ
1334730432,1334730439,RU
@@ -30521,10 +31718,8 @@
1334730544,1334730579,KZ
1334730580,1334730583,RU
1334730584,1334730667,KZ
-1334730668,1334730687,RU
-1334730688,1334730699,KZ
-1334730700,1334730703,RU
-1334730704,1334730751,KZ
+1334730668,1334730679,RU
+1334730680,1334730751,KZ
1334730752,1334734847,RU
1334734848,1334738943,LT
1334738944,1334743039,CH
@@ -30725,7 +31920,9 @@
1346371584,1346375679,FI
1346375680,1346379775,RU
1346379776,1346383871,ES
-1346383872,1346387967,GB
+1346383872,1346386719,GB
+1346386720,1346386727,SE
+1346386728,1346387967,GB
1346387968,1346392063,HU
1346392064,1346396159,UA
1346396160,1346400255,RU
@@ -30763,16 +31960,12 @@
1346500640,1346500735,IM
1346500736,1346500767,GB
1346500768,1346500863,IM
-1346500864,1346501119,GB
-1346501120,1346501135,IM
-1346501136,1346501231,GB
+1346500864,1346501231,GB
1346501232,1346501247,IM
1346501248,1346501343,GB
1346501344,1346501375,IM
1346501376,1346501695,GB
-1346501696,1346501727,IM
-1346501728,1346501743,GB
-1346501744,1346501759,IM
+1346501696,1346501759,IM
1346501760,1346501795,GB
1346501796,1346501799,IM
1346501800,1346501807,GB
@@ -30862,15 +32055,20 @@
1346703432,1346703435,US
1346703436,1346703483,GB
1346703484,1346703487,US
-1346703488,1346703871,GB
+1346703488,1346703503,GB
+1346703504,1346703511,US
+1346703512,1346703871,GB
1346703872,1346704127,LI
1346704128,1346704383,GB
1346704384,1346704447,US
1346704448,1346704479,GB
1346704480,1346704511,US
-1346704512,1346704639,GB
+1346704512,1346704575,GB
+1346704576,1346704639,US
1346704640,1346704767,LI
-1346704768,1346707455,GB
+1346704768,1346705247,GB
+1346705248,1346705279,US
+1346705280,1346707455,GB
1346707456,1346711551,DE
1346711552,1346715647,AZ
1346715648,1346723839,NL
@@ -31026,7 +32224,9 @@
1347229312,1347229343,AT
1347229344,1347229895,DE
1347229896,1347229903,GR
-1347229904,1347231071,DE
+1347229904,1347230975,DE
+1347230976,1347230983,ES
+1347230984,1347231071,DE
1347231072,1347231087,AT
1347231088,1347231095,GR
1347231096,1347231743,DE
@@ -31179,7 +32379,9 @@
1347386560,1347386567,RU
1347386568,1347386751,EE
1347386752,1347386815,MY
-1347386816,1347387215,EE
+1347386816,1347387011,EE
+1347387012,1347387015,DE
+1347387016,1347387215,EE
1347387216,1347387219,DE
1347387220,1347387224,EE
1347387225,1347387228,DE
@@ -31213,11 +32415,7 @@
1347440640,1347444735,ES
1347444736,1347452927,RU
1347452928,1347461119,BG
-1347461120,1347461671,AL
-1347461672,1347461679,RS
-1347461680,1347462023,AL
-1347462024,1347462031,RS
-1347462032,1347462579,AL
+1347461120,1347462579,AL
1347462580,1347462583,RS
1347462584,1347462591,AL
1347462592,1347462607,RS
@@ -31330,7 +32528,7 @@
1347754936,1347754943,RS
1347754944,1347754951,CY
1347754952,1347754959,TN
-1347754960,1347754967,MA
+1347754960,1347754967,CY
1347754968,1347754983,GR
1347754984,1347754991,CY
1347754992,1347755112,GR
@@ -31392,8 +32590,8 @@
1347856096,1347856239,DE
1347856240,1347856255,EU
1347856256,1347856383,DE
-1347856384,1347856391,EU
-1347856392,1347856431,DE
+1347856384,1347856399,EU
+1347856400,1347856431,DE
1347856432,1347856447,EU
1347856448,1347856639,DE
1347856640,1347856895,AT
@@ -31797,7 +32995,11 @@
1352149428,1352149451,FR
1352149452,1352149455,DE
1352149456,1352149487,FR
-1352149488,1352277535,DE
+1352149488,1352149743,DE
+1352149744,1352149751,AT
+1352149752,1352149783,DE
+1352149784,1352149791,SE
+1352149792,1352277535,DE
1352277536,1352277567,IT
1352277568,1352287399,DE
1352287400,1352287407,NL
@@ -31808,7 +33010,9 @@
1352404608,1352445687,DE
1352445688,1352445703,NL
1352445704,1352663039,DE
-1352663040,1353187327,DK
+1352663040,1353182591,DK
+1353182592,1353182599,DE
+1353182600,1353187327,DK
1353187328,1353252991,GB
1353252992,1353253023,FR
1353253024,1353253663,GB
@@ -31825,7 +33029,7 @@
1353257984,1353258247,SE
1353258248,1353258255,GB
1353258256,1353258263,SE
-1353258264,1353258271,DK
+1353258264,1353258271,NO
1353258272,1353258303,SE
1353258304,1353258367,FI
1353258368,1353258415,SE
@@ -31848,7 +33052,9 @@
1353266976,1353267455,GB
1353267456,1353268223,IE
1353268224,1353268479,GB
-1353268480,1353269247,BE
+1353268480,1353268575,BE
+1353268576,1353268583,GB
+1353268584,1353269247,BE
1353269248,1353270527,GB
1353270528,1353270783,IE
1353270784,1353271295,GB
@@ -31892,12 +33098,16 @@
1353280120,1353280127,GB
1353280128,1353280143,IT
1353280144,1353280151,GB
-1353280152,1353280663,IT
+1353280152,1353280287,IT
+1353280288,1353280295,GB
+1353280296,1353280663,IT
1353280664,1353280679,GB
1353280680,1353281023,IT
1353281024,1353281535,BE
1353281536,1353282047,GB
-1353282048,1353282559,IT
+1353282048,1353282159,IT
+1353282160,1353282167,GB
+1353282168,1353282559,IT
1353282560,1353283071,GB
1353283072,1353283327,IT
1353283328,1353287327,GB
@@ -31994,7 +33204,9 @@
1353310336,1353310463,GB
1353310464,1353310479,ES
1353310480,1353310487,GB
-1353310488,1353310599,ES
+1353310488,1353310559,ES
+1353310560,1353310575,GB
+1353310576,1353310599,ES
1353310600,1353310607,DE
1353310608,1353310719,ES
1353310720,1353311175,IT
@@ -32075,7 +33287,9 @@
1354664760,1354664767,IT
1354664768,1354665215,DE
1354665216,1354665247,ES
-1354665248,1354665943,DE
+1354665248,1354665923,DE
+1354665924,1354665927,AT
+1354665928,1354665943,DE
1354665944,1354665951,IT
1354665952,1354666639,DE
1354666640,1354666650,FI
@@ -32194,7 +33408,7 @@
1357321008,1357321015,GB
1357321016,1357321023,DK
1357321024,1357321087,KE
-1357321088,1357321215,EU
+1357321088,1357321215,HK
1357321216,1357321471,GB
1357321472,1357321503,ES
1357321504,1357321727,EU
@@ -32281,7 +33495,7 @@
1357366528,1357366591,BE
1357366592,1357366655,FR
1357366656,1357366719,PT
-1357366720,1357366783,EU
+1357366720,1357366783,GB
1357366784,1357366799,MD
1357366800,1357366815,ES
1357366816,1357366847,FR
@@ -32359,7 +33573,8 @@
1357876344,1357876383,EU
1357876384,1357876391,RU
1357876392,1357876399,PL
-1357876400,1357876415,EU
+1357876400,1357876407,DE
+1357876408,1357876415,EU
1357876416,1357876479,PL
1357876480,1357876495,SE
1357876496,1357876543,EU
@@ -32368,7 +33583,15 @@
1357876928,1357877335,DE
1357877336,1357877343,EU
1357877344,1357877759,DE
-1357877760,1357878783,EU
+1357877760,1357878271,EU
+1357878272,1357878335,CH
+1357878336,1357878399,CZ
+1357878400,1357878463,NL
+1357878464,1357878527,NO
+1357878528,1357878591,AT
+1357878592,1357878655,PL
+1357878656,1357878719,DE
+1357878720,1357878783,EU
1357878784,1357879807,DE
1357879808,1357879871,RU
1357879872,1357879935,DE
@@ -32391,12 +33614,14 @@
1357883584,1357883727,FR
1357883728,1357883759,EU
1357883760,1357883775,FR
-1357883776,1357883839,EU
+1357883776,1357883807,RU
+1357883808,1357883839,EU
1357883840,1357883903,FR
1357883904,1357883999,EU
1357884000,1357884031,FR
1357884032,1357884095,RU
-1357884096,1357884415,EU
+1357884096,1357884159,EU
+1357884160,1357884415,GB
1357884416,1357884423,FR
1357884424,1357884427,BE
1357884428,1357884431,EU
@@ -32417,9 +33642,7 @@
1357885952,1357886463,FR
1357886464,1357887487,US
1357887488,1357888511,FR
-1357888512,1357888703,DE
-1357888704,1357888767,EU
-1357888768,1357889023,DE
+1357888512,1357889023,DE
1357889024,1357889535,GB
1357889536,1357890815,PL
1357890816,1357890827,NL
@@ -32435,10 +33658,20 @@
1357891584,1357891647,EU
1357891648,1357891679,NL
1357891680,1357891711,GB
-1357891712,1357891839,EU
+1357891712,1357891839,FI
1357891840,1357892095,GB
-1357892096,1357892223,IE
-1357892224,1357892351,EU
+1357892096,1357892111,DE
+1357892112,1357892127,ES
+1357892128,1357892143,FR
+1357892144,1357892159,IT
+1357892160,1357892175,GB
+1357892176,1357892183,AR
+1357892184,1357892191,AU
+1357892192,1357892199,BR
+1357892200,1357892207,NL
+1357892208,1357892215,SE
+1357892216,1357892223,US
+1357892224,1357892351,FI
1357892352,1357893119,NL
1357893120,1357893375,SE
1357893376,1357893407,EU
@@ -32478,7 +33711,8 @@
1357903872,1357904383,EU
1357904384,1357904895,DE
1357904896,1357905407,GB
-1357905408,1357905919,EU
+1357905408,1357905663,FR
+1357905664,1357905919,NL
1357905920,1357910015,LT
1357910016,1357914111,GR
1357914112,1357922303,RU
@@ -32551,9 +33785,7 @@
1358020608,1358028799,DE
1358028800,1358032895,IT
1358032896,1358036991,GE
-1358036992,1358039039,IR
-1358039040,1358040831,SK
-1358040832,1358041087,IR
+1358036992,1358041087,IR
1358041088,1358045183,FI
1358045184,1358049279,SK
1358049280,1358061567,RU
@@ -32605,14 +33837,22 @@
1358223360,1358223631,GB
1358223632,1358223663,DE
1358223664,1358223671,GB
-1358223672,1358223719,DE
+1358223672,1358223687,DE
+1358223688,1358223695,GB
+1358223696,1358223719,DE
1358223720,1358223783,GB
-1358223784,1358223843,DE
+1358223784,1358223791,DE
+1358223792,1358223799,GB
+1358223800,1358223843,DE
1358223844,1358223871,GB
1358223872,1358223887,NL
-1358223888,1358223911,DE
+1358223888,1358223895,DE
+1358223896,1358223903,NL
+1358223904,1358223911,DE
1358223912,1358223927,NL
-1358223928,1358223975,DE
+1358223928,1358223935,DE
+1358223936,1358223939,NL
+1358223940,1358223975,DE
1358223976,1358223991,NL
1358223992,1358223999,DE
1358224000,1358224079,NL
@@ -32621,14 +33861,21 @@
1358224520,1358224611,DE
1358224612,1358224651,BE
1358224652,1358224655,DE
-1358224656,1358224719,BE
-1358224720,1358224959,DE
+1358224656,1358224727,BE
+1358224728,1358224959,DE
1358224960,1358225127,IT
-1358225128,1358225407,DE
+1358225128,1358225135,DE
+1358225136,1358225143,IT
+1358225144,1358225151,DE
+1358225152,1358225183,IT
+1358225184,1358225191,DE
+1358225192,1358225199,IT
+1358225200,1358225407,DE
1358225408,1358229503,RU
1358229504,1358230111,DE
1358230112,1358230115,AT
-1358230116,1358230383,DE
+1358230116,1358230119,ES
+1358230120,1358230383,DE
1358230384,1358230391,TR
1358230392,1358230399,CH
1358230400,1358232863,DE
@@ -32834,8 +34081,10 @@
1358668368,1358668463,PT
1358668464,1358668479,ES
1358668480,1358668495,GB
-1358668496,1358668551,PT
-1358668552,1358668575,GB
+1358668496,1358668535,PT
+1358668536,1358668543,GB
+1358668544,1358668559,PT
+1358668560,1358668575,GB
1358668576,1358668799,PT
1358668800,1358668807,GB
1358668808,1358668927,PT
@@ -32854,13 +34103,17 @@
1358670016,1358670023,GB
1358670024,1358670183,PT
1358670184,1358670191,GB
-1358670192,1358671415,PT
+1358670192,1358670943,PT
+1358670944,1358670959,GB
+1358670960,1358671415,PT
1358671416,1358671423,GB
1358671424,1358671431,PT
1358671432,1358671439,GB
1358671440,1358671839,PT
1358671840,1358671855,ES
-1358671856,1358671967,PT
+1358671856,1358671871,PT
+1358671872,1358671903,GB
+1358671904,1358671967,PT
1358671968,1358671983,GB
1358671984,1358672479,PT
1358672480,1358672511,GB
@@ -32868,7 +34121,8 @@
1358672688,1358672703,GB
1358672704,1358673535,PT
1358673536,1358673567,US
-1358673568,1358673663,PT
+1358673568,1358673599,GB
+1358673600,1358673663,PT
1358673664,1358675967,GB
1358675968,1358676735,SE
1358676736,1358677759,DK
@@ -33141,7 +34395,6 @@
1359003648,1359020031,CZ
1359020032,1359036415,FR
1359036416,1359052799,GB
-1359052800,1359069183,SE
1359069184,1359101951,RU
1359101952,1359118335,GB
1359118336,1359118655,DE
@@ -33152,7 +34405,9 @@
1359120384,1359121407,DK
1359121408,1359123583,DE
1359123584,1359123711,SE
-1359123712,1359134303,DE
+1359123712,1359133311,DE
+1359133312,1359133439,AT
+1359133440,1359134303,DE
1359134304,1359134319,NL
1359134320,1359134719,DE
1359134720,1359150079,CZ
@@ -33211,8 +34466,8 @@
1359467488,1359467495,DE
1359467496,1359467647,US
1359467648,1359467775,DE
-1359467776,1359467815,US
-1359467816,1359467903,DE
+1359467776,1359467823,US
+1359467824,1359467903,DE
1359467904,1359468063,US
1359468064,1359468575,DE
1359468576,1359468583,SG
@@ -33491,7 +34746,9 @@
1360736256,1360740351,RU
1360740352,1360743679,GB
1360743680,1360743935,FR
-1360743936,1360752639,GB
+1360743936,1360749759,GB
+1360749760,1360749791,IM
+1360749792,1360752639,GB
1360752640,1360756735,DE
1360756736,1360760831,IT
1360760832,1360764927,RU
@@ -33536,14 +34793,12 @@
1360891648,1360891903,RU
1360891904,1360892427,CH
1360892428,1360892431,IT
-1360892432,1360892479,CH
-1360892480,1360892487,FR
-1360892488,1360892495,CH
-1360892496,1360892502,GB
-1360892503,1360892763,CH
-1360892764,1360892767,IT
-1360892768,1360892795,CH
-1360892796,1360892799,IT
+1360892432,1360892487,CH
+1360892488,1360892495,IT
+1360892496,1360892751,CH
+1360892752,1360892767,IT
+1360892768,1360892791,CH
+1360892792,1360892799,IT
1360892800,1360892807,CH
1360892808,1360892815,MR
1360892816,1360892927,CH
@@ -33566,9 +34821,7 @@
1360905392,1360905407,GB
1360905408,1360906687,IT
1360906688,1360906719,GB
-1360906720,1360907679,IT
-1360907680,1360907711,GB
-1360907712,1360909391,IT
+1360906720,1360909391,IT
1360909392,1360909407,GB
1360909408,1360910495,IT
1360910496,1360910511,GB
@@ -34130,7 +35383,8 @@
1364971520,1364975615,CZ
1364975616,1364979711,BJ
1364979712,1364982783,GB
-1364982784,1364983551,CH
+1364982784,1364983295,CH
+1364983296,1364983551,US
1364983552,1364983807,GB
1364983808,1364991999,DE
1364992000,1364996095,IT
@@ -34561,7 +35815,8 @@
1371799552,1371865087,RO
1371865088,1371930623,FI
1371930624,1371996159,LV
-1371996160,1371997183,A2
+1371996160,1371996415,NG
+1371996416,1371997183,A2
1371997184,1371997439,KE
1371997440,1371998207,NG
1371998208,1371998463,CD
@@ -34885,8 +36140,7 @@
1382187008,1382191871,ES
1382191872,1382192127,VE
1382192128,1382203391,ES
-1382203392,1382204479,NL
-1382204480,1382205439,GB
+1382203392,1382205439,GB
1382205440,1382205695,EU
1382205696,1382205951,DE
1382205952,1382207743,EU
@@ -34906,25 +36160,13 @@
1382212240,1382212607,EU
1382212608,1382212863,FR
1382212864,1382213631,EU
-1382213632,1382214079,NL
-1382214080,1382214111,GB
-1382214112,1382214879,NL
-1382214880,1382214895,GB
-1382214896,1382216831,NL
-1382216832,1382216895,GB
-1382216896,1382216959,NL
-1382216960,1382217215,GB
-1382217216,1382218399,NL
-1382218400,1382218447,GB
-1382218448,1382218455,NL
-1382218456,1382218495,GB
-1382218496,1382218623,NL
-1382218624,1382218751,GB
-1382218752,1382218815,NL
-1382218816,1382218911,GB
-1382218912,1382218959,NL
-1382218960,1382218991,GB
-1382218992,1382219775,NL
+1382213632,1382215679,GB
+1382215680,1382216447,NL
+1382216448,1382217727,GB
+1382217728,1382217983,NL
+1382217984,1382219007,GB
+1382219008,1382219519,NL
+1382219520,1382219775,GB
1382219776,1382223327,SE
1382223328,1382223359,FI
1382223360,1382223551,SE
@@ -35360,7 +36602,6 @@
1385480192,1385488383,NL
1385488384,1385496575,GB
1385496576,1385504767,SI
-1385504768,1385512959,GB
1385512960,1385521151,DE
1385521152,1385529343,AT
1385529344,1385537535,RU
@@ -35489,7 +36730,15 @@
1387790336,1388314623,IT
1388314624,1388322815,AT
1388322816,1388331007,SI
-1388331008,1388339199,NL
+1388331008,1388338176,NL
+1388338177,1388338178,FR
+1388338179,1388338180,GB
+1388338181,1388338182,DE
+1388338183,1388338186,NL
+1388338187,1388338188,IT
+1388338189,1388338190,NL
+1388338191,1388338192,PL
+1388338193,1388339199,NL
1388339200,1388347391,GB
1388347392,1388363775,DK
1388363776,1388371967,DE
@@ -35616,16 +36865,17 @@
1388699648,1388707839,SE
1388707840,1388708863,RU
1388708864,1388709119,LT
-1388709120,1388711679,RU
+1388709120,1388709375,IQ
+1388709376,1388709887,RU
+1388709888,1388710143,LB
+1388710144,1388711679,RU
1388711680,1388711935,IQ
1388711936,1388712191,RU
1388712192,1388712703,LT
1388712704,1388713215,LB
1388713216,1388713727,RU
1388713728,1388713983,LT
-1388713984,1388714239,LB
-1388714240,1388714495,LT
-1388714496,1388714751,RU
+1388713984,1388714751,RU
1388714752,1388715007,IQ
1388715008,1388715519,LT
1388715520,1388715775,LV
@@ -35702,7 +36952,9 @@
1388743444,1388743451,GB
1388743452,1388743555,IE
1388743556,1388743559,GB
-1388743560,1388743919,IE
+1388743560,1388743571,IE
+1388743572,1388743583,GB
+1388743584,1388743919,IE
1388743920,1388743935,GB
1388743936,1388744087,IE
1388744088,1388744095,GB
@@ -35772,7 +37024,11 @@
1388781568,1388789759,ES
1388789760,1388791519,NL
1388791520,1388791527,GB
-1388791528,1388796559,NL
+1388791528,1388794943,NL
+1388794944,1388794959,GB
+1388794960,1388795343,NL
+1388795344,1388795359,GB
+1388795360,1388796559,NL
1388796560,1388796575,GB
1388796576,1388796679,NL
1388796680,1388796687,GB
@@ -35830,7 +37086,9 @@
1389204800,1389204863,IQ
1389204864,1389204879,A2
1389204880,1389204895,IQ
-1389204896,1389205631,A2
+1389204896,1389205247,A2
+1389205248,1389205503,AF
+1389205504,1389205631,A2
1389205632,1389205759,DE
1389205760,1389205791,A2
1389205792,1389205935,IR
@@ -36217,14 +37475,16 @@
1389561408,1389561471,DE
1389561472,1389561599,IT
1389561600,1389562367,DE
-1389562368,1389562623,IT
-1389562624,1389562879,DE
-1389562880,1389563135,IT
+1389562368,1389563135,IT
1389563136,1389563391,DE
1389563392,1389563647,IT
1389563648,1389563903,DE
1389563904,1389564159,IT
-1389564160,1389576191,DE
+1389564160,1389564415,DE
+1389564416,1389564671,IT
+1389564672,1389565183,DE
+1389565184,1389565695,IT
+1389565696,1389576191,DE
1389576192,1389592575,GB
1389592576,1389608959,GE
1389608960,1389625343,DK
@@ -36236,8 +37496,9 @@
1389707264,1389723647,IT
1389723648,1389756415,ES
1389756416,1389772799,SE
-1389772800,1389779455,SI
-1389779456,1389780991,RS
+1389772800,1389778431,SI
+1389778432,1389778943,US
+1389778944,1389780991,RS
1389780992,1389782527,HR
1389782528,1389782543,SI
1389782544,1389782559,HR
@@ -36359,8 +37620,8 @@
1400111104,1400373247,NL
1400373248,1400705279,DE
1400705280,1400706047,EU
-1400706048,1400707071,DE
-1400707072,1400709119,EU
+1400706048,1400708095,DE
+1400708096,1400709119,EU
1400709120,1400710143,DE
1400710144,1400710399,EU
1400710400,1400712191,DE
@@ -36574,7 +37835,8 @@
1401745936,1401745959,SE
1401745960,1401745967,US
1401745968,1401745971,MY
-1401745972,1401745983,SE
+1401745972,1401745975,NL
+1401745976,1401745983,SE
1401745984,1401745999,NL
1401746000,1401746015,ES
1401746016,1401746019,GB
@@ -36706,7 +37968,9 @@
1401962496,1401978879,PL
1401978880,1401995263,PT
1401995264,1402011647,CH
-1402011648,1402028031,SE
+1402011648,1402027823,SE
+1402027824,1402027831,GB
+1402027832,1402028031,SE
1402028032,1402044415,FR
1402044416,1402060799,PL
1402060800,1402068159,FI
@@ -36960,7 +38224,8 @@
1404803072,1404804095,LV
1404804096,1404805119,SE
1404805120,1404813311,AT
-1404813312,1404829695,SE
+1404813312,1404815615,EE
+1404815616,1404829695,SE
1404829696,1404870655,RU
1404870656,1404872703,LT
1404872704,1404874751,SE
@@ -37073,9 +38338,7 @@
1406935040,1406951423,RU
1406951424,1406959615,PL
1406959616,1406964287,DE
-1406964288,1406964319,NL
-1406964320,1406964327,DE
-1406964328,1406964351,NL
+1406964288,1406964351,NL
1406964352,1406964735,DE
1406964736,1406964927,US
1406964928,1406967295,DE
@@ -37162,7 +38425,8 @@
1407518016,1407518031,ZA
1407518032,1407518039,A2
1407518040,1407518047,CD
-1407518048,1407518063,NG
+1407518048,1407518055,A2
+1407518056,1407518063,NG
1407518064,1407518079,A2
1407518080,1407518111,LR
1407518112,1407518127,NG
@@ -37309,7 +38573,7 @@
1407520744,1407520751,NG
1407520752,1407520759,A2
1407520760,1407520767,CD
-1407520768,1407520775,ZW
+1407520768,1407520775,TZ
1407520776,1407520783,CD
1407520784,1407520791,SD
1407520792,1407520799,ZA
@@ -37401,8 +38665,8 @@
1407522584,1407522591,GL
1407522592,1407522599,A2
1407522600,1407522607,ZM
-1407522608,1407522615,A2
-1407522616,1407522631,NG
+1407522608,1407522623,A2
+1407522624,1407522631,NG
1407522632,1407522639,MW
1407522640,1407522647,GQ
1407522648,1407522655,NG
@@ -37427,7 +38691,9 @@
1407522816,1407522823,CD
1407522824,1407522831,NG
1407522832,1407522839,MZ
-1407522840,1407522871,A2
+1407522840,1407522855,A2
+1407522856,1407522863,ZW
+1407522864,1407522871,A2
1407522872,1407522879,IQ
1407522880,1407522903,A2
1407522904,1407522911,KE
@@ -37449,7 +38715,7 @@
1407523136,1407523143,BJ
1407523144,1407523159,A2
1407523160,1407523167,LR
-1407523168,1407523183,UG
+1407523168,1407523183,A2
1407523184,1407523191,NG
1407523192,1407523199,A2
1407523200,1407523207,NG
@@ -37485,7 +38751,8 @@
1407524640,1407524647,A2
1407524648,1407524655,CD
1407524656,1407524663,NG
-1407524664,1407524679,A2
+1407524664,1407524671,CD
+1407524672,1407524679,A2
1407524680,1407524687,LR
1407524688,1407524703,MZ
1407524704,1407524727,A2
@@ -37502,8 +38769,7 @@
1407524856,1407524863,CD
1407524864,1407524895,A2
1407524896,1407524903,LR
-1407524904,1407524911,NG
-1407524912,1407524935,A2
+1407524904,1407524935,A2
1407524936,1407524943,GR
1407524944,1407524951,A2
1407524952,1407524959,CM
@@ -37551,7 +38817,8 @@
1407525400,1407525407,KE
1407525408,1407525471,A2
1407525472,1407525479,UG
-1407525480,1407525543,A2
+1407525480,1407525487,CD
+1407525488,1407525543,A2
1407525544,1407525551,KE
1407525552,1407525583,A2
1407525584,1407525591,GL
@@ -37677,9 +38944,9 @@
1407535776,1407535783,GN
1407535784,1407535815,A2
1407535816,1407535823,NG
-1407535824,1407535839,GB
-1407535840,1407535847,NG
-1407535848,1407535855,A2
+1407535824,1407535831,GB
+1407535832,1407535847,A2
+1407535848,1407535855,CD
1407535856,1407535863,NG
1407535864,1407536127,A2
1407536128,1407536639,GA
@@ -37708,15 +38975,15 @@
1407537184,1407537191,NG
1407537192,1407537207,A2
1407537208,1407537215,BE
-1407537216,1407537231,A2
-1407537232,1407537255,NG
+1407537216,1407537239,A2
+1407537240,1407537255,NG
1407537256,1407537287,A2
1407537288,1407537295,NG
1407537296,1407537303,UG
1407537304,1407537319,A2
1407537320,1407537327,NG
-1407537328,1407537335,A2
-1407537336,1407537351,NG
+1407537328,1407537343,A2
+1407537344,1407537351,NG
1407537352,1407537367,A2
1407537368,1407537383,NG
1407537384,1407537399,A2
@@ -37841,7 +39108,8 @@
1407539768,1407539775,GR
1407539776,1407539783,A2
1407539784,1407539791,GR
-1407539792,1407539831,A2
+1407539792,1407539799,NG
+1407539800,1407539831,A2
1407539832,1407539839,NG
1407539840,1407539863,A2
1407539864,1407539879,NG
@@ -37965,8 +39233,10 @@
1407549440,1407582207,RU
1407582208,1407614975,PL
1407614976,1407680511,ES
-1407680512,1407680575,FR
-1407680576,1407681279,GB
+1407680512,1407680591,FR
+1407680592,1407680607,GB
+1407680608,1407680623,FR
+1407680624,1407681279,GB
1407681280,1407681287,ES
1407681288,1407681343,GB
1407681344,1407681407,ES
@@ -38451,15 +39721,18 @@
1410748416,1410752511,DE
1410752512,1410752703,AQ
1410752704,1410752763,DE
-1410752764,1410752785,AQ
-1410752786,1410752799,DE
+1410752764,1410752787,AQ
+1410752788,1410752799,DE
1410752800,1410752827,AQ
-1410752828,1410753023,DE
+1410752828,1410752831,DE
+1410752832,1410752835,AQ
+1410752836,1410753023,DE
1410753024,1410753031,AQ
1410753032,1410753055,BS
1410753056,1410753143,AQ
1410753144,1410753151,SC
-1410753152,1410753159,DE
+1410753152,1410753155,AQ
+1410753156,1410753159,DE
1410753160,1410753167,AQ
1410753168,1410753303,DE
1410753304,1410753327,AQ
@@ -38483,16 +39756,12 @@
1410756736,1410756863,DE
1410756864,1410757119,AQ
1410757120,1410758655,DE
-1410758656,1410760191,AQ
-1410760192,1410760455,DE
+1410758656,1410759679,AQ
+1410759680,1410760455,DE
1410760456,1410760471,AQ
-1410760472,1410760479,SC
-1410760480,1410760487,DE
+1410760472,1410760487,DE
1410760488,1410760503,AQ
-1410760504,1410760683,DE
-1410760684,1410760687,AQ
-1410760688,1410760699,DE
-1410760700,1410760703,AQ
+1410760504,1410760703,DE
1410760704,1410768895,RU
1410768896,1410777087,GB
1410777088,1410785279,RU
@@ -38613,7 +39882,9 @@
1411999800,1411999807,SI
1411999808,1411999847,BA
1411999848,1411999871,SI
-1411999872,1412000767,BA
+1411999872,1411999887,BA
+1411999888,1411999999,SI
+1412000000,1412000767,BA
1412000768,1412000783,SI
1412000784,1412000791,BA
1412000792,1412000863,SI
@@ -38860,7 +40131,7 @@
1424595456,1424595527,IT
1424595528,1424595535,GB
1424595536,1424595575,IT
-1424595576,1424595583,ES
+1424595576,1424595583,GB
1424595584,1424595819,IT
1424595820,1424595823,GB
1424595824,1424595831,IT
@@ -38868,9 +40139,7 @@
1424595840,1424595903,IT
1424595904,1424595935,GB
1424595936,1424596479,IT
-1424596480,1424596563,FR
-1424596564,1424596567,GB
-1424596568,1424596991,FR
+1424596480,1424596991,FR
1424596992,1424597255,CZ
1424597256,1424597263,GB
1424597264,1424597311,CZ
@@ -38893,7 +40162,9 @@
1424599876,1424599879,GB
1424599880,1424599887,HU
1424599888,1424599903,GB
-1424599904,1424599951,HU
+1424599904,1424599935,HU
+1424599936,1424599943,GB
+1424599944,1424599951,HU
1424599952,1424599999,GB
1424600000,1424600031,HU
1424600032,1424600063,GB
@@ -38963,7 +40234,9 @@
1424608128,1424608279,GB
1424608280,1424608383,FR
1424608384,1424608399,ES
-1424608400,1424608511,FR
+1424608400,1424608407,FR
+1424608408,1424608415,GB
+1424608416,1424608511,FR
1424608512,1424608687,ES
1424608688,1424608695,GB
1424608696,1424609023,ES
@@ -39013,8 +40286,7 @@
1424616192,1424616447,IT
1424616448,1424616483,ES
1424616484,1424616487,GB
-1424616488,1424616607,ES
-1424616608,1424616615,PT
+1424616488,1424616615,ES
1424616616,1424616623,GB
1424616624,1424616655,ES
1424616656,1424616659,GB
@@ -39184,9 +40456,7 @@
1425448960,1425451007,CZ
1425451008,1425457855,GB
1425457856,1425457919,US
-1425457920,1425458271,GB
-1425458272,1425458303,US
-1425458304,1425459199,GB
+1425457920,1425459199,GB
1425459200,1425460735,IM
1425460736,1425460767,GB
1425460768,1425460863,IM
@@ -39490,7 +40760,9 @@
1426731008,1426735103,HR
1426735104,1426751487,BE
1426751488,1426767871,FR
-1426767872,1426784255,DE
+1426767872,1426778991,DE
+1426778992,1426778999,IT
+1426779000,1426784255,DE
1426784256,1426800639,SE
1426800640,1426817023,PL
1426817024,1426833407,BG
@@ -39528,7 +40800,9 @@
1426915328,1426931711,AT
1426931712,1426948095,CZ
1426948096,1426964479,DE
-1426964480,1426967455,GB
+1426964480,1426967287,GB
+1426967288,1426967295,ES
+1426967296,1426967455,GB
1426967456,1426967463,ES
1426967464,1426967567,GB
1426967568,1426967575,ES
@@ -39568,11 +40842,7 @@
1427032736,1427032743,AT
1427032744,1427032959,DE
1427032960,1427032967,NL
-1427032968,1427033247,DE
-1427033248,1427033263,MZ
-1427033264,1427033287,DE
-1427033288,1427033295,SE
-1427033296,1427035391,DE
+1427032968,1427035391,DE
1427035392,1427035519,GB
1427035520,1427046399,DE
1427046400,1427062783,IR
@@ -39621,9 +40891,13 @@
1427742720,1427742751,IO
1427742752,1427742879,DE
1427742880,1427742911,TR
-1427742912,1427743039,DE
+1427742912,1427742975,DE
+1427742976,1427743007,RU
+1427743008,1427743039,US
1427743040,1427743071,BG
-1427743072,1427743231,DE
+1427743072,1427743103,CY
+1427743104,1427743199,DE
+1427743200,1427743231,TR
1427743232,1427743263,GR
1427743264,1427743327,DE
1427743328,1427743359,NL
@@ -39650,7 +40924,8 @@
1427744320,1427744351,DE
1427744352,1427744383,UA
1427744384,1427744415,PL
-1427744416,1427744639,DE
+1427744416,1427744447,UA
+1427744448,1427744639,DE
1427744640,1427744671,TR
1427744672,1427744703,DE
1427744704,1427744735,CA
@@ -39659,14 +40934,15 @@
1427744864,1427744927,TR
1427744928,1427744991,DE
1427744992,1427745023,DK
-1427745024,1427745087,DE
-1427745088,1427745119,RU
-1427745120,1427745151,DE
+1427745024,1427745055,BM
+1427745056,1427745151,DE
1427745152,1427745183,RO
1427745184,1427745215,CH
1427745216,1427745247,DE
1427745248,1427745279,TR
-1427745280,1427745503,DE
+1427745280,1427745439,DE
+1427745440,1427745471,US
+1427745472,1427745503,DE
1427745504,1427745535,RU
1427745536,1427745567,CN
1427745568,1427745599,RU
@@ -39683,15 +40959,16 @@
1427746112,1427746143,DE
1427746144,1427746175,GR
1427746176,1427746239,DE
-1427746240,1427746271,NL
+1427746240,1427746271,US
1427746272,1427747839,DE
1427747840,1427747871,FI
-1427747872,1427747903,IN
-1427747904,1427747967,DE
+1427747872,1427747967,DE
1427747968,1427747999,BG
1427748000,1427748063,DE
-1427748064,1427748095,NL
-1427748096,1427748447,DE
+1427748064,1427748095,US
+1427748096,1427748255,DE
+1427748256,1427748287,US
+1427748288,1427748447,DE
1427748448,1427748479,RU
1427748480,1427748511,TR
1427748512,1427748543,DE
@@ -39710,7 +40987,7 @@
1427750016,1427750079,DE
1427750080,1427750111,BG
1427750112,1427750239,DE
-1427750240,1427750271,NL
+1427750240,1427750271,US
1427750272,1427750303,DE
1427750304,1427750335,GB
1427750336,1427751167,DE
@@ -39718,8 +40995,7 @@
1427751424,1427759935,DE
1427759936,1427759967,HR
1427759968,1427760191,DE
-1427760192,1427760223,NL
-1427760224,1427760255,US
+1427760192,1427760255,US
1427760256,1427760319,BR
1427760320,1427760351,TR
1427760352,1427760383,RU
@@ -39737,9 +41013,10 @@
1427761120,1427761183,DE
1427761184,1427761215,IT
1427761216,1427761247,TR
-1427761248,1427761279,BR
+1427761248,1427761279,DE
1427761280,1427761311,RU
-1427761312,1427761375,DE
+1427761312,1427761343,DE
+1427761344,1427761375,CY
1427761376,1427761407,TW
1427761408,1427761503,DE
1427761504,1427761535,PL
@@ -39748,9 +41025,7 @@
1427761600,1427761631,EG
1427761632,1427767295,DE
1427767296,1427800063,BE
-1427800064,1427823615,RU
-1427823616,1427824639,KG
-1427824640,1427832831,RU
+1427800064,1427832831,RU
1427832832,1427865599,BE
1427865600,1427898367,DK
1427898368,1427914751,RU
@@ -39785,17 +41060,25 @@
1428142080,1428143263,DE
1428143264,1428143279,CH
1428143280,1428144127,DE
-1428144128,1428147595,FR
-1428147596,1428147711,GB
+1428144128,1428147343,FR
+1428147344,1428147351,GB
+1428147352,1428147595,FR
+1428147596,1428147615,GB
+1428147616,1428147639,FR
+1428147640,1428147711,GB
1428147712,1428147855,FR
1428147856,1428147871,US
1428147872,1428148175,FR
1428148176,1428148191,CH
1428148192,1428150487,FR
1428150488,1428150495,GB
-1428150496,1428150735,FR
+1428150496,1428150663,FR
+1428150664,1428150687,GB
+1428150688,1428150735,FR
1428150736,1428150751,GB
-1428150752,1428151007,FR
+1428150752,1428150863,FR
+1428150864,1428150911,GB
+1428150912,1428151007,FR
1428151008,1428151039,GB
1428151040,1428151231,FR
1428151232,1428151295,CH
@@ -39834,9 +41117,7 @@
1431865632,1431865647,ES
1431865648,1431865663,PT
1431865664,1431865679,ES
-1431865680,1431865711,PT
-1431865712,1431865719,ES
-1431865720,1431866447,PT
+1431865680,1431866447,PT
1431866448,1431866455,NL
1431866456,1431866479,PT
1431866480,1431866495,ES
@@ -39858,7 +41139,9 @@
1431979480,1431979487,GB
1431979488,1431980151,NL
1431980152,1431980159,US
-1431980160,1431980719,NL
+1431980160,1431980687,NL
+1431980688,1431980695,DE
+1431980696,1431980719,NL
1431980720,1431980727,SA
1431980728,1431986175,NL
1431986176,1431994367,RU
@@ -39914,8 +41197,8 @@
1432322048,1432338431,RU
1432338432,1432346623,FR
1432346624,1433403391,TR
-1433403392,1433406239,ES
-1433406240,1433406271,US
+1433403392,1433406255,ES
+1433406256,1433406271,US
1433406272,1433406431,ES
1433406432,1433406447,US
1433406448,1433407487,ES
@@ -39926,7 +41209,9 @@
1433411328,1433411343,ES
1433411344,1433411375,TR
1433411376,1433411407,US
-1433411408,1433411455,TR
+1433411408,1433411423,TR
+1433411424,1433411439,ES
+1433411440,1433411455,TR
1433411456,1433411519,US
1433411520,1433411583,ES
1433411584,1433419775,RU
@@ -40074,8 +41359,8 @@
1434583040,1434615807,BG
1434615808,1434648575,IL
1434648576,1434681343,FI
-1434681344,1434681855,DE
-1434681856,1434682111,MY
+1434681344,1434681983,DE
+1434681984,1434682111,NL
1434682112,1434682303,DE
1434682304,1434682367,NL
1434682368,1434683119,DE
@@ -40088,7 +41373,11 @@
1434686720,1434687231,NL
1434687232,1434687359,DE
1434687360,1434687487,NL
-1434687488,1434688207,DE
+1434687488,1434687647,DE
+1434687648,1434687679,NL
+1434687680,1434688031,DE
+1434688032,1434688063,NL
+1434688064,1434688207,DE
1434688208,1434688223,NL
1434688224,1434689887,DE
1434689888,1434689919,NL
@@ -40387,8 +41676,8 @@
1439457280,1439457791,GB
1439457792,1439462911,RO
1439462912,1439463167,GB
-1439463168,1439463679,RO
-1439463680,1439463935,GB
+1439463168,1439463423,RO
+1439463424,1439463935,GB
1439463936,1439464447,RO
1439464448,1439464703,GB
1439464704,1439466495,RO
@@ -40467,7 +41756,9 @@
1441300480,1441308671,LT
1441308672,1441316863,SE
1441316864,1441325055,MT
-1441325056,1441333247,PL
+1441325056,1441325759,PL
+1441325760,1441325775,US
+1441325776,1441333247,PL
1441333248,1441349631,DE
1441349632,1441357823,RU
1441357824,1441366015,AT
@@ -41727,9 +43018,15 @@
1449711360,1449711615,GB
1449711616,1449717759,RO
1449717760,1449718783,GB
-1449718784,1449767423,RO
+1449718784,1449719039,RO
+1449719040,1449719807,GB
+1449719808,1449756671,RO
+1449756672,1449758719,GB
+1449758720,1449767423,RO
1449767424,1449767679,GB
-1449767680,1449773055,RO
+1449767680,1449771775,RO
+1449771776,1449772031,GB
+1449772032,1449773055,RO
1449773056,1449774079,GB
1449774080,1449776383,RO
1449776384,1449776639,GB
@@ -41742,9 +43039,7 @@
1449784320,1449785343,RO
1449785344,1449786367,GB
1449786368,1449787391,RO
-1449787392,1449790207,GB
-1449790208,1449790719,RO
-1449790720,1449791487,GB
+1449787392,1449791487,GB
1449791488,1449795327,RO
1449795328,1449795583,GB
1449795584,1449808639,RO
@@ -41753,9 +43048,12 @@
1449823232,1449826303,GB
1449826304,1449827839,RO
1449827840,1449828095,GB
-1449828096,1449840639,RO
+1449828096,1449830655,RO
+1449830656,1449830911,GB
+1449830912,1449840639,RO
1449840640,1449852927,MD
-1449852928,1449859071,RO
+1449852928,1449854975,GB
+1449854976,1449859071,RO
1449859072,1449859583,GB
1449859584,1449859839,RO
1449859840,1449860095,GB
@@ -41763,11 +43061,9 @@
1449869312,1449870335,GB
1449870336,1449870847,RO
1449870848,1449871615,GB
-1449871616,1449879807,RO
-1449879808,1449880063,GB
-1449880064,1449880319,RO
-1449880320,1449881087,GB
-1449881088,1449895935,RO
+1449871616,1449879551,RO
+1449879552,1449881599,GB
+1449881600,1449895935,RO
1449895936,1449896191,GB
1449896192,1449896703,RO
1449896704,1449896959,GB
@@ -41776,8 +43072,8 @@
1449899264,1449899519,RO
1449899520,1449899775,GB
1449899776,1449904127,RO
-1449904128,1449908223,GB
-1449908224,1449918463,RO
+1449904128,1449910271,GB
+1449910272,1449918463,RO
1449918464,1449951231,JO
1449951232,1449983999,TR
1449984000,1449992191,NL
@@ -41906,9 +43202,7 @@
1467340960,1467340991,TR
1467340992,1467344639,GB
1467344640,1467344895,ZA
-1467344896,1467347903,GB
-1467347904,1467347935,SE
-1467347936,1467351039,GB
+1467344896,1467351039,GB
1467351040,1467367423,NO
1467367424,1467367615,DE
1467367616,1467367647,SE
@@ -41953,9 +43247,7 @@
1467466032,1467466111,NL
1467466112,1467466143,DE
1467466144,1467466175,NL
-1467466176,1467466191,DE
-1467466192,1467466207,NL
-1467466208,1467466215,DE
+1467466176,1467466215,DE
1467466216,1467466223,VG
1467466224,1467466239,NL
1467466240,1467466271,DE
@@ -41983,7 +43275,9 @@
1472259256,1472264799,IE
1472264800,1472264807,GB
1472264808,1472266239,IE
-1472266240,1472331775,DE
+1472266240,1472304610,DE
+1472304611,1472304611,A2
+1472304612,1472331775,DE
1472331776,1472397311,GB
1472397312,1472462847,NL
1472462848,1472528383,PT
@@ -42047,6 +43341,7 @@
1475133440,1475135487,CZ
1475135488,1475137535,CH
1475137536,1475139583,SE
+1475139584,1475141631,ES
1475141632,1475143679,FI
1475143680,1475145727,JO
1475145728,1475147775,ES
@@ -42074,7 +43369,9 @@
1475181536,1475181551,NL
1475181552,1475181855,DE
1475181856,1475181887,LU
-1475181888,1475184639,DE
+1475181888,1475182079,DE
+1475182080,1475182335,RO
+1475182336,1475184639,DE
1475184640,1475186687,RU
1475188736,1475190783,SE
1475190784,1475192831,GB
@@ -42199,7 +43496,8 @@
1475307520,1475309567,RU
1475309568,1475311615,LT
1475311616,1475313663,FI
-1475313664,1475317759,DE
+1475313664,1475315711,DE
+1475315712,1475317759,US
1475317760,1475319807,RU
1475319808,1475321855,BG
1475321856,1475323903,RO
@@ -42231,7 +43529,9 @@
1475543040,1475559423,RO
1475559424,1475562751,GR
1475562752,1475563007,BG
-1475563008,1475575807,GR
+1475563008,1475571711,GR
+1475571712,1475572735,BG
+1475572736,1475575807,GR
1475575808,1475592191,AT
1475592192,1475608575,GB
1475608576,1475624959,RU
@@ -42279,14 +43579,10 @@
1475639528,1475639543,JE
1475639544,1475639595,GB
1475639596,1475639599,JE
-1475639600,1475639727,GB
-1475639728,1475639735,JE
-1475639736,1475639807,GB
+1475639600,1475639807,GB
1475639808,1475641343,JE
1475641344,1475657727,UA
-1475657728,1475664263,SK
-1475664264,1475664271,UA
-1475664272,1475674111,SK
+1475657728,1475674111,SK
1475674112,1475690495,DE
1475690496,1475706879,CH
1475706880,1475723263,RU
@@ -42680,7 +43976,13 @@
1489731584,1489764351,BG
1489764352,1489797119,RU
1489797120,1489829887,KZ
-1489829888,1489862655,DE
+1489829888,1489855519,DE
+1489855520,1489855535,PL
+1489855536,1489855543,DE
+1489855544,1489855551,PL
+1489855552,1489855999,DE
+1489856000,1489856031,PL
+1489856032,1489862655,DE
1489862656,1489928191,RU
1489928192,1489960959,SE
1489960960,1489993727,HR
@@ -42983,49 +44285,40 @@
1495334912,1495335935,MD
1495335936,1495339007,RO
1495339008,1495343103,MD
-1495343104,1495345151,GB
-1495345152,1495347199,RO
+1495343104,1495346175,GB
+1495346176,1495347199,RO
1495347200,1495349247,GB
1495349248,1495399935,RO
1495399936,1495400191,MD
-1495400192,1495513087,RO
+1495400192,1495429119,RO
+1495429120,1495431167,GB
+1495431168,1495513087,RO
1495513088,1495515135,GB
-1495515136,1495615487,RO
-1495615488,1495616511,GB
-1495616512,1495623679,RO
+1495515136,1495623679,RO
1495623680,1495623935,MD
-1495623936,1495669759,RO
-1495669760,1495670783,GB
-1495670784,1495752703,RO
+1495623936,1495752703,RO
1495752704,1495754751,ES
1495754752,1495801855,RO
1495801856,1495802879,GB
1495802880,1495875583,RO
1495875584,1495891967,MD
-1495891968,1495896063,RO
-1495896064,1495898111,GB
-1495898112,1495927295,RO
+1495891968,1495927295,RO
1495927296,1495927551,AE
1495927552,1495937023,RO
1495937024,1495937535,ES
1495937536,1495986175,RO
1495986176,1495988223,GB
-1495988224,1495992319,RO
-1495992320,1495994367,GB
-1495994368,1496074239,RO
-1496074240,1496075263,GB
-1496075264,1496078335,RO
+1495988224,1495990271,RO
+1495990272,1495994367,GB
+1495994368,1496078335,RO
1496078336,1496079359,MD
-1496079360,1496080383,RO
-1496080384,1496081407,GB
-1496081408,1496119295,RO
-1496119296,1496121343,GB
+1496079360,1496086527,RO
+1496086528,1496088575,GB
+1496088576,1496121343,RO
1496121344,1496122367,MD
1496122368,1496178943,RO
1496178944,1496179199,AE
-1496179200,1496195071,RO
-1496195072,1496197119,GB
-1496197120,1496317951,RO
+1496179200,1496317951,RO
1496317952,1497366527,DE
1497366528,1498415103,PL
1498415104,1499463679,FR
@@ -43090,9 +44383,7 @@
1500174336,1500176383,DE
1500176384,1500178431,GB
1500178432,1500180479,KZ
-1500180480,1500180619,NL
-1500180620,1500181503,BE
-1500181504,1500182527,NL
+1500180480,1500182527,BE
1500182528,1500184575,RU
1500184576,1500184831,GB
1500184832,1500184895,IM
@@ -43265,8 +44556,8 @@
1502981120,1502981887,US
1502981888,1502982143,NL
1502982144,1502982911,DE
-1502982912,1502983679,FR
-1502983680,1502986255,DE
+1502982912,1502983423,FR
+1502983424,1502986255,DE
1502986256,1502986495,TR
1502986496,1502986511,DE
1502986512,1502986751,PL
@@ -43335,15 +44626,17 @@
1503897304,1503897311,BE
1503897312,1503897367,DE
1503897368,1503897375,BE
-1503897376,1503897391,GR
-1503897392,1503897407,DE
+1503897376,1503897383,GR
+1503897384,1503897407,DE
1503897408,1503897415,IT
1503897416,1503897431,DE
1503897432,1503897439,IT
1503897440,1503897463,DE
1503897464,1503897471,GR
1503897472,1503897479,AT
-1503897480,1503897583,DE
+1503897480,1503897519,DE
+1503897520,1503897527,IT
+1503897528,1503897583,DE
1503897584,1503897591,GB
1503897592,1503898119,DE
1503898120,1503898135,TH
@@ -43357,9 +44650,7 @@
1503898216,1503898239,DE
1503898240,1503898303,IT
1503898304,1503898311,BE
-1503898312,1503898327,DE
-1503898328,1503898335,AT
-1503898336,1503898351,DE
+1503898312,1503898351,DE
1503898352,1503898359,CH
1503898360,1503898415,DE
1503898416,1503898423,BE
@@ -43368,8 +44659,7 @@
1503898504,1503898511,GR
1503898512,1503898567,DE
1503898568,1503898575,NL
-1503898576,1503898583,GR
-1503898584,1503898599,DE
+1503898576,1503898599,DE
1503898600,1503898607,IT
1503898608,1503898615,GR
1503898616,1503898623,SE
@@ -43383,16 +44673,22 @@
1503898816,1503898831,GB
1503898832,1503898847,DE
1503898848,1503898855,MX
-1503898856,1503898863,HU
-1503898864,1503898887,DE
+1503898856,1503898887,DE
1503898888,1503898895,IT
1503898896,1503898935,DE
1503898936,1503898943,IT
-1503898944,1503898959,DE
-1503898960,1503898967,IT
-1503898968,1503898991,DE
+1503898944,1503898991,DE
1503898992,1503898999,GB
-1503899000,1503908351,DE
+1503899000,1503899007,AT
+1503899008,1503899063,DE
+1503899064,1503899079,AT
+1503899080,1503899119,DE
+1503899120,1503899127,NL
+1503899128,1503899143,DE
+1503899144,1503899151,IT
+1503899152,1503899159,DE
+1503899160,1503899167,GB
+1503899168,1503908351,DE
1503908352,1503909375,IT
1503909376,1503920127,DE
1503920128,1503985663,HR
@@ -43509,10 +44805,12 @@
1505336832,1505336863,GB
1505336864,1505336864,IE
1505336865,1505336879,GB
-1505336880,1505337023,IE
+1505336880,1505336959,IE
+1505336960,1505336975,GB
+1505336976,1505337023,IE
1505337024,1505337055,GB
-1505337056,1505337087,IE
-1505337088,1505337215,GB
+1505337056,1505337071,IE
+1505337072,1505337215,GB
1505337216,1505337343,IE
1505337344,1505345535,FR
1505345536,1505353727,MK
@@ -43762,8 +45060,8 @@
1506445338,1506445343,GB
1506445344,1506445519,FR
1506445520,1506445527,GB
-1506445528,1506445535,FR
-1506445536,1506445567,GB
+1506445528,1506445566,FR
+1506445567,1506445567,GB
1506445568,1506445703,FR
1506445704,1506445711,NL
1506445712,1506445719,GB
@@ -43790,12 +45088,16 @@
1506448736,1506448895,GB
1506448896,1506449159,BE
1506449160,1506449171,GB
-1506449172,1506449407,BE
+1506449172,1506449247,BE
+1506449248,1506449279,GB
+1506449280,1506449407,BE
1506449408,1506449663,NL
1506449664,1506449919,SK
1506449920,1506449927,CH
1506449928,1506449935,GB
-1506449936,1506450431,CH
+1506449936,1506449999,CH
+1506450000,1506450015,GB
+1506450016,1506450431,CH
1506450432,1506450767,CZ
1506450768,1506450847,GB
1506450848,1506450863,CZ
@@ -43808,11 +45110,13 @@
1506451040,1506451055,NO
1506451056,1506451059,DK
1506451060,1506451199,GB
-1506451200,1506451775,ES
-1506451776,1506451807,GB
+1506451200,1506451791,ES
+1506451792,1506451807,GB
1506451808,1506451895,ES
1506451896,1506451903,GB
-1506451904,1506452223,ES
+1506451904,1506452127,ES
+1506452128,1506452159,GB
+1506452160,1506452223,ES
1506452224,1506452479,GB
1506452480,1506452735,US
1506452736,1506452751,RO
@@ -43872,7 +45176,9 @@
1506461864,1506461887,GB
1506461888,1506462207,FR
1506462208,1506462463,ES
-1506462464,1506462607,FR
+1506462464,1506462527,FR
+1506462528,1506462583,GB
+1506462584,1506462607,FR
1506462608,1506462623,A2
1506462624,1506462719,FR
1506462720,1506463231,IT
@@ -43890,8 +45196,8 @@
1506467584,1506468351,IT
1506468352,1506468607,GB
1506468608,1506468863,TZ
-1506468864,1506469039,IT
-1506469040,1506469055,GB
+1506468864,1506469047,IT
+1506469048,1506469055,GB
1506469056,1506470143,IT
1506470144,1506470399,GB
1506470400,1506470655,DE
@@ -43901,7 +45207,9 @@
1506471976,1506471979,GB
1506471980,1506471999,NL
1506472000,1506472031,BE
-1506472032,1506472191,NL
+1506472032,1506472159,NL
+1506472160,1506472175,GB
+1506472176,1506472191,NL
1506472192,1506472447,IT
1506472448,1506472703,GB
1506472704,1506473215,IT
@@ -43912,7 +45220,8 @@
1506474496,1506474751,FR
1506474752,1506475519,IT
1506475520,1506475551,AT
-1506475552,1506476031,GB
+1506475552,1506475775,GB
+1506475776,1506476031,DE
1506476032,1506508799,KW
1506508800,1506541567,CZ
1506541568,1506574335,RU
@@ -43990,8 +45299,8 @@
1507664384,1507664767,DE
1507664768,1507664895,US
1507664896,1507665407,GR
-1507665408,1507665663,IT
-1507665664,1507666431,US
+1507665408,1507665919,IT
+1507665920,1507666431,US
1507666432,1507666559,GR
1507666560,1507666591,FR
1507666592,1507666639,GR
@@ -44056,7 +45365,9 @@
1508646912,1508646927,DK
1508646928,1508646935,SE
1508646936,1508647039,DK
-1508647040,1508648447,SE
+1508647040,1508647679,SE
+1508647680,1508647807,DK
+1508647808,1508648447,SE
1508648448,1508648703,DK
1508648704,1508650751,SE
1508650752,1508650847,DK
@@ -44523,9 +45834,9 @@
1533505536,1533507583,DE
1533507584,1533509631,UA
1533509632,1533511679,GB
-1533511680,1533512383,FR
-1533512384,1533512447,DE
-1533512448,1533513215,FR
+1533511680,1533513023,FR
+1533513024,1533513087,ES
+1533513088,1533513215,FR
1533513216,1533513471,GB
1533513472,1533513727,DE
1533513728,1533515775,KW
@@ -44573,9 +45884,10 @@
1534714064,1534714079,ES
1534714080,1534714095,FR
1534714096,1534714111,BE
-1534714112,1534714119,GB
-1534714120,1534714123,BE
-1534714124,1534714127,NL
+1534714112,1534714115,ES
+1534714116,1534714119,DE
+1534714120,1534714123,FI
+1534714124,1534714127,ES
1534714128,1534714143,BE
1534714144,1534714159,GB
1534714160,1534714259,FR
@@ -44634,7 +45946,7 @@
1534715144,1534715167,FR
1534715168,1534715183,NL
1534715184,1534715199,FR
-1534715200,1534715203,GB
+1534715200,1534715203,IT
1534715204,1534715207,FR
1534715208,1534715215,BE
1534715216,1534715263,FR
@@ -44653,7 +45965,8 @@
1534715372,1534715375,GB
1534715376,1534715391,ES
1534715392,1534715407,PL
-1534715408,1534715423,DE
+1534715408,1534715419,DE
+1534715420,1534715423,IT
1534715424,1534715439,PL
1534715440,1534715447,ES
1534715448,1534715451,FR
@@ -44723,7 +46036,7 @@
1534716704,1534716735,ES
1534716736,1534716751,FR
1534716752,1534716759,PL
-1534716760,1534716763,FR
+1534716760,1534716763,DE
1534716764,1534716767,ES
1534716768,1534716823,FR
1534716824,1534716831,GB
@@ -44753,17 +46066,20 @@
1534717324,1534717343,FR
1534717344,1534717359,GB
1534717360,1534717375,PL
-1534717376,1534717503,FR
-1534717504,1534717535,DE
+1534717376,1534717519,FR
+1534717520,1534717535,DE
1534717536,1534717551,PL
1534717552,1534717567,CZ
1534717568,1534717583,IE
-1534717584,1534717647,FR
-1534717648,1534717655,BE
-1534717656,1534717659,ES
+1534717584,1534717587,CZ
+1534717588,1534717591,NL
+1534717592,1534717599,IT
+1534717600,1534717647,FR
+1534717648,1534717659,PL
1534717660,1534717663,FR
1534717664,1534717679,GB
-1534717680,1534717711,ES
+1534717680,1534717695,ES
+1534717696,1534717711,IE
1534717712,1534717727,FR
1534717728,1534717731,GB
1534717732,1534717735,FR
@@ -44771,8 +46087,9 @@
1534717740,1534717743,DE
1534717744,1534717751,FR
1534717752,1534717759,BE
-1534717760,1534717775,FR
-1534717776,1534717791,NL
+1534717760,1534717783,FR
+1534717784,1534717787,GB
+1534717788,1534717791,DE
1534717792,1534717823,FR
1534717824,1534717855,BE
1534717856,1534717871,NL
@@ -44878,8 +46195,10 @@
1534719984,1534720003,FR
1534720004,1534720007,ES
1534720008,1534720015,PL
-1534720016,1534720031,GB
-1534720032,1534720047,DE
+1534720016,1534720023,ES
+1534720024,1534720027,PL
+1534720028,1534720031,ES
+1534720032,1534720047,FR
1534720048,1534720063,ES
1534720064,1534720079,IT
1534720080,1534720095,GB
@@ -44921,8 +46240,7 @@
1534720672,1534720739,FR
1534720740,1534720743,PL
1534720744,1534720747,NL
-1534720748,1534720751,FR
-1534720752,1534720767,GB
+1534720748,1534720767,FR
1534720768,1534720783,ES
1534720784,1534720791,PL
1534720792,1534720795,IT
@@ -44956,7 +46274,7 @@
1534721116,1534721119,BE
1534721120,1534721135,IT
1534721136,1534721159,FR
-1534721160,1534721163,GB
+1534721160,1534721163,ES
1534721164,1534721183,FR
1534721184,1534721191,LT
1534721192,1534721195,FR
@@ -45203,7 +46521,9 @@
1536659760,1536659775,BI
1536659776,1536659791,DE
1536659792,1536659823,SD
-1536659824,1536659991,DE
+1536659824,1536659839,DE
+1536659840,1536659903,LB
+1536659904,1536659991,DE
1536659992,1536659999,EG
1536660000,1536660007,SO
1536660008,1536660015,DE
@@ -45215,11 +46535,10 @@
1536660736,1536660991,SA
1536660992,1536661247,DE
1536661248,1536661759,GQ
-1536661760,1536662015,BJ
-1536662016,1536662271,DE
+1536661760,1536662015,DE
+1536662016,1536662271,LB
1536662272,1536662303,SO
-1536662304,1536662319,DE
-1536662320,1536662335,LB
+1536662304,1536662335,LB
1536662336,1536662367,DE
1536662368,1536662399,SO
1536662400,1536662415,DE
@@ -45257,7 +46576,17 @@
1538859008,1538875391,RU
1538875392,1538883583,RS
1538883584,1538891775,BE
-1538891776,1538898175,DE
+1538891776,1538897671,DE
+1538897672,1538897679,IT
+1538897680,1538897687,ES
+1538897688,1538897695,RU
+1538897696,1538897703,PL
+1538897704,1538897711,GR
+1538897712,1538897719,PT
+1538897720,1538897727,GB
+1538897728,1538897735,NL
+1538897736,1538897919,FR
+1538897920,1538898175,DE
1538898176,1538899967,FR
1538899968,1538904031,SI
1538904032,1538904039,BH
@@ -45280,11 +46609,7 @@
1538981888,1538990079,BY
1538990080,1538998271,CZ
1538998272,1539006463,AD
-1539006464,1539006719,AL
-1539006720,1539006735,RS
-1539006736,1539008511,AL
-1539008512,1539009023,RS
-1539009024,1539014655,AL
+1539006464,1539014655,AL
1539014656,1539022847,RS
1539022848,1539031039,LT
1539031040,1539039231,IT
@@ -45414,7 +46739,6 @@
1539314688,1539315711,RU
1539315712,1539316735,UA
1539316736,1539317759,SE
-1539317760,1539318783,RU
1539318784,1539319807,NL
1539319808,1539320831,DE
1539320832,1539321855,UA
@@ -45693,7 +47017,8 @@
1539536384,1539536895,NL
1539536896,1539537407,UA
1539537408,1539537919,GB
-1539537920,1539540479,RU
+1539537920,1539539455,RU
+1539539968,1539540479,RU
1539540480,1539540991,PL
1539540992,1539541503,RU
1539541504,1539542015,TR
@@ -45769,9 +47094,7 @@
1539589120,1539590143,GB
1539590144,1539591167,RU
1539591168,1539592191,UZ
-1539592192,1539593215,UA
-1539593216,1539594239,IL
-1539594240,1539598335,UA
+1539592192,1539598335,UA
1539598336,1539599359,NL
1539599360,1539600383,PL
1539600384,1539601407,HU
@@ -45883,7 +47206,7 @@
1539709184,1539709439,AT
1539709440,1539709695,BE
1539709696,1539709951,NL
-1539709952,1539710207,DE
+1539709952,1539710207,TR
1539710208,1539710463,GB
1539710464,1539710719,FR
1539710720,1539710975,UA
@@ -46090,7 +47413,6 @@
1539764992,1539765247,BE
1539765248,1539765503,GB
1539765504,1539766015,PL
-1539766016,1539766271,AM
1539766272,1539766527,PL
1539766528,1539766783,UA
1539766784,1539767039,DE
@@ -46436,6 +47758,7 @@
1539948544,1539949567,RO
1539949568,1539950591,MD
1539950592,1539951103,KZ
+1539951104,1539951615,UA
1539951616,1539953663,RU
1539953664,1539954687,UA
1539954688,1539956735,RO
@@ -46565,7 +47888,6 @@
1540118528,1540119551,PL
1540119552,1540120575,UA
1540120576,1540124671,RU
-1540124672,1540125695,NO
1540125696,1540126719,FR
1540126720,1540127743,UA
1540127744,1540128767,GB
@@ -47413,7 +48735,7 @@
1540589568,1540593663,RU
1540593664,1540594687,GB
1540594688,1540595711,IT
-1540595712,1540596735,UZ
+1540595712,1540596735,KZ
1540596736,1540597759,FR
1540597760,1540598783,SE
1540598784,1540600831,UA
@@ -47728,6 +49050,7 @@
1540701952,1540702207,GB
1540702208,1540702463,PL
1540702464,1540702719,PT
+1540702720,1540702975,DK
1540702976,1540703231,RU
1540703232,1540703487,MH
1540703488,1540703743,NL
@@ -47780,6 +49103,7 @@
1540717056,1540717311,CZ
1540717312,1540717823,PL
1540717824,1540718079,UA
+1540718080,1540718335,RU
1540718592,1540718847,CH
1540718848,1540719103,IT
1540719104,1540719359,RU
@@ -47868,6 +49192,7 @@
1540742912,1540743167,RU
1540743168,1540743423,NO
1540743424,1540743679,RU
+1540743680,1540743935,PL
1540743936,1540744191,CH
1540744192,1540744447,GR
1540744448,1540744703,UA
@@ -48261,7 +49586,7 @@
1540962816,1540963839,UA
1540963840,1540964351,RU
1540964352,1540964863,IR
-1540964864,1540965375,UA
+1540964864,1540965887,UA
1540965888,1540966399,RU
1540966400,1540966911,GB
1540966912,1540967935,RU
@@ -49088,6 +50413,85 @@
1541385216,1541385471,NL
1541385472,1541385727,RU
1541385728,1541385983,SI
+1541385984,1541386239,PL
+1541386240,1541386495,RU
+1541386496,1541386751,UA
+1541386752,1541387007,RU
+1541387008,1541387263,CH
+1541387264,1541387519,UA
+1541387520,1541387775,RU
+1541387776,1541388031,SI
+1541388032,1541388287,RO
+1541388288,1541388543,PL
+1541388544,1541388799,RO
+1541388800,1541389055,CH
+1541389056,1541389311,NL
+1541389312,1541389567,RU
+1541389568,1541389823,SI
+1541389824,1541390079,RO
+1541390080,1541390335,US
+1541390336,1541390591,DK
+1541390592,1541390847,SI
+1541390848,1541391103,RU
+1541391104,1541391359,BE
+1541391360,1541391615,PL
+1541391616,1541391871,SI
+1541391872,1541392127,DE
+1541392128,1541392383,RU
+1541392384,1541392639,RO
+1541392640,1541392895,TR
+1541392896,1541393151,DE
+1541393152,1541393407,GB
+1541393408,1541393663,DE
+1541393664,1541393919,UA
+1541393920,1541394175,ES
+1541394176,1541394431,FR
+1541394432,1541394687,CY
+1541394688,1541394943,SK
+1541394944,1541395199,SA
+1541395200,1541395455,DE
+1541395456,1541395711,PL
+1541395712,1541395967,NO
+1541395968,1541396223,UA
+1541396224,1541396479,LB
+1541396480,1541396735,UA
+1541396736,1541396991,RU
+1541396992,1541397247,GB
+1541397248,1541397503,FR
+1541397504,1541397759,NL
+1541397760,1541398015,PL
+1541398016,1541398271,HU
+1541398272,1541398527,UA
+1541398528,1541398783,RU
+1541398784,1541399039,PL
+1541399040,1541399295,RU
+1541399296,1541399551,UA
+1541399552,1541399807,DE
+1541399808,1541400063,RU
+1541400064,1541400319,SI
+1541400320,1541400831,SE
+1541400832,1541401087,NL
+1541401088,1541401343,UA
+1541401344,1541401599,DK
+1541401600,1541401855,LV
+1541401856,1541402111,HR
+1541402112,1541402367,SI
+1541402368,1541402623,RU
+1541402624,1541402879,FR
+1541402880,1541403135,PL
+1541403136,1541403391,RU
+1541403392,1541403647,EE
+1541403648,1541403903,RU
+1541403904,1541404159,GE
+1541404160,1541404415,RU
+1541404416,1541404671,DE
+1541404672,1541404927,AT
+1541404928,1541405183,HR
+1541405184,1541405439,PL
+1541405440,1541405951,RU
+1541405952,1541406207,FR
+1541406208,1541406463,RU
+1541406464,1541406719,AT
1541406720,1541407231,LV
1541407232,1541407743,UA
1541407744,1541408255,FI
@@ -49171,6 +50575,32 @@
1541453824,1541454335,PL
1541454336,1541454847,GB
1541454848,1541455359,EE
+1541455360,1541455871,GB
+1541455872,1541456383,PL
+1541456384,1541456895,RU
+1541456896,1541457919,PL
+1541457920,1541458943,UA
+1541458944,1541459455,RO
+1541459456,1541460479,RU
+1541460480,1541460991,DK
+1541460992,1541461503,RO
+1541461504,1541462527,PL
+1541462528,1541463039,RU
+1541463040,1541463551,PL
+1541463552,1541464063,UA
+1541464064,1541464575,PL
+1541464576,1541465087,DE
+1541465088,1541465599,RU
+1541465600,1541466111,FR
+1541466112,1541467135,RU
+1541467136,1541467647,PL
+1541467648,1541468159,SI
+1541468160,1541468671,ES
+1541469184,1541469695,SE
+1541469696,1541470207,LV
+1541470208,1541470719,NL
+1541470720,1541471231,RS
+1541471232,1541472255,UA
1541472256,1541473279,GB
1541473280,1541474303,UA
1541474304,1541475327,PL
@@ -49216,6 +50646,8 @@
1541534720,1541535743,IT
1541535744,1541536767,US
1541536768,1541537791,RU
+1541537792,1541538303,GB
+1541538304,1541538815,RO
1543503872,1545601023,GB
1545601024,1545673167,SE
1545673168,1545673175,FI
@@ -49350,9 +50782,7 @@
1546649600,1546665983,SA
1546665984,1546673823,GB
1546673824,1546673839,RS
-1546673840,1546677559,GB
-1546677560,1546677561,IN
-1546677562,1546678863,GB
+1546673840,1546678863,GB
1546678864,1546678871,RS
1546678872,1546680831,GB
1546680832,1546680895,RS
@@ -49587,17 +51017,19 @@
1551548416,1551551487,DE
1551551488,1551556607,EU
1551556608,1551558655,FR
-1551558656,1551564799,EU
+1551558656,1551560703,EU
+1551560704,1551561727,DE
+1551561728,1551564799,EU
1551564800,1551572991,FR
1551572992,1551576063,NL
1551576064,1551577087,EU
1551577088,1551580159,NL
-1551580160,1551630335,EU
+1551580160,1551604479,EU
+1551604480,1551604735,SE
+1551604736,1551630335,EU
1551630336,1551892479,RU
1551892480,1556086783,FR
-1556086784,1556486729,DE
-1556486730,1556486730,A2
-1556486731,1556486924,DE
+1556086784,1556486924,DE
1556486925,1556486925,A2
1556486926,1558708223,DE
1558708224,1559232511,GB
@@ -49692,6 +51124,7 @@
1566081024,1566085119,RU
1566085120,1566089215,NL
1566089216,1566097407,RU
+1566097408,1566101503,HU
1566101504,1566105599,RU
1566105600,1566109695,DE
1566109696,1566111231,CH
@@ -49984,7 +51417,9 @@
1568309248,1568342015,RO
1568342016,1568374783,BG
1568374784,1568440319,RU
-1568440320,1568473087,NO
+1568440320,1568443919,NO
+1568443920,1568443927,SE
+1568443928,1568473087,NO
1568473088,1568505855,BY
1568505856,1568538623,NL
1568538624,1568555007,IR
@@ -50122,7 +51557,8 @@
1570667296,1570667327,GB
1570667328,1570667335,SE
1570667336,1570667339,GB
-1570667340,1570667455,SE
+1570667340,1570667343,NL
+1570667344,1570667455,SE
1570667456,1570667471,FR
1570667472,1570667487,SE
1570667488,1570667503,FR
@@ -50171,9 +51607,8 @@
1571426304,1571428351,CZ
1571428352,1571428863,UA
1571428864,1571429119,KZ
-1571429120,1571429375,CZ
-1571429376,1571429631,RU
-1571429632,1571432447,UA
+1571429120,1571429375,RU
+1571429376,1571432447,UA
1571432448,1571434495,CZ
1571434496,1571435519,UA
1571435520,1571438591,CZ
@@ -50359,6 +51794,7 @@
1572542464,1572544511,IT
1572544512,1572546559,IQ
1572546560,1572548607,FR
+1572548608,1572550655,NL
1572550656,1572552703,DE
1572552704,1572554751,TR
1572554752,1572556799,CH
@@ -50368,7 +51804,9 @@
1572562944,1572564991,CZ
1572564992,1572567039,DE
1572567040,1572569087,RU
-1572569088,1572571135,NL
+1572569088,1572569343,NL
+1572569344,1572569599,GB
+1572569600,1572571135,NL
1572571136,1572573183,RO
1572573184,1572574975,GG
1572574976,1572575167,GB
@@ -50430,7 +51868,11 @@
1572668464,1572668471,SA
1572668472,1572668639,GB
1572668640,1572668647,SA
-1572668648,1572669439,GB
+1572668648,1572668655,GB
+1572668656,1572668671,CY
+1572668672,1572668703,GB
+1572668704,1572668711,CY
+1572668712,1572669439,GB
1572669440,1572673535,RU
1572673536,1572675583,AT
1572675584,1572677631,ES
@@ -50507,7 +51949,9 @@
1572800512,1572804607,RU
1572804608,1572808703,GB
1572808704,1572810751,FR
-1572810752,1572812799,DE
+1572810752,1572812031,DE
+1572812032,1572812543,RO
+1572812544,1572812799,DE
1572812800,1572814847,RU
1572814848,1572816895,KW
1572816896,1572818943,RU
@@ -50545,7 +51989,9 @@
1572854286,1572854286,CH
1572854287,1572854287,LU
1572854288,1572854527,BE
-1572854528,1572855295,EU
+1572854528,1572855039,EU
+1572855040,1572855071,BE
+1572855072,1572855295,EU
1572855296,1572855551,CH
1572855552,1572855552,EU
1572855553,1572855558,BE
@@ -50670,13 +52116,12 @@
1578591696,1578591699,DE
1578591700,1578591703,FR
1578591704,1578591707,DE
-1578591708,1578591711,CZ
+1578591708,1578591711,FR
1578591712,1578591743,PL
1578591744,1578591759,ES
1578591760,1578591791,FR
1578591792,1578591807,PL
-1578591808,1578591823,DE
-1578591824,1578591887,FR
+1578591808,1578591887,FR
1578591888,1578591891,DE
1578591892,1578591899,FR
1578591900,1578591903,GB
@@ -50733,8 +52178,9 @@
1578592688,1578592695,DE
1578592696,1578592719,ES
1578592720,1578592735,CH
-1578592736,1578592751,FR
-1578592752,1578592783,DE
+1578592736,1578592743,PL
+1578592744,1578592747,PT
+1578592748,1578592783,DE
1578592784,1578592799,FR
1578592800,1578592815,GB
1578592816,1578592831,FR
@@ -50817,7 +52263,8 @@
1578594112,1578594127,PL
1578594128,1578594159,FR
1578594160,1578594163,PT
-1578594164,1578594171,GB
+1578594164,1578594167,ES
+1578594168,1578594171,DE
1578594172,1578594191,FR
1578594192,1578594207,IT
1578594208,1578594211,DE
@@ -51104,7 +52551,8 @@
1578991616,1579024383,KW
1579024384,1579057151,GB
1579057152,1579089919,LV
-1579089920,1579090575,NL
+1579089920,1579090175,GB
+1579090176,1579090575,NL
1579090576,1579090687,GB
1579090688,1579090943,NL
1579090944,1579091759,GB
@@ -51206,7 +52654,9 @@
1583681536,1583685631,PL
1583685632,1583689727,DE
1583689728,1583693823,IT
-1583693824,1583697919,RU
+1583693824,1583693871,RU
+1583693872,1583693879,A2
+1583693880,1583697919,RU
1583697920,1583702015,TR
1583702016,1583706111,RU
1583706112,1583710207,GI
@@ -51247,8 +52697,10 @@
1583804416,1583808511,GB
1583808512,1583812607,MD
1583812608,1583813171,NL
-1583813172,1583813175,US
-1583813176,1583813663,NL
+1583813172,1583813183,US
+1583813184,1583813199,NL
+1583813200,1583813215,RU
+1583813216,1583813663,NL
1583813664,1583813671,US
1583813672,1583813679,NL
1583813680,1583813683,GB
@@ -51258,7 +52710,9 @@
1583813736,1583813743,DE
1583813744,1583813808,NL
1583813809,1583813815,US
-1583813816,1583815167,NL
+1583813816,1583814655,NL
+1583814656,1583814783,US
+1583814784,1583815167,NL
1583815168,1583815215,US
1583815216,1583815343,NL
1583815344,1583815351,US
@@ -51488,7 +52942,9 @@
1586216960,1586225151,BG
1586225152,1586233343,RU
1586233344,1586241535,FR
-1586241536,1586249727,SE
+1586241536,1586243779,SE
+1586243780,1586243787,NO
+1586243788,1586249727,SE
1586249728,1586257919,SI
1586257920,1586266111,EU
1586266112,1586274303,RU
@@ -51665,8 +53121,12 @@
1590149120,1590151167,CZ
1590151168,1590153215,TR
1590153216,1590157311,RU
-1590157312,1590159359,IE
-1590159360,1590161407,GB
+1590157312,1590157471,IE
+1590157472,1590157823,GB
+1590157824,1590157951,IE
+1590157952,1590158335,GB
+1590158336,1590158463,IE
+1590158464,1590161407,GB
1590161408,1590163455,DE
1590163456,1590165503,NL
1590165504,1590176831,AE
@@ -51692,15 +53152,15 @@
1592054272,1592054527,AE
1592054528,1592054783,NL
1592054784,1592055295,AE
-1592055296,1592056959,NL
-1592056960,1592057023,SG
-1592057024,1592057855,NL
+1592055296,1592057855,NL
1592057856,1592061951,RS
1592061952,1592066047,RU
1592066048,1592067583,US
1592067584,1592067711,NO
-1592067712,1592069295,CY
-1592069296,1592069375,RU
+1592067712,1592069119,CY
+1592069120,1592069135,RU
+1592069136,1592069247,CY
+1592069248,1592069375,RU
1592069376,1592069407,US
1592069408,1592069631,CY
1592069632,1592069759,NL
@@ -51754,7 +53214,6 @@
1592281088,1592283135,UA
1592283136,1592285183,GR
1592285184,1592287231,RU
-1592287232,1592289279,RO
1592289280,1592291327,RU
1592291328,1592293375,NL
1592293376,1592295423,LT
@@ -51961,7 +53420,9 @@
1600442368,1600446463,DE
1600446464,1600453119,EU
1600453120,1600453631,IT
-1600453632,1600520191,EU
+1600453632,1600456703,EU
+1600456704,1600457727,DE
+1600457728,1600520191,EU
1600520192,1600651263,SK
1600651264,1600684031,GE
1600684032,1600749567,RU
@@ -51985,7 +53446,8 @@
1601699840,1602224127,ES
1602224128,1602226175,NL
1602226176,1602228223,GB
-1602228224,1602230271,DE
+1602228224,1602230270,FR
+1602230271,1602230271,DE
1602230272,1602232319,DK
1602232320,1602234367,CH
1602234368,1602234591,FR
@@ -52018,7 +53480,11 @@
1602260992,1602263039,FR
1602263040,1602265087,ES
1602265088,1602267135,RU
-1602267136,1602269183,RO
+1602267136,1602267199,DE
+1602267200,1602267263,FR
+1602267264,1602267327,GB
+1602267328,1602267391,ES
+1602267392,1602269183,RO
1602269184,1602271231,RU
1602271232,1602273279,MK
1602273280,1602273535,FR
@@ -52044,7 +53510,7 @@
1602298368,1602298431,MT
1602298432,1602298879,IL
1602298880,1602299391,MT
-1602299392,1602299903,GG
+1602299392,1602299903,GB
1602299904,1602301951,DK
1602301952,1602303999,DE
1602304000,1602306047,RU
@@ -52131,8 +53597,8 @@
1602451456,1602453503,DE
1602453504,1602455551,SK
1602455552,1602456015,FR
-1602456016,1602456023,ES
-1602456024,1602456175,FR
+1602456016,1602456031,ES
+1602456032,1602456175,FR
1602456176,1602456183,ES
1602456184,1602457599,FR
1602457600,1602459647,RU
@@ -52172,7 +53638,9 @@
1603067904,1603071999,GB
1603072000,1603076095,CZ
1603076096,1603080191,RU
-1603080192,1603084287,DE
+1603080192,1603083007,DE
+1603083008,1603083263,UA
+1603083264,1603084287,DE
1603084288,1603088383,IT
1603088384,1603092479,LB
1603092480,1603100671,NO
@@ -52250,11 +53718,17 @@
1603223952,1603224319,FR
1603224320,1603224335,GB
1603224336,1603224351,BE
-1603224352,1603224575,GB
+1603224352,1603224367,NL
+1603224368,1603224383,DE
+1603224384,1603224399,CH
+1603224400,1603224415,IT
+1603224416,1603224431,ES
+1603224432,1603224447,US
+1603224448,1603224575,GB
1603224576,1603224775,FR
1603224776,1603224783,GB
-1603224784,1603224831,FR
-1603224832,1603225087,GB
+1603224784,1603224895,FR
+1603224896,1603225087,GB
1603225088,1603225599,FR
1603225600,1603225607,ES
1603225608,1603225615,GB
@@ -52263,8 +53737,8 @@
1603225632,1603225639,US
1603225640,1603225647,CN
1603225648,1603225855,FR
-1603225856,1603226623,GB
-1603226624,1603227647,FR
+1603225856,1603226111,GB
+1603226112,1603227647,FR
1603227648,1603231743,AT
1603231744,1603235839,IT
1603235840,1603239935,RU
@@ -52350,11 +53824,7 @@
1604891968,1604892159,RU
1604892160,1604892927,DE
1604892928,1604893183,HK
-1604893184,1604893311,DE
-1604893312,1604893375,TR
-1604893376,1604893439,DE
-1604893440,1604893695,TR
-1604893696,1604893951,DE
+1604893184,1604893951,DE
1604893952,1604894463,TR
1604894464,1604894719,DE
1604894720,1604895487,CZ
@@ -52398,23 +53868,35 @@
1605107712,1605115903,GB
1605115904,1605124095,RU
1605124096,1605124607,US
-1605124608,1605124671,GB
-1605124672,1605124735,US
-1605124736,1605125263,GB
+1605124608,1605124639,GB
+1605124640,1605124735,US
+1605124736,1605124863,GB
+1605124864,1605124895,US
+1605124896,1605124927,GB
+1605124928,1605124959,US
+1605124960,1605125119,GB
+1605125120,1605125247,US
+1605125248,1605125263,GB
1605125264,1605125279,US
1605125280,1605125335,GB
1605125336,1605125343,US
-1605125344,1605125439,GB
-1605125440,1605125887,US
+1605125344,1605125375,GB
+1605125376,1605125887,US
1605125888,1605126143,GB
1605126144,1605127679,US
-1605127680,1605130239,GB
+1605127680,1605127935,GB
+1605127936,1605128703,US
+1605128704,1605129215,GB
+1605129216,1605129727,US
+1605129728,1605130239,GB
1605130240,1605130271,US
1605130272,1605130295,GB
-1605130296,1605130303,US
-1605130304,1605130495,GB
+1605130296,1605130335,US
+1605130336,1605130495,GB
1605130496,1605131007,US
-1605131008,1605132287,GB
+1605131008,1605131263,GB
+1605131264,1605132031,US
+1605132032,1605132287,GB
1605132288,1605148671,RU
1605148672,1605156863,PT
1605156864,1605165055,JO
@@ -52617,10 +54099,12 @@
1613557008,1613557015,US
1613557016,1613557087,CA
1613557088,1613557095,US
-1613557096,1613565951,CA
+1613557096,1613558359,CA
+1613558360,1613558375,NL
+1613558376,1613565951,CA
1613565952,1613570047,US
1613570048,1613574143,CA
-1613574144,1613602815,US
+1613574144,1613606911,US
1613606912,1613607167,CA
1613607168,1613607423,US
1613607424,1613607679,GB
@@ -53402,7 +54886,6 @@
1674051584,1674575871,US
1674575872,1677721599,CA
1677721600,1681915903,US
-1694499072,1694499327,AU
1694499840,1694500863,ID
1694500864,1694507007,JP
1694507008,1694515199,IN
@@ -53423,7 +54906,8 @@
1694760960,1695023103,CN
1695023104,1695547391,TW
1695547392,1697775615,CN
-1697775616,1697779711,JP
+1697775616,1697776639,ID
+1697776640,1697779711,JP
1697779712,1697783807,ID
1697783808,1697791999,JP
1697792000,1697808383,PK
@@ -53431,6 +54915,7 @@
1697841152,1697906687,TH
1697906688,1697972223,CN
1697972224,1697988607,VN
+1697988608,1697996799,KR
1697996800,1698004991,JP
1698004992,1698037759,AU
1698037760,1698103295,CN
@@ -53441,15 +54926,18 @@
1699611648,1699612671,JP
1699612672,1699614719,LA
1699614720,1699618815,PH
+1699618816,1699627007,CN
1699627008,1699643391,SG
1699643392,1699676159,HK
1699676160,1699741695,KR
1699741696,1700790271,CN
-1700790272,1700823039,VN
+1700793344,1700794367,VN
+1700798464,1700806655,JP
+1700806656,1700823039,VN
1700823040,1700855807,CN
-1700855808,1700921343,AU
1700921344,1700986879,NZ
1700986880,1701003263,VN
+1701003264,1701011455,MY
1701019648,1701052415,GU
1701052416,1701117951,NZ
1701117952,1701134335,NC
@@ -53461,10 +54949,12 @@
1701576704,1701707775,TH
1701707776,1701724159,JP
1701736448,1701737471,NZ
-1701773312,1701838847,JP
+1701740544,1701838847,JP
1701838848,1702363135,AU
-1702363136,1702821887,CN
-1702821888,1702889471,AU
+1702363136,1702887423,CN
+1702888448,1702889471,AU
+1702903808,1702920191,ID
+1702920192,1702952959,JP
1702952960,1703411711,CN
1703411712,1703673855,TW
1703673856,1703935999,JP
@@ -53472,14 +54962,38 @@
1704984576,1707081727,AU
1707081728,1707737087,CN
1707737088,1707802623,KR
+1707802624,1707835391,JP
1707845632,1707846655,ID
+1707851776,1707868159,JP
1707868160,1708130303,CN
1708130304,1709178879,IN
1709178880,1709834239,CN
+1709834240,1709850623,SG
+1709852672,1709853695,AU
+1709867008,1709899775,AU
1709899776,1709965311,KR
1709965312,1710882815,CN
1710882816,1710948351,KR
-1711013888,1711276031,CN
+1710949376,1710950399,NP
+1710964736,1711210495,CN
+1711210496,1711276031,ID
+1778385152,1778385407,AU
+1778417664,1778450431,TH
+1778450432,1778515967,TW
+1778515968,1779040255,CN
+1779073024,1779105791,SG
+1779105792,1781727231,CN
+1781727232,1781792767,IN
+1782054912,1782579199,CN
+1782972416,1783103487,AU
+1783234560,1783365631,CN
+1783627776,1784676351,CN
+1784676352,1785200639,KR
+1785724928,1786249215,CN
+1786773504,1790967807,JP
+1790967808,1793064959,IN
+1793064960,1794113535,CN
+1794113536,1795162111,KR
1795162112,1815822335,US
1815822336,1815826431,CA
1815826432,1815871487,US
@@ -53845,7 +55359,9 @@
1835892736,1835909119,GB
1835909120,1835913215,RS
1835913216,1835917311,RU
-1835917312,1835925503,GB
+1835917312,1835920127,GB
+1835920128,1835920143,PT
+1835920144,1835925503,GB
1835925504,1835933695,LV
1835933696,1835941887,RU
1835941888,1835950079,UA
@@ -54093,8 +55609,8 @@
1842206720,1842208767,SE
1842208768,1842210815,GB
1842210816,1842212863,LT
-1842212864,1842214911,CZ
-1842214912,1842216959,RU
+1842212864,1842214655,CZ
+1842214656,1842216959,RU
1842216960,1842225151,RO
1842225152,1842233343,UA
1842233344,1842241535,RO
@@ -54198,8 +55714,8 @@
1844011008,1844013055,IT
1844013056,1844015103,PL
1844015104,1844017151,GB
-1844017152,1844019199,IT
-1844019200,1844027391,DE
+1844017152,1844021247,IT
+1844021248,1844027391,DE
1844027392,1844029439,CZ
1844029440,1844031487,RU
1844031488,1844031743,EU
@@ -54207,8 +55723,8 @@
1844031776,1844031999,EU
1844032000,1844032031,GB
1844032032,1844032255,EU
-1844032256,1844032767,CH
-1844032768,1844033271,EU
+1844032256,1844032831,CH
+1844032832,1844033271,EU
1844033272,1844033535,CH
1844033536,1844035583,RS
1844035584,1844037631,MD
@@ -54226,7 +55742,8 @@
1844068352,1844072447,GB
1844072448,1844076543,ES
1844076544,1844078591,IE
-1844078592,1844080639,DE
+1844078592,1844080127,DE
+1844080128,1844080639,PL
1844080640,1844082687,GE
1844082688,1844084735,DE
1844084736,1844086783,RU
@@ -54263,10 +55780,7 @@
1844148224,1844150271,GB
1844150272,1844152319,ES
1844152320,1844154367,DE
-1844154368,1844154879,GB
-1844154880,1844155135,FR
-1844155136,1844155391,US
-1844155392,1844156415,GB
+1844154368,1844156415,GB
1844156416,1844158463,IT
1844158464,1844160511,RU
1844160512,1844162559,SE
@@ -54280,9 +55794,14 @@
1844169600,1844169647,US
1844169648,1844169655,AF
1844169656,1844169727,SE
-1844169728,1844169759,DE
-1844169760,1844169943,US
-1844169944,1844170751,DE
+1844169728,1844169767,DE
+1844169768,1844169951,US
+1844169952,1844169983,DE
+1844169984,1844169987,AF
+1844169988,1844169991,DE
+1844169992,1844169995,AF
+1844169996,1844169999,TM
+1844170000,1844170751,DE
1844170752,1844174847,RU
1844174848,1844178943,DE
1844178944,1844180991,EE
@@ -54322,9 +55841,11 @@
1844215808,1844219903,BE
1844219904,1844220031,A2
1844220032,1844220191,IQ
-1844220192,1844220415,DE
+1844220192,1844220287,DE
+1844220288,1844220415,JO
1844220416,1844220431,A2
-1844220432,1844223999,DE
+1844220432,1844223743,DE
+1844223744,1844223999,A2
1844224000,1844228095,GB
1844228096,1844228479,DK
1844228480,1844228511,SE
@@ -54437,6 +55958,7 @@
1847787520,1847803903,KR
1847803904,1847807999,VN
1847808000,1847810047,ID
+1847810048,1847812095,FJ
1847812096,1847853055,KR
1847853056,1848115199,PK
1848115200,1848377343,CN
@@ -54448,6 +55970,7 @@
1848401920,1848406015,PH
1848406016,1848410111,NP
1848410112,1848414207,PH
+1848414208,1848418303,CN
1848418304,1848420351,AU
1848420352,1848422399,ID
1848422400,1848424447,JP
@@ -54457,6 +55980,7 @@
1848705024,1848770559,TH
1848770560,1848774655,JP
1848774656,1848776703,AU
+1848776704,1848778751,JP
1848778752,1848786943,IN
1848786944,1848791039,JP
1848791040,1848793087,ID
@@ -54536,6 +56060,7 @@
1856856064,1856864255,CN
1856864256,1856872447,AU
1856872448,1856876543,NZ
+1856876544,1856880639,IN
1856880640,1856888831,CN
1856888832,1856892927,AU
1856892928,1856897023,JP
@@ -54560,6 +56085,7 @@
1860746240,1860747263,PK
1860747264,1860759551,JP
1860759552,1860761599,AU
+1860761600,1860763647,IN
1860763648,1860829183,JP
1860829184,1860960255,IN
1860960256,1861091327,CN
@@ -54570,6 +56096,7 @@
1866563584,1866579967,KR
1866579968,1866588159,JP
1866588160,1866592255,NZ
+1866592256,1866596351,VN
1866596352,1866661887,CN
1866661888,1866670079,AU
1866670080,1866674175,MY
@@ -54629,9 +56156,11 @@
1870045184,1870049279,AU
1870049280,1870053375,IN
1870053376,1870055423,AU
+1870055424,1870057471,CN
1870057472,1870058495,AU
1870058496,1870059519,IN
1870059520,1870065663,AU
+1870065664,1870069759,IN
1870069760,1870077951,JP
1870077952,1870086143,NP
1870086144,1870110719,CN
@@ -54644,7 +56173,7 @@
1870497792,1870499839,IN
1870499840,1870501887,JP
1870501888,1870503935,AF
-1870503936,1870508031,AU
+1870503936,1870512127,AU
1870512128,1870528511,IN
1870528512,1873281023,CN
1873281024,1873412095,JP
@@ -54727,8 +56256,10 @@
1885995008,1886191615,KR
1886191616,1886195711,PH
1886195712,1886197759,ID
+1886197760,1886199807,JP
1886199808,1886207999,KR
-1886208000,1886216191,NZ
+1886208000,1886214143,NZ
+1886214144,1886216191,VN
1886216192,1886224383,IN
1886224384,1886257151,CN
1886257152,1886322687,IN
@@ -54777,6 +56308,7 @@
1892155392,1892941823,PH
1892941824,1893015551,KR
1893015552,1893019647,AU
+1893019648,1893023743,TW
1893023744,1893027839,HK
1893027840,1893031935,VN
1893031936,1893040127,HK
@@ -54799,6 +56331,7 @@
1896605696,1896606719,AU
1896606720,1896607743,MY
1896607744,1896609791,VU
+1896609792,1896611839,SG
1896611840,1897070591,CN
1897070592,1897136127,IN
1897136128,1897140223,AU
@@ -54849,6 +56382,7 @@
1897922560,1898708991,JP
1898708992,1899233279,CN
1899233280,1899237375,AU
+1899237376,1899241471,JP
1899241472,1899249663,VN
1899249664,1899266047,MO
1899266048,1899267071,AU
@@ -54861,6 +56395,7 @@
1899274240,1899282431,CN
1899282432,1899290623,KR
1899290624,1899294719,AU
+1899294720,1899298815,JP
1899298816,1899364351,TH
1899364352,1899724799,CN
1899724800,1899741183,KR
@@ -54892,8 +56427,9 @@
1908539392,1908670463,CN
1908670464,1908735999,TW
1908736000,1908740095,AU
-1908744192,1908748287,JP
+1908740096,1908748287,JP
1908748288,1908750335,PK
+1908750336,1908752383,JP
1908752384,1908753407,NZ
1908753408,1908754431,PF
1908754432,1908756479,PH
@@ -54954,6 +56490,7 @@
1914652672,1914654719,AU
1914654720,1914658815,JP
1914658816,1914660863,AU
+1914660864,1914662911,JP
1914662912,1914667007,KR
1914667008,1914683391,IN
1914683392,1914687487,AU
@@ -54983,6 +56520,7 @@
1919815680,1919817727,ID
1919817728,1919819775,KR
1919819776,1919821823,NZ
+1919821824,1919823871,ID
1919823872,1919827967,JP
1919827968,1919844351,CN
1919844352,1919877119,KR
@@ -55009,12 +56547,14 @@
1921253376,1921318911,CN
1921318912,1921384447,MY
1921384448,1921388543,NZ
+1921388544,1921392639,PG
1921392640,1921400831,JP
1921400832,1921404927,ID
1921404928,1921406975,HK
1921406976,1921409023,BD
1921409024,1921425407,JP
-1921425408,1921433599,NZ
+1921425408,1921431551,NZ
+1921431552,1921433599,KH
1921433600,1921449983,JP
1921449984,1921515519,CN
1921515520,1921646591,TW
@@ -55029,6 +56569,7 @@
1921863680,1921865727,BD
1921865728,1921867775,ID
1921867776,1921871871,AU
+1921871872,1921875967,NZ
1921875968,1921892351,CN
1921892352,1921896447,AU
1921896448,1921898495,SG
@@ -55080,6 +56621,7 @@
1932001280,1932132351,KR
1932132352,1932148735,AU
1932148736,1932152831,PK
+1932152832,1932156927,TW
1932156928,1932161023,JP
1932161024,1932163071,TW
1932163072,1932165119,PH
@@ -55118,6 +56660,7 @@
1934966784,1934974975,ID
1934974976,1934983167,JP
1934983168,1934985215,AU
+1934985216,1934987263,JP
1934987264,1934991359,TW
1934991360,1934999551,KR
1934999552,1935015935,CN
@@ -55128,9 +56671,11 @@
1935933440,1936457727,CN
1936457728,1937244159,IN
1937244160,1937506303,CN
-1937506304,1937508351,AU
+1937506304,1937510399,AU
1937510400,1937514495,CN
1937514496,1937516543,AU
+1937516544,1937518591,IN
+1937518592,1937522687,JP
1937522688,1937530879,ID
1937530880,1937532927,US
1937532928,1937534463,IN
@@ -55140,7 +56685,7 @@
1937539072,1937637375,JP
1937637376,1937670143,HK
1937670144,1937672191,NZ
-1937674240,1937678335,JP
+1937672192,1937678335,JP
1937678336,1937686527,NC
1937686528,1937702911,KR
1937702912,1937768447,BD
@@ -55148,7 +56693,7 @@
1938030592,1938292735,MY
1938292736,1938948095,KR
1938948096,1938964479,JP
-1938964480,1938968575,AU
+1938964480,1938972671,AU
1938972672,1938976767,MY
1938976768,1938978815,SG
1938978816,1938980863,VN
@@ -55883,7 +57428,7 @@
2013048832,2013052927,AU
2013052928,2013061119,IN
2013061120,2013065215,PG
-2013069312,2014314495,CN
+2013065216,2014314495,CN
2014314496,2014838783,AU
2014838784,2015100927,CN
2015100928,2015166463,PH
@@ -55908,7 +57453,7 @@
2016550912,2016555007,SG
2016555008,2016559103,MY
2016559104,2016583679,KR
-2016583680,2016585727,JP
+2016583680,2016587775,JP
2016587776,2016589823,BD
2016589824,2016591871,VN
2016591872,2016673791,JP
@@ -55930,12 +57475,15 @@
2019035136,2019037183,CN
2019037184,2019041279,JP
2019041280,2019045375,IN
-2019049472,2019082239,AU
+2019045376,2019049471,JP
+2019049472,2019078143,AU
+2019078144,2019082239,IN
2019082240,2019098623,HK
2019098624,2019115007,PH
2019115008,2019117055,US
2019117056,2019119103,IN
2019119104,2019121151,NZ
+2019121152,2019123199,ID
2019123200,2019131391,NP
2019131392,2019164159,JP
2019164160,2019360767,CN
@@ -55944,6 +57492,7 @@
2019557376,2021654527,TW
2021654528,2022178815,CN
2022178816,2022180863,NZ
+2022180864,2022182911,JP
2022182912,2022184959,ID
2022184960,2022187007,KH
2022187008,2022187071,US
@@ -57700,7 +59249,7 @@
2304573440,2304638975,NO
2304638976,2304704511,CA
2304704512,2304770047,US
-2304770048,2304835583,SE
+2304770048,2304835583,FI
2304835584,2305097727,US
2305097728,2305163263,GB
2305163264,2305359871,US
@@ -57899,8 +59448,9 @@
2331770880,2331836415,AU
2331836416,2331901951,GB
2331901952,2331967487,US
-2332033024,2332098559,AU
+2332033024,2332098559,ID
2332098560,2332622847,DE
+2332622848,2332688383,CN
2332688384,2332753919,NL
2332753920,2333868031,DE
2333933568,2334064639,DE
@@ -57919,7 +59469,7 @@
2335899648,2335965183,AU
2335965184,2336161791,US
2336161792,2336227327,NL
-2336227328,2336358399,US
+2336292864,2336358399,US
2336358400,2336423935,FI
2336423936,2336882687,US
2336882688,2336948223,FI
@@ -57957,6 +59507,7 @@
2338455552,2338521087,NO
2338521088,2338586623,US
2338586624,2338652159,FR
+2338652160,2338717695,JP
2338717696,2338783231,US
2338783232,2338848767,CA
2338848768,2338914303,US
@@ -57967,6 +59518,7 @@
2340159488,2340225023,FR
2340225024,2340421631,US
2340421632,2340487167,IT
+2340487168,2340552703,CN
2340552704,2340618239,AU
2340618240,2340683775,US
2340683776,2340749311,AU
@@ -57979,14 +59531,18 @@
2341470208,2341535743,US
2341535744,2341601279,NO
2341601280,2341732351,US
+2341732352,2341797887,CN
2341797888,2341863423,GB
+2341863424,2341928959,KR
2341928960,2341994495,US
2341994496,2342060031,JP
2342060032,2342125567,GB
2342125568,2342191103,JP
+2342191104,2342256639,CN
2342256640,2342322175,NL
2342322176,2342387711,FI
2342387712,2342453247,FR
+2342453248,2342518783,CN
2342518784,2342584319,FR
2342584320,2342649855,US
2342649856,2342715391,NL
@@ -57997,10 +59553,12 @@
2342977536,2343043071,US
2343043072,2343108607,AU
2343108608,2343174143,US
+2343174144,2343239679,CN
2343239680,2343370751,US
2343370752,2343436287,CA
2343436288,2343501823,DE
2343501824,2343567359,TW
+2343567360,2343632895,CN
2343632896,2343698431,US
2343698432,2343763967,NL
2343763968,2343829503,TR
@@ -58009,19 +59567,32 @@
2343925760,2343934975,US
2343934976,2343935999,IL
2343936000,2344026111,US
+2344026112,2344091647,CN
2344091648,2344157183,GB
2344157184,2344222719,US
+2344222720,2344288255,CN
2344288256,2344353791,US
2344353792,2344419327,AU
+2344419328,2344484863,CN
+2344484864,2344550399,PK
2344550400,2344615935,EU
+2344615936,2344878079,ID
+2344878080,2346188799,CN
+2346188800,2346450943,AU
+2346450944,2346582015,CN
2346582016,2346647551,GB
2346647552,2346713087,TW
+2346713088,2346778623,CN
2346778624,2346844159,US
+2346844160,2346975231,CN
+2346975232,2347040767,ID
2347040768,2347106303,US
2347106304,2347171839,AU
-2347171840,2348810239,US
-2348810240,2348875775,AU
-2348875776,2353856511,US
+2347171840,2348744703,US
+2348744704,2348875775,ID
+2348875776,2353725439,US
+2353725440,2353790975,CN
+2353790976,2353856511,US
2353856512,2353922047,FR
2353922048,2353987583,AT
2353987584,2354053119,AU
@@ -58045,8 +59616,11 @@
2355691520,2355757055,IT
2355757056,2355953663,US
2355953664,2357919743,TW
-2357919744,2358509567,US
+2357919744,2358181887,US
+2358181888,2358247423,CN
+2358247424,2358509567,US
2358509568,2358575103,MX
+2358575104,2358640639,TH
2358640640,2358706175,SE
2358706176,2358771711,FI
2358771712,2359230463,US
@@ -58072,9 +59646,19 @@
2361982976,2362114047,US
2362114048,2362179583,IE
2362179584,2362245119,GB
-2362441728,2363883519,US
+2362245120,2362441727,CN
+2362441728,2362572799,US
+2362572800,2362638335,CN
+2362638336,2362769407,US
+2362769408,2362834943,ID
+2362834944,2363490303,US
+2363490304,2363555839,CN
+2363555840,2363883519,US
2363883520,2363949055,CA
-2363949056,2364538879,US
+2363949056,2364342271,US
+2364342272,2364407807,CN
+2364407808,2364538879,US
+2364538880,2364604415,CN
2364604416,2364671487,US
2364671488,2364671743,CN
2364671744,2364675839,US
@@ -58082,9 +59666,15 @@
2364676096,2364676863,US
2364676864,2364677119,GB
2364677120,2364735487,US
-2364801024,2365390847,US
+2364735488,2364801023,CN
+2364801024,2364932095,US
+2364932096,2364997631,CN
+2364997632,2365128703,US
+2365128704,2365259775,CN
+2365259776,2365390847,US
2365390848,2365456383,AU
2365456384,2365521919,US
+2365521920,2365587455,CN
2365587456,2366111743,DE
2366177280,2366308351,DE
2366308352,2366373887,GB
@@ -58295,14 +59885,17 @@
2415656960,2415722495,GB
2415722496,2415788031,JP
2415788032,2415853567,US
-2415919104,2415984639,AU
+2415919104,2415984639,CN
2415984640,2416050175,JP
2416050176,2416115711,NL
2416115712,2416181247,US
2416181248,2416246783,FI
2416246784,2416312319,US
2416312320,2416377855,AU
-2416443392,2416967679,US
+2416377856,2416443391,CN
+2416443392,2416705535,US
+2416705536,2416771071,CN
+2416771072,2416967679,US
2416967680,2417033215,IN
2417033216,2417229823,US
2417229824,2417295359,ES
@@ -58320,6 +59913,7 @@
2418737152,2418802687,NL
2418802688,2418868223,EU
2418868224,2419326975,US
+2419326976,2419392511,CN
2419392512,2419458047,AU
2419458048,2419523583,NL
2419523584,2419589119,AU
@@ -58359,6 +59953,7 @@
2423783424,2423848959,FJ
2423848960,2423914495,US
2423914496,2423980031,TR
+2423980032,2424045567,CN
2424045568,2424111103,GB
2424111104,2424242175,US
2424242176,2424307711,NO
@@ -58394,7 +59989,8 @@
2430205952,2430271487,AU
2430271488,2432172031,US
2432172032,2432237567,BE
-2432237568,2432696319,US
+2432237568,2432630783,US
+2432630784,2432696319,CN
2432696320,2433810431,NL
2433810432,2433875967,GB
2433875968,2436300799,NL
@@ -58833,17 +60429,23 @@
2516254720,2516320255,FR
2516320256,2516451327,US
2516451328,2516516863,GB
-2516582400,2516647935,AU
+2516582400,2516647935,CN
2516647936,2523201535,JP
2523201536,2523267071,AU
2523267072,2523529215,US
2523529216,2523594751,NO
-2523660288,2524971007,US
+2523660288,2524119039,US
+2524119040,2524184575,CN
+2524184576,2524315647,TW
+2524315648,2524512255,US
+2524512256,2524643327,CN
+2524643328,2524971007,US
2524971008,2525036543,ES
2525036544,2525102079,EU
2525102080,2525233151,US
2525233152,2525298687,SE
2525298688,2525626367,US
+2525626368,2525757439,CN
2525757440,2525822975,GR
2525822976,2526085119,US
2526085120,2526216191,IT
@@ -58879,7 +60481,9 @@
2530607104,2530672639,ES
2530672640,2530803711,US
2530803712,2530869247,IT
-2530869248,2531459071,US
+2530869248,2531196927,US
+2531196928,2531262463,CN
+2531262464,2531459071,US
2531459072,2531524607,SE
2531524608,2531590143,US
2531590144,2531655679,AU
@@ -58895,6 +60499,7 @@
2533031936,2533097471,BE
2533097472,2533228543,US
2533228544,2533294079,PL
+2533294080,2533359615,CN
2533359616,2539978751,IT
2539978752,2540240895,US
2540240896,2540306431,FI
@@ -58955,7 +60560,6 @@
2555641856,2555707391,BR
2555707392,2555903999,US
2555904000,2555969535,CH
-2555969536,2555969791,FR
2556035072,2556100607,NO
2556100608,2556166143,AU
2556166144,2556231679,BR
@@ -58994,9 +60598,10 @@
2561671168,2564947967,US
2564947968,2565013503,SG
2565013504,2565210111,US
-2566914048,2566979583,AU
+2566914048,2566979583,CN
2566979584,2567045119,FI
2567045120,2567110655,US
+2567110656,2567176191,CN
2567176192,2567241727,US
2567241728,2567307263,SI
2567307264,2567897087,US
@@ -59006,7 +60611,9 @@
2568093696,2568159231,US
2568159232,2568224767,PL
2568224768,2568290303,SG
-2568290304,2569601023,US
+2568290304,2569142271,US
+2569142272,2569404415,CN
+2569404416,2569601023,US
2569601024,2569666559,CA
2569666560,2569797631,US
2569797632,2569863167,NO
@@ -59022,7 +60629,10 @@
2572944896,2572945919,EU
2572945920,2572946175,DE
2572946176,2573008895,EU
-2573008896,2573533183,DE
+2573008896,2573402111,DE
+2573402112,2573467647,CN
+2573467648,2573533183,DE
+2573533184,2573598719,CN
2573598720,2573926399,US
2573926400,2573991935,AU
2573991936,2574123007,CH
@@ -59032,15 +60642,16 @@
2574315008,2574315263,NO
2574315264,2574319615,SE
2574319616,2574647295,US
-2575302656,2583691263,JP
+2574647296,2574778367,CN
+2574778368,2583691263,JP
2583691264,2584215551,US
2584215552,2584281087,GB
2584281088,2584346623,US
2584346624,2584412159,KR
2584412160,2584477695,CA
2584477696,2584608767,US
-2584608768,2584805375,CH
-2584805376,2585001983,US
+2584608768,2584739839,CH
+2584739840,2585001983,US
2585001984,2585067519,CA
2585067520,2585788415,US
2585788416,2585853951,GB
@@ -59202,8 +60813,10 @@
2627010560,2627076095,NZ
2627076096,2627141631,NL
2627141632,2627469311,US
-2634022912,2634088447,AU
-2634088448,2635399167,JP
+2634022912,2634088447,CN
+2634088448,2635202559,JP
+2635202560,2635268095,CN
+2635268096,2635399167,JP
2635399168,2635530239,US
2635530240,2635595775,FR
2635595776,2635661311,FI
@@ -59213,6 +60826,7 @@
2635988992,2636120063,US
2636120064,2637561855,ID
2637561856,2638020607,US
+2638020608,2638086143,CN
2638086144,2638151679,US
2638151680,2639462399,JP
2639462400,2639593471,GB
@@ -59232,6 +60846,7 @@
2640576512,2640642047,EC
2640642048,2641952767,JP
2641952768,2642018303,US
+2642018304,2642083839,CN
2642083840,2642149375,US
2642149376,2642214911,FI
2642214912,2642280447,SE
@@ -59247,8 +60862,11 @@
2643197952,2643263487,GB
2643263488,2643460095,US
2643460096,2643525631,FI
-2643525632,2644180991,US
+2643525632,2643722239,US
+2643722240,2643787775,CN
+2643787776,2644180991,US
2644180992,2644246527,AU
+2644246528,2644312063,CN
2644312064,2644377599,IS
2644377600,2644443135,PL
2644443136,2644508671,FR
@@ -59303,6 +60921,7 @@
2650406912,2650603519,US
2650603520,2650669055,CO
2650669056,2650734591,US
+2650734592,2650800127,CN
2650800128,2653159423,US
2653159424,2653421567,NO
2653421568,2653487103,AU
@@ -59513,7 +61132,12 @@
2678652928,2678718463,US
2678718464,2678783999,GB
2678784000,2678849535,NO
-2678849536,2678915071,US
+2678849536,2678885375,US
+2678885376,2678885631,GB
+2678885632,2678885887,DE
+2678885888,2678886143,US
+2678886144,2678886399,NL
+2678886400,2678915071,US
2678915072,2678980607,FR
2678980608,2679046143,US
2679046144,2679111679,CA
@@ -59830,7 +61454,7 @@
2727018496,2727084031,CA
2727084032,2727346175,US
2727346176,2727608319,AU
-2734686208,2734751743,AU
+2734686208,2734751743,CN
2734751744,2734817279,GB
2734817280,2734882815,US
2734882816,2734948351,SE
@@ -59856,10 +61480,13 @@
2742681600,2742747135,IN
2742747136,2742779903,CA
2742812672,2742878207,US
+2742878208,2742943743,CN
2742943744,2743009279,US
2743009280,2743140351,AU
2743140352,2743205887,US
-2743205888,2744516607,JP
+2743205888,2743992319,JP
+2743992320,2744057855,CN
+2744057856,2744516607,JP
2744516608,2744647679,US
2744647680,2744713215,KR
2744713216,2744844287,US
@@ -59882,13 +61509,16 @@
2746089472,2746155007,NO
2746155008,2746220543,NL
2746220544,2746286079,US
+2746286080,2746351615,CN
2746351616,2746417151,CR
+2746417152,2746482687,CN
2746482688,2746548223,KR
2746548224,2747072511,US
2747072512,2747138047,AU
2747138048,2747465727,US
2747465728,2748055551,ZA
-2748055552,2748317695,US
+2748055552,2748121087,CN
+2748121088,2748317695,US
2748317696,2749628415,JP
2749628416,2749890559,US
2749890560,2750021631,AU
@@ -60078,13 +61708,11 @@
2780926328,2780926335,US
2780926336,2780926367,GB
2780926368,2780926823,US
-2780926824,2780926847,GB
-2780926848,2780926975,US
+2780926824,2780926879,GB
+2780926880,2780926975,US
2780926976,2780927487,GB
2780927488,2780927743,US
-2780927744,2780927999,GB
-2780928000,2780928031,US
-2780928032,2780928127,GB
+2780927744,2780928127,GB
2780928128,2780928383,US
2780928384,2780928415,GB
2780928416,2780928447,US
@@ -60456,13 +62084,14 @@
2848522240,2848587775,AU
2848587776,2848653311,ZA
2848653312,2848980991,US
-2848980992,2849177855,AU
+2848980992,2849177855,KR
2849177856,2849178111,CN
-2849178112,2849178367,KR
-2849178368,2849178623,AU
+2849178112,2849178623,KR
2849178624,2849178879,ID
2849178880,2849179135,VN
-2849179136,2849964031,AU
+2849179136,2849898495,KR
+2849898496,2849898751,AU
+2849898752,2849964031,KR
2849964032,2850029567,PH
2850029568,2851995647,US
2852126720,2853306367,US
@@ -60505,6 +62134,10 @@
2867855360,2868117503,US
2868379648,2868772863,US
2868838400,2868903935,BE
+2868903936,2869035007,SG
+2869035008,2869166079,JP
+2869166080,2869428223,TH
+2869428224,2869952511,CN
2869952512,2870018047,FR
2870018048,2870083583,DE
2870083584,2870149119,FR
@@ -60523,9 +62156,17 @@
2870935552,2871001087,HU
2871001088,2871066623,SE
2871066624,2871083007,CH
-2873098240,2874146815,US
+2871132160,2872049663,CN
+2872049664,2873098239,IN
+2873098240,2873884671,US
+2873884672,2874146815,IN
+2874146816,2875195391,CN
+2875195392,2875719679,TH
+2875719680,2877292543,CN
2877292544,2882469887,US
-2882469888,2882535423,AU
+2882469888,2882535423,SG
+2882535424,2883583999,CN
+2883584000,2885681151,VN
2894069760,2894921727,US
2894921728,2895118335,GB
2895118336,2895301887,US
@@ -60554,7 +62195,19 @@
2902458368,2902462463,A1
2902462464,2902470936,US
2902470937,2902470938,LK
-2902470939,2902507519,US
+2902470939,2902471468,US
+2902471469,2902471470,AU
+2902471471,2902471895,US
+2902471896,2902471897,AU
+2902471898,2902471960,US
+2902471961,2902471962,AU
+2902471963,2902472037,US
+2902472038,2902472039,AU
+2902472040,2902472834,US
+2902472835,2902472836,BD
+2902472837,2902492927,US
+2902492928,2902493183,IN
+2902493184,2902507519,US
2902507520,2902515711,CA
2902515712,2904555519,US
2904555520,2904817663,CA
@@ -60596,7 +62249,15 @@
2913992704,2914516991,CA
2914516992,2915250175,US
2915250176,2915254271,CA
-2915254272,2915765279,US
+2915254272,2915274751,US
+2915274752,2915274815,PL
+2915274816,2915275007,US
+2915275008,2915275071,PL
+2915275072,2915275263,US
+2915275264,2915275327,PL
+2915275328,2915516671,US
+2915516672,2915516927,CA
+2915516928,2915765279,US
2915765280,2915765287,IN
2915765288,2915765343,US
2915765344,2915765351,NZ
@@ -60884,7 +62545,11 @@
2915811136,2915811199,IN
2915811200,2915958783,US
2915958784,2916024319,CA
-2916024320,2916163583,US
+2916024320,2916118223,US
+2916118224,2916118231,LK
+2916118232,2916121087,US
+2916121088,2916121343,GB
+2916121344,2916163583,US
2916163584,2916171775,CA
2916171776,2916184063,US
2916184064,2916196351,CA
@@ -60900,7 +62565,9 @@
2916434560,2916434591,CA
2916434592,2916434623,US
2916434624,2916434655,CA
-2916434656,2916437503,US
+2916434656,2916436735,US
+2916436736,2916436743,CA
+2916436744,2916437503,US
2916437504,2916437567,CA
2916437568,2916440143,US
2916440144,2916440159,CA
@@ -60908,20 +62575,27 @@
2916440176,2916440191,CA
2916440192,2916440223,US
2916440224,2916440239,CA
-2916440240,2916441119,US
+2916440240,2916440287,US
+2916440288,2916440295,CA
+2916440296,2916441119,US
2916441120,2916441151,CA
-2916441152,2916441343,US
+2916441152,2916441191,US
+2916441192,2916441199,CA
+2916441200,2916441343,US
2916441344,2916442111,CA
2916442112,2916442623,US
2916442624,2916442879,CA
2916442880,2916443614,US
2916443615,2916443647,CA
-2916443648,2916444927,US
+2916443648,2916444351,US
+2916444352,2916444359,CA
+2916444360,2916444927,US
2916444928,2916445951,CA
2916445952,2916449279,US
2916449280,2916450303,CA
2916450304,2916515839,US
-2916548608,2916581375,US
+2916515840,2916519935,CA
+2916524032,2916581375,US
2916581376,2916614143,PR
2916614144,2917167679,US
2917167680,2917167743,BR
@@ -60932,9 +62606,12 @@
2917167904,2917167935,TR
2917167936,2917167967,US
2917167968,2917167999,GB
-2917168000,2917168095,US
+2917168000,2917168031,UA
+2917168032,2917168095,US
2917168096,2917168127,NZ
-2917168128,2917168223,US
+2917168128,2917168159,US
+2917168160,2917168191,NL
+2917168192,2917168223,US
2917168224,2917168255,BR
2917168256,2917168319,US
2917168320,2917168351,AR
@@ -60946,13 +62623,15 @@
2917168608,2917168639,BR
2917168640,2917169663,US
2917169664,2917169695,DE
-2917169696,2917170015,US
+2917169696,2917169727,NL
+2917169728,2917170015,US
2917170016,2917170047,UA
2917170048,2917170079,BR
-2917170080,2917170111,US
+2917170080,2917170111,NL
2917170112,2917170143,RU
-2917170144,2917170207,US
-2917170208,2917170239,NL
+2917170144,2917170175,US
+2917170176,2917170207,NL
+2917170208,2917170239,US
2917170240,2917170271,RU
2917170272,2917170303,BR
2917170304,2917193025,US
@@ -60962,8 +62641,10 @@
2917194159,2917194201,US
2917194202,2917194206,SG
2917194207,2917195775,US
-2917195776,2917196031,CA
-2917196032,2917199871,A2
+2917195776,2917196159,CA
+2917196160,2917196287,A2
+2917196288,2917196415,CA
+2917196416,2917199871,A2
2917199872,2917203967,CA
2917203968,2917210335,US
2917210336,2917210367,CA
@@ -61013,9 +62694,19 @@
2917718528,2917719039,CA
2917719040,2917722367,US
2917722368,2917722623,CA
-2917722624,2917842175,US
+2917722624,2917802367,US
+2917802368,2917802375,CA
+2917802376,2917804935,US
+2917804936,2917804943,CA
+2917804944,2917815575,US
+2917815576,2917815583,RO
+2917815584,2917834751,US
+2917834752,2917835007,GB
+2917835008,2917842175,US
2917842176,2917842431,CA
-2917842432,2918014975,US
+2917842432,2917858047,US
+2917858048,2917858303,BE
+2917858304,2918014975,US
2918014976,2918023167,CA
2918023168,2918043647,US
2918043648,2918047743,CA
@@ -61025,7 +62716,9 @@
2918154240,2918170623,CA
2918170624,2918199679,US
2918199680,2918199743,CA
-2918199744,2918232063,US
+2918199744,2918200287,US
+2918200288,2918200303,CA
+2918200304,2918232063,US
2918232064,2918236159,CA
2918236160,2918260735,US
2918260736,2918264831,CA
@@ -61043,7 +62736,9 @@
2918375424,2918391807,US
2918391808,2918395903,CA
2918395904,2918404095,US
-2918404096,2918408191,PR
+2918404096,2918406911,PR
+2918406912,2918407423,US
+2918407424,2918408191,PR
2918408192,2918416383,US
2918416384,2918420479,CA
2918420480,2918432767,US
@@ -61053,16 +62748,45 @@
2918473728,2918477823,US
2918477824,2918481919,CA
2918481920,2918514943,US
-2918514944,2918515071,CA
-2918515072,2918533119,US
+2918514944,2918515079,CA
+2918515080,2918532111,US
+2918532112,2918532127,CN
+2918532128,2918532143,US
+2918532144,2918532151,PK
+2918532152,2918533119,US
2918533120,2918533127,CN
-2918533128,2918533167,US
-2918533168,2918533183,CN
-2918533184,2918533247,US
-2918533248,2918533375,CA
-2918533376,2918534911,US
+2918533128,2918533143,US
+2918533144,2918533151,CN
+2918533152,2918533159,US
+2918533160,2918533175,CN
+2918533176,2918533191,US
+2918533192,2918533199,AU
+2918533200,2918533215,CN
+2918533216,2918534687,US
+2918534688,2918534695,CN
+2918534696,2918534703,US
+2918534704,2918534807,CN
+2918534808,2918534815,US
+2918534816,2918534887,CN
+2918534888,2918534911,US
2918534912,2918534943,KR
-2918534944,2918580223,US
+2918534944,2918534983,CN
+2918534984,2918534991,ID
+2918534992,2918535199,US
+2918535200,2918535231,CN
+2918535232,2918535423,US
+2918535424,2918535679,CN
+2918535680,2918535807,US
+2918535808,2918536191,CN
+2918536192,2918536703,US
+2918536704,2918536959,CN
+2918536960,2918537215,US
+2918537216,2918537615,CN
+2918537616,2918537623,US
+2918537624,2918537727,CN
+2918537728,2918539007,US
+2918539008,2918539263,CN
+2918539264,2918580223,US
2918580224,2918588415,CA
2918588416,2918596607,US
2918596608,2918604799,CA
@@ -61081,13 +62805,17 @@
2918829696,2918829823,DE
2918829824,2918830079,CN
2918830080,2918834175,CA
-2918834176,2918838271,US
-2918838272,2918840319,AU
-2918840320,2918842367,US
+2918834176,2918842367,US
2918842368,2918875135,CA
2918875136,2918973439,US
2918973440,2918989823,CA
-2919006208,2919063551,US
+2918989824,2919010303,US
+2919010304,2919010559,CA
+2919010560,2919020543,US
+2919020544,2919020575,CA
+2919020576,2919020591,US
+2919020592,2919020655,CA
+2919020656,2919063551,US
2919063552,2919064063,MX
2919064064,2919067655,CN
2919067656,2919067695,US
@@ -61223,7 +62951,8 @@
2919069048,2919069055,US
2919069056,2919069063,CN
2919069064,2919069071,AF
-2919069072,2919069087,US
+2919069072,2919069079,CN
+2919069080,2919069087,US
2919069088,2919069095,IN
2919069096,2919069103,BZ
2919069104,2919069111,US
@@ -61248,7 +62977,8 @@
2919069296,2919069303,BR
2919069304,2919069327,US
2919069328,2919069335,BR
-2919069336,2919069359,US
+2919069336,2919069343,TR
+2919069344,2919069359,US
2919069360,2919069367,CN
2919069368,2919069375,AU
2919069376,2919069391,US
@@ -61257,16 +62987,25 @@
2919069408,2919069415,VN
2919069416,2919069439,US
2919069440,2919069447,CA
-2919069448,2919069471,US
+2919069448,2919069455,US
+2919069456,2919069463,CN
+2919069464,2919069471,US
2919069472,2919069479,CA
-2919069480,2919069527,US
+2919069480,2919069487,CN
+2919069488,2919069495,US
+2919069496,2919069503,CN
+2919069504,2919069511,AR
+2919069512,2919069527,US
2919069528,2919069535,TR
2919069536,2919069543,US
2919069544,2919069559,CN
2919069560,2919069567,AE
2919069568,2919069575,VN
2919069576,2919069583,CN
-2919069584,2919069631,US
+2919069584,2919069607,US
+2919069608,2919069615,CN
+2919069616,2919069623,QA
+2919069624,2919069631,PK
2919069632,2919069639,TW
2919069640,2919069663,US
2919069664,2919069671,CA
@@ -61294,7 +63033,75 @@
2919070944,2919070951,BR
2919070952,2919071143,US
2919071144,2919071151,CN
-2919071152,2919174143,US
+2919071152,2919170327,US
+2919170328,2919170335,PE
+2919170336,2919170351,US
+2919170352,2919170359,PE
+2919170360,2919170367,AU
+2919170368,2919170383,BR
+2919170384,2919170391,AU
+2919170392,2919170399,IN
+2919170400,2919170407,TR
+2919170408,2919170415,ES
+2919170416,2919170431,US
+2919170432,2919170439,JP
+2919170440,2919170447,IN
+2919170448,2919170463,TH
+2919170464,2919170487,US
+2919170488,2919170495,NL
+2919170496,2919170527,US
+2919170528,2919170535,BR
+2919170536,2919170551,US
+2919170552,2919170559,FR
+2919170560,2919170575,US
+2919170576,2919170583,FR
+2919170584,2919170591,US
+2919170592,2919170599,CN
+2919170600,2919170607,JP
+2919170608,2919170615,US
+2919170616,2919170623,CN
+2919170624,2919170639,US
+2919170640,2919170655,JP
+2919170656,2919170663,US
+2919170664,2919170671,PH
+2919170672,2919170679,JP
+2919170680,2919170695,US
+2919170696,2919170703,CN
+2919170704,2919170711,MX
+2919170712,2919170727,US
+2919170728,2919170735,IN
+2919170736,2919170751,US
+2919170752,2919170759,GB
+2919170760,2919170767,BR
+2919170768,2919170775,AR
+2919170776,2919170799,US
+2919170800,2919170815,SG
+2919170816,2919170863,US
+2919170864,2919170871,AU
+2919170872,2919170879,CH
+2919170880,2919170903,US
+2919170904,2919170911,GR
+2919170912,2919170919,BR
+2919170920,2919170935,US
+2919170936,2919170943,PH
+2919170944,2919170967,US
+2919170968,2919170975,NZ
+2919170976,2919171047,US
+2919171048,2919171055,BR
+2919171056,2919171071,US
+2919171072,2919171079,IN
+2919171080,2919171087,CL
+2919171088,2919171095,TR
+2919171096,2919171103,US
+2919171104,2919171111,PL
+2919171112,2919171119,US
+2919171120,2919171127,CL
+2919171128,2919171135,BR
+2919171136,2919171143,AU
+2919171144,2919171151,TR
+2919171152,2919171159,US
+2919171160,2919171167,AU
+2919171168,2919174143,US
2919174144,2919178239,CA
2919178240,2919186431,US
2919186432,2919190527,CA
@@ -61330,29 +63137,38 @@
2925002752,2925527039,CA
2925527040,2926575615,US
2926575616,2927099903,CA
-2927099904,2928173103,US
+2927099904,2927112031,US
+2927112032,2927112039,CH
+2927112040,2927152175,US
+2927152176,2927152183,CH
+2927152184,2927154847,US
+2927154848,2927154855,CH
+2927154856,2927911183,US
+2927911184,2927911191,CH
+2927911192,2928173103,US
2928173104,2928173119,PH
2928173120,2928173151,US
2928173152,2928173159,RU
-2928173160,2928173343,US
+2928173160,2928173223,US
+2928173224,2928173231,JP
+2928173232,2928173343,US
2928173344,2928173351,NL
-2928173352,2928173551,US
+2928173352,2928173519,US
+2928173520,2928173527,JP
+2928173528,2928173551,US
2928173552,2928173559,CA
2928173560,2928173679,US
2928173680,2928173695,JP
2928173696,2928173711,US
2928173712,2928173727,JP
-2928173728,2928173775,US
-2928173776,2928173783,IE
-2928173784,2928173855,US
-2928173856,2928173871,AU
-2928173872,2928173903,US
+2928173728,2928173903,US
2928173904,2928173919,NZ
2928173920,2928173959,US
2928173960,2928173967,CA
2928173968,2928174087,US
2928174088,2928174103,CA
-2928174104,2928174223,US
+2928174104,2928174215,US
+2928174216,2928174223,MQ
2928174224,2928174231,CA
2928174232,2928174479,US
2928174480,2928174487,SE
@@ -62356,7 +64172,9 @@
2987433348,2987433359,KZ
2987433360,2987433375,RU
2987433376,2987433379,KZ
-2987433380,2987433407,RU
+2987433380,2987433383,RU
+2987433384,2987433391,KZ
+2987433392,2987433407,RU
2987433408,2987433471,KZ
2987433472,2987433983,RU
2987433984,2987438079,FR
@@ -62431,8 +64249,7 @@
2987655168,2987658367,DE
2987658368,2987658383,AT
2987658384,2987659263,DE
-2987659264,2987660799,BA
-2987660800,2987661311,SI
+2987659264,2987661311,BA
2987661312,2987663359,GB
2987663360,2987665407,IT
2987665408,2987667455,RU
@@ -62496,7 +64313,8 @@
2987788288,2987788543,GB
2987788544,2987788799,DE
2987788800,2987789055,US
-2987789056,2987790335,TR
+2987789056,2987789311,GB
+2987789312,2987790335,TR
2987790336,2987792383,GB
2987792384,2987794431,CH
2987794432,2987796479,IQ
@@ -62571,7 +64389,9 @@
2988441896,2988441903,PL
2988441904,2988441911,IT
2988441912,2988441919,ES
-2988441920,2988441951,FR
+2988441920,2988441939,FR
+2988441940,2988441943,ES
+2988441944,2988441951,FR
2988441952,2988441967,PL
2988441968,2988441971,NL
2988441972,2988441975,CH
@@ -62599,7 +64419,10 @@
2988442652,2988442655,GB
2988442656,2988442671,PL
2988442672,2988442675,GB
-2988442676,2988442895,FR
+2988442676,2988442687,FR
+2988442688,2988442695,PL
+2988442696,2988442703,PT
+2988442704,2988442895,FR
2988442896,2988442899,PL
2988442900,2988442903,FR
2988442904,2988442907,IT
@@ -62611,7 +64434,7 @@
2988442928,2988442975,FR
2988442976,2988443007,GB
2988443008,2988443023,PT
-2988443024,2988443027,NL
+2988443024,2988443027,CZ
2988443028,2988443031,BE
2988443032,2988443035,GB
2988443036,2988443039,BE
@@ -62662,8 +64485,8 @@
2988444800,2988444927,ES
2988444928,2988444931,PL
2988444932,2988444943,DE
-2988444944,2988444959,PL
-2988444960,2988444999,FR
+2988444944,2988444967,PL
+2988444968,2988444999,FR
2988445000,2988445007,PL
2988445008,2988445023,FR
2988445024,2988445027,PL
@@ -62672,8 +64495,8 @@
2988445036,2988445039,PL
2988445040,2988445119,FR
2988445120,2988445127,ES
-2988445128,2988445151,FR
-2988445152,2988445183,IT
+2988445128,2988445167,FR
+2988445168,2988445183,ES
2988445184,2988445951,DE
2988445952,2988445967,FR
2988445968,2988445983,GB
@@ -62698,10 +64521,8 @@
2988447924,2988447927,IT
2988447928,2988447935,PL
2988447936,2988447943,DE
-2988447944,2988447947,NL
-2988447948,2988447951,DE
-2988447952,2988447955,GB
-2988447956,2988447959,BE
+2988447944,2988447947,GB
+2988447948,2988447959,FR
2988447960,2988447967,IT
2988447968,2988447999,GB
2988448000,2988448127,DE
@@ -62769,8 +64590,10 @@
2988458076,2988458111,PL
2988458112,2988458255,FR
2988458256,2988458271,IT
-2988458272,2988458287,PL
-2988458288,2988458295,FR
+2988458272,2988458275,GB
+2988458276,2988458279,FI
+2988458280,2988458283,ES
+2988458284,2988458295,FR
2988458296,2988458299,GB
2988458300,2988458319,ES
2988458320,2988458323,CZ
@@ -62815,7 +64638,7 @@
2988459236,2988459239,PL
2988459240,2988459243,FR
2988459244,2988459247,ES
-2988459248,2988459251,FR
+2988459248,2988459251,LT
2988459252,2988459255,BE
2988459256,2988459259,FR
2988459260,2988459263,NL
@@ -62859,8 +64682,7 @@
2988460016,2988460031,FR
2988460032,2988460063,DE
2988460064,2988460095,FR
-2988460096,2988460103,ES
-2988460104,2988460107,PL
+2988460096,2988460107,PL
2988460108,2988460111,DE
2988460112,2988460119,FR
2988460120,2988460123,DE
@@ -62869,8 +64691,7 @@
2988460132,2988460135,CZ
2988460136,2988460143,FR
2988460144,2988460147,GB
-2988460148,2988460151,FR
-2988460152,2988460159,ES
+2988460148,2988460159,ES
2988460160,2988460191,GB
2988460192,2988460195,FR
2988460196,2988460199,CZ
@@ -62887,8 +64708,9 @@
2988460288,2988460323,FR
2988460324,2988460327,GB
2988460328,2988460335,PL
-2988460336,2988460351,DE
-2988460352,2988460367,FR
+2988460336,2988460339,FR
+2988460340,2988460343,GB
+2988460344,2988460367,FR
2988460368,2988460375,PL
2988460376,2988460543,FR
2988460544,2988460547,GB
@@ -62915,8 +64737,8 @@
2988461088,2988461103,PL
2988461104,2988461119,FR
2988461120,2988461151,NL
-2988461152,2988461247,GB
-2988461248,2988461255,FR
+2988461152,2988461183,GB
+2988461184,2988461255,FR
2988461256,2988461259,IT
2988461260,2988461263,PT
2988461264,2988461279,PL
@@ -62981,11 +64803,15 @@
2988461884,2988461887,IT
2988461888,2988461903,FR
2988461904,2988461911,ES
-2988461912,2988461935,FR
+2988461912,2988461915,IT
+2988461916,2988461919,NL
+2988461920,2988461935,FR
2988461936,2988461951,GB
2988461952,2988462087,PL
2988462088,2988462095,DE
-2988462096,2988462127,FR
+2988462096,2988462119,FR
+2988462120,2988462123,PL
+2988462124,2988462127,GB
2988462128,2988462131,ES
2988462132,2988462143,FR
2988462144,2988462151,PL
@@ -63003,7 +64829,8 @@
2988462312,2988462319,FR
2988462320,2988462323,IT
2988462324,2988462327,DE
-2988462328,2988462335,FR
+2988462328,2988462331,GB
+2988462332,2988462335,FR
2988462336,2988462463,ES
2988462464,2988462495,GB
2988462496,2988462527,DE
@@ -63096,7 +64923,7 @@
2988464276,2988464279,PL
2988464280,2988464283,FR
2988464284,2988464287,PL
-2988464288,2988464303,ES
+2988464288,2988464303,FR
2988464304,2988464307,IT
2988464308,2988464351,FR
2988464352,2988464355,DE
@@ -63202,8 +65029,9 @@
2988483088,2988483091,FR
2988483092,2988483095,BE
2988483096,2988483103,FR
-2988483104,2988483111,ES
-2988483112,2988483115,FR
+2988483104,2988483107,IE
+2988483108,2988483111,PL
+2988483112,2988483115,ES
2988483116,2988483119,PL
2988483120,2988483135,GB
2988483136,2988483151,FR
@@ -63218,7 +65046,9 @@
2988483284,2988483295,DE
2988483296,2988483299,FR
2988483300,2988483303,NL
-2988483304,2988483319,FR
+2988483304,2988483311,FR
+2988483312,2988483315,GB
+2988483316,2988483319,NL
2988483320,2988483327,PL
2988483328,2988483335,BE
2988483336,2988483343,DE
@@ -63226,17 +65056,20 @@
2988483352,2988483359,FR
2988483360,2988483367,ES
2988483368,2988483375,PL
-2988483376,2988483383,GB
+2988483376,2988483383,ES
2988483384,2988483427,FR
2988483428,2988483431,BE
2988483432,2988483447,FR
2988483448,2988483455,DE
2988483456,2988483711,FR
-2988483712,2988483743,PL
+2988483712,2988483727,PL
+2988483728,2988483735,FR
+2988483736,2988483739,DE
+2988483740,2988483743,FR
2988483744,2988483767,GB
2988483768,2988483775,FR
2988483776,2988483871,PL
-2988483872,2988483879,DE
+2988483872,2988483879,FR
2988483880,2988483887,ES
2988483888,2988483895,GB
2988483896,2988483903,DE
@@ -63272,7 +65105,36 @@
2988484240,2988484243,DE
2988484244,2988484287,FR
2988484288,2988484351,PL
-2988484352,2988485887,FR
+2988484352,2988484383,GB
+2988484384,2988484399,PL
+2988484400,2988484403,PT
+2988484404,2988484427,PL
+2988484428,2988484431,GB
+2988484432,2988484439,PL
+2988484440,2988484443,ES
+2988484444,2988484447,FR
+2988484448,2988484463,SN
+2988484464,2988484471,FR
+2988484472,2988484475,PL
+2988484476,2988484479,FR
+2988484480,2988484511,PL
+2988484512,2988484543,IT
+2988484544,2988484591,FR
+2988484592,2988484607,ES
+2988484608,2988485599,FR
+2988485600,2988485607,PL
+2988485608,2988485611,GB
+2988485612,2988485615,PL
+2988485616,2988485631,GB
+2988485632,2988485663,ES
+2988485664,2988485671,PL
+2988485672,2988485675,ES
+2988485676,2988485683,FR
+2988485684,2988485687,PL
+2988485688,2988485691,GB
+2988485692,2988485839,FR
+2988485840,2988485855,BE
+2988485856,2988485887,FR
2988485888,2988485903,PL
2988485904,2988485911,GB
2988485912,2988485951,FR
@@ -63283,7 +65145,7 @@
2988485984,2988485999,FR
2988486000,2988486015,PL
2988486016,2988486031,FR
-2988486032,2988486047,ES
+2988486032,2988486047,PL
2988486048,2988486063,GB
2988486064,2988486067,FR
2988486068,2988486071,ES
@@ -63295,7 +65157,9 @@
2988486112,2988486127,PL
2988486128,2988486159,NL
2988486160,2988486175,IE
-2988486176,2988486191,GB
+2988486176,2988486179,FR
+2988486180,2988486183,DE
+2988486184,2988486191,IE
2988486192,2988486195,IT
2988486196,2988486199,DE
2988486200,2988486207,PT
@@ -63317,7 +65181,8 @@
2988486348,2988486351,ES
2988486352,2988486399,FR
2988486400,2988486783,GB
-2988486784,2988486795,FR
+2988486784,2988486787,DE
+2988486788,2988486795,FR
2988486796,2988486799,PL
2988486800,2988486807,FR
2988486808,2988486811,DE
@@ -63479,7 +65344,7 @@
2988507168,2988507183,DE
2988507184,2988507199,FR
2988507200,2988507203,GB
-2988507204,2988507207,PL
+2988507204,2988507207,DE
2988507208,2988507211,ES
2988507212,2988507215,PL
2988507216,2988507231,FR
@@ -63564,7 +65429,8 @@
2988508072,2988508079,FR
2988508080,2988508095,ES
2988508096,2988508103,FR
-2988508104,2988508127,GB
+2988508104,2988508111,GB
+2988508112,2988508127,BE
2988508128,2988508135,PL
2988508136,2988508143,GB
2988508144,2988508151,FR
@@ -63573,7 +65439,9 @@
2988508208,2988508215,PL
2988508216,2988508219,FR
2988508220,2988508223,DE
-2988508224,2988508287,FR
+2988508224,2988508263,FR
+2988508264,2988508271,ES
+2988508272,2988508287,FR
2988508288,2988508303,PL
2988508304,2988508307,PT
2988508308,2988508315,FR
@@ -63604,7 +65472,7 @@
2988508856,2988508871,FR
2988508872,2988508875,PL
2988508876,2988508879,PT
-2988508880,2988508895,ES
+2988508880,2988508895,DE
2988508896,2988508911,PL
2988508912,2988508927,FR
2988508928,2988508943,GB
@@ -63684,7 +65552,9 @@
2988509960,2988509963,IT
2988509964,2988509967,GB
2988509968,2988509983,ES
-2988509984,2988509995,FR
+2988509984,2988509987,DE
+2988509988,2988509991,CZ
+2988509992,2988509995,FR
2988509996,2988509999,DE
2988510000,2988510015,PL
2988510016,2988510023,ES
@@ -63766,7 +65636,7 @@
2988511776,2988511807,GB
2988511808,2988511823,ES
2988511824,2988511831,DE
-2988511832,2988511835,ES
+2988511832,2988511835,GB
2988511836,2988511855,FR
2988511856,2988511871,GB
2988511872,2988511887,PL
@@ -63809,7 +65679,7 @@
2988512316,2988512319,DE
2988512320,2988512335,FR
2988512336,2988512339,PL
-2988512340,2988512343,ES
+2988512340,2988512343,DE
2988512344,2988512351,FR
2988512352,2988512383,IT
2988512384,2988512415,FR
@@ -63849,8 +65719,8 @@
2988512840,2988512847,DE
2988512848,2988512851,ES
2988512852,2988512855,DE
-2988512856,2988512879,FR
-2988512880,2988512895,DE
+2988512856,2988512883,FR
+2988512884,2988512895,DE
2988512896,2988512899,PL
2988512900,2988512903,GB
2988512904,2988512907,ES
@@ -63892,14 +65762,14 @@
2988513308,2988513311,PL
2988513312,2988513327,PT
2988513328,2988513331,PL
-2988513332,2988513335,FR
-2988513336,2988513343,GB
+2988513332,2988513343,FR
2988513344,2988513351,ES
2988513352,2988513359,IT
2988513360,2988513375,GB
2988513376,2988513379,FR
2988513380,2988513383,PT
-2988513384,2988513407,GB
+2988513384,2988513391,GB
+2988513392,2988513407,FR
2988513408,2988513471,PL
2988513472,2988513503,FR
2988513504,2988513507,CH
@@ -63933,8 +65803,12 @@
2988513900,2988513903,PL
2988513904,2988513919,IT
2988513920,2988513951,FR
-2988513952,2988513983,PT
-2988513984,2988514015,GB
+2988513952,2988513967,PT
+2988513968,2988513975,FI
+2988513976,2988513983,IT
+2988513984,2988513991,GB
+2988513992,2988513999,IE
+2988514000,2988514015,FR
2988514016,2988514019,PT
2988514020,2988514023,NL
2988514024,2988514027,PT
@@ -63978,8 +65852,8 @@
2988514400,2988514431,GB
2988514432,2988514447,FR
2988514448,2988514463,ES
-2988514464,2988514527,FR
-2988514528,2988514559,DE
+2988514464,2988514543,FR
+2988514544,2988514559,PL
2988514560,2988514623,FR
2988514624,2988514655,DE
2988514656,2988514671,FR
@@ -63995,13 +65869,13 @@
2988514752,2988514815,FI
2988514816,2988514823,FR
2988514824,2988514827,PL
-2988514828,2988514831,DE
+2988514828,2988514831,FR
2988514832,2988514839,PL
2988514840,2988514879,ES
2988514880,2988514943,PL
2988514944,2988514959,ES
2988514960,2988514975,PL
-2988514976,2988514979,BE
+2988514976,2988514979,FR
2988514980,2988514983,PL
2988514984,2988514991,IT
2988514992,2988514995,FR
@@ -64036,8 +65910,15 @@
2988524164,2988524167,FR
2988524168,2988524175,ES
2988524176,2988524191,FR
-2988524192,2988524227,DE
-2988524228,2988524231,IE
+2988524192,2988524195,FI
+2988524196,2988524199,DE
+2988524200,2988524203,IE
+2988524204,2988524211,FR
+2988524212,2988524215,FI
+2988524216,2988524219,FR
+2988524220,2988524223,ES
+2988524224,2988524227,DE
+2988524228,2988524231,PL
2988524232,2988524239,ES
2988524240,2988524255,FR
2988524256,2988524259,LT
@@ -64093,7 +65974,7 @@
2988526580,2988526583,ES
2988526584,2988526591,DE
2988526592,2988526607,FR
-2988526608,2988526615,GB
+2988526608,2988526615,DE
2988526616,2988526687,FR
2988526688,2988526703,ES
2988526704,2988526711,FR
@@ -64121,7 +66002,236 @@
2988527192,2988527195,DE
2988527196,2988527199,FR
2988527200,2988527207,NL
-2988527208,2988535807,FR
+2988527208,2988527211,DE
+2988527212,2988527391,FR
+2988527392,2988527399,PL
+2988527400,2988527407,DE
+2988527408,2988527411,FR
+2988527412,2988527415,PL
+2988527416,2988527423,GB
+2988527424,2988527431,FR
+2988527432,2988527439,IT
+2988527440,2988527451,PL
+2988527452,2988527455,PT
+2988527456,2988527459,IT
+2988527460,2988527475,FR
+2988527476,2988527479,ES
+2988527480,2988527487,FR
+2988527488,2988527503,GB
+2988527504,2988527523,FR
+2988527524,2988527531,DE
+2988527532,2988527551,FR
+2988527552,2988527583,PL
+2988527584,2988527591,GB
+2988527592,2988527595,IT
+2988527596,2988527599,DE
+2988527600,2988527603,NL
+2988527604,2988527607,FR
+2988527608,2988527611,DE
+2988527612,2988527615,PT
+2988527616,2988528127,DE
+2988528128,2988528159,GB
+2988528160,2988528175,ES
+2988528176,2988528179,CH
+2988528180,2988528183,IT
+2988528184,2988528187,PL
+2988528188,2988528191,GB
+2988528192,2988528207,IE
+2988528208,2988528215,FR
+2988528216,2988528219,IE
+2988528220,2988528223,DE
+2988528224,2988528231,CH
+2988528232,2988528235,GB
+2988528236,2988528239,FR
+2988528240,2988528255,GB
+2988528256,2988528383,FR
+2988528384,2988528399,GB
+2988528400,2988528415,FR
+2988528416,2988528423,GB
+2988528424,2988528431,NL
+2988528432,2988528451,CH
+2988528452,2988528455,DE
+2988528456,2988528459,ES
+2988528460,2988528463,NL
+2988528464,2988528467,DE
+2988528468,2988528471,GB
+2988528472,2988528475,ES
+2988528476,2988528479,DE
+2988528480,2988528483,NL
+2988528484,2988528487,ES
+2988528488,2988528495,FR
+2988528496,2988528511,IT
+2988528512,2988528671,FR
+2988528672,2988528703,DE
+2988528704,2988528767,FR
+2988528768,2988528771,DE
+2988528772,2988528783,FR
+2988528784,2988528787,ES
+2988528788,2988528791,FR
+2988528792,2988528795,PL
+2988528796,2988528799,GB
+2988528800,2988528863,FR
+2988528864,2988528867,DE
+2988528868,2988528875,FR
+2988528876,2988528879,GB
+2988528880,2988528895,ES
+2988528896,2988528911,FR
+2988528912,2988528919,ES
+2988528920,2988528923,CH
+2988528924,2988528927,GB
+2988528928,2988528959,FR
+2988528960,2988528991,FI
+2988528992,2988529007,LT
+2988529008,2988529023,FI
+2988529024,2988529031,PL
+2988529032,2988529047,FR
+2988529048,2988529051,PL
+2988529052,2988529055,PT
+2988529056,2988529119,FR
+2988529120,2988529151,NL
+2988529152,2988529159,IT
+2988529160,2988529163,IE
+2988529164,2988529167,DE
+2988529168,2988529171,IE
+2988529172,2988529175,PT
+2988529176,2988529179,ES
+2988529180,2988529199,FR
+2988529200,2988529207,PL
+2988529208,2988529247,FR
+2988529248,2988529251,GB
+2988529252,2988529255,PL
+2988529256,2988529263,NL
+2988529264,2988529311,FR
+2988529312,2988529315,PL
+2988529316,2988529319,FR
+2988529320,2988529323,FI
+2988529324,2988529331,DE
+2988529332,2988529335,FR
+2988529336,2988529339,GB
+2988529340,2988529343,DE
+2988529344,2988529351,IE
+2988529352,2988529359,GB
+2988529360,2988529375,IE
+2988529376,2988529383,GB
+2988529384,2988529387,DE
+2988529388,2988529391,FR
+2988529392,2988529407,PL
+2988529408,2988529423,FR
+2988529424,2988529431,DE
+2988529432,2988529439,FR
+2988529440,2988529455,PL
+2988529456,2988529535,FR
+2988529536,2988529567,FI
+2988529568,2988529599,GB
+2988529600,2988529607,IT
+2988529608,2988529631,FR
+2988529632,2988529647,LT
+2988529648,2988529663,FR
+2988529664,2988529679,PL
+2988529680,2988529703,FR
+2988529704,2988529707,GB
+2988529708,2988529759,FR
+2988529760,2988529767,PL
+2988529768,2988529771,FR
+2988529772,2988529775,DE
+2988529776,2988529783,ES
+2988529784,2988529791,CH
+2988529792,2988529823,FR
+2988529824,2988529855,ES
+2988529856,2988529887,FR
+2988529888,2988529891,DE
+2988529892,2988529895,PL
+2988529896,2988529899,GB
+2988529900,2988529903,FI
+2988529904,2988529919,BE
+2988529920,2988529935,FR
+2988529936,2988529939,CH
+2988529940,2988529943,GB
+2988529944,2988529951,NL
+2988529952,2988529955,GB
+2988529956,2988529959,DE
+2988529960,2988529967,GB
+2988529968,2988529983,NL
+2988529984,2988529999,GB
+2988530000,2988530003,FR
+2988530004,2988530007,GB
+2988530008,2988530039,FR
+2988530040,2988530043,ES
+2988530044,2988530047,FR
+2988530048,2988530063,GB
+2988530064,2988530079,DE
+2988530080,2988530095,FR
+2988530096,2988530099,DE
+2988530100,2988530103,FR
+2988530104,2988530111,GB
+2988530112,2988530191,FR
+2988530192,2988530207,NL
+2988530208,2988530239,IE
+2988530240,2988530271,FR
+2988530272,2988530303,IE
+2988530304,2988530367,FR
+2988530368,2988530371,ES
+2988530372,2988530379,FR
+2988530380,2988530383,CH
+2988530384,2988530391,FR
+2988530392,2988530399,IE
+2988530400,2988530403,ES
+2988530404,2988530415,FR
+2988530416,2988530419,PT
+2988530420,2988530423,PL
+2988530424,2988530431,ES
+2988530432,2988530687,DE
+2988530688,2988530695,IT
+2988530696,2988530703,PL
+2988530704,2988530735,FR
+2988530736,2988530739,IE
+2988530740,2988530743,NL
+2988530744,2988530751,PL
+2988530752,2988530847,FR
+2988530848,2988530851,DE
+2988530852,2988530855,ES
+2988530856,2988530863,PT
+2988530864,2988530867,PL
+2988530868,2988530871,FR
+2988530872,2988530879,IT
+2988530880,2988530887,PL
+2988530888,2988530895,DE
+2988530896,2988530975,FR
+2988530976,2988531007,PL
+2988531008,2988531015,DE
+2988531016,2988531019,NL
+2988531020,2988531023,IE
+2988531024,2988531027,ES
+2988531028,2988531031,FR
+2988531032,2988531039,PL
+2988531040,2988531047,FR
+2988531048,2988531051,GB
+2988531052,2988531055,PL
+2988531056,2988531071,FR
+2988531072,2988531075,DE
+2988531076,2988531079,GB
+2988531080,2988531151,FR
+2988531152,2988531167,PL
+2988531168,2988531175,NL
+2988531176,2988531183,GB
+2988531184,2988531187,ES
+2988531188,2988531191,IE
+2988531192,2988531199,FR
+2988531200,2988531247,ES
+2988531248,2988531259,PL
+2988531260,2988531263,GB
+2988531264,2988531295,FR
+2988531296,2988531311,IE
+2988531312,2988531319,FR
+2988531320,2988531323,PT
+2988531324,2988531327,GB
+2988531328,2988531391,FR
+2988531392,2988531399,PL
+2988531400,2988531403,DE
+2988531404,2988531423,PL
+2988531424,2988531451,FR
+2988531452,2988531455,CH
+2988531456,2988535807,FR
2988535808,2988537855,ES
2988537856,2988539935,FR
2988539936,2988539967,GB
@@ -64172,7 +66282,7 @@
2988540544,2988540607,PL
2988540608,2988540639,FR
2988540640,2988540647,PL
-2988540648,2988540651,GB
+2988540648,2988540651,FR
2988540652,2988540667,PL
2988540668,2988540671,IT
2988540672,2988540683,PL
@@ -64230,13 +66340,12 @@
2988541464,2988541467,ES
2988541468,2988541503,FR
2988541504,2988541519,CH
-2988541520,2988541535,FR
-2988541536,2988541539,GB
+2988541520,2988541539,FR
2988541540,2988541543,PT
2988541544,2988541547,FR
2988541548,2988541551,ES
-2988541552,2988541583,FR
-2988541584,2988541587,ES
+2988541552,2988541567,FR
+2988541568,2988541587,ES
2988541588,2988541603,FR
2988541604,2988541607,NL
2988541608,2988541611,GB
@@ -64306,7 +66415,8 @@
2988542336,2988542367,FR
2988542368,2988542399,CZ
2988542400,2988542407,FR
-2988542408,2988542415,PL
+2988542408,2988542411,LT
+2988542412,2988542415,PL
2988542416,2988542431,FR
2988542432,2988542439,PL
2988542440,2988542443,ES
@@ -64373,7 +66483,7 @@
2988543300,2988543303,FR
2988543304,2988543307,ES
2988543308,2988543311,PL
-2988543312,2988543315,DE
+2988543312,2988543315,FR
2988543316,2988543319,IE
2988543320,2988543323,FI
2988543324,2988543327,PL
@@ -64408,8 +66518,14 @@
2988543940,2988543947,PL
2988543948,2988543959,BE
2988543960,2988543967,PL
-2988543968,2988543999,FR
-2988544000,2988544127,CZ
+2988543968,2988544015,FR
+2988544016,2988544023,GB
+2988544024,2988544031,IE
+2988544032,2988544039,FR
+2988544040,2988544043,DE
+2988544044,2988544047,GB
+2988544048,2988544063,FR
+2988544064,2988544127,DE
2988544128,2988544159,GB
2988544160,2988544163,FR
2988544164,2988544167,PL
@@ -64419,7 +66535,8 @@
2988544184,2988544191,DE
2988544192,2988544227,ES
2988544228,2988544271,FR
-2988544272,2988544279,BE
+2988544272,2988544275,DE
+2988544276,2988544279,FR
2988544280,2988544283,GB
2988544284,2988544287,DE
2988544288,2988544291,PL
@@ -64441,16 +66558,24 @@
2988544384,2988544447,GB
2988544448,2988544463,FR
2988544464,2988544479,ES
-2988544480,2988544495,PL
-2988544496,2988544511,IE
+2988544480,2988544511,PL
2988544512,2988544527,FR
2988544528,2988544535,ES
2988544536,2988544539,PL
2988544540,2988544543,LT
2988544544,2988544639,ES
-2988544640,2988544735,DE
-2988544736,2988544751,PL
-2988544752,2988544799,FR
+2988544640,2988544647,PL
+2988544648,2988544655,FR
+2988544656,2988544659,ES
+2988544660,2988544663,FR
+2988544664,2988544667,DE
+2988544668,2988544671,ES
+2988544672,2988544687,GB
+2988544688,2988544703,PL
+2988544704,2988544719,IT
+2988544720,2988544723,FR
+2988544724,2988544727,DE
+2988544728,2988544799,FR
2988544800,2988544831,FI
2988544832,2988544863,FR
2988544864,2988544895,PL
@@ -64498,8 +66623,8 @@
2988545376,2988545383,DE
2988545384,2988545387,ES
2988545388,2988545391,FR
-2988545392,2988545399,GB
-2988545400,2988545407,FR
+2988545392,2988545395,DE
+2988545396,2988545407,FR
2988545408,2988545439,IE
2988545440,2988545471,FR
2988545472,2988545503,ES
@@ -64513,7 +66638,7 @@
2988545552,2988545555,PL
2988545556,2988545559,IT
2988545560,2988545563,FR
-2988545564,2988545567,ES
+2988545564,2988545567,DE
2988545568,2988545571,NL
2988545572,2988545575,DE
2988545576,2988545579,FR
@@ -64540,7 +66665,7 @@
2988545944,2988545967,NL
2988545968,2988545971,IT
2988545972,2988545979,FR
-2988545980,2988545983,GB
+2988545980,2988545983,DE
2988545984,2988545987,FR
2988545988,2988545991,PL
2988545992,2988545995,LT
@@ -64575,8 +66700,10 @@
2988546328,2988546335,ES
2988546336,2988546351,PT
2988546352,2988546367,ES
-2988546368,2988546431,FR
-2988546432,2988546463,DE
+2988546368,2988546439,FR
+2988546440,2988546443,DE
+2988546444,2988546447,FR
+2988546448,2988546463,ES
2988546464,2988546527,FR
2988546528,2988546535,BE
2988546536,2988546539,IE
@@ -64591,16 +66718,15 @@
2988546600,2988546603,PT
2988546604,2988546615,GB
2988546616,2988546619,FI
-2988546620,2988546623,FR
+2988546620,2988546623,IT
2988546624,2988546687,FI
2988546688,2988546695,PL
2988546696,2988546699,FR
2988546700,2988546703,IT
-2988546704,2988546727,FR
-2988546728,2988546735,ES
-2988546736,2988546751,FR
+2988546704,2988546751,FR
2988546752,2988546783,ES
-2988546784,2988546819,FR
+2988546784,2988546815,FR
+2988546816,2988546819,PT
2988546820,2988546823,NL
2988546824,2988546831,FR
2988546832,2988546835,DE
@@ -64611,7 +66737,8 @@
2988546948,2988546951,DE
2988546952,2988546955,FR
2988546956,2988546959,GB
-2988546960,2988546967,DE
+2988546960,2988546963,CH
+2988546964,2988546967,IT
2988546968,2988546971,FR
2988546972,2988546975,BE
2988546976,2988546991,FI
@@ -64642,13 +66769,11 @@
2988547136,2988547167,IT
2988547168,2988547199,BE
2988547200,2988547207,IE
-2988547208,2988547211,FR
-2988547212,2988547215,DE
-2988547216,2988547219,IT
-2988547220,2988547223,FR
-2988547224,2988547227,ES
-2988547228,2988547231,PT
-2988547232,2988547239,FR
+2988547208,2988547211,ES
+2988547212,2988547215,GB
+2988547216,2988547223,FR
+2988547224,2988547227,GB
+2988547228,2988547239,FR
2988547240,2988547247,PL
2988547248,2988547255,NL
2988547256,2988547263,FR
@@ -64667,7 +66792,7 @@
2988547448,2988547451,FR
2988547452,2988547455,PT
2988547456,2988547471,DE
-2988547472,2988547475,NL
+2988547472,2988547475,LT
2988547476,2988547479,GB
2988547480,2988547487,FR
2988547488,2988547519,ES
@@ -64729,7 +66854,9 @@
2988556888,2988556895,FR
2988556896,2988556911,PL
2988556912,2988556919,NL
-2988556920,2988556959,PL
+2988556920,2988556927,PL
+2988556928,2988556943,FR
+2988556944,2988556959,PL
2988556960,2988556963,ES
2988556964,2988556967,FR
2988556968,2988556975,BE
@@ -64745,8 +66872,11 @@
2988557072,2988557075,PL
2988557076,2988557079,FR
2988557080,2988557087,FI
-2988557088,2988557119,DE
-2988557120,2988557151,NL
+2988557088,2988557095,CH
+2988557096,2988557103,ES
+2988557104,2988557111,FR
+2988557112,2988557115,LT
+2988557116,2988557151,NL
2988557152,2988557215,FR
2988557216,2988557247,BE
2988557248,2988557251,FR
@@ -64804,7 +66934,7 @@
2988558104,2988558119,FR
2988558120,2988558123,GB
2988558124,2988558127,FR
-2988558128,2988558131,ES
+2988558128,2988558131,DE
2988558132,2988558135,PL
2988558136,2988558139,GB
2988558140,2988558143,DE
@@ -64817,7 +66947,7 @@
2988558528,2988558591,PL
2988558592,2988558655,GB
2988558656,2988558727,FR
-2988558728,2988558731,DE
+2988558728,2988558731,IT
2988558732,2988558735,PT
2988558736,2988558767,FR
2988558768,2988558783,CH
@@ -64869,9 +66999,7 @@
2988560384,2988560447,FR
2988560448,2988560451,DE
2988560452,2988560455,PL
-2988560456,2988560463,FR
-2988560464,2988560479,PL
-2988560480,2988560575,FR
+2988560456,2988560575,FR
2988560576,2988560591,ES
2988560592,2988560595,NL
2988560596,2988560599,IT
@@ -64998,7 +67126,7 @@
2988563076,2988563079,GB
2988563080,2988563083,DE
2988563084,2988563087,FR
-2988563088,2988563103,NL
+2988563088,2988563103,PL
2988563104,2988563135,FR
2988563136,2988563151,PL
2988563152,2988563199,FR
@@ -65054,9 +67182,7 @@
2990518016,2990518079,IT
2990518080,2990525247,DE
2990525248,2990525311,ES
-2990525312,2990534655,DE
-2990534656,2990534783,EG
-2990534784,2990535935,DE
+2990525312,2990535935,DE
2990535936,2990535967,PL
2990535968,2990538751,DE
2990538752,2991063039,RU
@@ -65070,7 +67196,9 @@
2991144960,2991161343,SA
2991161344,2991177727,FR
2991177728,2991178751,A1
-2991178752,2991180799,SE
+2991178752,2991179263,SE
+2991179264,2991179327,A1
+2991179328,2991180799,SE
2991180800,2991182847,A1
2991182848,2991185919,SE
2991185920,2991185951,GB
@@ -65343,17 +67471,14 @@
2996998528,2996998655,UA
2996998656,2996998719,DE
2996998720,2996998911,RU
-2996998912,2996999199,DE
-2996999200,2996999231,AU
-2996999232,2996999359,DE
+2996998912,2996999359,DE
2996999360,2996999423,IL
2996999424,2996999551,IN
2996999552,2996999679,DE
2996999680,2996999935,GB
2996999936,2996999951,DE
2996999952,2996999967,LT
-2996999968,2996999999,AU
-2997000000,2997000447,DE
+2996999968,2997000447,DE
2997000448,2997000703,RU
2997000704,2997000831,DE
2997000832,2997000959,CA
@@ -65405,18 +67530,19 @@
2997019136,2997019391,TR
2997019392,2997019647,GB
2997019648,2997019679,DE
-2997019680,2997019711,AU
+2997019680,2997019711,BR
2997019712,2997019903,US
2997019904,2997020415,DE
2997020416,2997020671,CA
2997020672,2997020719,DE
2997020720,2997020735,SE
-2997020736,2997021183,DE
+2997020736,2997020799,DE
+2997020800,2997020863,US
+2997020864,2997021183,DE
2997021184,2997021695,GB
-2997021696,2997022015,DE
-2997022016,2997022143,GB
-2997022144,2997022207,IN
-2997022208,2997022239,DE
+2997021696,2997022079,DE
+2997022080,2997022143,GB
+2997022144,2997022239,DE
2997022240,2997022303,NL
2997022304,2997022367,SG
2997022368,2997022751,DE
@@ -65647,14 +67773,25 @@
3001815040,3001819135,RU
3001819136,3001823231,IR
3001823232,3001827327,GE
-3001827328,3001831423,SE
+3001827328,3001827647,SE
+3001827648,3001827743,GB
+3001827744,3001827839,SE
+3001827840,3001827871,GB
+3001827872,3001830399,SE
+3001830400,3001830431,GB
+3001830432,3001830655,SE
+3001830656,3001830687,GB
+3001830688,3001830911,SE
+3001830912,3001830943,GB
+3001830944,3001830975,US
+3001830976,3001831423,SE
3001831424,3001835519,BA
3001835520,3001839615,RU
3001839616,3001843711,ES
-3001843712,3001845759,RU
-3001845760,3001846271,GB
-3001846272,3001847295,RU
-3001847296,3001851903,GB
+3001843712,3001846271,RU
+3001846272,3001846783,GB
+3001846784,3001847807,RU
+3001847808,3001851903,GB
3001851904,3001855999,IT
3001856000,3001859071,NL
3001859072,3001860095,MD
@@ -65718,13 +67855,13 @@
3001975728,3001975735,GB
3001975736,3001975743,MY
3001975744,3001975751,CN
-3001975752,3001975759,GB
+3001975752,3001975759,UA
3001975760,3001975767,US
3001975768,3001975783,CN
3001975784,3001975791,US
3001975792,3001975799,IT
3001975800,3001975807,US
-3001975808,3001975815,GB
+3001975808,3001975815,UA
3001975816,3001975823,US
3001975824,3001975831,UA
3001975832,3001975847,GB
@@ -65775,11 +67912,9 @@
3001977600,3001977855,DK
3001977856,3001977983,GB
3001977984,3001978015,CN
-3001978016,3001978047,RU
-3001978048,3001978111,US
-3001978112,3001978239,GB
-3001978240,3001978303,CN
-3001978304,3001978367,GB
+3001978016,3001978031,GB
+3001978032,3001978047,RU
+3001978048,3001978367,GB
3001978368,3001978495,US
3001978496,3001978527,RU
3001978528,3001978559,UA
@@ -65806,9 +67941,7 @@
3002019840,3002020223,NL
3002020224,3002020287,IL
3002020288,3002020303,US
-3002020304,3002022527,NL
-3002022528,3002022655,BZ
-3002022656,3002023935,NL
+3002020304,3002023935,NL
3002023936,3002028031,DE
3002028032,3002036223,GB
3002036224,3002040319,BG
@@ -65870,7 +68003,9 @@
3002662912,3002664959,DE
3002664960,3002667007,ES
3002667008,3002669055,GE
-3002669056,3002671103,DE
+3002669056,3002669199,DE
+3002669200,3002669207,CH
+3002669208,3002671103,DE
3002671104,3002673151,LV
3002673152,3002675199,GB
3002675200,3002677247,DK
@@ -65931,8 +68066,8 @@
3002798080,3002800127,FR
3002800128,3002802175,NL
3002802176,3002804223,GB
-3002804224,3002806271,TR
-3002806272,3002808319,DE
+3002804224,3002806015,TR
+3002806016,3002808319,DE
3002808320,3002810367,FI
3002810368,3002812415,AT
3002812416,3002814463,IT
@@ -66056,6 +68191,7 @@
3028484096,3028500479,KR
3028500480,3028516863,JP
3028516864,3028518911,AU
+3028518912,3028520959,JP
3028520960,3028521983,ID
3028521984,3028523007,LA
3028523008,3028525055,JP
@@ -66187,11 +68323,13 @@
3034456064,3034464255,JP
3034464256,3034466303,NZ
3034466304,3034472447,JP
-3034472448,3034480639,IN
+3034472448,3034478591,IN
+3034478592,3034480639,JP
3034480640,3034482687,SG
3034482688,3034484735,AF
3034484736,3034488831,TH
3034488832,3034492927,AU
+3034492928,3034497023,JP
3034497024,3034499071,AU
3034499072,3034500095,HK
3034500096,3034501119,TW
@@ -66297,6 +68435,7 @@
3056992256,3057025023,CN
3057025024,3057033215,PH
3057033216,3057037311,NZ
+3057037312,3057041407,JP
3057041408,3057049599,MY
3057049600,3057050623,AU
3057050624,3057051647,SG
@@ -66407,6 +68546,7 @@
3075473408,3075571711,VN
3075571712,3075575807,FJ
3075575808,3075577855,AU
+3075577856,3075579903,ID
3075579904,3075581951,MY
3075581952,3075582975,MN
3075582976,3075583999,TH
@@ -66461,7 +68601,11 @@
3082289152,3087007743,CN
3087007744,3091202047,US
3091202048,3091726335,CA
-3091726336,3093168127,US
+3091726336,3091955711,US
+3091955712,3091959807,CA
+3091959808,3091976191,US
+3091976192,3091980287,CA
+3091980288,3093168127,US
3093168128,3093200895,CA
3093233664,3093237759,PR
3093237760,3093266431,US
@@ -66471,9 +68615,7 @@
3093941104,3093941119,CN
3093941120,3093941191,US
3093941192,3093941199,CN
-3093941200,3093942271,US
-3093942272,3093942527,CA
-3093942528,3093954759,US
+3093941200,3093954759,US
3093954760,3093954767,AR
3093954768,3093954975,US
3093954976,3093954983,AU
@@ -66613,9 +68755,14 @@
3098214400,3098263551,US
3098263552,3098271743,CA
3098271744,3098275839,US
-3098279936,3098476543,US
+3098279936,3098281503,US
+3098281504,3098281511,PA
+3098281512,3098281711,US
+3098281712,3098281719,PA
+3098281720,3098476543,US
3098476544,3098492927,CA
3098492928,3103784959,US
+3103784960,3107979263,EU
3120562176,3120594943,CO
3120594944,3120599039,AR
3120599040,3120601087,EC
@@ -66660,6 +68807,7 @@
3123707904,3123970047,UY
3124232192,3124772863,AR
3124789248,3124822015,CR
+3124854784,3124887551,CL
3124887552,3124953087,EC
3125018624,3125149695,EC
3125280768,3125542911,PA
@@ -66671,7 +68819,7 @@
3127246848,3127377919,CO
3127377920,3127640063,CL
3127640064,3127902207,AR
-3127902208,3128164351,CO
+3127902208,3128426495,CO
3128426496,3128492031,DO
3128492032,3128524799,CO
3128557568,3128950783,AR
@@ -66696,6 +68844,7 @@
3133079552,3133145087,AR
3133145088,3145727999,BR
3145728000,3154116607,MX
+3154116608,3154149375,NO
3154182144,3154247679,DE
3154247680,3154313215,RS
3154313216,3154378751,TR
@@ -66724,7 +68873,9 @@
3156791440,3156791455,NL
3156791456,3156802271,DE
3156802272,3156802303,US
-3156802304,3156803583,DE
+3156802304,3156803327,DE
+3156803328,3156803359,CH
+3156803360,3156803583,DE
3156803584,3156869119,TR
3156869120,3156934655,LU
3156934656,3157065727,RU
@@ -66783,7 +68934,9 @@
3158395152,3158395159,DE
3158395160,3158395263,AT
3158395264,3158395295,DE
-3158395296,3158395647,AT
+3158395296,3158395431,AT
+3158395432,3158395439,DE
+3158395440,3158395647,AT
3158395648,3158395663,DE
3158395664,3158396927,AT
3158396928,3158398975,IT
@@ -66831,13 +68984,9 @@
3158886176,3158886207,BZ
3158886208,3158886271,DE
3158886272,3158886335,RO
-3158886336,3158886399,DE
-3158886400,3158886655,TR
-3158886656,3158887167,DE
+3158886336,3158887167,DE
3158887168,3158887423,CA
-3158887424,3158889215,DE
-3158889216,3158889727,TR
-3158889728,3158889983,DE
+3158887424,3158889983,DE
3158889984,3158890239,HK
3158890240,3158891263,DE
3158891264,3158891519,CA
@@ -66854,8 +69003,7 @@
3158892672,3158892799,RU
3158892800,3158893567,DE
3158893568,3158893823,GB
-3158893824,3158894079,TR
-3158894080,3158895167,DE
+3158893824,3158895167,DE
3158895168,3158895231,RU
3158895232,3158895359,TR
3158895360,3158895423,DE
@@ -67180,8 +69328,7 @@
3163161888,3163161919,US
3163161920,3163162111,DE
3163162112,3163162143,TR
-3163162144,3163162175,DE
-3163162176,3163162207,US
+3163162144,3163162207,DE
3163162208,3163162239,TR
3163162240,3163162271,DE
3163162272,3163162303,NL
@@ -67210,14 +69357,14 @@
3163165824,3163166175,DE
3163166176,3163166207,US
3163166208,3163166367,DE
-3163166368,3163166399,NL
+3163166368,3163166399,US
3163166400,3163166495,DE
3163166496,3163166527,RO
3163166528,3163166559,DE
3163166560,3163166591,HU
3163166592,3163167775,DE
3163167776,3163167807,GR
-3163167808,3163167839,NL
+3163167808,3163167839,US
3163167840,3163167967,DE
3163167968,3163167999,TR
3163168000,3163168031,BG
@@ -67231,7 +69378,7 @@
3163168416,3163168511,DE
3163168512,3163168543,TR
3163168544,3163168575,DE
-3163168576,3163168607,NL
+3163168576,3163168607,US
3163168608,3163168671,DE
3163168672,3163168703,US
3163168704,3163169823,DE
@@ -67248,26 +69395,26 @@
3163170208,3163170239,RU
3163170240,3163170303,DE
3163170304,3163170335,IT
-3163170336,3163170463,DE
-3163170464,3163170495,GB
-3163170496,3163170527,BR
+3163170336,3163170495,DE
+3163170496,3163170527,BG
3163170528,3163170591,DE
3163170592,3163170623,BR
3163170624,3163170655,GR
-3163170656,3163170783,DE
+3163170656,3163170751,DE
+3163170752,3163170783,CH
3163170784,3163170815,US
3163170816,3163171871,DE
3163171872,3163171903,RO
-3163171904,3163171935,DE
+3163171904,3163171935,BZ
3163171936,3163171967,BR
3163171968,3163172127,DE
-3163172128,3163172159,NL
+3163172128,3163172159,US
3163172160,3163172319,DE
3163172320,3163172351,NL
3163172352,3163172383,GB
3163172384,3163172447,DE
3163172448,3163172479,TR
-3163172480,3163172511,DE
+3163172480,3163172511,US
3163172512,3163172543,RU
3163172544,3163172607,DE
3163172608,3163172639,DK
@@ -67281,16 +69428,21 @@
3163174272,3163174303,BG
3163174304,3163174335,IL
3163174336,3163174367,RU
-3163174368,3163174591,DE
+3163174368,3163174495,DE
+3163174496,3163174527,US
+3163174528,3163174591,DE
3163174592,3163174623,SE
3163174624,3163174655,GB
3163174656,3163174719,DE
3163174720,3163174751,NL
3163174752,3163174783,US
-3163174784,3163176063,DE
+3163174784,3163174815,DE
+3163174816,3163174847,CA
+3163174848,3163174879,TR
+3163174880,3163176063,DE
3163176064,3163176095,US
3163176096,3163176127,DE
-3163176128,3163176159,NL
+3163176128,3163176159,US
3163176160,3163176255,DE
3163176256,3163176287,UG
3163176288,3163176479,DE
@@ -67480,7 +69632,8 @@
3164951876,3164951879,IT
3164951880,3164951887,DE
3164951888,3164951895,ES
-3164951896,3164951907,FR
+3164951896,3164951903,FR
+3164951904,3164951907,DE
3164951908,3164951911,PL
3164951912,3164951915,ES
3164951916,3164951919,IE
@@ -67590,8 +69743,35 @@
3164959928,3164959931,GB
3164959932,3164959935,ES
3164959936,3164959999,FR
-3164960000,3164960255,DE
-3164960256,3164960511,FR
+3164960000,3164960259,DE
+3164960260,3164960263,FR
+3164960264,3164960267,LT
+3164960268,3164960271,NL
+3164960272,3164960295,FR
+3164960296,3164960299,IT
+3164960300,3164960303,GB
+3164960304,3164960319,FR
+3164960320,3164960323,ES
+3164960324,3164960327,IT
+3164960328,3164960331,CZ
+3164960332,3164960335,LT
+3164960336,3164960339,PL
+3164960340,3164960359,FR
+3164960360,3164960367,PL
+3164960368,3164960383,FR
+3164960384,3164960387,DE
+3164960388,3164960391,PL
+3164960392,3164960395,GB
+3164960396,3164960399,DE
+3164960400,3164960415,PL
+3164960416,3164960435,FR
+3164960436,3164960443,PT
+3164960444,3164960447,IT
+3164960448,3164960463,PL
+3164960464,3164960467,NL
+3164960468,3164960471,GB
+3164960472,3164960479,FR
+3164960480,3164960511,GB
3164960512,3164960575,PL
3164960576,3164960591,DE
3164960592,3164960599,ES
@@ -67606,7 +69786,7 @@
3164960676,3164960679,GB
3164960680,3164960699,PL
3164960700,3164960703,ES
-3164960704,3164960719,GB
+3164960704,3164960719,FR
3164960720,3164960723,CH
3164960724,3164960727,FR
3164960728,3164960735,GB
@@ -67624,12 +69804,11 @@
3164961024,3164961151,FR
3164961152,3164961167,DE
3164961168,3164961175,PL
-3164961176,3164961247,FR
-3164961248,3164961279,NL
+3164961176,3164961279,FR
3164961280,3164961311,DE
3164961312,3164961319,FR
3164961320,3164961327,PL
-3164961328,3164961331,ES
+3164961328,3164961331,CZ
3164961332,3164961363,FR
3164961364,3164961367,ES
3164961368,3164961375,FR
@@ -67639,7 +69818,9 @@
3164961400,3164961403,PL
3164961404,3164961471,FR
3164961472,3164961503,DE
-3164961504,3164961551,ES
+3164961504,3164961519,GB
+3164961520,3164961535,FR
+3164961536,3164961551,ES
3164961552,3164961559,FR
3164961560,3164961563,DE
3164961564,3164961583,FR
@@ -67754,8 +69935,9 @@
3164969020,3164969023,BE
3164969024,3164969055,PL
3164969056,3164969071,CZ
-3164969072,3164969087,GB
-3164969088,3164969095,ES
+3164969072,3164969079,FR
+3164969080,3164969083,PL
+3164969084,3164969095,ES
3164969096,3164969099,PL
3164969100,3164969103,DE
3164969104,3164969135,FR
@@ -67840,7 +70022,7 @@
3164971072,3164971135,DE
3164971136,3164971263,GB
3164971264,3164971455,DE
-3164971456,3164971459,NL
+3164971456,3164971459,FR
3164971460,3164971463,IT
3164971464,3164971467,CH
3164971468,3164971471,FR
@@ -67922,7 +70104,7 @@
3164976160,3164976191,GB
3164976192,3164976215,FR
3164976216,3164976223,PL
-3164976224,3164976231,NL
+3164976224,3164976231,FR
3164976232,3164976239,ES
3164976240,3164976255,IE
3164976256,3164976259,GB
@@ -67936,7 +70118,9 @@
3164976308,3164976311,DE
3164976312,3164976315,GB
3164976316,3164976319,FR
-3164976320,3164976335,DE
+3164976320,3164976327,DE
+3164976328,3164976331,FR
+3164976332,3164976335,PL
3164976336,3164976343,FR
3164976344,3164976347,PL
3164976348,3164976351,ES
@@ -67971,7 +70155,7 @@
3164977760,3164977775,NL
3164977776,3164977791,PL
3164977792,3164977807,FR
-3164977808,3164977823,NL
+3164977808,3164977823,DE
3164977824,3164977839,GB
3164977840,3164977883,FR
3164977884,3164977887,GB
@@ -67981,7 +70165,7 @@
3164978048,3164978067,FR
3164978068,3164978079,ES
3164978080,3164978111,IT
-3164978112,3164978127,ES
+3164978112,3164978127,GB
3164978128,3164978143,FR
3164978144,3164978147,DE
3164978148,3164978151,ES
@@ -68042,12 +70226,20 @@
3166650368,3166654463,UA
3166654464,3166658559,RU
3166658560,3166662655,UA
-3166668800,3166670847,RO
+3166662656,3166666751,RU
+3166666752,3166670847,RO
3166670848,3166672895,UA
3166672896,3166674943,GB
3166674944,3166679039,RU
3166679040,3166681087,IR
-3166681088,3166683135,RU
+3166681088,3166685183,RU
+3166685184,3166687231,PL
+3166687232,3166689279,MD
+3166689280,3166691327,PL
+3166691328,3166693375,RU
+3166693376,3166695423,UA
+3166695424,3166697471,RU
+3166697472,3166699519,RO
3166699520,3166961663,DE
3166961664,3167223807,SI
3167223808,3167594831,NL
@@ -68057,9 +70249,7 @@
3167940096,3167940351,CY
3167940352,3168015871,RO
3168015872,3168016127,GB
-3168016128,3168069631,RO
-3168069632,3168075775,GB
-3168075776,3168092159,RO
+3168016128,3168092159,RO
3168092160,3168096255,GB
3168096256,3168100351,MD
3168100352,3168104447,RO
@@ -68129,7 +70319,9 @@
3169648640,3169714175,MD
3169714176,3169779711,FI
3169779712,3169845247,UA
-3169845248,3169867775,RO
+3169845248,3169863679,RO
+3169863680,3169864703,MD
+3169864704,3169867775,RO
3169867776,3169868031,DE
3169868032,3169976319,RO
3169976320,3170111487,RU
@@ -68164,6 +70356,7 @@
3170762752,3170795519,RU
3170795520,3170828287,BG
3170828288,3170861055,RU
+3170861056,3170893823,RS
3170893824,3179282431,BR
3179282432,3179282943,UY
3179282944,3179283199,MX
@@ -68216,8 +70409,9 @@
3188097024,3188105215,DO
3188105216,3188113407,CO
3188113408,3188117503,HN
+3188117504,3188121599,AR
3188121600,3188125695,TT
-3188129792,3188146175,AR
+3188125696,3188146175,AR
3188146176,3188170751,CO
3188170752,3188174847,CR
3188178944,3188187135,CR
@@ -68255,6 +70449,7 @@
3188580352,3188597759,AR
3188597760,3188598783,PA
3188598784,3188600831,AR
+3188600832,3188604927,CL
3188604928,3188606207,AR
3188606208,3188606463,CL
3188606464,3188609279,AR
@@ -68266,12 +70461,14 @@
3188612352,3188621311,AR
3188621312,3188625407,GT
3188625408,3188627455,AR
+3188627456,3188628479,CR
3188629504,3188637695,AR
3188637696,3188645887,PA
3188645888,3188662271,CO
3188670464,3188674559,HN
3188674560,3188686847,AR
3188686848,3188690943,EC
+3188690944,3188695039,CU
3188695040,3188703231,VE
3188703232,3188981759,AR
3188981760,3189178367,CL
@@ -68284,7 +70481,9 @@
3190554624,3190816767,CL
3190816768,3191078911,AR
3191078912,3191087103,CO
-3191087104,3191089151,AR
+3191087104,3191091199,AR
+3191091200,3191093247,BO
+3191093248,3191095295,AR
3191095296,3191099391,EC
3191103488,3191107583,CO
3191111680,3191128063,PY
@@ -68308,6 +70507,7 @@
3191436288,3191438335,GT
3191438336,3191439359,SV
3191439360,3191455743,EC
+3191455744,3191472127,AR
3191472128,3191603199,TT
3191603200,3191608319,MX
3191608320,3191608831,CO
@@ -68337,11 +70537,12 @@
3193307136,3193438207,SV
3193438208,3193569279,AN
3193569280,3193634815,CO
+3193634816,3193700351,CL
3193700352,3193716735,HN
3193733120,3193765887,AR
3193765888,3193798655,TT
3193798656,3193806847,CO
-3193815040,3193819135,AR
+3193815040,3193823231,AR
3193823232,3193827327,CL
3193831424,3193864191,DO
3193864192,3193872383,EC
@@ -68464,7 +70665,7 @@
3195240448,3195256831,HT
3195256832,3195265023,AR
3195273216,3195535359,PE
-3195535360,3195539455,SV
+3195535360,3195543551,SV
3195543552,3195547647,PE
3195551744,3195559935,EC
3195559936,3195564031,AR
@@ -68486,7 +70687,7 @@
3195731968,3195736063,EC
3195740160,3195744255,PA
3195748352,3195752447,CL
-3195756544,3195760639,AR
+3195756544,3195764735,AR
3195764736,3195768831,CR
3195772928,3195777023,VE
3195781120,3195797503,PA
@@ -68510,6 +70711,7 @@
3196092416,3196125183,PY
3196125184,3196190719,BO
3196190720,3196207103,HN
+3196207104,3196223487,CO
3196223488,3196321791,EC
3196321792,3196583935,UY
3196583936,3196690687,AR
@@ -68525,6 +70727,7 @@
3197566976,3197599743,CL
3197632512,3197698047,EC
3197698048,3197730815,VE
+3197730816,3197763583,CL
3197763584,3197894655,EC
3197894656,3198156799,CO
3198156800,3198484479,CL
@@ -68576,14 +70779,14 @@
3202220032,3202351103,PE
3202351104,3202875391,AR
3202875392,3203399679,PE
-3203399680,3203432447,CO
+3203399680,3203465215,CO
3203465216,3203476479,CR
3203476480,3203476735,CO
3203476736,3203476991,CR
3203476992,3203477375,CO
3203477376,3203530751,CR
3203530752,3203538943,NI
-3203538944,3203596287,CO
+3203538944,3203661823,CO
3203661824,3203923967,AR
3203923968,3204448255,CO
3221225472,3221560319,US
@@ -69911,7 +72114,9 @@
3227806496,3227806527,GB
3227806528,3227806719,FI
3227806720,3227807743,US
-3227807744,3227813375,FI
+3227807744,3227809023,FI
+3227809024,3227809279,IN
+3227809280,3227813375,FI
3227813376,3227813631,US
3227813632,3227813887,MY
3227813888,3227815167,GB
@@ -71286,7 +73491,38 @@
3231776768,3231793151,US
3231793152,3231793663,BE
3231809536,3231810047,NZ
+3231842304,3231843327,RU
+3231843328,3231844351,NO
+3231844352,3231845375,RU
+3231845376,3231846399,ES
3231846400,3231846655,RO
+3231846656,3231846911,PT
+3231846912,3231847167,GB
+3231847168,3231847423,UA
+3231847424,3231848447,RU
+3231848448,3231849471,ES
+3231849472,3231850495,RO
+3231850496,3231851519,UA
+3231851520,3231853567,RU
+3231853568,3231855615,PL
+3231855616,3231856639,RS
+3231856640,3231857663,RU
+3231857664,3231858687,PL
+3231858688,3231859711,RU
+3231859712,3231860735,FR
+3231860736,3231861759,SA
+3231861760,3231863807,UA
+3231863808,3231864831,DE
+3231864832,3231865855,RU
+3231865856,3231866879,PL
+3231866880,3231867903,CZ
+3231867904,3231868927,RU
+3231868928,3231869951,LV
+3231869952,3231873023,UA
+3231873024,3231875071,RU
+3231875072,3231876095,PL
+3231876096,3231877119,UA
+3231906816,3231907839,RU
3231907840,3231916031,US
3231916032,3231948799,FI
3231973376,3232038911,AT
@@ -71301,21 +73537,26 @@
3232095232,3232096255,GB
3232096256,3232104447,SE
3232104448,3232107519,DE
-3232107520,3232108543,EU
+3232107520,3232108543,RU
3232108544,3232129023,DE
-3232129024,3232131071,EU
+3232129024,3232130047,RO
+3232130048,3232131071,UA
3232131072,3232133119,DE
-3232133120,3232133631,EU
+3232133120,3232133631,UA
3232133632,3232134143,DE
-3232134144,3232141823,EU
+3232134144,3232137215,EU
+3232137216,3232139263,UA
+3232139264,3232140287,GB
+3232140288,3232141311,FR
+3232141312,3232141823,UA
3232141824,3232156159,DE
-3232156160,3232156671,EU
+3232156160,3232156671,PL
3232156672,3232159743,DE
-3232159744,3232160767,EU
+3232159744,3232160767,PL
3232160768,3232163839,DE
-3232163840,3232165887,EU
+3232163840,3232165887,RU
3232165888,3232169727,DE
-3232169728,3232169983,EU
+3232169728,3232169983,PL
3232169984,3232235519,IT
3232301056,3232309247,US
3232309248,3232313343,SG
@@ -72205,7 +74446,28 @@
3238461440,3238502399,DE
3238502400,3238504447,RU
3238504448,3238526975,DE
-3238526976,3238592511,CH
+3238526976,3238527231,RU
+3238527232,3238542591,CH
+3238542592,3238542847,PL
+3238542848,3238545919,CH
+3238545920,3238546431,RU
+3238546432,3238546943,CH
+3238546944,3238547455,UA
+3238547456,3238548991,CH
+3238548992,3238549503,CZ
+3238549504,3238559231,CH
+3238559232,3238559487,SE
+3238559488,3238562559,CH
+3238562560,3238562815,IR
+3238562816,3238573567,CH
+3238573568,3238574079,PL
+3238574080,3238578943,CH
+3238578944,3238579199,RU
+3238579200,3238589951,CH
+3238589952,3238590207,LT
+3238590208,3238590975,CH
+3238590976,3238591231,SA
+3238591232,3238592511,CH
3238592512,3238593023,GB
3238593024,3238594303,EU
3238594304,3238594559,GB
@@ -72250,6 +74512,7 @@
3238630656,3238632959,GB
3238632960,3238633215,UA
3238633216,3238653951,DK
+3238657024,3238657535,AT
3238657536,3238657791,DK
3238657792,3238658047,AT
3238658048,3238675455,SE
@@ -72740,9 +75003,11 @@
3239762176,3239762431,RU
3239762432,3239762687,DK
3239762688,3239762943,RO
+3239762944,3239763199,SI
3239763200,3239763455,SE
3239763456,3239763967,GB
3239763968,3239772159,DE
+3239772160,3239772415,NL
3239772416,3239772671,GB
3239772672,3239773183,DK
3239773184,3239773439,FR
@@ -72765,6 +75030,7 @@
3239788544,3239789055,EU
3239789568,3239790079,FR
3239790080,3239790591,RO
+3239790592,3239791103,LV
3239791104,3239792127,CH
3239792128,3239792639,FR
3239792640,3239793151,UA
@@ -73064,7 +75330,6 @@
3240207872,3240208383,RU
3240208384,3240208895,FR
3240208896,3240209407,GB
-3240209408,3240209919,UA
3240209920,3240210943,PL
3240210944,3240211455,GB
3240211456,3240211967,NL
@@ -73171,7 +75436,6 @@
3240281600,3240281727,JO
3240281728,3240281855,PL
3240281856,3240281983,NL
-3240281984,3240282111,PL
3240282112,3240282239,DE
3240282240,3240282367,UA
3240282368,3240282495,RO
@@ -73966,11 +76230,12 @@
3244823296,3244823551,FR
3244823552,3244823807,GE
3244823808,3244824063,RO
+3244824064,3244824319,IR
3244824320,3244824575,SI
3244824576,3244824831,RU
3244824832,3244825087,GB
3244825088,3244825343,DE
-3244825600,3244826111,RU
+3244825344,3244826111,RU
3244826112,3244826367,RO
3244826368,3244826623,CH
3244826624,3244826879,DE
@@ -74288,7 +76553,6 @@
3244913408,3244913663,SI
3244913664,3244913919,DK
3244913920,3244914431,RU
-3244914432,3244914687,UA
3244914688,3244914943,GB
3244914944,3244915199,UA
3244915200,3244915455,PL
@@ -74323,7 +76587,8 @@
3244922624,3244922879,BG
3244922880,3244923135,UA
3244923136,3244923391,AT
-3244923392,3244923903,LV
+3244923392,3244923647,EU
+3244923648,3244923903,LV
3244923904,3244924159,RU
3244924160,3244924927,CZ
3244924928,3244925183,FI
@@ -74366,7 +76631,6 @@
3244935168,3244935423,NL
3244935424,3244935679,UA
3244935680,3244935935,PL
-3244935936,3244936191,FR
3244936192,3244936959,AT
3244936960,3244937215,KZ
3244937216,3244937471,TR
@@ -74661,6 +76925,7 @@
3245168896,3245169151,RU
3245169152,3245169407,IT
3245169408,3245169919,PL
+3245169920,3245170175,PT
3245170176,3245170431,GB
3245170432,3245170687,CH
3245170688,3245171711,DE
@@ -74724,6 +76989,7 @@
3245207552,3245208063,UA
3245208064,3245208575,DE
3245208576,3245209087,PL
+3245209088,3245209599,VG
3245209600,3245210111,UA
3245210112,3245210623,FR
3245210624,3245211135,HU
@@ -75415,6 +77681,8 @@
3247347968,3247348223,HU
3247348224,3247348991,FI
3247348992,3247349247,DE
+3247349248,3247349503,FR
+3247349504,3247349759,UA
3247349760,3247353855,SE
3247353856,3247362047,FI
3247362048,3247362303,RO
@@ -75621,7 +77889,9 @@
3248791040,3248791295,BE
3248791296,3248791551,DE
3248791552,3248792487,GB
-3248792488,3248796607,EU
+3248792488,3248792495,EU
+3248792496,3248792511,GB
+3248792512,3248796607,EU
3248796608,3248796863,GB
3248796864,3248798975,EU
3248798976,3248799231,GB
@@ -75766,6 +78036,7 @@
3249136128,3249137151,RU
3249137152,3249137663,FR
3249137664,3249138175,PL
+3249138176,3249138687,RU
3249138688,3249139199,GB
3249139200,3249139711,RU
3249139712,3249140223,UA
@@ -75895,7 +78166,9 @@
3249931008,3249931263,GB
3249931264,3249932031,SE
3249932032,3249934335,GB
-3249934336,3250061311,SE
+3249934336,3249968127,SE
+3249968128,3249969151,FR
+3249969152,3250061311,SE
3250061312,3250061635,FI
3250061636,3250061639,AX
3250061640,3250083643,FI
@@ -76018,6 +78291,7 @@
3250416128,3250417663,DE
3250417664,3250418175,IT
3250418176,3250418687,DE
+3250418688,3250419199,PL
3250419200,3250419711,NO
3250419712,3250420223,RU
3250420224,3250420735,IR
@@ -76093,7 +78367,7 @@
3250692096,3250692351,NO
3250692352,3250692607,NL
3250692608,3250693375,BG
-3250693376,3250694399,IE
+3250693376,3250693631,IE
3250694400,3250694655,GB
3250694656,3250694911,SK
3250694912,3250695167,NL
@@ -76115,7 +78389,6 @@
3250722304,3250724863,GB
3250724864,3250733055,MA
3250733056,3250741247,DZ
-3250741248,3250749439,EU
3250749440,3250749695,GH
3250749696,3250749951,IT
3250749952,3250750463,RO
@@ -76183,6 +78456,7 @@
3251122176,3251122687,CH
3251122688,3251123199,PL
3251123200,3251123711,FR
+3251123712,3251124223,RU
3251124224,3251124735,NL
3251124736,3251125247,FR
3251125248,3251125759,BE
@@ -76346,7 +78620,6 @@
3251182080,3251182591,FR
3251182592,3251183103,IT
3251183104,3251183615,RU
-3251183616,3251183871,NO
3251183872,3251184127,CH
3251184128,3251184383,PL
3251184384,3251184639,DK
@@ -76401,6 +78674,7 @@
3251209216,3251210239,GB
3251210240,3251211263,PL
3251211264,3251212287,UA
+3251212288,3251212415,PL
3251212416,3251212671,FI
3251212672,3251212799,SE
3251212800,3251212927,FR
@@ -76657,7 +78931,8 @@
3252318720,3252318975,GP
3252318976,3252319231,PL
3252319232,3252319743,AT
-3252319744,3252322303,GR
+3252319744,3252321791,GR
+3252321792,3252322303,PL
3252322304,3252323327,NO
3252323328,3252324351,PL
3252324352,3252326399,RU
@@ -76758,7 +79033,8 @@
3252408640,3252408671,CF
3252408672,3252408703,SO
3252408704,3252408735,NG
-3252408736,3252408767,LT
+3252408736,3252408751,SO
+3252408752,3252408767,LT
3252408768,3252408783,NG
3252408784,3252408799,LT
3252408800,3252408831,SO
@@ -76841,9 +79117,13 @@
3252414656,3252414991,LT
3252414992,3252414999,IQ
3252415000,3252415015,LT
-3252415016,3252415127,IQ
+3252415016,3252415095,IQ
+3252415096,3252415103,LT
+3252415104,3252415127,IQ
3252415128,3252415135,LT
-3252415136,3252415223,IQ
+3252415136,3252415159,IQ
+3252415160,3252415167,BE
+3252415168,3252415223,IQ
3252415224,3252415487,LT
3252415488,3252415743,IQ
3252415744,3252415775,GB
@@ -76855,8 +79135,8 @@
3252416960,3252417023,GN
3252417024,3252417279,LT
3252417280,3252417287,IQ
-3252417288,3252417439,AF
-3252417440,3252417791,LT
+3252417288,3252417455,AF
+3252417456,3252417791,LT
3252417792,3252417855,NG
3252417856,3252417919,LT
3252417920,3252417935,MW
@@ -76893,9 +79173,7 @@
3252419920,3252419927,IQ
3252419928,3252419935,LT
3252419936,3252419943,IQ
-3252419944,3252419999,LT
-3252420000,3252420007,IQ
-3252420008,3252420031,LT
+3252419944,3252420031,LT
3252420032,3252420055,IQ
3252420056,3252420063,LT
3252420064,3252420071,IQ
@@ -76904,9 +79182,7 @@
3252420120,3252420143,IQ
3252420144,3252420191,LT
3252420192,3252420223,IQ
-3252420224,3252420239,LT
-3252420240,3252420247,IQ
-3252420248,3252420263,LT
+3252420224,3252420263,LT
3252420264,3252420271,IQ
3252420272,3252420351,LT
3252420352,3252420415,IQ
@@ -77107,8 +79383,7 @@
3252465952,3252465983,GH
3252465984,3252466047,LT
3252466048,3252466175,GH
-3252466176,3252473343,LT
-3252473344,3252473855,CD
+3252466176,3252473855,LT
3252473856,3252474879,SO
3252474880,3252475903,LT
3252475904,3252476415,NG
@@ -77308,8 +79583,7 @@
3253230592,3253230847,BY
3253230848,3253247999,RU
3253248000,3253248255,DE
-3253248256,3253248511,UZ
-3253248512,3253265407,RU
+3253248256,3253265407,RU
3253265408,3253265919,AM
3253265920,3253270527,RU
3253270528,3253271551,BY
@@ -77654,11 +79928,11 @@
3254510564,3254510847,NE
3254510848,3254521855,FR
3254521856,3254522367,GB
-3254522368,3254523665,FR
-3254523666,3254523666,UG
-3254523667,3254523667,CH
-3254523668,3254523668,RO
-3254523669,3254550527,FR
+3254522368,3254523739,FR
+3254523740,3254523740,UG
+3254523741,3254523741,CH
+3254523742,3254523742,RO
+3254523743,3254550527,FR
3254550528,3254550783,US
3254550784,3254551039,IR
3254551040,3254551295,US
@@ -78115,7 +80389,9 @@
3255255752,3255255759,DK
3255255760,3255256319,BE
3255256320,3255256575,LU
-3255256576,3255259327,BE
+3255256576,3255259199,BE
+3255259200,3255259215,LU
+3255259216,3255259327,BE
3255259328,3255259359,LU
3255259360,3255259919,BE
3255259920,3255259927,LU
@@ -78133,11 +80409,15 @@
3255262800,3255262815,LU
3255262816,3255263295,BE
3255263296,3255263327,US
-3255263328,3255265007,BE
+3255263328,3255264543,BE
+3255264544,3255264575,LU
+3255264576,3255265007,BE
3255265008,3255265023,LU
3255265024,3255270431,BE
3255270432,3255270463,FR
-3255270464,3255273855,BE
+3255270464,3255271807,BE
+3255271808,3255271839,LU
+3255271840,3255273855,BE
3255273856,3255273887,LU
3255273888,3255274207,BE
3255274208,3255274239,LU
@@ -78288,7 +80568,8 @@
3255374848,3255375359,CY
3255375360,3255375871,RO
3255375872,3255376383,PL
-3255376384,3255377407,GB
+3255376384,3255376895,UA
+3255376896,3255377407,GB
3255377408,3255377919,KZ
3255377920,3255378431,GB
3255378432,3255378943,CH
@@ -79852,7 +82133,9 @@
3258109952,3258110207,DK
3258110208,3258111487,CZ
3258111488,3258111743,PL
-3258111744,3258121215,CZ
+3258111744,3258118399,CZ
+3258118400,3258118655,UA
+3258118656,3258121215,CZ
3258121216,3258121471,PL
3258121472,3258121727,AT
3258121728,3258121983,UA
@@ -80427,7 +82710,9 @@
3261472768,3261503487,RO
3261503488,3261503935,MD
3261503936,3261530111,RO
-3261530112,3261570303,SE
+3261530112,3261531903,SE
+3261531904,3261532159,GB
+3261532160,3261570303,SE
3261570304,3261570559,IT
3261570560,3261595647,SE
3261595648,3261661183,NL
@@ -80471,6 +82756,7 @@
3261767680,3261775871,RS
3261775872,3261776383,PL
3261776384,3261777407,RU
+3261777408,3261777663,IR
3261777664,3261777919,KZ
3261777920,3261778431,PL
3261778432,3261778943,RU
@@ -80797,8 +83083,7 @@
3262444032,3262444543,AT
3262444544,3262445055,UA
3262445056,3262445567,RO
-3262445568,3262446079,PL
-3262446592,3262447103,PL
+3262445568,3262447103,PL
3262447104,3262447615,GB
3262447616,3262460415,PT
3262460416,3262460543,UA
@@ -83626,7 +85911,9 @@
3263168512,3263430655,GB
3263430656,3263436799,SE
3263436800,3263437311,GB
-3263437312,3263477759,SE
+3263437312,3263461631,SE
+3263461632,3263461887,AE
+3263461888,3263477759,SE
3263477760,3263478015,JP
3263478016,3263478271,AU
3263478272,3263496191,SE
@@ -83783,6 +86070,7 @@
3264015360,3264015615,DK
3264015616,3264015871,UA
3264015872,3264016127,PT
+3264016128,3264016383,UA
3264016384,3264016639,SE
3264016640,3264016895,PL
3264016896,3264017151,GB
@@ -84001,8 +86289,8 @@
3264612480,3264612511,GB
3264612512,3264612591,FR
3264612592,3264613119,GB
-3264613120,3264614399,FR
-3264614400,3264614431,GB
+3264613120,3264614143,FR
+3264614144,3264614431,GB
3264614432,3264614447,FR
3264614448,3264614463,GB
3264614464,3264614527,FR
@@ -84040,7 +86328,9 @@
3264620544,3264620927,FR
3264620928,3264621567,GB
3264621568,3264621823,FR
-3264621824,3264626687,GB
+3264621824,3264622847,GB
+3264622848,3264623103,FR
+3264623104,3264626687,GB
3264626688,3264627711,EE
3264627712,3264628735,GR
3264628736,3264630783,UA
@@ -84084,6 +86374,7 @@
3264665600,3264666111,RO
3264666112,3264666623,IL
3264666624,3264667135,UA
+3264667136,3264667647,RU
3264667648,3264668159,BE
3264668160,3264669183,DE
3264669184,3264669695,PL
@@ -84179,12 +86470,12 @@
3264846592,3264846719,US
3264846720,3264846847,RU
3264846848,3264846911,DK
-3264846912,3264846975,SK
3264846976,3264847103,GB
3264847104,3264847135,FR
3264847136,3264847167,ES
3264847168,3264847199,IE
3264847200,3264847231,NO
+3264847232,3264847263,CH
3264847264,3264847295,LI
3264847360,3264847487,FR
3264847488,3264847615,RU
@@ -84309,7 +86600,9 @@
3265467520,3265467523,ES
3265467524,3265527055,DE
3265527056,3265527059,ES
-3265527060,3265527807,DE
+3265527060,3265527063,DE
+3265527064,3265527071,SE
+3265527072,3265527807,DE
3265527808,3265569279,GB
3265569280,3265569791,AE
3265569792,3265582335,GB
@@ -84337,6 +86630,7 @@
3265604096,3265604351,SA
3265604352,3265604607,FR
3265604608,3265604863,CH
+3265604864,3265605119,RU
3265605120,3265605375,UA
3265605376,3265605631,CZ
3265605632,3265605887,PL
@@ -84727,9 +87021,7 @@
3267626240,3267626495,BE
3267626496,3267626751,ES
3267626752,3267627007,RU
-3267627008,3267627167,DE
-3267627168,3267627199,EU
-3267627200,3267627343,DE
+3267627008,3267627343,DE
3267627344,3267627359,EU
3267627360,3267627423,DE
3267627424,3267627431,EU
@@ -85152,8 +87444,8 @@
3268224768,3268225023,US
3268225024,3268226367,EU
3268226368,3268226663,GB
-3268226664,3268226687,EU
-3268226688,3268226815,GB
+3268226664,3268226671,EU
+3268226672,3268226815,GB
3268226816,3268227327,EU
3268227328,3268227391,GB
3268227392,3268227519,EU
@@ -85535,8 +87827,8 @@
3269279488,3269279671,EU
3269279672,3269279679,CH
3269279680,3269279743,EU
-3269279744,3269279999,GB
-3269280000,3269280767,NL
+3269279744,3269280127,GB
+3269280128,3269280767,NL
3269280768,3269281023,GB
3269281024,3269281279,DE
3269281280,3269282047,EU
@@ -85637,7 +87929,9 @@
3269320704,3269321727,GB
3269321728,3269322239,EU
3269322240,3269322495,DE
-3269322496,3269322679,EU
+3269322496,3269322655,EU
+3269322656,3269322671,DE
+3269322672,3269322679,EU
3269322680,3269322683,DE
3269322684,3269322751,EU
3269322752,3269323263,DE
@@ -85945,6 +88239,7 @@
3270979072,3270979327,PL
3270979328,3270979583,AT
3270979584,3270979839,LV
+3270979840,3270980095,GB
3270980096,3270980351,AM
3270980352,3270980607,RU
3270980608,3270980863,MD
@@ -86149,7 +88444,7 @@
3271692288,3271694847,EU
3271694848,3271695103,GB
3271695104,3271696383,EU
-3271696384,3271698431,DE
+3271696384,3271698431,GB
3271698432,3271704575,EU
3271704576,3271712767,RU
3271712768,3271716863,LV
@@ -87163,7 +89458,7 @@
3273023488,3273024511,PL
3273024512,3273025535,NL
3273025536,3273026559,RU
-3273027584,3273028607,UA
+3273026560,3273028607,UA
3273028608,3273029631,PL
3273030656,3273031679,PL
3273031680,3273032191,GB
@@ -87195,9 +89490,7 @@
3273051968,3273052039,IT
3273052040,3273052047,NL
3273052048,3273052063,GR
-3273052064,3273052087,IT
-3273052088,3273052111,GR
-3273052112,3273052415,IT
+3273052064,3273052415,IT
3273052416,3273052671,GB
3273052672,3273052927,FR
3273052928,3273053183,DE
@@ -87281,8 +89574,8 @@
3273326984,3273326987,DE
3273326988,3273326991,EU
3273326992,3273327047,DE
-3273327048,3273327279,EU
-3273327280,3273327287,DE
+3273327048,3273327263,EU
+3273327264,3273327287,DE
3273327288,3273327359,EU
3273327360,3273327423,IE
3273327424,3273327511,GB
@@ -87434,7 +89727,8 @@
3273372672,3273372927,GB
3273372928,3273373183,NL
3273373184,3273373455,GB
-3273373456,3273373695,DE
+3273373456,3273373567,DE
+3273373568,3273373695,GB
3273373696,3273375231,EU
3273375232,3273375551,DE
3273375552,3273375743,EU
@@ -87527,6 +89821,7 @@
3273438208,3273438719,IL
3273438720,3273439231,PL
3273439232,3273439743,RO
+3273439744,3273440255,DE
3273440256,3273440767,RO
3273440768,3273441279,AT
3273441280,3273441599,GB
@@ -88319,10 +90614,8 @@
3275423752,3275423775,EU
3275423776,3275423807,GB
3275423808,3275423871,EU
-3275423872,3275424647,GB
-3275424648,3275424655,EU
-3275424656,3275424671,GB
-3275424672,3275425791,EU
+3275423872,3275424711,GB
+3275424712,3275425791,EU
3275425792,3275427271,GB
3275427272,3275427279,EU
3275427280,3275427615,GB
@@ -88330,7 +90623,9 @@
3275427840,3275428375,GB
3275428376,3275428383,EU
3275428384,3275428399,GB
-3275428400,3275429887,EU
+3275428400,3275428415,EU
+3275428416,3275428447,GB
+3275428448,3275429887,EU
3275429888,3275430143,GB
3275430144,3275430271,EU
3275430272,3275430399,GB
@@ -88341,8 +90636,8 @@
3275432704,3275433983,EU
3275433984,3275437567,GB
3275437568,3275438079,EU
-3275438080,3275438615,GB
-3275438616,3275440127,EU
+3275438080,3275438623,GB
+3275438624,3275440127,EU
3275440128,3275440639,GB
3275440640,3275442175,EU
3275442176,3275442719,GB
@@ -88350,7 +90645,9 @@
3275444224,3275444735,GB
3275444736,3275446271,EU
3275446272,3275447063,GB
-3275447064,3275448319,EU
+3275447064,3275447071,EU
+3275447072,3275447087,GB
+3275447088,3275448319,EU
3275448320,3275449519,GB
3275449520,3275449527,FR
3275449528,3275450879,GB
@@ -88359,9 +90656,7 @@
3275451264,3275452415,EU
3275452416,3275454127,GB
3275454128,3275454143,EU
-3275454144,3275454415,GB
-3275454416,3275454463,EU
-3275454464,3275457023,GB
+3275454144,3275457023,GB
3275457024,3275457791,FK
3275457792,3275458559,GB
3275458560,3275460095,IE
@@ -88369,8 +90664,8 @@
3275460608,3275460863,HK
3275460864,3275463523,GB
3275463524,3275463527,EU
-3275463528,3275463551,GB
-3275463552,3275463679,EU
+3275463528,3275463583,GB
+3275463584,3275463679,EU
3275463680,3275464031,GB
3275464032,3275464047,IE
3275464048,3275468655,GB
@@ -88412,6 +90707,7 @@
3275510624,3275510655,EE
3275510656,3275510687,FR
3275510720,3275510751,GB
+3275510752,3275510783,NL
3275510784,3275510911,RU
3275510912,3275511167,GB
3275511168,3275511295,LV
@@ -88650,6 +90946,7 @@
3275628032,3275628543,IL
3275628544,3275629567,RU
3275629568,3275630079,UA
+3275630080,3275630591,RU
3275630592,3275631103,PL
3275631104,3275631615,FR
3275631616,3275632127,DE
@@ -88695,6 +90992,7 @@
3275789312,3275789823,UA
3275789824,3275790335,PL
3275790336,3275790847,MD
+3275790848,3275791359,UA
3275791360,3275791871,RU
3275791872,3275792383,PL
3275792384,3275792895,BG
@@ -88780,6 +91078,7 @@
3275914496,3275914751,BG
3275914752,3275915007,RU
3275915008,3275915263,PT
+3275915264,3275915775,SA
3275915776,3275916287,SE
3275916288,3275916799,US
3275916800,3275917311,NL
@@ -88843,9 +91142,13 @@
3276014256,3276014263,GB
3276014264,3276014471,FR
3276014472,3276014495,GB
-3276014496,3276014887,FR
+3276014496,3276014775,FR
+3276014776,3276014783,GB
+3276014784,3276014887,FR
3276014888,3276014895,IE
-3276014896,3276015103,FR
+3276014896,3276014943,FR
+3276014944,3276014951,GB
+3276014952,3276015103,FR
3276015104,3276015119,GB
3276015120,3276015199,FR
3276015200,3276015231,GB
@@ -88853,11 +91156,13 @@
3276015248,3276015263,GB
3276015264,3276015295,FR
3276015296,3276015327,GB
-3276015328,3276015415,FR
+3276015328,3276015383,FR
+3276015384,3276015391,GB
+3276015392,3276015415,FR
3276015416,3276015423,GB
3276015424,3276015559,FR
-3276015560,3276015583,GB
-3276015584,3276015879,FR
+3276015560,3276015599,GB
+3276015600,3276015879,FR
3276015880,3276015887,GB
3276015888,3276016391,FR
3276016392,3276016399,GB
@@ -88924,8 +91229,8 @@
3276019544,3276019559,FR
3276019560,3276019599,GB
3276019600,3276019639,FR
-3276019640,3276019647,GB
-3276019648,3276019679,FR
+3276019640,3276019663,GB
+3276019664,3276019679,FR
3276019680,3276019687,GB
3276019688,3276019695,FR
3276019696,3276019703,GB
@@ -88937,7 +91242,9 @@
3276019864,3276019887,GB
3276019888,3276019919,FR
3276019920,3276019927,GB
-3276019928,3276020407,FR
+3276019928,3276019959,FR
+3276019960,3276019967,GB
+3276019968,3276020407,FR
3276020408,3276020415,GB
3276020416,3276020503,FR
3276020504,3276020511,GB
@@ -88994,8 +91301,8 @@
3276023952,3276023959,FR
3276023960,3276023967,GB
3276023968,3276024719,FR
-3276024720,3276024831,GB
-3276024832,3276025111,FR
+3276024720,3276024767,GB
+3276024768,3276025111,FR
3276025112,3276025135,GB
3276025136,3276025151,FR
3276025152,3276025159,GB
@@ -89175,17 +91482,9 @@
3276033880,3276033887,GB
3276033888,3276033927,FR
3276033928,3276033951,GB
-3276033952,3276036111,FR
-3276036112,3276036119,GB
-3276036120,3276036191,FR
-3276036192,3276036207,GB
-3276036208,3276036223,FR
-3276036224,3276036255,GB
-3276036256,3276036271,FR
-3276036272,3276036287,GB
-3276036288,3276036303,FR
-3276036304,3276036335,GB
-3276036336,3276036343,FR
+3276033952,3276036271,FR
+3276036272,3276036279,DE
+3276036280,3276036343,FR
3276036344,3276036351,GB
3276036352,3276036383,FR
3276036384,3276036415,GB
@@ -89225,9 +91524,7 @@
3276039552,3276039567,GB
3276039568,3276039647,FR
3276039648,3276039663,GB
-3276039664,3276039943,FR
-3276039944,3276039951,GB
-3276039952,3276039967,FR
+3276039664,3276039967,FR
3276039968,3276040031,GB
3276040032,3276040063,FR
3276040064,3276040095,GB
@@ -89424,6 +91721,7 @@
3276133376,3276134399,GB
3276134400,3276135423,RU
3276135424,3276136447,UA
+3276136448,3276137471,NL
3276137472,3276138495,PL
3276138496,3276139519,NL
3276139520,3276140543,IL
@@ -91597,9 +93895,7 @@
3276480096,3276480111,EU
3276480112,3276480159,FR
3276480160,3276480191,EU
-3276480192,3276480295,FR
-3276480296,3276480303,EU
-3276480304,3276480319,FR
+3276480192,3276480319,FR
3276480320,3276480351,EU
3276480352,3276480375,FR
3276480376,3276480399,EU
@@ -91643,9 +93939,7 @@
3276492128,3276492143,EU
3276492144,3276492151,GB
3276492152,3276492287,EU
-3276492288,3276492487,GB
-3276492488,3276492495,EU
-3276492496,3276492831,GB
+3276492288,3276492831,GB
3276492832,3276492839,EU
3276492840,3276493215,GB
3276493216,3276493247,EU
@@ -91672,9 +93966,7 @@
3276497664,3276497919,DE
3276497920,3276498047,GB
3276498048,3276498303,EU
-3276498304,3276498311,GB
-3276498312,3276498319,EU
-3276498320,3276498431,GB
+3276498304,3276498431,GB
3276498432,3276499199,DE
3276499200,3276499455,EU
3276499456,3276499503,DE
@@ -91733,8 +94025,8 @@
3276508928,3276509183,EU
3276509184,3276510207,IT
3276510208,3276510719,EU
-3276510720,3276510735,IT
-3276510736,3276510783,EU
+3276510720,3276510751,IT
+3276510752,3276510783,EU
3276510784,3276510815,IT
3276510816,3276510847,EU
3276510848,3276510911,GB
@@ -91809,7 +94101,9 @@
3276520832,3276520927,SE
3276520928,3276520943,EU
3276520944,3276521215,SE
-3276521216,3276521983,EU
+3276521216,3276521471,EU
+3276521472,3276521479,RO
+3276521480,3276521983,EU
3276521984,3276523519,NL
3276523520,3276523791,EU
3276523792,3276523911,NO
@@ -92388,7 +94682,6 @@
3276799872,3276799999,NL
3276800000,3276824575,GB
3276824576,3276832767,EE
-3276832768,3276834815,GB
3276836864,3276837887,RU
3276837888,3276838911,EU
3276838912,3276840959,FR
@@ -92441,7 +94734,9 @@
3276875776,3276876031,GB
3276876032,3276876287,DK
3276876288,3276876415,NL
-3276876416,3276876799,GB
+3276876416,3276876431,GB
+3276876432,3276876479,NL
+3276876480,3276876799,GB
3276876800,3276876823,AT
3276876824,3276877303,GB
3276877304,3276877311,AT
@@ -92451,18 +94746,18 @@
3276877560,3276877567,AT
3276877568,3276877815,GB
3276877816,3276877823,AT
-3276877824,3276877831,BG
-3276877832,3276878079,GB
+3276877824,3276878079,GB
3276878080,3276878335,BG
-3276878336,3276878847,GB
+3276878336,3276878591,GB
+3276878592,3276878847,FR
3276878848,3276879359,ES
3276879360,3276879423,TR
3276879424,3276879615,GB
3276879616,3276879871,TR
-3276879872,3276880639,DK
-3276880640,3276880895,GB
+3276879872,3276880895,DK
3276880896,3276881151,DE
-3276881152,3276881407,GB
+3276881152,3276881279,GB
+3276881280,3276881407,DE
3276881408,3276881919,FR
3276881920,3276883391,IT
3276883392,3276883455,GB
@@ -92474,8 +94769,8 @@
3276884992,3276886015,GB
3276886016,3276886271,RO
3276886272,3276886527,GB
-3276886528,3276886911,DE
-3276886912,3276887071,GB
+3276886528,3276886943,DE
+3276886944,3276887071,GB
3276887072,3276888063,DE
3276888064,3276888575,GB
3276888576,3276888831,AT
@@ -92493,13 +94788,14 @@
3276893696,3276894207,GB
3276894208,3276895999,IT
3276896000,3276896255,CZ
-3276896256,3276896831,BE
+3276896256,3276896767,BE
+3276896768,3276896831,GB
3276896832,3276896847,SE
3276896848,3276896895,GB
3276896896,3276896927,BE
3276896928,3276897023,GB
-3276897024,3276897279,BE
-3276897280,3276898047,GB
+3276897024,3276897663,BE
+3276897664,3276898047,GB
3276898048,3276898303,CZ
3276898304,3276898775,CH
3276898776,3276898783,GB
@@ -92507,9 +94803,7 @@
3276900040,3276900047,GB
3276900048,3276900351,CH
3276900352,3276900607,GB
-3276900608,3276900855,CH
-3276900856,3276900863,GB
-3276900864,3276901391,CH
+3276900608,3276901391,CH
3276901392,3276901407,GB
3276901408,3276901439,CH
3276901440,3276901631,GB
@@ -92523,8 +94817,8 @@
3276902584,3276902615,GB
3276902616,3276902639,SE
3276902640,3276902655,GB
-3276902656,3276903311,SE
-3276903312,3276903423,GB
+3276902656,3276903319,SE
+3276903320,3276903423,GB
3276903424,3276903935,SE
3276903936,3276904191,GB
3276904192,3276904447,SE
@@ -92546,14 +94840,12 @@
3276907552,3276907775,GB
3276907776,3276908159,NL
3276908160,3276908287,GB
-3276908288,3276908543,NL
-3276908544,3276909567,GB
+3276908288,3276908799,NL
+3276908800,3276909567,GB
3276909568,3276910591,NL
3276910592,3276910967,IT
3276910968,3276910975,GB
-3276910976,3276912255,IT
-3276912256,3276912287,GB
-3276912288,3276912615,IT
+3276910976,3276912615,IT
3276912616,3276912623,GB
3276912624,3276913183,IT
3276913184,3276913215,GB
@@ -92565,8 +94857,10 @@
3276914688,3276914943,ES
3276914944,3276915199,GB
3276915200,3276915567,ES
-3276915568,3276915583,GB
-3276915584,3276916175,ES
+3276915568,3276915583,NL
+3276915584,3276916079,ES
+3276916080,3276916095,GB
+3276916096,3276916175,ES
3276916176,3276916183,GB
3276916184,3276917231,ES
3276917232,3276917247,GB
@@ -92596,8 +94890,8 @@
3276923432,3276923439,GB
3276923440,3276924071,FR
3276924072,3276924079,GB
-3276924080,3276926735,FR
-3276926736,3276926783,GB
+3276924080,3276926751,FR
+3276926752,3276926783,GB
3276926784,3276926847,FR
3276926848,3276931071,GB
3276931072,3276939263,KZ
@@ -92941,7 +95235,7 @@
3277823744,3277823999,UA
3277824000,3277824255,TR
3277824256,3277824511,SI
-3277824768,3277825023,AT
+3277824512,3277825023,AT
3277825024,3277825279,PL
3277825280,3277825535,UA
3277825536,3277826047,RO
@@ -93067,7 +95361,7 @@
3278769152,3278769663,FR
3278769664,3278770175,DE
3278770176,3278770687,DK
-3278770688,3278771199,DE
+3278770688,3278771711,DE
3278771712,3278772223,NL
3278772224,3278772735,BG
3278772736,3278773247,DE
@@ -95446,9 +97740,7 @@
3278945833,3278945833,GB
3278945834,3278945834,NL
3278945835,3278945835,CH
-3278945836,3278945838,DE
-3278945839,3278945839,CZ
-3278945840,3278945840,DE
+3278945836,3278945840,DE
3278945841,3278945841,CH
3278945842,3278945844,DE
3278945845,3278945845,ES
@@ -96084,7 +98376,7 @@
3280583424,3280583679,RU
3280583680,3280583935,PS
3280583936,3280584191,PL
-3280584192,3280584447,RO
+3280584192,3280584447,KW
3280584448,3280584703,DE
3280584704,3280585215,UA
3280585216,3280585727,DK
@@ -96188,9 +98480,7 @@
3280796672,3280797695,CZ
3280797696,3280810783,CH
3280810784,3280810799,DE
-3280810800,3280844292,CH
-3280844293,3280844295,GB
-3280844296,3280863231,CH
+3280810800,3280863231,CH
3280863232,3280928767,TR
3280928768,3280928768,GB
3280928769,3280928769,DE
@@ -97672,6 +99962,7 @@
3281343232,3281343487,FI
3281343488,3281343743,GB
3281343744,3281343999,TR
+3281344000,3281344255,FR
3281344256,3281344511,RU
3281344512,3281344767,UA
3281344768,3281345023,RU
@@ -97843,22 +100134,15 @@
3282206720,3282223103,CH
3282223104,3282231295,BE
3282231296,3282239487,DE
-3282239488,3282242223,SE
-3282242224,3282242227,NO
-3282242228,3282284543,SE
-3282284544,3282284551,FI
-3282284552,3282284567,SE
-3282284568,3282284575,FR
-3282284576,3282284579,FI
+3282239488,3282284567,SE
+3282284568,3282284579,FI
3282284580,3282284591,SE
-3282284592,3282284595,FR
+3282284592,3282284595,FI
3282284596,3282284599,SE
-3282284600,3282284603,FR
+3282284600,3282284603,FI
3282284604,3282284735,SE
3282284736,3282284783,FI
-3282284784,3282286975,SE
-3282286976,3282287007,FI
-3282287008,3282287615,SE
+3282284784,3282287615,SE
3282287616,3282287759,FI
3282287760,3282305023,SE
3282305024,3282370559,PL
@@ -98784,6 +101068,7 @@
3284041984,3284042239,SI
3284042240,3284042495,GB
3284042496,3284042751,AT
+3284042752,3284043007,RU
3284043008,3284043263,DE
3284043264,3284043519,EE
3284043520,3284043775,DE
@@ -98909,6 +101194,7 @@
3284127232,3284127743,NL
3284127744,3284128255,RU
3284128256,3284128767,GB
+3284128768,3284129279,SE
3284129280,3284129791,UA
3284129792,3284130303,DE
3284130304,3284130815,GB
@@ -99116,7 +101402,6 @@
3285388288,3285389311,CH
3285389312,3285390335,FI
3285390336,3285391359,RU
-3285391360,3285392383,AM
3285392384,3285393407,RU
3285393408,3285394431,AT
3285394432,3285396479,RU
@@ -99163,11 +101448,7 @@
3285453056,3285453119,EU
3285453120,3285453415,GB
3285453416,3285453423,EU
-3285453424,3285454047,GB
-3285454048,3285454079,EU
-3285454080,3285454175,GB
-3285454176,3285454207,EU
-3285454208,3285454847,GB
+3285453424,3285454847,GB
3285454848,3285455695,DE
3285455696,3285455711,EU
3285455712,3285455743,DE
@@ -99184,7 +101465,8 @@
3285456352,3285456383,EU
3285456384,3285456639,DE
3285456640,3285456703,DK
-3285456704,3285456735,EU
+3285456704,3285456711,DE
+3285456712,3285456735,EU
3285456736,3285456743,DK
3285456744,3285456751,EU
3285456752,3285456767,DK
@@ -99204,17 +101486,15 @@
3285457664,3285457759,IT
3285457760,3285457791,EU
3285457792,3285457919,IT
-3285457920,3285457951,GB
-3285457952,3285457983,EU
-3285457984,3285458095,GB
-3285458096,3285458103,EU
-3285458104,3285458111,GB
+3285457920,3285457967,GB
+3285457968,3285457983,EU
+3285457984,3285458111,GB
3285458112,3285458175,EU
3285458176,3285458943,GB
3285458944,3285458975,DK
3285458976,3285459007,EU
-3285459008,3285459103,DK
-3285459104,3285459119,EU
+3285459008,3285459079,DK
+3285459080,3285459119,EU
3285459120,3285459327,DK
3285459328,3285459391,EU
3285459392,3285459535,DK
@@ -99318,9 +101598,7 @@
3285466624,3285466879,AT
3285466880,3285466895,BG
3285466896,3285466911,EU
-3285466912,3285466943,BG
-3285466944,3285466951,EU
-3285466952,3285466959,BG
+3285466912,3285466959,BG
3285466960,3285466983,EU
3285466984,3285467007,BG
3285467008,3285467015,EU
@@ -99418,8 +101696,8 @@
3285477024,3285477087,AT
3285477088,3285477151,EU
3285477152,3285477319,IT
-3285477320,3285477335,EU
-3285477336,3285477343,IT
+3285477320,3285477327,EU
+3285477328,3285477343,IT
3285477344,3285477359,EU
3285477360,3285477375,IT
3285477376,3285477631,FR
@@ -99481,8 +101759,8 @@
3285487616,3285487679,NL
3285487680,3285487743,EU
3285487744,3285488127,NL
-3285488128,3285488895,EU
-3285488896,3285489663,GB
+3285488128,3285488639,EU
+3285488640,3285489663,GB
3285489664,3285490175,EU
3285490176,3285490319,RU
3285490320,3285490335,EU
@@ -99530,9 +101808,7 @@
3285496528,3285496543,EU
3285496544,3285496575,FR
3285496576,3285496607,EU
-3285496608,3285496815,DE
-3285496816,3285496831,EU
-3285496832,3285497855,DE
+3285496608,3285497855,DE
3285497856,3285497887,EU
3285497888,3285498031,DE
3285498032,3285498047,EU
@@ -100507,7 +102783,8 @@
3285916712,3285916719,CY
3285916720,3285916735,ES
3285916736,3285916799,GB
-3285916800,3285917183,EU
+3285916800,3285916927,EU
+3285916928,3285917183,GB
3285917184,3285917439,ES
3285917440,3285917695,YE
3285917696,3285918719,EU
@@ -100517,10 +102794,9 @@
3285919488,3285919743,UA
3285919744,3285921791,QA
3285921792,3285921823,CZ
-3285921824,3285921983,GB
-3285921984,3285922111,EU
+3285921824,3285922111,GB
3285922112,3285922175,FR
-3285922176,3285922183,EU
+3285922176,3285922183,GB
3285922184,3285922191,RU
3285922192,3285922207,DE
3285922208,3285922239,ES
@@ -100539,7 +102815,8 @@
3285926408,3285926415,ES
3285926416,3285926431,GB
3285926432,3285926463,CH
-3285926464,3285926847,EU
+3285926464,3285926591,GB
+3285926592,3285926847,EU
3285926848,3285926911,GB
3285926912,3285927423,DE
3285927424,3285927679,GB
@@ -100551,8 +102828,8 @@
3285928224,3285928255,DE
3285928256,3285928271,GB
3285928272,3285928287,DE
-3285928288,3285928303,GB
-3285928304,3285928447,EU
+3285928288,3285928319,GB
+3285928320,3285928447,EU
3285928448,3285928959,ES
3285928960,3285929983,EU
3285929984,3285930495,GB
@@ -100601,8 +102878,7 @@
3285942784,3285943039,ES
3285943040,3285943295,SE
3285943296,3285943551,ES
-3285943552,3285943559,GB
-3285943560,3285943567,EU
+3285943552,3285943567,GB
3285943568,3285943575,ES
3285943576,3285943583,DE
3285943584,3285943615,GB
@@ -101154,6 +103430,7 @@
3287450624,3287451135,SE
3287451136,3287451647,PL
3287451648,3287452159,ES
+3287452160,3287452671,PL
3287452672,3287453183,CH
3287453184,3287454207,RU
3287454208,3287454719,SE
@@ -101295,7 +103572,7 @@
3287664896,3287665151,GB
3287665152,3287665407,NO
3287665408,3287665919,PL
-3287666176,3287666431,RU
+3287665920,3287666431,RU
3287666432,3287666687,DK
3287666688,3287666943,SI
3287666944,3287667199,CZ
@@ -101308,6 +103585,7 @@
3287668736,3287668991,SI
3287668992,3287669247,PL
3287669248,3287669503,LI
+3287669504,3287669759,MD
3287669760,3287670015,RO
3287670016,3287670271,UA
3287670272,3287670527,PL
@@ -101501,7 +103779,6 @@
3287950080,3287950335,DE
3287950336,3287950591,UA
3287950592,3287950847,PL
-3287950848,3287951103,DE
3287951104,3287951359,HU
3287951360,3287951615,FR
3287951616,3287951871,CH
@@ -101823,7 +104100,10 @@
3291203584,3291203839,ZA
3291203840,3291204095,EG
3291204096,3291204351,KE
-3291204352,3291204607,ZA
+3291204352,3291204863,ZA
+3291204864,3291205119,KE
+3291205120,3291205631,GH
+3291205632,3291205887,ZA
3291217920,3291230207,ZA
3291230208,3291234303,GH
3291234304,3291242495,ZA
@@ -102001,7 +104281,9 @@
3302760448,3302768639,ZA
3302768640,3302776831,NG
3302776832,3302785023,ZW
-3302801408,3302817791,NG
+3302801408,3302805503,NG
+3302805504,3302809599,MW
+3302809600,3302817791,NG
3302817792,3302883327,EG
3302883328,3302948863,MA
3302948864,3302949119,MU
@@ -102022,8 +104304,10 @@
3302953728,3302953983,AO
3302953984,3302954239,SD
3302954240,3302954495,KE
+3302954496,3302955007,ZA
+3302955008,3302955263,LS
3305111552,3307208703,TN
-3311403008,3311927295,ZA
+3309305856,3313500159,ZA
3313500160,3313762303,MA
3313762304,3314024447,EG
3314024448,3314286591,KE
@@ -102035,16 +104319,19 @@
3318218752,3318743039,DZ
3319529472,3319537663,ZM
3319537664,3319545855,UG
+3319652352,3319660543,ZW
3319660544,3319791615,EG
3319791616,3320053759,MU
3320578048,3320643583,ZA
3320643584,3320709119,KE
+3321724928,3321757695,MA
3321757696,3321790463,KE
3321790464,3321806847,LS
3321806848,3321823231,SD
3321823232,3321839615,NG
3321839616,3321855999,GH
-3321886720,3321887743,MU
+3321856000,3321860095,CV
+3321860096,3321864191,ZA
3321954304,3321970687,US
3322019840,3322023935,US
3322023936,3322028031,CL
@@ -102472,7 +104759,32 @@
3330778880,3330779135,GB
3330779136,3330791423,US
3330791424,3330791679,CA
-3330791680,3331102463,US
+3330791680,3330883583,US
+3330883584,3330884351,NL
+3330884352,3330884863,US
+3330884864,3330885119,GB
+3330885120,3330888063,US
+3330888064,3330888127,NL
+3330888128,3330888191,US
+3330888192,3330888703,AU
+3330888704,3330888959,US
+3330888960,3330889215,CH
+3330889216,3330889471,GB
+3330889472,3330890239,JP
+3330890240,3330890751,BE
+3330890752,3330891263,GB
+3330891264,3330892287,US
+3330892288,3330892543,FR
+3330892544,3330893567,US
+3330893568,3330893823,NL
+3330893824,3330894079,CA
+3330894080,3330894591,GB
+3330894592,3330894847,DE
+3330894848,3330897919,US
+3330897920,3330898175,CA
+3330898176,3330898431,DE
+3330898432,3330898943,FR
+3330898944,3331102463,US
3331102464,3331102719,CA
3331102720,3331194879,US
3331194880,3331260415,AU
@@ -102943,7 +105255,9 @@
3341778944,3341807615,US
3341807616,3341808639,CA
3341808640,3341828095,US
-3341844480,3341863935,US
+3341844480,3341854551,US
+3341854552,3341854559,SG
+3341854560,3341863935,US
3341863936,3341864959,AG
3341864960,3341867007,US
3341867008,3341869055,CA
@@ -102962,7 +105276,9 @@
3342526464,3342528511,CA
3342528512,3342548991,US
3342565376,3342567423,CA
-3342567424,3342579711,US
+3342567424,3342569471,US
+3342569472,3342569727,CR
+3342569728,3342579711,US
3342579712,3342581759,CA
3342581760,3342595071,US
3342595072,3342595839,CA
@@ -103049,8 +105365,22 @@
3345007616,3345008639,CA
3345008640,3345010687,US
3345010688,3345011711,CA
-3345011712,3345367039,US
-3345416192,3345418239,US
+3345011712,3345301503,US
+3345317888,3345327103,US
+3345327104,3345328127,CA
+3345328128,3345333247,US
+3345333248,3345334271,MF
+3345334272,3345339391,US
+3345339392,3345340415,CA
+3345340416,3345367039,US
+3345383424,3345384447,CA
+3345384448,3345390591,US
+3345390592,3345391615,CA
+3345391616,3345398783,US
+3345398784,3345399807,BS
+3345399808,3345401855,PR
+3345401856,3345403903,CA
+3345403904,3345418239,US
3345418240,3345419519,NL
3345419520,3345422847,US
3345423360,3345424383,TC
@@ -103809,11 +106139,13 @@
3356380928,3356381183,DO
3356381184,3356381439,CL
3356381440,3356381695,PA
+3356381696,3356382207,UY
3356382208,3356389375,CL
3356389376,3356389887,CO
3356389888,3356390399,CL
3356390400,3356390655,AR
3356390656,3356391167,CL
+3356391168,3356391423,PA
3356391424,3356393471,CO
3356393472,3356413183,CL
3356413184,3356413951,CO
@@ -103827,11 +106159,14 @@
3356499968,3356508159,MX
3356508160,3356508671,AR
3356508672,3356509183,CR
+3356509184,3356510207,VE
3356510208,3356514303,AR
3356514304,3356514559,US
+3356514560,3356514815,AR
3356516352,3356520447,AR
3356520448,3356521471,CL
3356521472,3356521727,AR
+3356521728,3356522495,CO
3356522496,3356557311,AR
3356557312,3356819455,BR
3356819456,3356884991,CO
@@ -104615,6 +106950,7 @@
3363569664,3363577855,PA
3363577856,3363586047,CL
3363586048,3363594239,BZ
+3363594240,3363598335,AR
3363602432,3363610623,AN
3363610624,3363614719,CO
3363618816,3363622911,UY
@@ -104633,6 +106969,11 @@
3363733504,3363831807,AR
3363831808,3378511871,BR
3378511872,3383754751,MX
+3384279040,3384410111,CO
+3384541184,3384672255,CL
+3384672256,3384688639,HN
+3384688640,3384705023,CO
+3384705024,3384737791,PA
3384737792,3385851903,CR
3385851904,3386114047,VE
3386114048,3386245119,AR
@@ -105810,8 +108151,7 @@
3393859328,3393859583,JP
3393859584,3393860095,AU
3393860096,3393860607,HK
-3393860608,3393860863,AU
-3393860864,3393861631,IN
+3393860608,3393861631,IN
3393861632,3393861887,VN
3393861888,3393862143,AU
3393862144,3393862655,VN
@@ -107411,11 +109751,16 @@
3406434304,3406436351,MY
3406436352,3406445055,AU
3406445056,3406445311,MY
-3406445312,3406542847,AU
+3406445312,3406512383,AU
+3406512384,3406512639,IN
+3406512640,3406514687,AU
+3406514688,3406514943,TH
+3406514944,3406542847,AU
3406542848,3406543103,SG
3406543104,3406565887,AU
3406565888,3406566143,PH
3406566144,3406566399,AU
+3406566400,3406566911,ID
3406566912,3406591487,AU
3406591488,3406591743,NP
3406591744,3406617599,AU
@@ -107424,7 +109769,9 @@
3406618112,3406618623,IN
3406618624,3406625023,AU
3406625024,3406625279,NF
-3406625280,3406669823,AU
+3406625280,3406637055,AU
+3406637056,3406637311,IN
+3406637312,3406669823,AU
3406669824,3406670847,IN
3406670848,3406696959,AU
3406696960,3406697215,IN
@@ -107436,16 +109783,29 @@
3406739200,3406739455,ID
3406739456,3406746623,AU
3406746624,3406746879,HK
-3406746880,3406865663,AU
+3406746880,3406832127,AU
+3406832128,3406832383,PK
+3406832384,3406865663,AU
3406865664,3406865919,IN
-3406865920,3406946815,AU
+3406865920,3406884607,AU
+3406884608,3406884863,HK
+3406884864,3406894335,AU
+3406894336,3406894591,ID
+3406894592,3406896895,AU
+3406896896,3406897151,IN
+3406897152,3406938623,AU
+3406938624,3406938879,IN
+3406938880,3406946815,AU
3406946816,3406947071,KR
3406947072,3406950399,AU
3406950400,3406951423,NF
-3406951424,3406961151,AU
+3406951424,3406952703,AU
+3406952704,3406952959,PH
+3406952960,3406961151,AU
3406961152,3406961407,IN
3406961408,3406967295,AU
3406967296,3406967551,CN
+3406967552,3406967807,IN
3406967808,3406989567,AU
3406989568,3406989823,IN
3406989824,3407020287,AU
@@ -107499,11 +109859,17 @@
3407159232,3407159239,NZ
3407159240,3407159263,AU
3407159264,3407159295,NZ
-3407159296,3407243263,AU
+3407159296,3407161599,AU
+3407161856,3407162367,TH
+3407162368,3407170047,AU
+3407170048,3407170559,ID
+3407170560,3407243263,AU
3407243264,3407243775,HK
3407243776,3407268863,AU
3407268864,3407269119,US
-3407269120,3407367167,AU
+3407269120,3407360511,AU
+3407360512,3407361023,ID
+3407361024,3407367167,AU
3407367168,3407367679,ID
3407367680,3407367935,AU
3407368192,3407369983,AU
@@ -107512,13 +109878,17 @@
3407498496,3407498751,PK
3407498752,3407524607,AU
3407524608,3407524863,NZ
-3407524864,3407602943,AU
+3407524864,3407545855,AU
+3407545856,3407546367,ID
+3407546368,3407602943,AU
3407602944,3407603199,JP
3407603200,3407604479,AU
3407604480,3407604735,IN
3407604736,3407608715,AU
3407608716,3407608736,JP
-3407608737,3407682047,AU
+3407608737,3407642623,AU
+3407642624,3407643135,TH
+3407643136,3407682047,AU
3407682048,3407682559,ID
3407682560,3407732223,AU
3407732224,3407732479,HK
@@ -107532,7 +109902,9 @@
3407801344,3407801855,ID
3407801856,3407805951,AU
3407805952,3407806463,ID
-3407806464,3407814655,AU
+3407806464,3407808511,AU
+3407808512,3407809023,IN
+3407809024,3407814655,AU
3407814656,3407815167,HK
3407815168,3407828991,AU
3407828992,3407829503,US
@@ -109250,7 +111622,6 @@
3419512832,3419516927,AU
3419516928,3419517951,JP
3419517952,3419518975,VN
-3419518976,3419519999,TW
3419520000,3419520767,ID
3419520768,3419521023,TH
3419521024,3419529215,AU
@@ -109523,7 +111894,9 @@
3423161480,3423161487,HK
3423161488,3423161613,US
3423161614,3423161621,CA
-3423161622,3423182847,US
+3423161622,3423162303,US
+3423162304,3423162311,GB
+3423162312,3423182847,US
3423182848,3423183199,CA
3423183200,3423183231,BM
3423183232,3423183263,CA
@@ -109563,7 +111936,7 @@
3423236096,3423238143,JM
3423238144,3423258623,US
3423258624,3423260671,CA
-3423262720,3423264831,US
+3423260672,3423264831,US
3423264832,3423264863,NG
3423264864,3423265247,US
3423265248,3423265263,EC
@@ -109761,7 +112134,9 @@
3423365776,3423365783,CA
3423365784,3423365903,US
3423365904,3423365911,AE
-3423365912,3423366223,US
+3423365912,3423366127,US
+3423366128,3423366135,SA
+3423366136,3423366223,US
3423366224,3423366239,AU
3423366240,3423366295,US
3423366296,3423366303,CA
@@ -109771,7 +112146,9 @@
3423366480,3423366495,IT
3423366496,3423366703,US
3423366704,3423366711,GB
-3423366712,3423366991,US
+3423366712,3423366855,US
+3423366856,3423366871,BR
+3423366872,3423366991,US
3423366992,3423366999,CA
3423367000,3423367223,US
3423367224,3423367231,AU
@@ -109833,8 +112210,8 @@
3423401184,3423401191,RU
3423401192,3423402943,US
3423402944,3423402951,RU
-3423402952,3423412223,US
-3423414272,3423416319,US
+3423402952,3423416319,US
+3423416320,3423417343,CA
3423417344,3423417470,US
3423417471,3423417480,AU
3423417481,3423462655,US
@@ -109878,8 +112255,7 @@
3423544512,3423544543,CA
3423544544,3423544551,US
3423544552,3423545343,CA
-3423545344,3423549439,US
-3423551488,3423554183,US
+3423545344,3423554183,US
3423554184,3423554191,CA
3423554192,3423554271,US
3423554272,3423554279,GB
@@ -109960,7 +112336,9 @@
3423653888,3423705599,US
3423705600,3423705855,CA
3423705856,3423797247,US
-3423797248,3423827711,CA
+3423797248,3423823359,CA
+3423823360,3423823871,US
+3423823872,3423827711,CA
3423827712,3423827967,US
3423827968,3423848447,CA
3423848448,3423849471,KN
@@ -110002,7 +112380,12 @@
3426013184,3426013439,IL
3426013440,3426387967,US
3426387968,3426388991,MX
-3426388992,3426646015,US
+3426388992,3426617855,US
+3426618368,3426618687,US
+3426618688,3426618703,NZ
+3426618704,3426618911,US
+3426618912,3426618943,NZ
+3426618944,3426646015,US
3426646016,3426647039,CA
3426647040,3426680831,US
3426680832,3426680959,KN
@@ -110063,8 +112446,7 @@
3427750912,3427751423,US
3427751424,3427751519,BE
3427751520,3427752447,US
-3427752448,3427752703,NL
-3427752704,3427752959,GB
+3427752448,3427752959,GB
3427752960,3427753215,US
3427753216,3427753471,JP
3427753472,3427753727,FI
@@ -110235,7 +112617,9 @@
3428587776,3428588287,CA
3428588288,3428588543,US
3428588544,3428589055,CA
-3428589056,3428591623,US
+3428589056,3428589311,US
+3428589312,3428589567,CA
+3428589568,3428591623,US
3428591624,3428591663,CA
3428591664,3428591679,US
3428591680,3428591695,CA
@@ -110339,8 +112723,8 @@
3428607744,3428607871,CA
3428607872,3428607999,US
3428608000,3428609023,CA
-3428609024,3428610303,US
-3428610304,3428611071,CA
+3428609024,3428610047,US
+3428610048,3428611071,CA
3428611072,3428611583,US
3428611584,3428611839,CA
3428611840,3428612607,US
@@ -110356,8 +112740,8 @@
3428623616,3428623871,US
3428623872,3428624639,CA
3428624640,3428625407,US
-3428625408,3428627199,CA
-3428627200,3428630015,US
+3428625408,3428628223,CA
+3428628224,3428630015,US
3428630016,3428634623,CA
3428634624,3428634879,US
3428634880,3428635135,CA
@@ -110435,7 +112819,9 @@
3429411584,3429411839,DE
3429411840,3429500927,US
3429500928,3429502975,A2
-3429502976,3429775359,US
+3429502976,3429774599,US
+3429774600,3429774607,BD
+3429774608,3429775359,US
3429775360,3429777407,TC
3429777408,3429892095,US
3429892096,3429957631,CA
@@ -110498,7 +112884,7 @@
3430807296,3430807551,CA
3430807552,3430809087,US
3430809088,3430809343,CA
-3430809344,3430812159,US
+3430809344,3430812671,US
3430812672,3430813183,MX
3430813184,3430842367,US
3430842368,3430842879,DO
@@ -110508,12 +112894,18 @@
3431114496,3431114751,CA
3431114752,3431468031,US
3431468032,3431469055,CA
-3431469056,3431596031,US
-3431596032,3431613439,CA
+3431469056,3431596287,US
+3431596288,3431602687,CA
+3431602688,3431602943,US
+3431602944,3431613439,CA
3431613440,3431613695,US
-3431613696,3431621631,CA
-3431621632,3431622143,US
-3431622400,3431624703,CA
+3431613696,3431620095,CA
+3431620096,3431620351,US
+3431620352,3431621375,CA
+3431621376,3431622399,US
+3431622400,3431622655,CA
+3431622656,3431622911,US
+3431622912,3431624703,CA
3431624704,3431624959,US
3431624960,3431638783,CA
3431638784,3431639039,US
@@ -110662,7 +113054,9 @@
3435271424,3435271679,CA
3435271680,3435507711,US
3435507712,3435511807,CA
-3435511808,3436249343,US
+3435511808,3435518463,US
+3435518464,3435518527,GI
+3435518528,3436249343,US
3436249344,3436255743,CA
3436255744,3436256255,US
3436256256,3436282367,CA
@@ -110709,7 +113103,9 @@
3437332480,3437332735,US
3437332736,3437334015,CA
3437334016,3437334271,US
-3437334272,3437336063,CA
+3437334272,3437334783,CA
+3437334784,3437335551,US
+3437335552,3437336063,CA
3437336064,3437336319,US
3437336320,3437341695,CA
3437341696,3437341951,US
@@ -110794,7 +113190,9 @@
3437756160,3437756415,IE
3437756416,3437772799,US
3437772800,3437776895,CA
-3437776896,3437789863,US
+3437776896,3437789847,US
+3437789848,3437789855,IN
+3437789856,3437789863,US
3437789864,3437789871,AU
3437789872,3437790143,US
3437790144,3437790159,CA
@@ -112707,7 +115105,9 @@
3461514752,3461516287,CA
3461516288,3461516543,IL
3461516544,3461517055,CA
-3461517056,3461554175,US
+3461517056,3461532607,US
+3461532608,3461532623,CA
+3461532624,3461554175,US
3461554176,3461556223,CA
3461558272,3461597887,US
3461597888,3461597951,CO
@@ -112882,7 +115282,9 @@
3464185760,3464185791,PR
3464185792,3464190463,US
3464190464,3464190719,CA
-3464190720,3464191799,US
+3464190720,3464191775,US
+3464191776,3464191783,ES
+3464191784,3464191799,US
3464191800,3464191807,AF
3464191808,3464191815,US
3464191816,3464191823,CA
@@ -113441,9 +115843,7 @@
3468628512,3468628607,US
3468628608,3468628927,CA
3468628928,3468628991,US
-3468628992,3468629311,CA
-3468629312,3468629319,US
-3468629320,3468631583,CA
+3468628992,3468631583,CA
3468631584,3468631615,US
3468631616,3468631679,CA
3468631680,3468631695,US
@@ -113967,7 +116367,8 @@
3470188522,3470188541,HK
3470188542,3470192639,US
3470192640,3470196735,CA
-3470196736,3470360631,US
+3470196736,3470360623,US
+3470360624,3470360631,SG
3470360632,3470360639,CA
3470360640,3470360687,US
3470360688,3470360695,AF
@@ -113992,7 +116393,8 @@
3470362320,3470362335,AF
3470362336,3470362455,US
3470362456,3470362471,CA
-3470362472,3470362495,US
+3470362472,3470362487,US
+3470362488,3470362495,ES
3470362496,3470362503,CA
3470362504,3470362559,US
3470362560,3470362623,CA
@@ -114262,11 +116664,7 @@
3470754304,3470754559,PE
3470754560,3470755839,US
3470755840,3470756095,ZA
-3470756096,3470757887,US
-3470757888,3470760959,KN
-3470760960,3470761215,US
-3470761216,3470761727,KN
-3470761728,3470761983,US
+3470756096,3470761983,US
3470761984,3470762751,CA
3470762752,3470762759,NL
3470762760,3470767871,CA
@@ -114372,17 +116770,7 @@
3474548224,3474548479,JP
3474548480,3474623599,US
3474623600,3474623615,CA
-3474623616,3474841599,US
-3474841600,3474843071,KN
-3474843072,3474843135,US
-3474843136,3474844927,KN
-3474844928,3474845055,US
-3474845056,3474845439,KN
-3474845440,3474845567,US
-3474845568,3474846463,KN
-3474846464,3474846591,US
-3474846592,3474849791,KN
-3474849792,3475029927,US
+3474623616,3475029927,US
3475029928,3475029935,CA
3475029936,3475112191,US
3475112192,3475113215,CA
@@ -114503,7 +116891,11 @@
3476725424,3476725431,GB
3476725432,3476732373,US
3476732374,3476732377,MX
-3476732378,3476881407,US
+3476732378,3476733603,US
+3476733604,3476733604,MX
+3476733605,3476733913,US
+3476733914,3476733914,MX
+3476733915,3476881407,US
3476881408,3476946943,CA
3476946944,3477161503,US
3477161504,3477161519,TN
@@ -115626,7 +118018,9 @@
3492646624,3492646639,IL
3492646640,3492669695,US
3492669696,3492671487,PA
-3492671488,3492795775,US
+3492671488,3492730415,US
+3492730416,3492730431,CA
+3492730432,3492795775,US
3492795776,3492795903,AR
3492795904,3492827391,US
3492827392,3492827423,CA
@@ -115674,7 +118068,8 @@
3493901024,3493901031,HK
3493901032,3493901311,US
3493901312,3493901567,AE
-3493901568,3493901599,IL
+3493901568,3493901583,US
+3493901584,3493901599,VG
3493901600,3493901759,US
3493901760,3493901767,AE
3493901768,3493901791,US
@@ -115690,7 +118085,9 @@
3493914368,3493916671,US
3493918720,3493936127,US
3493936128,3493937151,CA
-3493937152,3493982207,US
+3493937152,3493980159,US
+3493980160,3493981183,CA
+3493981184,3493982207,US
3493982208,3493984255,CA
3493984256,3493986303,US
3493986304,3493986623,CA
@@ -115729,7 +118126,11 @@
3494101430,3494101437,GB
3494101438,3494102623,US
3494102624,3494102639,SB
-3494102640,3494102735,US
+3494102640,3494102687,US
+3494102688,3494102701,PE
+3494102702,3494102703,US
+3494102704,3494102711,CA
+3494102712,3494102735,US
3494102736,3494102743,VI
3494102744,3494109925,US
3494109926,3494109942,CA
@@ -115957,7 +118358,7 @@
3494438032,3494438063,GP
3494438064,3494438071,KN
3494438072,3494438143,GP
-3494438144,3494438399,VC
+3494438144,3494438399,DM
3494438400,3494438655,KN
3494438656,3494438911,DM
3494438912,3494439935,CA
@@ -116139,15 +118540,14 @@
3494861096,3494862639,US
3494862640,3494862647,JP
3494862648,3494862847,US
-3494862848,3494863615,VC
-3494863616,3494863871,DM
+3494862848,3494863871,DM
3494863872,3494866943,US
3494866944,3494867967,CA
3494867968,3494893567,US
3494893568,3494894591,CA
3494894592,3494917119,US
-3494917120,3494918143,CA
-3494918144,3494928383,US
+3494917120,3494917631,CA
+3494917632,3494928383,US
3494928384,3494930431,CA
3494930432,3494935746,US
3494935747,3494935747,GB
@@ -116215,7 +118615,9 @@
3495159808,3495159815,ES
3495159816,3495159839,US
3495159840,3495159847,BR
-3495159848,3495159895,US
+3495159848,3495159871,US
+3495159872,3495159879,AE
+3495159880,3495159895,US
3495159896,3495159903,IN
3495159904,3495160111,US
3495160112,3495160119,NZ
@@ -116223,7 +118625,12 @@
3495160304,3495160319,TR
3495160320,3495160367,US
3495160368,3495160383,ZA
-3495160384,3495160535,US
+3495160384,3495160447,US
+3495160448,3495160455,BR
+3495160456,3495160463,US
+3495160464,3495160479,TR
+3495160480,3495160511,CA
+3495160512,3495160535,US
3495160536,3495160543,BR
3495160544,3495160639,US
3495160640,3495160647,CA
@@ -116231,7 +118638,9 @@
3495160664,3495160671,NL
3495160672,3495160863,US
3495160864,3495160895,TR
-3495160896,3495161151,US
+3495160896,3495161055,US
+3495161056,3495161087,TR
+3495161088,3495161151,US
3495161152,3495161183,TR
3495161184,3495161599,US
3495161600,3495161855,BR
@@ -116377,7 +118786,17 @@
3495476224,3495477247,CA
3495477248,3495478271,US
3495478272,3495479295,CA
-3495479296,3495505919,US
+3495479296,3495485599,US
+3495485600,3495485615,GB
+3495485616,3495485631,US
+3495485632,3495485663,VG
+3495485664,3495486079,US
+3495486080,3495486143,PA
+3495486144,3495486207,US
+3495486208,3495486239,AI
+3495486240,3495486335,US
+3495486336,3495486399,VG
+3495486400,3495505919,US
3495505920,3495507967,CA
3495507968,3495515135,US
3495515136,3495516159,CA
@@ -116607,8 +119026,7 @@
3496887808,3496887935,AU
3496887936,3496887975,US
3496887976,3496887983,AU
-3496887984,3496887999,US
-3496888000,3496888063,IN
+3496887984,3496888063,US
3496888064,3496888095,AU
3496888096,3496888103,PT
3496888104,3496888111,GB
@@ -117111,7 +119529,9 @@
3506058816,3506058823,AF
3506058824,3506135263,US
3506135264,3506135295,GB
-3506135296,3506177967,US
+3506135296,3506161975,US
+3506161976,3506161983,AF
+3506161984,3506177967,US
3506177968,3506177983,DE
3506177984,3506192639,US
3506192640,3506192895,A2
@@ -118452,7 +120872,7 @@
3510935552,3510943743,CA
3510943744,3511129087,US
3511129088,3511131135,CA
-3511131136,3511132159,US
+3511131136,3511140351,US
3511140352,3511156735,CA
3511156736,3511331199,US
3511331200,3511331231,CA
@@ -118525,9 +120945,7 @@
3512020096,3512020223,ES
3512020224,3512020479,US
3512020480,3512020511,GB
-3512020512,3512020543,US
-3512020544,3512020607,CA
-3512020608,3512021503,US
+3512020512,3512021503,US
3512021504,3512021759,GB
3512021760,3512022335,US
3512022336,3512022399,ES
@@ -120910,11 +123328,16 @@
3556974592,3556982783,ES
3556982784,3556984623,DE
3556984624,3556984639,FR
-3556984640,3556985663,DE
+3556984640,3556984655,DE
+3556984656,3556984663,FR
+3556984664,3556984671,DE
+3556984672,3556984719,FR
+3556984720,3556985663,DE
3556985664,3556985671,HU
3556985672,3556990975,DE
3556990976,3556999167,UA
3556999168,3557007359,RU
+3557007360,3557015551,IT
3557015552,3557023743,DE
3557023744,3557023879,BE
3557023880,3557023903,GB
@@ -120934,9 +123357,7 @@
3557028032,3557028063,GB
3557028064,3557028095,BE
3557028096,3557028351,GB
-3557028352,3557028543,BE
-3557028544,3557028607,GB
-3557028608,3557028735,BE
+3557028352,3557028735,BE
3557028736,3557028799,GB
3557028800,3557028911,BE
3557028912,3557028927,GB
@@ -121013,11 +123434,15 @@
3557302272,3557310463,UA
3557310464,3557326847,ES
3557326848,3557335039,DE
-3557335040,3557335391,BE
+3557335040,3557335295,BE
+3557335296,3557335327,EU
+3557335328,3557335391,BE
3557335392,3557335455,EU
3557335456,3557335951,BE
3557335952,3557335967,LU
-3557335968,3557336191,BE
+3557335968,3557336063,BE
+3557336064,3557336127,EU
+3557336128,3557336191,BE
3557336192,3557336255,EU
3557336256,3557336319,BE
3557336320,3557336575,EU
@@ -121084,8 +123509,8 @@
3557360560,3557360575,JE
3557360576,3557360680,GB
3557360681,3557360687,JE
-3557360688,3557360831,GB
-3557360832,3557360895,JE
+3557360688,3557360847,GB
+3557360848,3557360895,JE
3557360896,3557360927,GB
3557360928,3557360943,JE
3557360944,3557360959,GB
@@ -121116,7 +123541,11 @@
3557363656,3557363663,JE
3557363664,3557363671,GB
3557363672,3557363679,JE
-3557363680,3557364479,GB
+3557363680,3557364103,GB
+3557364104,3557364107,JE
+3557364108,3557364119,GB
+3557364120,3557364223,JE
+3557364224,3557364479,GB
3557364480,3557364495,JE
3557364496,3557364527,GB
3557364528,3557364559,JE
@@ -121238,7 +123667,9 @@
3557851136,3557859327,HU
3557859328,3557859839,SE
3557859840,3557860095,NO
-3557860096,3557860607,SE
+3557860096,3557860159,SE
+3557860160,3557860167,DK
+3557860168,3557860607,SE
3557860608,3557860623,FI
3557860624,3557860831,SE
3557860832,3557860847,FI
@@ -121427,7 +123858,9 @@
3558288320,3558288383,CH
3558288384,3558288423,US
3558288424,3558288447,GB
-3558288448,3558288483,US
+3558288448,3558288471,US
+3558288472,3558288479,GB
+3558288480,3558288483,US
3558288484,3558288487,GB
3558288488,3558288639,US
3558288640,3558288671,GB
@@ -121906,9 +124339,11 @@
3559092160,3559092160,GB
3559092161,3559092222,BE
3559092223,3559092223,GB
-3559092224,3559092295,BE
-3559092296,3559092303,GB
-3559092304,3559092399,BE
+3559092224,3559092287,BE
+3559092288,3559092303,GB
+3559092304,3559092311,BE
+3559092312,3559092319,GB
+3559092320,3559092399,BE
3559092400,3559092407,GB
3559092408,3559092735,BE
3559092736,3559092739,GB
@@ -121950,7 +124385,9 @@
3559093240,3559093243,GB
3559093244,3559093567,BE
3559093568,3559093599,IT
-3559093600,3559093687,BE
+3559093600,3559093647,BE
+3559093648,3559093671,GB
+3559093672,3559093687,BE
3559093688,3559093699,GB
3559093700,3559094019,BE
3559094020,3559094023,GB
@@ -122288,11 +124725,13 @@
3559905298,3559905299,UA
3559905300,3559905317,EE
3559905318,3559905319,LT
-3559905320,3559905323,EE
-3559905324,3559905535,UA
+3559905320,3559905327,EE
+3559905328,3559905535,UA
3559905536,3559905623,EE
3559905624,3559905631,UA
-3559905632,3559905903,EE
+3559905632,3559905695,EE
+3559905696,3559905703,UA
+3559905704,3559905903,EE
3559905904,3559905911,UA
3559905912,3559906257,EE
3559906258,3559906259,UA
@@ -124421,7 +126860,11 @@
3560951124,3560951127,GB
3560951128,3560951131,SE
3560951132,3560951135,ES
-3560951136,3560951195,SE
+3560951136,3560951143,SE
+3560951144,3560951147,BR
+3560951148,3560951155,SE
+3560951156,3560951159,US
+3560951160,3560951195,SE
3560951196,3560951199,DK
3560951200,3560951203,SE
3560951204,3560951207,AE
@@ -124493,13 +126936,13 @@
3560952236,3560952239,PT
3560952240,3560952255,SE
3560952256,3560952259,PL
-3560952260,3560952431,SE
+3560952260,3560952295,SE
+3560952296,3560952299,NL
+3560952300,3560952431,SE
3560952432,3560952435,DK
3560952436,3560953103,SE
3560953104,3560953119,JP
-3560953120,3560954239,SE
-3560954240,3560954367,AX
-3560954368,3560955903,SE
+3560953120,3560955903,SE
3560955904,3560964095,BE
3560964096,3560996863,NL
3560996864,3561005055,GB
@@ -124641,7 +127084,9 @@
3561562112,3561570303,ES
3561570304,3561578495,AM
3561578496,3561586687,RU
-3561586688,3561594879,BG
+3561586688,3561590591,BG
+3561590592,3561590623,CY
+3561590624,3561594879,BG
3561594880,3561594935,SE
3561594936,3561594939,DK
3561594940,3561594975,SE
@@ -125387,9 +127832,7 @@
3563848320,3563848327,ES
3563848328,3563848383,NL
3563848384,3563848447,ES
-3563848448,3563848495,NL
-3563848496,3563848511,ES
-3563848512,3563848575,NL
+3563848448,3563848575,NL
3563848576,3563848583,ES
3563848584,3563848655,NL
3563848656,3563848703,ES
@@ -125748,9 +128191,7 @@
3564560512,3564560527,US
3564560528,3564560543,GB
3564560544,3564560607,US
-3564560608,3564560927,GB
-3564560928,3564560959,US
-3564560960,3564561071,GB
+3564560608,3564561071,GB
3564561072,3564561087,US
3564561088,3564561151,GB
3564561152,3564561407,US
@@ -125759,8 +128200,7 @@
3564561672,3564561679,GB
3564561680,3564561687,US
3564561688,3564561695,GB
-3564561696,3564561791,US
-3564561792,3564561919,GB
+3564561696,3564561919,US
3564561920,3564562431,CH
3564562432,3564562687,GB
3564562688,3564562831,US
@@ -125775,8 +128215,12 @@
3564565240,3564565247,GB
3564565248,3564565279,US
3564565280,3564565327,GB
-3564565328,3564565407,US
-3564565408,3564566047,GB
+3564565328,3564565439,US
+3564565440,3564565567,GB
+3564565568,3564565631,US
+3564565632,3564565663,GB
+3564565664,3564565679,US
+3564565680,3564566047,GB
3564566048,3564566079,US
3564566080,3564566143,GB
3564566144,3564566175,US
@@ -125792,8 +128236,8 @@
3564567184,3564567199,US
3564567200,3564567247,GB
3564567248,3564567255,US
-3564567256,3564567295,GB
-3564567296,3564567551,US
+3564567256,3564567263,GB
+3564567264,3564567551,US
3564567552,3564567807,GB
3564567808,3564567935,US
3564567936,3564568039,GB
@@ -125816,7 +128260,9 @@
3564571592,3564571599,FR
3564571600,3564572271,GB
3564572272,3564572287,DE
-3564572288,3564576767,GB
+3564572288,3564572415,GB
+3564572416,3564572543,DE
+3564572544,3564576767,GB
3564576768,3564584959,RU
3564584960,3564593151,SA
3564593152,3564601343,RU
@@ -126368,9 +128814,9 @@
3565093392,3565093399,NO
3565093400,3565096759,GB
3565096760,3565096767,IE
-3565096768,3565099647,GB
-3565099648,3565099651,US
-3565099652,3565101055,GB
+3565096768,3565097151,GB
+3565097152,3565097167,TZ
+3565097168,3565101055,GB
3565101056,3565109247,DE
3565109248,3565117439,PL
3565117440,3565125631,TR
@@ -126715,9 +129161,7 @@
3566739456,3566747647,RU
3566747648,3566764031,GR
3566764032,3566796799,AT
-3566796800,3566803455,NL
-3566803456,3566803711,A2
-3566803712,3566816511,NL
+3566796800,3566816511,NL
3566816512,3566816767,US
3566816768,3566862335,NL
3566862336,3566895103,TR
@@ -126971,21 +129415,13 @@
3567403008,3567419391,IT
3567419392,3567427583,SA
3567427584,3567435775,SE
-3567435776,3567436543,GB
-3567436544,3567436595,IN
-3567436596,3567436599,GB
-3567436600,3567436603,IN
-3567436604,3567436799,GB
-3567436800,3567436895,IN
-3567436896,3567441375,GB
+3567435776,3567441375,GB
3567441376,3567441407,NL
3567441408,3567444223,GB
3567444224,3567444479,TZ
3567444480,3567445951,GB
3567445952,3567445983,NL
-3567445984,3567452031,GB
-3567452032,3567452047,GR
-3567452048,3567452159,GB
+3567445984,3567452159,GB
3567452160,3567507455,ES
3567507456,3567509503,NL
3567509504,3567512575,ES
@@ -127246,9 +129682,7 @@
3569273168,3569273183,LU
3569273184,3569273791,BE
3569273792,3569273823,LU
-3569273824,3569273935,BE
-3569273936,3569273951,LI
-3569273952,3569274303,BE
+3569273824,3569274303,BE
3569274304,3569274311,LU
3569274312,3569274335,BE
3569274336,3569274383,LU
@@ -127548,9 +129982,7 @@
3569873280,3569873407,A2
3569873408,3569876991,IL
3569876992,3569942527,RS
-3569942528,3570064759,DE
-3570064760,3570064767,A2
-3570064768,3570073599,DE
+3569942528,3570073599,DE
3570073600,3570081791,NL
3570081792,3570106367,CH
3570106368,3570139135,PL
@@ -127585,9 +130017,7 @@
3570617344,3570617855,GB
3570617856,3570622463,DE
3570622464,3570630655,GB
-3570630656,3570633343,DE
-3570633344,3570633471,CH
-3570633472,3570663423,DE
+3570630656,3570663423,DE
3570663424,3570728959,GB
3570728960,3570729983,FI
3570729984,3570731007,SE
@@ -128134,9 +130564,7 @@
3572629504,3572695039,DK
3572695040,3572704951,CH
3572704952,3572704959,DE
-3572704960,3572705479,CH
-3572705480,3572705487,NL
-3572705488,3572715519,CH
+3572704960,3572715519,CH
3572715520,3572715775,GB
3572715776,3572760575,CH
3572760576,3572826111,PL
@@ -128248,21 +130676,9 @@
3574348544,3574398975,EU
3574398976,3574464511,PT
3574464512,3574530047,TR
-3574530048,3574563679,SE
-3574563680,3574563695,FI
-3574563696,3574563727,SE
-3574563728,3574563775,FI
-3574563776,3574563807,SE
+3574530048,3574563807,SE
3574563808,3574563823,FI
-3574563824,3574563839,SE
-3574563840,3574564863,FI
-3574564864,3574565887,SE
-3574565888,3574565951,FI
-3574565952,3574566207,SE
-3574566208,3574566271,FI
-3574566272,3574566447,SE
-3574566448,3574566463,FI
-3574566464,3574594559,SE
+3574563824,3574594559,SE
3574594560,3574595583,GB
3574595584,3574596351,FR
3574596352,3574596607,MQ
@@ -129259,8 +131675,8 @@
3576237936,3576238143,FR
3576238144,3576238159,GB
3576238160,3576238305,FR
-3576238306,3576238343,GB
-3576238344,3576238447,FR
+3576238306,3576238335,GB
+3576238336,3576238447,FR
3576238448,3576238463,GB
3576238464,3576238511,FR
3576238512,3576238527,GB
@@ -129322,13 +131738,11 @@
3576242328,3576242335,FR
3576242336,3576242343,GB
3576242344,3576243967,FR
-3576243968,3576244015,GB
-3576244016,3576244031,FR
-3576244032,3576244047,GB
-3576244048,3576244127,FR
+3576243968,3576243983,GB
+3576243984,3576244127,FR
3576244128,3576244143,GB
-3576244144,3576246399,FR
-3576246400,3576246463,GB
+3576244144,3576246407,FR
+3576246408,3576246463,GB
3576246464,3576246656,FR
3576246657,3576246727,GB
3576246728,3576246743,FR
@@ -129479,16 +131893,16 @@
3576258672,3576258687,GB
3576258688,3576258703,FR
3576258704,3576258783,GB
-3576258784,3576258815,FR
-3576258816,3576258847,GB
+3576258784,3576258823,FR
+3576258824,3576258847,GB
3576258848,3576258863,FR
3576258864,3576258895,GB
3576258896,3576258943,FR
3576258944,3576259007,GB
3576259008,3576259023,FR
3576259024,3576259039,GB
-3576259040,3576259071,FR
-3576259072,3576259087,GB
+3576259040,3576259079,FR
+3576259080,3576259087,GB
3576259088,3576259103,FR
3576259104,3576259199,GB
3576259200,3576259231,FR
@@ -129549,11 +131963,9 @@
3576261080,3576261095,GB
3576261096,3576261103,FR
3576261104,3576261111,GB
-3576261112,3576261375,FR
-3576261376,3576261631,GB
-3576261632,3576261927,FR
-3576261928,3576261935,GB
-3576261936,3576263463,FR
+3576261112,3576261383,FR
+3576261384,3576261631,GB
+3576261632,3576263463,FR
3576263464,3576263471,GB
3576263472,3576263503,FR
3576263504,3576263527,GB
@@ -129655,8 +132067,10 @@
3576889344,3576954879,NL
3576954880,3576987647,NO
3576987648,3577001983,GB
-3577001984,3577003583,NL
-3577003584,3577003711,GB
+3577001984,3577003615,NL
+3577003616,3577003631,GB
+3577003632,3577003647,NL
+3577003648,3577003711,GB
3577003712,3577003767,NL
3577003768,3577003771,GB
3577003772,3577004031,NL
@@ -129699,7 +132113,9 @@
3577567712,3577567719,IT
3577567720,3577571391,DE
3577571392,3577571399,DK
-3577571400,3577577231,DE
+3577571400,3577572391,DE
+3577572392,3577572399,GB
+3577572400,3577577231,DE
3577577232,3577577247,US
3577577248,3577592431,DE
3577592432,3577592447,FR
@@ -129925,9 +132341,7 @@
3578208128,3578208191,PK
3578208192,3578234759,DE
3578234760,3578234767,US
-3578234768,3578236791,DE
-3578236792,3578236799,PL
-3578236800,3578265599,DE
+3578234768,3578265599,DE
3578265600,3578331135,GB
3578331136,3578339327,PL
3578339328,3578347519,ES
@@ -129978,8 +132392,7 @@
3579193712,3579193727,BE
3579193728,3579193815,NL
3579193816,3579193823,ES
-3579193824,3579193839,GB
-3579193840,3579193855,NL
+3579193824,3579193855,NL
3579193856,3579194103,GB
3579194104,3579194111,US
3579194112,3579197055,GB
@@ -130834,6 +133247,7 @@
3582590976,3582599167,FR
3582599168,3582607359,DE
3582607360,3582615551,RU
+3582615552,3582623743,GB
3582623744,3582631935,FI
3582631936,3582635007,NO
3582635008,3582635263,SE
@@ -130911,8 +133325,8 @@
3583031848,3583031895,GR
3583031896,3583031903,SG
3583031904,3583031919,LB
-3583031920,3583032095,IT
-3583032096,3583032127,GR
+3583031920,3583032111,IT
+3583032112,3583032127,GR
3583032128,3583032159,IT
3583032160,3583032191,FR
3583032192,3583032319,IT
@@ -131159,12 +133573,9 @@
3583709504,3583709511,RU
3583709512,3583709575,UA
3583709576,3583709583,NA
-3583709584,3583709599,UA
-3583709600,3583709607,NA
+3583709584,3583709607,UA
3583709608,3583709615,RU
-3583709616,3583709631,UA
-3583709632,3583709639,NA
-3583709640,3583709663,UA
+3583709616,3583709663,UA
3583709664,3583709671,NA
3583709672,3583709699,UA
3583709700,3583709703,NA
@@ -131174,9 +133585,7 @@
3583709760,3583709767,NA
3583709768,3583709791,UA
3583709792,3583709799,NA
-3583709800,3583709823,UA
-3583709824,3583709831,NA
-3583709832,3583709839,UA
+3583709800,3583709839,UA
3583709840,3583709863,NA
3583709864,3583709871,RU
3583709872,3583709879,NA
@@ -131222,9 +133631,7 @@
3583711016,3583711023,NA
3583711024,3583711247,UA
3583711248,3583711255,NA
-3583711256,3583711311,UA
-3583711312,3583711319,NA
-3583711320,3583711327,UA
+3583711256,3583711327,UA
3583711328,3583711335,NA
3583711336,3583711359,UA
3583711360,3583711367,NA
@@ -131247,8 +133654,8 @@
3583712024,3583712119,UA
3583712120,3583712127,NA
3583712128,3583712159,UA
-3583712160,3583712199,NA
-3583712200,3583712311,UA
+3583712160,3583712191,NA
+3583712192,3583712311,UA
3583712312,3583712319,NA
3583712320,3583712455,UA
3583712456,3583712463,NA
@@ -131256,21 +133663,15 @@
3583712472,3583712479,NA
3583712480,3583712655,UA
3583712656,3583712663,NA
-3583712664,3583712735,UA
-3583712736,3583712743,NA
-3583712744,3583712775,UA
+3583712664,3583712775,UA
3583712776,3583712783,NA
-3583712784,3583712831,UA
-3583712832,3583712847,AQ
-3583712848,3583712927,UA
+3583712784,3583712927,UA
3583712928,3583712943,NA
3583712944,3583713007,UA
3583713008,3583713015,RU
3583713016,3583713143,UA
3583713144,3583713151,NA
-3583713152,3583713183,UA
-3583713184,3583713191,NA
-3583713192,3583713279,UA
+3583713152,3583713279,UA
3583713280,3583721471,CZ
3583721472,3583729663,DE
3583729664,3583737855,TR
@@ -131290,11 +133691,14 @@
3583743976,3583743983,GB
3583743984,3583744067,EU
3583744068,3583744071,GB
-3583744072,3583744127,EU
+3583744072,3583744103,EU
+3583744104,3583744111,GB
+3583744112,3583744127,EU
3583744128,3583744255,GB
3583744256,3583744287,EU
3583744288,3583744303,GB
-3583744304,3583744319,EU
+3583744304,3583744311,EU
+3583744312,3583744319,DE
3583744320,3583744447,GB
3583744448,3583744511,EU
3583744512,3583744767,GB
@@ -131331,8 +133735,8 @@
3583852544,3583853055,SG
3583853056,3583854591,FI
3583854592,3583854726,GB
-3583854727,3583854735,FI
-3583854736,3583854871,GB
+3583854727,3583854727,FI
+3583854728,3583854871,GB
3583854872,3583854879,FI
3583854880,3583855103,GB
3583855104,3583855167,US
@@ -131345,8 +133749,8 @@
3583855248,3583855311,FI
3583855312,3583855327,US
3583855328,3583856383,FI
-3583856384,3583856447,SG
-3583856448,3583856615,FI
+3583856384,3583856463,SG
+3583856464,3583856615,FI
3583856616,3583856639,SG
3583856640,3583860735,FI
3583860736,3583868927,HU
@@ -131596,9 +134000,7 @@
3584974848,3584983039,FR
3584983040,3584988255,US
3584988256,3584988287,UA
-3584988288,3584988543,US
-3584988544,3584988559,UA
-3584988560,3584988575,US
+3584988288,3584988575,US
3584988576,3584988591,UA
3584988592,3584988623,US
3584988624,3584988639,UA
@@ -131939,8 +134341,8 @@
3586258944,3586259455,BE
3586259456,3586269247,NL
3586269248,3586269263,ES
-3586269264,3586269343,NL
-3586269344,3586269415,ES
+3586269264,3586269375,NL
+3586269376,3586269415,ES
3586269416,3586269423,NL
3586269424,3586269439,ES
3586269440,3586269471,NL
@@ -131965,7 +134367,8 @@
3586272384,3586272799,ES
3586272800,3586272807,IT
3586272808,3586272815,ES
-3586272816,3586272831,IT
+3586272816,3586272823,IT
+3586272824,3586272831,ES
3586272832,3586272895,NL
3586272896,3586272959,IT
3586272960,3586272991,ES
@@ -131990,7 +134393,9 @@
3586441216,3586457599,DE
3586457600,3586473983,NL
3586473984,3586473987,SK
-3586473988,3586476287,HU
+3586473988,3586476031,HU
+3586476032,3586476063,TR
+3586476064,3586476287,HU
3586476288,3586476295,SK
3586476296,3586476311,HU
3586476312,3586476319,AT
@@ -132001,7 +134406,7 @@
3586476432,3586476439,SK
3586476440,3586478079,HU
3586478080,3586478591,SK
-3586478592,3586478847,TR
+3586478592,3586478847,HU
3586478848,3586479103,SK
3586479104,3586479359,TR
3586479360,3586490367,HU
@@ -132141,9 +134546,11 @@
3586910560,3586910567,NL
3586910568,3586910575,CY
3586910576,3586910587,NL
-3586910588,3586910655,DE
-3586910656,3586910703,NL
-3586910704,3586910711,DE
+3586910588,3586910591,DE
+3586910592,3586910623,NL
+3586910624,3586910655,DE
+3586910656,3586910687,NL
+3586910688,3586910711,DE
3586910712,3586910719,NL
3586910720,3586910991,DE
3586910992,3586911007,BE
@@ -132372,13 +134779,13 @@
3587238608,3587238911,GB
3587238912,3587239303,NL
3587239304,3587239311,GB
-3587239312,3587239695,NL
-3587239696,3587239711,GB
+3587239312,3587239703,NL
+3587239704,3587239711,GB
3587239712,3587239903,NL
3587239904,3587239935,GB
-3587239936,3587240023,NL
-3587240024,3587240031,GB
-3587240032,3587240087,NL
+3587239936,3587239975,NL
+3587239976,3587239983,GB
+3587239984,3587240087,NL
3587240088,3587240095,GB
3587240096,3587240103,NL
3587240104,3587240107,GB
@@ -132400,13 +134807,13 @@
3587241264,3587241271,GB
3587241272,3587241343,NL
3587241344,3587241471,GB
-3587241472,3587242055,NL
-3587242056,3587242063,GB
-3587242064,3587242095,NL
+3587241472,3587242095,NL
3587242096,3587242111,GB
3587242112,3587242463,NL
3587242464,3587242471,GB
-3587242472,3587243935,NL
+3587242472,3587243407,NL
+3587243408,3587243415,GB
+3587243416,3587243935,NL
3587243936,3587243943,GB
3587243944,3587243967,NL
3587243968,3587243975,GB
@@ -132664,9 +135071,7 @@
3588588568,3588588575,IT
3588588576,3588590175,ES
3588590176,3588590207,BE
-3588590208,3588594751,ES
-3588594752,3588594759,DE
-3588594760,3588598607,ES
+3588590208,3588598607,ES
3588598608,3588598615,IT
3588598616,3588603903,ES
3588603904,3588620287,SI
@@ -132776,7 +135181,7 @@
3589373952,3589375495,DE
3589375496,3589375503,CI
3589375504,3589390335,DE
-3589390336,3589406719,RU
+3589390336,3589423103,RU
3589423104,3589423615,IT
3589423616,3589424127,CH
3589424128,3589424639,SE
@@ -133153,7 +135558,9 @@
3590155808,3590155815,SI
3590155816,3590155823,HR
3590155824,3590155871,SI
-3590155872,3590156431,HR
+3590155872,3590156359,HR
+3590156360,3590156367,SI
+3590156368,3590156431,HR
3590156432,3590156447,SI
3590156448,3590156543,HR
3590156544,3590156575,SI
@@ -133317,7 +135724,9 @@
3590308128,3590308175,A2
3590308176,3590308191,IQ
3590308192,3590308199,A2
-3590308200,3590308238,IQ
+3590308200,3590308215,IQ
+3590308216,3590308223,A2
+3590308224,3590308238,IQ
3590308239,3590308247,A2
3590308248,3590308287,IQ
3590308288,3590308303,A2
@@ -134021,20 +136430,20 @@
3624914272,3624914303,CA
3624914304,3624914335,US
3624914336,3624914367,CA
-3624914368,3624914687,US
+3624914368,3624914399,IN
+3624914400,3624914687,US
3624914688,3624914943,BE
-3624914944,3624915199,US
-3624915200,3624915455,CA
-3624915456,3624915903,US
+3624914944,3624915071,CA
+3624915072,3624915455,US
+3624915456,3624915487,CA
+3624915488,3624915903,US
3624915904,3624915935,HK
-3624915936,3624916159,US
-3624916160,3624916191,MY
-3624916192,3624916223,US
+3624915936,3624916223,US
3624916224,3624916735,CA
3624916736,3624917247,US
3624917248,3624917503,AU
3624917504,3624917919,US
-3624917920,3624917951,CH
+3624917920,3624917951,CA
3624917952,3624917983,US
3624917984,3624918015,CA
3624918016,3624918527,US
@@ -134072,8 +136481,7 @@
3624922336,3624922367,FR
3624922368,3624922495,IN
3624922496,3624922623,BE
-3624922624,3624922655,US
-3624922656,3624922687,CA
+3624922624,3624922687,CA
3624922688,3624922783,US
3624922784,3624922815,CN
3624922816,3624922847,FR
@@ -134084,18 +136492,23 @@
3624923392,3624923519,CA
3624923520,3624923647,US
3624923648,3624923775,CA
-3624923776,3624924095,US
+3624923776,3624923903,US
+3624923904,3624923935,CA
+3624923936,3624923967,US
+3624923968,3624923999,IN
+3624924000,3624924095,US
3624924096,3624924127,CA
3624924128,3624924287,US
-3624924288,3624924671,CA
-3624924672,3624924895,US
+3624924288,3624924703,CA
+3624924704,3624924895,US
3624924896,3624924927,CA
3624924928,3624925054,US
3624925055,3624925695,CA
-3624925696,3624926591,US
+3624925696,3624926463,US
+3624926464,3624926527,CA
+3624926528,3624926591,US
3624926592,3624926655,IN
-3624926656,3624926719,US
-3624926720,3624926975,CA
+3624926656,3624926975,CA
3624926976,3624927039,US
3624927040,3624927071,HK
3624927072,3624927167,US
@@ -134108,7 +136521,9 @@
3624990464,3624991223,CA
3624991224,3624991231,US
3624991232,3624992767,CA
-3624992768,3625042327,US
+3624992768,3625002351,US
+3625002352,3625002367,CA
+3625002368,3625042327,US
3625042328,3625042335,IT
3625042336,3625058303,US
3625058304,3625091071,CA
@@ -134693,8 +137108,7 @@
3626385242,3626385245,US
3626385246,3626385249,ID
3626385250,3626385253,CN
-3626385254,3626385257,US
-3626385258,3626385261,PK
+3626385254,3626385261,US
3626385262,3626385265,GR
3626385266,3626385321,US
3626385322,3626385325,FR
@@ -134776,7 +137190,9 @@
3626529808,3626529863,US
3626529864,3626529919,CA
3626529920,3626529927,US
-3626529928,3626530039,CA
+3626529928,3626529951,CA
+3626529952,3626529959,US
+3626529960,3626530039,CA
3626530040,3626530055,US
3626530056,3626530151,CA
3626530152,3626530159,US
@@ -135152,20 +137568,18 @@
3629201488,3629201515,US
3629201516,3629201539,CA
3629201540,3629201543,US
-3629201544,3629201591,CA
-3629201592,3629201599,US
+3629201544,3629201551,CA
+3629201552,3629201559,US
+3629201560,3629201563,CA
+3629201564,3629201599,US
3629201600,3629201615,CA
3629201616,3629201623,US
-3629201624,3629201639,CA
-3629201640,3629201687,US
-3629201688,3629201707,CA
-3629201708,3629201743,US
+3629201624,3629201627,CA
+3629201628,3629201743,US
3629201744,3629201747,CA
3629201748,3629201751,US
3629201752,3629201755,CA
-3629201756,3629201763,US
-3629201764,3629201767,CA
-3629201768,3629201775,US
+3629201756,3629201775,US
3629201776,3629201791,CA
3629201792,3629201839,US
3629201840,3629201855,CA
@@ -135178,8 +137592,8 @@
3629201984,3629201991,US
3629201992,3629201999,CA
3629202000,3629202003,US
-3629202004,3629202011,CA
-3629202012,3629202015,US
+3629202004,3629202007,CA
+3629202008,3629202015,US
3629202016,3629202047,CA
3629202048,3629202175,US
3629202176,3629202203,CA
@@ -135187,13 +137601,9 @@
3629202220,3629202239,CA
3629202240,3629202263,US
3629202264,3629202271,CA
-3629202272,3629202279,US
-3629202280,3629202287,CA
-3629202288,3629202311,US
+3629202272,3629202311,US
3629202312,3629202367,CA
-3629202368,3629202399,US
-3629202400,3629202407,CA
-3629202408,3629202427,US
+3629202368,3629202427,US
3629202428,3629203199,CA
3629203200,3629318143,US
3629318144,3629326335,CA
@@ -135235,7 +137645,9 @@
3629839104,3629839359,CA
3629839360,3629841951,US
3629841952,3629841983,CA
-3629841984,3629875775,US
+3629841984,3629859551,US
+3629859552,3629859583,CA
+3629859584,3629875775,US
3629875776,3629875807,CA
3629875808,3629876255,US
3629876256,3629876263,CA
@@ -135765,7 +138177,27 @@
3631058592,3631059229,US
3631059230,3631059239,NO
3631059240,3631112191,US
-3631112192,3631116543,BB
+3631112192,3631112385,BB
+3631112386,3631112386,VC
+3631112387,3631112387,BB
+3631112388,3631112391,VC
+3631112392,3631112393,BB
+3631112394,3631112398,VC
+3631112399,3631112399,BB
+3631112400,3631112401,VC
+3631112402,3631112404,BB
+3631112405,3631112405,VC
+3631112406,3631112417,BB
+3631112418,3631112418,VC
+3631112419,3631112425,BB
+3631112426,3631112427,VC
+3631112428,3631112429,BB
+3631112430,3631112430,VC
+3631112431,3631112433,BB
+3631112434,3631112434,VC
+3631112435,3631112439,BB
+3631112440,3631112440,VC
+3631112441,3631116543,BB
3631116544,3631117567,GD
3631117568,3631117823,BB
3631117824,3631118079,GD
@@ -135927,7 +138359,7 @@
3632481184,3632481199,TH
3632481200,3632481279,US
3632481280,3632481287,GB
-3632481288,3632481295,PH
+3632481288,3632481295,US
3632481296,3632481311,TH
3632481312,3632481391,US
3632481392,3632481399,GB
@@ -136045,9 +138477,7 @@
3632485264,3632485271,IT
3632485272,3632485279,US
3632485280,3632485311,TH
-3632485312,3632485359,US
-3632485360,3632485367,TH
-3632485368,3632485391,US
+3632485312,3632485391,US
3632485392,3632485399,SR
3632485400,3632485431,US
3632485432,3632485439,CA
@@ -136343,7 +138773,9 @@
3632902144,3632971775,US
3632971776,3632972031,CA
3632972032,3632972063,US
-3632972064,3632988159,CA
+3632972064,3632973087,CA
+3632973088,3632973119,US
+3632973120,3632988159,CA
3632988160,3633029119,US
3633029120,3633029631,PY
3633029632,3633030143,NI
@@ -136493,7 +138925,9 @@
3633553312,3633553343,A2
3633553344,3633776399,US
3633776400,3633776415,CN
-3633776416,3633815551,US
+3633776416,3633776463,US
+3633776464,3633776479,CN
+3633776480,3633815551,US
3633815552,3633816079,CA
3633816080,3633816095,US
3633816096,3633816119,CA
@@ -136511,7 +138945,9 @@
3633816256,3633816263,NG
3633816264,3633816279,CA
3633816280,3633816311,US
-3633816312,3633816351,CA
+3633816312,3633816319,CA
+3633816320,3633816327,ZA
+3633816328,3633816351,CA
3633816352,3633816383,IN
3633816384,3633816391,NG
3633816392,3633816399,US
@@ -136543,7 +138979,9 @@
3633822304,3633822327,CA
3633822328,3633827839,US
3633827840,3633828095,GB
-3633828096,3633881087,US
+3633828096,3633874431,US
+3633874432,3633874687,GB
+3633874688,3633881087,US
3633881088,3633885183,AN
3633885184,3633889279,US
3633889280,3633893375,CA
@@ -136645,8 +139083,7 @@
3635532288,3635532303,ES
3635532304,3635532831,US
3635532832,3635532863,VE
-3635532864,3635532927,SV
-3635532928,3635532999,US
+3635532864,3635532999,US
3635533000,3635533007,NO
3635533008,3635533535,US
3635533536,3635533551,IN
@@ -136689,9 +139126,7 @@
3636151008,3636151023,BS
3636151024,3636151031,CA
3636151032,3636151039,US
-3636151040,3636151167,CA
-3636151168,3636151199,US
-3636151200,3636151455,CA
+3636151040,3636151455,CA
3636151456,3636151479,US
3636151480,3636151488,CA
3636151489,3636151535,US
@@ -136726,9 +139161,7 @@
3636154991,3636155071,US
3636155072,3636155391,CA
3636155392,3636155407,US
-3636155408,3636155423,CA
-3636155424,3636155439,US
-3636155440,3636155455,CA
+3636155408,3636155455,CA
3636155456,3636155519,US
3636155520,3636155775,CA
3636155776,3636155839,US
@@ -136736,9 +139169,7 @@
3636156160,3636156191,US
3636156192,3636156255,CA
3636156256,3636156256,US
-3636156257,3636156271,CA
-3636156272,3636156279,US
-3636156280,3636156415,CA
+3636156257,3636156415,CA
3636156416,3636156927,US
3636156928,3636157063,CA
3636157064,3636157167,US
@@ -137013,7 +139444,9 @@
3637667519,3637669887,CA
3637669888,3637706751,US
3637706752,3637739519,CA
-3637739520,3638165503,US
+3637739520,3637827327,US
+3637827328,3637827583,VI
+3637827584,3638165503,US
3638165504,3638181887,CA
3638181888,3638198951,US
3638198952,3638198959,BM
@@ -137100,7 +139533,9 @@
3638249216,3638249471,GB
3638249472,3638249751,US
3638249752,3638249791,GB
-3638249792,3638250535,US
+3638249792,3638249983,US
+3638249984,3638249991,GB
+3638249992,3638250535,US
3638250536,3638250543,GB
3638250544,3638250559,US
3638250560,3638250623,GB
@@ -137130,7 +139565,8 @@
3638399488,3638399615,CH
3638399616,3638399743,US
3638399744,3638399999,CH
-3638400000,3638509295,US
+3638400000,3638400063,CA
+3638400064,3638509295,US
3638509296,3638509311,GB
3638509312,3638509567,US
3638509568,3638526911,CA
@@ -137383,7 +139819,9 @@
3640007312,3640007319,HK
3640007320,3640007359,US
3640007360,3640007367,SO
-3640007368,3640013767,US
+3640007368,3640013095,US
+3640013096,3640013103,CA
+3640013104,3640013767,US
3640013768,3640013775,GI
3640013776,3640023079,US
3640023080,3640023087,EG
@@ -137393,14 +139831,16 @@
3640023272,3640023279,HK
3640023280,3640027415,US
3640027416,3640027423,GB
-3640027424,3640028279,US
-3640028280,3640028287,AF
-3640028288,3640028295,US
+3640027424,3640028207,US
+3640028208,3640028215,GB
+3640028216,3640028295,US
3640028296,3640028303,CA
3640028304,3640028311,GB
3640028312,3640028335,US
3640028336,3640028343,CA
-3640028344,3640028591,US
+3640028344,3640028447,US
+3640028448,3640028455,GB
+3640028456,3640028591,US
3640028592,3640028599,CA
3640028600,3640057855,US
3640057856,3640066047,CA
@@ -137591,8 +140031,7 @@
3641353184,3641353215,NG
3641353216,3641353231,GB
3641353232,3641353247,IQ
-3641353248,3641353263,GB
-3641353264,3641353727,A2
+3641353248,3641353727,A2
3641353728,3641353759,NG
3641353760,3641353775,GB
3641353776,3641353807,NG
@@ -137625,12 +140064,12 @@
3641357880,3641357887,A2
3641357888,3641357927,GB
3641357928,3641358335,A2
-3641358336,3641359359,GB
+3641358336,3641358591,GB
+3641358592,3641358847,A2
+3641358848,3641359359,GB
3641359360,3641359615,IQ
3641359616,3641359639,GB
-3641359640,3641359647,A2
-3641359648,3641359664,GB
-3641359665,3641359871,A2
+3641359640,3641359871,A2
3641359872,3641360383,GB
3641360384,3641368575,RO
3641368576,3641372671,GB
@@ -137725,7 +140164,10 @@
3641680128,3641681151,GB
3641681152,3641681407,SE
3641681408,3641681663,FR
-3641681664,3641683967,EU
+3641681664,3641681791,DK
+3641681792,3641681919,FR
+3641681920,3641682431,GB
+3641682432,3641683967,EU
3641683968,3641688063,KZ
3641688064,3641692159,RU
3641692160,3641696255,IT
@@ -137815,11 +140257,10 @@
3641937920,3641942015,IT
3641942016,3641950207,DE
3641950208,3641954303,FR
-3641954304,3641957887,MD
-3641957888,3641957951,GB
-3641957952,3641958143,MD
-3641958144,3641958207,GB
-3641958208,3641958399,MD
+3641954304,3641956863,MD
+3641956864,3641957631,GB
+3641957632,3641957887,MD
+3641957888,3641958399,GB
3641958400,3641960699,BE
3641960700,3641960703,NL
3641960704,3641961727,BE
@@ -137852,7 +140293,9 @@
3642029057,3642029311,NG
3642029312,3642029312,A2
3642029313,3642029567,GB
-3642029568,3642031359,NG
+3642029568,3642030591,NG
+3642030592,3642030847,GN
+3642030848,3642031359,NG
3642031360,3642031615,GB
3642031616,3642031616,A2
3642031617,3642031743,SL
@@ -137925,7 +140368,17 @@
3642113792,3642113823,BE
3642113824,3642113855,NL
3642113856,3642113919,BE
-3642113920,3642118143,NL
+3642113920,3642114591,NL
+3642114592,3642114815,NO
+3642114816,3642114831,NL
+3642114832,3642115095,NO
+3642115096,3642115103,NL
+3642115104,3642116095,NO
+3642116096,3642117119,NL
+3642117120,3642117375,NO
+3642117376,3642117631,NL
+3642117632,3642117887,NO
+3642117888,3642118143,NL
3642118144,3642122239,GB
3642122240,3642126335,ES
3642126336,3642130431,IL
@@ -138087,7 +140540,9 @@
3642552688,3642552831,UA
3642552832,3642552847,EE
3642552848,3642553095,UA
-3642553096,3642553139,LV
+3642553096,3642553099,LV
+3642553100,3642553103,UA
+3642553104,3642553139,LV
3642553140,3642553143,UA
3642553144,3642553161,LV
3642553162,3642553163,UA
@@ -138150,7 +140605,8 @@
3642554912,3642554919,NL
3642554920,3642554931,DE
3642554932,3642554951,UA
-3642554952,3642554959,GE
+3642554952,3642554955,GE
+3642554956,3642554959,UA
3642554960,3642554963,DE
3642554964,3642554967,UA
3642554968,3642554971,LV
@@ -138260,7 +140716,9 @@
3642736640,3642740735,CZ
3642740736,3642744831,DE
3642744832,3642753023,TR
-3642753024,3643801599,GB
+3642753024,3642830671,GB
+3642830672,3642830687,A2
+3642830688,3643801599,GB
3643801600,3644063743,DE
3644063744,3644325887,EG
3644325888,3644588031,IT
@@ -139608,9 +142066,7 @@
3647969280,3647969791,IT
3647969792,3647970303,BE
3647970304,3647971327,FR
-3647971328,3647971591,GB
-3647971592,3647971599,DE
-3647971600,3647971671,GB
+3647971328,3647971671,GB
3647971672,3647971679,DE
3647971680,3647972191,GB
3647972192,3647972199,DE
@@ -139643,11 +142099,9 @@
3647976792,3647976799,DE
3647976800,3647976927,BE
3647976928,3647976935,DE
-3647976936,3647977079,BE
-3647977080,3647977087,DE
-3647977088,3647977119,BE
-3647977120,3647977135,DE
-3647977136,3647977151,BE
+3647976936,3647977119,BE
+3647977120,3647977143,DE
+3647977144,3647977151,BE
3647977152,3647977215,DE
3647977216,3647977471,BE
3647977472,3647977791,GB
@@ -139659,8 +142113,8 @@
3647978776,3647978783,DE
3647978784,3647978895,NL
3647978896,3647978911,DE
-3647978912,3647978935,NL
-3647978936,3647979007,DE
+3647978912,3647978943,NL
+3647978944,3647979007,DE
3647979008,3647979136,IT
3647979137,3647979519,DE
3647979520,3647980543,FR
@@ -139675,11 +142129,17 @@
3647985920,3647985935,BE
3647985936,3647986431,ES
3647986432,3647986687,FR
-3647986688,3647987455,DE
-3647987456,3647987471,ES
-3647987472,3647987479,DE
-3647987480,3647987519,ES
-3647987520,3647995903,DE
+3647986688,3647986943,DE
+3647986944,3647986951,ES
+3647986952,3647987455,DE
+3647987456,3647987527,ES
+3647987528,3647987543,DE
+3647987544,3647987663,ES
+3647987664,3647987679,DE
+3647987680,3647987711,ES
+3647987712,3647988735,IT
+3647988736,3647989759,BE
+3647989760,3647995903,DE
3647995904,3648004095,RU
3648004096,3648004607,GB
3648004608,3648006271,RU
@@ -139786,8 +142246,8 @@
3648180752,3648180767,DE
3648180768,3648180799,AT
3648180800,3648180991,DE
-3648180992,3648180999,CY
-3648181000,3648181023,DE
+3648180992,3648181007,CY
+3648181008,3648181023,DE
3648181024,3648181055,AT
3648181056,3648181215,DE
3648181216,3648181231,RU
@@ -139806,7 +142266,7 @@
3648181648,3648181887,DE
3648181888,3648181903,AT
3648181904,3648182143,DE
-3648182144,3648182159,NL
+3648182144,3648182159,BR
3648182160,3648182175,DE
3648182176,3648182207,RU
3648182208,3648182271,GB
@@ -140152,7 +142612,9 @@
3650465792,3650469887,RU
3650469888,3650478079,NL
3650478080,3650482175,AT
-3650482176,3650486271,PL
+3650482176,3650484639,PL
+3650484640,3650484671,US
+3650484672,3650486271,PL
3650486272,3650502655,RU
3650502656,3650510847,SE
3650510848,3650519039,GB
@@ -140421,15 +142883,17 @@
3651870720,3651874815,IT
3651874816,3651878911,PL
3651878912,3651883007,RU
-3651883008,3651885823,BE
-3651885824,3651885847,CD
+3651883008,3651884031,BE
+3651884032,3651885055,CD
+3651885056,3651885567,BE
+3651885568,3651885847,CD
3651885848,3651885851,BE
3651885852,3651885855,CD
3651885856,3651885867,BE
3651885868,3651885875,CD
3651885876,3651885903,BE
-3651885904,3651885919,CD
-3651885920,3651886335,BE
+3651885904,3651885927,CD
+3651885928,3651886335,BE
3651886336,3651886347,CD
3651886348,3651886379,BE
3651886380,3651886383,CD
@@ -140448,8 +142912,8 @@
3651886472,3651886479,BE
3651886480,3651886495,CD
3651886496,3651886511,BE
-3651886512,3651886527,CD
-3651886528,3651886591,BE
+3651886512,3651886543,CD
+3651886544,3651886591,BE
3651886592,3651886847,CD
3651886848,3651887103,BE
3651887104,3651891199,GB
@@ -140536,9 +143000,9 @@
3651942816,3651944447,DE
3651944448,3651948543,ES
3651948544,3651952639,FO
-3651952640,3651954175,IR
-3651954176,3651954431,AE
-3651954432,3651958271,IR
+3651952640,3651953663,IR
+3651953664,3651954687,AE
+3651954688,3651958271,IR
3651958272,3651958783,AE
3651958784,3651959039,IR
3651959040,3651960831,AE
@@ -140855,7 +143319,8 @@
3653439488,3653443583,FR
3653443584,3653444351,DE
3653444352,3653444383,IT
-3653444384,3653447679,DE
+3653444384,3653447167,DE
+3653447168,3653447679,NL
3653447680,3653451775,LV
3653451776,3653464063,RU
3653464064,3653468159,NL
@@ -140953,7 +143418,10 @@
3653652480,3653656575,RU
3653656576,3653660671,GB
3653660672,3653664767,CZ
-3653664768,3653668863,NL
+3653664768,3653664895,DE
+3653664896,3653665023,NL
+3653665024,3653665039,DE
+3653665040,3653668863,NL
3653668864,3653672959,SE
3653672960,3653681151,RU
3653681152,3653685247,ES
@@ -141009,7 +143477,8 @@
3654066032,3654287359,GB
3654287360,3654607871,SE
3654607872,3654608127,NO
-3654608128,3654608895,SE
+3654608128,3654608383,SE
+3654608384,3654608895,PL
3654608896,3654609919,NO
3654609920,3654613007,SE
3654613008,3654613015,RU
@@ -141115,6 +143584,7 @@
3664007168,3664008191,AU
3664008192,3664008447,MN
3664008448,3664008703,PK
+3664008704,3664008959,MY
3664052224,3664084991,NZ
3664084992,3664117759,KR
3664117760,3664248831,HK
@@ -141360,11 +143830,13 @@
3743039488,3743055871,TW
3743055872,3743088639,KR
3743088640,3743096831,AU
+3743096832,3743105023,TW
3743105024,3743106047,AU
-3743107072,3743109119,JP
+3743106048,3743109119,JP
3743109120,3743113215,BD
3743113216,3743115263,AU
3743117312,3743118335,BD
+3743118336,3743119359,JP
3743119360,3743120383,IN
3743120384,3743121407,JP
3743121408,3743125503,MY
@@ -141372,16 +143844,19 @@
3743129600,3743130623,HK
3743130624,3743133695,SG
3743133696,3743134719,AU
+3743134720,3743135743,JP
3743135744,3743136767,CN
3743136768,3743137791,MY
3743137792,3743154175,TH
3743154176,3743186943,MY
3743186944,3743219711,KR
3743219712,3743252479,JP
-3743252480,3743260671,NC
+3743252480,3743264767,NC
+3743264768,3743268863,JP
3743268864,3743277055,IN
3743277056,3743281151,PK
3743281152,3743282175,AU
+3743282176,3743283199,JP
3743283200,3743284223,HK
3743284224,3743285247,PK
3743285248,3743416319,IN
@@ -141390,7 +143865,8 @@
3749838848,3749839871,SG
3749839872,3749840895,IN
3749840896,3749841919,PH
-3749841920,3749847039,AU
+3749841920,3749846015,AU
+3749846016,3749847039,IN
3749847040,3749855231,HK
3749855232,3749969919,KR
3749969920,3750232063,JP
@@ -141401,9 +143877,11 @@
3752133632,3752134655,ID
3752134656,3752136703,TW
3752136704,3752137727,NZ
+3752137728,3752138751,JP
3752138752,3752140799,IN
3752140800,3752148991,JP
3752148992,3752153087,NZ
+3752153088,3752157183,JP
3752157184,3752165375,AU
3752165376,3752198143,KR
3752198144,3752329215,CN
@@ -141439,6 +143917,7 @@
3758080000,3758088191,KR
3758088192,3758090239,ID
3758090240,3758091263,AU
+3758091264,3758092287,CN
3758092288,3758093311,HK
3758093312,3758094335,IN
3758094336,3758095359,AU
1
0

04 Apr '11
commit 9d2b3849b2052bc6b54028c658a8b27fae452ea4
Merge: 65eb0e4 0cdd262
Author: Roger Dingledine <arma(a)torproject.org>
Date: Mon Apr 4 03:53:38 2011 -0400
Merge branch 'maint-0.2.1' into maint-0.2.2
changes/geoip-apr2011 | 3 +
src/config/geoip | 6197 ++++++++++++++++++++++++++++++++++---------------
2 files changed, 4341 insertions(+), 1859 deletions(-)
1
0